сделаны таблицы + небольшие доработки
This commit is contained in:
parent
77773bc3a8
commit
6daea90ac0
@ -91,15 +91,9 @@
|
||||
var selectedcar = $('#carSelect option:selected');
|
||||
if (selectedcar.val()) {
|
||||
var carId = selectedcar.val();
|
||||
var exists = false;
|
||||
$('#carsTable tbody tr').each(function () {
|
||||
if ($(this).data('car-id') == carId) {
|
||||
exists = true;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
var exists = $('#carsTable tbody tr[data-car-id="' + carId + '"]').length > 0;
|
||||
if (exists) {
|
||||
alert('Эта машина уже добавлена.');
|
||||
alert('Эта продажа уже добавлена.');
|
||||
return;
|
||||
}
|
||||
|
||||
@ -134,7 +128,7 @@
|
||||
});
|
||||
|
||||
$('#CompletionsForm').submit(function (event) {
|
||||
var title = $('#title').val();
|
||||
var title = $('#name').val();
|
||||
var isValid = true;
|
||||
|
||||
$('#titleError').text('');
|
||||
|
@ -17,7 +17,6 @@
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" asp-controller="Home" asp-action="Index">Администратор Автоцентр "Корыто"</a>
|
||||
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Privacy">@ViewData["Login"]</a>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
@ -75,7 +75,7 @@ namespace CarCenterBusinessLogic.BusinessLogics
|
||||
|
||||
public List<PreSaleWorkViewModel>? ReadList(PreSaleWorkSearchModel? model)
|
||||
{
|
||||
_logger.LogInformation("ReadList. PreSaleWorkType:{PreSaleWorkType}.Id:{ Id}", model?.PreSaleWorkType, model?.Id);
|
||||
_logger.LogInformation("ReadList. Id:{ Id}", model?.Id);
|
||||
|
||||
var list = model == null ? _PreSaleWorkStorage.GetFullList() : _PreSaleWorkStorage.GetFilteredList(model);
|
||||
|
||||
|
@ -123,7 +123,7 @@ namespace CarCenterBusinessLogic.BusinessLogics
|
||||
throw new ArgumentNullException("Стоимость продажи не может быть меньше нуля", nameof(model.SalePrice));
|
||||
}
|
||||
|
||||
_logger.LogInformation("Sale. DateCreate:{DateCreate}.SalePrice:{ SalePrice}. Id: { Id}", model.DateCreate, model.SalePrice, model.Id);
|
||||
_logger.LogInformation("Sale. SaleName:{SaleName}.SalePrice:{ SalePrice}. Id: { Id}", model.SaleName, model.SalePrice, model.Id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -34,9 +34,9 @@ namespace CarCenterDataBaseImplement.Implements
|
||||
return new();
|
||||
}
|
||||
using var context = new CarCenterDataBase();
|
||||
if (model.CarSalesId.HasValue)
|
||||
if (model.SalesId.HasValue)
|
||||
return context.PreSaleWorks.Include(p => p.Sales).ThenInclude(p => p.Sale).Include(p => p.Completions).Where(x => x.ManagerId == model.ManagerId).Where(x => x.Sales.FirstOrDefault(y => y.SaleId == model.CarSalesId) != null).Select(x => x.GetViewModel).ToList();
|
||||
else if (model.SalesId.HasValue)
|
||||
else if (model.CarSalesId.HasValue)
|
||||
return context.PreSaleWorks.Where(p => p.CompletionsId.HasValue).Include(p => p.Completions).ThenInclude(p => p.Cars).Where(x => x.Completions.Cars.FirstOrDefault(y => y.CarId == model.CarSalesId) != null).Select(x => x.GetViewModel).ToList();
|
||||
else
|
||||
return context.PreSaleWorks.Include(p => p.Sales).ThenInclude(p => p.Sale).Include(p => p.Completions).Where(x => x.ManagerId == model.ManagerId).Select(x => x.GetViewModel).ToList();
|
||||
|
@ -142,7 +142,7 @@ namespace ManagerApp.Controllers
|
||||
[HttpGet]
|
||||
public IActionResult CreatePreSaleWork(int id)
|
||||
{
|
||||
var Sale = _data.GetSale(UserManager.manager!.Id);
|
||||
var Sale = _data.GetSales(UserManager.manager!.Id);
|
||||
ViewBag.AllSale = Sale;
|
||||
if (id != 0)
|
||||
{
|
||||
@ -293,7 +293,7 @@ namespace ManagerApp.Controllers
|
||||
HttpContext.Session.SetString("StartDate", startDate.ToString());
|
||||
HttpContext.Session.SetString("EndDate", endDate.ToString());
|
||||
|
||||
return RedirectToAction("CarsPeriodReport");
|
||||
return RedirectToAction("SalesPeriodReport");
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult SalesPeriodReport()
|
||||
|
@ -113,18 +113,18 @@ namespace ManagerApp
|
||||
|
||||
public List<SalesPeriodReportViewModel> GetTimeReport(DateTime? startDate, DateTime? endDate, int ManagerId)
|
||||
{
|
||||
var Sale = _SaleLogic.ReadList(new() { DateFrom = startDate, DateTo = endDate, ManagerId = ManagerId });
|
||||
if (Sale == null)
|
||||
var Sales = _SaleLogic.ReadList(new() { DateFrom = startDate, DateTo = endDate, ManagerId = ManagerId });
|
||||
if (Sales == null)
|
||||
return new();
|
||||
List<SalesPeriodReportViewModel> SalePeriodReports = new List<SalesPeriodReportViewModel>();
|
||||
foreach (var sale in Sale)
|
||||
foreach (var Sale in Sales)
|
||||
{
|
||||
var report = new SalesPeriodReportViewModel();
|
||||
report.SaleName = sale.SaleName;
|
||||
var PreSaleWorks = _PreSaleWorkLogic.ReadList(new() { SalesId = sale.Id, ManagerId = ManagerId });
|
||||
report.SaleName = Sale.SaleName;
|
||||
var PreSaleWorks = _PreSaleWorkLogic.ReadList(new() { SalesId = Sale.Id, ManagerId = ManagerId });
|
||||
if (PreSaleWorks != null)
|
||||
report.PreSaleWork = PreSaleWorks.Select(p => p.PreSaleWorkType).ToList();
|
||||
var Employee = _employeeLogic.ReadList(new() { SaleId = sale.Id, ManagerId = ManagerId });
|
||||
var Employee = _employeeLogic.ReadList(new() { SaleId = Sale.Id, ManagerId = ManagerId });
|
||||
if (Employee != null)
|
||||
report.Employee = Employee.Select(p => p.EmployeeFIO).ToList();
|
||||
SalePeriodReports.Add(report);
|
||||
|
@ -1,51 +1,67 @@
|
||||
@using CarCenterContracts.ViewModels
|
||||
|
||||
@model List<SaleViewModel>
|
||||
@model PreSaleWorkViewModel
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "CreatePreSaleWork";
|
||||
ViewBag.Sales = Model.PreSaleWorkSales;
|
||||
}
|
||||
<div class="text-center">
|
||||
<h2 class="display-4">Создание предпродажной работы</h2>
|
||||
</div>
|
||||
<form method="post">
|
||||
<form id="PreSaleWorkForm" method="post">
|
||||
<div class="row">
|
||||
<div class="col-4">Название:</div>
|
||||
<div class="col-8"><input type="text" name="title" id="title" /></div>
|
||||
<div class="col-4">Тип предпродажной работы:</div>
|
||||
<div class="col-8">
|
||||
<input type="text" name="type" id="type" value="@Model.PreSaleWorkType" />
|
||||
<span id="titleError" class="text-danger"></span>
|
||||
</div>
|
||||
<div class="col-4">Дата проведения предпродажной работы:</div>
|
||||
<div class="col-8">
|
||||
<input type="date" name="date" id="date" value="@Model.PreSaleWorkDate" />
|
||||
<span id="titleError" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div>PreSaleWork</div>
|
||||
<div>Продажи</div>
|
||||
<div class="table-responsive-lg">
|
||||
<table id="SaleTable" class="display">
|
||||
<table id="SalesTable" class="display">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Выбор</th>
|
||||
<th>Название</th>
|
||||
<th>Стоимость</th>
|
||||
<th>Удалить</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@if (Model != null && Model.Any())
|
||||
@foreach (var Sale in ViewBag.Sales)
|
||||
{
|
||||
@foreach (var sales in Model)
|
||||
{
|
||||
<tr>
|
||||
<td>
|
||||
<input type="checkbox" name="sale" value="@sales.Id" />
|
||||
</td>
|
||||
<td>@sales.SaleName</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
<td>
|
||||
<input type="checkbox" name="sale" value="none" />
|
||||
</td>
|
||||
<td>none</td>
|
||||
<tr data-Sale-id="@Sale.Value.Id">
|
||||
<td>
|
||||
<input type="hidden" name="SaleIds" value="@Sale.Value.Id" />
|
||||
@Sale.Value.SaleName
|
||||
</td>
|
||||
|
||||
<td class="Sale-cost" data-cost="@Sale.Value.SalePrice">@Sale.Value.SalePrice</td>
|
||||
<td><button type="button" class="deleteSale" data-Sale-id="@Sale.Value.Id">Удалить</button></td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<select id="SaleSelect" class="form-control">
|
||||
<option value="">Выберите продажу</option>
|
||||
@foreach (var Sale in ViewBag.AllSale)
|
||||
{
|
||||
<option value="@Sale.Id" data-cost="@Sale.SalePrice">@Sale.SaleName</option>
|
||||
}
|
||||
|
||||
</select>
|
||||
<button type="button" id="addSale" class="btn btn-secondary">Добавить продажу</button>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4">Сумма:</div>
|
||||
<div class="col-8"><input type="text" id="sum" name="sum" readonly /></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-8"></div>
|
||||
@ -57,6 +73,82 @@
|
||||
<script src="https://cdn.datatables.net/1.11.3/js/jquery.dataTables.js"></script>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$('#SaleTable').DataTable();
|
||||
function updateSum() {
|
||||
var sum = 0;
|
||||
$('#SalesTable tbody tr').each(function () {
|
||||
var cost = $(this).find('.Sale-cost').data('cost');
|
||||
sum += parseFloat(cost);
|
||||
});
|
||||
$('#sum').val(sum.toFixed(2));
|
||||
}
|
||||
|
||||
$(document).on('click', '.deleteSale', function () {
|
||||
var row = $(this).closest('tr');
|
||||
row.remove();
|
||||
updateSum();
|
||||
});
|
||||
|
||||
$('#addSale').click(function () {
|
||||
var selectedSale = $('#SaleSelect option:selected');
|
||||
if (selectedSale.val()) {
|
||||
var SaleId = selectedSale.val();
|
||||
var exists = $('#SalesTable tbody tr[data-Sale-id="' + SaleId + '"]').length > 0;
|
||||
if (exists) {
|
||||
alert('Эта машина уже добавлена.');
|
||||
return;
|
||||
}
|
||||
|
||||
var SaleName = selectedSale.text();
|
||||
var SaleCost = selectedSale.data('cost');
|
||||
|
||||
var newRow = `
|
||||
<tr data-Sale-id="${SaleId}">
|
||||
<td>
|
||||
<input type="hidden" name="SaleIds" value="${SaleId}" />
|
||||
${SaleName}
|
||||
</td>
|
||||
|
||||
<td class="Sale-cost" data-cost="${SaleCost}">${SaleCost}</td>
|
||||
<td><button type="button" class="deleteSale" data-Sale-id="${SaleId}">Удалить</button></td>
|
||||
</tr>
|
||||
`;
|
||||
$('#SalesTable tbody').append(newRow);
|
||||
|
||||
$('.deleteSale').off('click').on('click', function () {
|
||||
var row = $(this).closest('tr');
|
||||
row.remove();
|
||||
updateSum();
|
||||
});
|
||||
|
||||
$('#SaleSelect').val('');
|
||||
|
||||
updateSum();
|
||||
} else {
|
||||
alert('Выберите продажу для добавления');
|
||||
}
|
||||
});
|
||||
|
||||
$('#PreSaleWorkForm').submit(function (event) {
|
||||
var title = $('#type').val();
|
||||
var isValid = true;
|
||||
|
||||
$('#titleError').text('');
|
||||
if (title.length < 2 || title.length > 50) {
|
||||
$('#titleError').text('Название должно быть от 2 до 50 символов.');
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
var totalSales = $('#SalesTable tbody tr').length;
|
||||
if (totalSales == 0) {
|
||||
alert('Пожалуйста, добавьте хотя бы одну продажу.');
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
if (!isValid) {
|
||||
event.preventDefault();
|
||||
}
|
||||
});
|
||||
|
||||
updateSum();
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
@ -64,7 +64,10 @@
|
||||
<a asp-action="CreatePreSaleWork" asp-route-id="@item.Id" class="btn btn-primary">Изменить</a>
|
||||
</td>
|
||||
<td>
|
||||
<a asp-action="Delete" asp-route-id="@item.Id" class="btn btn-danger">Удалить</a>
|
||||
<form method="post">
|
||||
<input type="text" title="id" name="id" value="@item.Id" hidden="hidden" />
|
||||
<input type="submit" class="btn btn-danger" value="Удалить" />
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
|
@ -1,6 +1,104 @@
|
||||
@{
|
||||
ViewData["Title"] = "Privacy Policy";
|
||||
}
|
||||
<h1>@ViewData["Title"]</h1>
|
||||
|
||||
<p>Use this page to detail your site's privacy policy.</p>
|
||||
<div class="text-center">
|
||||
<h2 class="display-4">Личные данные</h2>
|
||||
</div>
|
||||
<form id="managerForm" method="post">
|
||||
<div class="row">
|
||||
<div class="col-4">Имя:</div>
|
||||
<div class="col-8">
|
||||
<input type="text" name="fio" id="fio" value="@Model.ManagerFIO" />
|
||||
<span id="fioError" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4">Логин:</div>
|
||||
<div class="col-8">
|
||||
<input type="text" name="login" id="login" value="@Model.ManagerLogin" />
|
||||
<span id="loginError" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4">Почта:</div>
|
||||
<div class="col-8">
|
||||
<input type="email" name="email" id="email" value="@Model.ManagerEmail" />
|
||||
<span id="emailError" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4">Номер телефона:</div>
|
||||
<div class="col-8">
|
||||
<input type="text" name="number" id="number" value="@Model.ManagerNumber" />
|
||||
<span id="numberError" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4">Пароль:</div>
|
||||
<div class="col-8">
|
||||
<input type="password" name="password" id="password" value="@Model.ManagerPassword" />
|
||||
<span id="passwordError" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-8"></div>
|
||||
<div class="col-4"><input type="submit" value="Обновить" class="btn btn-primary" /></div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$('#managerForm').submit(function (event) {
|
||||
var name = $('#fio').val();
|
||||
var login = $('#login').val();
|
||||
var email = $('#email').val();
|
||||
var number = $('#number').val();
|
||||
var password1 = $('#password1').val();
|
||||
var isValid = true;
|
||||
|
||||
$('#fioError').text('');
|
||||
$('#loginError').text('');
|
||||
$('#emailError').text('');
|
||||
$('#numberError').text('');
|
||||
$('#passwordError').text('');
|
||||
|
||||
// Валидация имени
|
||||
if (fio.length < 2 || fio.length > 20) {
|
||||
$('#fioError').text('Имя должно быть от 2 до 20 символов.');
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
// Валидация логина
|
||||
if (login.length < 5 || login.length > 50) {
|
||||
$('#loginError').text('Логин должен быть от 5 до 50 символов.');
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
// Валидация почты
|
||||
var emailPattern = /^[a-zA-Z0-9._-]+@@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/;
|
||||
if (!emailPattern.test(email)) {
|
||||
$('#emailError').text('Неверный формат почты.');
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
// Валидация номера телефона
|
||||
var numberPattern = /^\d{11}$/;
|
||||
if (!numberPattern.test(number)) {
|
||||
$('#numberError').text('Неверный формат номера телефона.');
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
// Валидация пароля
|
||||
if (password.length < 8 || password.length > 20) {
|
||||
$('#passwordError').text('Пароль должен быть от 8 до 20 символов.');
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
if (!isValid) {
|
||||
event.preventDefault();
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
@ -5,7 +5,7 @@
|
||||
<div class="text-center">
|
||||
<h1 class="display-4">Список создания отчетов</h1>
|
||||
<div class="list-group">
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="SalesPeriodReport">Отчет по машинам за период</a>
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="SalesInspectionsReport">Отчет по машинам и предпродажным работам</a>
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="SaleDateChoose">Отчет по продажам за период</a>
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="SalesInspectionsReport">Отчет по продажам и осмотрам</a>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -0,0 +1,76 @@
|
||||
@{
|
||||
ViewData["Title"] = "Создание отчета";
|
||||
}
|
||||
|
||||
<div class="text-center">
|
||||
<h2 class="display-4">Создание отчета</h2>
|
||||
</div>
|
||||
<form id="TimeReportWeb" method="post">
|
||||
<div class="row mb-3">
|
||||
<div class="col-4 text-right">
|
||||
<label for="startDate">Дата начала:</label>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<input type="date" id="startDate" name="startDate" class="form-control" required />
|
||||
<span id="startDateError" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<div class="col-4 text-right">
|
||||
<label for="endDate">Дата окончания:</label>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<input type="date" id="endDate" name="endDate" class="form-control" required />
|
||||
<span id="endDateError" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<div class="col-6 text-right">
|
||||
<button type="button" id="generateReport" class="btn btn-primary">Создать отчет</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
function validateDates() {
|
||||
var startDate = new Date($('#startDate').val());
|
||||
var endDate = new Date($('#endDate').val());
|
||||
var today = new Date();
|
||||
var isValid = true;
|
||||
|
||||
$('#startDateError').text('');
|
||||
$('#endDateError').text('');
|
||||
|
||||
// Проверка, что даты не превосходят сегодняшнюю дату
|
||||
if (startDate > today) {
|
||||
$('#startDateError').text('Дата начала не может быть больше сегодняшней даты.');
|
||||
isValid = false;
|
||||
}
|
||||
if (endDate > today) {
|
||||
$('#endDateError').text('Дата окончания не может быть больше сегодняшней даты.');
|
||||
isValid = false;
|
||||
}
|
||||
// Проверка, что стартовая дата не превосходит конечную дату
|
||||
if (startDate > endDate) {
|
||||
$('#endDateError').text('Дата окончания не может быть раньше даты начала.');
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
return isValid;
|
||||
}
|
||||
|
||||
$('#generateReport').click(function () {
|
||||
if (validateDates()) {
|
||||
var formData = $('#TimeReportWeb').serialize();
|
||||
|
||||
$.post('/Home/TimeReportWeb', formData, function (response) {
|
||||
window.location.href = '/Home/SalesPeriodReport';
|
||||
}).fail(function () {
|
||||
alert('Произошла ошибка при создании отчета.');
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
@ -20,7 +20,7 @@
|
||||
<tr>
|
||||
<th>Продажа</th>
|
||||
<th>Сотрудники</th>
|
||||
<th>Комплектации</th>
|
||||
<th>Предпродажные работы</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@ -37,7 +37,12 @@
|
||||
</ul>
|
||||
</td>
|
||||
<td>
|
||||
|
||||
<ul>
|
||||
@foreach (var presalework in sales.PreSaleWork)
|
||||
{
|
||||
<li>@presalework</li>
|
||||
}
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
|
@ -1,4 +1,7 @@
|
||||
<!DOCTYPE html>
|
||||
@{
|
||||
ViewData["Login"] = UserManager.manager == null ? "Пользователь" : UserManager.manager.ManagerLogin;
|
||||
}
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
@ -13,6 +16,7 @@
|
||||
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">Менеджер Автоцентр "Корыто"</a>
|
||||
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Privacy">@ViewData["Login"]</a>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
Loading…
x
Reference in New Issue
Block a user