Files
everything/EveryThing/Pages/Projects/Edit.cshtml.cs
David Štaleker db0cc8d3de prvi
2025-07-18 05:33:16 +02:00

745 lines
32 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
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 EveryThing.Data;
using EveryThing.Models;
using EveryThing.Models.Project;
using System.Text.Json;
using EveryThing.Models.CodeTable;
using DocumentFormat.OpenXml.InkML;
using EveryThing.Models.Invoice;
using EveryThing.Models.Vehicle;
using static EveryThing.Pages.CodeTableVehicleFuelTypes.IndexModel;
using DocumentFormat.OpenXml.Spreadsheet;
using NuGet.Packaging;
namespace EveryThing.Pages.Projects
{
[Authorize(Roles = "Administrator,ProjecThingUser")]
public class EditModel : PageModel
{
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<IdentityApplicationUser> _userManager;
private readonly SignInManager<IdentityApplicationUser> _loginManager;
private readonly RoleManager<IdentityApplicationRole> _roleManager;
public EditModel(ApplicationDbContext context, UserManager<IdentityApplicationUser> userManager, SignInManager<IdentityApplicationUser> loginManager, RoleManager<IdentityApplicationRole> roleManager)
{
_context = context;
_userManager = userManager;
_loginManager = loginManager;
_roleManager = roleManager;
}
[BindProperty]
public Models.Project.Project Project { get; set; }
public IList<ProjectPart> Parts { get; set; }
public IList<ProjectPartItem> PartItems { get; set; }
public IList<Models.Invoice.Invoice> Invoices { get; set; }
public IList<Models.File> FilesProject { get; set; }
public IList<Models.File> FilesProjectParts { get; set; }
public async Task<IActionResult> 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();
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<IActionResult> 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 OnPostCreateOrder(string itemsJson, bool inquiry)
{
var user = _userManager.GetUserAsync(User).Result;
var itemsId = JsonSerializer.Deserialize<List<int>>(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();
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 => x.IdMaterialSupplierFk == idSupplier))
{
var newInvoiceItem = new Models.Invoice.InvoiceItem
{
Discount = 0,
IdInvoiceFk = idInvoice,
IdProjectPartItem = projectPartItem.IdProjectPartItem,
IdItemFk = projectPartItem.IdMaterialFk,
ItemDescription = projectPartItem.MaterialDimensions,
Note = "",
Price = projectPartItem.MaterialPrice,
//Quantity = projectPartItem.NumberOfItems * projectPartItem.NumberOfSets
Quantity = projectPartItem.NumberOfItems
};
_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<List<int>>(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<ProjectPartItem>(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: <b>{x.Sum(y => y.WorkValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))}&nbsp;€</b>"
+ $"<br/>Strošek material: <b>{x.Sum(y => y.MaterialValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))}&nbsp;€</b>"
+ $"<br/>Strošek skupaj: <b>{x.Sum(y => y.WorkValue + y.MaterialValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))}&nbsp;€</b>"
+ $"<br/>Prodajna vrednost: <b>{x.Sum(y => y.SellingValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))}&nbsp;€</b>"
+ $"<br/>Razlika: <b>{x.Sum(y => y.DifferenceInPriceValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))}&nbsp;€</b>"
}).ToList(),
project = new
{
text = $"Strošek delo: <b>{projectPartItems.Sum(y => y.WorkValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))}&nbsp;€</b>"
+ $"<br/>Strošek material: <b>{projectPartItems.Sum(y => y.MaterialValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))}&nbsp;€</b>"
+ $"<br/>Strošek skupaj: <b>{projectPartItems.Sum(y => y.WorkValue + y.MaterialValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))}&nbsp;€</b>"
+ $"<br/>Prodajna vrednost: <b>{projectPartItems.Sum(y => y.SellingValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))}&nbsp;€</b>"
+ $"<br/>Razlika: <b>{projectPartItems.Sum(y => y.DifferenceInPriceValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))}&nbsp;€</b>"
},
};
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<List<int>>(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<List<int>>(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 });
}
}
}