using framework_business.objects.custom;
using framework_library;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Web;
namespace framework_business
{
public class xSales
{
///
/// Adds a note with an attachment after statement has been created
///
///
///
///
///
///
public static void AddCreateStatementNote(int noteEntityId, string noteTitle, string noteCaption, string statementPath, string statementFile,
int userId, string fieldName)
{
try
{
/* CVH 2016-04-20 Change from module Procedures to Surface, and type General to Statement */
oNote note = new oNote();
note.moduleId = pNums.Module.Surface.GetHashCode();
note.typeId = pNums.NoteType.Statement.GetHashCode();
note.entityId = noteEntityId;
note.title = noteTitle;
note.caption = noteCaption;
note.dateSaved = DateTime.Now;
note.userIdSaved = userId;
note.isActive = true;
note.fieldName = fieldName;
note.recId = xData.SaveTyped("recId", typeof(oNote), note);
//add statement as attachment to note
oAttachment noteAtt = new oAttachment();
noteAtt.dateSaved = DateTime.Now;
noteAtt.display = note.title;
noteAtt.entityId = note.recId;
noteAtt.fileName = noteAtt.entityId + "_" + utils.RandomString(9, true) + statementFile.Substring(statementFile.IndexOf("."), statementFile.Length - statementFile.IndexOf("."));
noteAtt.folderName = "note/" + note.recId;
noteAtt.isActive = true;
noteAtt.moduleId = pNums.Module.Notes.GetHashCode();
noteAtt.typeId = pNums.AttachmentType.Document.GetHashCode();
noteAtt.userIdSaved = note.userIdSaved;
//CVH 2016-10-28 Save PDF to file folder, not straight in root of note item folder
string copyTo = HttpContext.Current.Server.MapPath("~/upload/" + noteAtt.folderName + "/file/");
utils.validateFolder(copyTo);
System.IO.File.Copy(statementPath + statementFile, copyTo + noteAtt.fileName);
noteAtt.recId = xData.SaveTyped("recId", typeof(oAttachment), noteAtt);
}
catch (Exception ex)
{
//log don't redirect
exception.HandleException("enquiry:", MethodBase.GetCurrentMethod().Name, ex, userId);
}
}
///
/// string to build the account lines
///
///
/// day brough forward
///
///
///
///
///
///
private static string BuildSalesStatementLines(oSales accountMain, ArrayList salesList, ovSalesView salesView, DateTime? statementDateFrom = null, DateTime? statementDateTo = null)
{
StringBuilder lineResult = new StringBuilder();
try
{
decimal dOpening = 0M;
if (statementDateFrom != null)
{
foreach (ovSalesView salesViewItem in salesList)
{
if (salesViewItem.dateOfService < statementDateFrom)
{
dOpening = dOpening + salesViewItem.RunningBalance;
}
}
}
//set running balance based on records
decimal bal = 0;
foreach (ovSalesView salesViewItem in salesList)
{
if (salesViewItem.itemType != "QT")
{
bal += salesViewItem.Invoiced;
bal += (Math.Abs(salesViewItem.Received) * -1);
salesViewItem.RunningBalance = bal;
}
}
if (handler.ReturnSetup().code == "SHEN-1")
{
lineResult.AppendLine("
");
lineResult.AppendLine("
");
}
lineResult.AppendLine("
");
lineResult.AppendLine("");
lineResult.AppendLine("| Date | ");
lineResult.AppendLine("Activity | ");
lineResult.AppendLine("Reference | ");
lineResult.AppendLine("Amount | ");
lineResult.AppendLine("Payments | ");
lineResult.AppendLine("Balance ZAR | ");
lineResult.AppendLine("
");
if (statementDateFrom != null)
{
lineResult.AppendLine("");
lineResult.AppendLine($"| {((DateTime)statementDateFrom).ToString("dd-MMM-yy")} | ");
lineResult.AppendLine("Opening Balance | ");
lineResult.AppendLine(" | ");
lineResult.AppendLine(" | ");
lineResult.AppendLine(" | ");
lineResult.AppendLine($"{dOpening:F2} | ");
lineResult.AppendLine("
");
}
foreach (ovSalesView salesViewItem in salesList)
{
/* CVH 2016-08-18 If printing statement on 2016-08-18, I want to see the invoice that was captured at 11am on that day. Exclude Time from date comparison */
//if (salesViewItem.itemType != "QT" && salesViewItem.dateOfService >= statementDateFrom && salesViewItem.dateOfService <= statementDateTo)
if (salesViewItem.itemType != "QT" && salesViewItem.dateOfService.Date >= statementDateFrom && salesViewItem.dateOfService.Date <= statementDateTo)
{
lineResult.AppendLine("");
lineResult.AppendLine($"| {salesViewItem.dateOfService.ToString("dd-MMM-yy")} | ");
lineResult.AppendLine($"{salesViewItem.Display} | ");
lineResult.AppendLine($"{salesViewItem.reference} | ");
if (salesViewItem.Invoiced > 0)
lineResult.AppendLine($"{salesViewItem.Invoiced:F2} | ");
else
lineResult.AppendLine($" | ");
if (salesViewItem.Received > 0)
lineResult.AppendLine($"{salesViewItem.Received:F2} | ");
else
lineResult.AppendLine($" | ");
lineResult.AppendLine($"{salesViewItem.RunningBalance:F2} | ");
lineResult.AppendLine("
");
}
}
lineResult.AppendLine("
");
}
catch (Exception ex)
{
throw new Exception(MethodBase.GetCurrentMethod().Name + ":" + ex.Message);
}
return lineResult.ToString();
}
private static string BuildSalesReceiptLines(oSales accountMain, ArrayList salesList, ovSalesView salesView)
{
StringBuilder lineResult = new StringBuilder();
try
{
lineResult.AppendLine("");
lineResult.AppendLine("");
lineResult.AppendLine("| Date | ");
lineResult.AppendLine("Description | ");
lineResult.AppendLine("Reference | ");
lineResult.AppendLine("Payments | ");
lineResult.AppendLine("
");
foreach (ovSalesView salesViewItem in salesList)
{
lineResult.AppendLine("");
lineResult.AppendLine($"| {salesViewItem.dateOfService.ToString("dd-MMM-yy")} | ");
lineResult.AppendLine($"{salesViewItem.Display} | ");
lineResult.AppendLine($"{salesViewItem.reference} | ");
lineResult.AppendLine($"{salesViewItem.Received:F2} | ");
lineResult.AppendLine("
");
}
lineResult.AppendLine("
");
}
catch (Exception ex)
{
throw new Exception(MethodBase.GetCurrentMethod().Name + ":" + ex.Message);
}
return lineResult.ToString();
}
///
/// Create Statement
///
///
///
///
///
///
///
///
///
///
///
public static bool CreateSalesDocument(oSales salesMain, string webAddress, DateTime documentDate, DateTime? statementDateFrom, DateTime? statementDateTo, ref string statementPath, ref string statementFile, pNums.DocumentType docType, string documentNo = "")
{
try
{
bool result = false;
oSetup setup = (oSetup)(xData.GetTypedByCriteriaSpecific("recId", typeof(oSetup), "isActive", "1")[0]);
string headerData = String.Empty;
string bodyData = String.Empty;
ovSalesView salesView = new ovSalesView();
ArrayList salesItemList = new ArrayList();
switch (docType)
{
case pNums.DocumentType.Statement:
salesItemList = xData.GetTypedByCriteriaSpecific("recId", typeof(ovSalesView), "surfaceItemId", salesMain.surfaceItemId.ToString(), "dateOfService, CASE WHEN invoiceNo > 0 THEN CAST(invoiceNo AS VARCHAR(20)) ELSE itemType END ", "pal_");
if (salesItemList.Count > 0)
salesView = (ovSalesView)salesItemList[0];
foreach (oSales sale in xData.GetTypedByCriteriaSpecific("recId", typeof(oSales), "surfaceItemId,itemType", salesMain.surfaceItemId.ToString() + ",~<>QT", "dateOfService DESC"))
{
salesMain = sale;
break;
}
break;
case pNums.DocumentType.Invoice:
if (handler.ReturnSetup().code == "CAPI-1")
{
salesItemList = xData.GetTypedByCriteriaSpecific("recId", typeof(oSalesItemsFinal), "ParentSurfaceItemId", salesMain.recId.ToString(), "", "publ_");
}
else
{
salesItemList = xData.GetTypedByCriteriaSpecific("recId", typeof(ovSalesView), "surfaceItemId", salesMain.surfaceItemId.ToString(), "dateOfService, CASE WHEN invoiceNo > 0 THEN CAST(invoiceNo AS VARCHAR(20)) ELSE itemType END ", "pal_");
}
if (salesItemList.Count > 0)
salesView = (ovSalesView)salesItemList[0];
salesItemList = xData.GetTypedByCriteriaSpecific("recId", typeof(oSales), "surfaceItemId,invoiceNo,itemType", salesMain.surfaceItemId.ToString() + "," + documentNo + ",TI", "sequence");
if (salesItemList.Count > 0)
salesMain = (oSales)salesItemList[0];
break;
case pNums.DocumentType.Quote:
if (handler.ReturnSetup().code == "CAPI-1")
{
salesItemList = xData.GetTypedByCriteriaSpecific("recId", typeof(oQuoteItemsFinal), "ParentSurfaceItemId,isActive,status", salesMain.surfaceItemId.ToString() + ",1,1", "QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalSequenceNumber", "publ_");
}
else
{
salesItemList = xData.GetTypedByCriteriaSpecific("recId", typeof(ovSalesView), "surfaceItemId", salesMain.surfaceItemId.ToString(), "dateOfService, CASE WHEN invoiceNo > 0 THEN CAST(invoiceNo AS VARCHAR(20)) ELSE itemType END ", "pal_");
}
if (salesItemList.Count > 0)
salesView = (ovSalesView)salesItemList[0];
salesItemList = xData.GetTypedByCriteriaSpecific("recId", typeof(oSales), "surfaceItemId,invoiceNo,itemType", salesMain.surfaceItemId.ToString() + "," + documentNo + ",QT", "sequence");
if (salesItemList.Count > 0 && salesMain == null)
salesMain = (oSales)salesItemList[0];
break;
case pNums.DocumentType.Receipt:
//CVH 2016-09-20 Get salesView and salesMain for specific document number
//salesItemList = xData.GetTypedByCriteriaSpecific("recId", typeof(oSalesView), "surfaceItemId,itemType", salesMain.surfaceItemId.ToString() + ",PM", "dateOfService, CASE WHEN invoiceNo > 0 THEN CAST(invoiceNo AS VARCHAR(20)) ELSE itemType END ", "pal_");
salesItemList = xData.GetTypedByCriteriaSpecific("recId", typeof(ovSalesView), "surfaceItemId,itemType,receiptNo", salesMain.surfaceItemId.ToString() + ",PM," + documentNo, "dateOfService, CASE WHEN invoiceNo > 0 THEN CAST(invoiceNo AS VARCHAR(20)) ELSE itemType END ", "pal_");
if (salesItemList.Count > 0)
salesView = (ovSalesView)salesItemList[0];
foreach (oSales sale in xData.GetTypedByCriteriaSpecific("recId", typeof(oSales), "surfaceItemId,itemType,receiptNo", salesMain.surfaceItemId.ToString() + ",PM," + documentNo, "dateOfService DESC"))
{
salesMain = sale;
break;
}
break;
case pNums.DocumentType.CreditNote:
salesItemList = xData.GetTypedByCriteriaSpecific("recId", typeof(ovSalesView), "surfaceItemId,itemType,invoiceNo", salesMain.surfaceItemId.ToString() + ",CN," + documentNo, "dateOfService", "pal_");
if (salesItemList.Count > 0)
salesView = (ovSalesView)salesItemList[0];
foreach (oSales sale in xData.GetTypedByCriteriaSpecific("recId", typeof(oSales), "surfaceItemId,itemType,invoiceNo", salesMain.surfaceItemId.ToString() + ",CN," + documentNo, "dateOfService DESC"))
{
salesMain = sale;
break;
}
break;
default:
break;
}
//get templates
foreach (oTemplate template in xData.GetTypedByCriteriaSpecific("recId", typeof(oTemplate), "templateTypeId", pNums.TemplateType.Sales.GetHashCode().ToString(), "templateName"))
{
if (template.templateName.ToLower().Contains("header"))
{
headerData = template.templateContent;
}
else if (template.templateName.ToLower().Contains("body"))
{
bodyData = template.templateContent;
}
}
//set TO/FROM labels
headerData = headerData.Replace("{To}", docType == pNums.DocumentType.Receipt ? "From" : "To");
headerData = headerData.Replace("{From}", docType == pNums.DocumentType.Receipt ? "To" : "From");
//JR 2019-04-27 Contact Details
StringBuilder sbContactDetails = new StringBuilder();
sbContactDetails.Append("Contact Details
");
sbContactDetails.Append(setup.tel + "
");
sbContactDetails.Append(setup.email + "
");
headerData = headerData.Replace("{contactDetails}", sbContactDetails.ToString());
//CVH 2016-09-14 Build transaction number with padded 0's
switch (docType)
{
case pNums.DocumentType.Statement:
headerData = headerData.Replace("{DocDate}", "Statement Date:
" + DateTime.Now.ToString("yyyy/MM/dd") + "
");
headerData = headerData.Replace("{DocNum}", "");
break;
case pNums.DocumentType.Invoice:
headerData = headerData.Replace("{DocNum}", "Invoice Number:
" + BuildNextTransactionNumber(setup.saleINVPrefix, setup.saleINVNumLength, salesMain.invoiceNo) + "
");
headerData = headerData.Replace("{DocDate}", "Invoice Date:
" + DateTime.Now.ToString("yyyy/MM/dd") + "
");
break;
case pNums.DocumentType.Quote:
headerData = headerData.Replace("{DocNum}", "Quote Number:
" + BuildNextTransactionNumber(setup.saleQTEPrefix, setup.saleQTENumLength, salesMain.invoiceNo) + "
");
headerData = headerData.Replace("{DocDate}", "Quote Date:
" + DateTime.Now.ToString("yyyy/MM/dd") + "
");
break;
case pNums.DocumentType.Receipt:
headerData = headerData.Replace("{DocNum}", "Receipt Number:
" + BuildNextTransactionNumber(setup.saleRCTPrefix, setup.saleRCTNumLength, salesMain.receiptNo) + "
");
headerData = headerData.Replace("{DocDate}", "Receipt Date:
" + DateTime.Now.ToString("yyyy/MM/dd") + "
");
break;
case pNums.DocumentType.CreditNote:
headerData = headerData.Replace("{DocNum}", "Credit Note Number:
" + BuildNextTransactionNumber(setup.saleCRNPrefix, setup.saleCRNNumLength, salesMain.invoiceNo) + "
");
headerData = headerData.Replace("{DocDate}", "Credit Note Date:
" + DateTime.Now.ToString("yyyy/MM/dd") + "
");
break;
default:
headerData = headerData.Replace("{DocNum}", "").Replace("{DocDate}", "");
break;
}
headerData = headerData.Replace("{AccountNumber}", "Account No:
" + salesMain.accountNo + "
");
if ((docType == pNums.DocumentType.Invoice || docType == pNums.DocumentType.Quote) && salesMain.reference != string.Empty)
headerData = headerData.Replace("{Reference}", "Reference:
" + salesMain.reference + "
");
else
headerData = headerData.Replace("{Reference}", "");
string attentionContact = salesMain.surname;
if (attentionContact == string.Empty)
headerData = headerData.Replace("{Attention}", "");
else
headerData = headerData.Replace("{Attention}", "Attention:
" + attentionContact + "
");
/* CVH 2016-08-15 Add address line 5 & 6 (Province/State & Country in line 4 & 5, Postal Code line 6) */
//replace address breaks
salesMain.postalAddress = salesMain.postalAddress.Replace("\n", "
").Replace("~|~", "
").Replace("~1~", "").Replace("~2~", "").Replace("~3~", "").Replace("~4~", "").Replace("~5~", "").Replace("~6~", "");
/* CVH 2016-09-13 Add trading as name to company name */
string companyName = setup.customer;
if (setup.tradingAs != String.Empty && !companyName.Contains(" t/a "))
companyName += " t/a " + setup.tradingAs;
headerData = headerData.Replace("{FromName}", companyName);
headerData = headerData.Replace("{FromAddress}", setup.postalStreet + "
" + setup.postalSuburb + "
" + setup.postalCity + "
" + setup.postalProvinceState + "
" + setup.postalCountry + "
" + setup.postalCode);
if (setup.vatRegistered)
{
//merge header values
headerData = headerData.Replace("{FromTaxDisplayname}", "VAT Number:");
headerData = headerData.Replace("{FromTaxDisplayNumber}", setup.vatRegistrationNumber);
headerData = headerData.Replace("{SetupVATNumberLabel}", "VAT Number:");
}
else
{
headerData = headerData.Replace("{FromTaxDisplayNumber}", "");
headerData = headerData.Replace("{FromTaxDisplayname}", "");
}
//get item from customers
string customerVatNumber = string.Empty;
if (handler.ReturnSetup().code == "CAPI-1")
{
customerVatNumber = GetSalesCustomerVatNumber(salesMain.name);
}
else
{
customerVatNumber = salesMain.vatNum;
}
if (customerVatNumber != string.Empty && customerVatNumber != "No")
{
headerData = headerData.Replace("{ToTaxDisplayname}", "VAT Number:");
headerData = headerData.Replace("{ToTaxNumber}", customerVatNumber);
}
else
{
headerData = headerData.Replace("{ToTaxDisplayname}", "");
headerData = headerData.Replace("{ToTaxNumber}", "");
}
headerData = headerData.Replace("{oSales.title}", salesMain.title);
headerData = headerData.Replace("{oSales.name}", salesMain.name);
headerData = headerData.Replace("{oSales.surname}", salesMain.surname);
headerData = headerData.Replace("{oSales.postalAddress}", salesMain.postalAddress.Replace(",", "
"));
utils.MergeHTMData(ref headerData, utils.BuildFieldCodeList(setup, true));
utils.MergeHTMData(ref headerData, utils.BuildFieldCodeList(salesMain, true));
//custom values
headerData = headerData.Replace("{heading}", docType == pNums.DocumentType.Invoice ? "TAX INVOICE" : utils.SplitWords(Enum.GetName(typeof(pNums.DocumentType), docType.GetHashCode())).ToUpper());
headerData = headerData.Replace("{Date}", documentDate.ToString("yyyy/MM/dd"));
headerData = headerData.Replace("{WebAddress}", "");
//cater for image paths
headerData = headerData.Replace("/images/", webAddress + "/images/");
headerData = headerData.Replace("/upload/image/", webAddress + "/upload/image/");
//CVH 2016-09-15 If no logo uploaded, build company name in box
if (setup.logoUploaded == String.Empty)
headerData = headerData.Replace("{logo} | ", "" + companyName + " | ");
else
headerData = headerData.Replace("{logo}", "
");
//merge body values
switch (docType)
{
case pNums.DocumentType.Statement:
bodyData = bodyData.Replace("{AccountLines}", BuildSalesStatementLines(salesMain, salesItemList, salesView, statementDateFrom, statementDateTo));
bodyData = bodyData.Replace("{Totals}", BuildSalesTotals(salesItemList, docType, statementDateTo));
break;
case pNums.DocumentType.Invoice:
bodyData = bodyData.Replace("{AccountLines}", BuildSalesInvoiceLines(salesItemList, pNums.TemplateType.Sales, true, null, docType));
bodyData = bodyData.Replace("{Totals}", BuildSalesTotals(salesItemList, docType, statementDateTo));
break;
case pNums.DocumentType.Quote:
bodyData = bodyData.Replace("{AccountLines}", BuildSalesInvoiceLines(salesItemList, pNums.TemplateType.Sales, true, null, docType));
bodyData = bodyData.Replace("{Totals}", BuildSalesTotals(salesItemList, docType, statementDateTo, salesMain));
break;
case pNums.DocumentType.Receipt:
bodyData = bodyData.Replace("{AccountLines}", BuildSalesReceiptLines(salesMain, salesItemList, salesView));
bodyData = bodyData.Replace("{Totals}", BuildSalesTotals(salesItemList, docType, statementDateTo));
break;
case pNums.DocumentType.CreditNote:
bodyData = bodyData.Replace("{AccountLines}", BuildSalesReceiptLines(salesMain, salesItemList, salesView));
bodyData = bodyData.Replace("{Totals}", BuildSalesTotals(salesItemList, docType, statementDateTo));
break;
default:
break;
}
bodyData = bodyData.Replace("{FootNotes}", BuildFootNotes(salesItemList, setup, docType));
string additionalNotes = "
";
if (docType == pNums.DocumentType.Receipt)
additionalNotes = BuildAdditionalNotes(docType, salesMain.receiptNo);
else
additionalNotes = BuildAdditionalNotes(docType, salesMain.invoiceNo);
if (handler.ReturnSetup().code == "SHEN-1")
{
bodyData = bodyData.Replace("{AdditionalNotes}", string.Empty);
}
else
{
bodyData = bodyData.Replace("{AdditionalNotes}", additionalNotes);
}
statementFile = Enum.GetName(typeof(pNums.DocumentType), docType.GetHashCode()) + "_" + salesMain.surfaceItemId + "_" + DateTime.Now.ToString("yyyy-MM-dd-hh-mm") + ".pdf";
statementPath = HttpContext.Current.Server.MapPath("~/upload/documents/");
utils.validateFolder(statementPath);
string columnHeaders = string.Empty;
columnHeaders = @"" + GetColumnHeaders(pNums.TemplateType.Sales, true, null) + "";
result = utils.ConvertHTMLToPDFFile(bodyData, statementPath + statementFile, true, headerData, "", true, "", columnHeaders);
return result;
}
catch (Exception ex)
{
throw new Exception(MethodBase.GetCurrentMethod().Name + ":" + ex.Message);
}
}
public static string BuildFootNotes(ArrayList salesItemList, oSetup setup, pNums.DocumentType docType)
{
string returnString = string.Empty;
StringBuilder footBuilder = new StringBuilder();
footBuilder.AppendLine("");
/* CVH 2018-08-11 Bank details contained in setup.notesInvoices */
switch (docType)
{
case pNums.DocumentType.Statement:
footBuilder.AppendLine(setup.notesStatements);
break;
case pNums.DocumentType.Invoice:
DateTime dueDate = new DateTime();
foreach (oSales salesItem in salesItemList)
{
dueDate = salesItem.dateDue;
}
if (handler.ReturnSetup().code == "SHEN-1")
{
setup.notesInvoices = setup.notesInvoices.Replace("{DueDate}", dueDate.ToString("dd-MMM-yy"));
}
else
{
footBuilder.AppendLine($"Due Date: {dueDate.ToShortDateString()}");
}
footBuilder.AppendLine(setup.notesInvoices);
break;
case pNums.DocumentType.Quote:
footBuilder.AppendLine(setup.notesQuotes);
break;
case pNums.DocumentType.Receipt:
footBuilder.AppendLine(setup.notesReceipts);
break;
case pNums.DocumentType.CreditNote:
footBuilder.AppendLine(setup.notesCreditNotes);
break;
default:
break;
}
footBuilder.Replace("{oSetup.email}", setup.email);
/*
footBuilder.AppendLine(" Payment Details ");
footBuilder.AppendLine($"Bank: {setup.bankName} ");
footBuilder.AppendLine($"A/c No: {setup.bankAccountNumber} ");
footBuilder.AppendLine($"Branch: {setup.bankBranch} ");
footBuilder.AppendLine($"Branch Code: {setup.bankBranchCode} ");
footBuilder.AppendLine($"Swift Code: {setup.bankSwift} ");
footBuilder.AppendLine(" Use your invoice or account number as reference.");
footBuilder.AppendLine($" Please send proof of payment to {setup.email}");
*/
footBuilder.AppendLine(" |
");
returnString = footBuilder.ToString();
return returnString;
}
public static string BuildSalesInvoiceLines(ArrayList salesItemList, pNums.TemplateType templateType, bool isSupplierLocal, string currency, pNums.DocumentType docType = pNums.DocumentType.Statement)
{
StringBuilder lineResult = new StringBuilder();
try
{
oSetup setup = (oSetup)(xData.GetTypedByCriteriaSpecific("recId", typeof(oSetup), "isActive", "1")[0]);
lineResult.AppendLine(GetColumnHeaders(templateType, isSupplierLocal, currency));
if (handler.ReturnSetup().code == "CAPI-1" && docType.Equals(pNums.DocumentType.Invoice))
{
foreach (oSalesItemsFinal salesItem in salesItemList)
{
//show amounts as exclusive of VAT if there is a Vat Rate on the line
decimal unitFeeExclusive = salesItem.SalesItemsFinal_SalesItemsFinal_SalesItemsFinalUnitPriceZAR;
decimal amountExclusive = salesItem.SalesItemsFinal_SalesItemsFinal_SalesItemsFinalTotalPriceZAR;
//if (setup.vatRegistered && setup.vatRate > 0)
//{
// unitFeeExclusive = (100.00m / (100.00m + setup.vatRate)) * salesItem.SalesItemsFinal_SalesItemsFinal_SalesItemsFinalUnitPriceZAR;
// amountExclusive = unitFeeExclusive * salesItem.SalesItemsFinal_SalesItemsFinal_SalesItemsFinalQuantityRequired;
//}
lineResult.AppendLine("");
lineResult.AppendLine("| " + salesItem.SalesItemsFinal_SalesItemsFinal_SalesItemsFinalPartNumber + " | ");
lineResult.AppendLine("" + salesItem.SalesItemsFinal_SalesItemsFinal_SalesItemsFinalMasterPartNumber + " | ");
lineResult.AppendLine("" + salesItem.SalesItemsFinal_SalesItemsFinal_SalesItemsFinalDescription + " | ");
lineResult.AppendLine("" + salesItem.SalesItemsFinal_SalesItemsFinal_SalesItemsFinalBrand + " | ");
lineResult.AppendLine("" + salesItem.SalesItemsFinal_SalesItemsFinal_SalesItemsFinalCondition + " | ");
lineResult.AppendLine("" + salesItem.SalesItemsFinal_SalesItemsFinal_SalesItemsFinalLeadTime + " | ");
lineResult.AppendLine("" + salesItem.SalesItemsFinal_SalesItemsFinal_SalesItemsFinalWeightKG + " | ");
lineResult.AppendLine("" + salesItem.SalesItemsFinal_SalesItemsFinal_SalesItemsFinalQuantityRequired + " | ");
lineResult.AppendLine("" + utils.returnFormattedDecimal(Convert.ToString(decimal.Round(unitFeeExclusive, 2))).Replace(" ", ",") + " | ");
//lineResult.AppendLine(" | ");
lineResult.AppendLine("" + utils.returnFormattedDecimal(Convert.ToString(decimal.Round(amountExclusive, 2))).Replace(" ", ",") + " | ");
lineResult.AppendLine("
");
}
}
else if (handler.ReturnSetup().code == "CAPI-1" && docType.Equals(pNums.DocumentType.Quote))
{
foreach (oQuoteItemsFinal quoteItem in salesItemList)
{
//show amounts as exclusive of VAT if there is a Vat Rate on the line
decimal unitFeeExclusive = quoteItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalUnitPriceZAR;
decimal amountExclusive = quoteItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalTotalPriceZAR;
if (templateType.Equals(pNums.TemplateType.PurchaseOrder))
{
if (!isSupplierLocal)
{
unitFeeExclusive = quoteItem.CostPriceFOREX;
amountExclusive = quoteItem.CostPriceFOREX * quoteItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalQuantityAvailable;
}
else
{
unitFeeExclusive = quoteItem.CostPriceZAR;
amountExclusive = quoteItem.CostPriceZAR * quoteItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalQuantityAvailable;
}
}
//if (setup.vatRegistered && setup.vatRate > 0)
//{
// unitFeeExclusive = (100.00m / (100.00m + setup.vatRate)) * quoteItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalUnitPriceZAR;
// amountExclusive = unitFeeExclusive * quoteItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalQuantityAvailable;
//}
lineResult.AppendLine("");
lineResult.AppendLine("| " + quoteItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalPartNumber + " | ");
lineResult.AppendLine("" + quoteItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalMasterPartNumber + " | ");
lineResult.AppendLine("" + quoteItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalDescription + " | ");
lineResult.AppendLine("" + quoteItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalBrand + " | ");
lineResult.AppendLine("" + quoteItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalCondition + " | ");
if(templateType.Equals(pNums.TemplateType.Sales))
lineResult.AppendLine("" + quoteItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalLeadTime + " | ");
lineResult.AppendLine("" + quoteItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalWeightKG + " | ");
if (templateType.Equals(pNums.TemplateType.PurchaseOrder))
{
lineResult.AppendLine("" + quoteItem.WarehouseLocation + " | ");
}
if (!templateType.Equals(pNums.TemplateType.StockPick))
{
lineResult.AppendLine("" + quoteItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalQuantityAvailable + " | ");
}
else
{
var oPickingSlipItem = (oPurchaseOrderPickingSlipQuoteItemFinal)quoteItem;
lineResult.AppendLine("" + oPickingSlipItem.Available + " | ");
}
if (!templateType.Equals(pNums.TemplateType.StockPick))
{
lineResult.AppendLine("" + utils.returnFormattedDecimal(Convert.ToString(decimal.Round(unitFeeExclusive, 2))).Replace(" ", ",") + " | ");
lineResult.AppendLine("" + utils.returnFormattedDecimal(Convert.ToString(decimal.Round(amountExclusive, 2))).Replace(" ", ",") + " | ");
}
else
{
lineResult.AppendLine("" + quoteItem.WarehouseLocation + " | ");
lineResult.AppendLine("" + quoteItem.Location + " | ");
var oPickingSlipItem = (oPurchaseOrderPickingSlipQuoteItemFinal)quoteItem;
lineResult.AppendLine("" +
(quoteItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalQuantityAvailable - oPickingSlipItem.Available) + " | ");
lineResult.AppendLine("" + oPickingSlipItem.Available + " | ");
lineResult.AppendLine("" + oPickingSlipItem.LocationBin + " | ");
}
lineResult.AppendLine("
");
}
}
else
{
foreach (oSales salesItem in salesItemList)
{
//show amounts as exclusive of VAT if there is a Vat Rate on the line
decimal unitFeeExclusive = salesItem.unitFee;
decimal amountExclusive = salesItem.amount;
if (setup.vatRegistered && setup.vatRate > 0)
{
unitFeeExclusive = (100.00m / (100.00m + setup.vatRate)) * salesItem.unitFee;
amountExclusive = unitFeeExclusive * salesItem.qty;
}
lineResult.AppendLine("");
//CVH 2016-09-21 Saved item description as main description, user description on second line
//lineResult.AppendLine("| " + salesItem.itemDescription + " | ");
string desc = salesItem.itemCode;
foreach (oSalesItem item in xData.GetTypedByCriteriaSpecific("recId", typeof(oSalesItem), "code,isDeleted", salesItem.itemCode + ",0"))
{
if (desc != String.Empty)
desc += " - ";
desc += item.description;
}
lineResult.AppendLine("" + desc);
string secondDescription = salesItem.itemDescription.Replace(desc, string.Empty).Trim();
if (secondDescription != string.Empty)
{
secondDescription = secondDescription.StartsWith("-") ? secondDescription.Substring(1) : secondDescription;
lineResult.AppendLine(" " + secondDescription + "");
}
lineResult.AppendLine(" | ");
lineResult.AppendLine("" + salesItem.qty + " | ");
lineResult.AppendLine("" + utils.returnFormattedDecimal(Convert.ToString(decimal.Round(unitFeeExclusive, 2))).Replace(" ", ",") + " | ");
if (handler.ReturnSetup().code != "SHEN-1")
{
lineResult.AppendLine(" | ");
}
lineResult.AppendLine("" + utils.returnFormattedDecimal(Convert.ToString(decimal.Round(amountExclusive, 2))).Replace(" ", ",") + " | ");
lineResult.AppendLine("
");
}
}
lineResult.AppendLine(" ");
}
catch (Exception ex)
{
throw new Exception(MethodBase.GetCurrentMethod().Name + ":" + ex.Message);
}
return lineResult.ToString();
}
public static string GetColumnHeaders(pNums.TemplateType templateType, bool isLocalSupplier, string currency)
{
StringBuilder lineResult = new StringBuilder();
lineResult.AppendLine("");
lineResult.AppendLine("");
if (handler.ReturnSetup().code == "CAPI-1")
{
lineResult.AppendLine("| Part No | ");
lineResult.AppendLine("Master No | ");
lineResult.AppendLine("Description | ");
lineResult.AppendLine("Brand | ");
lineResult.AppendLine("Condition | ");
if (templateType.Equals(pNums.TemplateType.Sales))
lineResult.AppendLine("Lead Time | ");
lineResult.AppendLine("KG | ");
if (templateType.Equals(pNums.TemplateType.PurchaseOrder))
{
lineResult.AppendLine("Notes | ");
}
lineResult.AppendLine("Qty | ");
if (!templateType.Equals(pNums.TemplateType.StockPick))
{
lineResult.AppendLine("Unit Price | ");
if (!isLocalSupplier)
lineResult.AppendLine("Amount " + currency + " | ");
else
lineResult.AppendLine("Amount ZAR | ");
}
else
{
lineResult.AppendLine("Warehouse | ");
lineResult.AppendLine("Bin | ");
lineResult.AppendLine("Picked | ");
lineResult.AppendLine("Outstanding | ");
lineResult.AppendLine("Tote /Bin | ");
}
}
else
{
lineResult.AppendLine("Description | ");
lineResult.AppendLine("Quantity | ");
lineResult.AppendLine("Unit Price | ");
if (handler.ReturnSetup().code != "SHEN-1")
{
lineResult.AppendLine("Discount % | ");
}
lineResult.AppendLine("Amount ZAR | ");
}
lineResult.AppendLine("
");
return lineResult.ToString();
}
private static string BuildSalesTotals(ArrayList salesItemList, pNums.DocumentType docType, DateTime? statementDateTo, oSales sale = null)
{
StringBuilder totalsBuilder = new StringBuilder();
try
{
string currency = "ZAR";
decimal dSubTotal = 0M;
decimal dVAT = 0M;
decimal dTotalAmount = 0M;
decimal dTotalPayments = 0M;
decimal dAmountDue = 0M;
decimal dTotalWeight = 0M;
int surfaceItemId = 0;
oSetup setup = (oSetup)(xData.GetTypedByCriteriaSpecific("recId", typeof(oSetup), "isActive", "1")[0]);
switch (docType)
{
case pNums.DocumentType.Statement:
if (salesItemList == null || salesItemList.Count <= 0)
{
decimal accBal = 0;
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"Balance Due: {accBal:F2} | ");
}
else
{
salesItemList.Reverse();
ovSalesView salesView = (ovSalesView)salesItemList[0];
decimal accBal = xData.GetSalesBalance(salesView.surfaceItemId, statementDateTo);
totalsBuilder.AppendLine("
");
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"Balance Due: {accBal:F2} | ");
}
break;
case pNums.DocumentType.Receipt:
totalsBuilder.AppendLine("
");
break;
case pNums.DocumentType.Invoice:
decimal exclBalance = 0M;
if (handler.ReturnSetup().code == "CAPI-1")
{
foreach (oSalesItemsFinal salesItem in salesItemList)
{
dSubTotal += salesItem.SalesItemsFinal_SalesItemsFinal_SalesItemsFinalTotalPriceZAR;
dTotalWeight += salesItem.SalesItemsFinal_SalesItemsFinal_SalesItemsFinalWeightKG * salesItem.SalesItemsFinal_SalesItemsFinal_SalesItemsFinalQuantityRequired;
//surfaceItemId = salesItem.surfaceItemId;
}
}
else
{
foreach (oSales salesItem in salesItemList)
{
dSubTotal += salesItem.amount;
surfaceItemId = salesItem.surfaceItemId;
}
}
if (sale != null)
{
exclBalance = dSubTotal;// (100.00m / (100.00m + setup.vatRate)) * dSubTotal;
//dVAT = dSubTotal - ((100.00m / (100.00m + setup.vatRate)) * dSubTotal);
dTotalAmount = exclBalance + dVAT;
dVAT = (dSubTotal / 100) * sale.vatRate;
dTotalAmount = dSubTotal + dVAT;
}
else if (setup.vatRegistered && setup.vatRate > 0)
{
exclBalance = dSubTotal;// (100.00m / (100.00m + setup.vatRate)) * dSubTotal;
//dVAT = dSubTotal - ((100.00m / (100.00m + setup.vatRate)) * dSubTotal);
dTotalAmount = exclBalance + dVAT;
dVAT = (dSubTotal / 100) * setup.vatRate;
dTotalAmount = dSubTotal + dVAT;
}
else
{
exclBalance = dSubTotal;
dVAT = 0M;
dTotalAmount = exclBalance + dVAT;
}
//dVAT = (dSubTotal / 100) * vatRate;
//dTotalAmount = dSubTotal + dVAT;
//foreach (oSales paymentItems in xData.GetTypedByCriteriaSpecific("recId", typeof(oSales), "surfaceItemId,itemType", surfaceItemId.ToString() + ",PM"))
//{
// foreach (string paymentAllocId in paymentItems.allocatedReference.Split(','))
// {
// foreach (oSales salesItem in salesItemList)
// {
// if (paymentAllocId.Contains(':'))
// {
// if (salesItem.recId.ToString() == paymentAllocId.Substring(0, paymentAllocId.IndexOf(':')))
// dTotalPayments += Convert.ToDecimal(paymentAllocId.Substring(paymentAllocId.IndexOf(':') + 1));
// }
// else if (salesItem.recId.ToString() == paymentAllocId)
// dTotalPayments += paymentItems.amount;
// }
// }
//}
dAmountDue = dTotalAmount + dTotalPayments;
totalsBuilder.AppendLine("
");
if (sale != null)
{
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine("Nett Amount | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"{exclBalance:N2}");
totalsBuilder.AppendLine(" |
");
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine("VAT @ " + sale.vatRate + "% | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"{dVAT:N2}");
totalsBuilder.AppendLine(" |
");
}
else if (setup.vatRegistered && setup.vatRate > 0)
{
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine("Nett Amount | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"{exclBalance:N2}");
totalsBuilder.AppendLine(" |
");
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine("VAT @ " + setup.vatRate + "% | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"{dVAT:N2}");
totalsBuilder.AppendLine(" |
");
}
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine("Total Amount " + currency + " | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"{dTotalAmount:N2}");
totalsBuilder.AppendLine(" |
");
if (handler.ReturnSetup().code == "CAPI-1")
{
totalsBuilder.AppendLine("| |
");
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine("Total Weight | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"{dTotalWeight:N2} kg");
totalsBuilder.AppendLine(" |
");
totalsBuilder.AppendLine("| |
");
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine("Total Payments | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"{dTotalPayments:N2}");
totalsBuilder.AppendLine(" |
");
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine("Amount Due " + currency + " | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"{dAmountDue:N2}");
totalsBuilder.AppendLine(" |
");
totalsBuilder.AppendLine("
");
}
break;
case pNums.DocumentType.Quote:
if (handler.ReturnSetup().code == "CAPI-1")
{
foreach (oQuoteItemsFinal salesItem in salesItemList)
{
dSubTotal += salesItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalTotalPriceZAR;
dTotalWeight += salesItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalWeightKG * salesItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalQuantityAvailable;
//surfaceItemId = salesItem.surfaceItemId;
}
}
else
{
foreach (oSales salesItem in salesItemList)
{
dSubTotal += salesItem.amount;
surfaceItemId = salesItem.surfaceItemId;
}
}
if (sale != null)
{
exclBalance = dSubTotal;
dTotalAmount = exclBalance + dVAT;
dVAT = (dSubTotal / 100) *sale.vatRate;
dTotalAmount = dSubTotal + dVAT;
}
else if (setup.vatRegistered && setup.vatRate > 0)
{
//exclBalance = (100.00m / (100.00m + setup.vatRate)) * dSubTotal;
// dVAT = dSubTotal - ((100.00m / (100.00m + setup.vatRate)) * dSubTotal);
//dTotalAmount = exclBalance + dVAT;
exclBalance = dSubTotal;// (100.00m / (100.00m + setup.vatRate)) * dSubTotal;
//dVAT = dSubTotal - ((100.00m / (100.00m + setup.vatRate)) * dSubTotal);
dTotalAmount = exclBalance + dVAT;
dVAT = (dSubTotal / 100) * setup.vatRate;
dTotalAmount = dSubTotal + dVAT;
}
else
{
exclBalance = dSubTotal;
dVAT = 0M;
dTotalAmount = exclBalance + dVAT;
}
//foreach (oSales salesItem in salesItemList)
//{
// dSubTotal += salesItem.amount;
// surfaceItemId = salesItem.surfaceItemId;
//}
//if (setup.vatRegistered && setup.vatRate > 0)
//{
// exclBalance = (100.00m / (100.00m + setup.vatRate)) * dSubTotal;
// dVAT = dSubTotal - ((100.00m / (100.00m + setup.vatRate)) * dSubTotal);
// dTotalAmount = exclBalance + dVAT;
//}
//else
//{
// exclBalance = dSubTotal;
// dVAT = 0M;
// dTotalAmount = exclBalance + dVAT;
//}
//calculation to add Vat to Amounts Exclusive of VAT
//dVAT = (dSubTotal / 100) * vatRate;
//dTotalAmount = dSubTotal + dVAT;
foreach (oSales paymentItems in xData.GetTypedByCriteriaSpecific("recId", typeof(oSales), "surfaceItemId,itemType", surfaceItemId.ToString() + ",PM"))
{
foreach (string paymentAllocId in paymentItems.allocatedReference.Split(','))
{
foreach (oSales salesItem in salesItemList)
{
if (paymentAllocId.Contains(':'))
{
if (salesItem.recId.ToString() == paymentAllocId.Substring(0, paymentAllocId.IndexOf(':')))
dTotalPayments += Convert.ToDecimal(paymentAllocId.Substring(paymentAllocId.IndexOf(':') + 1));
}
else if (salesItem.recId.ToString() == paymentAllocId)
dTotalPayments += salesItem.amount;
}
}
}
dAmountDue = dTotalAmount - dTotalPayments;
totalsBuilder.AppendLine("
");
if (sale != null)
{
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
if (handler.ReturnSetup().code == "CAPI-1")
{
totalsBuilder.AppendLine("Subtotal | ");
}
else
{
totalsBuilder.AppendLine("Nett Amount");
}
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"{exclBalance:N2}");
totalsBuilder.AppendLine(" |
");
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine("VAT @ " + sale.vatRate + "% | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"{dVAT:N2}");
totalsBuilder.AppendLine(" |
");
}
else if (setup.vatRegistered && setup.vatRate > 0)
{
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
if (handler.ReturnSetup().code == "CAPI-1")
{
totalsBuilder.AppendLine("Subtotal | ");
}
else
{
totalsBuilder.AppendLine("Nett Amount");
}
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"{exclBalance:N2}");
totalsBuilder.AppendLine(" |
");
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine("VAT @ " + setup.vatRate + "% | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"{dVAT:N2}");
totalsBuilder.AppendLine(" |
");
}
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine("Total Amount " + currency + " | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"{dTotalAmount:N2}");
totalsBuilder.AppendLine(" |
");
if (handler.ReturnSetup().code == "CAPI-1")
{
totalsBuilder.AppendLine("| |
");
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine("Total Weight | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"{dTotalWeight:N2} kg");
totalsBuilder.AppendLine(" |
");
}
totalsBuilder.AppendLine("
");
break;
case pNums.DocumentType.CreditNote:
decimal exclBalanceCN = 0M;
foreach (ovSalesView salesItem in salesItemList)
{
dSubTotal += salesItem.Received;
surfaceItemId = salesItem.surfaceItemId;
}
if (setup.vatRegistered && setup.vatRate > 0)
{
exclBalanceCN = (100.00m / (100.00m + setup.vatRate)) * dSubTotal;
dVAT = dSubTotal - ((100.00m / (100.00m + setup.vatRate)) * dSubTotal);
dTotalAmount = exclBalanceCN + dVAT;
}
else
{
exclBalanceCN = dSubTotal;
dVAT = 0M;
dTotalAmount = exclBalanceCN + dVAT;
}
dAmountDue = dTotalAmount + dTotalPayments;
totalsBuilder.AppendLine("
");
if (sale != null)
{
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine("Nett Amount | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"{exclBalanceCN:F2}");
totalsBuilder.AppendLine(" |
");
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine("VAT @ " + sale.vatRate + "% | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"{dVAT:F2}");
totalsBuilder.AppendLine(" |
");
}
else if (setup.vatRegistered && setup.vatRate > 0)
{
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine("Nett Amount | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"{exclBalanceCN:F2}");
totalsBuilder.AppendLine(" |
");
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine("VAT @ " + setup.vatRate + "% | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"{dVAT:F2}");
totalsBuilder.AppendLine(" |
");
};
totalsBuilder.AppendLine("| | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine("Total Amount " + currency + " | ");
totalsBuilder.AppendLine("");
totalsBuilder.AppendLine($"{dTotalAmount:F2}");
totalsBuilder.AppendLine(" |
");
totalsBuilder.AppendLine("
");
break;
default:
break;
}
}
catch (Exception ex)
{
throw new Exception(MethodBase.GetCurrentMethod().Name + ":" + ex.Message);
}
return totalsBuilder.ToString();
}
private static string BuildAdditionalNotes(pNums.DocumentType docType, int number)
{
StringBuilder addBuilder = new StringBuilder();
try
{
foreach (oSalesExtraNote note in xData.GetTypedByCriteriaSpecific("recId", typeof(oSalesExtraNote), "type,number", docType.GetHashCode().ToString() + "," + number))
{
if (addBuilder.Length == 0)
addBuilder.AppendLine("
Note:
");
addBuilder.AppendLine(note.note + "
");
break;
}
}
catch (Exception ex)
{
throw new Exception(MethodBase.GetCurrentMethod().Name + ":" + ex.Message);
}
return addBuilder.ToString();
}
///
/// Email sales document
///
/// Success
public static bool EmailSalesDocument(oSales account,
string configFrom, string subject, string emailTo, string emailCc, string emailBcc, string emailBody,
string configWebAddress, int userId, DateTime documentDate,
DateTime? statementDateFrom, DateTime? statementDateTo, pNums.DocumentType docType, string documentNo,
string fromDisplayName, string noteSurfaceFieldName)
{
try
{
string file = String.Empty;
string path = string.Empty;
if (CreateSalesDocument(account, configWebAddress, documentDate, statementDateFrom,
statementDateTo, ref path, ref file, docType, documentNo))
{
/* CVH 2016-09-02 Use template from calling method, user allowed to edit before send. All {placeholder}'s have already been replaced before showing in modal */
string emailTemplate = emailBody;
oEmail mail = new oEmail();
mail.Body = emailTemplate;
mail.Attachments.Add(path + file);
mail.Subject = subject;
mail.fromAddress = configFrom;
mail.toAddress = emailTo;
mail.ccAddress = emailCc;
mail.bccAddress = emailBcc;
if (communication.SendAnEmail(mail, fromDisplayName))
{
//Add note with statement as attachment
AddCreateStatementNote(account.surfaceItemId, mail.Subject, mail.Body, path, file, userId,
noteSurfaceFieldName);
return true;
}
else
{
return false;
}
}
else
return false;
}
catch (Exception ex)
{
throw new Exception(MethodBase.GetCurrentMethod().Name + ":" + ex.Message);
}
}
public static string BuildEmailTemplate(string emailTemplate, oSales account, oSetup setup, string configWebAddress)
{
try
{
string primaryContact = "";
string emailDocNumber = "";
string documentType = "";
if (account != null)
{
// In the case of a Quote, xSales.GetSalesPrimaryContact
// does not make sense since no column ending with
// _PrimaryContact exists
primaryContact = !"QT".Equals(account.itemType)
? xSales.GetSalesPrimaryContact(account.surfaceItemId)
: string.Empty;
//primaryContact = xSales.GetSalesPrimaryContact(account.surfaceItemId);
utils.MergeHTMData(ref emailTemplate, utils.BuildFieldCodeList(account, true));
//CVH 2016-09-14 Build transaction number with padded 0's
switch (account.itemType)
{
case "CN":
emailDocNumber = BuildNextTransactionNumber(setup.saleCRNPrefix, setup.saleCRNNumLength, account.invoiceNo);
documentType = "Credit Note";
break;
case "TI":
emailDocNumber = BuildNextTransactionNumber(setup.saleINVPrefix, setup.saleINVNumLength, account.invoiceNo);
documentType = "Invoice";
break;
case "QT":
emailDocNumber = BuildNextTransactionNumber(setup.saleQTEPrefix, setup.saleQTENumLength, account.invoiceNo);
documentType = "Quote";
break;
case "PM":
emailDocNumber = BuildNextTransactionNumber(setup.saleRCTPrefix, setup.saleRCTNumLength, account.receiptNo);
documentType = "Receipt";
break;
}
}
/* CVH 2016-09-13 Add trading as name to company name */
string companyName = setup.customer;
if (setup.tradingAs != String.Empty && !companyName.Contains(" t/a "))
companyName += " t/a " + setup.tradingAs;
emailTemplate = emailTemplate.Replace("{Date}", System.DateTime.Now.ToString("yyyy/MM/dd"));
emailTemplate = emailTemplate.Replace("src=\"/images/", "src=\"" + configWebAddress + "/images/");
emailTemplate = emailTemplate.Replace("src=\"/upload/image/", "src=\"" + configWebAddress + "/upload/image/");
if (setup.logoUploaded == String.Empty)
emailTemplate = emailTemplate.Replace("{Logo Name}\"", "\" style='display:none'");
else
emailTemplate = emailTemplate.Replace("{Logo Name}", setup.logoUploaded);
emailTemplate = emailTemplate.Replace("{Primary Contact Name}", primaryContact);
emailTemplate = emailTemplate.Replace("{Document Number}", emailDocNumber);
emailTemplate = emailTemplate.Replace("{Document Type}", documentType);
emailTemplate = emailTemplate.Replace("{Company Name}", companyName);
emailTemplate = emailTemplate.Replace("{Company E-mail Address}", setup.email);
}
catch (Exception ex)
{
exception.HandleException("sales:", MethodBase.GetCurrentMethod().Name, ex, 0);
}
return emailTemplate;
}
public static string GetSalesPrimaryContact(int contactSurfaceItemId)
{
string contact = "";
try
{
/* CVH 2016-09-02 Primary contact no longer set on Child Surface. There is a surface field on the Contact surface called "Primary Person" */
//List list = new List();
//oDynamicParam par1 = new oDynamicParam();
//par1.paramDisplayName = "parentSurfaceItemId";
//par1.paramObject = contactSurfaceItemId;
//list.Add(par1);
//DataTable surfaceData = xData.GetTypedTableByProc("recId", typeof(oSurfaceFieldData), "sp_GetSalesPrimaryContact", list);
//if (surfaceData != null && surfaceData.Rows.Count > 0)
// contact = surfaceData.Rows[0][0].ToString();
ArrayList itemList = xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceItem), "recId", contactSurfaceItemId.ToString());
if (itemList == null || itemList.Count <= 0)
throw new Exception("Contact surface item not found.");
oSurfaceItem item = (oSurfaceItem)itemList[0];
DataTable surfaceItemData = xData.GetSurfaceItemData(item.surfaceId, contactSurfaceItemId);
foreach (DataRow row in surfaceItemData.Rows)
{
foreach (DataColumn col in surfaceItemData.Columns)
{
//name
if (col.ColumnName.EndsWith("_PrimaryPerson"))
{
contact = row[col].ToString();
}
}
}
}
catch (Exception ex)
{
throw new Exception(MethodBase.GetCurrentMethod().Name + ":" + ex.Message);
}
return contact;
}
private static string GetSalesCustomerVatNumber(int customerSurfaceItemId)
{
string vatNumber = string.Empty;
try
{
ArrayList itemList = xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceItem), "recId", customerSurfaceItemId.ToString());
if (itemList == null || itemList.Count <= 0)
throw new Exception("Customer surface item not found.");
oSurfaceItem item = (oSurfaceItem)itemList[0];
DataTable surfaceItemData = xData.GetSurfaceItemData(item.surfaceId, customerSurfaceItemId);
foreach (DataRow row in surfaceItemData.Rows)
{
foreach (DataColumn col in surfaceItemData.Columns)
{
//vatnum
if (col.ColumnName.EndsWith("_CustomerVATRegistered"))
{
vatNumber = row[col].ToString();
}
}
}
}
catch (Exception ex)
{
throw new Exception(MethodBase.GetCurrentMethod().Name + ":" + ex.Message);
}
return vatNumber;
}
public static string GetSalesCustomerVatNumber(string customername)
{
string vatNumber = string.Empty;
try
{
DataTable customerData = xData.GetCustomerFromTradingName(customername);
foreach (DataRow row in customerData.Rows)
{
foreach (DataColumn col in customerData.Columns)
{
//vatnum
if (col.ColumnName.EndsWith("_CustomerVATRegistered"))
{
vatNumber = row[col].ToString();
}
}
}
}
catch (Exception ex)
{
throw new Exception(MethodBase.GetCurrentMethod().Name + ":" + ex.Message);
}
return vatNumber;
}
public static string GetSalesCcEmailAddresses(int contactSurfaceItemId)
{
string cc = "";
try
{
/* CVH 2016-08-16 Get CC email addresses */
List list = new List();
oDynamicParam par1 = new oDynamicParam();
par1.paramDisplayName = "parentSurfaceItemId";
par1.paramObject = contactSurfaceItemId;
list.Add(par1);
DataTable surfaceData = xData.GetTypedTableByProc("recId", typeof(oSurfaceFieldData), "sp_GetSalesCcEmailAddresses", list);
foreach (DataRow row in surfaceData.Rows)
{
string ccEmail = row[0].ToString();
if (utils.validateEmail(ccEmail))
{
if (cc == String.Empty)
cc = ccEmail;
else
cc += ";" + ccEmail;
}
}
}
catch (Exception ex)
{
throw new Exception(MethodBase.GetCurrentMethod().Name + ":" + ex.Message);
}
return cc;
}
public static oSales SetSalesContact(int itemId)
{
ArrayList itemList = xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceItem), "recId", itemId.ToString());
if (itemList == null || itemList.Count <= 0)
throw new Exception("Contact surface item not found.");
oSurfaceItem item = (oSurfaceItem)itemList[0];
DataTable surfaceItemData = xData.GetSurfaceItemData(item.surfaceId, itemId);
oSales sales = new oSales();
sales.surfaceItemId = itemId;
foreach (DataRow row in surfaceItemData.Rows)
{
foreach (DataColumn col in surfaceItemData.Columns)
{
//trading name
if (col.ColumnName.EndsWith("_CustomerTradingName"))
{
sales.name = row[col].ToString();
if (sales.name.Length > 1)
{
sales.name = sales.name.Substring(0, 1).ToUpper() + sales.name.Substring(1).ToLower();
}
}
//name
if (string.IsNullOrEmpty(sales.name) && col.ColumnName.EndsWith("Name"))
{
sales.name = row[col].ToString();
if (sales.name.Length > 1)
{
sales.name = sales.name.Substring(0, 1).ToUpper() + sales.name.Substring(1).ToLower();
}
}
//primary email
if (col.ColumnName.EndsWith("_CustomerPrimaryEmail"))
{
sales.email = row[col].ToString();
}
//email
if (string.IsNullOrEmpty(sales.email) && col.ColumnName.EndsWith("_Email"))
{
sales.email = row[col].ToString();
}
//vat Number
if (col.ColumnName.EndsWith("_CustomerVATRegistered"))
{
sales.vatNum = row[col].ToString();
if (sales.vatNum == "Yes" || sales.vatNum == "No")
sales.vatNum = "";
}
//postal address
if (col.ColumnName.EndsWith("_CustomerPostalAddress"))
sales.postalAddress = row[col].ToString();
/* CVH 2016-08-23 Contact Code no longer a field on surface, needs to be auto calculated based on Company Name, first 3 char + numeric */
/* CVH 2016-09-05 Account Code is now a field on the Contacts Surface. */
//account number
if (col.ColumnName.EndsWith("_CustomerCode"))
sales.accountNo = row[col].ToString();
}
}
/* CVH 2016-08-16 Get CC email addresses */
sales.emailCC = GetSalesCcEmailAddresses(itemId);
return sales;
}
public static oSales SetSalesCustomer(int itemId)
{
ArrayList itemList = xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceItem), "recId", itemId.ToString());
if (itemList == null || itemList.Count <= 0)
throw new Exception("Customer surface item not found.");
oSurfaceItem item = (oSurfaceItem)itemList[0];
DataTable surfaceItemData = xData.GetSurfaceItemData(item.surfaceId, itemId);
oSales sales = new oSales();
sales.surfaceItemId = itemId;
foreach (DataRow row in surfaceItemData.Rows)
{
foreach (DataColumn col in surfaceItemData.Columns)
{
//name
if (col.ColumnName.EndsWith("_CustomerTradingName"))
{
sales.name = row[col].ToString();
if (sales.name.Length > 1)
sales.name = sales.name.Substring(0, 1).ToUpper() + sales.name.Substring(1).ToLower();
}
//email
if (col.ColumnName.EndsWith("_CustomerPrimaryEmail"))
sales.email = row[col].ToString();
//vat Number
if (col.ColumnName.EndsWith("_CustomerVATRegistered"))
{
sales.vatNum = row[col].ToString();
if (sales.vatNum == "Yes" || sales.vatNum == "No")
sales.vatNum = "";
}
//postal address
if (col.ColumnName.EndsWith("_CustomerPostalAddress"))
sales.postalAddress = row[col].ToString();
/* CVH 2016-08-23 Contact Code no longer a field on surface, needs to be auto calculated based on Company Name, first 3 char + numeric */
/* CVH 2016-09-05 Account Code is now a field on the Contacts Surface. */
//account number
if (col.ColumnName.EndsWith("_CustomerCode"))
sales.accountNo = row[col].ToString();
}
}
/* CVH 2016-08-16 Get CC email addresses */
sales.emailCC = GetSalesCcEmailAddresses(itemId);
return sales;
}
///
/// Save Sale
///
///
///
///
private bool SaveSale(bool isDraft, oSales sale, string transactionType)
{
try
{
bool result = false;
//switch (transactionType)
//{
// case "PM":
// result = PostReceiptLine(isDraft, sale, transactionType);
// break;
// case "A":
// result = PostReceiptLine(isDraft, sale, transactionType);
// break;
// case "AC":
// result = PostReceiptLine(isDraft, sale, transactionType);
// break;
// case "CN":
// result = PostReceiptLine(isDraft, sale, transactionType);
// break;
// default:
// result = FinaliseTransaction(isDraft, sale);
// break;
//}
if (result)
{
//CVH 2016-09-14 Update Next Transaction number in company setup. Get current db setup
oSetup setupUpdate = handler.ReturnSetup();
setupUpdate = (oSetup)(xData.GetTypedByCriteriaSpecific("recId", typeof(oSetup), "isActive", "1")[0]);
setupUpdate.saleQTENextNum = xData.GetQuoteNoSales();
setupUpdate.saleINVNextNum = xData.GetInvoiceNoSales("TI");
setupUpdate.saleRCTNextNum = xData.GetNextRecNoSales();
setupUpdate.saleCRNNextNum = xData.GetInvoiceNoSales("CN");
xData.UpdateTyped("recId", setupUpdate.recId.ToString(), typeof(oSetup), setupUpdate);
}
return result;
}
catch (Exception ex)
{
throw new Exception(MethodBase.GetCurrentMethod().Name + ":" + ex.Message);
}
}
public static string BuildNextTransactionNumber(string prefix, int length, int nextNum)
{
try
{
if (nextNum <= 0)
nextNum = 1;
string number = prefix;
if (length > prefix.Length + nextNum.ToString().Length)
number = number.PadRight(length - nextNum.ToString().Length, '0');
number += nextNum;
return number;
}
catch (Exception ex)
{
throw new Exception(MethodBase.GetCurrentMethod().Name + ":" + ex.Message);
}
}
///
/// Update all running totals for sales
///
///
public static void UpdateRunningTotals(string surfaceItemId)
{
decimal bal = 0;
if (surfaceItemId != String.Empty)
{
foreach (oSales sales in xData.GetTypedByCriteriaSpecific("recId", typeof(oSales), "surfaceItemId,itemType", surfaceItemId + ",~<>QT", "dateOfService,sequence"))
{
bal += sales.amount;
sales.runningBal = bal;
xData.UpdateTyped("recId", sales.recId.ToString(), typeof(oSales), sales);
}
bal = 0;
//quoteItems running balance
foreach (oSales quoteItems in xData.GetTypedByCriteriaSpecific("recId", typeof(oSales), "surfaceItemId,itemType", surfaceItemId + ",QT", "dateOfService,sequence"))
{
bal += quoteItems.amount;
quoteItems.runningBal = bal;
xData.UpdateTyped("recId", quoteItems.recId.ToString(), typeof(oSales), quoteItems);
}
}
}
}
}