Exemplo n.º 1
0
        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();
        }
Exemplo n.º 3
0
        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;
        }
Exemplo n.º 5
0
        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;
            };
        }
Exemplo n.º 6
0
        public AddClaims()
        {
            InitializeComponent();
            var qbService = new QuickbooksService();

            InsuranceCompanies = qbService.GetInsuranceCompanies();


            this.DataContext = this;
            this.Loaded     += delegate
            {
                //clientDropdown.ItemsSource = clients.GetAllClients();
                ClaimChecks.ItemsSource = claims;
            };
        }
Exemplo n.º 7
0
        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++;
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 9
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);
            }
        }