using DocumentFormat.OpenXml.InkML; using DocumentFormat.OpenXml.Spreadsheet; using EveryThing.Data; using EveryThing.Models; using EveryThing.Models.CodeTable; using EveryThing.Models.Invoice; using EveryThing.Models.Project; using EveryThing.Models.Vehicle; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.EntityFrameworkCore; using NuGet.Packaging; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text.Json; using System.Threading.Tasks; using static EveryThing.Pages.CodeTableItems.IndexModel; using static EveryThing.Pages.CodeTableVehicleFuelTypes.IndexModel; namespace EveryThing.Pages.Projects { [Authorize(Roles = "Administrator,ProjecThingUser")] public class EditModel : PageModel { public class LinkToBuyersOrderData { public int IdProject { get; set; } public SelectList SelectListOrders { get; set; } public int IdOrder { get; set; } } public class EditProjectPartData { public ProjectPartItem Item { get; set; } public SelectList SelectListItems { get; set; } public SelectList SelectListMaterials { get; set; } public SelectList SelectListSuppliers { get; set; } } private readonly ApplicationDbContext _context; private readonly UserManager _userManager; private readonly SignInManager _loginManager; private readonly RoleManager _roleManager; public EditModel(ApplicationDbContext context, UserManager userManager, SignInManager loginManager, RoleManager roleManager) { _context = context; _userManager = userManager; _loginManager = loginManager; _roleManager = roleManager; } [BindProperty] public Models.Project.Project Project { get; set; } public IList Parts { get; set; } public IList PartItems { get; set; } public IList Invoices { get; set; } public IList FilesProject { get; set; } public IList FilesProjectParts { get; set; } public async Task OnGetAsync(int? id) { if (id == null) { return NotFound(); } var user = _userManager.GetUserAsync(User).Result; ViewData["IdPartnerFk"] = new SelectList(_context.CodeTablePartners .Where(x => x.IdCompanyFk == user.IdCompanyFk && x.Active && x.Buyer) .OrderBy(x => x.Title), "IdPartner", "Title"); Project = await _context.Projects.FirstOrDefaultAsync(m => m.IdProject == id && m.IdCompanyFk == user.IdCompanyFk); if (Project == null) { return NotFound(); } Parts = await _context.ProjectParts .Include(c => c.ProjectPartProjectPartItem) .ThenInclude(x => x.MaterialSupplier) .Include(c => c.ProjectPartProjectPartItem) .ThenInclude(x => x.Material) .Include(c => c.ProjectPartProjectPartItem) .ThenInclude(x => x.Item) .Where(x => x.IdProjectFk == id) .OrderBy(x => x.ProjectPartNumber).ThenBy(x => x.IdProjectPart) .ToListAsync(); Invoices = await _context.Invoices .Include(x => x.Partner) .Include(x => x.InvoiceInvoiceItem) .ThenInclude(x => x.ProjectPartItem) .ThenInclude(x => x.ProjectPart) .Where(x => x.InvoiceInvoiceItem.Any(x => x.ProjectPartItem.ProjectPart.IdProjectFk == id)) .OrderBy(x => x.InvoiceYear).ThenBy(x => x.InvoiceNumber) .ToListAsync(); Invoices.AddRange(await _context.Invoices .Include(x => x.Project) .Include(x => x.InvoiceInvoiceItem) .Where(x => x.IdProjectFk == id).ToArrayAsync()); FilesProject = await _context.Files .Where(x => x.IdCompanyFk == user.IdCompanyFk && x.IdReferenceFk == Project.IdProject && x.FileType == FileType.Project) .ToListAsync(); FilesProjectParts = await _context.Files .Where(x => x.IdCompanyFk == user.IdCompanyFk && Parts.Select(x => x.IdProjectPart).Contains(x.IdReferenceFk) && x.FileType == FileType.ProjectPart) .ToListAsync(); return Page(); } public async Task OnPostAsync() { if (!ModelState.IsValid) { return Page(); } _context.Attach(Project).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!ProjectExists(Project.IdProject)) { return NotFound(); } else { throw; } } return RedirectToPage("./Edit", new { id = Project.IdProject}); } private bool ProjectExists(int id) { return _context.Projects.Any(e => e.IdProject == id); } public IActionResult OnGetEditPartItem(int id) { var user = _userManager.GetUserAsync(User).Result; var item = _context.ProjectPartItems .Include(x => x.MaterialSupplier) .Include(x => x.Item) .Include(x => x.Material) .Include(x => x.ProjectPart) .ThenInclude(x => x.Project) .First(x => x.IdProjectPartItem == id); var selListItems = new SelectList(_context.CodeTableItems.Where(x => x.IdCompanyFk == user.IdCompanyFk && x.Active && x.CodeTableItemType == CodeTableItemType.Product).OrderBy(x => x.Title), "IdItem", "Title"); var selListMaterials = new SelectList(_context.CodeTableItems.Where(x => x.IdCompanyFk == user.IdCompanyFk && x.Active && x.CodeTableItemType == CodeTableItemType.Material).OrderBy(x => x.Title), "IdItem", "Title"); var selListSuppliers = new SelectList(_context.CodeTablePartners.Where(x => x.IdCompanyFk == user.IdCompanyFk && x.Active && x.Supplier).OrderBy(x => x.Title), "IdPartner", "Title"); return Partial("EditPartItem", new EditProjectPartData { Item = item, SelectListItems = selListItems, SelectListMaterials = selListMaterials, SelectListSuppliers = selListSuppliers }); } public IActionResult OnGetDetailPartItem(int id) { var item = _context.ProjectPartItems .Include(x => x.ProjectPart) .Include(x => x.MaterialSupplier) .Include(x => x.Item) .Include(x => x.Material) .Include(x => x.ProjectPart) .ThenInclude(x => x.Project) .First(x => x.IdProjectPartItem == id); return Partial("DetailsPartItem", item); } public IActionResult OnPostCreateCooperation(string itemsJson, int idPartner) { var user = _userManager.GetUserAsync(User).Result; var itemsId = JsonSerializer.Deserialize>(itemsJson); var items = _context.ProjectPartItems .Include(x => x.ProjectPart) .ThenInclude(x => x.Project) .Where(x => itemsId.Contains(x.IdProjectPartItem)).ToList(); var suppliers = _context.ProjectPartItems .Where(x => itemsId.Contains(x.IdProjectPartItem)) .Select(x => x.IdMaterialSupplierFk).Distinct().ToList(); if (idPartner > 0) //vse na izbranega partnerja suppliers = new List { idPartner }; var idInvoice = -1; foreach (var idSupplier in suppliers) { var invoice = _context.Invoices .Include(x => x.InvoiceInvoiceItem) .ThenInclude(x => x.ProjectPartItem) .ThenInclude(x => x.ProjectPart) .Where(x => x.State == Models.Invoice.Invoice.InvoiceState.New && x.Type == Models.Invoice.Invoice.InvoiceType.Cooperation //Ce ze kateri item obstaja na dobavnici && x.InvoiceInvoiceItem.Any(invoiceItem => items.Select(item => item.ProjectPart.IdProjectFk).Contains(invoiceItem.ProjectPartItem.ProjectPart.IdProjectFk))) .FirstOrDefault(x => x.IdPartnerFk == idSupplier); if (invoice == null) { //Create new invoice var newInvoice = new Models.Invoice.Invoice(); Pages.Invoices.CreateModel.SetNewInvoice(user.IdCompanyFk, Models.Invoice.Invoice.InvoiceType.Cooperation, ref newInvoice, _context); newInvoice.IdPartnerFk = idSupplier; newInvoice.Date = DateTime.Now.Date; _context.Invoices.Add(newInvoice); _context.SaveChanges(); idInvoice = newInvoice.IdInvoice; } else { //Add to existing invoice idInvoice = invoice.IdInvoice; } foreach (var projectPartItem in items.Where(x => idPartner > 0 || //ce damo vse na izbranega partnerja x.IdMaterialSupplierFk == idSupplier)) { var newInvoiceItem = new Models.Invoice.InvoiceItem { Discount = 0, IdInvoiceFk = idInvoice, IdProjectPartItem = projectPartItem.IdProjectPartItem, IdItemFk = projectPartItem.IdItemFk, ItemDescription = "", Note = "", Price = projectPartItem.MaterialPrice, Quantity = projectPartItem.NumberOfItems * projectPartItem.NumberOfSets }; _context.InvoiceItems.Add(newInvoiceItem); projectPartItem.Status = ProjectPartItemStatus.InCooperation; } _context.SaveChanges(); } return new JsonResult(new { error = "", successful = true, idInvoice }); } public IActionResult OnPostCreateOrder(string itemsJson, bool inquiry, int idPartner, int positionsType) { var user = _userManager.GetUserAsync(User).Result; var itemsId = JsonSerializer.Deserialize>(itemsJson); var items = _context.ProjectPartItems .Include(x => x.ProjectPart) .ThenInclude(x => x.Project) .Where(x => itemsId.Contains(x.IdProjectPartItem)).ToList(); var suppliers = _context.ProjectPartItems .Where(x => itemsId.Contains(x.IdProjectPartItem)) .Select(x => x.IdMaterialSupplierFk).Distinct().ToList(); if (idPartner > 0) //vse na izbranega partnerja suppliers = new List { idPartner }; var idInvoice = -1; foreach (var idSupplier in suppliers) { var invoice = _context.Invoices .Include(x => x.InvoiceInvoiceItem) .ThenInclude(x => x.ProjectPartItem) .ThenInclude(x => x.ProjectPart) .Where(x => ((!inquiry && x.State == Models.Invoice.Invoice.InvoiceState.New) || (inquiry && x.State == Models.Invoice.Invoice.InvoiceState.Inquiry)) && x.Type == Models.Invoice.Invoice.InvoiceType.Order //Ce ze kateri item obstaja na dobavnici && x.InvoiceInvoiceItem.Any(invoiceItem => items.Select(item => item.ProjectPart.IdProjectFk).Contains(invoiceItem.ProjectPartItem.ProjectPart.IdProjectFk))) .FirstOrDefault(x => x.IdPartnerFk == idSupplier); if (invoice == null) { //Create new invoice var newInvoice = new Models.Invoice.Invoice(); Pages.Invoices.CreateModel.SetNewInvoice(user.IdCompanyFk, Models.Invoice.Invoice.InvoiceType.Order, ref newInvoice, _context); newInvoice.IdPartnerFk = idSupplier; newInvoice.Date = DateTime.Now.Date; if (inquiry) newInvoice.State = Invoice.InvoiceState.Inquiry; _context.Invoices.Add(newInvoice); _context.SaveChanges(); idInvoice = newInvoice.IdInvoice; } else { //Add to existing invoice idInvoice = invoice.IdInvoice; } foreach (var projectPartItem in items.Where(x => idPartner > 0 || //ce damo vse na izbranega partnerja x.IdMaterialSupplierFk == idSupplier)) { var newInvoiceItem = new Models.Invoice.InvoiceItem { Discount = 0, IdInvoiceFk = idInvoice, IdProjectPartItem = projectPartItem.IdProjectPartItem, Note = "", Price = projectPartItem.MaterialPrice, Quantity = projectPartItem.NumberOfItems }; if (positionsType == 2) { newInvoiceItem.IdItemFk = projectPartItem.IdItemFk; } else { newInvoiceItem.IdItemFk = projectPartItem.IdMaterialFk; newInvoiceItem.ItemDescription = projectPartItem.MaterialDimensions; } _context.InvoiceItems.Add(newInvoiceItem); } _context.SaveChanges(); } return new JsonResult(new { error = "", successful = true, idInvoice}); } public IActionResult OnPostCreateDeliveryNote(string itemsJson) { var user = _userManager.GetUserAsync(User).Result; var itemsId = JsonSerializer.Deserialize>(itemsJson); var items = _context.ProjectPartItems .Include(x => x.ProjectPart) .ThenInclude(x => x.Project) .Where(x => itemsId.Contains(x.IdProjectPartItem)).ToList(); if (!items.Any()) return new OkResult(); var idPartner = items.First().ProjectPart.Project.IdPartnerFk; var invoice = _context.Invoices .Include(x => x.InvoiceInvoiceItem) .ThenInclude(x => x.ProjectPartItem) .ThenInclude(x => x.ProjectPart) .Where(x => x.State == Models.Invoice.Invoice.InvoiceState.New && x.Type == Models.Invoice.Invoice.InvoiceType.DeliveryNote //Ce ze kateri item obstaja na dobavnici && x.InvoiceInvoiceItem.Any(invoiceItem => items.Select(item => item.ProjectPart.IdProjectFk).Contains(invoiceItem.ProjectPartItem.ProjectPart.IdProjectFk))) .FirstOrDefault(x => x.IdPartnerFk == idPartner); int idInvoice; if (invoice == null) { //Create new invoice var newInvoice = new Models.Invoice.Invoice(); Pages.Invoices.CreateModel.SetNewInvoice(user.IdCompanyFk, Models.Invoice.Invoice.InvoiceType.DeliveryNote, ref newInvoice, _context); newInvoice.IdPartnerFk = idPartner; newInvoice.Date = DateTime.Now.Date; newInvoice.DateOfDispatch = DateTime.Now.Date; newInvoice.BuyersOrderNumber = items.First().ProjectPart.Project.BuyersOrderNumber; _context.Invoices.Add(newInvoice); _context.SaveChanges(); idInvoice = newInvoice.IdInvoice; } else { //Add to existing invoice idInvoice = invoice.IdInvoice; } foreach (var projectPartItem in items) { var newInvoiceItem = new Models.Invoice.InvoiceItem { Discount = 0, IdInvoiceFk = idInvoice, IdProjectPartItem = projectPartItem.IdProjectPartItem, IdItemFk = projectPartItem.IdItemFk, ItemDescription = "", Note = "", Price = projectPartItem.SellingPrice, //Quantity = projectPartItem.NumberOfItems * projectPartItem.NumberOfSets Quantity = projectPartItem.NumberOfItems * projectPartItem.NumberOfSets }; projectPartItem.Status = ProjectPartItemStatus.Shipped; projectPartItem.ShippingDate = DateTime.Now; _context.InvoiceItems.Add(newInvoiceItem); } _context.SaveChanges(); return new OkResult(); } public IActionResult OnPostUpdatePartItem(int idItem, string json) { var user = _userManager.GetUserAsync(User).Result; var tmpItem = JsonSerializer.Deserialize(json); var item = _context.ProjectPartItems .Include(x => x.ProjectPart) .ThenInclude(x => x.Project) .FirstOrDefault(x => x.IdProjectPartItem == idItem && x.ProjectPart.Project.IdCompanyFk == user.IdCompanyFk); if (item == null) { return new JsonResult(new { error = $"Project part item with id {idItem} not exists!", successful = false}); } item.DateModified = DateTime.Now; item.IdItemFk = tmpItem.IdItemFk; item.NumberOfSets = tmpItem.NumberOfSets; item.NumberOfItems = tmpItem.NumberOfItems; item.IdMaterialFk = tmpItem.IdMaterialFk; item.MaterialDimensions = tmpItem.MaterialDimensions; item.IdMaterialSupplierFk = tmpItem.IdMaterialSupplierFk; item.MaterialPrice = tmpItem.MaterialPrice; item.WorkPrice = tmpItem.WorkPrice; item.Status = tmpItem.Status; item.DeliveryDate = tmpItem.DeliveryDate; item.SellingPrice = tmpItem.SellingPrice; _context.SaveChanges(); return new JsonResult(new { error = "", successful = true }); } public IActionResult OnDeletePartItem(int idPartItem) { var user = _userManager.GetUserAsync(User).Result; var successful = true; var error = ""; var item = _context.ProjectPartItems .Include(x=>x.ProjectPart) .ThenInclude(x => x.Project) .Include(x=> x.InvoiceItem) .FirstOrDefault(x => x.IdProjectPartItem == idPartItem && x.ProjectPart.Project.IdCompanyFk == user.IdCompanyFk); if (item == null) { return new JsonResult(new { error = $"Project part item with id {idPartItem} not exists!", successful = false }); } if (item.InvoiceItem.Count > 0) { return new JsonResult(new { error = $"Pozicija ima povezane fakture!\nBrisanje ni možno!", successful = false }); } _context.ProjectPartItems.Remove(item); _context.SaveChanges(); return new JsonResult(new { error = "", successful = true}); } public IActionResult OnPostCopyProjectPart(int idProjectPart) { var user = _userManager.GetUserAsync(User).Result; bool successful = true; string error = ""; var projectPart = _context.ProjectParts .Include(x => x.Project) .Where(x => x.Project.IdCompanyFk == user.IdCompanyFk) .FirstOrDefault(x => x.IdProjectPart == idProjectPart); if (projectPart != null) { var newProjectPart = new ProjectPart { IdProjectFk = projectPart.IdProjectFk, Description = projectPart.Description, //FinishedDate = item.FinishedDate, PathOfPlans = projectPart.PathOfPlans, ShippedDate = projectPart.ShippedDate, Status = projectPart.Status, Title = projectPart.Title, ProjectPartNumber = _context.ProjectParts.Where(x => x.IdProjectFk == projectPart.IdProjectFk).Max(x => x.ProjectPartNumber) + 1 }; if (newProjectPart.ProjectPartNumber <= 0) newProjectPart.ProjectPartNumber = 1; _context.ProjectParts.Add(newProjectPart); _context.SaveChanges(); var projectPartItemCounter = 1; foreach (var projectPartItem in _context.ProjectPartItems.Where(x => x.IdProjectPartFk == projectPart.IdProjectPart)) { var newProjectPartItem = new ProjectPartItem { IdItemFk = projectPartItem.IdItemFk, IdMaterialFk = projectPartItem.IdMaterialFk, IdMaterialSupplierFk = projectPartItem.IdMaterialSupplierFk, IdProjectPartFk = newProjectPart.IdProjectPart, MaterialDimensions = projectPartItem.MaterialDimensions, MaterialPrice = projectPartItem.MaterialPrice, NumberOfItems = projectPartItem.NumberOfItems, NumberOfItemsFinished = projectPartItem.NumberOfItemsFinished, WorkPrice = projectPartItem.WorkPrice, NumberOfSets = projectPartItem.NumberOfSets, Status = ProjectPartItemStatus.Opened, ProjectPartItemNumber = projectPartItemCounter }; _context.ProjectPartItems.Add(newProjectPartItem); projectPartItemCounter++; } _context.SaveChanges(); } else { successful = false; error = $"Project part with ID: {idProjectPart} not found"; } return new JsonResult(new { error, successful }); } public IActionResult OnGetProjectPart(int idProjectPart) { var user = _userManager.GetUserAsync(User).Result; var successful = true; var error = ""; var inUse = false; var projectPart = _context.ProjectParts .Include(x => x.Project) .Include(x => x.ProjectPartProjectPartItem) .ThenInclude(x => x.InvoiceItem) .FirstOrDefault(x => x.IdProjectPart == idProjectPart && x.Project.IdCompanyFk == user.IdCompanyFk); if (projectPart == null) { successful = false; error = $"Project part with ID: {idProjectPart} not found"; } else { inUse = projectPart.ProjectPartProjectPartItem.Any(x => x.InvoiceItem.Count > 0); //Cene se json zacikla neki IDK. projectPart.Project = null; projectPart.ProjectPartProjectPartItem = null; } return new JsonResult(new { projectPart, error, successful, inUse }); } public IActionResult OnGetProjectPriceDetails(int idProject) { var user = _userManager.GetUserAsync(User).Result; var successful = true; var error = ""; var projectPartItems = _context.ProjectPartItems .Include(x => x.ProjectPart) .ThenInclude(x => x.Project) .Where(x => x.ProjectPart.IdProjectFk == idProject && x.ProjectPart.Project.IdCompanyFk == user.IdCompanyFk) .ToList(); var totals = new { parts = projectPartItems .GroupBy(x => x.ProjectPart) .Select(x => new { idProjectPart = x.Key.IdProjectPart, text = $"Strošek delo: {x.Sum(y => y.WorkValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))} €" + $"
Strošek material: {x.Sum(y => y.MaterialValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))} €" + $"
Strošek skupaj: {x.Sum(y => y.WorkValue + y.MaterialValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))} €" + $"
Prodajna vrednost: {x.Sum(y => y.SellingValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))} €" + $"
Razlika: {x.Sum(y => y.DifferenceInPriceValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))} €" }).ToList(), project = new { text = $"Strošek delo: {projectPartItems.Sum(y => y.WorkValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))} €" + $"
Strošek material: {projectPartItems.Sum(y => y.MaterialValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))} €" + $"
Strošek skupaj: {projectPartItems.Sum(y => y.WorkValue + y.MaterialValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))} €" + $"
Prodajna vrednost: {projectPartItems.Sum(y => y.SellingValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))} €" + $"
Razlika: {projectPartItems.Sum(y => y.DifferenceInPriceValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))} €" }, }; return new JsonResult(new { totals, error, successful }); } public IActionResult OnDeleteProjectPart(int idProjectPart) { var user = _userManager.GetUserAsync(User).Result; var successful = true; var error = ""; var projectPart = _context.ProjectParts .Include(x => x.Project) .FirstOrDefault(x => x.IdProjectPart == idProjectPart && x.Project.IdCompanyFk == user.IdCompanyFk); if (projectPart != null) { foreach (var projectPartItem in _context.ProjectPartItems.Where(x => x.IdProjectPartFk == projectPart.IdProjectPart).ToList()) { _context.ProjectPartItems.Remove(projectPartItem); } _context.ProjectParts.Remove(projectPart); _context.SaveChanges(); projectPart.Project = null; } else { successful = false; error = $"Project part with ID: {idProjectPart} not found"; } return new JsonResult(new { projectPart, error, successful }); } public IActionResult OnPostProjectPartAddMarginOnAllPositions(int idProjectPart, double value) { var user = _userManager.GetUserAsync(User).Result; var successful = true; var error = ""; var projectPart = _context.ProjectParts .Include(x => x.Project) .FirstOrDefault(x => x.IdProjectPart == idProjectPart && x.Project.IdCompanyFk == user.IdCompanyFk); if (projectPart != null) { var items = _context.ProjectPartItems .Where(x => x.IdProjectPartFk == projectPart.IdProjectPart); foreach (var item in items) { var costs = Convert.ToDouble(item.MaterialPrice) + Convert.ToDouble(item.WorkPrice); var newDifferenceInPricePercentage = item.DifferenceInPricePercentage + value; item.SellingPrice = Convert.ToSingle(costs * (newDifferenceInPricePercentage + 100.0) / 100.0); } _context.SaveChanges(); } else { successful = false; error = $"Project part with ID: {idProjectPart} not found"; } return new JsonResult(new { error, successful }); } public IActionResult OnPostProjectPartNewSaleValueForAllPositions(int idProjectPart, double value) { var user = _userManager.GetUserAsync(User).Result; var successful = true; var error = ""; var projectPart = _context.ProjectParts .Include(x => x.Project) .FirstOrDefault(x => x.IdProjectPart == idProjectPart && x.Project.IdCompanyFk == user.IdCompanyFk); if (projectPart != null) { var items = _context.ProjectPartItems .Where(x => x.IdProjectPartFk == projectPart.IdProjectPart); var totalCost = _context.ProjectPartItems .Where(x => x.IdProjectPartFk == projectPart.IdProjectPart) .ToList() .Sum(x => x.CostValue); var coefficient = Math.Round(value,2) / Math.Round(totalCost, 2); foreach (var item in items) { if (item.NumberOfItems * item.NumberOfSets == 0) item.SellingPrice = 0; else item.SellingPrice = Convert.ToSingle(Math.Round((coefficient * item.CostValue) / (item.NumberOfItems * item.NumberOfSets), 8)); } _context.SaveChanges(); } else { successful = false; error = $"Project part with ID: {idProjectPart} not found"; } return new JsonResult(new { error, successful }); } public IActionResult OnPostCreateInvoice(string itemsJson) { var user = _userManager.GetUserAsync(User).Result; var itemsId = JsonSerializer.Deserialize>(itemsJson); var deliveryNotes = _context.Invoices .Include(x => x.InvoiceInvoiceItem) .Where(x => itemsId.Contains(x.IdInvoice)).ToList(); if (!deliveryNotes.Any()) return new JsonResult(new { successful = false, error = "Delivery notes not found!" }); var idPartner = deliveryNotes.First().IdPartnerFk; var newInvoice = new Models.Invoice.Invoice(); Pages.Invoices.CreateModel.SetNewInvoice(user.IdCompanyFk, Models.Invoice.Invoice.InvoiceType.Invoice, ref newInvoice, _context); newInvoice.IdPartnerFk = idPartner; newInvoice.Date = DateTime.Now.Date; newInvoice.DateOfDispatch = deliveryNotes.Min(x => x.DateOfDispatch); newInvoice.BuyersOrderNumber = deliveryNotes.First().BuyersOrderNumber; _context.Invoices.Add(newInvoice); _context.SaveChanges(); var idInvoice = newInvoice.IdInvoice; foreach (var deliveryNote in deliveryNotes) { foreach (var invoiceItem in deliveryNote.InvoiceInvoiceItem) { var newInvoiceItem = new InvoiceItem { Discount = invoiceItem.Discount, IdInvoiceFk = idInvoice, IdProjectPartItem = invoiceItem.IdProjectPartItem, IdItemFk = invoiceItem.IdItemFk, ItemDescription = invoiceItem.ItemDescription, Note = invoiceItem.Note, Price = invoiceItem.Price, Quantity = invoiceItem.Quantity, IdInvoiceItemJoinFk = invoiceItem.IdInvoiceItem }; invoiceItem.State = InvoiceItem.InvoiceItemState.Closed; _context.InvoiceItems.Add(newInvoiceItem); } deliveryNote.State = Invoice.InvoiceState.Closed; } _context.SaveChanges(); return new JsonResult(new { successful = true, error = "", idInvoice }); } public IActionResult OnPostCreateOfferFromProject(int idProject, string itemsJson) { var user = _userManager.GetUserAsync(User).Result; var itemsId = JsonSerializer.Deserialize>(itemsJson); var project = _context.Projects .Include(x => x.Partner) .Include(x => x.ProjectProjectPart) .ThenInclude(x => x.ProjectPartProjectPartItem) .FirstOrDefault(x => x.IdProject == idProject ); if (project == null) return new JsonResult(new { successful = false, error = "Project not found!" }); var idPartner = project.IdPartnerFk; var newInvoice = new Invoice(); Pages.Invoices.CreateModel.SetNewInvoice(user.IdCompanyFk, Invoice.InvoiceType.BuyersOrder, ref newInvoice, _context); newInvoice.IdPartnerFk = idPartner; newInvoice.Date = DateTime.Now.Date; newInvoice.DateOfDispatch = project.ProjectProjectPart.Min(x => x.ProjectPartProjectPartItem.Where(x => itemsId.Contains(x.IdProjectPartItem)).Min(y => y.DeliveryDate)); newInvoice.State = Invoice.InvoiceState.Offer; newInvoice.BuyersOrderNumber = ""; _context.Invoices.Add(newInvoice); _context.SaveChanges(); var idInvoice = newInvoice.IdInvoice; foreach (var projectPart in project.ProjectProjectPart.OrderBy(x => x.ProjectPartNumber)) { foreach (var projectPartItem in projectPart.ProjectPartProjectPartItem.Where(x => itemsId.Contains(x.IdProjectPartItem)).OrderBy(x => x.ProjectPartItemNumber)) { var newInvoiceItem = new InvoiceItem { IdProjectPartItem = projectPartItem.IdProjectPartItem, Discount = 0, IdInvoiceFk = idInvoice, IdItemFk = projectPartItem.IdItemFk, ItemDescription = projectPartItem.MaterialDimensions, Note = "", Price = projectPartItem.SellingPrice, Quantity = projectPartItem.NumberOfItems * projectPartItem.NumberOfSets }; _context.InvoiceItems.Add(newInvoiceItem); } } _context.SaveChanges(); return new JsonResult(new { successful = true, error = "", idInvoice }); } public IActionResult OnGetLinkToProjectData(int idProject) { var user = _userManager.GetUserAsync(User).Result; var selListOrders = new SelectList(_context.Invoices.Include(x => x.Partner) .Where(x => x.Type == Invoice.InvoiceType.BuyersOrder && x.State == Invoice.InvoiceState.Offer) .OrderByDescending(x => x.InvoiceYear).ThenBy(x => x.InvoiceNumber).ToList(), "IdInvoice", "InvoiceNumberFormattedLong"); return Partial("ModalCreateLinkToBuyersOrders", new LinkToBuyersOrderData { SelectListOrders = selListOrders, IdProject = idProject }); } public IActionResult OnPostLinkProjectToBuyerOrder(int idProject, int idOrder) { var user = _userManager.GetUserAsync(User).Result; var project = _context.Projects.FirstOrDefault(x => x.IdProject == idProject); if (project == null) return new JsonResult(new { successful = false, error = $"Project with ID {idProject} not exists!" }); var invoice = _context.Invoices.FirstOrDefault(x => x.IdInvoice == idOrder); if (invoice == null) return new JsonResult(new { successful = false, error = $"Invoice with ID {idOrder} not exists!" }); invoice.IdProjectFk = project.IdProject; _context.SaveChanges(); return new JsonResult(new { successful = true, error = ""}); } } }