示例#1
0
        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);
        }
示例#2
0
        //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);
        }
示例#4
0
 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;
 }
示例#5
0
        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());
                }
            });
        }
示例#6
0
        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();
        }
示例#9
0
        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);
            }
        }
示例#10
0
 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++;
                            }
                        }
                    }
                }
            }
        }
示例#12
0
        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);
            }
        }