예제 #1
0
 private void RefreshProductsComboBox()
 {
     using (var db = new SalesManagerContext())
     {
         var selectedText = ((Product)comboBoxProducts.SelectedItem)?.Name;
         IQueryable <Product> products;
         var account = (Account)comboBoxAccounts.SelectedItem;
         if (account != null)
         {
             products = db.Products.Include(product => product.Account).Where(product => product.Account == null ||
                                                                              product.Account.ID.Equals(account.ID));
         }
         else
         {
             products = db.Products.Include(product => product.Account).Where(product => product.Account == null);
         }
         comboBoxProducts.DataSource = products.ToList();
         foreach (var item in comboBoxProducts.Items)
         {
             Product product = item as Product;
             if (product != null && product.Name.Equals(selectedText))
             {
                 comboBoxProducts.SelectedItem = item;
             }
         }
     }
 }
예제 #2
0
 public void Edit()
 {
     using (var db = new SalesManagerContext())
     {
         db.Countries.Update(this);
         db.SaveChanges();
     }
 }
예제 #3
0
 public void Add()
 {
     using (var db = new SalesManagerContext())
     {
         db.Countries.Add(this);
         db.SaveChanges();
     }
 }
예제 #4
0
 public void Remove()
 {
     using (var db = new SalesManagerContext())
     {
         db.Transactions.Remove(this);
         db.SaveChanges();
     }
 }
예제 #5
0
 public void Edit()
 {
     using (var db = new SalesManagerContext())
     {
         db.Transactions.Update(this);
         db.SaveChanges();
     }
 }
예제 #6
0
 private void GetCountriesList()
 {
     objectListViewCountries.ClearObjects();
     using (var db = new SalesManagerContext())
     {
         objectListViewCountries.AddObjects(db.Countries.Where(country => !country.ID.Equals(1)).ToList());
     }
 }
예제 #7
0
 private void GetAccountsList()
 {
     objectListViewAccounts.ClearObjects();
     using (var db = new SalesManagerContext())
     {
         objectListViewAccounts.AddObjects(db.Accounts.ToList());
     }
 }
예제 #8
0
 public void Add()
 {
     using (var db = new SalesManagerContext())
     {
         Account = db.Accounts.First(item => item.ID.Equals(Account.ID));
         db.Products.Add(this);
         db.SaveChanges();
     }
 }
예제 #9
0
 public void Add()
 {
     using (var db = new SalesManagerContext())
     {
         Product = db.Products.First(item => item.ID.Equals(Product.ID));
         Country = db.Countries.First(item => item.ID.Equals(Country.ID));
         Account = db.Accounts.First(item => item.ID.Equals(Account.ID));
         GetPartnerShare();
         db.Transactions.Add(this);
         db.SaveChanges();
     }
 }
예제 #10
0
 public void Remove()
 {
     using (var db = new SalesManagerContext())
     {
         db.Transactions.RemoveRange(db.Transactions.Include(transaction => transaction.Country).Where(transaction => transaction.Country.ID.Equals(ID)));
         db.SaveChanges();
     }
     using (var db = new SalesManagerContext())
     {
         db.Countries.Remove(this);
         db.SaveChanges();
     }
 }
예제 #11
0
 public void Remove()
 {
     using (var db = new SalesManagerContext())
     {
         db.Transactions.RemoveRange(db.Transactions.Include(transaction => transaction.Account).Where(transaction => transaction.Account.ID.Equals(ID)));
         db.Products.RemoveRange(db.Products.Include(product => product.Account).Where(product => product.Account.ID.Equals(ID)));
         db.SaveChanges();
     }
     using (var db = new SalesManagerContext())
     {
         db.Accounts.Remove(this);
         db.SaveChanges();
     }
 }
