private bool OnAccept(ClientInvoice clientInvoice) { //pass invoice data the the ReceiptResult to be passed later on by //ReceiptResult to ReceiptResultViewModel NavigationService.Navigate(new ReceiptResult(clientInvoice)); return(true); }
//called by Reciept model with invoice data public ReceiptResult(ClientInvoice clientInvoice) { InitializeComponent(); var dataContext = ((ReceiptResultViewModel)DataContext); if (dataContext != null) { //pass invoice data to the view model dataContext.ClientInvoice = clientInvoice; } }
public void Export(ClientInvoice clientInvoice) { ExcelPackage excel = new ExcelPackage(); excel.Workbook.Worksheets.Add("Client"); FillClientData(excel, clientInvoice); foreach (var item in clientInvoice.LineInvoices) { GetExcelLine(excel, item); } SaveAsExcel(excel, FilePath); }
void AssignInvoiceValues(ref ClientInvoice inv, ref ClientInvoice item) { inv.Invoice_No = item.Invoice_No; inv.Date = item.Date; inv.PurchaseOrder_No = item.PurchaseOrder_No; inv.ProjectSite = item.ProjectSite; inv.WayBill_No = item.WayBill_No; inv.Description = item.Description; inv.Amount = item.Amount; inv.Vat_Nhil = item.Vat_Nhil; inv.VatValue = item.VatValue; inv.TotalAmount = item.TotalAmount; inv.Remarks = item.Remarks; }
public InvoiceViewModel() { AddInvoiceCommand = new RelayCommand(AddInvoice_E, AddInvoice_C); SaveInvoice = new RelayCommand(SaveInvoice_E, SaveInvoice_C); InvoiceHelper = new ClientInvoice(); DeleteInvoiceCommand = new RelayCommand(deleteInvoice_E, deleteInvoice_C); ClearCommand = new RelayCommand(Clear_E); //subscribe an event to be handled when ever the client list changes clientChanged += InvoiceViewModel_clientChanged; ViewInvoice = new RelayCommand(null, AddInvoice_C); ShowAllInvoices = new RelayCommand(null, ShowAllInvoice_C); SearchInvoiceCommand = new RelayCommand(_ => { if (invoiceFor == "Clients") { if (db1 != null) { SaveSearch(ref db1); } else { db.SaveChanges(); } db1 = new AppContext(); SearchInvoice(db1.Clients.Where(i => i.CompanyId == SelectedCompany.CompanyId).ToList(), new AppContext().Clients.Where(i => i.CompanyId == SelectedCompany.CompanyId).ToList()); } else if (invoiceFor == "Suppliers") { if (db1 != null) { SaveSearch(ref db1); } else { db.SaveChanges(); } db1 = new AppContext(); SearchInvoice(db1.Suppliers.Where(i => i.CompanyId == SelectedCompany.CompanyId).ToList(), new AppContext().Suppliers.Where(i => i.CompanyId == SelectedCompany.CompanyId).ToList()); } }); }
private void deleteInvoice_E(object obj) { if (MessageBox.Show("Are you sure you want to delete the selected Invoice", "Confirm delete", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { try { if (selectedInvoiceId == null || selectedInvoiceId < 0) { return; } if (invoiceFor == "Clients") { ClientInvoice iv = db.ClientInvoices.Find(selectedInvoiceId); db.Clients.Find(CurrentSelectedId).Invoices.Remove(iv); db.ClientInvoices.Remove(iv); AllClients.Where(i => i.ClientId == CurrentSelectedId).First().Invoices.Remove(iv); } else if (invoiceFor == "Suppliers") { SupplierInvoice iv = db.SupplierInvoices.Find(selectedInvoiceId); db.Suppliers.Find(CurrentSelectedId).Invoices.Remove(iv); db.SupplierInvoices.Remove(iv); AllSuppliers.Where(i => i.SupplierId == CurrentSelectedId).First().Invoices.Remove(iv); } db.SaveChanges(); refreshCs_E(null); selectedInvoiceId = -1; } catch { MessageBox.Show("Unable to Delete Invoice", "Deletion Failed", MessageBoxButton.OK, MessageBoxImage.Information); } } }
/// <summary> /// //opens a worksheet in the ExcelPackage object and fills it with clientInvoice's data /// </summary> private void FillClientData(ExcelPackage excel, ClientInvoice clientInvoice) { var headerRow = new List <string[]>() { new string[] { "Client Name", "Month", "Year", "Total Price", "", } }; // Determine the header range (e.g. A1:D1) string headerRange = "A1:" + Char.ConvertFromUtf32(headerRow[0].Length + 64) + "1"; // Target a worksheet var worksheet = excel.Workbook.Worksheets["Client"]; // Populate header row data worksheet.Cells[headerRange].LoadFromArrays(headerRow); worksheet.Cells[headerRange].Style.Font.Bold = true; worksheet.Cells[headerRange].Style.Font.Size = 14; worksheet.Cells[headerRange].Style.Font.Color.SetColor(System.Drawing.Color.Blue); var headerRowData = new List <string[]>() { new string[] { clientInvoice.ClientName, clientInvoice.Month.ToString(), clientInvoice.Year.ToString(), clientInvoice.TotalPrice.ToString(), "", } }; string headerRangeData = "A2:" + Char.ConvertFromUtf32(headerRowData[0].Length + 64) + "2"; worksheet.Cells[headerRangeData].LoadFromArrays(headerRowData); var cellData = new List <object[]>() ; cellData.Add(new object[] { "Line", "Package Price", "Out Of Package Total Price", "Total Price" }); foreach (var item in clientInvoice.LineInvoices) { cellData.Add(new object[] { item.LineNumber, item.PackagePrice, item.OutOfPackageTotalPrice, item.TotalPrice }); } worksheet.Cells[5, 2].LoadFromArrays(cellData); worksheet.Cells["A2:E2"].Style.Font.Bold = true; worksheet.Cells["B5:E5"].Style.Font.Bold = true; worksheet.DefaultColWidth = 25; }
private void SaveInvoice(string ClientId, string StartDate, string EndDate, int InvoiceNumber, long totalAmount, InvoiceStatusEnum status) { DateTime StartDateParse = DateTime.Parse(StartDate); DateTime EndDateParse = DateTime.Parse(EndDate); var ifExists = Db.Invoices.Any(x => x.ClientId.ToString() == ClientId && x.StartDate == StartDateParse && x.EndDate == EndDateParse); if (ifExists) { return; } var invoice = new ClientInvoice() { Id = Guid.NewGuid(), CreatedAt = DateTime.Now, ClientId = Guid.Parse(ClientId), StartDate = StartDateParse, EndDate = EndDateParse, GeneratedAt = DateTime.Now, InvoiceNumber = InvoiceNumber.ToString(), Amount = totalAmount, Status = (int)status, Notes = "System generated invoice", }; if (status == InvoiceStatusEnum.Sent) { invoice.SentOn = DateTime.Now; } Db.Invoices.Add(invoice); Db.SaveChanges(); }
private void SaveInvoice_E(object obj) { if (invoiceFor == "Clients") { if (CurrentSelectedId < 1) { MessageBox.Show("Select a Client to add Invoice for"); return; } // create the temp invoice that would be saved in the database ClientInvoice tempInvoice = (ShapeInvoice <ClientInvoice>() as ClientInvoice); bool IsInvoiceValid = ValidateInvoice((dynamic)tempInvoice); if (/*ti == null && */ IsInvoiceValid) { db.ClientInvoices.Add(tempInvoice); db.SaveChanges(); InvoiceHelper = new ClientInvoice(); refreshCs_E(null); // show messagebox to alert success; MessageBox.Show("Client Invoice Added Successfully", "Success !! ", MessageBoxButton.OK, MessageBoxImage.Information); return; } else if (!IsInvoiceValid) { return; } MessageBox.Show("An Error occured while adding client invoice", "Failed !! ", MessageBoxButton.OK, MessageBoxImage.Error); } else if (invoiceFor == "Suppliers") { if (CurrentSelectedId < 1) { MessageBox.Show("Select a Supplier to add Invoice for"); return; } SupplierInvoice tempInvoice = (ShapeInvoice <SupplierInvoice>() as SupplierInvoice); // Check whether this invoice has already been added SupplierInvoice ti; try { ti = db.SupplierInvoices.Where(i => i.PurchaseOrder_No == tempInvoice.PurchaseOrder_No && i.ProjectSite == tempInvoice.ProjectSite && i.WayBill_No == tempInvoice.WayBill_No && i.Description == tempInvoice.Description && i.Amount == tempInvoice.Amount && i.Vat_Nhil == tempInvoice.Vat_Nhil && i.Remarks == tempInvoice.Remarks).FirstOrDefault(); } catch { return; } if (ti == null && ValidateInvoice((dynamic)tempInvoice)) { db.SupplierInvoices.Add(tempInvoice); db.SaveChanges(); InvoiceHelper = new ClientInvoice(); refreshCs_E(null); // show messagebox to alert success; MessageBox.Show("Supplier's Invoice Added Successfully", "Success !! ", MessageBoxButton.OK, MessageBoxImage.Information); return; } MessageBox.Show("An Error occured while adding the Supplier's invoice", "Failed !! ", MessageBoxButton.OK, MessageBoxImage.Error); } }
private void Clear_E(object obj) { InvoiceHelper = new ClientInvoice(); }
private void ProcessInvoices(DateTime?startDate, DateTime?endDate) { //Get all deposits in date range //Get all items that match the file numbers in the deposits //Get all of the clients based on the items //Get all of the salespeople for the clients if (startDate.HasValue && endDate.HasValue) { var qbc = new QuickbooksClient(QuickbooksService.AppName); var qb = new QuickbooksService(); UpdateStatus("Getting deposits from between dates"); List <QuickbooksDeposit> deposits = qb.GetDepositsByDateRange(startDate.Value, endDate.Value); Dictionary <string, List <QuickbooksDeposit> > depositsByClient = deposits .GroupBy(x => x.Memo.Substring(0, x.Memo.IndexOf("-")) ) .ToDictionary(x => x.Key, x => x.ToList()); UpdateStatus("Gathering clients"); List <string> clientNames = deposits.Select(x => x.Memo.Substring(0, x.Memo.IndexOf("-"))).Distinct().ToList(); Dictionary <string, Client> clients = qb.GetClients().Where(x => clientNames.Contains(x.Name)).ToDictionary(x => x.Name, x => x); List <string> fileNumbers = deposits.Select(x => x.Memo.Substring(0, x.Memo.IndexOf(" "))).Distinct().ToList(); UpdateStatus("Retrieving items to create invoice lines"); List <Claim> claims = qb.SearchClaims(fileNumbers, startDate.Value, endDate.Value); Dictionary <string, List <Claim> > claimsByClient = claims .GroupBy(x => x.FileNumber.Substring(0, x.FileNumber.IndexOf("-")) ) .ToDictionary(x => x.Key, x => x.ToList()); UpdateStatus("Retrieving salesperson commission list"); List <Employee> salespersons = qbc.SearchEmployeesByName("{salesperson}"); Dictionary <string, PayrollWageItem> commissionItems = qb.GetActivePayrollItemsWage().Where(x => x.WageType == "Commission").ToDictionary(x => x.Name, x => x); UpdateStatus("Building client invoices"); foreach (var client in clients) { if (!claimsByClient.ContainsKey(client.Key)) { UpdateStatus("No deposits were found for " + client.Key); continue; } else { UpdateStatus("_______________________________________________________________________"); UpdateStatus("Building invoice for " + client.Key + ""); } var invoice = new ClientInvoice() { Client = client.Key, Claims = claimsByClient[client.Key] }; UpdateStatus(""); UpdateStatus("Invoice Lines"); int line = 1; decimal invoiceTotal = 0; decimal clientDueTotal = 0; foreach (var claim in invoice.Claims) { decimal clientPercent = GetClientPercentForCheck(claim.FileNumber, client.Value); decimal dueClient = clientPercent * claim.CheckAmount; UpdateStatus(line + ". " + claim.FileNumber + "....." + claim.Description + "....." + claim.CheckAmount.ToString("c") + "....." + dueClient.ToString("c") + " Due Client"); clientDueTotal += dueClient; invoiceTotal += claim.CheckAmount; line++; } string items = invoice.Claims.Count > 1 ? "items" : "item"; UpdateStatus("Total: " + invoiceTotal.ToString("c")); UpdateStatus("Client Due: " + clientDueTotal.ToString("c")); UpdateStatus("Invoice complete"); //Build client invoice } UpdateStatus("Client invoices complete."); UpdateStatus("Building salesperson invoices"); foreach (var salesperson in salespersons) { int line = 1; UpdateStatus("Building commission invoice for " + salesperson.Name); decimal invoiceTotal = 0; decimal salesDueTotal = 0; foreach (var commission in salesperson.Earnings) { if (claimsByClient.ContainsKey(commission.FullName)) { var clientClaims = claimsByClient[commission.FullName]; foreach (var clientClaim in clientClaims) { decimal companyPercent = GetCompanyPercentForCheck(clientClaim.FileNumber, clients[commission.FullName]); decimal companyAmount = companyPercent * clientClaim.CheckAmount; decimal salesPersonDue = (commission.Amount / 100) * companyAmount; UpdateStatus(line + ". " + clientClaim.FileNumber + "....." + clientClaim.Description + "....." + clientClaim.CheckAmount.ToString("c") + "....." + salesPersonDue.ToString("c") + " Commission Due"); salesDueTotal += salesPersonDue; invoiceTotal += clientClaim.CheckAmount; line++; } } } } } }
private void ProcessInvoices(DateTime?startDate, DateTime?endDate) { invoices.Dispatcher.Invoke(() => { invoices.Children.Clear(); }); ResetStatus(); if (startDate.HasValue && endDate.HasValue) { var qbc = new QuickbooksClient(Settings.Default.CompanyFile, QuickbooksService.AppName); var qb = new QuickbooksService(Settings.Default.CompanyFile); UpdateStatus("Gathering deposits for " + startDate.Value.ToString("MM/dd/yy") + " to " + endDate.Value.ToString("MM/dd/yy"), UpdateType.Alert); List <QuickbooksDeposit> deposits = qb.GetDepositsByDateRange(startDate.Value, endDate.Value); List <DepositLine> checks = deposits.SelectMany(x => x.Lines).ToList(); var checksByClient = GetChecksByClient(checks); if (checksByClient.Any(x => x.Key == "NO MEMO")) { var noMemoChecks = checksByClient["NO MEMO"]; var noMemoLine = String.Join(Environment.NewLine, noMemoChecks.Select(x => x.DepositDate + " Check#" + x.CheckNumber)); ShowWarning("The following cheks were missing a required Memo Line:" + noMemoLine + Environment.NewLine + " The memo should be formatted CLIENT-DATE TYPE (e.g. TRM-042419 LOU, TR-NV-042419-12345 LOU)"); } if (checksByClient.Any(x => x.Key == "BADLY FORMATTED MEMO")) { var badMemoChecks = checksByClient["BADLY FORMATTED MEMO"]; var badMemoLine = String.Join(Environment.NewLine, badMemoChecks.Select(x => x.DepositDate + " Check#" + x.CheckNumber + " Memo: " + x.Memo)); ShowWarning("The following checks had a badly formatted memo: " + badMemoLine + Environment.NewLine + " The memo should be formatted CLIENT-DATE TYPE (e.g. TRM-042419 LOU, TR-NV-042419-12345 LOU)"); } UpdateStatus("Gathering clients", UpdateType.Alert); List <string> clientNames = checksByClient.Keys.Distinct().ToList(); Dictionary <string, Client> clients = qb.GetClients().Where(x => clientNames.Contains(x.Name)).ToDictionary(x => x.Name, x => x); List <string> fileNumbers = checks.Select(x => GetFilenumberFromLineItem(x.Memo) ) .Distinct() .ToList(); UpdateStatus("Retrieving items to create invoice lines", UpdateType.Alert); List <Claim> claims = qb.SearchClaims(fileNumbers, startDate.Value, endDate.Value); Dictionary <string, List <Claim> > claimsByClient = GetClaimsByClient(claims); if (claimsByClient.Any(x => x.Key == "NO FILENUMBER")) { var badClaims = claimsByClient["NO FILENUMBER"]; var badClaimsLine = String.Join(Environment.NewLine, badClaims.Select( x => x.Description + " File#" + x.FileNumber + " Memo: " + x.Memo )); ShowWarning("The following claim items had a badly formatted memo: " + badClaimsLine + Environment.NewLine + " The memo should be formatted CLIENT-DATE-TYPE (e.g. TRM-042419-LOU, TR-NV-042419-12345-LOU)"); } foreach (var claimItem in claims) { if (claimItem.CheckAmount == 0) { var filenumber = claimItem.FileNumber.ToLower(); var matchingDeposit = checks.FirstOrDefault(x => x.Memo.ToLower().Contains(filenumber) || filenumber.Contains(x.Memo.ToLower())); if (matchingDeposit != null) { claimItem.CheckAmount = matchingDeposit.Amount; } else { Console.WriteLine("Missing"); } } } UpdateStatus("Retrieving salesperson commission list", UpdateType.Alert); List <Employee> salespersons = qbc.SearchEmployeesByName("{salesperson}"); Dictionary <string, PayrollWageItem> commissionItems = qb.GetActivePayrollItemsWage().Where(x => x.WageType == "Commission").ToDictionary(x => x.Name, x => x); UpdateStatus("Building client invoices", UpdateType.Alert); foreach (var client in clients) { DataGrid datagrid = null; var invoiceLines = new List <InvoiceLine>(); if (!claimsByClient.ContainsKey(client.Key)) { UpdateStatus("No deposits were found for " + client.Key, UpdateType.Alert); continue; } else { UpdateStatus("Client Invoice for " + client.Key + "", UpdateType.Title); } invoices.Dispatcher.Invoke(() => { datagrid = GetInvoiceGrid("Client"); datagrid.Name = client.Key.Replace("-", "") + "GridClientInvoices"; invoices.Children.Add(datagrid); datagrid.ItemsSource = invoiceLines; }); var invoice = new ClientInvoice() { Client = client.Key, Claims = claimsByClient[client.Key], Checks = checksByClient[client.Key] }; int line = 1; decimal invoiceTotal = 0; decimal clientDueTotal = 0; foreach (var check in invoice.Checks) { var claim = invoice.Claims.FirstOrDefault(x => x.FileNumber == check.Memo); decimal clientPercent = 0; decimal dueClient = 0; var filenumber = claim == null ? check.Memo : claim.FileNumber; if (check.Amount < 0) { CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US"); culture.NumberFormat.CurrencyNegativePattern = 1; dueClient = check.Amount; invoiceLines.Add(new InvoiceLine() { LineNumber = line.ToString(), FileNumber = "Disbursements", Description = claim?.Description, CheckAmount = String.Format(culture, "{0:C}", dueClient), AmountDue = String.Format(culture, "{0:C}", dueClient), SplitRate = "", CommissionRate = "" }); } else { clientPercent = GetClientPercentForCheck(filenumber, client.Value); dueClient = clientPercent * check.Amount; invoiceLines.Add(new InvoiceLine() { LineNumber = line.ToString(), FileNumber = check.Memo, Description = claim?.Description, CheckAmount = check.Amount.ToString("c"), AmountDue = dueClient.ToString("c"), SplitRate = (clientPercent * 100).ToString("#.000"), CommissionRate = "" }); } clientDueTotal += dueClient; invoiceTotal += check.Amount; line++; } string items = invoice.Claims.Count > 1 ? "items" : "item"; UpdateStatus("Storing invoice as purchase order..."); try { qb.AddClientInvoice(new Invoice() { ClientName = client.Key, Lines = new List <InvoiceLine>(invoiceLines) }); UpdateStatus($"Invoice for {client.Key} Successfully saved."); } catch (Exception ex) { UpdateStatus($"Saving invoice for {client.Key} failed due to error: {ex.Message}"); } invoiceLines.Add(new InvoiceLine() { LineNumber = "", FileNumber = "", Description = "", CheckAmount = "", SplitRate = "", CommissionRate = "", AmountDue = "" }); invoiceLines.Add(new InvoiceLine() { LineNumber = "", FileNumber = "", Description = "", CheckAmount = "", SplitRate = "", CommissionRate = "Total Client Due", AmountDue = clientDueTotal.ToString("c") }); datagrid.Dispatcher.Invoke(() => { datagrid.Items.Refresh(); }); UpdateStatus(" "); } UpdateStatus("Client invoices complete.", UpdateType.Alert); UpdateStatus("Building salesperson invoices", UpdateType.Alert); int salespersonCount = 0; foreach (var salesperson in salespersons) { DataGrid datagrid = null; var invoiceLines = new ObservableCollection <InvoiceLine>(); int line = 1; decimal invoiceTotal = 0; decimal salesDueTotal = 0; foreach (var commission in salesperson.Earnings) { if (claimsByClient.ContainsKey(commission.FullName)) { salespersonCount++; UpdateStatus("Commission invoice for " + salesperson.Name, UpdateType.Title); invoices.Dispatcher.Invoke(() => { datagrid = GetInvoiceGrid("Salesperson"); datagrid.Name = salesperson.Name.Replace("-", "").Replace("{salesperson}", "").Replace(" ", "") + "SPClientInvoices"; invoices.Children.Add(datagrid); datagrid.ItemsSource = invoiceLines; }); var clientClaims = claimsByClient[commission.FullName]; foreach (var clientClaim in clientClaims) { if (clientClaim.CheckAmount < 0) { continue; } decimal companyPercent = GetCompanyPercentForCheck(clientClaim.FileNumber, clients[commission.FullName]); decimal companyAmount = companyPercent * clientClaim.CheckAmount; decimal salesPersonDue = (commission.Amount / 100) * companyAmount; if (commission.AmountType == "Amount") { salesPersonDue = commission.Amount; } datagrid.Dispatcher.Invoke(() => { invoiceLines.Add(new InvoiceLine() { LineNumber = line.ToString(), FileNumber = clientClaim.FileNumber, Description = clientClaim.Description, CheckAmount = clientClaim.CheckAmount.ToString("c"), SplitRate = (companyPercent * 100).ToString("#.000"), CommissionRate = commission.Amount.ToString("#.000"), AmountDue = salesPersonDue.ToString("c"), CompanyAmount = companyPercent * clientClaim.CheckAmount, IsFlatCommission = commission.AmountType == "Amount" }); datagrid.Items.Refresh(); }); salesDueTotal += salesPersonDue; invoiceTotal += clientClaim.CheckAmount; line++; } } } if (invoiceLines.Count > 0) { qb.AddCommissionInvoice(new Invoice() { ClientName = salesperson.Name.Replace("{salesperson}", "").Trim() + " - COMMISSION", Lines = new List <InvoiceLine>(invoiceLines) }); datagrid.Dispatcher.Invoke(() => { invoiceLines.Add(new InvoiceLine() { LineNumber = "", FileNumber = "", Description = "", CheckAmount = "", AmountDue = "" }); invoiceLines.Add(new InvoiceLine() { LineNumber = "", FileNumber = "", Description = "", CheckAmount = "Total Commissions", AmountDue = salesDueTotal.ToString("c") }); datagrid.Items.Refresh(); }); } } UpdateStatus(" ", UpdateType.Text); UpdateStatus(" ", UpdateType.Text); UpdateStatus($"{clients.Count} client invoices created", UpdateType.Alert); UpdateStatus($"{salespersonCount} commission invoices created", UpdateType.Alert); UpdateStatus("Completed Successfully", UpdateType.Alert); } }