using System; using System.Data.Entity.Infrastructure; using System.Drawing; using System.Drawing.Printing; using System.Linq; using System.Transactions; using System.Windows.Forms; namespace AdvertsingProfitControl { public partial class FrmMain : Form { private decimal _salesProducedByAdItems; private decimal _totalProfitReturnFromAdItems; private decimal _totalInvoicePurchases; //Total Purchases private decimal _departmentSales; //weekly sales total private DateTime _currentActiveDate; private readonly FrmLogConsole _console = FrmLogConsole.GetStaticInstance; private int _lazyPageCounter; public FrmMain(bool isDebug) { InitializeComponent(); debugMainMenu.Visible = isDebug; } private void frmMain_Load(object sender, EventArgs e) { var db = new AdvertisingProfitControlModel(); RefreshDateListing(); ConstructApcDataGridViews(); ConstructInvoicesDataGridView(); RowParsing.AdSpecialGroups.AddRange(db.AdSpecials.Select(x => x.Name)); //Select the most recent date from the database. var recentDate = db.WeekEndingDates.OrderByDescending(x => x.EndingDate).FirstOrDefault(); if (recentDate != null) { _currentActiveDate = recentDate.EndingDate; LoadDate(recentDate.EndingDate); } monthCalendar.DateChanged += ValidateDateChanged; } #region Calculate Analysis Methods private void CalculateProfitAnalysis(decimal shrink = 0.30m) { if (actualSalesDataGridView.Rows.Count == 0) { salesProducedLabel.Text = @"Sales Produced By Ad Items (A): No Data"; totalProfitFromAdItemsLabel.Text = @"Total Profit Return " + Environment.NewLine + @"From Ad Items (B): No Data"; if (_departmentSales == 0) { departmentSalesLabel.Text = @"Department Sales: No Data"; } return; } var incompleteData = false; //First grab the total sales and the total profit return generated by the actual sales of product. if ( decimal.TryParse( actualSalesDataGridView.Rows[actualSalesDataGridView.Rows.Count - 1].Cells[3].EditedFormattedValue .ToString(), out _salesProducedByAdItems)) { //The sales parsed properly so there is data in the cell. Next try to grab the total profit return. if (decimal.TryParse( actualSalesDataGridView.Rows[actualSalesDataGridView.Rows.Count - 1].Cells[6].EditedFormattedValue .ToString(), out _totalProfitReturnFromAdItems)) { } } if (_salesProducedByAdItems == 0) { salesProducedLabel.Text = @"Sales Produced By Ad Items (A): No Data"; incompleteData = true; } if (_totalProfitReturnFromAdItems == 0) { totalProfitFromAdItemsLabel.Text = @"Total Profit Return " + Environment.NewLine + @"From Ad Items (B): No Data"; incompleteData = true; } if (_departmentSales == 0) { departmentSalesLabel.Text = @"Department Sales: No Data"; incompleteData = true; } if (incompleteData) { return; } departmentSalesLabel.Text = @"Department Sales: " + _departmentSales.ToString("C"); salesProducedLabel.Text = @"Sales Produced By Ad Items (A): " + _salesProducedByAdItems.ToString("C"); //Calculate the remaining sales. var remainingSales = _departmentSales - _salesProducedByAdItems; remainingSalesLabel.Text = @"Remaining Sales: " + remainingSales.ToString("C"); //Again assume the total profit return is larger then zero (0). totalProfitFromAdItemsLabel.Text = @"Total Profit Return" + Environment.NewLine + @" From Ad Items (B): " + _totalProfitReturnFromAdItems.ToString("C"); //Shrink is being used as a place holder for Cross Profit % which is obtained by dividing the total profit return from the department weekly retail sales. var totalProfitReturnFromRemainingSales = shrink * remainingSales; // totalProfitReturnFromRemaingLabel.Text = @"Total Profit Return" + Environment.NewLine + @" From Remaining Sales: " + totalProfitReturnFromRemainingSales.ToString("C"); var totalProfitReturn = _totalProfitReturnFromAdItems + totalProfitReturnFromRemainingSales; totalProfitReturnLabel.Text = @"Total Profit Return: " + totalProfitReturn.ToString("C"); } private void CalculateGrossProfit() { if (_totalInvoicePurchases == 0) { grossProfitTotalSales.Text = _departmentSales == 0 ? @"Total Sales: No Data" : @"Total Sales: " + _departmentSales.ToString("C"); grossProfitLessCostOfSales.Text = @"Less Cost of Sales: No Data"; return; } //IF Cost of Sales hasn't been calculated, then clear labels and return. if (_departmentSales == 0) { grossProfitTotalSales.Text = @"Total Sales: No Data"; grossProfitLessCostOfSales.Text = @"Less Cost of Sales: " + _totalInvoicePurchases.ToString("C"); return; } grossProfitTotalSales.Text = @"Total Sales: " + _departmentSales.ToString("C"); grossProfitLessCostOfSales.Text = @"Less Cost of Sales: " + _totalInvoicePurchases.ToString("C"); var dollarGrossProfit = _departmentSales - _totalInvoicePurchases; grossProfitDollarGrossProfitLabel.Text = @"Dollar Gross Profit: " + dollarGrossProfit.ToString("C"); var grossProfitPercent = dollarGrossProfit / _departmentSales; perfectGrossProfitLabel.Text = @"Percent Gross Profit: " + grossProfitPercent.ToString("P"); } #endregion #region Main Menu Click Handlers private void DisplayNewRecordForm(object sender, EventArgs e) { var db = new AdvertisingProfitControlModel(); var form = new NewModifyRecord(); form.ShowDialog(); //One the user has closed the add record form, check to see if there is a newer date //available. If so, reload the form. RefreshDateListing(); var date = db.WeekEndingDates.OrderByDescending(x => x.EndingDate).FirstOrDefault(); if (date == null) return; if (date.EndingDate == _currentActiveDate) return; LoadDate(date.EndingDate); } private void DisplayModifyRecordForm(object sender, EventArgs e) { var form = new NewModifyRecord(_currentActiveDate); form.ShowDialog(); RefreshDateListing(); //On return reload the date that was just modified by the modify record form. LoadDate(_currentActiveDate); } private void ClearCurrentRecord(object sender, EventArgs e) { var result = MessageBox.Show(@"Are you sure you want to delete all records for the date " + _currentActiveDate.ToShortDateString() + @"?", @"Clear Date", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.No) { return; } var db = new AdvertisingProfitControlModel(); var dateRecord = db.WeekEndingDates.Single(x => x.EndingDate == _currentActiveDate); var projections = db.Projections.Where(x => x.WeekEndingDate.EndingDate == dateRecord.EndingDate); var inventories = db.Inventories.Where(x => x.WeekEndingDate.EndingDate == dateRecord.EndingDate); var actualSales = db.ActualSales.Where(x => x.WeekEndingDate.EndingDate == dateRecord.EndingDate); var invoices = db.Invoices.Where(x => x.WeekEndingDate.EndingDate == dateRecord.EndingDate); var weeklySale = db.WeeklySales.SingleOrDefault(x => x.WeekEndingDate.EndingDate == dateRecord.EndingDate); var taxable = db.Taxables.SingleOrDefault(x => x.WeekEndingDate.EndingDate == dateRecord.EndingDate); var costAnalysis = db.CostAnalysis.SingleOrDefault(x => x.WeekEndingDate.EndingDate == dateRecord.EndingDate); var comment = db.Notes.SingleOrDefault(x => x.WeekEndingDate.EndingDate == dateRecord.EndingDate); using (var scope = new TransactionScope()) { try { //Clear projections foreach (var projection in projections) { db.Projections.Remove(projection); } //Clear inventory foreach (var inventory in inventories) { db.Inventories.Remove(inventory); } //Clear actual sales foreach (var sale in actualSales) { db.ActualSales.Remove(sale); } //Clear invoices foreach (var invoice in invoices) { db.Invoices.Remove(invoice); } if (weeklySale != null) { db.WeeklySales.Remove(weeklySale); } if (taxable != null) { db.Taxables.Remove(taxable); } if (costAnalysis != null) { db.CostAnalysis.Remove(costAnalysis); } if (comment != null) { db.Notes.Remove(comment); } db.WeekEndingDates.Remove(dateRecord); db.SaveChanges(); scope.Complete(); ClearForm(); } catch (DbUpdateException ex) { MessageBox.Show(@"Failed to clear selected date.", @"Error"); _console.WriteToLog(FrmLogConsole.Level.Error, ex.Message); } } RefreshDateListing(); var mostRecentDate = db.WeekEndingDates.OrderByDescending(x => x.EndingDate).FirstOrDefault(); if (mostRecentDate != null) { LoadDate(mostRecentDate.EndingDate); } } private void DisplayAdItemManager(object sender, EventArgs e) { var adItemManager = new FrmManageAdItems(); adItemManager.ShowDialog(); } private void manageSuppliersToolsMainMenu_Click(object sender, EventArgs e) { var form = new FrmManageSuppliers(); form.ShowDialog(); } private void DisplayRegisterAdSpecial(object sender, EventArgs e) { var form = new FrmRegisterAdSpecial(); form.ShowDialog(); } private void ShowHideLogConsole(object sender, EventArgs e) { if (_console.IsVisable) { _console.Hide(); } else { _console.Show(); } } private void DisplayProductVersionNumbers(object sender, EventArgs e) { var form = new AboutBox1(); form.ShowDialog(); } private void ViewLogFiles(object sender, EventArgs e) { var form = new FrmLogFileViewer(); form.ShowDialog(); } private void ExitProgram(object sender, EventArgs e) { Close(); } private void DisplayReportSizeSettingsForm(object sender, EventArgs e) { var form = new FrmReportSettings(); form.ShowDialog(); } private void GenerateReportMenuItemClick(object sender, EventArgs e) { printPreviewButton.Enabled = false; var report = new ReportGenerator(); report.GeneratePdfReport(_currentActiveDate); printPreviewButton.Enabled = true; } #endregion #region Print Handler Methods private void PrintPage(object sender, PrintPageEventArgs e) { Bitmap bitMap; if (_lazyPageCounter == 0) { bitMap = new Bitmap(Application.StartupPath + "\\FrontPage.png"); } else { bitMap = new Bitmap(Application.StartupPath + "\\BackPage.png"); } var rect = e.MarginBounds; if (bitMap.Width/(double) bitMap.Height > rect.Width / (double) rect.Height) // image is wider { rect.Height = (int) (bitMap.Height/(double) bitMap.Width* rect.Width); } else { rect.Width = (int) (bitMap.Width/(double) bitMap.Height* rect.Height); } if (_lazyPageCounter == 0) { e.Graphics.DrawImage(bitMap, new Rectangle(0, 25, 850, 1050)); _lazyPageCounter++; e.HasMorePages = true; } else { e.Graphics.DrawImage(bitMap, new Rectangle(0, 0, 850, 1100)); _lazyPageCounter = 0; e.HasMorePages = false; } } private void DisplayPrintPreview(object sender, EventArgs e) { printPreviewButton.Enabled = false; var report = new ReportGenerator(); report.GeneratePdfReport(_currentActiveDate); printPreviewButton.Enabled = true; } private void RenderPage(object sender, PrintPageEventArgs e) { var dialog = new FolderBrowserDialog(); dialog.ShowDialog(); var path = dialog.SelectedPath; var gen = new FrontPageGenerator(); e.Graphics.PageUnit = GraphicsUnit.Inch; } #endregion #region DataGridView Constructor Methods /// /// Builds the appropriate columns in the APC DataGridViews so they can be filled. /// private void ConstructApcDataGridViews() { //Construct a list of column names for the inventory/actual sales DataGridViews and the inventory DataGirdView. string[] saleColumnNames = { "AdItem", "Sold", "SalePrice", "TotalSales", "Cost", "ProfitReturn", "TotalProfitReturn" }; string[] inventoryColumnNames = { "AdItem", "BeginningInventory", "Received", "Total", "EndingInventory" }; foreach (var name in saleColumnNames) { var column = new DataGridViewTextBoxColumn { Name = name, HeaderText = TextFormat.AddSpacesToSentence(name, false), ValueType = typeof(string), SortMode = DataGridViewColumnSortMode.NotSortable, MaxInputLength = 20 }; projectionsDataGridView.Columns.Add(column); } //Add the columns into the inventory DataGridView after setting their types. foreach (var name in inventoryColumnNames) { var column = new DataGridViewTextBoxColumn { Name = name, HeaderText = TextFormat.AddSpacesToSentence(name, false), ValueType = typeof(string), SortMode = DataGridViewColumnSortMode.NotSortable, MaxInputLength = 20 }; inventoryDataGridView.Columns.Add(column); } // foreach (var name in saleColumnNames) { var column = new DataGridViewTextBoxColumn { Name = name, HeaderText = TextFormat.AddSpacesToSentence(name, false), ValueType = typeof(string), SortMode = DataGridViewColumnSortMode.NotSortable, MaxInputLength = 20 }; actualSalesDataGridView.Columns.Add(column); } } /// /// Constructs the invoices DataGridView. /// private void ConstructInvoicesDataGridView() { string[] invoicesColumnNames = { "InvoiceDate", "Supplier", "InvoiceNumber", "InvoiceNetAmountAtCost", "InvoiceNote" }; foreach (var name in invoicesColumnNames) { var column = new DataGridViewTextBoxColumn { Name = name, HeaderText = TextFormat.AddSpacesToSentence(name, false), ValueType = typeof(string), SortMode = DataGridViewColumnSortMode.NotSortable, }; invoicesDataGridView.Columns.Add(column); } } #endregion #region Date Loading Methods private void LoadDate(DateTime date) { var db = new AdvertisingProfitControlModel(); //Check to see if that date record can be found before clearing the form. var dateRecord = db.WeekEndingDates.SingleOrDefault(x => x.EndingDate == date); if (dateRecord == null) { dateTimeGroupBox.Text = @"Failed to retrieve " + date.ToString("d") + @"."; return; } ClearForm(); //Load all the data attached to the date record. LoadProjectionsTable(dateRecord); LoadInventoryTable(dateRecord); LoadActualSalesTable(dateRecord); LoadInvoices(dateRecord); if (db.Notes.Any(x => x.FkDateId == dateRecord.Id)) { var note = db.Notes.Single(x => x.FkDateId == dateRecord.Id); commentsTextBox.Text = note.Remark; } LoadWeeklySales(dateRecord); LoadTaxable(dateRecord); LoadCostAnalysis(dateRecord); CalculateProfitAnalysis(); CalculateGrossProfit(); monthCalendar.BoldedDates = db.WeekEndingDates.Select(zdate => zdate.EndingDate).ToArray(); monthCalendar.SelectionStart = date; dateTimeGroupBox.Text = @"Loaded " + date.ToString("d"); } private void LoadProjectionsTable(WeekEndingDate dateRecord) { var db = new AdvertisingProfitControlModel(); var adSpecialIndex = -1; decimal totalSales = 0; decimal totalProfitReturn = 0; var projections = db.Projections.Where(x => x.WeekEndingDate.Id == dateRecord.Id).Select(x => x).OrderBy(x => x.RowPosition); foreach (var p in projections) { projectionsDataGridView.Rows.Add(); var index = projectionsDataGridView.RowCount - 1; projectionsDataGridView.Rows[index].Cells[0].Value = p.AdItem.Name; projectionsDataGridView.Rows[index].Cells[1].Value = p.Sold; projectionsDataGridView.Rows[index].Cells[2].Value = p.SalePrice; projectionsDataGridView.Rows[index].Cells[3].Value = $@"{p.TotalSales:N2}"; if (p.TotalSales != null) totalSales += (decimal)p.TotalSales; projectionsDataGridView.Rows[index].Cells[4].Value = $@"{p.Cost:N2}"; projectionsDataGridView.Rows[index].Cells[5].Value = $@"{p.ProfitReturn:N2}"; projectionsDataGridView.Rows[index].Cells[6].Value = $@"{p.TotalProfitReturn:N2}"; if (p.TotalProfitReturn != null) totalProfitReturn += (decimal)p.TotalProfitReturn; if (p.RowAttribute == 1) { projectionsDataGridView.Rows[index].DefaultCellStyle.BackColor = ApplicationColors.HeaderRow; } else if (p.RowAttribute == 2) { projectionsDataGridView.Rows[index].DefaultCellStyle.BackColor = ApplicationColors.MemberRow; } if (p.FkAdSpecialId == null || adSpecialIndex != -1) continue; //TODO: Fix null reference when no object is found. adSpecialIndex = index; projectionsDataGridView.Rows.Insert(index, 1); projectionsDataGridView.Rows[index].DefaultCellStyle.BackColor = ApplicationColors.AdSpecial; projectionsDataGridView.Rows[index].Cells[3].Value = db.AdSpecials.Single(x => x.Id == p.FkAdSpecialId).Name; } //Now add the totals row. if (projectionsDataGridView.RowCount == 0) return; var totalsRow = new DataGridViewRow(); projectionsDataGridView.Rows.Add(totalsRow); projectionsDataGridView.Rows[projectionsDataGridView.Rows.Count - 1].Cells[0].Value = "Total"; projectionsDataGridView.Rows[projectionsDataGridView.Rows.Count - 1].Cells[2].Style.Alignment = DataGridViewContentAlignment.MiddleRight; projectionsDataGridView.Rows[projectionsDataGridView.Rows.Count - 1].Cells[2].Value = @"(A)"; if (Math.Abs(totalSales) > 0) { projectionsDataGridView.Rows[projectionsDataGridView.Rows.Count - 1].Cells[3].Value = totalSales.ToString("N2"); } projectionsDataGridView.Rows[projectionsDataGridView.Rows.Count - 1].Cells[5].Style.Alignment = DataGridViewContentAlignment.MiddleRight; projectionsDataGridView.Rows[projectionsDataGridView.Rows.Count - 1].Cells[5].Value = @"(B)"; if (Math.Abs(totalProfitReturn) > 0) { projectionsDataGridView.Rows[projectionsDataGridView.Rows.Count - 1].Cells[6].Value = totalProfitReturn.ToString("N2"); } } private void LoadInventoryTable(WeekEndingDate dateRecord) { var db = new AdvertisingProfitControlModel(); var adSpecialIndex = -1; var inventories = db.Inventories.Where(x => x.WeekEndingDate.Id == dateRecord.Id).Select(x => x).OrderBy(x => x.RowPosition); foreach (var i in inventories) { inventoryDataGridView.Rows.Add(); var index = inventoryDataGridView.RowCount - 1; inventoryDataGridView.Rows[index].Cells[0].Value = i.AdItem.Name; inventoryDataGridView.Rows[index].Cells[1].Value = i.BeginningInventory; inventoryDataGridView.Rows[index].Cells[2].Value = i.Recieved; inventoryDataGridView.Rows[index].Cells[3].Value = i.TotalInventory; inventoryDataGridView.Rows[index].Cells[4].Value = i.EndingInventory; if (i.RowAttribute == 1) { inventoryDataGridView.Rows[index].DefaultCellStyle.BackColor = ApplicationColors.HeaderRow; } else if (i.RowAttribute == 2) { inventoryDataGridView.Rows[index].DefaultCellStyle.BackColor = ApplicationColors.MemberRow; } if (i.FkAdSpecialId == null || adSpecialIndex != -1) continue; adSpecialIndex = index; inventoryDataGridView.Rows.Insert(index, 1); inventoryDataGridView.Rows[index].DefaultCellStyle.BackColor = ApplicationColors.AdSpecial; inventoryDataGridView.Rows[index].Cells[2].Value = db.AdSpecials.Single(x => x.Id == i.FkAdSpecialId).Name; } } private void LoadActualSalesTable(WeekEndingDate dateRecord) { var db = new AdvertisingProfitControlModel(); var adSpecialIndex = -1; decimal totalSales = 0; decimal totalProfitReturn = 0; var actualSales = db.ActualSales.Where(x => x.WeekEndingDate.Id == dateRecord.Id).Select(x => x).OrderBy(x => x.RowPosition); foreach (var a in actualSales) { actualSalesDataGridView.Rows.Add(); var index = actualSalesDataGridView.RowCount - 1; actualSalesDataGridView.Rows[index].Cells[0].Value = a.AdItem.Name; actualSalesDataGridView.Rows[index].Cells[1].Value = a.Sold; actualSalesDataGridView.Rows[index].Cells[2].Value = a.SalePrice; actualSalesDataGridView.Rows[index].Cells[3].Value = $@"{a.TotalSales:N2}"; if (a.TotalSales != null) totalSales += (decimal)a.TotalSales; actualSalesDataGridView.Rows[index].Cells[4].Value = $@"{a.Cost:N2}"; actualSalesDataGridView.Rows[index].Cells[5].Value = $@"{a.ProfitReturn:N2}"; actualSalesDataGridView.Rows[index].Cells[6].Value = $@"{a.TotalProfitReturn:N2}"; if (a.TotalProfitReturn != null) totalProfitReturn += (decimal)a.TotalProfitReturn; if (a.RowAttribute == 1) { actualSalesDataGridView.Rows[index].DefaultCellStyle.BackColor = ApplicationColors.HeaderRow; } else if (a.RowAttribute == 2) { actualSalesDataGridView.Rows[index].DefaultCellStyle.BackColor = ApplicationColors.MemberRow; } if (a.FkAdSpecialId == null || adSpecialIndex != -1) continue; adSpecialIndex = index; actualSalesDataGridView.Rows.Insert(index, 1); actualSalesDataGridView.Rows[index].DefaultCellStyle.BackColor = ApplicationColors.AdSpecial; actualSalesDataGridView.Rows[index].Cells[3].Value = db.AdSpecials.Single(x => x.Id == a.FkAdSpecialId).Name; } //Now add the totals row. if (actualSalesDataGridView.RowCount == 0) return; var totalsRow = new DataGridViewRow(); actualSalesDataGridView.Rows.Add(totalsRow); actualSalesDataGridView.Rows[actualSalesDataGridView.Rows.Count - 1].Cells[0].Value = "Total"; actualSalesDataGridView.Rows[actualSalesDataGridView.Rows.Count - 1].Cells[2].Style.Alignment = DataGridViewContentAlignment.MiddleRight; actualSalesDataGridView.Rows[actualSalesDataGridView.Rows.Count - 1].Cells[2].Value = @"(A)"; if (Math.Abs(totalSales) > 0) { actualSalesDataGridView.Rows[actualSalesDataGridView.Rows.Count - 1].Cells[3].Value = totalSales.ToString("N2"); } actualSalesDataGridView.Rows[actualSalesDataGridView.Rows.Count - 1].Cells[5].Style.Alignment = DataGridViewContentAlignment.MiddleRight; actualSalesDataGridView.Rows[actualSalesDataGridView.Rows.Count - 1].Cells[5].Value = @"(B)"; if (Math.Abs(totalProfitReturn) > 0) { actualSalesDataGridView.Rows[actualSalesDataGridView.Rows.Count - 1].Cells[6].Value = totalProfitReturn.ToString("N2"); } } private void LoadInvoices(WeekEndingDate dateRecord) { _totalInvoicePurchases = 0; var db = new AdvertisingProfitControlModel(); var invoices = db.Invoices.Where(x => x.WeekEndingDate.Id == dateRecord.Id).Select(x => x); foreach (var invoice in invoices) { invoicesDataGridView.Rows.Add(); var index = invoicesDataGridView.RowCount - 1; invoicesDataGridView.Rows[index].Cells[0].Value = invoice.InvoiceDate.ToString("d"); invoicesDataGridView.Rows[index].Cells[1].Value = invoice.Supplier.Name; invoicesDataGridView.Rows[index].Cells[2].Value = invoice.InvoiceNumber; invoicesDataGridView.Rows[index].Cells[3].Value = $@"{invoice.InvoiceNetAmountAtCost:N2}"; //Net Amount Extended Retail is not the required field. if (invoice.InvoiceNetAmountAtCost != null) _totalInvoicePurchases += (decimal)invoice.InvoiceNetAmountAtCost; invoicesDataGridView.Rows[index].Cells[4].Value = invoice.InvoiceNote; } //Add the total purchases row to the invoice table. if(invoicesDataGridView.RowCount == 0) return; var totalPurchaesRow = new DataGridViewRow(); invoicesDataGridView.Rows.Add(totalPurchaesRow); invoicesDataGridView.Rows[invoicesDataGridView.Rows.Count - 1].Cells[0].Value = @"Total Purchases"; if (Math.Abs(_totalInvoicePurchases) > 0) { invoicesDataGridView.Rows[invoicesDataGridView.Rows.Count - 1].Cells[3].Value = _totalInvoicePurchases.ToString("N2"); } } private void LoadWeeklySales(WeekEndingDate dateRecord) { //Clear the department sales and prepare to add up a total. _departmentSales = 0; var db = new AdvertisingProfitControlModel(); var weeklySales = db.WeeklySales.Where(x => x.WeekEndingDate.Id == dateRecord.Id).Select(x => x); foreach (var sale in weeklySales) { if (sale.Sunday != null) { sundayWeeklySalesLabel.Text = sale.Sunday != 0 ? @"Sunday: " + $@"{sale.Sunday:c}" : @"Sunday: " + CheckForHoliday(DayOfWeek.Sunday); _departmentSales += (decimal) sale.Sunday; } if (sale.Monday != null) { mondayWeeklySalesLabel.Text = sale.Monday != 0 ? @"Monday: " + $@"{sale.Monday:c}" : @"Monday: " + CheckForHoliday(DayOfWeek.Monday); _departmentSales += (decimal) sale.Monday; } if (sale.Tuesday != null) { tuesadayWeeklySalesLabel.Text = sale.Tuesday != 0 ? @"Tuesday: " + $@"{sale.Tuesday:c}" : @"Tuesday: " + CheckForHoliday(DayOfWeek.Tuesday); _departmentSales += (decimal) sale.Tuesday; } if (sale.Wednesday != null) { wednesdayWeeklySalesLabel.Text = sale.Wednesday != 0 ? @"Wednesday: " + $@"{sale.Wednesday:c}" : @"Wednesday: " + CheckForHoliday(DayOfWeek.Wednesday); _departmentSales += (decimal) sale.Wednesday; } if (sale.Thursday != null) { thursdayWeeklySalesLabel.Text = sale.Thursday != 0 ? @"Thursday: " + $@"{sale.Thursday:c}" : @"Thursday: " + CheckForHoliday(DayOfWeek.Thursday); _departmentSales += (decimal)sale.Thursday; } if (sale.Friday != null) { fridayWeeklySalesLabel.Text = sale.Friday != 0 ? @"Friday: " + $@"{sale.Friday:c}" : @"Friday: " + CheckForHoliday(DayOfWeek.Friday); _departmentSales += (decimal) sale.Friday; } if (sale.Saturday != null) { saturdayWeeklySalesLabel.Text = sale.Saturday != 0 ? @"Saturday: " + $@"{sale.Saturday:c}" : @"Saturday: " + CheckForHoliday(DayOfWeek.Saturday); _departmentSales += (decimal) sale.Saturday; } totalWeeklySalesLabel.Text = @"Total Sales: " + $@"{sale.TotalSales:c}"; } } private void LoadTaxable(WeekEndingDate dateRecord) { var db = new AdvertisingProfitControlModel(); var taxables = db.Taxables.Where(x => x.WeekEndingDate.Id == dateRecord.Id).Select(x => x); foreach (var taxable in taxables) { sundayTaxableLabel.Text = taxable.Sunday != 0 ? @"Sunday: " + $@"{taxable.Sunday:c}" : @"Sunday: " + CheckForHoliday(DayOfWeek.Sunday); mondayTaxableLabel.Text = taxable.Monday != 0 ? @"Monday: " + $@"{taxable.Monday:c}" : @"Monday: " + CheckForHoliday(DayOfWeek.Monday); tuesdayTaxableLabel.Text = taxable.Tuesday != 0 ? @"Tuesday: " + $@"{taxable.Tuesday:c}" : @"Tuesday: " + CheckForHoliday(DayOfWeek.Tuesday); wednesdayTaxableLabel.Text = taxable.Wednesday != 0 ? @"Wednesday: " + $@"{taxable.Wednesday:c}" : @"Wednesday: " + CheckForHoliday(DayOfWeek.Wednesday); thursdayTaxableLabel.Text = taxable.Thursday != 0 ? @"Thursday: " + $@"{taxable.Thursday:c}" : @"Thursday: " + CheckForHoliday(DayOfWeek.Thursday); fridayTaxableLabel.Text = taxable.Friday != 0 ? @"Friday: " + $@"{taxable.Friday:c}" : @"Friday: " + CheckForHoliday(DayOfWeek.Friday); saturdayTaxableLabel.Text = taxable.Saturday != 0 ? @"Saturday: " + $@"{taxable.Saturday:c}" : @"Saturday: " + CheckForHoliday(DayOfWeek.Saturday); totalTaxableLabel.Text = @"Total: " + $@"{taxable.Total:c}"; } } private void LoadCostAnalysis(WeekEndingDate dateRecord) { var db = new AdvertisingProfitControlModel(); var analysis = db.CostAnalysis.Where(x => x.WeekEndingDate.Id == dateRecord.Id).Select(x => x); foreach (var a in analysis) { salesPerManHourLabel.Text = @"Sales Per Man Hour: " + $@"{a.SalesPerManHour:c}"; salaryPercentageLabel.Text = @"Salary Percentage: " + $@"{a.SalaryPercentage:p}"; salaryDollarsLabel.Text = @"Salary Dollars: " + $@"{a.SalaryDollar:c}"; suppliesLabel.Text = @"Supplies: " + $@"{a.Supplies}"; } } #endregion private string CheckForHoliday(DayOfWeek day) { var holidayText = string.Empty; //Get the currently selected date. var date = monthCalendar.SelectionStart; //Now make sure the selected day on the calendar (the date that came from the database) is not the same //as the day provided, unless the day is Saturday. If the end of week date is not on a Saturday and the //supplied day is Monday, than subtracting 5 would yield an incorrect date. if (date.DayOfWeek == DayOfWeek.Saturday) { switch (day) { case DayOfWeek.Sunday: date = date.AddDays(-6); break; case DayOfWeek.Monday: date = date.AddDays(-5); break; case DayOfWeek.Tuesday: date = date.AddDays(-4); break; case DayOfWeek.Wednesday: date = date.AddDays(-3); break; case DayOfWeek.Thursday: date = date.AddDays(-2); break; case DayOfWeek.Friday: date = date.AddDays(-1); break; } } var holiday = Holiday.IsHoliday(date); switch (holiday) { case Holidays.Thanksgiving: case Holidays.Christmas: case Holidays.NewYearsDay: holidayText = @"Closed for " + TextFormat.AddSpacesToSentence(holiday.ToString(), false); break; } return holidayText; } #region Form Reset And Data Loading Methods /// /// Checks to see if the newly selected date is one that should be loaded. /// /// /// private void ValidateDateChanged(object sender, DateRangeEventArgs e) { if (e.Start == _currentActiveDate || !monthCalendar.BoldedDates.Contains(e.Start)) return; _currentActiveDate = e.Start; //Load the specified date from the database. LoadDate(e.Start); } private void ClearForm() { projectionsDataGridView.Rows.Clear(); inventoryDataGridView.Rows.Clear(); actualSalesDataGridView.Rows.Clear(); invoicesDataGridView.Rows.Clear(); commentsTextBox.Text = string.Empty; commentMainGroupBox.Text = @"Comments"; dateTimeGroupBox.Text = string.Empty; salesPerManHourLabel.Text = @"Sales Per Man Hour:"; salaryPercentageLabel.Text = @"Salary Percentage:"; salaryDollarsLabel.Text = @"Salary Dollars:"; suppliesLabel.Text = @"Supplies:"; costAnalysisGroupBox.Text = @"Cost Analysis"; sundayWeeklySalesLabel.Text = @"Sunday: "; mondayWeeklySalesLabel.Text = @"Monday: "; tuesadayWeeklySalesLabel.Text = @"Tuesday: "; wednesdayWeeklySalesLabel.Text = @"Wednesday: "; thursdayWeeklySalesLabel.Text = @"Wednesday: "; fridayWeeklySalesLabel.Text = @"Friday: "; saturdayWeeklySalesLabel.Text = @"Saturday: "; totalWeeklySalesLabel.Text = @"Total Sales: "; weeklySalesGroupBox.Text = @"Weekly Sales"; sundayTaxableLabel.Text = @"Sunday: "; mondayTaxableLabel.Text = @"Monday: "; tuesdayTaxableLabel.Text = @"Tuesday: "; wednesdayTaxableLabel.Text = @"Wednesday: "; thursdayTaxableLabel.Text = @"Wednesday: "; fridayTaxableLabel.Text = @"Friday: "; saturdayTaxableLabel.Text = @"Saturday: "; totalTaxableLabel.Text = @"Total: "; taxableGroupBox.Text = @"Taxable"; //shrinkLinkLabel.Text = @"Assuming 30% Shrink"; departmentSalesLabel.Text = @"Department Sales: "; salesProducedLabel.Text = @"Sales Produced By Ad Items (A):"; remainingSalesLabel.Text = @"Remaining Sales:"; totalProfitFromAdItemsLabel.Text = @"Total Profit Return" + Environment.NewLine + @"From Ad Items (B): "; totalProfitReturnFromRemaingLabel.Text = @"Total Profit Return" + Environment.NewLine + @"From Remaining Sales: "; totalProfitReturnLabel.Text = @"Total Profit Return: "; grossProfitTotalSales.Text = @"Total Sales:"; grossProfitLessCostOfSales.Text = @"Less Cost of Sales: "; grossProfitDollarGrossProfitLabel.Text = @"Dollar Gross Profit: "; perfectGrossProfitLabel.Text = @"Percent Gross Profit: "; grossProfitEstimatedWeeklyDeptmartmentExpenseLabel.Text = @"Estimated Weekly" + Environment.NewLine + @"Department Expense: "; } private void RefreshDateListing() { var db = new AdvertisingProfitControlModel(); monthCalendar.BoldedDates = db.WeekEndingDates.Select(zdate => zdate.EndingDate).ToArray(); if (monthCalendar.BoldedDates.Length > 0) { modifyRecordMainMenu.Enabled = true; modifyRecordMainMenu.ToolTipText = string.Empty; clearCurrentRecordSelectedDateToolsMainMenu.Enabled = true; clearCurrentRecordSelectedDateToolsMainMenu.ToolTipText = string.Empty; clearCurrentActiveYearTools.Enabled = true; clearCurrentActiveYearTools.ToolTipText = string.Empty; printPreviewButton.Enabled = true; } else { dateTimeGroupBox.Text = @"No records found in the database."; modifyRecordMainMenu.Enabled = false; modifyRecordMainMenu.ToolTipText = @"There are no records to modify."; clearCurrentRecordSelectedDateToolsMainMenu.Enabled = false; clearCurrentRecordSelectedDateToolsMainMenu.ToolTipText = @"There is no date to clear."; clearCurrentActiveYearTools.Enabled = false; clearCurrentActiveYearTools.ToolTipText = @"There are no records to clear."; printPreviewButton.Enabled = false; } } #endregion #region Debug Tool Menu Items private void DisplayDebugTool(object sender, EventArgs e) { var form = new DebugDatabaseConverter(); form.ShowDialog(); RefreshDateListing(); } /// /// Displays the legacy Add Record form. Completely for looks. /// /// /// private void DisplayLegacyAddRecord(object sender, EventArgs e) { var form = new FrmAddRecord(); form.ShowDialog(); } /// /// /// /// /// private void DisplayRawDatabaseView(object sender, EventArgs e) { } #endregion private void ClearActiveDateYearRecords(object sender, EventArgs e) { var result = MessageBox.Show(@"Are you sure you want to remove all records for the year of " + _currentActiveDate.Year + @"? This cannot be undone!", @"Clear " + _currentActiveDate.Year + @"'s Records", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation); if (result != DialogResult.Yes) return; var db = new AdvertisingProfitControlModel(); var distinctYears = db.WeekEndingDates.Select(x => x.EndingDate.Year).Distinct().ToArray(); if (distinctYears.Length == 1) { result = MessageBox.Show(_currentActiveDate.Year + @" appears to be the only year, clearing it will wipe all data in the database. Are you sure you wish to continue?", @"Clear " + _currentActiveDate.Year + @"'s Records", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation); if (result != DialogResult.Yes) return; } if (ClearSelectedDate(_currentActiveDate.Year)) { RefreshDateListing(); } else { MessageBox.Show(@"Failed to clear the records for " + _currentActiveDate.Year + @".", @"Update Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } #region Writing Operations private bool ClearSelectedDate(int year) { var db = new AdvertisingProfitControlModel(); var status = true; using (var scope = new TransactionScope()) { try { var dateRecords = db.WeekEndingDates.Select(x => x).Where(x => x.EndingDate.Year == year).ToArray(); foreach (var dateRecord in dateRecords) { ClearProjectionRecords(dateRecord); ClearInventoyRecords(dateRecord); ClearActualSalesRecords(dateRecord); ClearInvoices(dateRecord); ClearWeeklySales(dateRecord); ClearTaxableRecords(dateRecord); ClearCostAnalysisRecords(dateRecord); ClearCommentsRecords(dateRecord); db.WeekEndingDates.Remove(dateRecord); } db.SaveChanges(); scope.Complete(); } catch (DbUpdateException e) { _console.WriteToLog(FrmLogConsole.Level.Error, e.Message); status = false; } } return status; } private void ClearProjectionRecords(WeekEndingDate dateRecord) { var db = new AdvertisingProfitControlModel(); using (var scope = new TransactionScope()) { var projections = db.Projections.Select(x => x).Where(x => x.FkDateId == dateRecord.Id); db.Projections.RemoveRange(projections); db.SaveChanges(); scope.Complete(); } } private void ClearInventoyRecords(WeekEndingDate dateRecord) { var db = new AdvertisingProfitControlModel(); using (var scope = new TransactionScope()) { var inventories = db.Inventories.Select(x => x).Where(x => x.FkDateId == dateRecord.Id); db.Inventories.RemoveRange(inventories); db.SaveChanges(); scope.Complete(); } } private void ClearActualSalesRecords(WeekEndingDate dateRecord) { var db = new AdvertisingProfitControlModel(); using (var scope = new TransactionScope()) { var actualSales = db.ActualSales.Select(x => x).Where(x => x.FkDateId == dateRecord.Id); db.ActualSales.RemoveRange(actualSales); db.SaveChanges(); scope.Complete(); } } private void ClearInvoices(WeekEndingDate dateRecord) { var db = new AdvertisingProfitControlModel(); using (var scope = new TransactionScope()) { var invoices = db.Invoices.Select(x => x).Where(x => x.FkDateId == dateRecord.Id); db.Invoices.RemoveRange(invoices); db.SaveChanges(); scope.Complete(); } } private void ClearWeeklySales(WeekEndingDate dateRecord) { var db = new AdvertisingProfitControlModel(); using (var scope = new TransactionScope()) { var weeklySales = db.WeeklySales.Select(x => x).Where(x => x.FkDateId == dateRecord.Id); db.WeeklySales.RemoveRange(weeklySales); db.SaveChanges(); scope.Complete(); } } private void ClearTaxableRecords(WeekEndingDate dateRecord) { var db = new AdvertisingProfitControlModel(); using (var scope = new TransactionScope()) { var taxables = db.Taxables.Select(x => x).Where(x => x.FkDateId == dateRecord.Id); db.Taxables.RemoveRange(taxables); db.SaveChanges(); scope.Complete(); } } private void ClearCostAnalysisRecords(WeekEndingDate dateRecord) { var db = new AdvertisingProfitControlModel(); using (var scope = new TransactionScope()) { var costAnalysis = db.CostAnalysis.Select(x => x).Where(x => x.FkDateId == dateRecord.Id); db.CostAnalysis.RemoveRange(costAnalysis); db.SaveChanges(); scope.Complete(); } } private void ClearCommentsRecords(WeekEndingDate dateRecord) { var db = new AdvertisingProfitControlModel(); using (var scope = new TransactionScope()) { var comments = db.Notes.Select(x => x).Where(x => x.FkDateId == dateRecord.Id); db.Notes.RemoveRange(comments); db.SaveChanges(); scope.Complete(); } } #endregion private void ChangeShrinkOnLinkClick(object sender, LinkLabelLinkClickedEventArgs e) { //The text for this label is always going to be 'Assuming X% Shrink Change'. So convert to //an array and grab the second item and convert it to an integer. var text = shrinkLinkLabel.Text.Split(' '); var shrink = int.Parse(text[1].Replace("%", "")); var form = new FrmChangeShrink(shrink); form.ShowDialog(); shrinkLinkLabel.Text = @"Assuming " + form.Shrink + @"% Shrink Change"; var linkArea = new LinkArea(shrinkLinkLabel.Text.IndexOf("C", StringComparison.Ordinal), 6); shrinkLinkLabel.LinkArea = linkArea; var result = (decimal) form.Shrink / 100; CalculateProfitAnalysis(result); } private void testToolStripMenuItem_Click(object sender, EventArgs e) { MessageBox.Show(@"Nothing to debug here!", @"Debug Message", MessageBoxButtons.OK, MessageBoxIcon.Information); } } }