881 lines
37 KiB
C#
881 lines
37 KiB
C#
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<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();
|
|
|
|
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<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 OnPostCreateCooperation(string itemsJson, int idPartner)
|
|
{
|
|
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();
|
|
|
|
if (idPartner > 0) //vse na izbranega partnerja
|
|
suppliers = new List<int?> { 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<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();
|
|
|
|
if (idPartner > 0) //vse na izbranega partnerja
|
|
suppliers = new List<int?> { 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<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"))} €</b>"
|
|
+ $"<br/>Strošek material: <b>{x.Sum(y => y.MaterialValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))} €</b>"
|
|
+ $"<br/>Strošek skupaj: <b>{x.Sum(y => y.WorkValue + y.MaterialValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))} €</b>"
|
|
+ $"<br/>Prodajna vrednost: <b>{x.Sum(y => y.SellingValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))} €</b>"
|
|
+ $"<br/>Razlika: <b>{x.Sum(y => y.DifferenceInPriceValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))} €</b>"
|
|
}).ToList(),
|
|
project = new
|
|
{
|
|
text = $"Strošek delo: <b>{projectPartItems.Sum(y => y.WorkValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))} €</b>"
|
|
+ $"<br/>Strošek material: <b>{projectPartItems.Sum(y => y.MaterialValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))} €</b>"
|
|
+ $"<br/>Strošek skupaj: <b>{projectPartItems.Sum(y => y.WorkValue + y.MaterialValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))} €</b>"
|
|
+ $"<br/>Prodajna vrednost: <b>{projectPartItems.Sum(y => y.SellingValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))} €</b>"
|
|
+ $"<br/>Razlika: <b>{projectPartItems.Sum(y => y.DifferenceInPriceValue).ToString("#,###,##0.00", new CultureInfo("sl-SI"))} €</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 });
|
|
}
|
|
|
|
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 = ""});
|
|
}
|
|
}
|
|
}
|