예제 #12
0
        private void PrepareChart()
        {
            if (tabControl.SelectedTab.Equals(tabPageGraph))
            {
                chart.ResetAutoValues();
                chart.Series.Clear();
                var dateTimeFormatInfo = new DateTimeFormatInfo();

                using (var db = new SalesManagerContext())
                {
                    var shareSeries = new Series {
                        Name = "Partner Share"
                    };
                    var incomeSeries = new Series {
                        Name = "Income"
                    };
                    var product = (Product)comboBoxProducts.SelectedItem;
                    for (int i = 1; i <= 12; i++)
                    {
                        var transactions = db.Transactions.Include(transaction => transaction.Product).Include(transaction => transaction.Account)
                                           .Where(
                            transaction =>
                            transaction.Date.Month.Equals(i) &&
                            transaction.Date.Year.Equals(dateTimePickerTo.Value.Year) && transaction.Account.ID.Equals(((Account)comboBoxAccounts.SelectedItem).ID));

                        if (!product.ID.Equals(1))
                        {
                            transactions = transactions
                                           .Where(
                                transaction =>
                                transaction.Product.ID.Equals(product.ID));
                        }
                        double partnerShare = transactions.Sum(transaction => transaction.PartnerShare);
                        shareSeries.Points.AddXY(dateTimeFormatInfo.GetMonthName(i), partnerShare);
                        double receivedAmount =
                            transactions.Sum(transaction => transaction.ReceivedAmount + transaction.SupportAmount);
                        incomeSeries.Points.AddXY(dateTimeFormatInfo.GetMonthName(i), receivedAmount);
                    }
                    chart.Series.Add(shareSeries);
                    chart.Series.Add(incomeSeries);
                }
            }
        }
예제 #13
0
 private void GetProductsList()
 {
     objectListViewProducts.ClearObjects();
     using (var db = new SalesManagerContext())
     {
         var account = (Account)comboBoxAccounts.SelectedItem;
         IQueryable <Product> products = db.Products.Include(product => product.Account).Where(product => !product.ID.Equals(1) && !product.ID.Equals(2));
         if (account == null)
         {
             products = products.Where(product => product.Account == null);
         }
         else
         {
             products = products.Where(product => product.Account == null ||
                                       product.Account.ID.Equals(account.ID));
         }
         objectListViewProducts.AddObjects(products.ToList());
     }
 }
예제 #14
0
 private void RefreshAccountsComboBox()
 {
     using (var db = new SalesManagerContext())
     {
         var accounts     = db.Accounts.ToList();
         var selectedText = ((Account)comboBoxAccounts.SelectedItem)?.Name;
         comboBoxAccounts.DataSource = accounts;
         foreach (var item in comboBoxAccounts.Items)
         {
             Account account = item as Account;
             if (account != null && account.Name.Equals(selectedText))
             {
                 comboBoxAccounts.SelectedItem = item;
             }
         }
         if (accounts.Count.Equals(0))
         {
             AddNewAccount();
         }
     }
 }
예제 #15
0
 public AddTransaction(Account account, Transaction transaction = null)
 {
     InitializeComponent();
     _transaction = transaction;
     _account     = account;
     HelperMethods.FixFonts(this);
     using (var db = new SalesManagerContext())
     {
         comboBoxProduct.DataSource    = db.Products.Where(product => !product.ID.Equals(1) && !product.ID.Equals(2)).ToList();
         comboBoxProduct.DisplayMember = "Name";
         comboBoxCountry.DataSource    = db.Countries.Where(country => !country.ID.Equals(1)).ToList().ToList();
         comboBoxCountry.DisplayMember = "Name";
     }
     if (transaction != null)
     {
         Text                 = @"Edit Transaction";
         buttonSave.Text      = @"Save";
         textBoxDetail.Text   = transaction.Detail;
         comboBoxProduct.Text = transaction.Product.Name;
         comboBoxCountry.Text = transaction.Country.Name;
         textBoxOrderID.Text  = transaction.OrderID;
         dateTimePicker.Value = transaction.Date;
     }
 }
