сделаны таблицы + небольшие доработки

This commit is contained in:
Stepan 2024-05-28 21:30:33 +04:00
parent 77773bc3a8
commit 6daea90ac0
14 changed files with 327 additions and 56 deletions

View File

@ -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('');

View File

@ -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>

View File

@ -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);

View File

@ -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);
}
}
}

View File

@ -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();

View File

@ -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()

View File

@ -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);

View File

@ -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>

View File

@ -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>
}

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>
}

View File

@ -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>