2024-04-29 18:44:07 +04:00
|
|
|
|
using BankEmployeeApp.Models;
|
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
|
using System.Diagnostics;
|
2024-04-30 23:05:05 +04:00
|
|
|
|
using BankContracts.BindingModels;
|
|
|
|
|
using BankContracts.BusinessLogicContracts;
|
|
|
|
|
using BankContracts.ViewModels;
|
|
|
|
|
using BankEmployeeApp.Filters;
|
|
|
|
|
using System.Collections;
|
|
|
|
|
using System.ComponentModel.DataAnnotations;
|
2024-04-29 18:44:07 +04:00
|
|
|
|
|
|
|
|
|
namespace BankEmployeeApp.Controllers
|
|
|
|
|
{
|
2024-04-30 23:05:05 +04:00
|
|
|
|
[AuthorizationFilter]
|
2024-04-29 18:44:07 +04:00
|
|
|
|
public class HomeController : Controller
|
|
|
|
|
{
|
|
|
|
|
private readonly ILogger<HomeController> _logger;
|
2024-04-30 23:05:05 +04:00
|
|
|
|
private readonly IEmployeeLogic _employeeLogic;
|
|
|
|
|
private readonly IOperationLogic _carLogic;
|
|
|
|
|
private readonly ICostLogic _costLogic;
|
|
|
|
|
private readonly IPurchaseLogic _purchaseLogic;
|
|
|
|
|
private readonly IPaymentLogic _paymentLogic;
|
|
|
|
|
private readonly IReportLogic _reportLogic;
|
2024-04-29 18:44:07 +04:00
|
|
|
|
|
2024-04-30 23:05:05 +04:00
|
|
|
|
private EmployeeViewModel? _employee;
|
|
|
|
|
|
|
|
|
|
public HomeController(ILogger<HomeController> logger,
|
|
|
|
|
IEmployeeLogic employeeLogic, IOperationLogic carLogic, ICostLogic costLogic,
|
|
|
|
|
IPurchaseLogic purchaseLogic, IPaymentLogic paymentLogic, IReportLogic reportLogic)
|
2024-04-29 18:44:07 +04:00
|
|
|
|
{
|
2024-04-30 23:05:05 +04:00
|
|
|
|
_reportLogic = reportLogic;
|
|
|
|
|
_paymentLogic = paymentLogic;
|
|
|
|
|
_purchaseLogic = purchaseLogic;
|
|
|
|
|
_costLogic = costLogic;
|
|
|
|
|
_carLogic = carLogic;
|
|
|
|
|
_employeeLogic = employeeLogic;
|
2024-04-29 18:44:07 +04:00
|
|
|
|
_logger = logger;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-30 23:05:05 +04:00
|
|
|
|
private EmployeeViewModel Employee {
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
if (_employee == null)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
_employee = _employeeLogic.ReadElement(new()
|
|
|
|
|
{
|
|
|
|
|
PhoneNumber = HttpContext.Session.GetString(SessionKeys.EmployeePhone),
|
|
|
|
|
Password = HttpContext.Session.GetString(SessionKeys.EmployeePassword),
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogError(e, "Не удалось получить пользователя, хотя был пройден фильтр авторизации");
|
|
|
|
|
throw;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return _employee;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-29 18:44:07 +04:00
|
|
|
|
public IActionResult Index()
|
|
|
|
|
{
|
2024-04-30 23:05:05 +04:00
|
|
|
|
_logger.LogInformation("Переход на главную страницу");
|
2024-04-29 18:44:07 +04:00
|
|
|
|
return View();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IActionResult Privacy()
|
|
|
|
|
{
|
2024-04-30 23:05:05 +04:00
|
|
|
|
return View(Employee);
|
2024-04-29 18:44:07 +04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
|
|
|
|
public IActionResult Error()
|
|
|
|
|
{
|
|
|
|
|
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
|
|
|
|
|
}
|
2024-04-30 23:05:05 +04:00
|
|
|
|
|
|
|
|
|
public IActionResult Operations()
|
|
|
|
|
{
|
|
|
|
|
return View(_carLogic.ReadList(new() { EmployeeId = Employee.Id }));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IActionResult Purchases()
|
|
|
|
|
{
|
|
|
|
|
return View(_carLogic.ReadList(new() { EmployeeId = Employee.Id }));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IActionResult Costs()
|
|
|
|
|
{
|
|
|
|
|
return View(_costLogic.ReadList(new() { EmployeeId = Employee.Id }));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IActionResult ReportFromOperations(string? getReport, string? sendToMail, DateTime startDate, DateTime endDate)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogInformation("Попытка получить отчет: {@getReport}; {@sendToMail} Период: {0}---{1}", getReport, sendToMail, startDate, endDate);
|
|
|
|
|
if (startDate > endDate)
|
|
|
|
|
{
|
|
|
|
|
throw new Exception("Дата начала больше даты конца периода");
|
|
|
|
|
}
|
|
|
|
|
if (getReport != null)
|
|
|
|
|
{
|
|
|
|
|
return View(_paymentLogic.ReadList(new()
|
|
|
|
|
{
|
|
|
|
|
DateFrom = DateOnly.FromDateTime(startDate),
|
|
|
|
|
DateTo = DateOnly.FromDateTime(endDate)
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
if (sendToMail != null)
|
|
|
|
|
{
|
|
|
|
|
_reportLogic.SendPaymentsToEmail(
|
|
|
|
|
option: new()
|
|
|
|
|
{
|
|
|
|
|
DateFrom = DateOnly.FromDateTime(startDate),
|
|
|
|
|
DateTo = DateOnly.FromDateTime(endDate)
|
|
|
|
|
},
|
|
|
|
|
email: Employee.Email
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
return View();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[HttpGet]
|
|
|
|
|
public IActionResult Operation(int? id)
|
|
|
|
|
{
|
|
|
|
|
if (id.HasValue)
|
|
|
|
|
{
|
|
|
|
|
return View(_carLogic.ReadElement(new() {Id = id}));
|
|
|
|
|
}
|
|
|
|
|
return View();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[HttpPost]
|
|
|
|
|
public void Operation(OperationBindingModel car)
|
|
|
|
|
{
|
|
|
|
|
var isOperationUpdate = Request.RouteValues.TryGetValue("id", out var identValue);
|
|
|
|
|
isOperationUpdate &= int.TryParse((string?)identValue, out var id);
|
|
|
|
|
|
|
|
|
|
_logger.LogInformation("При изменении обследования были получены данные: {_mark}; {_model}; {idUpdated}", car.Mark, car.Model, identValue);
|
|
|
|
|
|
|
|
|
|
if (isOperationUpdate)
|
|
|
|
|
{
|
|
|
|
|
car.Id = id;
|
|
|
|
|
_carLogic.Update(car);
|
|
|
|
|
Response.Redirect("../Operations");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
car.EmployeeId = Employee.Id;
|
|
|
|
|
_carLogic.Create(car);
|
|
|
|
|
Response.Redirect("Operations");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IActionResult RemoveOperation(int id)
|
|
|
|
|
{
|
|
|
|
|
_carLogic.Delete(new() { Id = id });
|
|
|
|
|
return Redirect("~/Home/Operations");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[HttpGet]
|
|
|
|
|
public FileResult ReportPurchasesInWord(int[] ids)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogInformation("Запрошен отчет в формате word");
|
|
|
|
|
_logger.LogInformation("Получено {count} обследований для отчета", ids.Length);
|
|
|
|
|
|
|
|
|
|
MemoryStream mstream = new();
|
|
|
|
|
_reportLogic.SavePurchasesToWord(new()
|
|
|
|
|
{
|
|
|
|
|
Ids = ids,
|
|
|
|
|
Stream = mstream,
|
|
|
|
|
});
|
|
|
|
|
return File(mstream.ToArray(), System.Net.Mime.MediaTypeNames.Application.Octet, "reportWord.docx");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[HttpGet]
|
|
|
|
|
public FileResult ReportPurchasesInExcel(int[] ids)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogInformation("Запрошен отчет в формате excel");
|
|
|
|
|
_logger.LogInformation("Получено {count} обследований для отчета", ids.Length);
|
|
|
|
|
|
|
|
|
|
MemoryStream mstream = new();
|
|
|
|
|
_reportLogic.SavePurchasesToExcel(new()
|
|
|
|
|
{
|
|
|
|
|
Ids = ids,
|
|
|
|
|
Stream = mstream
|
|
|
|
|
});
|
|
|
|
|
return File(mstream.ToArray(), System.Net.Mime.MediaTypeNames.Application.Octet, "reportExcel.xlsx");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public IActionResult Cost(int? id)
|
|
|
|
|
{
|
|
|
|
|
if (id.HasValue)
|
|
|
|
|
{
|
|
|
|
|
return View(_costLogic.ReadElement(new() { Id = id }));
|
|
|
|
|
}
|
|
|
|
|
return View();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[HttpPost]
|
|
|
|
|
public void Cost(string name, double price)
|
|
|
|
|
{
|
|
|
|
|
var isOperationUpdate = Request.RouteValues.TryGetValue("id", out var identValue);
|
|
|
|
|
isOperationUpdate &= int.TryParse((string?)identValue, out var id);
|
|
|
|
|
|
|
|
|
|
_logger.LogInformation("При изменении затрат были получены данные: {name}; {price}; {idUpdated}", name, price, identValue);
|
|
|
|
|
CostBindingModel model = new()
|
|
|
|
|
{
|
|
|
|
|
NameOfCost = name,
|
|
|
|
|
Price = price,
|
|
|
|
|
};
|
|
|
|
|
if (isOperationUpdate)
|
|
|
|
|
{
|
|
|
|
|
model.Id = id;
|
|
|
|
|
_costLogic.Update(model);
|
|
|
|
|
Response.Redirect("../Costs");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
model.EmployeeId = Employee.Id;
|
|
|
|
|
_costLogic.Create(model);
|
|
|
|
|
Response.Redirect("Costs");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IActionResult RemoveCost(int id)
|
|
|
|
|
{
|
|
|
|
|
_costLogic.Delete(new() { Id = id });
|
|
|
|
|
return Redirect("~/Home/Costs");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IActionResult BindPurchase(int id)
|
|
|
|
|
{
|
|
|
|
|
ViewBag.Costs = _costLogic.ReadList(new() { EmployeeId = Employee.Id });
|
|
|
|
|
ViewBag.SelectedId = id;
|
|
|
|
|
ViewBag.Purchases = _purchaseLogic.ReadList();
|
|
|
|
|
return View();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[HttpPost]
|
|
|
|
|
public void BindPurchase(int cost, int purchase, int count)
|
|
|
|
|
{
|
|
|
|
|
var purchaseModel = _purchaseLogic.ReadElement(new() { Id = purchase });
|
|
|
|
|
var costmodel = _costLogic.ReadElement(new() { Id = cost });
|
|
|
|
|
_costLogic.Update(new()
|
|
|
|
|
{
|
|
|
|
|
Id = cost,
|
|
|
|
|
Price = costmodel.Price,
|
|
|
|
|
NameOfCost = costmodel.NameOfCost,
|
|
|
|
|
PurchasesModels =
|
|
|
|
|
{
|
|
|
|
|
[purchase] = new() { Count = count, PurchaseId = purchase }
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
Response.Redirect("/Home/Costs");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public double CalcCostSum(int cost, int count)
|
|
|
|
|
{
|
|
|
|
|
return _costLogic.ReadElement(new() {Id = cost}).Price * count;
|
|
|
|
|
}
|
2024-04-29 18:44:07 +04:00
|
|
|
|
}
|
2024-04-30 23:05:05 +04:00
|
|
|
|
}
|