예제 #16
0
 private void dateTimePicker_ValueChanged(object sender, EventArgs e)
 {
     if (sender.Equals(dateTimePickerTo))
     {
         if (!dateTimePickerTo.Value.Equals(dateTimePickerTo.Value.AbsoluteEnd()))
         {
             dateTimePickerFrom.MaxDate = dateTimePickerTo.Value.AbsoluteStart();
             dateTimePickerTo.Value     = dateTimePickerTo.Value.AbsoluteEnd();
             return;
         }
     }
     if (sender.Equals(dateTimePickerFrom))
     {
         if (!dateTimePickerFrom.Value.Equals(dateTimePickerFrom.Value.AbsoluteStart()))
         {
             dateTimePickerFrom.Value = dateTimePickerFrom.Value.AbsoluteStart();
             return;
         }
     }
     if (dateTimePickerTo.Value.Equals(dateTimePickerTo.Value.AbsoluteEnd()) &&
         dateTimePickerFrom.Value.Equals(dateTimePickerFrom.Value.AbsoluteStart()))
     {
         if (comboBoxProducts.Items.Count > 0)
         {
             using (var db = new SalesManagerContext())
             {
                 objectListViewTransactions.ClearObjects();
                 var account = (Account)comboBoxAccounts.SelectedItem;
                 IQueryable <Transaction> transactions =
                     db.Transactions.Include(transaction => transaction.Country)
                     .Include(transaction => transaction.Product)
                     .Include(transaction => transaction.Account)
                     .Where(
                         transaction =>
                         transaction.Date.Ticks > dateTimePickerFrom.Value.Ticks &&
                         transaction.Date.Ticks < dateTimePickerTo.Value.Ticks);
                 if (account != null)
                 {
                     transactions = transactions.Where(transaction => transaction.Account.ID.Equals(account.ID));
                 }
                 if (!((Product)comboBoxProducts.SelectedItem).ID.Equals(1))
                 {
                     transactions = transactions
                                    .Where(
                         transaction =>
                         transaction.Product.ID.Equals(((Product)comboBoxProducts.SelectedItem).ID));
                 }
                 objectListViewTransactions.AddObjects(transactions.ToList());
                 labelIncome.Text =
                     $@"{
                         transactions.Select(transaction => transaction.ReceivedAmount).Sum() + transactions
                             .Select(transaction => transaction.SupportAmount)
                             .Sum():C2}";
                 labelPartnerShare.Text =
                     $@"{transactions.Select(transaction => transaction.PartnerShare).Sum():C2}";
                 labelTotal.Text =
                     (double.Parse(labelIncome.Text, NumberStyles.Currency) +
                      double.Parse(labelPartnerShare.Text, NumberStyles.Currency)).ToString("C2");
                 var cancelledTransactions = new Dictionary <string, Transaction>();
                 foreach (var transaction in transactions.ToList())
                 {
                     if (transaction.ReceivedAmount < 0 && !cancelledTransactions.ContainsKey(transaction.OrderID + transaction.Product.ID))
                     {
                         cancelledTransactions.Add(transaction.OrderID + transaction.Product.ID, transaction);
                     }
                 }
                 int count = 0;
                 foreach (var transaction in transactions)
                 {
                     if (transaction.ReceivedAmount > 0 && !transaction.Product.ID.Equals(2))
                     {
                         if (cancelledTransactions.ContainsKey(transaction.OrderID + transaction.Product.ID))
                         {
                             cancelledTransactions.Remove(transaction.OrderID + transaction.Product.ID);
                             continue;
                         }
                         count++;
                     }
                 }
                 labelTotalSales.Text = count.ToString();
                 if (sender.Equals(comboBoxAccounts))
                 {
                     RefreshProductsComboBox();
                     GetProductsList();
                 }
             }
             PrepareChart();
         }
     }
 }
