Files
advertising-profit-control/AdvertsingProfitControl/FrontPageGenerator.cs
T

477 lines
28 KiB
C#

using System;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.IO;
using System.Web.UI;
using System.Linq;
using Pechkin;
using AdvertisingProfitControlData;
namespace AdvertsingProfitControl
{
internal class FrontPageGenerator
{
/// <summary>
/// Generates the front page of the report, Advertising Profit Control, as a single PDF file.
/// </summary>
/// <param name="date"></param>
public void GenerateFrontPage(DateTime date)
{
var stringWriter = new StringWriter();
var writer = new HtmlTextWriter(stringWriter);
BuildReportFrontPage(date, ref writer);
if (!Enum.TryParse(Properties.Settings.Default.ReportPaperKind, out PaperKind paperKind))
{
//TODO: Report this error to the user.
paperKind = PaperKind.A4;
}
var frontPage = new SimplePechkin(new GlobalConfig().SetPaperOrientation(true).SetPaperSize(paperKind)).Convert(stringWriter.ToString());
//
using (var fs = new FileStream(GlobalClasses.LogFilePath + "Front.pdf", FileMode.Create, FileAccess.Write))
{
fs.Write(frontPage, 0, frontPage.Length);
}
}
/// <summary>
/// Generates the HTML code for the front page, Advertising Profit Control.
/// </summary>
/// <param name="date"></param>
/// <param name="writer"></param>
private void BuildReportFrontPage(DateTime date, ref HtmlTextWriter writer)
{
var db = new AdvertisingProfitControlModel();
var dateRecord = db.WeekEndingDates.SingleOrDefault(x => x.EndingDate == date);
if (dateRecord == null)
{
MessageBox.Show("Failed");
return;
}
writer.Write("<!DOCTYPE html>\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("td{margins:0; padding:2px; border:1px solid black; font-size:" + Properties.Settings.Default.ApcFontSize + "; text-align:center; vertical-align:bottom}");
writer.RenderEndTag();// end style
writer.RenderEndTag(); // end Head
//writer.AddAttribute(HtmlTextWriterAttribute.Style, "width:11in; height:8in");
writer.RenderBeginTag(HtmlTextWriterTag.Body);
writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-collapse: collapse; margin-top:1in; " + Properties.Settings.Default.ApcReportWidth + "; " + Properties.Settings.Default.ApcReportHeight); //style for the table
writer.RenderBeginTag(HtmlTextWriterTag.Table);
//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:30px");
writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "20");
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("<b>Advertising Profit Control v" + Application.ProductVersion + "</b>");
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: <u>Allen's of Hastings</u>");
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: <u>" + date.ToString("d") + "</u><br>Department: <u>Produce</u>");
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();
writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none");
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.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; border-right:double");
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Ad Items");
writer.RenderEndTag(); //th
writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9");
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Sold");
writer.RenderEndTag(); //th
writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9");
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Sale<br>Price");
writer.RenderEndTag(); //th
writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9");
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Total<br>Sales");
writer.RenderEndTag(); //th
writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9");
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Cost");
writer.RenderEndTag(); //th
writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9");
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("$<br>Prof.<br>Retn.");
writer.RenderEndTag(); //th
writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9; border-right:double");
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Total<br>$<br>Prof.<br>Retn.");
writer.RenderEndTag(); //th
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Beg.<br>Inv.");
writer.RenderEndTag(); //th
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Rec'd");
writer.RenderEndTag(); //th
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Total");
writer.RenderEndTag(); //th
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("End.<br>Inv.");
writer.RenderEndTag(); //th
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Sold");
writer.RenderEndTag(); //th
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Sale<br>Price");
writer.RenderEndTag(); //th
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Total<br>Sales");
writer.RenderEndTag(); //th
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Cost");
writer.RenderEndTag(); //th
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("$<br>Prof.<br>Retn.");
writer.RenderEndTag(); //th
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Total<br>$<br>Prof.<br>Retn.");
writer.RenderEndTag(); //th
//Department Sales
//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<br>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.
//Profit Analysis values.
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
}
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<br>Sales";
break;
case CostAnalysisCells.SalesProduced:
number = "2";
labelText = "Sales Produced<br>by<br>Ad Items (A)";
break;
case CostAnalysisCells.RemainingSales:
number = "3";
labelText = "Remaining<br>Sales<br>(Line 1 minus<br>Line 2)";
break;
case CostAnalysisCells.ProfitReturnFromAdItems:
number = "4";
labelText = "Total $ Profit<br>Return From Ad<br>Items (B)";
break;
case CostAnalysisCells.ProfitReturnFromRemainingSales:
number = "5";
labelText = "Total $ Profit Return<br>From Remaining Sales";
break;
case CostAnalysisCells.TotalProfitReturn:
number = "6";
labelText = "Total $ Profit<br>Return<br>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<br>Total Profit Return By Dept.<br>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)
{
switch (rowIndex)
{
case 0:
RenderCostsAnalysisCell(CostAnalysisCells.SalesProduced, ref writer, actualA, "3");
break;
case 3:
if (departmentRecord != null)
RenderCostsAnalysisCell(CostAnalysisCells.RemainingSales, ref writer, departmentRecord.TotalSales - actualA, "4");
break;
case 7:
RenderCostsAnalysisCell(CostAnalysisCells.ProfitReturnFromAdItems, ref writer, actualB, "3");
break;
case 10:
//get cross profit return
var s = (decimal) 0.3;
RenderCostsAnalysisCell(CostAnalysisCells.ProfitReturnFromRemainingSales, ref writer, s * (departmentRecord.TotalSales - actualA), "5");
break;
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:
writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:double; background-color:#e9e9e9");
break;
case 16:
writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-right:double");
break;
}
if (cellCount > 0 && cellCount < 6)
{
writer.AddAttribute(HtmlTextWriterAttribute.Style, "background-color:#e9e9e9");
}
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("<br>");
writer.RenderEndTag();
cellCount++;
}
}
private enum CostAnalysisCells
{
DepartmentSales = 0,
SalesProduced = 1,
RemainingSales = 2,
ProfitReturnFromAdItems = 3,
ProfitReturnFromRemainingSales = 4,
TotalProfitReturn = 5,
CrossProfitInfoCell = 6,
Comments = 7
}
}
}