private void LoadIncomeAccounts() { Task.Run(() => { try { var qbService = new QuickbooksService(Settings.Default.CompanyFile); var incomeAccounts = qbService.GetIncomeAccounts(); if (incomeAccounts != null) { IncomeAccounts = incomeAccounts.Select(x => x.FullName.Replace("Insurance Income:", "") + " (" + x.FullName + ")").ToList(); } Task.Run(() => { ClaimChecks.Dispatcher.Invoke(() => { ClaimChecks.ItemsSource = claims; ClaimChecks.Items.Refresh(); }); }); } catch (Exception ex) { var st = new StackTrace(ex, true); var frame = st.GetFrame(0); var line = frame.GetFileLineNumber(); } }); }
private void NewCommission_Click(object sender, RoutedEventArgs e) { var qbService = new QuickbooksService(); qbService.GetClients(); var qbc = new QuickbooksClient("Transubro Commissions"); //var items = qbc.SearchItems<Claim>("ACE", new DateTime(2019, 10, 14), new DateTime(2019, 12, 15)); //var vendors = qbService.GetClients(); //var salesPeople = qbc.GetVendorsByType ("Salesperson"); //var deposit = qbc.DepositCheck (); var payrollItems = qbc.GetActivePayrollItemsWage(); var employee = qbc.SearchEmployeesByName("{salesperson}"); var deposits = qbc.GetDepositsByDateRange(new DateTime(2019, 10, 20), new DateTime(2019, 12, 21)); var insuranceCompanies = qbService.GetInsuranceCompanies(); //qbc.AddItems(new List<object>() //{ // new Claim() { CheckAmount = 55.52m, Description = "This is a test, man", FileNumber = "MXT-12354-3333" }, // new Claim() { CheckAmount = 155.11m, Description = "Another Item Here", FileNumber = "ACE-115522-1234" }, // new Claim() { CheckAmount = 229.00m, Description = "I have a claim for you", FileNumber = "PT-042219" } //}); // qbc.AddPurchaseOrder(); commissions.Add(new SalesCommission()); CommissionsList.Items.Refresh(); }
private void LoadInsuranceAccounts() { Task.Run(() => { try { var qbService = new QuickbooksService(Settings.Default.CompanyFile); InsuranceCompanies = qbService.GetInsuranceCompanies(); Task.Run(() => { ClaimChecks.Dispatcher.Invoke(() => { ClaimChecks.ItemsSource = claims; ClaimChecks.Items.Refresh(); }); }); } catch (Exception ex) { var st = new StackTrace(ex, true); //Get the top stack frame var frame = st.GetFrame(0); // Get the line number from the stack frame var line = frame.GetFileLineNumber(); this.Dispatcher.Invoke(() => { MessageBox.Show("There was an error when trying to retrieve insurance companies: " + ex.Message + " - " + ex.TargetSite + " - line# " + line, "Quickbooks Error", MessageBoxButton.OK, MessageBoxImage.Error); }); } }); }
public NewClientScreen() { InitializeComponent(); var employees = new QuickbooksService(Settings.Default.CompanyFile).SearchEmployees("{salesperson}"); SalesPersons = employees.ConvertAll(x => new SalesPerson() { Id = x.ListID, Name = x.Name }); CommissionsList.ItemsSource = commissions; this.DataContext = this; }
public ClientList( ) { InitializeComponent(); this.DataContext = this; this.Loaded += delegate { allClients = new QuickbooksService(Settings.Default.CompanyFile).GetClients(); DataGridCollection = CollectionViewSource.GetDefaultView(allClients); DataGridCollection.Filter = new Predicate <object>(Filter); ClientsList.ItemsSource = DataGridCollection; }; }
public AddClaims() { InitializeComponent(); var qbService = new QuickbooksService(); InsuranceCompanies = qbService.GetInsuranceCompanies(); this.DataContext = this; this.Loaded += delegate { //clientDropdown.ItemsSource = clients.GetAllClients(); ClaimChecks.ItemsSource = claims; }; }
private void CheckSubmit_Click(object sender, RoutedEventArgs e) { bool isValid = true; int claimCount = claims.Count; List <CheckDeposit> emptyClaims = new List <CheckDeposit>(); foreach (var claim in claims) { if ( String.IsNullOrWhiteSpace(claim.FileNumber) && String.IsNullOrWhiteSpace(claim.From) && String.IsNullOrWhiteSpace(claim.LossOfUseDescription) && String.IsNullOrWhiteSpace(claim.PropertyDamageDescription) && String.IsNullOrWhiteSpace(claim.Memo) && String.IsNullOrWhiteSpace(claim.CheckNumber) && claim.CheckAmount == 0) { emptyClaims.Add(claim); continue; } if ( String.IsNullOrWhiteSpace(claim.FileNumber) || String.IsNullOrWhiteSpace(claim.From) || (String.IsNullOrWhiteSpace(claim.LossOfUseDescription) && String.IsNullOrWhiteSpace(claim.PropertyDamageDescription)) || String.IsNullOrWhiteSpace(claim.Memo) || String.IsNullOrWhiteSpace(claim.CheckNumber) || claim.CheckAmount == 0) { isValid = false; break; } } List <CheckDeposit> validClaims = claims.Where(x => !emptyClaims.Contains(x)).ToList(); if (validClaims.Count == 0 || !isValid) { MessageBoxResult result = MessageBox.Show("Please fill out all of the fields before submitting", "Incomplete Deposits", MessageBoxButton.OK, MessageBoxImage.Warning); } else { int numberAdded = validClaims.Count; bool processClaimsSucceeded = new QuickbooksService().ProcessCheckDeposits(claims); if (processClaimsSucceeded) { claims.Clear(); claims.Add(new CheckDeposit()); ClaimChecks.Items.Refresh(); string message = numberAdded + " claims were successfully added to Quickbooks."; if (numberAdded == 1) { message = numberAdded + " claim was successfully added to Quickbooks."; } MessageBoxResult result = MessageBox.Show(message, "Success", MessageBoxButton.OK, MessageBoxImage.Information); } else { MessageBoxResult result = MessageBox.Show("Something went wrong.", "Oops", MessageBoxButton.OK, MessageBoxImage.Information); } } }
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); } }