예제 #17
0
        public FormMain()
        {
            //#if DEBUG
            //    var databasePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "RBSoft",
            //        "Sales Manager", "database.smdb");
            //    if (File.Exists(databasePath))
            //    {
            //        File.Delete(databasePath);
            //    }
            //#endif

            InitializeComponent();
            dateTimePickerFrom.Value = new DateTime(dateTimePickerTo.Value.Year, dateTimePickerTo.Value.Month, 1, 0, 0,
                                                    0);
            dateTimePickerTo.Value     = dateTimePickerTo.Value.AbsoluteEnd();
            dateTimePickerFrom.MaxDate = dateTimePickerTo.Value.AbsoluteStart();
            HelperMethods.FixFonts(this);
            WindowSettings.Restore(Settings.Default.WindowSettings, this);
            Application.CurrentCulture = new CultureInfo("en-US")
            {
                NumberFormat = { CurrencyNegativePattern = 1 }
            };
            objectListViewTransactions.RestoreState(
                Convert.FromBase64String(Settings.Default.ObjectListViewTransactionsState));
            olvColumnDate.AspectGetter += delegate(object rowObject)
            {
                var transaction = rowObject as Transaction;
                return(transaction?.Date.ToString("d", Application.CurrentCulture) ??
                       DateTime.Now.ToString("d", Application.CurrentCulture));
            };
            objectListViewTransactions.AboutToCreateGroups  += ObjectListViewTransactionsOnAboutToCreateGroups;
            objectListViewTransactions.BeforeCreatingGroups +=
                (sender, args) =>
            {
                args.Parameters.GroupComparer = args.Parameters.GroupByColumn.Equals(olvColumnDate)
                        ? new GroupDateComparer(args.Parameters.PrimarySortOrder)
                        : null;
            };
            thirtyMinutesToolStripMenuItem.Checked            = Settings.Default.AutoRefreshInterval.Equals(30 * 60 * 1000);
            oneHourToolStripMenuItem.Checked                  = Settings.Default.AutoRefreshInterval.Equals(60 * 60 * 1000);
            twoHourToolStripMenuItem.Checked                  = Settings.Default.AutoRefreshInterval.Equals(2 * 60 * 60 * 1000);
            threeHourToolStripMenuItem.Checked                = Settings.Default.AutoRefreshInterval.Equals(3 * 60 * 60 * 1000);
            fourHourToolStripMenuItem.Checked                 = Settings.Default.AutoRefreshInterval.Equals(4 * 60 * 60 * 1000);
            enableUpdateNotificationToolStripMenuItem.Checked = Settings.Default.EnableUpdateNotification;
            minimizeToTrayToolStripMenuItem.Checked           = Settings.Default.MinimizeToTray;
            using (var db = new SalesManagerContext())
            {
                db.Database.EnsureCreated();
                if (!db.Countries.Any())
                {
                    var referral = new Country
                    {
                        ID   = 1,
                        Name = "Referral",
                        Tax  = 0
                    };
                    db.Countries.Add(referral);
                    db.SaveChanges();
                }
                if (!db.Products.Any())
                {
                    var all = new Product
                    {
                        ID           = 1,
                        Name         = "All",
                        BuyerFee     = 0,
                        AuthorFee    = 0,
                        Price        = 0,
                        PartnerShare = 0,
                        Account      = null
                    };
                    db.Products.Add(all);
                    var referral = new Product
                    {
                        ID           = 2,
                        Name         = "Referral",
                        BuyerFee     = 0,
                        AuthorFee    = 0,
                        Price        = 0,
                        PartnerShare = 0,
                        Account      = null
                    };
                    db.Products.Add(referral);
                    db.SaveChanges();
                }
                comboBoxProducts.DisplayMember = "Name";
                comboBoxAccounts.DisplayMember = "Name";
            }
            _timer = new Timer
            {
                Interval = Settings.Default.AutoRefreshInterval,
                Enabled  = true
            };
            _timer.Tick += toolStripButtonUpdate_Click;
            _timer.Start();
            filterTextBox.Select();
        }
