Compare commits
No commits in common. "main" and "malafeev_part2" have entirely different histories.
main
...
malafeev_p
@ -7,11 +7,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="DocumentFormat.OpenXml" Version="3.0.2" />
|
||||
<PackageReference Include="MailKit" Version="4.6.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="6.0.0" />
|
||||
<PackageReference Include="PDFsharp-MigraDoc-GDI" Version="6.1.0" />
|
||||
<PackageReference Include="System.Drawing.Common" Version="8.0.6" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
@ -1,53 +0,0 @@
|
||||
using CarCenterContracts.BindingModels;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.MailWorker
|
||||
{
|
||||
public abstract class AbstractMailWorker
|
||||
{
|
||||
protected string _mailLogin = string.Empty;
|
||||
protected string _mailPassword = string.Empty;
|
||||
protected string _smtpClientHost = string.Empty;
|
||||
protected int _smtpClientPort;
|
||||
protected string _popHost = string.Empty;
|
||||
protected int _popPort;
|
||||
private readonly ILogger _logger;
|
||||
public AbstractMailWorker(ILogger<AbstractMailWorker> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
public void MailConfig(MailConfigModel config)
|
||||
{
|
||||
_mailLogin = config.MailLogin;
|
||||
_mailPassword = config.MailPassword;
|
||||
_smtpClientHost = config.SmtpClientHost;
|
||||
_smtpClientPort = config.SmtpClientPort;
|
||||
_popHost = config.PopHost;
|
||||
_popPort = config.PopPort;
|
||||
_logger.LogDebug("Config: {login}, {password}, {clientHost}, {clientPort}, {popHost}, {popPort} ", _mailLogin, _mailPassword, _smtpClientHost, _smtpClientPort, _popHost, _popPort);
|
||||
}
|
||||
public async void MailSendAsync(MailSendInfoModel info)
|
||||
{
|
||||
if (string.IsNullOrEmpty(_mailLogin) || string.IsNullOrEmpty(_mailPassword))
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (string.IsNullOrEmpty(_smtpClientHost) || _smtpClientPort == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (string.IsNullOrEmpty(info.MailAddress) || string.IsNullOrEmpty(info.Subject) || (string.IsNullOrEmpty(info.Text) && info.Pdf == null))
|
||||
{
|
||||
return;
|
||||
}
|
||||
_logger.LogDebug("Send Mail: {To}, {Subject}", info.MailAddress, info.Subject);
|
||||
await SendMailAsync(info);
|
||||
}
|
||||
protected abstract Task SendMailAsync(MailSendInfoModel info);
|
||||
}
|
||||
}
|
@ -1,48 +0,0 @@
|
||||
using CarCenterContracts.BindingModels;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.Mail;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.MailWorker
|
||||
{
|
||||
public class MailKitWorker : AbstractMailWorker
|
||||
{
|
||||
public MailKitWorker(ILogger<MailKitWorker> logger) : base(logger) { }
|
||||
protected override async Task SendMailAsync(MailSendInfoModel info)
|
||||
{
|
||||
using var objMailMessage = new MailMessage();
|
||||
using var objSmtpClient = new SmtpClient(_smtpClientHost, _smtpClientPort);
|
||||
try
|
||||
{
|
||||
objMailMessage.From = new MailAddress(_mailLogin);
|
||||
objMailMessage.To.Add(new MailAddress(info.MailAddress));
|
||||
objMailMessage.Subject = info.Subject;
|
||||
objMailMessage.SubjectEncoding = Encoding.UTF8;
|
||||
objMailMessage.BodyEncoding = Encoding.UTF8;
|
||||
if (info.Text != null)
|
||||
{
|
||||
objMailMessage.Body = info.Text;
|
||||
}
|
||||
if (info.Pdf != null)
|
||||
{
|
||||
var attachment = new Attachment(new MemoryStream(info.Pdf), info.FileName);
|
||||
objMailMessage.Attachments.Add(attachment);
|
||||
}
|
||||
objSmtpClient.UseDefaultCredentials = false;
|
||||
objSmtpClient.EnableSsl = true;
|
||||
objSmtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
|
||||
objSmtpClient.Credentials = new NetworkCredential(_mailLogin, _mailPassword);
|
||||
await Task.Run(() => objSmtpClient.Send(objMailMessage));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
using CarCenterBusinessLogic.OfficePackage.HelperModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage
|
||||
{
|
||||
public abstract class AbstractSaveToExcel
|
||||
{
|
||||
protected abstract void CreateExcel(ExcelInfo info);
|
||||
protected abstract void InsertCellInWorksheet(ExcelCellParameters excelParams);
|
||||
protected abstract void MergeCells(ExcelMergeParameters excelParams);
|
||||
protected abstract void SaveExcel(ExcelInfo info);
|
||||
}
|
||||
}
|
@ -1,99 +0,0 @@
|
||||
using CarCenterBusinessLogic.OfficePackage.HelperEnums;
|
||||
using CarCenterBusinessLogic.OfficePackage.HelperModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage
|
||||
{
|
||||
public abstract class AbstractSaveToExcelStorekeeper
|
||||
{
|
||||
public void CreateReport(ExcelInfoStorekeeper info)
|
||||
{
|
||||
CreateExcel(info);
|
||||
|
||||
InsertCellInWorksheet(new ExcelCellParameters
|
||||
{
|
||||
ColumnName = "A",
|
||||
RowIndex = 1,
|
||||
Text = info.Title,
|
||||
StyleInfo = ExcelStyleInfoType.Title
|
||||
});
|
||||
|
||||
MergeCells(new ExcelMergeParameters
|
||||
{
|
||||
CellFromName = "A1",
|
||||
CellToName = "C1"
|
||||
});
|
||||
|
||||
InsertCellInWorksheet(new ExcelCellParameters
|
||||
{
|
||||
ColumnName = "A",
|
||||
RowIndex = 2,
|
||||
Text = "Автомобили",
|
||||
StyleInfo = ExcelStyleInfoType.Title
|
||||
});
|
||||
InsertCellInWorksheet(new ExcelCellParameters
|
||||
{
|
||||
ColumnName = "B",
|
||||
RowIndex = 2,
|
||||
Text = "Предпродажные",
|
||||
StyleInfo = ExcelStyleInfoType.Title
|
||||
});
|
||||
|
||||
MergeCells(new ExcelMergeParameters
|
||||
{
|
||||
CellFromName = "B2",
|
||||
CellToName = ColumnLetter(info.maxleng + 1) + "2"
|
||||
});
|
||||
uint rowIndex = 3;
|
||||
foreach (var pc in info.carPresalesReport)
|
||||
{
|
||||
InsertCellInWorksheet(new ExcelCellParameters
|
||||
{
|
||||
ColumnName = "A",
|
||||
RowIndex = rowIndex,
|
||||
Text = pc.VINnumber.ToString(),
|
||||
StyleInfo = ExcelStyleInfoType.Text
|
||||
});
|
||||
int place = 2;
|
||||
foreach (var workshop in pc.Presales)
|
||||
{
|
||||
InsertCellInWorksheet(new ExcelCellParameters
|
||||
{
|
||||
ColumnName = ColumnLetter(place),
|
||||
RowIndex = rowIndex,
|
||||
Text = workshop,
|
||||
StyleInfo = ExcelStyleInfoType.TextWithBorder
|
||||
});
|
||||
|
||||
place++;
|
||||
}
|
||||
rowIndex++;
|
||||
}
|
||||
|
||||
SaveExcel(info);
|
||||
}
|
||||
private static string ColumnLetter(int columnIndex)
|
||||
{
|
||||
int dividend = columnIndex;
|
||||
string columnName = String.Empty;
|
||||
int modulo;
|
||||
|
||||
while (dividend > 0)
|
||||
{
|
||||
modulo = (dividend - 1) % 26;
|
||||
columnName = Convert.ToChar(65 + modulo).ToString() + columnName;
|
||||
dividend = (dividend - modulo) / 26;
|
||||
}
|
||||
|
||||
return columnName;
|
||||
}
|
||||
protected abstract void CreateExcel(ExcelInfoStorekeeper info);
|
||||
protected abstract void InsertCellInWorksheet(ExcelCellParameters excelParams);
|
||||
protected abstract void MergeCells(ExcelMergeParameters excelParams);
|
||||
protected abstract void SaveExcel(ExcelInfoStorekeeper info);
|
||||
}
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
using CarCenterBusinessLogic.OfficePackage.HelperModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage
|
||||
{
|
||||
public abstract class AbstractSaveToPdf
|
||||
{
|
||||
protected abstract void CreatePdf(PdfInfo info);
|
||||
|
||||
protected abstract void CreateParagraph(PdfParagraph paragraph);
|
||||
|
||||
protected abstract void CreateTable(List<string> columns);
|
||||
|
||||
protected abstract void CreateRow(PdfRowParameters rowParameters);
|
||||
|
||||
protected abstract void SavePdf(PdfInfo info);
|
||||
}
|
||||
}
|
@ -1,68 +0,0 @@
|
||||
using CarCenterBusinessLogic.OfficePackage.HelperEnums;
|
||||
using CarCenterBusinessLogic.OfficePackage.HelperModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage
|
||||
{
|
||||
public abstract class AbstractSaveToPdfStorekeeper
|
||||
{
|
||||
public void CreateDoc(PdfInfoStorekeeper info)
|
||||
{
|
||||
CreatePdf(info);
|
||||
CreateParagraph(new PdfParagraph { Text = info.Title, Style = "NormalTitle", ParagraphAlignment = PdfParagraphAlignmentType.Center });
|
||||
CreateParagraph(new PdfParagraph { Text = $"с {info.DateFrom.ToShortDateString()} по {info.DateTo.ToShortDateString()}", Style = "Normal", ParagraphAlignment = PdfParagraphAlignmentType.Center });
|
||||
|
||||
CreateTable(new List<string> { "5cm", "10cm" });
|
||||
|
||||
foreach (var report in info.reportBundling)
|
||||
{
|
||||
CreateRow(new PdfRowParameters
|
||||
{
|
||||
Texts = new List<string> { "Номер комплектации", "Покупка" },
|
||||
Style = "NormalTitle",
|
||||
ParagraphAlignment = PdfParagraphAlignmentType.Center
|
||||
});
|
||||
CreateRow(new PdfRowParameters
|
||||
{
|
||||
Texts = new List<string> { report.BundlingId.ToString(), "" },
|
||||
Style = "Normal",
|
||||
ParagraphAlignment = PdfParagraphAlignmentType.Left
|
||||
});
|
||||
foreach (var product in report.Orders)
|
||||
CreateRow(new PdfRowParameters
|
||||
{
|
||||
Texts = new List<string> { "", product },
|
||||
Style = "Normal",
|
||||
ParagraphAlignment = PdfParagraphAlignmentType.Left
|
||||
});
|
||||
CreateRow(new PdfRowParameters
|
||||
{
|
||||
Texts = new List<string> { "", "Особенности" },
|
||||
Style = "NormalTitle",
|
||||
ParagraphAlignment = PdfParagraphAlignmentType.Center
|
||||
});
|
||||
foreach (var production in report.Features)
|
||||
CreateRow(new PdfRowParameters
|
||||
{
|
||||
Texts = new List<string> { "", production },
|
||||
Style = "Normal",
|
||||
ParagraphAlignment = PdfParagraphAlignmentType.Left
|
||||
});
|
||||
}
|
||||
SavePdf(info);
|
||||
}
|
||||
protected abstract void CreatePdf(PdfInfoStorekeeper info);
|
||||
|
||||
protected abstract void CreateParagraph(PdfParagraph paragraph);
|
||||
|
||||
protected abstract void CreateTable(List<string> columns);
|
||||
|
||||
protected abstract void CreateRow(PdfRowParameters rowParameters);
|
||||
|
||||
protected abstract void SavePdf(PdfInfoStorekeeper info);
|
||||
}
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
using CarCenterBusinessLogic.OfficePackage.HelperModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage
|
||||
{
|
||||
public abstract class AbstractSaveToWord
|
||||
{
|
||||
protected abstract void CreateWord(WordInfo info);
|
||||
protected abstract void CreateParagraph(WordParagraph paragraph);
|
||||
protected abstract void SaveWord(WordInfo info);
|
||||
}
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
using CarCenterBusinessLogic.OfficePackage.HelperEnums;
|
||||
using CarCenterBusinessLogic.OfficePackage.HelperModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage
|
||||
{
|
||||
public abstract class AbstractSaveToWordStorekeeper
|
||||
{
|
||||
public void CreateDoc(WordInfoStorekeeper info)
|
||||
{
|
||||
CreateWord(info);
|
||||
CreateParagraph(new WordParagraph
|
||||
{
|
||||
Texts = new List<(string, WordTextProperties)>
|
||||
{
|
||||
(info.Title, new WordTextProperties { Bold = true, Size = "24", })
|
||||
},
|
||||
TextProperties = new WordTextProperties
|
||||
{
|
||||
Size = "24",
|
||||
JustificationType = WordJustificationType.Both
|
||||
}
|
||||
});
|
||||
foreach (var report in info.carPresalesReport)
|
||||
{
|
||||
CreateNumberedParagraph(1, 0, report.VINnumber.ToString());
|
||||
foreach (var workshop in report.Presales)
|
||||
{
|
||||
CreateNumberedParagraph(1, 1, workshop);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
SaveWord(info);
|
||||
}
|
||||
protected abstract void CreateWord(WordInfoStorekeeper info);
|
||||
protected abstract void CreateParagraph(WordParagraph paragraph);
|
||||
protected abstract void CreateNumberedParagraph(int numId, int ilvl, string text);
|
||||
protected abstract void SaveWord(WordInfoStorekeeper info);
|
||||
}
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage.HelperEnums
|
||||
{
|
||||
public enum ExcelStyleInfoType
|
||||
{
|
||||
Title,
|
||||
Text,
|
||||
TextWithBorder
|
||||
}
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage.HelperEnums
|
||||
{
|
||||
public enum PdfParagraphAlignmentType
|
||||
{
|
||||
Center,
|
||||
Left,
|
||||
Right
|
||||
}
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage.HelperEnums
|
||||
{
|
||||
public enum WordJustificationType
|
||||
{
|
||||
Center,
|
||||
Both
|
||||
}
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
using CarCenterBusinessLogic.OfficePackage.HelperEnums;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage.HelperModels
|
||||
{
|
||||
public class ExcelCellParameters
|
||||
{
|
||||
public string ColumnName { get; set; } = string.Empty;
|
||||
public uint RowIndex { get; set; }
|
||||
public string Text { get; set; } = string.Empty;
|
||||
public string CellReference => $"{ColumnName}{RowIndex}";
|
||||
public ExcelStyleInfoType StyleInfo { get; set; }
|
||||
}
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage.HelperModels
|
||||
{
|
||||
public class ExcelInfo
|
||||
{
|
||||
public string FileName { get; set; } = string.Empty;
|
||||
public string Title { get; set; } = string.Empty;
|
||||
}
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
using CarCenterContracts.ViewModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage.HelperModels
|
||||
{
|
||||
public class ExcelInfoStorekeeper
|
||||
{
|
||||
public MemoryStream memoryStream { get; set; } = new MemoryStream();
|
||||
public string Title { get; set; } = string.Empty;
|
||||
public List<ReportCarViewModel> carPresalesReport { get; set; } = new();
|
||||
public int maxleng { get; set; }
|
||||
}
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage.HelperModels
|
||||
{
|
||||
public class ExcelMergeParameters
|
||||
{
|
||||
public string CellFromName { get; set; } = string.Empty;
|
||||
public string CellToName { get; set; } = string.Empty;
|
||||
public string Merge => $"{CellFromName}:{CellToName}";
|
||||
}
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage.HelperModels
|
||||
{
|
||||
public class PdfInfo
|
||||
{
|
||||
public string FileName { get; set; } = string.Empty;
|
||||
public string Title { get; set; } = string.Empty;
|
||||
public DateTime DateFrom { get; set; }
|
||||
public DateTime DateTo { get; set; }
|
||||
}
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
using CarCenterContracts.ViewModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage.HelperModels
|
||||
{
|
||||
public class PdfInfoStorekeeper
|
||||
{
|
||||
public MemoryStream FileName { get; set; } = new();
|
||||
public string Title { get; set; } = string.Empty;
|
||||
public DateTime DateFrom { get; set; }
|
||||
public DateTime DateTo { get; set; }
|
||||
public List<ReportBundlingViewModel> reportBundling { get; set; } = new();
|
||||
}
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
using CarCenterBusinessLogic.OfficePackage.HelperEnums;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage.HelperModels
|
||||
{
|
||||
public class PdfParagraph
|
||||
{
|
||||
public string Text { get; set; } = string.Empty;
|
||||
public string Style { get; set; } = string.Empty;
|
||||
public PdfParagraphAlignmentType ParagraphAlignment { get; set; }
|
||||
}
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
using CarCenterBusinessLogic.OfficePackage.HelperEnums;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage.HelperModels
|
||||
{
|
||||
public class PdfRowParameters
|
||||
{
|
||||
public List<string> Texts { get; set; } = new();
|
||||
public string Style { get; set; } = string.Empty;
|
||||
public PdfParagraphAlignmentType ParagraphAlignment { get; set; }
|
||||
}
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage.HelperModels
|
||||
{
|
||||
public class WordInfo
|
||||
{
|
||||
public string FileName { get; set; } = string.Empty;
|
||||
public string Title { get; set; } = string.Empty;
|
||||
}
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
using CarCenterContracts.ViewModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage.HelperModels
|
||||
{
|
||||
public class WordInfoStorekeeper
|
||||
{
|
||||
public MemoryStream memoryStream { get; set; } = new MemoryStream();
|
||||
public string Title { get; set; } = string.Empty;
|
||||
public List<ReportCarViewModel> carPresalesReport { get; set; } = new();
|
||||
}
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage.HelperModels
|
||||
{
|
||||
public class WordParagraph
|
||||
{
|
||||
public List<(string, WordTextProperties)> Texts { get; set; } = new();
|
||||
public WordTextProperties? TextProperties { get; set; }
|
||||
}
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
using CarCenterBusinessLogic.OfficePackage.HelperEnums;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage.HelperModels
|
||||
{
|
||||
public class WordTextProperties
|
||||
{
|
||||
public string Size { get; set; } = string.Empty;
|
||||
public bool Bold { get; set; }
|
||||
public WordJustificationType JustificationType { get; set; }
|
||||
}
|
||||
}
|
@ -1,288 +0,0 @@
|
||||
using CarCenterBusinessLogic.OfficePackage.HelperEnums;
|
||||
using CarCenterBusinessLogic.OfficePackage.HelperModels;
|
||||
using DocumentFormat.OpenXml.Office2010.Excel;
|
||||
using DocumentFormat.OpenXml.Office2013.Excel;
|
||||
using DocumentFormat.OpenXml.Packaging;
|
||||
using DocumentFormat.OpenXml.Spreadsheet;
|
||||
using DocumentFormat.OpenXml;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage.Implements
|
||||
{
|
||||
public class SaveToExcelStorekeeper : AbstractSaveToExcelStorekeeper
|
||||
{
|
||||
private SpreadsheetDocument? _spreadsheetDocument;
|
||||
|
||||
private SharedStringTablePart? _shareStringPart;
|
||||
|
||||
private Worksheet? _worksheet;
|
||||
|
||||
private static void CreateStyles(WorkbookPart workbookpart)
|
||||
{
|
||||
var sp = workbookpart.AddNewPart<WorkbookStylesPart>();
|
||||
sp.Stylesheet = new Stylesheet();
|
||||
|
||||
var fonts = new Fonts() { Count = 2U, KnownFonts = true };
|
||||
|
||||
var fontUsual = new Font();
|
||||
fontUsual.Append(new FontSize() { Val = 12D });
|
||||
fontUsual.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() { Theme = 1U });
|
||||
fontUsual.Append(new FontName() { Val = "Times New Roman" });
|
||||
fontUsual.Append(new FontFamilyNumbering() { Val = 2 });
|
||||
fontUsual.Append(new FontScheme() { Val = FontSchemeValues.Minor });
|
||||
|
||||
var fontTitle = new Font();
|
||||
fontTitle.Append(new Bold());
|
||||
fontTitle.Append(new FontSize() { Val = 14D });
|
||||
fontTitle.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() { Theme = 1U });
|
||||
fontTitle.Append(new FontName() { Val = "Times New Roman" });
|
||||
fontTitle.Append(new FontFamilyNumbering() { Val = 2 });
|
||||
fontTitle.Append(new FontScheme() { Val = FontSchemeValues.Minor });
|
||||
|
||||
fonts.Append(fontUsual);
|
||||
fonts.Append(fontTitle);
|
||||
|
||||
var fills = new Fills() { Count = 2U };
|
||||
|
||||
var fill1 = new Fill();
|
||||
fill1.Append(new PatternFill() { PatternType = PatternValues.None });
|
||||
|
||||
var fill2 = new Fill();
|
||||
fill2.Append(new PatternFill() { PatternType = PatternValues.Gray125 });
|
||||
|
||||
fills.Append(fill1);
|
||||
fills.Append(fill2);
|
||||
|
||||
var borders = new Borders() { Count = 2U };
|
||||
|
||||
var borderNoBorder = new Border();
|
||||
borderNoBorder.Append(new LeftBorder());
|
||||
borderNoBorder.Append(new RightBorder());
|
||||
borderNoBorder.Append(new TopBorder());
|
||||
borderNoBorder.Append(new BottomBorder());
|
||||
borderNoBorder.Append(new DiagonalBorder());
|
||||
|
||||
var borderThin = new Border();
|
||||
|
||||
var leftBorder = new LeftBorder() { Style = BorderStyleValues.Thin };
|
||||
leftBorder.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() { Indexed = 64U });
|
||||
|
||||
var rightBorder = new RightBorder() { Style = BorderStyleValues.Thin };
|
||||
rightBorder.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() { Indexed = 64U });
|
||||
|
||||
var topBorder = new TopBorder() { Style = BorderStyleValues.Thin };
|
||||
topBorder.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() { Indexed = 64U });
|
||||
|
||||
var bottomBorder = new BottomBorder() { Style = BorderStyleValues.Thin };
|
||||
bottomBorder.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() { Indexed = 64U });
|
||||
|
||||
borderThin.Append(leftBorder);
|
||||
borderThin.Append(rightBorder);
|
||||
borderThin.Append(topBorder);
|
||||
borderThin.Append(bottomBorder);
|
||||
borderThin.Append(new DiagonalBorder());
|
||||
|
||||
borders.Append(borderNoBorder);
|
||||
borders.Append(borderThin);
|
||||
|
||||
var cellStyleFormats = new CellStyleFormats() { Count = 1U };
|
||||
var cellFormatStyle = new CellFormat() { NumberFormatId = 0U, FontId = 0U, FillId = 0U, BorderId = 0U };
|
||||
|
||||
cellStyleFormats.Append(cellFormatStyle);
|
||||
|
||||
var cellFormats = new CellFormats() { Count = 3U };
|
||||
var cellFormatFont = new CellFormat() { NumberFormatId = 0U, FontId = 0U, FillId = 0U, BorderId = 0U, FormatId = 0U, ApplyFont = true };
|
||||
var cellFormatFontAndBorder = new CellFormat() { NumberFormatId = 0U, FontId = 0U, FillId = 0U, BorderId = 1U, FormatId = 0U, ApplyFont = true, ApplyBorder = true };
|
||||
var cellFormatTitle = new CellFormat() { NumberFormatId = 0U, FontId = 1U, FillId = 0U, BorderId = 0U, FormatId = 0U, Alignment = new Alignment() { Vertical = VerticalAlignmentValues.Center, WrapText = true, Horizontal = HorizontalAlignmentValues.Center }, ApplyFont = true };
|
||||
|
||||
cellFormats.Append(cellFormatFont);
|
||||
cellFormats.Append(cellFormatFontAndBorder);
|
||||
cellFormats.Append(cellFormatTitle);
|
||||
|
||||
var cellStyles = new CellStyles() { Count = 1U };
|
||||
|
||||
cellStyles.Append(new CellStyle() { Name = "Normal", FormatId = 0U, BuiltinId = 0U });
|
||||
|
||||
var differentialFormats = new DocumentFormat.OpenXml.Office2013.Excel.DifferentialFormats() { Count = 0U };
|
||||
|
||||
var tableStyles = new TableStyles() { Count = 0U, DefaultTableStyle = "TableStyleMedium2", DefaultPivotStyle = "PivotStyleLight16" };
|
||||
|
||||
var stylesheetExtensionList = new StylesheetExtensionList();
|
||||
|
||||
var stylesheetExtension1 = new StylesheetExtension() { Uri = "{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}" };
|
||||
stylesheetExtension1.AddNamespaceDeclaration("x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main");
|
||||
stylesheetExtension1.Append(new SlicerStyles() { DefaultSlicerStyle = "SlicerStyleLight1" });
|
||||
|
||||
var stylesheetExtension2 = new StylesheetExtension() { Uri = "{9260A510-F301-46a8-8635-F512D64BE5F5}" };
|
||||
stylesheetExtension2.AddNamespaceDeclaration("x15", "http://schemas.microsoft.com/office/spreadsheetml/2010/11/main");
|
||||
stylesheetExtension2.Append(new TimelineStyles() { DefaultTimelineStyle = "TimeSlicerStyleLight1" });
|
||||
|
||||
stylesheetExtensionList.Append(stylesheetExtension1);
|
||||
stylesheetExtensionList.Append(stylesheetExtension2);
|
||||
|
||||
sp.Stylesheet.Append(fonts);
|
||||
sp.Stylesheet.Append(fills);
|
||||
sp.Stylesheet.Append(borders);
|
||||
sp.Stylesheet.Append(cellStyleFormats);
|
||||
sp.Stylesheet.Append(cellFormats);
|
||||
sp.Stylesheet.Append(cellStyles);
|
||||
sp.Stylesheet.Append(differentialFormats);
|
||||
sp.Stylesheet.Append(tableStyles);
|
||||
sp.Stylesheet.Append(stylesheetExtensionList);
|
||||
}
|
||||
|
||||
private static uint GetStyleValue(ExcelStyleInfoType styleInfo)
|
||||
{
|
||||
return styleInfo switch
|
||||
{
|
||||
ExcelStyleInfoType.Title => 2U,
|
||||
ExcelStyleInfoType.TextWithBorder => 1U,
|
||||
ExcelStyleInfoType.Text => 0U,
|
||||
_ => 0U,
|
||||
};
|
||||
}
|
||||
|
||||
protected override void CreateExcel(ExcelInfoStorekeeper info)
|
||||
{
|
||||
_spreadsheetDocument = SpreadsheetDocument.Create(info.memoryStream, SpreadsheetDocumentType.Workbook);
|
||||
// Создаем книгу (в ней хранятся листы)
|
||||
var workbookpart = _spreadsheetDocument.AddWorkbookPart();
|
||||
workbookpart.Workbook = new Workbook();
|
||||
|
||||
CreateStyles(workbookpart);
|
||||
|
||||
// Получаем/создаем хранилище текстов для книги
|
||||
_shareStringPart = _spreadsheetDocument.WorkbookPart!.GetPartsOfType<SharedStringTablePart>().Any()
|
||||
? _spreadsheetDocument.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First()
|
||||
: _spreadsheetDocument.WorkbookPart.AddNewPart<SharedStringTablePart>();
|
||||
|
||||
// Создаем SharedStringTable, если его нет
|
||||
if (_shareStringPart.SharedStringTable == null)
|
||||
{
|
||||
_shareStringPart.SharedStringTable = new SharedStringTable();
|
||||
}
|
||||
|
||||
// Создаем лист в книгу
|
||||
var worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
|
||||
worksheetPart.Worksheet = new Worksheet(new SheetData());
|
||||
|
||||
// Добавляем лист в книгу
|
||||
var sheets = _spreadsheetDocument.WorkbookPart.Workbook.AppendChild(new Sheets());
|
||||
var sheet = new Sheet()
|
||||
{
|
||||
Id = _spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart),
|
||||
SheetId = 1,
|
||||
Name = "Лист"
|
||||
};
|
||||
sheets.Append(sheet);
|
||||
|
||||
_worksheet = worksheetPart.Worksheet;
|
||||
}
|
||||
|
||||
protected override void InsertCellInWorksheet(ExcelCellParameters excelParams)
|
||||
{
|
||||
if (_worksheet == null || _shareStringPart == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
var sheetData = _worksheet.GetFirstChild<SheetData>();
|
||||
if (sheetData == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Ищем строку, либо добавляем ее
|
||||
Row row;
|
||||
if (sheetData.Elements<Row>().Where(r => r.RowIndex! == excelParams.RowIndex).Any())
|
||||
{
|
||||
row = sheetData.Elements<Row>().Where(r => r.RowIndex! == excelParams.RowIndex).First();
|
||||
}
|
||||
else
|
||||
{
|
||||
row = new Row() { RowIndex = excelParams.RowIndex };
|
||||
sheetData.Append(row);
|
||||
}
|
||||
|
||||
// Ищем нужную ячейку
|
||||
Cell cell;
|
||||
if (row.Elements<Cell>().Where(c => c.CellReference!.Value == excelParams.CellReference).Any())
|
||||
{
|
||||
cell = row.Elements<Cell>().Where(c => c.CellReference!.Value == excelParams.CellReference).First();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Все ячейки должны быть последовательно друг за другом расположены
|
||||
// нужно определить, после какой вставлять
|
||||
Cell? refCell = null;
|
||||
foreach (Cell rowCell in row.Elements<Cell>())
|
||||
{
|
||||
if (string.Compare(rowCell.CellReference!.Value, excelParams.CellReference, true) > 0)
|
||||
{
|
||||
refCell = rowCell;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var newCell = new Cell() { CellReference = excelParams.CellReference };
|
||||
row.InsertBefore(newCell, refCell);
|
||||
|
||||
cell = newCell;
|
||||
}
|
||||
|
||||
// вставляем новый текст
|
||||
_shareStringPart.SharedStringTable.AppendChild(new SharedStringItem(new Text(excelParams.Text)));
|
||||
_shareStringPart.SharedStringTable.Save();
|
||||
|
||||
cell.CellValue = new CellValue((_shareStringPart.SharedStringTable.Elements<SharedStringItem>().Count() - 1).ToString());
|
||||
cell.DataType = new EnumValue<CellValues>(CellValues.SharedString);
|
||||
cell.StyleIndex = GetStyleValue(excelParams.StyleInfo);
|
||||
}
|
||||
|
||||
protected override void MergeCells(ExcelMergeParameters excelParams)
|
||||
{
|
||||
if (_worksheet == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
MergeCells mergeCells;
|
||||
|
||||
if (_worksheet.Elements<MergeCells>().Any())
|
||||
{
|
||||
mergeCells = _worksheet.Elements<MergeCells>().First();
|
||||
}
|
||||
else
|
||||
{
|
||||
mergeCells = new MergeCells();
|
||||
|
||||
if (_worksheet.Elements<CustomSheetView>().Any())
|
||||
{
|
||||
_worksheet.InsertAfter(mergeCells, _worksheet.Elements<CustomSheetView>().First());
|
||||
}
|
||||
else
|
||||
{
|
||||
_worksheet.InsertAfter(mergeCells, _worksheet.Elements<SheetData>().First());
|
||||
}
|
||||
}
|
||||
|
||||
var mergeCell = new MergeCell()
|
||||
{
|
||||
Reference = new StringValue(excelParams.Merge)
|
||||
};
|
||||
mergeCells.Append(mergeCell);
|
||||
}
|
||||
|
||||
protected override void SaveExcel(ExcelInfoStorekeeper info)
|
||||
{
|
||||
if (_spreadsheetDocument == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
_spreadsheetDocument.WorkbookPart!.Workbook.Save();
|
||||
_spreadsheetDocument.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,119 +0,0 @@
|
||||
using CarCenterBusinessLogic.OfficePackage.HelperEnums;
|
||||
using CarCenterBusinessLogic.OfficePackage.HelperModels;
|
||||
using MigraDoc.DocumentObjectModel;
|
||||
using MigraDoc.DocumentObjectModel.Tables;
|
||||
using MigraDoc.Rendering;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage.Implements
|
||||
{
|
||||
public class SaveToPdfStorekeeper : AbstractSaveToPdfStorekeeper
|
||||
{
|
||||
private Document? _document;
|
||||
|
||||
private Section? _section;
|
||||
|
||||
private Table? _table;
|
||||
|
||||
private static ParagraphAlignment GetParagraphAlignment(PdfParagraphAlignmentType type)
|
||||
{
|
||||
return type switch
|
||||
{
|
||||
PdfParagraphAlignmentType.Center => ParagraphAlignment.Center,
|
||||
PdfParagraphAlignmentType.Left => ParagraphAlignment.Left,
|
||||
PdfParagraphAlignmentType.Right => ParagraphAlignment.Right,
|
||||
_ => ParagraphAlignment.Justify,
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Создание стилей для документа
|
||||
/// </summary>
|
||||
/// <param name="document"></param>
|
||||
private static void DefineStyles(Document document)
|
||||
{
|
||||
var style = document.Styles["Normal"];
|
||||
style.Font.Name = "Times New Roman";
|
||||
style.Font.Size = 14;
|
||||
|
||||
style = document.Styles.AddStyle("NormalTitle", "Normal");
|
||||
style.Font.Bold = true;
|
||||
}
|
||||
|
||||
protected override void CreatePdf(PdfInfoStorekeeper info)
|
||||
{
|
||||
_document = new Document();
|
||||
DefineStyles(_document);
|
||||
|
||||
_section = _document.AddSection();
|
||||
}
|
||||
|
||||
protected override void CreateParagraph(PdfParagraph pdfParagraph)
|
||||
{
|
||||
if (_section == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
var paragraph = _section.AddParagraph(pdfParagraph.Text);
|
||||
paragraph.Format.SpaceAfter = "1cm";
|
||||
paragraph.Format.Alignment = GetParagraphAlignment(pdfParagraph.ParagraphAlignment);
|
||||
paragraph.Style = pdfParagraph.Style;
|
||||
}
|
||||
|
||||
protected override void CreateTable(List<string> columns)
|
||||
{
|
||||
if (_document == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
_table = _document.LastSection.AddTable();
|
||||
|
||||
foreach (var elem in columns)
|
||||
{
|
||||
_table.AddColumn(elem);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void CreateRow(PdfRowParameters rowParameters)
|
||||
{
|
||||
if (_table == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
var row = _table.AddRow();
|
||||
for (int i = 0; i < rowParameters.Texts.Count; ++i)
|
||||
{
|
||||
row.Cells[i].AddParagraph(rowParameters.Texts[i]);
|
||||
|
||||
if (!string.IsNullOrEmpty(rowParameters.Style))
|
||||
{
|
||||
row.Cells[i].Style = rowParameters.Style;
|
||||
}
|
||||
|
||||
Unit borderWidth = 0.5;
|
||||
|
||||
row.Cells[i].Borders.Left.Width = borderWidth;
|
||||
row.Cells[i].Borders.Right.Width = borderWidth;
|
||||
row.Cells[i].Borders.Top.Width = borderWidth;
|
||||
row.Cells[i].Borders.Bottom.Width = borderWidth;
|
||||
|
||||
row.Cells[i].Format.Alignment = GetParagraphAlignment(rowParameters.ParagraphAlignment);
|
||||
row.Cells[i].VerticalAlignment = VerticalAlignment.Center;
|
||||
}
|
||||
}
|
||||
|
||||
protected override void SavePdf(PdfInfoStorekeeper info)
|
||||
{
|
||||
var renderer = new PdfDocumentRenderer(true)
|
||||
{
|
||||
Document = _document
|
||||
};
|
||||
renderer.RenderDocument();
|
||||
renderer.PdfDocument.Save(info.FileName);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,138 +0,0 @@
|
||||
using CarCenterBusinessLogic.OfficePackage.HelperEnums;
|
||||
using CarCenterBusinessLogic.OfficePackage.HelperModels;
|
||||
using DocumentFormat.OpenXml.Packaging;
|
||||
using DocumentFormat.OpenXml.Wordprocessing;
|
||||
using DocumentFormat.OpenXml;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterBusinessLogic.OfficePackage.Implements
|
||||
{
|
||||
public class SaveToWordStorekeeper : AbstractSaveToWordStorekeeper
|
||||
{
|
||||
private WordprocessingDocument? _wordDocument;
|
||||
|
||||
private Body? _docBody;
|
||||
|
||||
private static JustificationValues GetJustificationValues(WordJustificationType type)
|
||||
{
|
||||
return type switch
|
||||
{
|
||||
WordJustificationType.Both => JustificationValues.Both,
|
||||
WordJustificationType.Center => JustificationValues.Center,
|
||||
_ => JustificationValues.Left,
|
||||
};
|
||||
}
|
||||
|
||||
private static SectionProperties CreateSectionProperties()
|
||||
{
|
||||
var properties = new SectionProperties();
|
||||
|
||||
var pageSize = new PageSize
|
||||
{
|
||||
Orient = PageOrientationValues.Portrait
|
||||
};
|
||||
|
||||
properties.AppendChild(pageSize);
|
||||
|
||||
return properties;
|
||||
}
|
||||
|
||||
private static ParagraphProperties? CreateParagraphProperties(WordTextProperties? paragraphProperties)
|
||||
{
|
||||
if (paragraphProperties == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var properties = new ParagraphProperties();
|
||||
|
||||
properties.AppendChild(new Justification()
|
||||
{
|
||||
Val = GetJustificationValues(paragraphProperties.JustificationType)
|
||||
});
|
||||
|
||||
properties.AppendChild(new SpacingBetweenLines
|
||||
{
|
||||
LineRule = LineSpacingRuleValues.Auto
|
||||
});
|
||||
|
||||
properties.AppendChild(new Indentation());
|
||||
|
||||
var paragraphMarkRunProperties = new ParagraphMarkRunProperties();
|
||||
if (!string.IsNullOrEmpty(paragraphProperties.Size))
|
||||
{
|
||||
paragraphMarkRunProperties.AppendChild(new FontSize { Val = paragraphProperties.Size });
|
||||
}
|
||||
properties.AppendChild(paragraphMarkRunProperties);
|
||||
|
||||
return properties;
|
||||
}
|
||||
|
||||
protected override void CreateWord(WordInfoStorekeeper info)
|
||||
{
|
||||
_wordDocument = WordprocessingDocument.Create(info.memoryStream, WordprocessingDocumentType.Document);
|
||||
MainDocumentPart mainPart = _wordDocument.AddMainDocumentPart();
|
||||
mainPart.Document = new Document();
|
||||
_docBody = mainPart.Document.AppendChild(new Body());
|
||||
}
|
||||
|
||||
protected override void CreateParagraph(WordParagraph paragraph)
|
||||
{
|
||||
if (_docBody == null || paragraph == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
var docParagraph = new Paragraph();
|
||||
|
||||
docParagraph.AppendChild(CreateParagraphProperties(paragraph.TextProperties));
|
||||
|
||||
foreach (var run in paragraph.Texts)
|
||||
{
|
||||
var docRun = new Run();
|
||||
|
||||
var properties = new RunProperties();
|
||||
properties.AppendChild(new FontSize { Val = run.Item2.Size });
|
||||
if (run.Item2.Bold)
|
||||
{
|
||||
properties.AppendChild(new Bold());
|
||||
}
|
||||
docRun.AppendChild(properties);
|
||||
|
||||
docRun.AppendChild(new Text { Text = run.Item1, Space = SpaceProcessingModeValues.Preserve });
|
||||
|
||||
docParagraph.AppendChild(docRun);
|
||||
}
|
||||
|
||||
_docBody.AppendChild(docParagraph);
|
||||
}
|
||||
|
||||
protected override void CreateNumberedParagraph(int numId, int ilvl, string text)
|
||||
{
|
||||
Paragraph paragraph = new Paragraph(
|
||||
new ParagraphProperties(
|
||||
new NumberingProperties(
|
||||
new NumberingLevelReference() { Val = ilvl },
|
||||
new NumberingId() { Val = numId })),
|
||||
new Run(new Text(text)));
|
||||
|
||||
_docBody!.Append(paragraph);
|
||||
}
|
||||
|
||||
protected override void SaveWord(WordInfoStorekeeper info)
|
||||
{
|
||||
if (_docBody == null || _wordDocument == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
_docBody.AppendChild(CreateSectionProperties());
|
||||
|
||||
_wordDocument.MainDocumentPart!.Document.Save();
|
||||
|
||||
_wordDocument.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
@ -16,7 +16,5 @@ namespace CarCenterContracts.BindingModels
|
||||
public ToolKit ToolKit { get; set; } = ToolKit.Неизвестно;
|
||||
public double Price { get; set; }
|
||||
public int StorekeeperId { get; set; }
|
||||
public DateTime DateCreate { get; set; }
|
||||
public Dictionary<int, IPresaleModel> BundlingsPresale { get; set; } = new();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -12,7 +12,6 @@ namespace CarCenterContracts.BindingModels
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public int StorekeeperId { get; set; }
|
||||
public int? OrderId { get; set; }
|
||||
public CarBrand CarBrand { get; set; } = CarBrand.Неизвестно;
|
||||
public string Model { get; set; } = string.Empty;
|
||||
public CarClass CarClass { get; set; } = CarClass.Неизвестно;
|
||||
@ -21,6 +20,5 @@ namespace CarCenterContracts.BindingModels
|
||||
public long VINnumber { get; set; }
|
||||
public int FeatureID { get; set; }
|
||||
public Dictionary<int, IBundlingModel> CarBundlings { get; set; } = new();
|
||||
public DateTime DateCreate { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,18 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterContracts.BindingModels
|
||||
{
|
||||
public class MailConfigModel
|
||||
{
|
||||
public string MailLogin { get; set; } = string.Empty;
|
||||
public string MailPassword { get; set; } = string.Empty;
|
||||
public string SmtpClientHost { get; set; } = string.Empty;
|
||||
public int SmtpClientPort { get; set; }
|
||||
public string PopHost { get; set; } = string.Empty;
|
||||
public int PopPort { get; set; }
|
||||
}
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CarCenterContracts.BindingModels
|
||||
{
|
||||
public class MailSendInfoModel
|
||||
{
|
||||
public string MailAddress { get; set; } = string.Empty;
|
||||
public string Subject { get; set; } = string.Empty;
|
||||
public string Text { get; set; } = string.Empty;
|
||||
public byte[] Pdf { get; set; }
|
||||
public string FileName { get; set; } = string.Empty;
|
||||
}
|
||||
}
|
@ -23,7 +23,5 @@ namespace CarCenterContracts.BindingModels
|
||||
public double Sum { get; set; }
|
||||
|
||||
public Dictionary<int, IPresaleModel> OrderPresales { get; set; } = new();
|
||||
|
||||
public Dictionary<int, ICarModel> Cars { get; set; } = new();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -11,7 +11,6 @@ namespace CarCenterContracts.BindingModels
|
||||
public class PresaleBindingModel : IPresaleModel
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public int WorkerId { get; set; }
|
||||
public PresaleStatus PresaleStatus { get; set; } = PresaleStatus.Неизвестно;
|
||||
|
||||
public string Description { get; set; } = string.Empty;
|
||||
@ -20,7 +19,5 @@ namespace CarCenterContracts.BindingModels
|
||||
|
||||
public double Price { get; set; }
|
||||
public Dictionary<int, IBundlingModel> PresaleBundlings { get; set; } = new();
|
||||
|
||||
public Dictionary<int, IRequestModel> Requests { get; set; } = new();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -11,8 +11,7 @@ namespace CarCenterContracts.BindingModels
|
||||
public class RequestBindingModel : IRequestModel
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public int WorkerId { get; set; }
|
||||
public int? PresaleId { get; set; }
|
||||
public int PresaleId { get; set; }
|
||||
public string Description { get; set; } = string.Empty;
|
||||
public RequestTypes RequestType { get; set; } = RequestTypes.Неизвестно;
|
||||
|
||||
|
@ -10,7 +10,5 @@ namespace CarCenterContracts.SearchModels
|
||||
{
|
||||
public int? Id { get; set; }
|
||||
public int? StorekeeperId { get; set; }
|
||||
public DateTime? DateFrom { get; set; }
|
||||
public DateTime? DateTo { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -10,6 +10,5 @@ namespace CarCenterContracts.SearchModels
|
||||
{
|
||||
public int? Id { get; set; }
|
||||
public int? StorekeeperId { get; set; }
|
||||
public int? BundlingId { get; set; }
|
||||
}
|
||||
}
|
||||
|
@ -10,7 +10,6 @@ namespace CarCenterContracts.SearchModels
|
||||
public class OrderSearchModel
|
||||
{
|
||||
public int? Id { get; set; }
|
||||
public int? BundlingId { get; set; }
|
||||
public int? WorkerId { get; set; }
|
||||
public List<IPresaleModel> Presales { get; set; } = new();
|
||||
public List<ICarModel> Cars { get; set; } = new();
|
||||
|
@ -9,7 +9,5 @@ namespace CarCenterContracts.SearchModels
|
||||
public class PresaleSearchModel
|
||||
{
|
||||
public int? Id { get; set; }
|
||||
public int? WorkerId { get; set; }
|
||||
public int? CarId { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,5 @@ namespace CarCenterContracts.SearchModels
|
||||
public class RequestSearchModel
|
||||
{
|
||||
public int? Id { get; set; }
|
||||
|
||||
public int? WorkerId { get; set; }
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,5 @@ namespace CarCenterContracts.SearchModels
|
||||
public class WorkerSearchModel
|
||||
{
|
||||
public int? Id { get; set; }
|
||||
public string? Email { get; set; }
|
||||
public string? Password { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -21,8 +21,5 @@ namespace CarCenterContracts.ViewModels
|
||||
public ToolKit ToolKit { get; set; }
|
||||
[DisplayName("Цена")]
|
||||
public double Price { get; set; }
|
||||
[DisplayName("Дата создания")]
|
||||
public DateTime DateCreate { get; set; }
|
||||
public Dictionary<int, IPresaleModel> BundlingsPresale { get; set; } = new();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -30,7 +30,5 @@ namespace CarCenterContracts.ViewModels
|
||||
public long VINnumber { get; set; }
|
||||
public int FeatureID { get; set; }
|
||||
public Dictionary<int, IBundlingModel> CarBundlings { get; set; } = new();
|
||||
[DisplayName("Дата создания")]
|
||||
public DateTime DateCreate { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -26,6 +26,5 @@ namespace CarCenterContracts.ViewModels
|
||||
[DisplayName("Сумма")]
|
||||
public double Sum { get; set; }
|
||||
public Dictionary<int, IPresaleModel> OrderPresales { get; set; } = new();
|
||||
public Dictionary<int, ICarModel> Cars { get; set; } = new();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -21,6 +21,5 @@ namespace CarCenterContracts.ViewModels
|
||||
[DisplayName("Цена")]
|
||||
public double Price { get; set; }
|
||||
public Dictionary<int, IBundlingModel> PresaleBundlings { get; set; } = new();
|
||||
public Dictionary<int, IRequestModel> Requests { get; set; } = new();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -9,8 +9,9 @@ namespace CarCenterContracts.ViewModels
|
||||
{
|
||||
public class ReportBundlingViewModel
|
||||
{
|
||||
public int BundlingId { get; set; }
|
||||
public List<string> Orders { get; set; } = new();
|
||||
public List<string> Features { get; set; } = new();
|
||||
public int Id { get; set; }
|
||||
//Пока не ясно что конкретно передавать в отчет, поэтому передается моделька
|
||||
public List<IOrderModel> Orders { get; set; } = new();
|
||||
public List<IFeatureModel> Features { get; set; } = new();
|
||||
}
|
||||
}
|
||||
|
@ -9,8 +9,8 @@ namespace CarCenterContracts.ViewModels
|
||||
{
|
||||
public class ReportCarViewModel
|
||||
{
|
||||
public int CarId { get; set; }
|
||||
public int VINnumber { get; set; }
|
||||
public List<string> Presales { get; set; } = new();
|
||||
public int Id { get; set; }
|
||||
//Пока не ясно что конкретно передавать в отчет, поэтому передается моделька
|
||||
public List<IPresaleModel> Presales { get; set; } = new();
|
||||
}
|
||||
}
|
||||
|
@ -12,7 +12,9 @@ namespace CarCenterContracts.ViewModels
|
||||
public class RequestViewModel : IRequestModel
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public int? PresaleId { get; set; }
|
||||
public int PresaleId { get; set; }
|
||||
[DisplayName("Описание работы")]
|
||||
public string PresaleDescription { get; set; } = string.Empty;
|
||||
[DisplayName("Описание пожелания")]
|
||||
public string Description { get; set; } = string.Empty;
|
||||
[DisplayName("Тип пожелания")]
|
||||
|
@ -13,6 +13,5 @@ namespace CarCenterDataModels.Models
|
||||
TirePackage TirePackage { get; }
|
||||
ToolKit ToolKit { get; }
|
||||
double Price { get; }
|
||||
DateTime DateCreate { get; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -17,6 +17,5 @@ namespace CarCenterDataModels.Models
|
||||
long VINnumber { get; }
|
||||
int FeatureID { get; }
|
||||
Dictionary<int, IBundlingModel> CarBundlings { get; }
|
||||
public DateTime DateCreate { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -22,15 +22,15 @@ namespace CarCenterDatabaseImplement.Implements
|
||||
}
|
||||
public List<BundlingViewModel> GetFilteredList(BundlingSearchModel model)
|
||||
{
|
||||
if (!model.StorekeeperId.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue)
|
||||
{
|
||||
return new();
|
||||
}
|
||||
using var context = new CarCenterDatabase();
|
||||
if (model.DateFrom.HasValue)
|
||||
return context.Bundlings.Where(x => x.StorekeeperId == model.StorekeeperId).Where(x => x.DateCreate <= model.DateTo && x.DateCreate >= model.DateFrom).Select(x => x.GetViewModel).ToList();
|
||||
else
|
||||
return context.Bundlings.Where(x => x.StorekeeperId == model.StorekeeperId).Select(x => x.GetViewModel).ToList();
|
||||
using var context = new CarCenterDatabase();
|
||||
if (model.StorekeeperId.HasValue)
|
||||
{
|
||||
return context.Bundlings
|
||||
.Where(x => x.StorekeeperId == model.StorekeeperId)
|
||||
.Select(x => x.GetViewModel)
|
||||
.ToList();
|
||||
}
|
||||
return new();
|
||||
}
|
||||
public BundlingViewModel? GetElement(BundlingSearchModel model)
|
||||
{
|
||||
|
@ -29,14 +29,19 @@ namespace CarCenterDatabaseImplement.Implements
|
||||
public List<CarViewModel> GetFilteredList(CarSearchModel model)
|
||||
{
|
||||
using var context = new CarCenterDatabase();
|
||||
if (model.DateFrom.HasValue) // Для отчета списка
|
||||
if (model.DateFrom.HasValue && model.DateTo.HasValue) // Для отчета списка
|
||||
{
|
||||
//будет применятся в ReportLogic
|
||||
return context.Cars
|
||||
.Where(x => x.StorekeeperId == model.StorekeeperId)
|
||||
.Where(x => x.DateCreate <= model.DateTo && x.DateCreate >= model.DateFrom)
|
||||
.Select(x => x.GetViewModel)
|
||||
.ToList();
|
||||
.Where(x => x.StorekeeperId == model.StorekeeperId)
|
||||
.Include(x => x.Bundlings)
|
||||
.ThenInclude(x => x.Bundling)
|
||||
.Include(x => x.Feature)
|
||||
.Include(x => x.Order)
|
||||
.Include(x => x.Storekeeper)
|
||||
.Where(x => x.Order.PaymentDate >= model.DateFrom && x.Order.PaymentDate <= model.DateTo)
|
||||
.Select(x => x.GetViewModel)
|
||||
.ToList();
|
||||
}
|
||||
else if (model.StorekeeperId.HasValue)
|
||||
{
|
||||
|
@ -99,7 +99,7 @@ namespace CarCenterDatabaseImplement.Implements
|
||||
.Select(x => x.GetViewModel)
|
||||
.ToList();
|
||||
}
|
||||
else if (model.WorkerId.HasValue)
|
||||
else if (model.Id.HasValue)
|
||||
{
|
||||
return context.Orders
|
||||
.Where(x => x.WorkerId == model.WorkerId)
|
||||
@ -107,6 +107,7 @@ namespace CarCenterDatabaseImplement.Implements
|
||||
.Include(x => x.Cars)
|
||||
.Include(x => x.Presales)
|
||||
.ThenInclude(x => x.Presale)
|
||||
.Where(x => x.Id == model.Id)
|
||||
.Select(x => x.GetViewModel)
|
||||
.ToList();
|
||||
}
|
||||
|
@ -24,8 +24,7 @@ namespace CarCenterDatabaseImplement.Implements
|
||||
var deletedElement = context.Presales
|
||||
.Include(x => x.Bundlings)
|
||||
.ThenInclude(x => x.Bundling)
|
||||
.Include(x => x.Requests)
|
||||
.FirstOrDefault(x => x.Id == model.Id)
|
||||
.FirstOrDefault(x => x.Id == model.Id)
|
||||
?.GetViewModel;
|
||||
context.Presales.Remove(element);
|
||||
context.SaveChanges();
|
||||
@ -44,21 +43,19 @@ namespace CarCenterDatabaseImplement.Implements
|
||||
return context.Presales
|
||||
.Include(x => x.Bundlings)
|
||||
.ThenInclude(x => x.Bundling)
|
||||
.Include(x => x.Requests)
|
||||
.FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id)
|
||||
.FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id)
|
||||
?.GetViewModel;
|
||||
}
|
||||
|
||||
public List<PresaleViewModel> GetFilteredList(PresaleSearchModel model)
|
||||
{
|
||||
using var context = new CarCenterDatabase();
|
||||
if (model.WorkerId.HasValue)
|
||||
if (model.Id.HasValue)
|
||||
{
|
||||
return context.Presales
|
||||
.Include(x => x.Bundlings)
|
||||
.ThenInclude(x => x.Bundling)
|
||||
.Include(x => x.Requests)
|
||||
.Where(x => x.WorkerId == model.WorkerId)
|
||||
.Where(x => x.Id == model.Id)
|
||||
.Select(x => x.GetViewModel)
|
||||
.ToList();
|
||||
}
|
||||
@ -71,8 +68,7 @@ namespace CarCenterDatabaseImplement.Implements
|
||||
return context.Presales
|
||||
.Include(x => x.Bundlings)
|
||||
.ThenInclude(x => x.Bundling)
|
||||
.Include(x => x.Requests)
|
||||
.Select(x => x.GetViewModel)
|
||||
.Select(x => x.GetViewModel)
|
||||
.ToList();
|
||||
}
|
||||
|
||||
@ -89,8 +85,7 @@ namespace CarCenterDatabaseImplement.Implements
|
||||
return context.Presales
|
||||
.Include(x => x.Bundlings)
|
||||
.ThenInclude(x => x.Bundling)
|
||||
.Include(x => x.Requests)
|
||||
.FirstOrDefault(x => x.Id == newPresale.Id)
|
||||
.FirstOrDefault(x => x.Id == newPresale.Id)
|
||||
?.GetViewModel;
|
||||
}
|
||||
|
||||
@ -103,14 +98,11 @@ namespace CarCenterDatabaseImplement.Implements
|
||||
return null;
|
||||
}
|
||||
order.Update(model);
|
||||
order.UpdateBundlings(context, model);
|
||||
order.UpdateBundlings(context, model);
|
||||
context.SaveChanges();
|
||||
return context.Presales
|
||||
.Include(x => x.Bundlings)
|
||||
.ThenInclude(x => x.Bundling)
|
||||
.Include(x => x.Requests)
|
||||
.FirstOrDefault(x => x.Id == model.Id)
|
||||
.FirstOrDefault(x => x.Id == model.Id)
|
||||
?.GetViewModel;
|
||||
}
|
||||
}
|
||||
|
@ -56,14 +56,6 @@ namespace CarCenterDatabaseImplement.Implements
|
||||
.Select(x => x.GetViewModel)
|
||||
.ToList();
|
||||
}
|
||||
else if (model.WorkerId.HasValue)
|
||||
{
|
||||
return context.Requests
|
||||
.Include(x => x.Presale)
|
||||
.Where(x => x.WorkerId == model.WorkerId)
|
||||
.Select(x => x.GetViewModel)
|
||||
.ToList();
|
||||
}
|
||||
return new();
|
||||
}
|
||||
|
||||
|
@ -42,9 +42,12 @@ namespace CarCenterDatabaseImplement.Implements
|
||||
public WorkerViewModel? GetElement(WorkerSearchModel model)
|
||||
{
|
||||
using var context = new CarCenterDatabase();
|
||||
if (!model.Id.HasValue && string.IsNullOrEmpty(model.Email)) { return null; }
|
||||
return context.Workers.FirstOrDefault(x => (model.Id.HasValue && x.Id == model.Id)
|
||||
|| (!string.IsNullOrEmpty(model.Email) && !string.IsNullOrEmpty(model.Password) && x.Email.Equals(model.Email) && x.Password.Equals(model.Password)))?.GetViewModel;
|
||||
|
||||
if (model.Id.HasValue)
|
||||
return context.Workers
|
||||
.FirstOrDefault(x => x.Id == model.Id)
|
||||
?.GetViewModel;
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
@ -12,8 +12,8 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
namespace CarCenterDatabaseImplement.Migrations
|
||||
{
|
||||
[DbContext(typeof(CarCenterDatabase))]
|
||||
[Migration("20240529170508_predFin2")]
|
||||
partial class predFin2
|
||||
[Migration("20240528175849_Initia8")]
|
||||
partial class Initia8
|
||||
{
|
||||
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||
{
|
||||
@ -32,9 +32,6 @@ namespace CarCenterDatabaseImplement.Migrations
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<DateTime>("DateCreate")
|
||||
.HasColumnType("timestamp without time zone");
|
||||
|
||||
b.Property<int>("EquipmentPackage")
|
||||
.HasColumnType("integer");
|
||||
|
||||
@ -69,9 +66,6 @@ namespace CarCenterDatabaseImplement.Migrations
|
||||
b.Property<int>("CarClass")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<DateTime>("DateCreate")
|
||||
.HasColumnType("timestamp without time zone");
|
||||
|
||||
b.Property<int>("FeatureID")
|
||||
.HasColumnType("integer");
|
||||
|
||||
@ -238,9 +232,6 @@ namespace CarCenterDatabaseImplement.Migrations
|
||||
b.Property<double>("Price")
|
||||
.HasColumnType("double precision");
|
||||
|
||||
b.Property<int>("WorkerId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.ToTable("Presales");
|
||||
@ -281,15 +272,12 @@ namespace CarCenterDatabaseImplement.Migrations
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<int?>("PresaleId")
|
||||
b.Property<int>("PresaleId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("RequestType")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("WorkerId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("PresaleId");
|
||||
@ -462,7 +450,9 @@ namespace CarCenterDatabaseImplement.Migrations
|
||||
{
|
||||
b.HasOne("CarCenterDatabaseImplement.Models.Presale", "Presale")
|
||||
.WithMany("Requests")
|
||||
.HasForeignKey("PresaleId");
|
||||
.HasForeignKey("PresaleId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Presale");
|
||||
});
|
@ -6,7 +6,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
|
||||
namespace CarCenterDatabaseImplement.Migrations
|
||||
{
|
||||
public partial class predFin2 : Migration
|
||||
public partial class Initia8 : Migration
|
||||
{
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
@ -16,7 +16,6 @@ namespace CarCenterDatabaseImplement.Migrations
|
||||
{
|
||||
Id = table.Column<int>(type: "integer", nullable: false)
|
||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||
DateCreate = table.Column<DateTime>(type: "timestamp without time zone", nullable: false),
|
||||
StorekeeperId = table.Column<int>(type: "integer", nullable: false),
|
||||
EquipmentPackage = table.Column<int>(type: "integer", nullable: false),
|
||||
TirePackage = table.Column<int>(type: "integer", nullable: false),
|
||||
@ -51,7 +50,6 @@ namespace CarCenterDatabaseImplement.Migrations
|
||||
{
|
||||
Id = table.Column<int>(type: "integer", nullable: false)
|
||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||
WorkerId = table.Column<int>(type: "integer", nullable: false),
|
||||
PresaleStatus = table.Column<int>(type: "integer", nullable: false),
|
||||
Description = table.Column<string>(type: "text", nullable: false),
|
||||
DueTill = table.Column<DateTime>(type: "timestamp without time zone", nullable: false),
|
||||
@ -130,8 +128,7 @@ namespace CarCenterDatabaseImplement.Migrations
|
||||
{
|
||||
Id = table.Column<int>(type: "integer", nullable: false)
|
||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||
WorkerId = table.Column<int>(type: "integer", nullable: false),
|
||||
PresaleId = table.Column<int>(type: "integer", nullable: true),
|
||||
PresaleId = table.Column<int>(type: "integer", nullable: false),
|
||||
Description = table.Column<string>(type: "text", nullable: false),
|
||||
RequestType = table.Column<int>(type: "integer", nullable: false)
|
||||
},
|
||||
@ -142,7 +139,8 @@ namespace CarCenterDatabaseImplement.Migrations
|
||||
name: "FK_Requests_Presales_PresaleId",
|
||||
column: x => x.PresaleId,
|
||||
principalTable: "Presales",
|
||||
principalColumn: "Id");
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
@ -176,7 +174,6 @@ namespace CarCenterDatabaseImplement.Migrations
|
||||
Id = table.Column<int>(type: "integer", nullable: false)
|
||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||
StorekeeperId = table.Column<int>(type: "integer", nullable: false),
|
||||
OrderId = table.Column<int>(type: "integer", nullable: true),
|
||||
FeatureId = table.Column<int>(type: "integer", nullable: true),
|
||||
CarBrand = table.Column<int>(type: "integer", nullable: false),
|
||||
Model = table.Column<string>(type: "text", nullable: false),
|
||||
@ -184,8 +181,8 @@ namespace CarCenterDatabaseImplement.Migrations
|
||||
Year = table.Column<int>(type: "integer", nullable: false),
|
||||
Price = table.Column<double>(type: "double precision", nullable: false),
|
||||
VINnumber = table.Column<long>(type: "bigint", nullable: false),
|
||||
DateCreate = table.Column<DateTime>(type: "timestamp without time zone", nullable: false),
|
||||
FeatureID = table.Column<int>(type: "integer", nullable: false)
|
||||
FeatureID = table.Column<int>(type: "integer", nullable: false),
|
||||
OrderId = table.Column<int>(type: "integer", nullable: true)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
@ -30,9 +30,6 @@ namespace CarCenterDatabaseImplement.Migrations
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<DateTime>("DateCreate")
|
||||
.HasColumnType("timestamp without time zone");
|
||||
|
||||
b.Property<int>("EquipmentPackage")
|
||||
.HasColumnType("integer");
|
||||
|
||||
@ -67,9 +64,6 @@ namespace CarCenterDatabaseImplement.Migrations
|
||||
b.Property<int>("CarClass")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<DateTime>("DateCreate")
|
||||
.HasColumnType("timestamp without time zone");
|
||||
|
||||
b.Property<int>("FeatureID")
|
||||
.HasColumnType("integer");
|
||||
|
||||
@ -236,9 +230,6 @@ namespace CarCenterDatabaseImplement.Migrations
|
||||
b.Property<double>("Price")
|
||||
.HasColumnType("double precision");
|
||||
|
||||
b.Property<int>("WorkerId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.ToTable("Presales");
|
||||
@ -279,15 +270,12 @@ namespace CarCenterDatabaseImplement.Migrations
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<int?>("PresaleId")
|
||||
b.Property<int>("PresaleId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("RequestType")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("WorkerId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("PresaleId");
|
||||
@ -460,7 +448,9 @@ namespace CarCenterDatabaseImplement.Migrations
|
||||
{
|
||||
b.HasOne("CarCenterDatabaseImplement.Models.Presale", "Presale")
|
||||
.WithMany("Requests")
|
||||
.HasForeignKey("PresaleId");
|
||||
.HasForeignKey("PresaleId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Presale");
|
||||
});
|
||||
|
@ -16,8 +16,6 @@ namespace CarCenterDatabaseImplement.Models
|
||||
public class Bundling : IBundlingModel
|
||||
{
|
||||
public int Id { get; private set; }
|
||||
[Required]
|
||||
public DateTime DateCreate { get; set; } = DateTime.Now;
|
||||
public int StorekeeperId { get; set; }
|
||||
[Required]
|
||||
public EquipmentPackage EquipmentPackage { get; set; } = EquipmentPackage.Неизвестно;
|
||||
@ -44,8 +42,7 @@ namespace CarCenterDatabaseImplement.Models
|
||||
EquipmentPackage = model.EquipmentPackage,
|
||||
TirePackage = model.TirePackage,
|
||||
ToolKit = model.ToolKit,
|
||||
Price = model.Price,
|
||||
DateCreate = model.DateCreate,
|
||||
Price = model.Price,
|
||||
};
|
||||
}
|
||||
public static Bundling Create(BundlingViewModel model)
|
||||
@ -58,7 +55,6 @@ namespace CarCenterDatabaseImplement.Models
|
||||
TirePackage = model.TirePackage,
|
||||
ToolKit = model.ToolKit,
|
||||
Price = model.Price,
|
||||
DateCreate = model.DateCreate,
|
||||
};
|
||||
}
|
||||
public void Update(BundlingBindingModel model)
|
||||
@ -67,7 +63,6 @@ namespace CarCenterDatabaseImplement.Models
|
||||
{
|
||||
return;
|
||||
}
|
||||
DateCreate = model.DateCreate;
|
||||
StorekeeperId = model.StorekeeperId;
|
||||
EquipmentPackage = model.EquipmentPackage;
|
||||
TirePackage = model.TirePackage;
|
||||
@ -81,8 +76,7 @@ namespace CarCenterDatabaseImplement.Models
|
||||
EquipmentPackage = EquipmentPackage,
|
||||
TirePackage = TirePackage,
|
||||
ToolKit = ToolKit,
|
||||
Price = Price,
|
||||
DateCreate = DateCreate,
|
||||
Price = Price,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -17,7 +17,6 @@ namespace CarCenterDatabaseImplement.Models
|
||||
{
|
||||
public int Id { get; private set; }
|
||||
public int StorekeeperId { get; set; }
|
||||
public int? OrderId { get; set; }
|
||||
public int? FeatureId { get; set; }
|
||||
[Required]
|
||||
public CarBrand CarBrand { get; set; } = CarBrand.Неизвестно;
|
||||
@ -31,9 +30,7 @@ namespace CarCenterDatabaseImplement.Models
|
||||
public double Price { get; set; }
|
||||
[Required]
|
||||
public long VINnumber { get; set; }
|
||||
[Required]
|
||||
public DateTime DateCreate { get; set; } = DateTime.Now;
|
||||
[Required]
|
||||
[Required]
|
||||
public int FeatureID { get; set; }
|
||||
public virtual Storekeeper Storekeeper { get; set; }
|
||||
public virtual Feature Feature { get; set; }
|
||||
@ -65,7 +62,6 @@ namespace CarCenterDatabaseImplement.Models
|
||||
Id = model.Id,
|
||||
StorekeeperId = model.StorekeeperId,
|
||||
FeatureId = model.FeatureID,
|
||||
OrderId = model.OrderId,
|
||||
CarBrand = model.CarBrand,
|
||||
Model = model.Model,
|
||||
CarClass = model.CarClass,
|
||||
@ -73,9 +69,7 @@ namespace CarCenterDatabaseImplement.Models
|
||||
Price = model.Price,
|
||||
VINnumber = model.VINnumber,
|
||||
FeatureID = model.FeatureID,
|
||||
DateCreate = model.DateCreate,
|
||||
|
||||
Bundlings = model.CarBundlings.Select(x => new CarBundling
|
||||
Bundlings = model.CarBundlings.Select(x => new CarBundling
|
||||
{
|
||||
Bundling = context.Bundlings.First(y => y.Id == x.Key)
|
||||
}).ToList()
|
||||
@ -105,13 +99,11 @@ namespace CarCenterDatabaseImplement.Models
|
||||
}
|
||||
StorekeeperId = model.StorekeeperId;
|
||||
FeatureId = model.FeatureID;
|
||||
OrderId = model.OrderId;
|
||||
CarBrand = model.CarBrand;
|
||||
Model = model.Model;
|
||||
CarClass = model.CarClass;
|
||||
Year = model.Year;
|
||||
Price = model.Price;
|
||||
DateCreate = model.DateCreate;
|
||||
VINnumber = model.VINnumber;
|
||||
FeatureID = model.FeatureID;
|
||||
}
|
||||
@ -119,7 +111,6 @@ namespace CarCenterDatabaseImplement.Models
|
||||
{
|
||||
Id = Id,
|
||||
StorekeeperId = StorekeeperId,
|
||||
OrderId = OrderId,
|
||||
BuyerFCS = Order?.BuyerFCS ?? string.Empty,
|
||||
CarBrand = CarBrand,
|
||||
Model = Model,
|
||||
@ -129,7 +120,6 @@ namespace CarCenterDatabaseImplement.Models
|
||||
VINnumber = VINnumber,
|
||||
FeatureID = FeatureID,
|
||||
CarBundlings = CarBundlings,
|
||||
DateCreate = DateCreate,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -49,7 +49,7 @@ namespace CarCenterDatabaseImplement.Models
|
||||
{
|
||||
return null;
|
||||
}
|
||||
var order = new Order()
|
||||
return new Order()
|
||||
{
|
||||
Id = model.Id,
|
||||
WorkerId = model.WorkerId,
|
||||
@ -60,20 +60,9 @@ namespace CarCenterDatabaseImplement.Models
|
||||
Sum = model.Sum,
|
||||
Presales = model.OrderPresales.Select(x => new OrderPresale
|
||||
{
|
||||
Presale = context.Presales.First(y => y.Id == x.Value.Id)
|
||||
Presale = context.Presales.First(y => y.Id == x.Key)
|
||||
}).ToList()
|
||||
};
|
||||
|
||||
foreach (var car in model.Cars)
|
||||
{
|
||||
var cartmp = context.Cars.FirstOrDefault(x => x.Id == car.Value.Id);
|
||||
if (cartmp != null)
|
||||
{
|
||||
order.Cars.Add(cartmp);
|
||||
}
|
||||
}
|
||||
|
||||
return order;
|
||||
}
|
||||
|
||||
public void Update(OrderBindingModel? model)
|
||||
@ -112,8 +101,7 @@ namespace CarCenterDatabaseImplement.Models
|
||||
BuyerFCS = BuyerFCS,
|
||||
PaymentDate = PaymentDate,
|
||||
Sum = Sum,
|
||||
OrderPresales = OrderPresales,
|
||||
Cars = Cars.ToDictionary(x => x.Id, x => x as ICarModel),
|
||||
};
|
||||
OrderPresales = OrderPresales
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -15,7 +15,6 @@ namespace CarCenterDatabaseImplement.Models
|
||||
public class Presale : IPresaleModel
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public int WorkerId { get; set; }
|
||||
[Required]
|
||||
public PresaleStatus PresaleStatus { get; set; } = PresaleStatus.Неизвестно;
|
||||
[Required]
|
||||
@ -25,7 +24,7 @@ namespace CarCenterDatabaseImplement.Models
|
||||
[Required]
|
||||
public double Price { get; set; }
|
||||
[ForeignKey("PresaleId")]
|
||||
public virtual List<Request>? Requests { get; set; } = new();
|
||||
public virtual List<Request> Requests { get; set; } = new();
|
||||
[ForeignKey("PresaleId")]
|
||||
public virtual List<OrderPresale> OrderPresales { get; set; } = new();
|
||||
|
||||
@ -49,60 +48,36 @@ namespace CarCenterDatabaseImplement.Models
|
||||
{
|
||||
return null;
|
||||
}
|
||||
var presale = new Presale()
|
||||
return new Presale()
|
||||
{
|
||||
Id = model.Id,
|
||||
PresaleStatus = model.PresaleStatus,
|
||||
Description = model.Description,
|
||||
Price = model.Price,
|
||||
DueTill = model.DueTill,
|
||||
WorkerId = model.WorkerId,
|
||||
Bundlings = model.PresaleBundlings.Select(x => new PresaleBundling
|
||||
{
|
||||
Bundling = context.Bundlings.First(y => y.Id == x.Value.Id)
|
||||
Bundling = context.Bundlings.First(y => y.Id == x.Key)
|
||||
}).ToList()
|
||||
};
|
||||
|
||||
foreach (var request in model.Requests)
|
||||
{
|
||||
var requesttmp = context.Requests.FirstOrDefault(x => x.Id == request.Value.Id);
|
||||
if (requesttmp != null)
|
||||
{
|
||||
presale.Requests.Add(requesttmp);
|
||||
}
|
||||
}
|
||||
|
||||
return presale;
|
||||
}
|
||||
|
||||
public void UpdateBundlings(CarCenterDatabase context, PresaleBindingModel model)
|
||||
{
|
||||
var presale = context.Presales.First(x => x.Id == Id);
|
||||
foreach (var request in model.Requests)
|
||||
{
|
||||
var requesttmp = context.Requests.FirstOrDefault(x => x.Id == request.Value.Id);
|
||||
if (requesttmp != null)
|
||||
{
|
||||
presale.Requests.Add(requesttmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach (var pc in model.PresaleBundlings)
|
||||
{
|
||||
context.PresaleBundlings.Add(new PresaleBundling
|
||||
{
|
||||
Presale = presale,
|
||||
Bundling = context.Bundlings.First(x => x.Id == pc.Key),
|
||||
});
|
||||
context.SaveChanges();
|
||||
}
|
||||
_presaleBundlings = null;
|
||||
}
|
||||
|
||||
public void UpdateRequests(CarCenterDatabase context, PresaleBindingModel model)
|
||||
{
|
||||
var presale = context.Presales.First(x => x.Id == Id);
|
||||
foreach (var pc in model.PresaleBundlings)
|
||||
{
|
||||
context.PresaleBundlings.Add(new PresaleBundling
|
||||
{
|
||||
Presale = presale,
|
||||
Bundling = context.Bundlings.First(x => x.Id == pc.Value.Id),
|
||||
});
|
||||
context.SaveChanges();
|
||||
}
|
||||
_presaleBundlings = null;
|
||||
}
|
||||
public void Update(PresaleBindingModel? model)
|
||||
public void Update(PresaleBindingModel? model)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
@ -112,8 +87,7 @@ namespace CarCenterDatabaseImplement.Models
|
||||
Price = model.Price;
|
||||
DueTill = model.DueTill;
|
||||
PresaleStatus = model.PresaleStatus;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public PresaleViewModel GetViewModel => new()
|
||||
{
|
||||
@ -123,7 +97,6 @@ namespace CarCenterDatabaseImplement.Models
|
||||
DueTill = DueTill,
|
||||
Price = Price,
|
||||
PresaleBundlings = PresaleBundlings,
|
||||
Requests = Requests.ToDictionary(x => x.Id, x => x as IRequestModel),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -14,13 +14,12 @@ namespace CarCenterDatabaseImplement.Models
|
||||
public class Request : IRequestModel
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public int WorkerId { get; set; }
|
||||
public int? PresaleId { get; set; }
|
||||
public int PresaleId { get; set; }
|
||||
[Required]
|
||||
public string Description { get; set; } = string.Empty;
|
||||
[Required]
|
||||
public RequestTypes RequestType { get; set; } = RequestTypes.Неизвестно;
|
||||
public virtual Presale? Presale { get; set; }
|
||||
public virtual Presale Presale { get; set; }
|
||||
|
||||
public static Request? Create(RequestBindingModel? model)
|
||||
{
|
||||
@ -34,7 +33,6 @@ namespace CarCenterDatabaseImplement.Models
|
||||
PresaleId = model.PresaleId,
|
||||
Description = model.Description,
|
||||
RequestType = model.RequestType,
|
||||
WorkerId = model.WorkerId,
|
||||
};
|
||||
}
|
||||
|
||||
@ -55,6 +53,7 @@ namespace CarCenterDatabaseImplement.Models
|
||||
Description = Description,
|
||||
RequestType = RequestType,
|
||||
PresaleId = PresaleId,
|
||||
PresaleDescription = Presale?.Description ?? string.Empty,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -16,10 +16,4 @@
|
||||
<Folder Include="wwwroot\Images\" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="6.0.26" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore" Version="8.0.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
@ -3,11 +3,12 @@ using CarCenterContracts.ViewModels;
|
||||
using CarCenterStorekeeperApp.Models;
|
||||
using StorekeeperApp;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using StorekeeperApp;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Numerics;
|
||||
using ImplementerApp;
|
||||
using CarCenterDataModels.Enums;
|
||||
using CarCenterDatabaseImplement.Models;
|
||||
|
||||
namespace CarCenterStorekeeperApp.Controllers
|
||||
{
|
||||
@ -94,8 +95,6 @@ namespace CarCenterStorekeeperApp.Controllers
|
||||
[HttpGet]
|
||||
public IActionResult CreateBundling(int id)
|
||||
{
|
||||
var presales = _data.GetPresales();
|
||||
ViewBag.AllPresales = presales;
|
||||
if (id != 0)
|
||||
{
|
||||
var value = _data.GetBundling(id);
|
||||
@ -105,28 +104,16 @@ namespace CarCenterStorekeeperApp.Controllers
|
||||
return View(new BundlingViewModel());
|
||||
}
|
||||
[HttpPost]
|
||||
public IActionResult CreateBundling(BundlingBindingModel model, int[] presaleIds)
|
||||
public IActionResult CreateBundling(BundlingBindingModel model)
|
||||
{
|
||||
var presales = _data.GetPresales();
|
||||
if (model.Id == 0)
|
||||
if (model.Id == 0)
|
||||
{
|
||||
model.DateCreate = DateTime.Now;
|
||||
model.StorekeeperId = UserStorekeeper.user!.Id;
|
||||
for (int i = 0; i < presaleIds.Length; i++)
|
||||
{
|
||||
var presale = presales!.FirstOrDefault(x => x.Id == presaleIds[i])!;
|
||||
model.BundlingsPresale.Add(i, presale);
|
||||
}
|
||||
if (_data.CreateBundling(model))
|
||||
model.StorekeeperId = UserStorekeeper.user!.Id;
|
||||
if (_data.CreateBundling(model))
|
||||
return RedirectToAction("IndexBundling");
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < presaleIds.Length; i++)
|
||||
{
|
||||
var presale = presales!.FirstOrDefault(x => x.Id == presaleIds[i])!;
|
||||
model.BundlingsPresale.Add(i, presale);
|
||||
}
|
||||
model.StorekeeperId = UserStorekeeper.user!.Id;
|
||||
if (_data.UpdateBundling(model))
|
||||
return RedirectToAction("IndexBundling");
|
||||
@ -224,8 +211,7 @@ namespace CarCenterStorekeeperApp.Controllers
|
||||
model.CarBrand = CarBrand;
|
||||
model.CarClass = CarClass;
|
||||
model.FeatureID = FeatureId;
|
||||
model.DateCreate = DateTime.Now;
|
||||
model.Model = Model;
|
||||
model.Model = Model;
|
||||
model.StorekeeperId = UserStorekeeper.user!.Id;
|
||||
var bundlings = _data.GetBundlings(UserStorekeeper.user!.Id);
|
||||
double sum = 0;
|
||||
@ -288,138 +274,8 @@ namespace CarCenterStorekeeperApp.Controllers
|
||||
}
|
||||
return View(user);
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult BundlingTimeChoose()
|
||||
{
|
||||
if (!IsLoggedIn)
|
||||
return RedirectToAction("IndexNonReg");
|
||||
return View();
|
||||
}
|
||||
[HttpPost]
|
||||
public IActionResult SendReport(DateTime startDate, DateTime endDate)
|
||||
{
|
||||
|
||||
return Ok();
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult BundlingTimeReport()
|
||||
{
|
||||
var startDateStr = HttpContext.Session.GetString("StartDate");
|
||||
var endDateStr = HttpContext.Session.GetString("EndDate");
|
||||
|
||||
if (string.IsNullOrEmpty(startDateStr) || string.IsNullOrEmpty(endDateStr))
|
||||
{
|
||||
return RedirectToAction("BundlingTimeChoose");
|
||||
}
|
||||
|
||||
var startDate = DateTime.Parse(startDateStr);
|
||||
var endDate = DateTime.Parse(endDateStr).AddDays(1);
|
||||
|
||||
var values = _data.GetTimeReport(startDate, endDate, UserId);
|
||||
|
||||
ViewBag.StartDate = startDate;
|
||||
ViewBag.EndDate = endDate;
|
||||
|
||||
return View(values);
|
||||
}
|
||||
[HttpPost]
|
||||
public IActionResult TimeReportWeb(DateTime startDate, DateTime endDate)
|
||||
{
|
||||
if (!IsLoggedIn)
|
||||
return RedirectToAction("IndexNonReg");
|
||||
|
||||
HttpContext.Session.SetString("StartDate", startDate.ToString("yyyy-MM-dd"));
|
||||
HttpContext.Session.SetString("EndDate", endDate.ToString("yyyy-MM-dd"));
|
||||
|
||||
return RedirectToAction("BundlingTimeReport");
|
||||
}
|
||||
[HttpPost]
|
||||
public void BundlingTimeMail()
|
||||
{
|
||||
var startDateStr = HttpContext.Session.GetString("StartDate");
|
||||
var endDateStr = HttpContext.Session.GetString("EndDate");
|
||||
var startDate = DateTime.Parse(startDateStr);
|
||||
var endDate = DateTime.Parse(endDateStr).AddDays(1);
|
||||
using (MemoryStream memoryStream = new MemoryStream())
|
||||
{
|
||||
_data.SendMailReport(startDate, endDate, UserId, memoryStream);
|
||||
}
|
||||
Response.Redirect("BundlingTimeReport");
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult CarPresaleChoose()
|
||||
{
|
||||
if (!IsLoggedIn)
|
||||
return RedirectToAction("IndexNonReg");
|
||||
var details = _data.GetCars(UserId);
|
||||
return View(details);
|
||||
}
|
||||
[HttpPost]
|
||||
public IActionResult CarPresaleChoose(List<int> selectedItems, string reportType)
|
||||
{
|
||||
string value = string.Join("/", selectedItems);
|
||||
HttpContext.Session.SetString("Cars", value);
|
||||
if (reportType.Equals("default"))
|
||||
return RedirectToAction("CarPresaleReport");
|
||||
else if (reportType.Equals("excel"))
|
||||
return RedirectToAction("ExcelGenerate");
|
||||
else
|
||||
return RedirectToAction("WordGenerate");
|
||||
}
|
||||
public async Task<IActionResult> ExcelGenerate()
|
||||
{
|
||||
var value = HttpContext.Session.GetString("Cars");
|
||||
if (value != null)
|
||||
{
|
||||
List<int> rawReports = value!.Split('/').Select(x => int.Parse(x)).ToList();
|
||||
using (MemoryStream memoryStream = new MemoryStream())
|
||||
{
|
||||
_data.SaveReportExcel(rawReports, memoryStream);
|
||||
memoryStream.Seek(0, SeekOrigin.Begin);
|
||||
var outputStream = new MemoryStream();
|
||||
await memoryStream.CopyToAsync(outputStream);
|
||||
outputStream.Seek(0, SeekOrigin.Begin);
|
||||
return File(outputStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "ReportExcel.xlsx");
|
||||
}
|
||||
}
|
||||
return RedirectToAction("CarPresaleChoose");
|
||||
}
|
||||
public async Task<IActionResult> WordGenerate()
|
||||
{
|
||||
var value = HttpContext.Session.GetString("Cars");
|
||||
if (value != null)
|
||||
{
|
||||
List<int> rawReports = value!.Split('/').Select(x => int.Parse(x)).ToList();
|
||||
using (MemoryStream memoryStream = new MemoryStream())
|
||||
{
|
||||
_data.SaveReportWord(rawReports, memoryStream);
|
||||
memoryStream.Seek(0, SeekOrigin.Begin);
|
||||
var outputStream = new MemoryStream();
|
||||
await memoryStream.CopyToAsync(outputStream);
|
||||
outputStream.Seek(0, SeekOrigin.Begin);
|
||||
return File(outputStream, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "ReportWord.docx");
|
||||
}
|
||||
}
|
||||
return RedirectToAction("CarPresaleChoose");
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult CarPresaleReport()
|
||||
{
|
||||
var value = HttpContext.Session.GetString("Cars");
|
||||
if (value != null)
|
||||
{
|
||||
List<int> rawReports = value!.Split('/').Select(x => int.Parse(x)).ToList();
|
||||
var reports = _data.GetPresaleReports(rawReports);
|
||||
return View(reports);
|
||||
}
|
||||
return View(new List<ReportCarViewModel>());
|
||||
}
|
||||
public IActionResult ReportMenu()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
|
||||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
||||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
||||
public IActionResult Error()
|
||||
{
|
||||
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
|
||||
|
@ -1,7 +1,4 @@
|
||||
using CarCenterBusinessLogic.BusinessLogics;
|
||||
using CarCenterBusinessLogic.MailWorker;
|
||||
using CarCenterBusinessLogic.OfficePackage;
|
||||
using CarCenterBusinessLogic.OfficePackage.Implements;
|
||||
using CarCenterContracts.BusinessLogicsContracts;
|
||||
using CarCenterContracts.StoragesContracts;
|
||||
using CarCenterDatabaseImplement.Implements;
|
||||
@ -12,8 +9,7 @@ var builder = WebApplication.CreateBuilder(args);
|
||||
// Add services to the container.
|
||||
builder.Services.AddControllersWithViews();
|
||||
|
||||
builder.Logging.SetMinimumLevel(LogLevel.Trace);
|
||||
builder.Logging.AddLog4Net("log4net.config");
|
||||
|
||||
|
||||
builder.Services.AddTransient<IBundlingStorage, BundlingStorage>();
|
||||
builder.Services.AddTransient<ICarStorage, CarStorage>();
|
||||
@ -23,6 +19,7 @@ builder.Services.AddTransient<IPresaleStorage, PresaleStorage>();
|
||||
builder.Services.AddTransient<IRequestStorage, RequestStorage>();
|
||||
builder.Services.AddTransient<IStorekeeperStorage, StorekeeperStorage>();
|
||||
builder.Services.AddTransient<IWorkerStorage, WorkerStorage>();
|
||||
|
||||
builder.Services.AddTransient<IBundlingLogic, BundlingLogic>();
|
||||
builder.Services.AddTransient<ICarLogic, CarLogic>();
|
||||
builder.Services.AddTransient<IFeatureLogic, FeatureLogic>();
|
||||
@ -31,30 +28,10 @@ builder.Services.AddTransient<IPresaleLogic, PresaleLogic>();
|
||||
builder.Services.AddTransient<IRequestLogic, RequestLogic>();
|
||||
builder.Services.AddTransient<IStorekeeperLogic, StorekeeperLogic>();
|
||||
builder.Services.AddTransient<IWorkerLogic, WorkerLogic>();
|
||||
builder.Services.AddTransient<AbstractSaveToExcelStorekeeper, SaveToExcelStorekeeper>();
|
||||
builder.Services.AddTransient<AbstractSaveToWordStorekeeper, SaveToWordStorekeeper>();
|
||||
builder.Services.AddTransient<AbstractSaveToPdfStorekeeper, SaveToPdfStorekeeper>();
|
||||
builder.Services.AddSingleton<AbstractMailWorker, MailKitWorker>();
|
||||
builder.Services.AddTransient<StorekeeperData>();
|
||||
|
||||
builder.Services.AddSession(options =>
|
||||
{
|
||||
options.IdleTimeout = TimeSpan.FromMinutes(30);
|
||||
options.Cookie.HttpOnly = true;
|
||||
options.Cookie.IsEssential = true;
|
||||
});
|
||||
var app = builder.Build();
|
||||
var mailSender = app.Services.GetService<AbstractMailWorker>();
|
||||
mailSender?.MailConfig(new()
|
||||
{
|
||||
MailLogin = builder.Configuration?.GetSection("MailLogin")?.Value?.ToString() ?? string.Empty,
|
||||
MailPassword = builder.Configuration?.GetSection("MailPassword")?.Value?.ToString() ?? string.Empty,
|
||||
SmtpClientHost = builder.Configuration?.GetSection("SmtpClientHost")?.Value?.ToString() ?? string.Empty,
|
||||
SmtpClientPort = Convert.ToInt32(builder.Configuration?.GetSection("SmtpClientPort")?.Value?.ToString()),
|
||||
PopHost = builder.Configuration?.GetSection("PopHost")?.Value?.ToString() ?? string.Empty,
|
||||
PopPort = Convert.ToInt32(builder.Configuration?.GetSection("PopPort")?.Value?.ToString())
|
||||
|
||||
});
|
||||
|
||||
// Configure the HTTP request pipeline.
|
||||
if (!app.Environment.IsDevelopment())
|
||||
@ -68,7 +45,7 @@ app.UseHttpsRedirection();
|
||||
app.UseStaticFiles();
|
||||
|
||||
app.UseRouting();
|
||||
app.UseSession();
|
||||
|
||||
app.UseAuthorization();
|
||||
|
||||
app.MapControllerRoute(
|
||||
|
@ -3,8 +3,6 @@ using CarCenterContracts.ViewModels;
|
||||
using CarCenterContracts.BindingModels;
|
||||
using CarCenterContracts.StoragesContracts;
|
||||
using CarCenterContracts.SearchModels;
|
||||
using CarCenterBusinessLogic.MailWorker;
|
||||
using CarCenterBusinessLogic.OfficePackage;
|
||||
|
||||
namespace StorekeeperApp
|
||||
{
|
||||
@ -15,33 +13,15 @@ namespace StorekeeperApp
|
||||
private readonly IBundlingLogic _bundlingLogic;
|
||||
private readonly IFeatureLogic _featureLogic;
|
||||
private readonly ICarLogic _carLogic;
|
||||
private readonly IPresaleLogic _presaleLogic;
|
||||
private readonly IOrderLogic _orderLogic;
|
||||
private readonly AbstractSaveToExcelStorekeeper _excel;
|
||||
private readonly AbstractSaveToWordStorekeeper _word;
|
||||
private readonly AbstractSaveToPdfStorekeeper _pdf;
|
||||
private readonly AbstractMailWorker _mail;
|
||||
|
||||
public StorekeeperData(ILogger<StorekeeperData> logger, IStorekeeperLogic storekeeperLogic,
|
||||
IBundlingLogic bundlingLogic, IFeatureLogic featureLogic, ICarLogic carLogic,
|
||||
IPresaleLogic presaleLogic, IOrderLogic orderLogic,
|
||||
AbstractSaveToExcelStorekeeper excel,
|
||||
AbstractSaveToWordStorekeeper word,
|
||||
AbstractMailWorker mail,
|
||||
AbstractSaveToPdfStorekeeper pdf)
|
||||
public StorekeeperData(ILogger<StorekeeperData> logger, IStorekeeperLogic storekeeperLogic, IBundlingLogic bundlingLogic, IFeatureLogic featureLogic, ICarLogic carLogic)
|
||||
{
|
||||
_logger = logger;
|
||||
_storekeeperLogic = storekeeperLogic;
|
||||
_bundlingLogic = bundlingLogic;
|
||||
_featureLogic = featureLogic;
|
||||
_carLogic = carLogic;
|
||||
_presaleLogic = presaleLogic;
|
||||
_orderLogic = orderLogic;
|
||||
_excel = excel;
|
||||
_word = word;
|
||||
_mail = mail;
|
||||
_pdf = pdf;
|
||||
}
|
||||
}
|
||||
|
||||
public StorekeeperViewModel? Login(string email, string password)
|
||||
{
|
||||
@ -102,7 +82,7 @@ namespace StorekeeperApp
|
||||
}
|
||||
public List<CarViewModel>? GetCars(int userId)
|
||||
{
|
||||
return _carLogic.ReadList(new CarSearchModel() { StorekeeperId = userId });
|
||||
return _carLogic.ReadList(new() { StorekeeperId = userId });
|
||||
}
|
||||
public CarViewModel? GetCar(int id)
|
||||
{
|
||||
@ -120,95 +100,6 @@ namespace StorekeeperApp
|
||||
{
|
||||
return _carLogic.Delete(new() { Id = carId });
|
||||
}
|
||||
public List<ReportBundlingViewModel> GetTimeReport(DateTime? startDate, DateTime? endDate, int UserId)
|
||||
{
|
||||
var bundlings = _bundlingLogic.ReadList(new() { DateFrom = startDate, DateTo = endDate, StorekeeperId = UserId });
|
||||
if (bundlings == null)
|
||||
return new();
|
||||
List<ReportBundlingViewModel> bundlingTimeReports = new List<ReportBundlingViewModel>();
|
||||
foreach (var bundling in bundlings)
|
||||
{
|
||||
var report = new ReportBundlingViewModel();
|
||||
report.BundlingId = bundling.Id;
|
||||
var features = _featureLogic.ReadList(new() { BundlingId = bundling.Id, StorekeeperId = UserId });
|
||||
if (features != null)
|
||||
report.Features = features.Select(p => p.Id.ToString()).ToList();
|
||||
var orders = _orderLogic.ReadList(new() { BundlingId = bundling.Id, WorkerId = UserId });
|
||||
if (orders != null)
|
||||
report.Orders = orders.Select(p => p.Id.ToString()).ToList();
|
||||
bundlingTimeReports.Add(report);
|
||||
}
|
||||
return bundlingTimeReports;
|
||||
}
|
||||
public List<PresaleViewModel>? GetPresales()
|
||||
{
|
||||
return _presaleLogic.ReadList(null);
|
||||
}
|
||||
public List<OrderViewModel>? GetOrders()
|
||||
{
|
||||
return _orderLogic.ReadList(null);
|
||||
}
|
||||
|
||||
public List<ReportCarViewModel>? GetPresaleReports(List<int> bundlings)
|
||||
{
|
||||
List<ReportCarViewModel> reports = new();
|
||||
foreach (int i in bundlings)
|
||||
{
|
||||
ReportCarViewModel report = new();
|
||||
var bundling = _carLogic.ReadElement(new() { Id = i });
|
||||
report.VINnumber = (int)bundling!.VINnumber;
|
||||
var presales = _presaleLogic.ReadList(new() { CarId = i });
|
||||
if (presales != null)
|
||||
report.Presales = presales.Select(w => w.Id.ToString()).ToList();
|
||||
reports.Add(report);
|
||||
}
|
||||
return reports;
|
||||
}
|
||||
|
||||
public void SaveReportExcel(List<int> bundlings, MemoryStream stream)
|
||||
{
|
||||
var reports = GetPresaleReports(bundlings);
|
||||
if (reports == null)
|
||||
return;
|
||||
int maxsize = 0;
|
||||
foreach (var report in reports) { maxsize = Math.Max(maxsize, report.Presales.Count); }
|
||||
_excel.CreateReport(new()
|
||||
{
|
||||
carPresalesReport = reports,
|
||||
Title = "Отчет Номер_автомобиля предпродажные",
|
||||
memoryStream = stream,
|
||||
maxleng = maxsize
|
||||
});
|
||||
}
|
||||
|
||||
public void SaveReportWord(List<int> bundlings, MemoryStream stream)
|
||||
{
|
||||
var reports = GetPresaleReports(bundlings);
|
||||
if (reports == null)
|
||||
return;
|
||||
_word.CreateDoc(new()
|
||||
{
|
||||
memoryStream = stream,
|
||||
Title = "Отчет.VIN-Номер автомобиля: - предпродажные",
|
||||
carPresalesReport = reports
|
||||
});
|
||||
}
|
||||
|
||||
public void SendMailReport(DateTime? startDate, DateTime? endDate, int UserId, MemoryStream stream)
|
||||
{
|
||||
var reports = GetTimeReport(startDate, endDate, UserId);
|
||||
if (reports == null)
|
||||
return;
|
||||
_pdf.CreateDoc(new()
|
||||
{
|
||||
DateFrom = startDate!.Value,
|
||||
DateTo = endDate!.Value,
|
||||
FileName = stream,
|
||||
reportBundling = reports,
|
||||
Title = "Отчет"
|
||||
});
|
||||
byte[] report = stream.GetBuffer();
|
||||
_mail.MailSendAsync(new() { MailAddress = UserStorekeeper.user!.Email, Subject = "Отчет", FileName = "PdfReport.pdf", Pdf = report });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
using CarCenterContracts.ViewModels;
|
||||
|
||||
namespace StorekeeperApp
|
||||
namespace ImplementerApp
|
||||
{
|
||||
public static class UserStorekeeper
|
||||
{
|
||||
|
@ -1,85 +0,0 @@
|
||||
@{
|
||||
ViewData["Title"] = "Создание отчета";
|
||||
}
|
||||
|
||||
<div class="text-center">
|
||||
<h2 class="display-4">Создание отчета</h2>
|
||||
</div>
|
||||
<form id="TimeReportWeb" asp-controller="Home" 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 = $('#startDate').val();
|
||||
var endDate = $('#endDate').val();
|
||||
var today = new Date().toISOString().split('T')[0];
|
||||
var isValid = true;
|
||||
|
||||
$('#startDateError').text('');
|
||||
$('#endDateError').text('');
|
||||
|
||||
if (!startDate) {
|
||||
$('#startDateError').text('Пожалуйста, выберите дату начала.');
|
||||
isValid = false;
|
||||
}
|
||||
if (!endDate) {
|
||||
$('#endDateError').text('Пожалуйста, выберите дату окончания.');
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
if (isValid) {
|
||||
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/BundlingTimeReport';
|
||||
}).fail(function () {
|
||||
alert('Произошла ошибка при создании отчета.');
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
@ -1,50 +0,0 @@
|
||||
@using CarCenterContracts.ViewModels
|
||||
|
||||
@model List<ReportBundlingViewModel>
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "Bundlings on Time Bundlings";
|
||||
}
|
||||
|
||||
<div class="text-center">
|
||||
<h1 class="display-4">Список комплектаций в диапазоне времени</h1>
|
||||
</div>
|
||||
|
||||
<form asp-action="BundlingTimeMail" asp-controller="Home" method="post">
|
||||
<button type="submit" class="btn btn-primary">Отправить отчет на почту</button>
|
||||
</form>
|
||||
|
||||
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Комплектация</th>
|
||||
<th>Заказ</th>
|
||||
<th>Особенность</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var detail in Model)
|
||||
{
|
||||
<tr>
|
||||
<td>@detail.BundlingId</td>
|
||||
<td>
|
||||
<ul>
|
||||
@foreach (var product in detail.Orders)
|
||||
{
|
||||
<li>@product</li>
|
||||
}
|
||||
</ul>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
@foreach (var production in detail.Features)
|
||||
{
|
||||
<li>@production</li>
|
||||
}
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
@ -1,54 +0,0 @@
|
||||
@using CarCenterContracts.ViewModels;
|
||||
@model List<CarViewModel>
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "Выбор машин для отчета";
|
||||
}
|
||||
|
||||
<h2>Выберите детали для отчета</h2>
|
||||
|
||||
<form asp-controller="Home" asp-action="CarPresaleChoose" method="post" onsubmit="return validateForm()">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Select</th>
|
||||
<th>Выберите автомобиль с VIN-номером:</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@for (int i = 0; i < Model.Count; i++)
|
||||
{
|
||||
<tr>
|
||||
<td>
|
||||
<input type="checkbox" name="selectedItems" value="@Model[i].Id" />
|
||||
</td>
|
||||
<td>@Model[i].VINnumber</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
<input type="hidden" id="reportType" name="reportType" value="default" />
|
||||
<button type="submit" class="btn btn-primary" onclick="setReportType('default')">Сгенерировать отчет</button>
|
||||
<button type="submit" class="btn btn-secondary" onclick="setReportType('excel')">Сгенерировать отчет в Excel</button>
|
||||
<button type="submit" class="btn btn-secondary" onclick="setReportType('word')">Сгенерировать отчет в Word</button>
|
||||
<div id="validationMessage" style="display:none;color:red;">Пожалуйста, выберите хотя бы одну деталь.</div>
|
||||
</form>
|
||||
|
||||
@section Scripts {
|
||||
<script>
|
||||
function validateForm() {
|
||||
var checkboxes = document.querySelectorAll('input[name="selectedItems"]:checked');
|
||||
if (checkboxes.length === 0) {
|
||||
document.getElementById('validationMessage').style.display = 'block';
|
||||
return false;
|
||||
} else {
|
||||
document.getElementById('validationMessage').style.display = 'none';
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
function setReportType(type) {
|
||||
document.getElementById('reportType').value = type;
|
||||
}
|
||||
</script>
|
||||
}
|
@ -1,35 +0,0 @@
|
||||
@using CarCenterContracts.ViewModels
|
||||
|
||||
@model List<ReportCarViewModel>
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "Отчет машина - предпродажные";
|
||||
}
|
||||
<div class="text-center">
|
||||
<h1 class="display-4">Список машин с предпродажными</h1>
|
||||
</div>
|
||||
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Машина</th>
|
||||
<th>Предпродажные</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var detail in Model)
|
||||
{
|
||||
<tr>
|
||||
<td>@detail.VINnumber</td>
|
||||
<td>
|
||||
<ul>
|
||||
@foreach (var workshop in detail.Presales)
|
||||
{
|
||||
<li>@workshop</li>
|
||||
}
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
@ -2,7 +2,6 @@
|
||||
@using CarCenterDataModels.Enums;
|
||||
@{
|
||||
ViewData["Title"] = "CreateBundling";
|
||||
ViewBag.Presales = Model.BundlingsPresale;
|
||||
}
|
||||
@model BundlingViewModel;
|
||||
<div class="text-center">
|
||||
@ -46,43 +45,6 @@
|
||||
<span id="ToolKiteError" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
@if (ViewBag.AllPresales != null && ViewBag.AllPresales.Count != 0)
|
||||
{
|
||||
<div class="container">
|
||||
<div>Комлектации</div>
|
||||
<div class="table-responsive-lg">
|
||||
<table id="presalesTable" class="display">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID комплектации</th>
|
||||
<th> </th>
|
||||
<th>Удалить</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var presale in ViewBag.Presales)
|
||||
{
|
||||
<tr data-presale-id="@presale.Value.Id">
|
||||
<td>
|
||||
<input type="hidden" name="presaleIds" value="@presale.Value.Id" />@presale.Value.Id
|
||||
</td>
|
||||
<th> </th>
|
||||
<td><button type="button" class="deletePresale" data-presale-id="@presale.Value.Id">Удалить</button></td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<select id="presaleSelect" class="form-control">
|
||||
<option value="">Выберите предпродажную работу</option>
|
||||
@foreach (var presale in ViewBag.AllPresales)
|
||||
{
|
||||
<option value="@presale.Id" data-price="@presale.Price">Предпродажная работа @presale.Id</option>
|
||||
}
|
||||
</select>
|
||||
<button type="button" id="addPresale" class="btn btn-secondary">Добавить предпродажную работу</button>
|
||||
</div>
|
||||
}
|
||||
<div class="row">
|
||||
<div class="col-4">Цена:</div>
|
||||
<div class="col-8">
|
||||
@ -99,49 +61,6 @@
|
||||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$('#addPresale').click(function () {
|
||||
var selectedPresale = $('#presaleSelect option:selected');
|
||||
if (selectedPresale.val()) {
|
||||
var presaleId = selectedPresale.val();
|
||||
var exists = false;
|
||||
$('#presalesTable tbody tr').each(function () {
|
||||
if ($(this).data('presale-id') == presaleId) {
|
||||
exists = true;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
if (exists) {
|
||||
alert('Эта комплектация уже добавлена.');
|
||||
return;
|
||||
}
|
||||
|
||||
var presaleName = selectedPresale.text();
|
||||
|
||||
var newRow = `
|
||||
<tr data-presale-id="${presaleId}">
|
||||
<td>
|
||||
<input type="hidden" name="presaleIds" value="${presaleId}" />
|
||||
${presaleId}
|
||||
</td>
|
||||
<th> </th>
|
||||
<td><button type="button" class="deletePresale" data-presale-id="${presaleId}">Удалить</button></td>
|
||||
</tr>
|
||||
`;
|
||||
$('#presalesTable tbody').append(newRow);
|
||||
|
||||
$('.deletePresale').off('click').on('click', function () {
|
||||
var row = $(this).closest('tr');
|
||||
row.remove();
|
||||
updateSum();
|
||||
});
|
||||
|
||||
$('#presaleSelect').val('');
|
||||
|
||||
updateSum();
|
||||
} else {
|
||||
alert('Выберите комплектацию для добавления');
|
||||
}
|
||||
});
|
||||
$('#bundlinglForm').submit(function (event) {
|
||||
var EquipmentPackage = $('#EquipmentPackage').val();
|
||||
var TirePackage = $('#TirePackage').val();
|
||||
|
@ -3,7 +3,7 @@
|
||||
}
|
||||
|
||||
<div class="text-center">
|
||||
<h2 class="display-4">Вход в приложение Кладовщика</h2>
|
||||
<h2 class="display-4">Вход в приложение</h2>
|
||||
</div>
|
||||
<form method="post">
|
||||
<div class="row">
|
||||
|
@ -3,14 +3,13 @@
|
||||
}
|
||||
|
||||
<div class="text-center">
|
||||
<h2 class="display-4">Главное меню</h2>
|
||||
<h1>Добро пожаловать на страницу Кладовщика</h1>
|
||||
<h1 class="display-4">Главное меню</h1>
|
||||
<div class="list-group">
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="IndexBundling">Комплектации</a>
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="IndexFeature">Особенности</a>
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="IndexCar">Автомобили</a>
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Личные данные</a>
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="ReportMenu">Меню отчетов</a>
|
||||
@* <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="ReportsMenu">Меню отчетов</a> *@
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Logout">Выйти</a>
|
||||
|
||||
</div>
|
||||
|
@ -3,8 +3,6 @@
|
||||
}
|
||||
|
||||
<div class="text-center">
|
||||
<h2>Добро пожаловать на сайт Кладовщика</h2>
|
||||
<h2>Войдите или зарегистрируйтесь</h2>
|
||||
<div class="list-group">
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Enter">Вход</a>
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Register">Регистрация</a>
|
||||
|
@ -2,7 +2,7 @@
|
||||
ViewData["Title"] = "Register";
|
||||
}
|
||||
<div class="text-center">
|
||||
<h2 class="display-4">Личные данные Кладовщика</h2>
|
||||
<h2 class="display-4">Личные данные</h2>
|
||||
</div>
|
||||
<form method="post">
|
||||
<div class="row">
|
||||
|
@ -2,7 +2,7 @@
|
||||
ViewData["Title"] = "Register";
|
||||
}
|
||||
<div class="text-center">
|
||||
<h2 class="display-4">Регистрация Кладовщика</h2>
|
||||
<h2 class="display-4">Регистрация</h2>
|
||||
</div>
|
||||
<form method="post">
|
||||
<div class="row">
|
||||
|
@ -1,11 +0,0 @@
|
||||
@{
|
||||
ViewData["Title"] = "Report Menu";
|
||||
}
|
||||
|
||||
<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="CarPresaleChoose">Отчет машина - предпродажные</a>
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="BundlingTimeChoose">Отчет по комплектаций по покупкам и особенностям</a>
|
||||
</div>
|
||||
</div>
|
@ -5,12 +5,5 @@
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*",
|
||||
|
||||
"SmtpClientHost": "smtp.mail.ru",
|
||||
"SmtpClientPort": "587",
|
||||
"PopHost": "pop.mail.ru",
|
||||
"PopPort": "995",
|
||||
"MailLogin": "aboba.russian@mail.ru",
|
||||
"MailPassword": "5qnSMftuH4MPnFMyW7rD"
|
||||
}
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
|
@ -1,16 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<log4net>
|
||||
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
|
||||
<file value="c:/temp/GoWorkCourse.log" />
|
||||
<appendToFile value="true" />
|
||||
<maximumFileSize value="100KB" />
|
||||
<maxSizeRollBackups value="2" />
|
||||
<layout type="log4net.Layout.PatternLayout">
|
||||
<conversionPattern value="%date %5level %logger.%method [%line] - MESSAGE: %message%newline %exception" />
|
||||
</layout>
|
||||
</appender>
|
||||
<root>
|
||||
<level value="TRACE" />
|
||||
<appender-ref ref="RollingFile" />
|
||||
</root>
|
||||
</log4net>
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,268 +1,98 @@
|
||||
using CarCenterContracts.BindingModels;
|
||||
using CarCenterContracts.ViewModels;
|
||||
using CarCenterDatabaseImplement.Models;
|
||||
using CarCenterDataModels.Enums;
|
||||
using CarCenterWorkerApp.Models;
|
||||
using CarCenterWorkerApp.Models;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using System.Diagnostics;
|
||||
using WorkerApp;
|
||||
|
||||
namespace CarCenterWorkerApp.Controllers
|
||||
{
|
||||
public class HomeController : Controller
|
||||
{
|
||||
private readonly ILogger<HomeController> _logger;
|
||||
private readonly WorkerData _data;
|
||||
public HomeController(ILogger<HomeController> logger, WorkerData data)
|
||||
{
|
||||
_logger = logger;
|
||||
_data = data;
|
||||
}
|
||||
private bool IsLoggedIn { get { return UserWorker.user != null; } }
|
||||
private int UserId { get { return UserWorker.user!.Id; } }
|
||||
public IActionResult IndexNonReg()
|
||||
{
|
||||
if (!IsLoggedIn)
|
||||
return View();
|
||||
return RedirectToAction("Index");
|
||||
}
|
||||
public IActionResult Index()
|
||||
{
|
||||
if (!IsLoggedIn)
|
||||
return RedirectToAction("IndexNonReg");
|
||||
return View();
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult Enter()
|
||||
{
|
||||
if (!IsLoggedIn)
|
||||
return View();
|
||||
return RedirectToAction("Index");
|
||||
}
|
||||
[HttpPost]
|
||||
public void Enter(string login, string password)
|
||||
{
|
||||
var user = _data.Login(login, password);
|
||||
if (user != null)
|
||||
{
|
||||
UserWorker.user = user;
|
||||
Response.Redirect("Index");
|
||||
}
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult Register()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
public IActionResult Logout()
|
||||
{
|
||||
UserWorker.user = null;
|
||||
return RedirectToAction("IndexNonReg");
|
||||
}
|
||||
[HttpPost]
|
||||
public void Register(string name, string surname, string patronymic, string email, long phone, string password1, string password2)
|
||||
{
|
||||
if (password1 == password2 && _data.Register(new()
|
||||
{
|
||||
Email = email,
|
||||
Name = name,
|
||||
Password = password1,
|
||||
Surname = surname,
|
||||
Patronymic = patronymic,
|
||||
PhoneNumber = phone
|
||||
}))
|
||||
{
|
||||
Response.Redirect("Index");
|
||||
}
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult IndexRequest()
|
||||
{
|
||||
if (UserWorker.user != null)
|
||||
{
|
||||
var list = _data.GetRequests(UserWorker.user.Id);
|
||||
if (list != null)
|
||||
return View(list);
|
||||
return View(new List<RequestViewModel>());
|
||||
}
|
||||
return RedirectToAction("IndexNonReg");
|
||||
}
|
||||
[HttpPost]
|
||||
public void IndexRequest(int id)
|
||||
{
|
||||
if (UserWorker.user != null)
|
||||
{
|
||||
_data.DeleteRequest(id);
|
||||
}
|
||||
Response.Redirect("IndexRequest");
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult CreateRequest(int id)
|
||||
{
|
||||
if (id != 0)
|
||||
{
|
||||
var value = _data.GetRequest(id);
|
||||
if (value != null)
|
||||
return View(value);
|
||||
}
|
||||
return View(new RequestViewModel());
|
||||
}
|
||||
[HttpPost]
|
||||
public IActionResult CreateRequest(RequestBindingModel model)
|
||||
{
|
||||
if (model.Id == 0)
|
||||
{
|
||||
model.PresaleId = null;
|
||||
model.WorkerId = UserWorker.user!.Id;
|
||||
if (_data.CreateRequest(model))
|
||||
return RedirectToAction("IndexRequest");
|
||||
}
|
||||
else
|
||||
{
|
||||
model.WorkerId = UserWorker.user!.Id;
|
||||
if (_data.UpdateRequest(model))
|
||||
return RedirectToAction("IndexRequest");
|
||||
}
|
||||
return View();
|
||||
}
|
||||
private readonly ILogger<HomeController> _logger;
|
||||
|
||||
public HomeController(ILogger<HomeController> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult Index()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult Enter()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
public IActionResult IndexPresale()
|
||||
public IActionResult Register()
|
||||
{
|
||||
if (UserWorker.user != null)
|
||||
{
|
||||
var productions = _data.GetPresales(UserWorker.user.Id);
|
||||
return View(productions);
|
||||
}
|
||||
return RedirectToAction("IndexNonReg");
|
||||
}
|
||||
[HttpPost]
|
||||
public IActionResult IndexPresale(int id)
|
||||
{
|
||||
_data.DeletePresale(id);
|
||||
return RedirectToAction("IndexPresale");
|
||||
return View();
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult CreatePresale(int id)
|
||||
public IActionResult Presales()
|
||||
{
|
||||
var bundlings = _data.GetBundlings();
|
||||
var requests = _data.GetRequests(UserWorker.user!.Id);
|
||||
ViewBag.AllBundlings = bundlings;
|
||||
ViewBag.AllRequests = requests;
|
||||
if (id != 0)
|
||||
{
|
||||
var value = _data.GetPresale(id);
|
||||
if (value != null)
|
||||
return View(value);
|
||||
}
|
||||
return View(new PresaleViewModel());
|
||||
}
|
||||
[HttpPost]
|
||||
public IActionResult CreatePresale(PresaleBindingModel model,int[] bundlingIds, int[] requestIds)
|
||||
{
|
||||
var bundlings = _data.GetBundlings();
|
||||
for (int i = 0; i < bundlingIds.Length; i++)
|
||||
{
|
||||
var bundling = bundlings!.FirstOrDefault(x => x.Id == bundlingIds[i])!;
|
||||
model.PresaleBundlings.Add(i, bundling);
|
||||
}
|
||||
var requests = _data.GetRequests(UserWorker.user!.Id);
|
||||
for (int i = 0; i < requestIds.Length; i++)
|
||||
{
|
||||
var request = requests!.FirstOrDefault(x => x.Id == requestIds[i])!;
|
||||
model.Requests.Add(i, request);
|
||||
}
|
||||
model.WorkerId = UserWorker.user!.Id;
|
||||
bool changed = false;
|
||||
if (model.PresaleBundlings.Count > 0)
|
||||
{
|
||||
if (model.Id != 0)
|
||||
{
|
||||
changed = _data.UpdatePresale(model);
|
||||
}
|
||||
else
|
||||
{
|
||||
changed = _data.CreatePresale(model);
|
||||
}
|
||||
}
|
||||
if (changed)
|
||||
return RedirectToAction("IndexPresale");
|
||||
else
|
||||
{
|
||||
ViewBag.AllBundlings = bundlings;
|
||||
return View(model);
|
||||
}
|
||||
return View();
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult IndexOrder()
|
||||
public IActionResult PresaleCreate()
|
||||
{
|
||||
if (UserWorker.user != null)
|
||||
{
|
||||
var productions = _data.GetOrders(UserWorker.user.Id);
|
||||
return View(productions);
|
||||
}
|
||||
return RedirectToAction("IndexNonReg");
|
||||
}
|
||||
[HttpPost]
|
||||
public IActionResult IndexOrder(int id)
|
||||
{
|
||||
_data.DeleteOrder(id);
|
||||
return RedirectToAction("IndexOrder");
|
||||
return View();
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult CreateOrder(int id)
|
||||
public IActionResult PresaleDelete()
|
||||
{
|
||||
var cars = _data.GetCars();
|
||||
var presales = _data.GetPresales(UserWorker.user!.Id);
|
||||
ViewBag.AllCars = cars;
|
||||
ViewBag.AllPresales = presales;
|
||||
if (id != 0)
|
||||
{
|
||||
var value = _data.GetOrder(id);
|
||||
if (value != null)
|
||||
return View(value);
|
||||
}
|
||||
return View(new OrderViewModel());
|
||||
return View();
|
||||
}
|
||||
[HttpPost]
|
||||
public IActionResult CreateOrder(OrderBindingModel model, int[] carIds, int[] presaleIds, string Sum)
|
||||
[HttpGet]
|
||||
public IActionResult PresaleUpdate()
|
||||
{
|
||||
var cars = _data.GetCars();
|
||||
for (int i = 0; i < carIds.Length; i++)
|
||||
{
|
||||
var car = cars!.FirstOrDefault(x => x.Id == carIds[i])!;
|
||||
model.Cars.Add(i, car);
|
||||
}
|
||||
var presales = _data.GetPresales(UserWorker.user!.Id);
|
||||
for (int i = 0; i < presaleIds.Length; i++)
|
||||
{
|
||||
var presale = presales!.FirstOrDefault(x => x.Id == presaleIds[i])!;
|
||||
model.OrderPresales.Add(i, presale);
|
||||
}
|
||||
model.WorkerId = UserWorker.user!.Id;
|
||||
if(double.TryParse(Sum, out double val))
|
||||
{
|
||||
model.Sum = val;
|
||||
}
|
||||
bool changed = false;
|
||||
if (model.OrderPresales.Count > 0)
|
||||
{
|
||||
if (model.Id != 0)
|
||||
{
|
||||
changed = _data.UpdateOrder(model);
|
||||
}
|
||||
else
|
||||
{
|
||||
changed = _data.CreateOrder(model);
|
||||
}
|
||||
}
|
||||
if (changed)
|
||||
return RedirectToAction("IndexOrder");
|
||||
else
|
||||
{
|
||||
ViewBag.AllCars = cars;
|
||||
return View(model);
|
||||
}
|
||||
return View();
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult Requests()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult RequestCreate()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult RequestDelete()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult RequestUpdate()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult Orders()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult OrderCreate()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult OrderDelete()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
[HttpGet]
|
||||
public IActionResult OrderUpdate()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
|
||||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
||||
public IActionResult Error()
|
||||
{
|
||||
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
|
||||
}
|
||||
}
|
||||
}
|
@ -2,7 +2,7 @@ using CarCenterBusinessLogic.BusinessLogics;
|
||||
using CarCenterContracts.BusinessLogicsContracts;
|
||||
using CarCenterContracts.StoragesContracts;
|
||||
using CarCenterDatabaseImplement.Implements;
|
||||
using WorkerApp;
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
// Add services to the container.
|
||||
@ -27,7 +27,6 @@ builder.Services.AddTransient<IPresaleLogic, PresaleLogic>();
|
||||
builder.Services.AddTransient<IRequestLogic, RequestLogic>();
|
||||
builder.Services.AddTransient<IStorekeeperLogic, StorekeeperLogic>();
|
||||
builder.Services.AddTransient<IWorkerLogic, WorkerLogic>();
|
||||
builder.Services.AddTransient<WorkerData>();
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
|
@ -1,9 +0,0 @@
|
||||
using CarCenterContracts.ViewModels;
|
||||
|
||||
namespace WorkerApp
|
||||
{
|
||||
public static class UserWorker
|
||||
{
|
||||
public static WorkerViewModel? user { get; set; }
|
||||
}
|
||||
}
|
26
CarCenter/CarCenterWorkerApp/Views/Home/AddOrderCars.cshtml
Normal file
26
CarCenter/CarCenterWorkerApp/Views/Home/AddOrderCars.cshtml
Normal file
@ -0,0 +1,26 @@
|
||||
@{
|
||||
ViewData["Title"] = "AddOrderCars";
|
||||
}
|
||||
<div class="text-center mb-5">
|
||||
<h2 class="display-4">Добавить машину в заказ</h2>
|
||||
</div>
|
||||
<form method="post">
|
||||
<div class="row mb-5">
|
||||
<div class="col-4">Заказ</div>
|
||||
<div class="col-8 ">
|
||||
<select id="orderId" name="orderId" class="form-control" asp-items="@(new SelectList(@ViewBag.Orders,"Id"))"></select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-5">
|
||||
<div class="col-4">Машина</div>
|
||||
<div class="col-8">
|
||||
<select id="carId" name="carId" class="form-control" asp-items="@(new SelectList(@ViewBag.Cars,"Id"))"></select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4"></div>
|
||||
<div class="col-2"><input type="submit" value="Добавить" class="btn btn-primary" /></div>
|
||||
<div class="col-4"></div>
|
||||
<div class="col-2"><input type="button" value="Отменить" class="btn btn-secondary" /></div>
|
||||
</div>
|
||||
</form>
|
@ -1,283 +0,0 @@
|
||||
@using CarCenterContracts.ViewModels;
|
||||
@using CarCenterDataModels.Enums;
|
||||
|
||||
@model OrderViewModel
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "CreateOrder";
|
||||
ViewBag.Presales = Model.OrderPresales;
|
||||
ViewBag.Cars = Model.Cars;
|
||||
}
|
||||
<div class="text-center">
|
||||
<h2 class="display-4">Создание заказа</h2>
|
||||
</div>
|
||||
<form id="orderForm" method="post">
|
||||
<div class="row">
|
||||
<div class="col-4">Тип оплаты:</div>
|
||||
<div class="col-8">
|
||||
<select name="PaymentType" id="PaymentType" value="@Model.PaymentType">
|
||||
@foreach (var value in Enum.GetValues(typeof(PaymentType)))
|
||||
{
|
||||
<option value="@value">@value</option>
|
||||
}
|
||||
</select>
|
||||
<span id="PaymentTypeError" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
@if (Model.Id != 0)
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col-4">Статус оплаты:</div>
|
||||
<div class="col-8">
|
||||
<select name="PaymentStatus" id="PaymentStatus" value="@Model.PaymentStatus">
|
||||
@foreach (var value in Enum.GetValues(typeof(PaymentStatus)))
|
||||
{
|
||||
<option value="@value">@value</option>
|
||||
}
|
||||
</select>
|
||||
<span id="PaymentStatusError" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
<div class="row">
|
||||
<div class="col-4">ФИО покупателя:</div>
|
||||
<div class="col-8">
|
||||
<input type="text" name="BuyerFCS" id="BuyerFCS" value="@Model.BuyerFCS" />
|
||||
<span id="BuyerFCSError" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div>Предпродажные работы</div>
|
||||
<div class="table-responsive-lg">
|
||||
<table id="presalesTable" class="display">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID предпродажной</th>
|
||||
<th> </th>
|
||||
<th>Стоимость</th>
|
||||
<th> </th>
|
||||
<th>Удалить</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var presale in ViewBag.Presales)
|
||||
{
|
||||
<tr data-presale-id="@presale.Value.Id">
|
||||
<td>
|
||||
<input type="hidden" name="presaleIds" value="@presale.Value.Id" />@presale.Value.Id
|
||||
</td>
|
||||
<th> </th>
|
||||
<td class="presale-price" data-price="@presale.Value.Price">@presale.Value.Price</td>
|
||||
<th> </th>
|
||||
<td><button type="button" class="deletePresale" data-bundling-id="@presale.Value.Id">Удалить</button></td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<select id="presaleSelect" class="form-control">
|
||||
<option value="">Выберите работу</option>
|
||||
@foreach (var presale in ViewBag.AllPresales)
|
||||
{
|
||||
<option value="@presale.Id" data-price="@presale.Price">Работа @presale.Id</option>
|
||||
}
|
||||
</select>
|
||||
<button type="button" id="addPresale" class="btn btn-secondary">Добавить работу</button>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div>Машины</div>
|
||||
<div class="table-responsive-lg">
|
||||
<table id="carsTable" class="display">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID машины</th>
|
||||
<th> </th>
|
||||
<th>Стоимость</th>
|
||||
<th> </th>
|
||||
<th>Удалить</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var car in ViewBag.Cars)
|
||||
{
|
||||
<tr data-car-id="@car.Value.Id">
|
||||
<td>
|
||||
<input type="hidden" name="carIds" value="@car.Value.Id" />@car.Value.Id
|
||||
</td>
|
||||
<th> </th>
|
||||
<td class="car-price" data-price="@car.Value.Price">@car.Value.Price</td>
|
||||
<th> </th>
|
||||
<td><button type="button" class="deleteCar" data-car-id="@car.Value.Id">Удалить</button></td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<select id="carSelect" class="form-control">
|
||||
<option value="">Выберите машину</option>
|
||||
@foreach (var car in ViewBag.AllCars)
|
||||
{
|
||||
<option value="@car.Id" data-price="@car.Price">Машина @car.Id</option>
|
||||
}
|
||||
</select>
|
||||
<button type="button" id="addCar" 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>
|
||||
<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 src="https://cdn.datatables.net/1.11.3/js/jquery.dataTables.js"></script>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
function updateSum() {
|
||||
var Sum = 0;
|
||||
$('#presalesTable tbody tr').each(function () {
|
||||
var pricebd = $(this).find('.presale-price').data('price');
|
||||
Sum += parseFloat(pricebd);
|
||||
});
|
||||
$('#carsTable tbody tr').each(function () {
|
||||
var pricecar = $(this).find('.car-price').data('price');
|
||||
Sum += parseFloat(pricecar);
|
||||
});
|
||||
$('#Sum').val(Sum.toFixed(2));
|
||||
}
|
||||
|
||||
$(document).on('click', '.deleteCar', function () {
|
||||
var row = $(this).closest('tr');
|
||||
row.remove();
|
||||
updateSum();
|
||||
});
|
||||
$(document).on('click', '.deletePresale', function () {
|
||||
var row = $(this).closest('tr');
|
||||
row.remove();
|
||||
updateSum();
|
||||
});
|
||||
$('#addPresale').click(function () {
|
||||
var selectedPresale = $('#presaleSelect option:selected');
|
||||
if (selectedPresale.val()) {
|
||||
var presaleId = selectedPresale.val();
|
||||
var exists = false;
|
||||
$('#presalesTable tbody tr').each(function () {
|
||||
if ($(this).data('presale-id') == presaleId) {
|
||||
exists = true;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
if (exists) {
|
||||
alert('Эта работа уже добавлена.');
|
||||
return;
|
||||
}
|
||||
|
||||
var presaleName = selectedPresale.text();
|
||||
var presalePrice = selectedPresale.data('price');
|
||||
|
||||
var newRow = `
|
||||
<tr data-presale-id="${presaleId}">
|
||||
<td>
|
||||
<input type="hidden" name="presaleIds" value="${presaleId}" />
|
||||
${presaleId}
|
||||
</td>
|
||||
<th> </th>
|
||||
<td class="presale-price" data-price="${presalePrice}">${presalePrice}</td>
|
||||
<th> </th>
|
||||
<td><button type="button" class="deletePresale" data-presale-id="${presaleId}">Удалить</button></td>
|
||||
</tr>
|
||||
`;
|
||||
$('#presalesTable tbody').append(newRow);
|
||||
|
||||
$('.deletePresale').off('click').on('click', function () {
|
||||
var row = $(this).closest('tr');
|
||||
row.remove();
|
||||
updateSum();
|
||||
});
|
||||
|
||||
$('#presaleSelect').val('');
|
||||
|
||||
updateSum();
|
||||
} else {
|
||||
alert('Выберите работу для добавления');
|
||||
}
|
||||
});
|
||||
$('#addCar').click(function () {
|
||||
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;
|
||||
}
|
||||
});
|
||||
if (exists) {
|
||||
alert('Эта машина уже добавлена.');
|
||||
return;
|
||||
}
|
||||
|
||||
var carName = selectedCar.text();
|
||||
var carPrice = selectedCar.data('price');
|
||||
|
||||
var newRow = `
|
||||
<tr data-car-id="${carId}">
|
||||
<td>
|
||||
<input type="hidden" name="carIds" value="${carId}" />
|
||||
${carId}
|
||||
</td>
|
||||
<th> </th>
|
||||
<td class="car-price" data-price="${carPrice}">${carPrice}</td>
|
||||
<th> </th>
|
||||
<td><button type="button" class="deleteCar" data-car-id="${carId}">Удалить</button></td>
|
||||
</tr>
|
||||
`;
|
||||
$('#carsTable tbody').append(newRow);
|
||||
|
||||
$('.deleteCar').off('click').on('click', function () {
|
||||
var row = $(this).closest('tr');
|
||||
row.remove();
|
||||
updateSum();
|
||||
});
|
||||
|
||||
$('#carSelect').val('');
|
||||
|
||||
updateSum();
|
||||
} else {
|
||||
alert('Выберите машину для добавления');
|
||||
}
|
||||
});
|
||||
|
||||
$('#orderForm').submit(function (event) {
|
||||
var PaymentType = $('#PaymentType').val();
|
||||
var PaymentStatus = $('#PaymentStatus').val();
|
||||
var BuyerFCS = $('#BuyerFCS').val();
|
||||
var isValid = true;
|
||||
|
||||
$('#PaymentTypeError').text('');
|
||||
$('#PaymentStatusError').text('');
|
||||
$('#BuyerFCSError').text('');
|
||||
var totalCars = $('#carsTable tbody tr').length;
|
||||
if (totalCars == 0) {
|
||||
alert('Пожалуйста, добавьте хотя бы одну машину.');
|
||||
isValid = false;
|
||||
}
|
||||
var totalPresales = $('#presalesTable tbody tr').length;
|
||||
if (totalPresales == 0) {
|
||||
alert('Пожалуйста, добавьте хотя бы одну работу.');
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
if (!isValid) {
|
||||
event.preventDefault();
|
||||
}
|
||||
});
|
||||
|
||||
updateSum();
|
||||
});
|
||||
</script>
|
||||
|
@ -1,283 +0,0 @@
|
||||
@using CarCenterContracts.ViewModels;
|
||||
@using CarCenterDataModels.Enums;
|
||||
|
||||
@model PresaleViewModel
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "CreatePresale";
|
||||
ViewBag.Bundlings = Model.PresaleBundlings;
|
||||
ViewBag.Requests = Model.Requests;
|
||||
}
|
||||
<div class="text-center">
|
||||
<h2 class="display-4">Создание предпродажной работы</h2>
|
||||
</div>
|
||||
<form id="presaleForm" method="post">
|
||||
@if (Model.Id != 0){
|
||||
<div class="row">
|
||||
<div class="col-4">Статус:</div>
|
||||
<div class="col-8">
|
||||
<select name="PresaleStatus" id="PresaleStatus" value="@Model.PresaleStatus">
|
||||
@foreach (var value in Enum.GetValues(typeof(PresaleStatus)))
|
||||
{
|
||||
<option value="@value">@value</option>
|
||||
}
|
||||
</select>
|
||||
<span id="PresaleStatusError" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
<div class="row">
|
||||
<div class="col-4">Описание:</div>
|
||||
<div class="col-8">
|
||||
<input type="text" name="Description" id="Description" value="@Model.Description" />
|
||||
<span id="DescriptionError" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4">Выполнить до:</div>
|
||||
<div class="col-8">
|
||||
<input type="text" name="DueTill" id="DueTill" value="@Model.DueTill" />
|
||||
<span id="DueTillError" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div>Полжелания</div>
|
||||
<div class="table-responsive-lg">
|
||||
<table id="requestsTable" class="display">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID пожелания</th>
|
||||
<th> </th>
|
||||
<th>Удалить</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var request in ViewBag.Requests)
|
||||
{
|
||||
<tr data-request-id="@request.Value.Id">
|
||||
<td>
|
||||
<input type="hidden" name="requestIds" value="@request.Value.Id" />@request.Value.Id
|
||||
</td>
|
||||
<th> </th>
|
||||
<td><button type="button" class="deleteRequest" data-request-id="@request.Value.Id">Удалить</button></td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<select id="requestSelect" class="form-control">
|
||||
<option value="">Выберите пожелания</option>
|
||||
@foreach (var request in ViewBag.AllRequests)
|
||||
{
|
||||
<option value="@request.Id" data-request="@request.Id">Пожелание @request.Id</option>
|
||||
}
|
||||
</select>
|
||||
<button type="button" id="addRequest" class="btn btn-secondary">Добавить пожелание</button>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div>Комлектации</div>
|
||||
<div class="table-responsive-lg">
|
||||
<table id="bundlingsTable" class="display">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID комплектации</th>
|
||||
<th> </th>
|
||||
<th>Стоимость</th>
|
||||
<th> </th>
|
||||
<th>Удалить</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var bundling in ViewBag.Bundlings)
|
||||
{
|
||||
<tr data-bundling-id="@bundling.Value.Id">
|
||||
<td>
|
||||
<input type="hidden" name="bundlingIds" value="@bundling.Value.Id" />@bundling.Value.Id
|
||||
</td>
|
||||
<th> </th>
|
||||
<td class="bundling-price" data-price="@bundling.Value.Price">@bundling.Value.Price</td>
|
||||
<th> </th>
|
||||
<td><button type="button" class="deleteBundling" data-bundling-id="@bundling.Value.Id">Удалить</button></td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<select id="bundlingSelect" class="form-control">
|
||||
<option value="">Выберите комплектацию</option>
|
||||
@foreach (var bundling in ViewBag.AllBundlings)
|
||||
{
|
||||
<option value="@bundling.Id" data-price="@bundling.Price">Комплектация @bundling.Id</option>
|
||||
}
|
||||
</select>
|
||||
<button type="button" id="addBundling" class="btn btn-secondary">Добавить комплектацию</button>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4">Цена предпродажной работы:</div>
|
||||
<div class="col-8">
|
||||
<input type="text" name="Price" id="Price" value="@Model.Price" />
|
||||
<span id="PriceError" class="text-danger"></span>
|
||||
</div>
|
||||
</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>
|
||||
<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 src="https://cdn.datatables.net/1.11.3/js/jquery.dataTables.js"></script>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
function updateSum() {
|
||||
var sum = 0;
|
||||
$('#bundlingsTable tbody tr').each(function () {
|
||||
var price = $(this).find('.bundling-price').data('price');
|
||||
sum += parseFloat(price);
|
||||
});
|
||||
var presalePrice = parseFloat($('#Price').val());
|
||||
if (!isNaN(presalePrice)) {
|
||||
sum += presalePrice;
|
||||
}
|
||||
$('#sum').val(sum.toFixed(2));
|
||||
}
|
||||
|
||||
$(document).on('click', '.deleteBundling', function () {
|
||||
var row = $(this).closest('tr');
|
||||
row.remove();
|
||||
updateSum();
|
||||
});
|
||||
|
||||
$(document).on('click', '.deleteRequest', function () {
|
||||
var row = $(this).closest('tr');
|
||||
row.remove();
|
||||
updateSum();
|
||||
});
|
||||
|
||||
$('#addBundling').click(function () {
|
||||
var selectedBundling = $('#bundlingSelect option:selected');
|
||||
if (selectedBundling.val()) {
|
||||
var bundlingId = selectedBundling.val();
|
||||
var exists = false;
|
||||
$('#bundlingsTable tbody tr').each(function () {
|
||||
if ($(this).data('bundling-id') == bundlingId) {
|
||||
exists = true;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
if (exists) {
|
||||
alert('Эта комплектация уже добавлена.');
|
||||
return;
|
||||
}
|
||||
|
||||
var bundlingName = selectedBundling.text();
|
||||
var bundlingPrice = selectedBundling.data('price');
|
||||
|
||||
var newRow = `
|
||||
<tr data-bundling-id="${bundlingId}">
|
||||
<td>
|
||||
<input type="hidden" name="bundlingIds" value="${bundlingId}" />
|
||||
${bundlingId}
|
||||
</td>
|
||||
<th> </th>
|
||||
<td class="bundling-price" data-price="${bundlingPrice}">${bundlingPrice}</td>
|
||||
<th> </th>
|
||||
<td><button type="button" class="deleteBundling" data-bundling-id="${bundlingId}">Удалить</button></td>
|
||||
</tr>
|
||||
`;
|
||||
$('#bundlingsTable tbody').append(newRow);
|
||||
|
||||
$('.deleteBundling').off('click').on('click', function () {
|
||||
var row = $(this).closest('tr');
|
||||
row.remove();
|
||||
updateSum();
|
||||
});
|
||||
|
||||
$('#bundlingSelect').val('');
|
||||
|
||||
updateSum();
|
||||
} else {
|
||||
alert('Выберите комплектацию для добавления');
|
||||
}
|
||||
});
|
||||
|
||||
$('#addRequest').click(function () {
|
||||
var selectedRequest = $('#requestSelect option:selected');
|
||||
if (selectedRequest.val()) {
|
||||
var requestId = selectedRequest.val();
|
||||
var exists = false;
|
||||
$('#requestsTable tbody tr').each(function () {
|
||||
if ($(this).data('request-id') == requestId) {
|
||||
exists = true;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
if (exists) {
|
||||
alert('Это пожелание уже добавлено.');
|
||||
return;
|
||||
}
|
||||
|
||||
var requestName = selectedRequest.text();
|
||||
|
||||
var newRow = `
|
||||
<tr data-request-id="${requestId}">
|
||||
<td>
|
||||
<input type="hidden" name="requestIds" value="${requestId}" />
|
||||
${requestId}
|
||||
</td>
|
||||
<th> </th>
|
||||
<td><button type="button" class="deleteRequest" data-request-id="${requestId}">Удалить</button></td>
|
||||
</tr>
|
||||
`;
|
||||
$('#requestsTable tbody').append(newRow);
|
||||
|
||||
$('.deleteRequest').off('click').on('click', function () {
|
||||
var row = $(this).closest('tr');
|
||||
row.remove();
|
||||
updateSum();
|
||||
});
|
||||
|
||||
$('#requestSelect').val('');
|
||||
|
||||
updateSum();
|
||||
} else {
|
||||
alert('Выберите комплектацию для добавления');
|
||||
}
|
||||
});
|
||||
|
||||
$('#presaleForm').submit(function (event) {
|
||||
var PresaleStatus = $('#PresaleStatus').val();
|
||||
var Description = $('#Description').val();
|
||||
var DueTill = $('#DueTill').val();
|
||||
var Price = $('#Price').val();
|
||||
var isValid = true;
|
||||
|
||||
$('#PresaleStatusError').text('');
|
||||
$('#DescriptionError').text('');
|
||||
$('#DueTillError').text('');
|
||||
$('#PriceError').text('');
|
||||
var totalBundlings = $('#bundlingsTable tbody tr').length;
|
||||
if (totalBundlings == 0) {
|
||||
alert('Пожалуйста, добавьте хотя бы одну комплектацию.');
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
var totalRequests = $('#requestsTable tbody tr').length;
|
||||
if (totalRequests == 0) {
|
||||
alert('Пожалуйста, добавьте хотя бы одно пожелание.');
|
||||
isValid = false;
|
||||
}
|
||||
|
||||
if (!isValid) {
|
||||
event.preventDefault();
|
||||
}
|
||||
});
|
||||
|
||||
updateSum();
|
||||
});
|
||||
</script>
|
||||
|
@ -1,55 +0,0 @@
|
||||
@using CarCenterContracts.ViewModels;
|
||||
@using CarCenterDataModels.Enums;
|
||||
|
||||
@model RequestViewModel;
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "CreateRequest";
|
||||
}
|
||||
<div class="text-center">
|
||||
<h2 class="display-4">Пожелание</h2>
|
||||
</div>
|
||||
<form id="featureForm" method="post">
|
||||
<input type="text" name="id" id="id" value="@Model.Id" hidden="hidden" />
|
||||
<div class="row">
|
||||
<div class="col-4">Описание пожелания:</div>
|
||||
<div class="col-8">
|
||||
<input type="text" name="Description" id="Description" value="@Model.Description" />
|
||||
<span id="DescriptionError" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4">Тип пожелания:</div>
|
||||
<div class="col-8">
|
||||
<select name="RequestType" id="RequestType" value="@Model.RequestType">
|
||||
@foreach (var value in Enum.GetValues(typeof(RequestTypes)))
|
||||
{
|
||||
<option value="@value">@value</option>
|
||||
}
|
||||
</select>
|
||||
<span id="RequestTypeError" 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 () {
|
||||
$('#requestForm').submit(function (event) {
|
||||
var RequestType = $('#RequestType').val();
|
||||
var Description = $('#Description').val();
|
||||
var isValid = true;
|
||||
$('#RequestTypeError').text('');
|
||||
$('#DescriptionError').text('');
|
||||
|
||||
|
||||
if (!isValid) {
|
||||
event.preventDefault();
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
@ -1,21 +1,23 @@
|
||||
@{
|
||||
ViewData["Title"] = "Enter";
|
||||
@{
|
||||
ViewData["Title"] = "Enter";
|
||||
}
|
||||
|
||||
<div class="text-center">
|
||||
<h2 class="display-4">Вход в приложение</h2>
|
||||
<h2 class="display-4">Вход в приложение</h2>
|
||||
</div>
|
||||
<form method="post">
|
||||
<div class="row">
|
||||
<div class="col-4">Логин:</div>
|
||||
<div class="col-8"><input type="text" name="login" /></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4">Пароль:</div>
|
||||
<div class="col-8"><input type="password" name="password" /></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>
|
||||
<div class="row">
|
||||
<div class="col-4">Логин(почта):</div>
|
||||
<div class="col-8"><input type="email" name="email" /></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4">Пароль:</div>
|
||||
<div class="col-8"><input type="password" name="password" /></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>
|
@ -3,14 +3,5 @@
|
||||
}
|
||||
|
||||
<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="IndexRequest">Пожелания</a>
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="IndexPresale">Предпродажные</a>
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="IndexOrder">Покупки</a>
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Личные данные</a>
|
||||
@* <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="ReportsMenu">Меню отчетов</a> *@
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Logout">Выйти</a>
|
||||
|
||||
</div>
|
||||
<img src="./Images/cat.png" alt="logo">
|
||||
</div>
|
||||
|
@ -1,10 +0,0 @@
|
||||
@{
|
||||
ViewData["Title"] = "Home Page";
|
||||
}
|
||||
|
||||
<div class="text-center">
|
||||
<div class="list-group">
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Enter">Вход</a>
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Register">Регистрация</a>
|
||||
</div>
|
||||
</div>
|
@ -1,94 +0,0 @@
|
||||
@using CarCenterContracts.ViewModels;
|
||||
|
||||
@model List<OrderViewModel>
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "Orders";
|
||||
}
|
||||
|
||||
<div class="text-center">
|
||||
<h1 class="display-4">Покупки</h1>
|
||||
</div>
|
||||
|
||||
<div class="text-center">
|
||||
@{
|
||||
if (Model == null)
|
||||
{
|
||||
<h3 class="display-4">Авторизируйтесь</h3>
|
||||
return;
|
||||
}
|
||||
<p>
|
||||
<a asp-action="CreateOrder" asp-route-id="0">Создать покупку</a>
|
||||
</p>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
Номер
|
||||
</th>
|
||||
<th>
|
||||
Тип оплаты
|
||||
</th>
|
||||
<th>
|
||||
Статус оплаты
|
||||
</th>
|
||||
<th>
|
||||
Дата оплаты
|
||||
</th>
|
||||
<th>
|
||||
ФИО покупателя
|
||||
</th>
|
||||
<th>
|
||||
Имя работника
|
||||
</th>
|
||||
<th>
|
||||
Сумма
|
||||
</th>
|
||||
<th>
|
||||
Изменить покупку
|
||||
</th>
|
||||
<th>
|
||||
Удалить покупку
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var item in Model)
|
||||
{
|
||||
<tr>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.Id)
|
||||
</td>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.PaymentType)
|
||||
</td>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.PaymentStatus)
|
||||
</td>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.PaymentDate)
|
||||
</td>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.BuyerFCS)
|
||||
</td>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.WorkerName)
|
||||
</td>
|
||||
<td>
|
||||
@Html.DisplayFor(modelItem => item.Sum)
|
||||
</td>
|
||||
<td>
|
||||
<a asp-action="CreateOrder" asp-route-id="@item.Id" class="btn btn-primary">Изменить</a>
|
||||
</td>
|
||||
<td>
|
||||
<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>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
}
|
||||
</div>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user