From 218d5be4d61623d62e3ed01a30dbf507fb2ee71e Mon Sep 17 00:00:00 2001
From: Garritt McCune
Date: Tue, 2 May 2017 23:38:00 -0500
Subject: [PATCH] Created the first version of HTML code for the front form.
Changed to the Pechkin HTML to PDF library. Removed the string tester. Fixed
a bug with the main form where the APC tables would not be sorted by row
position.
---
AdvertsingProfitControl.sln | 10 -
.../AdvertsingProfitControl.csproj | 32 +-
AdvertsingProfitControl/App.config | 10 +-
AdvertsingProfitControl/BackPageGenerator.cs | 31 +-
.../DebugDatabaseConverter.Designer.cs | 25 +-
AdvertsingProfitControl/FrmLogFileViewer.cs | 9 +-
AdvertsingProfitControl/FrmMain.Designer.cs | 13 +-
AdvertsingProfitControl/FrmMain.cs | 108 ++-
AdvertsingProfitControl/FrontPageGenerator.cs | 794 +++++++++---------
AdvertsingProfitControl/packages.config | 5 +-
SetupProject/bin/Debug/SetupProject.msi | Bin 1044480 -> 0 bytes
SetupProject/bin/Debug/SetupProject.wixpdb | 1 -
SetupProject/obj/Debug/Product.wixobj | 1 -
...t.wixproj.BindBuiltOutputsFileListnull.txt | 2 -
...oject.wixproj.BindContentsFileListnull.txt | 1 -
...roject.wixproj.BindOutputsFileListnull.txt | 2 -
.../Debug/SetupProject.wixproj.FileList.txt | 6 -
StringInputParseTester/App.config | 6 -
StringInputParseTester/Form1.Designer.cs | 107 ---
StringInputParseTester/Form1.cs | 339 --------
StringInputParseTester/Form1.resx | 120 ---
StringInputParseTester/Program.cs | 22 -
.../Properties/AssemblyInfo.cs | 36 -
.../Properties/Resources.Designer.cs | 71 --
.../Properties/Resources.resx | 117 ---
.../Properties/Settings.Designer.cs | 30 -
.../Properties/Settings.settings | 7 -
.../StringInputParseTester.csproj | 90 --
.../StringInputParseTester.vshost.exe.config | 6 -
...StringInputParseTester.vshost.exe.manifest | 11 -
...le_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs | 0
...le_5937a670-0e60-4077-877b-f7221da3dda1.cs | 0
...le_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs | 0
.../HtmlRenderer.Core.1.5.0.6.nupkg | Bin 1093619 -> 0 bytes
.../HtmlRenderer.WinForms.1.5.0.6.nupkg | Bin 264769 -> 0 bytes
.../HtmlRenderer.WinForms.1.5.0.6/readme.txt | 50 --
36 files changed, 560 insertions(+), 1502 deletions(-)
delete mode 100644 SetupProject/bin/Debug/SetupProject.msi
delete mode 100644 SetupProject/bin/Debug/SetupProject.wixpdb
delete mode 100644 SetupProject/obj/Debug/Product.wixobj
delete mode 100644 SetupProject/obj/Debug/SetupProject.wixproj.BindBuiltOutputsFileListnull.txt
delete mode 100644 SetupProject/obj/Debug/SetupProject.wixproj.BindContentsFileListnull.txt
delete mode 100644 SetupProject/obj/Debug/SetupProject.wixproj.BindOutputsFileListnull.txt
delete mode 100644 SetupProject/obj/Debug/SetupProject.wixproj.FileList.txt
delete mode 100644 StringInputParseTester/App.config
delete mode 100644 StringInputParseTester/Form1.Designer.cs
delete mode 100644 StringInputParseTester/Form1.cs
delete mode 100644 StringInputParseTester/Form1.resx
delete mode 100644 StringInputParseTester/Program.cs
delete mode 100644 StringInputParseTester/Properties/AssemblyInfo.cs
delete mode 100644 StringInputParseTester/Properties/Resources.Designer.cs
delete mode 100644 StringInputParseTester/Properties/Resources.resx
delete mode 100644 StringInputParseTester/Properties/Settings.Designer.cs
delete mode 100644 StringInputParseTester/Properties/Settings.settings
delete mode 100644 StringInputParseTester/StringInputParseTester.csproj
delete mode 100644 StringInputParseTester/bin/Debug/StringInputParseTester.vshost.exe.config
delete mode 100644 StringInputParseTester/bin/Debug/StringInputParseTester.vshost.exe.manifest
delete mode 100644 StringInputParseTester/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs
delete mode 100644 StringInputParseTester/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs
delete mode 100644 StringInputParseTester/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs
delete mode 100644 packages/HtmlRenderer.Core.1.5.0.6/HtmlRenderer.Core.1.5.0.6.nupkg
delete mode 100644 packages/HtmlRenderer.WinForms.1.5.0.6/HtmlRenderer.WinForms.1.5.0.6.nupkg
delete mode 100644 packages/HtmlRenderer.WinForms.1.5.0.6/readme.txt
diff --git a/AdvertsingProfitControl.sln b/AdvertsingProfitControl.sln
index fb42036..caa69e2 100644
--- a/AdvertsingProfitControl.sln
+++ b/AdvertsingProfitControl.sln
@@ -5,8 +5,6 @@ VisualStudioVersion = 15.0.26403.3
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdvertsingProfitControl", "AdvertsingProfitControl\AdvertsingProfitControl.csproj", "{4A45C665-5D02-4724-9CC5-C0C50CA44760}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StringInputParseTester", "StringInputParseTester\StringInputParseTester.csproj", "{2663661B-3D90-4D42-B05E-8038923A2891}"
-EndProject
Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "SetupProject", "SetupProject\SetupProject.wixproj", "{EB640D80-1A1E-4835-90B3-83A688419321}"
EndProject
Global
@@ -25,14 +23,6 @@ Global
{4A45C665-5D02-4724-9CC5-C0C50CA44760}.Release|Any CPU.Build.0 = Release|Any CPU
{4A45C665-5D02-4724-9CC5-C0C50CA44760}.Release|x86.ActiveCfg = Release|Any CPU
{4A45C665-5D02-4724-9CC5-C0C50CA44760}.Release|x86.Build.0 = Release|Any CPU
- {2663661B-3D90-4D42-B05E-8038923A2891}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {2663661B-3D90-4D42-B05E-8038923A2891}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2663661B-3D90-4D42-B05E-8038923A2891}.Debug|x86.ActiveCfg = Debug|Any CPU
- {2663661B-3D90-4D42-B05E-8038923A2891}.Debug|x86.Build.0 = Debug|Any CPU
- {2663661B-3D90-4D42-B05E-8038923A2891}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2663661B-3D90-4D42-B05E-8038923A2891}.Release|Any CPU.Build.0 = Release|Any CPU
- {2663661B-3D90-4D42-B05E-8038923A2891}.Release|x86.ActiveCfg = Release|Any CPU
- {2663661B-3D90-4D42-B05E-8038923A2891}.Release|x86.Build.0 = Release|Any CPU
{EB640D80-1A1E-4835-90B3-83A688419321}.Debug|Any CPU.ActiveCfg = Debug|x86
{EB640D80-1A1E-4835-90B3-83A688419321}.Debug|x86.ActiveCfg = Debug|x86
{EB640D80-1A1E-4835-90B3-83A688419321}.Debug|x86.Build.0 = Debug|x86
diff --git a/AdvertsingProfitControl/AdvertsingProfitControl.csproj b/AdvertsingProfitControl/AdvertsingProfitControl.csproj
index 7219b2e..a32ac5d 100644
--- a/AdvertsingProfitControl/AdvertsingProfitControl.csproj
+++ b/AdvertsingProfitControl/AdvertsingProfitControl.csproj
@@ -30,7 +30,7 @@
true
- x64
+ x86
true
full
false
@@ -82,6 +82,12 @@
app.manifest
+
+ ..\packages\Common.Logging.3.3.1\lib\net40\Common.Logging.dll
+
+
+ ..\packages\Common.Logging.Core.3.3.1\lib\net40\Common.Logging.Core.dll
+
..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll
True
@@ -90,13 +96,8 @@
..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll
True
-
- ..\packages\HtmlRenderer.Core.1.5.0.6\lib\net45\HtmlRenderer.dll
- True
-
-
- ..\packages\HtmlRenderer.WinForms.1.5.0.6\lib\net45\HtmlRenderer.WinForms.dll
- True
+
+ ..\packages\Pechkin.0.5.8.1\lib\net40\Pechkin.dll
@@ -282,7 +283,22 @@
Always
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
-
+
@@ -30,4 +30,12 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AdvertsingProfitControl/BackPageGenerator.cs b/AdvertsingProfitControl/BackPageGenerator.cs
index 3b31562..96fe57d 100644
--- a/AdvertsingProfitControl/BackPageGenerator.cs
+++ b/AdvertsingProfitControl/BackPageGenerator.cs
@@ -3,8 +3,8 @@ using System.Data;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Imaging;
+using System.Linq;
using System.Web.UI;
-using TheArtOfDev.HtmlRenderer.WinForms;
namespace AdvertsingProfitControl
{
@@ -22,9 +22,9 @@ namespace AdvertsingProfitControl
try
{
- var imageFromHtml = HtmlRender.RenderToImage(code);
- imageFromHtml.Save(Application.StartupPath + "\\BackPage.png", ImageFormat.Png);
- imageFromHtml.Dispose();
+ //var imageFromHtml = HtmlRender.RenderToImage(code);
+ //imageFromHtml.Save(Application.StartupPath + "\\BackPage.png", ImageFormat.Png);
+ //imageFromHtml.Dispose();
}
catch (Exception e)
{
@@ -36,7 +36,28 @@ namespace AdvertsingProfitControl
}
}
- public void GenerateWeeklyInventoryControlPage(int dateId)
+ public void RenderHtmlCodeToImage(string path, string targetPath)
+ {
+ var htmlCode = File.ReadAllLines(path);
+ var code = htmlCode.Aggregate("", (current, line) => current + "\r\n" + line);
+
+ try
+ {
+ //var imageFromHtml = HtmlRender.RenderToImage(code);
+ //imageFromHtml.Save(targetPath, ImageFormat.Png);
+ //imageFromHtml.Dispose();
+ }
+ catch (Exception e)
+ {
+ _console.WriteToLog(FrmLogConsole.Level.Critical,
+ "Failed to generate an updated image for the back page of Advertising Profit Control.");
+ _console.WriteToLog(FrmLogConsole.Level.Debug, e.Message);
+ _console.WriteToLog(FrmLogConsole.Level.Info, "This is most likely a screw you from the GDI+ subsystem of Windows.");
+
+ }
+ }
+
+ public void GenerateWeeklyInventoryControlPage(int dateId)
{
//var databaseTracker = new DatabaseTracker();
//var databaseReader = new DatabaseReader();
diff --git a/AdvertsingProfitControl/DebugDatabaseConverter.Designer.cs b/AdvertsingProfitControl/DebugDatabaseConverter.Designer.cs
index b28c4f5..741a5ac 100644
--- a/AdvertsingProfitControl/DebugDatabaseConverter.Designer.cs
+++ b/AdvertsingProfitControl/DebugDatabaseConverter.Designer.cs
@@ -34,7 +34,7 @@
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
this.convertButton = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
- this.button1 = new System.Windows.Forms.Button();
+ this.webBrowser1 = new System.Windows.Forms.WebBrowser();
this.SuspendLayout();
//
// existingDatesListBox
@@ -90,22 +90,23 @@
this.label1.TabIndex = 4;
this.label1.Text = "label1";
//
- // button1
+ // webBrowser1
//
- this.button1.Location = new System.Drawing.Point(400, 530);
- this.button1.Name = "button1";
- this.button1.Size = new System.Drawing.Size(141, 58);
- this.button1.TabIndex = 5;
- this.button1.Text = "button1";
- this.button1.UseVisualStyleBackColor = true;
- this.button1.Click += new System.EventHandler(this.button1_Click);
+ this.webBrowser1.AllowNavigation = false;
+ this.webBrowser1.AllowWebBrowserDrop = false;
+ this.webBrowser1.Location = new System.Drawing.Point(776, 53);
+ this.webBrowser1.MinimumSize = new System.Drawing.Size(20, 20);
+ this.webBrowser1.Name = "webBrowser1";
+ this.webBrowser1.Size = new System.Drawing.Size(1524, 940);
+ this.webBrowser1.TabIndex = 6;
+ this.webBrowser1.Url = new System.Uri("file:///C:/Users/Crypto/Desktop/FrontPage.html", System.UriKind.Absolute);
//
// DebugDatabaseConverter
//
this.AutoScaleDimensions = new System.Drawing.SizeF(11F, 24F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(701, 592);
- this.Controls.Add(this.button1);
+ this.ClientSize = new System.Drawing.Size(2374, 1114);
+ this.Controls.Add(this.webBrowser1);
this.Controls.Add(this.label1);
this.Controls.Add(this.convertButton);
this.Controls.Add(this.moveOverButton);
@@ -127,6 +128,6 @@
private System.Windows.Forms.OpenFileDialog openFileDialog1;
private System.Windows.Forms.Button convertButton;
private System.Windows.Forms.Label label1;
- private System.Windows.Forms.Button button1;
+ private System.Windows.Forms.WebBrowser webBrowser1;
}
}
\ No newline at end of file
diff --git a/AdvertsingProfitControl/FrmLogFileViewer.cs b/AdvertsingProfitControl/FrmLogFileViewer.cs
index a36a975..91d9fe0 100644
--- a/AdvertsingProfitControl/FrmLogFileViewer.cs
+++ b/AdvertsingProfitControl/FrmLogFileViewer.cs
@@ -53,7 +53,14 @@ namespace AdvertsingProfitControl
var node = new TreeNode(file.Name) { Name = file.FullName };
fileListTreeView.Nodes.Add(node);
}
-
+ //Grab the HTML files
+ fileNames = Directory.GetFiles(Application.StartupPath, "*.html", SearchOption.TopDirectoryOnly);
+ foreach (var fileName in fileNames)
+ {
+ var file = new FileInfo(fileName);
+ var node = new TreeNode(file.Name) { Name = file.FullName };
+ fileListTreeView.Nodes.Add(node);
+ }
if (fileListTreeView.Nodes.Count <= 0) return;
ReadSelectedFile();
}
diff --git a/AdvertsingProfitControl/FrmMain.Designer.cs b/AdvertsingProfitControl/FrmMain.Designer.cs
index 1d1df48..ab24466 100644
--- a/AdvertsingProfitControl/FrmMain.Designer.cs
+++ b/AdvertsingProfitControl/FrmMain.Designer.cs
@@ -52,6 +52,7 @@
this.rawViewDebugMainMenu = new System.Windows.Forms.ToolStripMenuItem();
this.migrateDatabaseDebugMainMenu = new System.Windows.Forms.ToolStripMenuItem();
this.addRecordToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.testToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mainTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
this.commentMainTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
this.profitAnalysisMainGroupBox = new System.Windows.Forms.GroupBox();
@@ -140,7 +141,6 @@
this.printPreviewButton.TabIndex = 4;
this.printPreviewButton.Text = "Print Preview";
this.printPreviewButton.UseVisualStyleBackColor = true;
- this.printPreviewButton.Visible = false;
this.printPreviewButton.Click += new System.EventHandler(this.DisplayPrintPreview);
//
// mainMenu
@@ -299,7 +299,8 @@
this.debugMainMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.rawViewDebugMainMenu,
this.migrateDatabaseDebugMainMenu,
- this.addRecordToolStripMenuItem});
+ this.addRecordToolStripMenuItem,
+ this.testToolStripMenuItem});
this.debugMainMenu.Name = "debugMainMenu";
this.debugMainMenu.Size = new System.Drawing.Size(87, 34);
this.debugMainMenu.Text = "Debug";
@@ -326,6 +327,13 @@
this.addRecordToolStripMenuItem.Text = "Add Re&cord";
this.addRecordToolStripMenuItem.Click += new System.EventHandler(this.DisplayLegacyAddRecord);
//
+ // testToolStripMenuItem
+ //
+ this.testToolStripMenuItem.Name = "testToolStripMenuItem";
+ this.testToolStripMenuItem.Size = new System.Drawing.Size(270, 34);
+ this.testToolStripMenuItem.Text = "Test";
+ this.testToolStripMenuItem.Click += new System.EventHandler(this.testToolStripMenuItem_Click);
+ //
// mainTableLayoutPanel
//
this.mainTableLayoutPanel.ColumnCount = 2;
@@ -1117,6 +1125,7 @@
private System.Windows.Forms.ToolStripMenuItem clearCurrentRecordSelectedDateToolsMainMenu;
private System.Windows.Forms.ToolStripMenuItem clearCurrentActiveYearTools;
private System.Windows.Forms.ToolStripMenuItem examineLogsToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem testToolStripMenuItem;
}
}
diff --git a/AdvertsingProfitControl/FrmMain.cs b/AdvertsingProfitControl/FrmMain.cs
index 49080cf..270abf6 100644
--- a/AdvertsingProfitControl/FrmMain.cs
+++ b/AdvertsingProfitControl/FrmMain.cs
@@ -2,7 +2,6 @@
using System.Data.Entity.Infrastructure;
using System.Drawing;
using System.Drawing.Printing;
-using System.IO;
using System.Linq;
using System.Transactions;
using System.Windows.Forms;
@@ -337,43 +336,68 @@ namespace AdvertsingProfitControl
private void DisplayPrintPreview(object sender, EventArgs e)
{
//Build and render the front and back forms of the document.
- var test = new FrontPageGenerator();
- var backPageTest = new BackPageGenerator();
- var printTestPage = new PrintDocument();
- var printDialog = new PrintPreviewDialog();
- if (!usePreRenderedFilesCheckbox.Checked)
- {
- //var databaseTracker = new DatabaseTracker();
- //var databaseReader = new DatabaseReader();
- //var dateId =
- // databaseReader.RetrieveDateIdByDateString(monthCalendar.SelectionStart.ToShortDateString(),
- // databaseTracker.DatabaseConnectionString);
- //var remaingingSales = _departmentSales - _salesProducedByAdItems;
- //var totalProfitReturnFromReminaingSales = remaingingSales * .3m;
- //var totalProfitReturn = _totalProfitReturnFromAdItems + totalProfitReturnFromReminaingSales;
- ////test.BuildFormFrontCompressedLayout(dateId, _departmentSales, _salesProducedByAdItems, remaingingSales,
- // //_totalProfitReturnFromAdItems, totalProfitReturnFromReminaingSales, totalProfitReturn,
- // //commentsTextBox.Text);
- //test.RenderHtmlToImage();
- //backPageTest.GenerateWeeklyInventoryControlPage(dateId);
- //backPageTest.RenderHtmlToImage();
- }
- else
- {
- if (File.Exists(Application.StartupPath + "\\" + "FrontPage.html") &&
- File.Exists(Application.StartupPath + "\\" + "Backpage.html"))
- {
- test.RenderHtmlToImage();
- backPageTest.RenderHtmlToImage();
- }
- }
+ //var test = new FrontPageGenerator();
+ //var backPageTest = new BackPageGenerator();
+ //var printTestPage = new PrintDocument();
+ //var printDialog = new PrintPreviewDialog();
+ //if (!usePreRenderedFilesCheckbox.Checked)
+ //{
+ // //var databaseTracker = new DatabaseTracker();
+ // //var databaseReader = new DatabaseReader();
+ // //var dateId =
+ // // databaseReader.RetrieveDateIdByDateString(monthCalendar.SelectionStart.ToShortDateString(),
+ // // databaseTracker.DatabaseConnectionString);
+ // //var remaingingSales = _departmentSales - _salesProducedByAdItems;
+ // //var totalProfitReturnFromReminaingSales = remaingingSales * .3m;
+ // //var totalProfitReturn = _totalProfitReturnFromAdItems + totalProfitReturnFromReminaingSales;
+ // ////test.BuildFormFrontCompressedLayout(dateId, _departmentSales, _salesProducedByAdItems, remaingingSales,
+ // // //_totalProfitReturnFromAdItems, totalProfitReturnFromReminaingSales, totalProfitReturn,
+ // // //commentsTextBox.Text);
+ // //test.RenderHtmlToImage();
+ // //backPageTest.GenerateWeeklyInventoryControlPage(dateId);
+ // //backPageTest.RenderHtmlToImage();
+ //}
+ //else
+ //{
+ // if (File.Exists(Application.StartupPath + "\\" + "FrontPage.html") &&
+ // File.Exists(Application.StartupPath + "\\" + "Backpage.html"))
+ // {
+ // test.RenderHtmlToImage();
+ // backPageTest.RenderHtmlToImage();
+ // }
+ //}
//var margin = new Margins(50, 50, 0, 0);
//printDoc.DefaultPageSettings.Margins = margin;
- printTestPage.PrintPage += PrintPage;
- printDialog.Document = printTestPage;
- printDialog.ShowDialog();
- printDialog.Document = new PrintDocument();
+ //printTestPage.PrintPage += PrintPage;
+ //printDialog.Document = printTestPage;
+ //printDialog.ShowDialog();
+ //printDialog.Document = new PrintDocument();
+
+ //var dialog = new FolderBrowserDialog();
+ //dialog.ShowDialog();
+ //var path = dialog.SelectedPath;
+ var gen = new FrontPageGenerator();
+ gen.BuildFormFrontCompressedLayout(_currentActiveDate);
+ //var pdf = gen.RenderHtmlCodeToImage(path + "\\FrontPage.html", path + "\\Image.pdf");
+ //var doc = new PrintDocument();
+ //doc.PrintPage += RenderPage;
+ //var spam = new PrintPreviewDialog {Document = doc};
+ //spam.ShowDialog();
+ //var form = new Test();
+ //form.ShowDialog();
+ }
+
+ private void RenderPage(object sender, PrintPageEventArgs e)
+ {
+ var dialog = new FolderBrowserDialog();
+ dialog.ShowDialog();
+ var path = dialog.SelectedPath;
+ var gen = new FrontPageGenerator();
+ var pdf = gen.RenderHtmlCodeToImage(path + "\\FrontPage.html", path + "\\Image.pdf");
+ e.Graphics.DrawString(pdf.ToString(), DefaultFont, new SolidBrush(Color.Black), 1000, 1000);
+
+ e.Graphics.PageUnit = GraphicsUnit.Inch;
}
#endregion
@@ -500,7 +524,7 @@ namespace AdvertsingProfitControl
var adSpecialIndex = -1;
decimal totalSales = 0;
decimal totalProfitReturn = 0;
- var projections = db.Projections.Where(x => x.WeekEndingDate.Id == dateRecord.Id).Select(x => x);
+ var projections = db.Projections.Where(x => x.WeekEndingDate.Id == dateRecord.Id).Select(x => x).OrderBy(x => x.RowPosition);
foreach (var p in projections)
{
@@ -558,7 +582,7 @@ namespace AdvertsingProfitControl
{
var db = new AdvertisingProfitControlModel();
var adSpecialIndex = -1;
- var inventories = db.Inventories.Where(x => x.WeekEndingDate.Id == dateRecord.Id).Select(x => x);
+ var inventories = db.Inventories.Where(x => x.WeekEndingDate.Id == dateRecord.Id).Select(x => x).OrderBy(x => x.RowPosition);
foreach (var i in inventories)
{
@@ -592,7 +616,7 @@ namespace AdvertsingProfitControl
var adSpecialIndex = -1;
decimal totalSales = 0;
decimal totalProfitReturn = 0;
- var actualSales = db.ActualSales.Where(x => x.WeekEndingDate.Id == dateRecord.Id).Select(x => x);
+ var actualSales = db.ActualSales.Where(x => x.WeekEndingDate.Id == dateRecord.Id).Select(x => x).OrderBy(x => x.RowPosition);
foreach (var a in actualSales)
{
@@ -1124,5 +1148,13 @@ namespace AdvertsingProfitControl
var result = (decimal) form.Shrink / 100;
CalculateProfitAnalysis(result);
}
+
+ private void testToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ var page = new FrontPageGenerator();
+ page.RenderHtmlCodeToImage("C:\\Users\\Crypto\\Desktop\\TestPage.html",
+ "C:\\Users\\Crypto\\Desktop\\FrontTest.pdf");
+
+ }
}
}
\ No newline at end of file
diff --git a/AdvertsingProfitControl/FrontPageGenerator.cs b/AdvertsingProfitControl/FrontPageGenerator.cs
index 90d8a65..a981af4 100644
--- a/AdvertsingProfitControl/FrontPageGenerator.cs
+++ b/AdvertsingProfitControl/FrontPageGenerator.cs
@@ -1,10 +1,11 @@
using System;
+using System.Drawing.Printing;
using System.Windows.Forms;
using System.IO;
using System.Web.UI;
-using System.Drawing;
-using System.Drawing.Imaging;
-using TheArtOfDev.HtmlRenderer.WinForms;
+using System.Linq;
+using System.Web.UI.WebControls;
+using Pechkin;
namespace AdvertsingProfitControl
{
@@ -23,10 +24,10 @@ namespace AdvertsingProfitControl
try
{
- var imageFromHtml = HtmlRender.RenderToImage(code);
- imageFromHtml.RotateFlip(RotateFlipType.Rotate90FlipNone);
- imageFromHtml.Save(Application.StartupPath + "\\FrontPage.png", ImageFormat.Png);
- imageFromHtml.Dispose();
+ //var imageFromHtml = HtmlRender.RenderToImage(code);
+ //imageFromHtml.RotateFlip(RotateFlipType.Rotate90FlipNone);
+ //imageFromHtml.Save(Application.StartupPath + "\\FrontPage.png", ImageFormat.Png);
+ //imageFromHtml.Dispose();
}
catch (Exception e)
{
@@ -38,469 +39,466 @@ namespace AdvertsingProfitControl
}
}
- public void BuildFormFrontCompressedLayout(int dateId, double departmentSales, double salesProducedByAdItems, double remainingSales, double totalProfitReturnFromAdItems, double totalProfitReturnFromRemainingSales, double totalProfitReturn, string comments)
+ public byte[] RenderHtmlCodeToImage(string path, string targetPath)
+ {
+ var htmlCode = File.ReadAllLines(path);
+ var code = htmlCode.Aggregate("", (current, line) => current + "\r\n" + line);
+ try
+ {
+ var config = new Pechkin.GlobalConfig().SetPaperSize(PaperKind.A4).SetPaperOrientation(true);
+ byte[] pdfBuf = new SimplePechkin(config).Convert(code);
+ using (var fs = new FileStream(targetPath, FileMode.Create, FileAccess.Write))
+ {
+ fs.Write(pdfBuf, 0, pdfBuf.Length);
+ }
+ return pdfBuf;
+ }
+ catch (Exception e)
+ {
+ _console.WriteToLog(FrmLogConsole.Level.Critical,
+ "Failed to generate an updated image for the back page of Advertising Profit Control.");
+ _console.WriteToLog(FrmLogConsole.Level.Debug, e.Message);
+ _console.WriteToLog(FrmLogConsole.Level.Info, "This is most likely a screw you from the GDI+ subsystem of Windows.");
+
+ }
+ return new byte[1];
+ }
+
+ public void BuildFormFrontCompressedLayout(DateTime date)
{
- //var databaseTracker = new DatabaseTracker();
- //var databaseReader = new DatabaseReader();
var stringWriter = new StringWriter();
var writer = new HtmlTextWriter(stringWriter);
- //var table = databaseReader.ReturnApcTableForReport(dateId, databaseTracker.DatabaseConnectionString);
- //var dateString = databaseReader.RetrieveDateStringById(dateId, databaseTracker.DatabaseConnectionString);
- //var spam = dateString.Split(' ');
- //dateString = spam[0];
- //Begin evaluating the size of the table.
- var isCompressedFormat = false;
- var willGenerateCommentRow = false;
- //if ((table.Rows.Count + 1) == 15)
- //{
- // willGenerateCommentRow = true;
- //}
- //else if ((table.Rows.Count + 1) < 15)
- //{
- // isCompressedFormat = true;
- //}
+ var db = new AdvertisingProfitControlModel();
+ var dateRecord = db.WeekEndingDates.SingleOrDefault(x => x.EndingDate == date);
+ if (dateRecord == null)
+ {
+ MessageBox.Show("Failed");
+ return;
+ }
writer.Write("\n");
writer.RenderBeginTag(HtmlTextWriterTag.Html);
writer.RenderBeginTag(HtmlTextWriterTag.Head);
writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/css");
+ //Set the global style for the data cells.
writer.RenderBeginTag(HtmlTextWriterTag.Style);
- writer.Write("th{margins:0; padding:0; vertical-align:bottom; height:35px; font-size:14px; border:1px solid black}");
- writer.Write("td{margins:0; padding:0; border:1px solid black; font-size:14px; text-align:center; height:35px}");
- writer.RenderEndTag();//style
- writer.RenderEndTag(); // Head
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "width:11in; height:8in");
+ writer.Write("td{margins:0; padding:2px; border:1px solid black; font-size:20px; text-align:center; vertical-align:bottom}");
+ writer.RenderEndTag();// end style
+ writer.RenderEndTag(); // end Head
writer.RenderBeginTag(HtmlTextWriterTag.Body);
- //Begin building the header for the page, the HTML engine doesn't seem to like putting content in the Head.
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "margin-top:200px; width:100%");
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-collapse: collapse; width:100%; height:100%"); //style for the table
writer.RenderBeginTag(HtmlTextWriterTag.Table);
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "margin:0px; padding:0px");
- writer.RenderBeginTag(HtmlTextWriterTag.Tr);
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "font-size:14px; width:20%; vertical-align:bottom; border:none");
+ //Begin rendering the top rows, the form name, store, department and date fields.
+ writer.RenderBeginTag(HtmlTextWriterTag.Tr);//begin first row
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; font-size:40px");
+ writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "20");
writer.RenderBeginTag(HtmlTextWriterTag.Td);
- writer.Write("Store Name: Allen's of Hastings
");
- writer.RenderEndTag();//td
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "width:50%; font-size:15px; margin:0px; padding: 0px 0px 0px 0px; border:none");
- writer.RenderBeginTag(HtmlTextWriterTag.Td); //
(Mode: " + (willGenerateCommentRow ? "Generates Comment row" : "Compressed Format") + ")
- writer.Write("
Advertising Profit Control v " + Application.ProductVersion + "
");
- writer.RenderEndTag();//td
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "width:33%; padding: 0px 0px 0px 0px; margin:0px; border:none; vertical-align:bottom");
- writer.RenderBeginTag(HtmlTextWriterTag.Td);
- writer.Write("Week Ending: + dateString +
Department: Produce
");
- writer.RenderEndTag();//td
- writer.RenderEndTag();//tr
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "margin:0px; padding:0px");
- writer.RenderBeginTag(HtmlTextWriterTag.Tr);
+ writer.Write("Advertising Profit Control v" + Application.ProductVersion + "");
+ writer.RenderEndTag();//end product cell.
+ writer.RenderEndTag(); //End of first row
+ writer.RenderBeginTag(HtmlTextWriterTag.Tr); //begin second row
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "text-align:left; border:none");
+ writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "9");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);//begin store name cell
+ writer.Write("Store Name: Allen's of Hastings");
+ writer.RenderEndTag();//end store name cell
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "text-align:right; border:none");
+ writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "11");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td); //begin date and department cell
+ writer.Write("Week Ending: " + date.ToString("d") + "
Department: Produce");
+ writer.RenderEndTag();//End date and department cell
+ writer.RenderEndTag();// second row
+ writer.RenderBeginTag(HtmlTextWriterTag.Tr);//begin label row
writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none");
writer.RenderBeginTag(HtmlTextWriterTag.Td);
- writer.RenderEndTag();//td
+ writer.RenderEndTag();
writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none");
- writer.RenderBeginTag(HtmlTextWriterTag.Td);
- writer.Write("ProjectionActual
");
- writer.RenderEndTag();//td
+ writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "6");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);//projections label cell
+ writer.Write("Projection");
+ writer.RenderEndTag();//end projections label cell
writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none");
- writer.RenderBeginTag(HtmlTextWriterTag.Td);
- writer.Write("Profit Analysis
");
- writer.RenderEndTag();//td
- writer.RenderEndTag();//tr
- writer.RenderEndTag();//table
- //END of header table structure
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-collapse: collapse; width:11in; height:7.0in; table-layout:fixed"); //style for the table
- writer.RenderBeginTag(HtmlTextWriterTag.Table);
+ writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "10");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);//actual label cell
+ writer.Write("Actual");
+ writer.RenderEndTag();//end actual label cell
+ writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "3");
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);//cost analysis label cell
+ writer.Write("Cost Analysis");
+ writer.RenderEndTag();//end cost analysis label cell
+ writer.RenderEndTag();//end label row (third row)
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
//Begin building the header row.
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-left:none");
- writer.RenderBeginTag(HtmlTextWriterTag.Th);
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-left:none; border-right:double");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Ad Items");
writer.RenderEndTag(); //th
writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9");
- writer.RenderBeginTag(HtmlTextWriterTag.Th);
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Sold");
writer.RenderEndTag(); //th
writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9");
- writer.RenderBeginTag(HtmlTextWriterTag.Th);
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Sale
Price");
writer.RenderEndTag(); //th
writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9");
- writer.RenderBeginTag(HtmlTextWriterTag.Th);
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Total
Sales");
writer.RenderEndTag(); //th
writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9");
- writer.RenderBeginTag(HtmlTextWriterTag.Th);
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Cost");
writer.RenderEndTag(); //th
writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9");
- writer.RenderBeginTag(HtmlTextWriterTag.Th);
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("$
Prof.
Retn.");
writer.RenderEndTag(); //th
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9");
- writer.RenderBeginTag(HtmlTextWriterTag.Th);
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9; border-right:double");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Total
$
Prof.
Retn.");
writer.RenderEndTag(); //th
- writer.RenderBeginTag(HtmlTextWriterTag.Th);
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Beg.
Inv.");
writer.RenderEndTag(); //th
- writer.RenderBeginTag(HtmlTextWriterTag.Th);
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Rec'd");
writer.RenderEndTag(); //th
- writer.RenderBeginTag(HtmlTextWriterTag.Th);
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Total");
writer.RenderEndTag(); //th
- writer.RenderBeginTag(HtmlTextWriterTag.Th);
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("End.
Inv.");
writer.RenderEndTag(); //th
- writer.RenderBeginTag(HtmlTextWriterTag.Th);
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Sold");
writer.RenderEndTag(); //th
- writer.RenderBeginTag(HtmlTextWriterTag.Th);
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Sale
Price");
writer.RenderEndTag(); //th
- writer.RenderBeginTag(HtmlTextWriterTag.Th);
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Total
Sales");
writer.RenderEndTag(); //th
- writer.RenderBeginTag(HtmlTextWriterTag.Th);
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Cost");
writer.RenderEndTag(); //th
- writer.RenderBeginTag(HtmlTextWriterTag.Th);
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("$
Prof.
Retn.");
- writer.RenderEndTag(); //th
- writer.RenderBeginTag(HtmlTextWriterTag.Th);
+ writer.RenderEndTag(); //th
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Total
$
Prof.
Retn.");
writer.RenderEndTag(); //th
//Department Sales
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "width:159px; border-right:none");
- writer.RenderBeginTag(HtmlTextWriterTag.Td);
- writer.Write("Department
Sales1"+ $"{departmentSales:C}" + "
");
- writer.RenderEndTag();//td
+ //Grab the department sales from the database
+ var departmentRecord = db.WeeklySales.SingleOrDefault(x => x.FkDateId == dateRecord.Id);
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:none; border-left:double; font-size:9px");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);//begin number cell
+ writer.Write("1");
+ writer.RenderEndTag();//end number cell
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:none; border-left:none");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);//begin department sales cell
+ writer.Write("Department
Sales");
+ writer.RenderEndTag();//end department sales cell
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:none; border-left:none");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);//department sales total sales column
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "margin:0px; border-left:1px solid black; border-top:1px dashed black; text-align:right");
+ writer.RenderBeginTag(HtmlTextWriterTag.P);//begin department sales paragraph tag; used because the borders of the element are flush with that of the cell's.
+ writer.Write(departmentRecord == null ? "$0.00" : $"{departmentRecord.TotalSales:C}");
+ writer.RenderEndTag();//end department sales paragraph tag
+ writer.RenderEndTag();//department sales total sales column
writer.RenderEndTag();//End of header row code.
-
- var isRowMember = false;
- var isRenderingGroup = false;
- var adSpecialRowIndex = -1;
- //Variables for the Totals row.
- double projectionProfitReturn = 0;
- double projectionTotalProfitReturn = 0;
- double actualProfitReturn = 0;
- double actualTotalProfitReturn = 0;
- var adSpecialOffset = 0;
//Profit Analysis values.
- //for (var rowIndex = 0; rowIndex < (table.Rows.Count < 19 ? 19 : table.Rows.Count); rowIndex++) //The comparison in the for loop is index based, so no need to add one to the row count.
- //{
- // var isProfitAnalysisCell = false;
- // //IF the row index goes beyond the number of rows that are in the table, then start padding with blank cells to fit the Profit Analysis cells.
- // if (rowIndex < table.Rows.Count)
- // {
- // var row = table.Rows[rowIndex];
- // var rowAttribute = 0;
- // var groupId = 0;
- // if (int.TryParse(row.ItemArray[17].ToString(), out rowAttribute))
- // {
- // if (rowAttribute != 0)
- // {
- // if (rowAttribute == 1)
- // {
- // isRowMember = false;
- // }
- // else
- // {
- // isRowMember = true;
- // }
- // isRenderingGroup = true;
- // }
- // else
- // {
- // isRenderingGroup = false;
- // isRowMember = false;
- // }
- // }
- // if (adSpecialRowIndex == -1 && int.TryParse(row.ItemArray[18].ToString(), out groupId))
- // {
- // if (groupId != 0)
- // {
- // adSpecialRowIndex = rowIndex;
- // writer.RenderBeginTag(HtmlTextWriterTag.Tr);
- // writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "17");
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-left:none");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write("" +
- // databaseReader.ReturnGroupNameFromGroupId(groupId.ToString(),
- // databaseTracker.DatabaseConnectionString) + "");
- // writer.RenderEndTag(); //td
- // writer.RenderEndTag(); //tr
- // BuildProfitAnalysisCell(ref writer, rowIndex, out isProfitAnalysisCell, salesProducedByAdItems, remainingSales, totalProfitReturnFromAdItems, totalProfitReturnFromRemainingSales, totalProfitReturn);
- // adSpecialOffset++;
- // }
- // }
- // writer.RenderBeginTag(HtmlTextWriterTag.Tr);
- // for (var i = 0; i < row.ItemArray.Length; i++)
- // {
- // if (i >= 17) continue;
- // if (i == 0)
- // {
- // writer.AddStyleAttribute(HtmlTextWriterStyle.TextAlign, "left");
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-left:none");
- // }
- // else if (i > 0 && i < 7)
- // {
- // //background-color:#e9e9e9
- // writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor, "#e9e9e9");
- // }
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // decimal number;
- // if (decimal.TryParse(row.ItemArray[i].ToString(), out number))
- // {
- // //Check for the inventory columns and the sold columns.
- // if (!isRowMember)
- // {
- // if (i == 1 || i > 6 && i < 12)
- // {
- // writer.Write(number == 0 ? "0" : row.ItemArray[i].ToString());
- // }
- // if (i > 1 && i < 7 || i > 11)
- // {
- // writer.Write(number == 0 ? "0.00" : $"{number:N}");
- // }
- // }
+ var projections = db.Projections.Where(x => x.FkDateId == dateRecord.Id).OrderBy(x => x.RowPosition).ToList();
+ var inventory = db.Inventories.Where(x => x.FkDateId == dateRecord.Id).OrderBy(x => x.RowPosition).ToList();
+ var actualSales = db.ActualSales.Where(x => x.FkDateId == dateRecord.Id).OrderBy(x => x.RowPosition).ToList();
+ var comments = db.Notes.SingleOrDefault(x => x.FkDateId == dateRecord.Id);
+ var projectionA = projections.Sum(x => x.TotalSales);
+ var projectionB = projections.Sum(x => x.TotalProfitReturn);
+ var actualA = actualSales.Sum(x => x.TotalSales);
+ var actualB = actualSales.Sum(x => x.TotalProfitReturn);
+ var adSpecialIndex = -1;
+ for (var i = 0; i < 25; i++)
+ {
+ var skipCheck = false;
+ if (i < projections.Count)
+ {
+ if (projections[i].FkAdSpecialId != null)
+ {
+ if (adSpecialIndex == -1)
+ {
+ writer.RenderBeginTag(HtmlTextWriterTag.Tr); //ad special table row
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-left:none; border-right:double");
+ writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "17");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
+ writer.Write(projections[i].AdSpecial.Name);
+ writer.RenderEndTag(); //ad special cell
+ skipCheck = true;
+ SelectCostAnalysisCell(i, ref writer, actualA, actualB, departmentRecord, comments);
+ writer.RenderEndTag(); //end ad special row
+ }
+ adSpecialIndex = i;
+ }
+ writer.RenderBeginTag(HtmlTextWriterTag.Tr);
+ writer.AddAttribute(HtmlTextWriterAttribute.Style,
+ "border-left:none; border-right:double; text-align:left");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td); //ad item cell
+ writer.Write(projections[i].AdItem.Name);
+ writer.RenderEndTag(); //end ad item cell
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td); //projection sold
+ writer.Write(projections[i].Sold);
+ writer.RenderEndTag(); //end projection sold
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td); //projection sale price
+ writer.Write(projections[i].SalePrice);
+ writer.RenderEndTag(); //end projection sale price
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td); //projection total sales
+ writer.Write($"{projections[i].TotalSales:N2}");
+ writer.RenderEndTag(); //end projection total sales
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td); //projection cost
+ writer.Write($"{projections[i].Cost:N2}");
+ writer.RenderEndTag(); //end projection cost
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td); //projection profit return
+ writer.Write($"{projections[i].ProfitReturn:N2}");
+ writer.RenderEndTag(); //end projection profit return
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9; border-right:double");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td); //projection total profit return
+ writer.Write($"{projections[i].TotalProfitReturn:N2}");
+ writer.RenderEndTag(); //end projection total profit return
+ writer.RenderBeginTag(HtmlTextWriterTag.Td); //inventory beginning
+ writer.Write(inventory[i].BeginningInventory);
+ writer.RenderEndTag(); //end inventory beginning
+ writer.RenderBeginTag(HtmlTextWriterTag.Td); //inventory received
+ writer.Write(inventory[i].Recieved);
+ writer.RenderEndTag(); //end inventory received
+ writer.RenderBeginTag(HtmlTextWriterTag.Td); //inventory total
+ writer.Write(inventory[i].TotalInventory);
+ writer.RenderEndTag(); //end inventory total
+ writer.RenderBeginTag(HtmlTextWriterTag.Td); //inventory ending
+ writer.Write(inventory[i].EndingInventory);
+ writer.RenderEndTag(); //end inventory ending
+ writer.RenderBeginTag(HtmlTextWriterTag.Td); //actual sales sold
+ writer.Write(actualSales[i].Sold);
+ writer.RenderEndTag(); //end actual sales sold
+ writer.RenderBeginTag(HtmlTextWriterTag.Td); //actual sales sale price
+ writer.Write(actualSales[i].SalePrice);
+ writer.RenderEndTag(); //end actual sales sale price
+ writer.RenderBeginTag(HtmlTextWriterTag.Td); //actual sales total sales
+ writer.Write($"{actualSales[i].TotalSales:N2}");
+ writer.RenderEndTag(); //end actual sales total sales
+ writer.RenderBeginTag(HtmlTextWriterTag.Td); //actual sales cost
+ writer.Write($"{actualSales[i].Cost:N2}");
+ writer.RenderEndTag(); //end actual sales cost
+ writer.RenderBeginTag(HtmlTextWriterTag.Td); //actual sales profit return
+ writer.Write($"{actualSales[i].ProfitReturn:N2}");
+ writer.RenderEndTag(); //end actual sales profit return
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:double");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td); //actual sales total profit return
+ writer.Write($"{actualSales[i].TotalProfitReturn:N2}");
+ writer.RenderEndTag(); //end actual sales total profit return
+ }
+ else
+ {
+ //Pad
+ AppendPaddingRow(ref writer);
+ }
+ if(!skipCheck) SelectCostAnalysisCell(adSpecialIndex != -1 ? i + 1 : i, ref writer, actualA, actualB, departmentRecord, comments);
+ writer.RenderEndTag();//tr
+ }
+ //Create the totals row
+ writer.RenderBeginTag(HtmlTextWriterTag.Tr);
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-left:none; border-right:double");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);//empty cell
+ writer.RenderEndTag();//end padding
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "text-align:right");
+ writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);//projections total label cell
+ writer.Write("TOTAL");
+ writer.RenderEndTag();//end projections total label cell
+ writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);//projections A (total sales)
+ writer.Write("(A) " + $"{projectionA:N2}");
+ writer.RenderEndTag();//end projections A (total sales)
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:double");
+ writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);//projections B (total profit return)
+ writer.Write("(B) " + $"{projectionB:N2}");
+ writer.RenderEndTag();//end projections B (total profit return)
+ writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "5");
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "text-align:right");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);//actual sales total label cell
+ writer.Write("TOTAL");
+ writer.RenderEndTag();//end actual sales total label cell
+ writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);//actual sales A (total sales)
+ writer.Write("(A) " + $"{actualA:N2}");
+ writer.RenderEndTag();//end actual sales A (total sales)
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);//begin empty cell
+ writer.RenderEndTag();//end empty cell
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:double");
+ writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);//actual sales B (total profit return)
+ writer.Write("(B) " + $"{actualB:N2}");
+ writer.RenderEndTag();//end actual sales A (total profit return)
+ writer.RenderEndTag();//end totals row
+ //end totals row
+ writer.RenderEndTag();//table
+ writer.RenderEndTag();//body
+ writer.RenderEndTag();//HTML
- // switch (i)
- // {
- // case 3:
- // projectionProfitReturn += double.Parse(row.ItemArray[3].ToString());
- // break;
- // case 6:
- // projectionTotalProfitReturn += double.Parse(row.ItemArray[6].ToString());
- // break;
- // case 13:
- // actualProfitReturn += double.Parse(row.ItemArray[13].ToString());
- // break;
- // case 16:
- // actualTotalProfitReturn += double.Parse(row.ItemArray[16].ToString());
- // break;
- // }
- // }
- // else
- // {
- // writer.Write(row.ItemArray[i]);
- // }
- // writer.RenderEndTag(); //td
- // }
- // }
- // else
- // {
- // //Padding
- // writer.RenderBeginTag(HtmlTextWriterTag.Tr);
- // //Generate padding rows to fit the Profit Analysis cells properly onto the sheet.
- // //Check to see if the row index is equal to the number of rows in the table.
- // if (rowIndex == table.Rows.Count)
- // {
- // //IF so, then that means the current row index represents the index of the Totals row. So build the totals row with the added values from above.
- // //Begin rendering the totals row.
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:1px solid black; border-left:none");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.RenderEndTag();
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9; text-align:right");
- // writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write("Total");
- // writer.RenderEndTag(); //td
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9; padding: 0px 0px 0px 5px");
- // writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write("(A) " + $"{projectionProfitReturn:C}");
- // writer.RenderEndTag();
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9; padding: 0px 0px 0px 5px");
- // writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write("(B) " + $"{projectionTotalProfitReturn:C}");
- // writer.RenderEndTag();
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "text-align:right");
- // writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "5");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write("Total");
- // writer.RenderEndTag();
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "padding: 0px 0px 0px 5px");
- // writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write("(A) " + $"{actualProfitReturn:C}");
- // writer.RenderEndTag();
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.RenderEndTag();
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "padding: 0px 0px 0px 5px");
- // writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write("(B) " + $"{actualTotalProfitReturn:C}");
- // writer.RenderEndTag();//td
- // //END rending the totals row.
- // BuildProfitAnalysisCell(ref writer, rowIndex + adSpecialOffset, out isProfitAnalysisCell, salesProducedByAdItems, remainingSales, totalProfitReturnFromAdItems, totalProfitReturnFromRemainingSales, totalProfitReturn);
- // }
- // else if (rowIndex == (table.Rows.Count + 1))
- // //Check to see if the current index is equal to the row after the totals row and, if so, create the comments row.
- // {
- // writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "17");
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-left:none");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write(
- // "Comments: " + comments);
- // writer.RenderEndTag(); //td
- // BuildProfitAnalysisCell(ref writer, rowIndex + adSpecialOffset, out isProfitAnalysisCell, salesProducedByAdItems, remainingSales, totalProfitReturnFromAdItems, totalProfitReturnFromRemainingSales, totalProfitReturn);
- // }
- // else
- // {
- // var cellCount = 0;
- // while (cellCount < 17)
- // {
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.RenderEndTag();//td
- // cellCount++;
- // }
- // }
- // }
- //Check for every 3rd row to append a Profit Analysis cell onto.
- // switch (rowIndex + adSpecialOffset)
- // {
- // case 0:
- // writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2");
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-right:none");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write("Sales Produced By
Ad Items (A)2" + $"{salesProducedByAdItems:C}" + "
");
- // writer.RenderEndTag();
- // break;
- // case 3:
- // writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2");
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-top:1px solid black; border-right:none");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write("Remaining
Sales3" + $"{remainingSales:C}" + "
");
- // writer.RenderEndTag();
- // break;
- // case 6:
- // writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2");
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-top:1px solid black; border-right:none");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write("Total $ Profit Return
From Ad Items (B)4" + $"{totalProfitReturnFromAdItems:C}" + "
");
- // writer.RenderEndTag();
- // break;
- // case 9:
- // writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2");
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-top:1px solid black; border-right:none");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write("Total $ Profit Return
From Remaining Sales5" + $"{totalProfitReturnFromRemainingSales:C}" + "
");
- // writer.RenderEndTag();
- // break;
- // case 12:
- // writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2");
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:none");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write("Total $ Profit
Return6" + $"{totalProfitReturn:C}" + "
");
- // writer.RenderEndTag();
- // break;
- // case 15:
- // //IF either the compressed format or the generate comment row flags are set, then ignore this case. Only tables with 19 or more rows can generate a full comments cell due to the amount of text it can contain.
- // if (isCompressedFormat || willGenerateCommentRow) break;
- // writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "4");
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:none");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write("Comments: " + comments);
- // writer.RenderEndTag();
- // break;
- // }
-
- // writer.RenderEndTag();//tr
- //}//end for loop
-
- //if (!willGenerateCommentRow && !isCompressedFormat)
- //{
- // //Begin rendering the totals row.
- // writer.RenderBeginTag(HtmlTextWriterTag.Tr);
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:1px solid black; border-left:none");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.RenderEndTag();
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9; border:1px solid black; font-size:12px; border-left: 1px solid #000; text-align:right");
- // writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write("Total");
- // writer.RenderEndTag(); //td
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9; border:1px solid black; font-size:12px; border-left: 1px solid #000; padding: 0px 0px 0px 5px");
- // writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write("(A) " + $"{projectionProfitReturn:C}");
- // writer.RenderEndTag();
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9; border:1px solid black; font-size:12px; border-left: 1px solid #000; padding: 0px 0px 0px 5px");
- // writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write("(B) " + $"{projectionTotalProfitReturn:C}");
- // writer.RenderEndTag();
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:1px solid black; font-size:12px; border-left: 1px solid #000; text-align:right");
- // writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "5");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write("Total");
- // writer.RenderEndTag();
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:1px solid black; font-size:12px; border-left: 1px solid #000; padding: 0px 0px 0px 5px");
- // writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write("(A) " + $"{actualProfitReturn:C}");
- // writer.RenderEndTag();
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:1px solid black");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.RenderEndTag();
- // writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:1px solid black; font-size:12px; border-left: 1px solid #000; padding: 0px 0px 0px 5px");
- // writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
- // writer.RenderBeginTag(HtmlTextWriterTag.Td);
- // writer.Write("(B) " + $"{actualTotalProfitReturn:C}");
- // writer.RenderEndTag();//td
- // writer.RenderEndTag(); //tr
- //}
- //writer.RenderEndTag();//table
- //writer.RenderEndTag();//body
- //writer.RenderEndTag();//HTML
-
- //using (var streamWriter = new StreamWriter(Application.StartupPath + "\\FrontPage.html"))
- //{
- // streamWriter.WriteLine(stringWriter.ToString());
- //}
- //RenderHtmlToImage();
+ using (var streamWriter = new StreamWriter("C:\\Users\\Crypto\\Desktop\\TestPage.html"))
+ {
+ streamWriter.WriteLine(stringWriter.ToString());
+ }
+ RenderHtmlToImage();
}
- private void BuildProfitAnalysisCell(ref HtmlTextWriter writer, int rowIndex, out bool isProfitAnalysisCell, double salesProducedByAdItems, double remainingSales, double totalProfitReturnFromAdItems, double totalProfitReturnFromRemainingSales, double totalProfitReturn)
+ private void RenderCostsAnalysisCell(CostAnalysisCells cell, ref HtmlTextWriter writer, decimal? value, string rowSpan)
+ {
+ var number = string.Empty;
+ var labelText = string.Empty;
+
+ switch (cell)
+ {
+ case CostAnalysisCells.DepartmentSales:
+ number = "1";
+ labelText = "Department
Sales";
+ break;
+ case CostAnalysisCells.SalesProduced:
+ number = "2";
+ labelText = "Sales Produced
by
Ad Items (A)";
+ break;
+ case CostAnalysisCells.RemainingSales:
+ number = "3";
+ labelText = "Remaining
Sales
(Line 1 minus
Line 2)";
+ break;
+ case CostAnalysisCells.ProfitReturnFromAdItems:
+ number = "4";
+ labelText = "Total $ Profit
Return From Ad
Items (B)";
+ break;
+ case CostAnalysisCells.ProfitReturnFromRemainingSales:
+ number = "5";
+ labelText = "Total $ Profit Return
From Remaining Sales
Going-in Gross % x Remaining Sales";
+ break;
+ case CostAnalysisCells.TotalProfitReturn:
+ number = "6";
+ labelText = "Total $ Profit
Return
Line 4 Plus Line 5";
+ break;
+ case CostAnalysisCells.CrossProfitInfoCell:
+ break;
+ case CostAnalysisCells.Comments:
+ break;
+ default:
+ throw new ArgumentOutOfRangeException(nameof(cell), cell, null);
+ }
+ writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, rowSpan);
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:none; border-left:double; font-size:14px; width:25px");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);//begin number cell
+ writer.Write(number);
+ writer.RenderEndTag();//end number cell
+ writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, rowSpan);
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:none; border-left:none; width:200px");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);//begin department sales cell
+ writer.Write(labelText);
+ writer.RenderEndTag();//end department sales cell
+ writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, rowSpan);
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:none; border-left:none; width:75px");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);//department sales total sales column
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "margin:0px; border-left:1px solid black; border-top:1px dashed black; text-align:right");
+ writer.RenderBeginTag(HtmlTextWriterTag.P);//begin department sales paragraph tag; used because the borders of the element are flush with that of the cell's.
+ writer.Write($"{value:C}");
+ writer.RenderEndTag();//end department sales paragraph tag
+ writer.RenderEndTag();//department sales total sales column
+ }
+
+ private void RenderCostsAnalysisCell(CostAnalysisCells cell, ref HtmlTextWriter writer, string value = "")
+ {
+ writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "3");
+ switch (cell)
+ {
+ case CostAnalysisCells.CrossProfitInfoCell:
+ writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "3");
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:none; text-align:left");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
+ writer.Write("To Find Gross Profit % Divide
Total Profit Return By Dept.
Weekly Retail Sales");
+ break;
+ case CostAnalysisCells.Comments:
+ writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "5");
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:none; text-align:left; vertical-align:top");
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
+ writer.Write("Comments: " + value);
+ break;
+ }
+ writer.RenderEndTag();
+ }
+
+ private void SelectCostAnalysisCell(int rowIndex, ref HtmlTextWriter writer, decimal? actualA, decimal? actualB, WeeklySale departmentRecord, Note comments)
{
- isProfitAnalysisCell = false;
switch (rowIndex)
{
case 0:
- writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2");
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-right:1px solid black; border-right:none");
- writer.RenderBeginTag(HtmlTextWriterTag.Td);
- writer.Write("Sales Produced By
Ad Items (A)2" + $"{salesProducedByAdItems:C}" + "
");
- writer.RenderEndTag();
+ RenderCostsAnalysisCell(CostAnalysisCells.SalesProduced, ref writer, actualA, "3");
break;
case 3:
- writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2");
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-right:1px solid black; border-top:1px solid black; border-right:none");
- writer.RenderBeginTag(HtmlTextWriterTag.Td);
- writer.Write("Remaining
Sales3" + $"{remainingSales:C}" + "
");
- writer.RenderEndTag();
+ if (departmentRecord != null)
+ RenderCostsAnalysisCell(CostAnalysisCells.RemainingSales, ref writer, departmentRecord.TotalSales - actualA, "4");
break;
- case 6:
- writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2");
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-right:1px solid black; border-top:1px solid black; border-right:none");
- writer.RenderBeginTag(HtmlTextWriterTag.Td);
- writer.Write("Total $ Profit Return
From Ad Items (B)4" + $"{totalProfitReturnFromAdItems:C}" + "
");
- writer.RenderEndTag();
+ case 7:
+ RenderCostsAnalysisCell(CostAnalysisCells.ProfitReturnFromAdItems, ref writer, actualB, "3");
break;
- case 9:
- writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2");
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-right:1px solid black; border-top:1px solid black; border-right:none");
- writer.RenderBeginTag(HtmlTextWriterTag.Td);
- writer.Write("Total $ Profit Return
From Remaining Sales5" + $"{totalProfitReturnFromRemainingSales:C}" + "
");
- writer.RenderEndTag();
+ case 10:
+ //get cross profit return
+ var s = (decimal) 0.3;
+ RenderCostsAnalysisCell(CostAnalysisCells.ProfitReturnFromRemainingSales, ref writer, s * (departmentRecord.TotalSales - actualA), "5");
break;
- case 12:
- writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2");
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:none");
- writer.RenderBeginTag(HtmlTextWriterTag.Td);
- writer.Write("Total $ Profit
Return6" + $"{totalProfitReturn:C}" + "
");
- writer.RenderEndTag();
+ case 15:
+ var x = (decimal) 0.3 * (departmentRecord.TotalSales - actualA);
+ RenderCostsAnalysisCell(CostAnalysisCells.TotalProfitReturn, ref writer, x + actualB, "4");
+ break;
+ case 19:
+ RenderCostsAnalysisCell(CostAnalysisCells.CrossProfitInfoCell, ref writer);
+ break;
+ case 22:
+ RenderCostsAnalysisCell(CostAnalysisCells.Comments, ref writer, comments.Remark);
break;
}
}
+
+ private void AppendPaddingRow(ref HtmlTextWriter writer)
+ {
+ var cellCount = 0;
+ writer.RenderBeginTag(HtmlTextWriterTag.Tr);
+ while (cellCount < 17)
+ {
+ switch (cellCount)
+ {
+ case 0:
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-left:none; border-right:double");
+ break;
+ case 6:
+ case 16:
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:double");
+ break;
+ }
+ writer.RenderBeginTag(HtmlTextWriterTag.Td);
+ writer.Write("
");
+ writer.RenderEndTag();
+ cellCount++;
+ }
+ }
+
+ private enum CostAnalysisCells
+ {
+ DepartmentSales = 0,
+ SalesProduced = 1,
+ RemainingSales = 2,
+ ProfitReturnFromAdItems = 3,
+ ProfitReturnFromRemainingSales = 4,
+ TotalProfitReturn = 5,
+ CrossProfitInfoCell = 6,
+ Comments = 7
+ }
}
}
diff --git a/AdvertsingProfitControl/packages.config b/AdvertsingProfitControl/packages.config
index d705809..c2bb520 100644
--- a/AdvertsingProfitControl/packages.config
+++ b/AdvertsingProfitControl/packages.config
@@ -1,6 +1,7 @@
+
+
-
-
+
\ No newline at end of file
diff --git a/SetupProject/bin/Debug/SetupProject.msi b/SetupProject/bin/Debug/SetupProject.msi
deleted file mode 100644
index f22cc115b040afc39b3e9e32d16676dd65d09bcc..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1044480
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%0Dd(W97wU8vSS+^J#
z+w%y=uAlGQlG(9hYTn8d+ETA?aoG3#nP=hQSN*Qh!|iXDVSc;ykJxM6Q$xRNaK1jH
zd%Es*M((Z1#bU;P?o96O^m$*(#a>`}Ly7(RuB0vZcr=$wv{pUvOV
z%Tz07mUw=c!}5OG16!e*h^Bsz4{@CL^jq1Nd{`iSjzi#xucYVIe+I7-7wvQi+_!(%
z1%~X>*rnUDk1vgg+3O$U<=X8!?dz0_8iG#*C-`5lRZ>`UPs9Dj`z89kQ+8Zg_T$>L
zYloCh9%g8Grmt5JC(XX#WX9Brv%-^}hl}58m^n>lzIstj&8{66C++x_woM@Ge)QAI
zsdHPl$(bydI&fcVIak3lmOD@R-+g1}uRgGC)eGgj?=OY6&tJ!2GT%@(Hn20YPU_=D
zJMo{hK3J`M$Kmn*WxDJ{E7ge%-+n2b`sK;E;O8=xR_m)t>Y>#vmvX*)P3HB8W9_{4
zf5y4ZA8$51sn}zz@U!xG`{U=b@!RH?*W9SPXPx@=lKX1!?Q`pPKAOWehu`SUmQ5TE
zzeVEy-hXq}cX>?uE}6T}RPL7je6j7cKNrKp!+-nXr=`|Dd+VmV_a9
z-;YgyE#iheq6nYO01
zg#XzwA)ck%Y-UW@__ZVI&16<*r_Zh)h4Yv_o?qs+*xWPamDh#%Q;Z5}|2&+S8+O-~
zCkGwk=gRXb)hgLu%ebrgu;SF48_q7g5#FYxDs%T)z?;V+?>_~-;rI9#`Qc)Y@9tku
zGq3+xk)5S_^y=T-l+v9$zTb}xFzX9dl%G}e$@Iajsh)x}w3hu*GI*H#rTf5_?I%SO
zw{!f;_%FSF|Khs+VT=nZubM5FE84r&>(4VwIL(#Blrkp_$hc*B@Xm5`Hf4ER=b3>SeE;aSxUE
z8r*#+BsR~RcsB`InmFAQkUAiS6=gco8_H_TA!cu95|JHb;Z3U;`^A?
z_*azW?6R$0>pkabos_aw=xxb|?5Ylz%iQf4ZWRhlI=ACVwBBki`N^{1mYs55wfWsc
z*V)s%$^!JFYPS5JG_hR#{et-$7WOv=mS(5fZTilBVm!G~((aah%j_M6(|al-*E<)f9(Lb-=$h?2L6!$%dymGR
zJ)!Z2dkMU?h7Q&)TW=LQ*_(i4J_KbxmD%rCjd
zUFPD~^nerNUTkXpaXK2URhlWbO&1nqgQg|2H9P_#0
znS?CQ>Z7rH4%&29l``fSUSoUnr+tcfWc`lb_Z#aD-gDd=zH4&V@1*HY5BE=rdh(v(
z!^Y^DH@5EZ`|*1_7r%DcpDdH<$vT^>`xh^?(Yp8YeM{{B)C0Ck
zdEV}3t-xE7+b;z@{nBPS&CWj$@02`$-}y-L)Y-?szx@*W@XTW#
zq3~|;-5=wa`LBw%zc!y#+0>YQ^--0=Kj}%~Kf6+HiWzM>RTg*L-CIp@nf?x{FSqk}2Ku=*lX=mH!ug-#N`lGXL?@_A9N%6HJ~=3KVVWi~OGX
zuv$eraEj~>|KEkX{Im7$ajp&CRXw4r|f}hr(pF6>oW2dy!CbdG#mY5*76W`CrPOV{a
zl53vuu%pnhB}Yg3N$GRH6ORQx1#(DsN-P%Gw5(^s>~pb&kINjMskHRC_4GTRXftx!
zHs9J;u5p69V#=C=mOO>S4wrv$&!|0f(k!#MNB)9!6xVx~tvlTsY@#-DSlzL&-WE3d
zvSi}?M@s9(OzK?L=NP8&J`U8G8Bp_5Zk$&!z3cg@2p
z)-S#)9V%n_QsJ~%x`B7Kumms9&VxTVZF5$AxaV-WSHV56V1l$nQM1Ff4GIgk`%ets
z;;Wle)4SM3pw&D;uvKiKYtQnEkS%dPX1IvFS}10^@7&^~jzir`JDgr-8$QmQYVTGh
zx!1n&lJUHS$L)IAUrfDh^;o*5@~`PT>($CP7tPS$Ab71Ne|fP#%j+#ut|{3vt(mjb
zeBbMcwpTj8x$Jg@+kH7T^{_4H!8wvMo0gy4*|qBGiPcN_Qoq#Y-Ttl^z3=hWRYw)S
z?_Q+sBxCoi@x920WVs*atbcMj`|AH6d{IB~tam>DXKMrPm$AvNKg-$bI}gt1w0^lW
z*1bV5=lznMx1KMRoFKft`_a3Pz1l%{4o=#Uclub%^p20Qo3^y4{rIkV$$Q(mUv-f$
zI`2iL@7O(eXYz?1EK9eXD3ATkJl{wu`r^s;(Yu?kNT<9jUth7mxyV{qZ1;w}7ezla
zUs)Pmrun$4O3(M^v=s4K{hQuz_!z!}!QuVA%X|9NqmBxfIy}?4{8nz>{jE2e7jVDy
zeZ=~!{#NQXEO$r>gi_|I3w|-Z*(ZS^BNXm47;aWtj?1Td|vU|w!+H&0;?1I-o-7~mA?f=?r)F^x^e2?
zHIcYuzg8A>=^wZ2{k3q#xoeC*`>%2FhKa9L->jFf&Y
z$yxif-?-Fw-;d}P{~LVz&siV&BkK#&E11jEPx$h`ycn2Rb;7ACO*n?9;Pv5v&WnjB
zHo5aGeZ8}CshC&T>Z7&Wt|pppw<_7AEEjetMQ7IDP9EvWft`g{(q#T>^xVAlId68M
zkHI!Mt4oJ^e%8Hld2!MrId1V$^+{WWK1a>2eCwVVr@pPAqjK(1n{zWZv(5@*e)gwN
z^tJ1h+kw|Mn`OpbQ=e(F`D<~n-1#~^nVB1wq?=y66tgwD@T%&j@aRq9w>O2W-(;%W
zuUj2(!f(65f-U;xAO5;udwIXn^i^xb;7{noFBJ@y_OzEZulae7sWA59%lxBd9@e^RGrojdPCZlj
z^KszM$1Q&fCvE>#blGRx>ur%wtX|Cv@SC=%!d-Hfy`6rI4*$jM?&n@z&oh257h9k9
zD(&qa(W`!MtT|O})w16d{(Q{&%VYb?UH2k>=$X~b`5g*FrA|XBj8cRNswTmQ{S4zrp=;^0mG9JAc(rT=Cy<`9Jd`!lA*u
z6>G)57k`x2+s`g^?a;nzg~@fUUn9!{k7{Xa>FT_#oFeSzSHscCAAB&W(BbqX4>|wK
z;&zSdU5lcooISSD|#8+@u@}3{j)w%=L5I9
zc|VGC+$&~%V4u%y@0n?}Go~HP(>(famTg(KX4!WW$#-R`65+>hZAtK4GWYQk+3W1~
zosVudsMZ~NaO==L|3|BK?+7(jS!~udyQBNmqIKl~x#OELPoeCjQaQcNt3@@4WQB
zcz4~aKhQuWQ`h~YIXCQN
zB%kE^Resjb)5CwCnit#o{E6XPot3?pA9gM;v16Y8aCOi1D_(|YPj`zQ*Ra>N?2h|e
z8u}w!a;~mr+?r0U&$AX;%o2DtN44&>`?-#cd(v-vG92^$9>kihzO^?{7hJ`u?F1>W^<1L$>!j+Gu
zB65-rI2gnoTAe++owqG@W3RlYNAT9Ht8SU6`n4v`TD9s^hOg6=3t>MepQ?{qxk{#6
zf!p;|f5?{Nb91eq-?28fw)XhD@zckh&*xQtySMZCoSC-YXV0!I@#o+8o_Df2)5iSC
zqQAQ;-gH;kdz()dxt{)V-Ntp{dp~qD9ouE|?aiIj5_&ewhcw}KOZ#}Ad{0!5@{fG0<_V3ax{P=!N_SRB~|AOb&-Ps>48*lu;Ze7jJ
z%li-eUzk?kFQO@x`~RIC*Z235X_n3P?cTQB|K-};pZqb>57YmAo#+4QJ9qa#=l=iC
z_hXyNze7sDWj@%SIsaSjMJ=fY6T{i2}`P_})KfS45U-nJ!
z+=td~-tTw9azl!vbF_`G+%cOPnwMSvbZ4$s_Z>0obtaq6sTBI?cjRD4`CR6ff46VC?X@fAp2Bv%=O}^z2j=HI%#4oeFU~aG?3;cn=V3&_jztUhG|ZcK^6i9k
zQ|^BIFZwNCx!Pbdh`m4ghsP%a@wTk|=>-$N`4y%fpPe_+X@fQc8(%Zak~RG8E_bE#
zw=^HQ;I^i_Say9_-O}%KZbrYab^q4Zw`#^qttok0zSYWapD+9H_3JgAfLz75<{h7V
z-KJR`?TIXHl>ByQ(a)bVD>p86el_p+jWdyYhvwZ*d%M$U8W6$
zCgY}CQylW%iu+$$`;AHab>EfyZ4V*?{)<=4j?W7{Y_xi{!u9B
zDqb#1eWiG@RCB`0&k0#;lU~^vm!7r6+xahDVP5olufwuBre*8GeEzn~
ztU7=HO10dwwn?>{LSnLhU-6dyVZoEQbbd0&X=CSzc{L1)0X__C=A8GLZZUuTu@+vn
ze4Zqy*`mUyUP`(g*=%&Fhxud9;{%GOd{fx_m?PMJ@*Qc+ns4#JeZrr~qU`rX3mM`#
za?hQpR^n@!wEW1O{KlR9)7{r>;
zScZlC`rFTJ?|2%JG0+xR-IRA+Ap5vsqpS~Kd|F6Ed|L2K6TV~&0>$v-R_1!bB`i=cJ^M20YdY8P1
zYqqcaX8qf{cOPEWzmnrk@`kQTzM3;d^76&PD)+b6oY8%lT&ExR=JUQUhUo&OExvF4
z4i`(deY_%m;v3(hH+lIt6(`6hRDG{F&DZqCN+v{fr
z>)hWxGke|h)D=sm_N70#sjTtw#eI(Sh_|9bLVVUog=MfAgSM#sd^IkDIl6y^DC42K(t*L8x%~m^XlG_^DmJ)hn%~EsS
zX^AcmW|r(&!EkEFs_WCtX8b((YHRC<=L@$g77PDP6Y!gPcfF4B+hd>W7aj86vvLb#
z*$PeRI-bHC+fGW|-1E=;!&RPdGnXFEUVHLqEZ>4e=j^{NKYNdEKAif2@9eAz54tzc
zoYrG=drG=aOUg!r-xCY{e*3x_1z9PtHC~X#5$+qOHuu-hua|eR#GR?X?IKihv@X-w
z@WZA*oXHQinxB{OOqgOQTX4QrF~sP>Ikx6GDF^;Cw<(^qXmW_?DGW%LIg}{*m|@<5
z6dvpKlY0JIy*i_LcLU?y4J~;$Jn!}iTRq;9cf;_m!EH(JV}S`*wh11#+q+Wc%ATXU
z9&nyHr1(}uPj*g@#3jFnS?t=kzn1;}vn1sK=ds4Hq#Ny`s)y}bH6*`TI-k7J=WU?E
z{&%O5r#=?{sC2|2OSqH@6DoM<3I?
z_bv9^$9VGR21fU`g+<={#u(jXF)ultOE~p#ns#u+Nl~?1Z^BkDlP_pq{~+dzrN5~X
z-@X<1{TKTvxv#x{-B4-%6+@-@CC59?m_NJj*>l3w%1xz7-Au3{xo3gY?v6X2PxO?^
zg(cOCx=z@-_z74#Khc?J>*6PT)Avc7(tNc|(@(5+iBm3`bHek`yd1SntpRG^1-Cq@
zRIz7xr}k)@;Le#Ra$WKiH%&dU*5pXtBRPdl{U@4Ta*z>XAkvdxwue
zWzUK9P8+``oJ#&em0fKXy(y9t>{V(m3OcdNs+L^fKC;*2j^U%YMO%0HFlh?yaJpl1
z($4jn%0wN;P0ep)Rf;-JBr2U3sCf|?bj>qhvAx1O%U9oOmC6Nn&OPy7@Md5ChGZVL
zEi*6b_S`%E;%|@LsTY@f%OxYXTaf9%I}iT_56gMFTHJzg&PU-Ov1(XPoC
zpU(+c?#uB^O!xG~gcY+4l=y|Sd?xp{Z1HpK&2+l3E_%)N-o&D_zA~oEIBh?^o$%NH
zMcofoUMIHej%$2M>q9z@S={nJ!+T3tZQ