예제 #18
0
        public static bool GetSales(DateTime fromDate, DateTime toDate, Account account, BackgroundWorker backgroundWorker)
        {
            String[] transactionTypes =
            {
                "Author Fee",
                "Author Fee Reversal",
                "Author Fee Refund",
                "Sale",
                "Sale Reversal",
                "Sale Refund",
                "Referral Cut"
            };
            List <Transaction> transactions    = new List <Transaction>();
            JArray             jOrderInfoArray = new JArray();
            var i = 0;

            while (true)
            {
                try
                {
                    i++;
                    var response =
                        EnvatoAPIRequest(
                            $"https://api.envato.com/v3/market/user/statement?page={i}&from_date={fromDate:yyyy-MM-dd}&to_date={toDate:yyyy-MM-dd}", account);
                    var responseStream = response?.GetResponseStream();
                    if (responseStream != null)
                    {
                        using (var streamReader = new StreamReader(responseStream))
                        {
                            var     orderInfoJson = streamReader.ReadToEnd();
                            JObject jObject       = JObject.Parse(orderInfoJson);
                            var     tempJArray    = JArray.Parse(jObject["results"].ToString());
                            jOrderInfoArray.Merge(tempJArray);
                            if (tempJArray.Count.Equals(0))
                            {
                                break;
                            }
                        }
                    }
                }
                catch (WebException exception)
                {
                    Debug.WriteLine(exception);
                    return(false);
                }
            }
            int progress = 0;

            backgroundWorker.ReportProgress(progress, 1);
            using (var db = new SalesManagerContext())
            {
                for (var count = 0; count < jOrderInfoArray.Count; count++)
                {
                    var jToken = jOrderInfoArray[count];
                    var type   = jToken["type"].ToString();
                    if (!transactionTypes.Contains(type))
                    {
                        backgroundWorker.ReportProgress(count + 1, jOrderInfoArray.Count, 1);
                        continue;
                    }
                    var transaction = new Transaction
                    {
                        OrderID        = jToken["order_id"].ToString(),
                        ReceivedAmount = 0,
                        Date           = ((DateTimeOffset)jToken["date"]).DateTime,
                        Account        = db.Accounts.First(ac => ac.ID.Equals(account.ID))
                    };
                    var detail = jToken["detail"].ToString();
                    if (type.Equals("Referral Cut"))
                    {
                        transaction.Detail         = detail;
                        transaction.ReceivedAmount = (double)jToken["amount"];
                        if (
                            db.Transactions.Any(
                                tr =>
                                tr.Product.ID.Equals(2) && tr.Date.Equals(transaction.Date) &&
                                tr.ReceivedAmount.Equals(transaction.ReceivedAmount) &&
                                tr.Detail.Equals(transaction.Detail)))
                        {
                            backgroundWorker.ReportProgress(count + 1, jOrderInfoArray.Count, 1);
                            continue;
                        }
                        transaction.Product      = db.Products.First(product => product.ID.Equals(2));
                        transaction.Country      = db.Countries.First(country => country.ID.Equals(1));
                        transaction.PartnerShare = 0;
                        db.Transactions.Add(transaction);
                        db.SaveChanges();
                        backgroundWorker.ReportProgress(count + 1, jOrderInfoArray.Count, 1);
                        continue;
                    }
                    int itemID = Convert.ToInt32(jToken["item_id"]);
                    transaction.Product = db.Products.FirstOrDefault(product => product.ID.Equals(itemID));
                    if (transaction.Product == null)
                    {
                        var newProduct = new Product
                        {
                            ID      = itemID,
                            Account = account
                        };
                        db.Products.Add(newProduct);
                        db.SaveChanges();
                        transaction.Product = newProduct;
                    }
                    var tempTransaction =
                        transactions.FirstOrDefault(
                            tr =>
                            tr.OrderID.Equals(transaction.OrderID) && tr.Date.Equals(transaction.Date) &&
                            tr.Product.ID.Equals(transaction.Product.ID));
                    if (tempTransaction != null)
                    {
                        transaction = tempTransaction;
                    }
                    else
                    {
                        if (db.Transactions.Include(tr => tr.Product).Any(
                                tr =>
                                tr.OrderID.Equals(transaction.OrderID) &&
                                tr.Date.Equals(transaction.Date) && tr.Product.ID.Equals(transaction.Product.ID)))
                        {
                            backgroundWorker.ReportProgress(count + 1, jOrderInfoArray.Count, 1);
                            continue;
                        }
                        transactions.Add(transaction);
                    }
                    if (!type.Equals("Author Fee"))
                    {
                        if (string.IsNullOrEmpty(transaction.Detail))
                        {
                            transaction.Detail = detail;
                        }
                        else
                        {
                            if (detail.Contains("("))
                            {
                                var index = detail.LastIndexOf("(", StringComparison.InvariantCulture);
                                transaction.Detail += $" {detail.Substring(index)}";
                            }
                        }
                        if (transaction.Country == null)
                        {
                            if (string.IsNullOrEmpty(transaction.Product.Name))
                            {
                                transaction.Product.Name = detail.Split('(')[0].Replace("Reversal of", "").Replace("Refund for", "").Trim();
                                db.Products.Update(transaction.Product);
                                db.SaveChanges();
                            }
                            var orderCountry = jToken["other_party_country"].ToString();
                            transaction.Country =
                                db.Countries.FirstOrDefault(country => country.Name.Equals(orderCountry));
                            if (transaction.Country == null)
                            {
                                var countryObject = new Country
                                {
                                    Name = orderCountry,
                                    Tax  = 0
                                };
                                db.Countries.Add(countryObject);
                                db.SaveChanges();
                                transaction.Country = countryObject;
                            }
                        }
                    }
                    if (detail.Contains("extended support") || detail.Contains("support extension") || detail.Contains("renewed support") || detail.Contains("support renewal"))
                    {
                        transaction.SupportAmount += (double)jToken["amount"];
                        backgroundWorker.ReportProgress(count + 1, jOrderInfoArray.Count, 1);
                        continue;
                    }
                    if (jToken["us_rwt"].Type != JTokenType.Null)
                    {
                        transaction.Tax += (double)jToken["us_rwt"];
                    }
                    if (type.Equals("Author Fee") || type.Equals("Author Fee Refund") || type.Equals("Author Fee Reversal"))
                    {
                        transaction.PriceAfterAuthorFee += Math.Abs((double)jToken["amount"]);
                    }
                    else
                    {
                        transaction.PriceAfterBuyerFee += (double)jToken["price"];
                    }
                    transaction.ReceivedAmount += (double)jToken["amount"];
                    backgroundWorker.ReportProgress(count + 1, jOrderInfoArray.Count, 1);
                }
                foreach (var transaction in transactions)
                {
                    if (transaction.Detail.ToLower().Contains("extended support") && !transaction.Detail.ToLower().Contains("included support") || transaction.Detail.ToLower().Contains("renewed support"))
                    {
                        db.Transactions.Add(transaction);
                        continue;
                    }
                    transaction.PriceAfterAuthorFee = transaction.PriceAfterBuyerFee -
                                                      transaction.PriceAfterAuthorFee;
                    transaction.GetPartnerShare();
                    db.Transactions.Add(transaction);
                }
                db.SaveChanges();
                foreach (var transaction in transactions.Where(tr => tr.ReceivedAmount < 0))
                {
                    var refundedTransaction =
                        db.Transactions.FirstOrDefault(
                            tr => !tr.ID.Equals(transaction.ID) && tr.OrderID.Equals(transaction.OrderID) &&
                            tr.Product.ID.Equals(transaction.Product.ID) &&
                            tr.PriceAfterAuthorFee.Equals(transaction.PriceAfterAuthorFee));
                    if (refundedTransaction != null)
                    {
                        transaction.ReceivedAmount = refundedTransaction.ReceivedAmount * -1;
                        transaction.PartnerShare   = refundedTransaction.PartnerShare * -1;
                        transaction.Detail        +=
                            $" (Original Order was from {refundedTransaction.Date.ToShortDateString()})";
                    }
                }
                db.SaveChanges();
            }
            return(true);
        }