Noted code print X Z Report LAWSON
Song Nghia - Technical Consultant
namespace LAW { namespace Commerce.Runtime.GetReceiptServiceRequest { using System; using System.Collections.Generic; using Microsoft.Dynamics.Commerce.Runtime; using Microsoft.Dynamics.Commerce.Runtime.DataModel; using Microsoft.Dynamics.Commerce.Runtime.DataServices.Messages; using Microsoft.Dynamics.Commerce.Runtime.Messages; using Microsoft.Dynamics.Commerce.Runtime.Services.Messages; using Microsoft.Dynamics.Commerce.Runtime.Workflow; using Microsoft.Dynamics.Commerce.Runtime.RealtimeServices.Messages; using System.Text; using System.Globalization; using System.Linq; using System.Collections.ObjectModel; using System.Transactions; using Microsoft.Dynamics.Commerce.Runtime.Data; public class XZReportsLawsonService { private readonly string SingleLine = string.Empty.PadLeft(55, '-'); private readonly string DoubleLine = string.Empty.PadLeft(55, '='); private Dictionary<string, LocalizedText> localizedTexts = (Dictionary<string, LocalizedText>)null; private string localizedTextKeyFormat = "{0}_{1}"; //Define global variable public GetReceiptServiceRequest originalReceiptsRequest; public GetReceiptServiceResponse originalReceiptsResponse; public Shift shift = new Shift(); public Terminal terminal = new Terminal(); public RetailXReadingEntity XReadingData = new RetailXReadingEntity(); public string header = ""; public string body = ""; public string XReadingNumber; List<DistcountEntity> listDiscountType = new List<DistcountEntity>(); List<DistcountEntity> listVATAdjustDiscountGroup = new List<DistcountEntity>(); decimal globalLastShiftBalance; public string hardwareProfileId; //End define public XZReportsLawsonService(GetReceiptServiceRequest request, GetReceiptServiceResponse response) { originalReceiptsRequest = request; originalReceiptsResponse = response; } private SalesOrder GetSalesOrderForTransactionWithId(RequestContext requestContext, string transactionId) { SalesOrder salesOrder = new SalesOrder(); var getCartRequest = new GetSalesOrderDetailsByTransactionIdServiceRequest(transactionId, SearchLocation.Local); var getCartResponse = requestContext.Execute<GetSalesOrderDetailsServiceResponse>(getCartRequest); salesOrder = getCartResponse.SalesOrder; return salesOrder; } public string generateDocNum() { string DOCNUM = ""; int numSeq = 0; var queryRetailXReport = new SqlPagedQuery(QueryResultSettings.SingleRecord) { DatabaseSchema = "ext", Select = new ColumnSet(new string[] { "DOCNUM" }), From = "LAW_RETAILXREADINGTRANSACTIONDETAIL", Where = "STORE = @STORE AND TERMINALID = @TERMINALID AND DATAAREAID = @DATAAREAID", OrderBy = "SHIFT DESC" }; queryRetailXReport.Parameters["@TERMINALID"] = terminal.TerminalId; queryRetailXReport.Parameters["@STORE"] = shift.StoreId; queryRetailXReport.Parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; using (DatabaseContext databaseContext = new DatabaseContext(originalReceiptsRequest.RequestContext)) { var extensions = databaseContext.ReadEntity<ExtensionsEntity>(queryRetailXReport).FirstOrDefault(); if (extensions == null) { globalLastShiftBalance = 0; return DOCNUM = "X-" + shift.TerminalId + "-000001"; } else { DOCNUM = extensions.GetProperty("DOCNUM").ToString(); var queryOldReport = new SqlPagedQuery(QueryResultSettings.SingleRecord) { DatabaseSchema = "ext", Select = new ColumnSet(new string[] { "DOCNUM", "ENDINGBALANCE" }), From = "LAW_RETAILXREADINGREPORT", Where = "STORE = @STORE AND TERMINALID = @TERMINALID", OrderBy = "SHIFT DESC" }; queryOldReport.Parameters["@TERMINALID"] = terminal.TerminalId; queryOldReport.Parameters["@STORE"] = shift.StoreId; using (DatabaseContext databaseOldContext = new DatabaseContext(originalReceiptsRequest.RequestContext)) { var extensionsOld = databaseOldContext.ReadEntity<ExtensionsEntity>(queryOldReport).FirstOrDefault(); if (extensionsOld != null) { globalLastShiftBalance = decimal.Parse(extensionsOld.GetProperty("ENDINGBALANCE").ToString()); } } } } numSeq = int.Parse(DOCNUM.Substring(DOCNUM.Length - 6, 6)); //numSeq += 1; if (numSeq >= 1 && numSeq < 9) DOCNUM = "X-" + shift.TerminalId + "-00000" + numSeq++; if (numSeq >= 9 && numSeq < 99) DOCNUM = "X-" + shift.TerminalId + "-0000" + numSeq++; if (numSeq >= 99 && numSeq < 999) DOCNUM = "X-" + shift.TerminalId + "-000" + numSeq++; if (numSeq >= 999 && numSeq < 9999) DOCNUM = "X-" + shift.TerminalId + "-00" + numSeq++; if (numSeq >= 9999 && numSeq < 99999) DOCNUM = "X-" + shift.TerminalId + "-0" + numSeq++; if (numSeq >= 99999 && numSeq < 999999) DOCNUM = "X-" + shift.TerminalId + "-" + numSeq++; return DOCNUM; } public void Process() { RequestContext context = originalReceiptsRequest.RequestContext; //Loop all receipt need to print, and only customize X/Z receipt shift = originalReceiptsRequest.ShiftDetails; //Get Current Hardware profile hardwareProfileId = originalReceiptsRequest.HardwareProfileId; terminal = context.GetTerminal(); XReadingNumber = this.generateDocNum(); for (int i = 0; i < originalReceiptsResponse.Receipts.Count; i++) { //Nghia.Song Get all transaction in shift and mark it in table LAW_RETAILXREADINGTRANSACTIONDETAIL if (originalReceiptsResponse.Receipts[i].ReceiptType == ReceiptType.XReport || originalReceiptsResponse.Receipts[i].ReceiptType == ReceiptType.ZReport) { var queryRetailTransactionTable = new SqlPagedQuery(QueryResultSettings.SingleRecord) { DatabaseSchema = "ax", Select = new ColumnSet(new string[] { "TRANSACTIONID, RECEIPTID" }), From = "RETAILTRANSACTIONTABLE", Where = "BATCHID = @BATCHID AND CHANNEL = @CHANNEL AND STORE = @STORE AND TERMINAL = @TERMINAL AND DATAAREAID = @DATAAREAID" }; queryRetailTransactionTable.Parameters["@BATCHID"] = shift.ShiftId; queryRetailTransactionTable.Parameters["@TERMINAL"] = terminal.TerminalId; queryRetailTransactionTable.Parameters["@CHANNEL"] = terminal.ChannelId; queryRetailTransactionTable.Parameters["@STORE"] = shift.StoreId; queryRetailTransactionTable.Parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; using (DatabaseContext databaseContext = new DatabaseContext(originalReceiptsRequest.RequestContext)) { var extensions = databaseContext.ReadEntity<ExtensionsEntity>(queryRetailTransactionTable); //LOOP all retail transaction in shift foreach (ExtensionsEntity extension in extensions) { //Get data string transactionId = extension.GetProperty("TRANSACTIONID").ToString(); string receiptId = extension.GetProperty("RECEIPTID").ToString(); using (TransactionScope transactionScope = new TransactionScope()) { ParameterSet parameters = new ParameterSet(); parameters["@STORE"] = shift.StoreId; parameters["@TERMINALID"] = terminal.TerminalId; parameters["@TRANSACTIONID"] = transactionId; parameters["@TRANSDATE"] = DateTime.Parse(this.FormatDate(shift.StartDateTime, context)); parameters["@SHIFT"] = shift.ShiftId; parameters["@DOCNUM"] = XReadingNumber; parameters["@RECCEIPTID"] = receiptId; parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; int errorCode; using (var databaseContextX = new DatabaseContext(originalReceiptsRequest.RequestContext)) { errorCode = databaseContextX.ExecuteStoredProcedureNonQuery("[ext].[LAW_RETAILXREADINGTRANSACTIONDETAIL_Insert]", parameters); } if (errorCode != 0) throw new StorageException(StorageErrors.Microsoft_Dynamics_Commerce_Runtime_CriticalStorageError, errorCode, "Unable to save data"); transactionScope.Complete(); } } //End Loop all retail transaction in shift } Receipt receiptShift = this.CustomizeXZReport(originalReceiptsResponse.Receipts[i], context, shift); originalReceiptsResponse.Receipts[i].Body = receiptShift.Body; originalReceiptsResponse.Receipts[i].Header = receiptShift.Header; #region Insert XZReport if (originalReceiptsResponse.Receipts[i].ReceiptType == ReceiptType.ZReport) { //Nghia.song save data Xreport using (TransactionScope transactionScope = new TransactionScope()) { ParameterSet parameters = new ParameterSet(); parameters["@STORE"] = shift.StoreId; parameters["@TERMINALID"] = terminal.TerminalId; parameters["@TRANSDATE"] = DateTime.Now; //DateTime.Parse(this.FormatDate(shift.StartDateTime, context)); parameters["@SHIFT"] = shift.ShiftId; parameters["@DOCNUM"] = XReadingData.DOCNUM; parameters["@HEADER"] = XReadingData.HEADER; parameters["@BODY"] = XReadingData.BODY; parameters["@FOOTER"] = ""; parameters["@COMPANYNAME"] = XReadingData.COMPANYNAME; parameters["@BUSINESSSTYLE"] = XReadingData.BUSINESSSTYLE; parameters["@COMPANYADDRESS"] = XReadingData.COMPANYADDRESS; parameters["@TIN"] = XReadingData.TIN; parameters["@STAFFNAME"] = XReadingData.STAFFNAME; parameters["@REPORTNAME"] = XReadingData.REPORTNAME; parameters["@GROSSSALES"] = XReadingData.GROSSSALES; parameters["@NETSALES"] = XReadingData.NETSALES; parameters["@BEGININGBALANCE"] = XReadingData.BEGININGBALANCE; parameters["@ENDINGBALANCE"] = XReadingData.ENDINGBALANCE; parameters["@XREPORTID"] = XReadingData.XREPORTID; parameters["@BEGINNINGRETURNNO"] = XReadingData.BEGINNINGRETURNNO; parameters["@ENDINGSALESINVOICENO"] = XReadingData.ENDINGSALESINVOICENO; parameters["@BEGINNINGSALESINVOICENO"] = XReadingData.BEGINNINGSALESINVOICENO; parameters["@ENDINGRETURNNO"] = XReadingData.ENDINGRETURNNO; parameters["@ZERORATEDSALESVATAMOUNT"] = XReadingData.ZERORATEDSALESVATAMOUNT; parameters["@VATABLESALES"] = XReadingData.VATABLESALES; parameters["@VATEXEMPTSALES"] = XReadingData.VATEXEMPTSALES; parameters["@ZERORATEDSALES"] = XReadingData.ZERORATEDSALES; parameters["@VATAMOUNT"] = XReadingData.VATAMOUNT; parameters["@NOOFTRAININGTRANS"] = XReadingData.NOOFTRAININGTRANS; parameters["@NOOFPAYINGCUST"] = XReadingData.NOOFPAYINGCUST; parameters["@NOOFRETURN"] = XReadingData.NOOFRETURN; parameters["@NUMBEROFITEMSOLD"] = XReadingData.NUMBEROFITEMSOLD; parameters["@NOOFSUSPENDED"] = XReadingData.NOOFSUSPENDED; parameters["@DATAAREAID"] = XReadingData.DATAAREAID; parameters["@REGULARDISCOUNTS"] = XReadingData.REGULARDISCOUNTS; parameters["@ACTUALDATE"] = XReadingData.ACTUALDATE; parameters["@ACTUALTIME"] = 14400;// DateTime.Now.TimeOfDay;// XReadingData.ACTUALTIME; parameters["@TENDERTYPE"] = XReadingData.TENDERTYPE;//XReadingData.TENDERTYPE; parameters["@TENDERDECLARATION"] = XReadingData.TENDERDECLARATION; parameters["@RETURNAMOUNT"] = XReadingData.RETURNAMOUNT; parameters["@ROUNDING"] = XReadingData.ROUNDING; parameters["@NOOFTRANSACTION"] = XReadingData.NOOFTRANSACTION; parameters["@NOOFABORTED"] = XReadingData.NOOFABORTED; parameters["@NOOFOPENDRAWER"] = XReadingData.NOOFOPENDRAWER; parameters["@OVERBALANCE"] = XReadingData.OVERAMOUNT; parameters["@SHORTBALANCE"] = XReadingData.SHORTAMOUNT; parameters["@MACHINEIDENTIFY"] = XReadingData.MIN; parameters["@SERIALNUMBER"] = XReadingData.SN; parameters["@TOTALDISCOUNT"] = XReadingData.TOTALDISCOUNTS; parameters["@TOTALVATADJUSTMENT"] = XReadingData.TOTALVATADJUSTMENT; parameters["@NOOFLOGON"] = XReadingData.NOOFLOGON; parameters["@ZERORATEDDISCOUNT"] = XReadingData.ZERORATEDDISCOUNT; int errorCode; using (var databaseContextX = new DatabaseContext(originalReceiptsRequest.RequestContext)) { errorCode = databaseContextX.ExecuteStoredProcedureNonQuery("[ext].[LAW_RETAILXREADINGREPORT_Insert]", parameters); } if (errorCode != 0) throw new StorageException(StorageErrors.Microsoft_Dynamics_Commerce_Runtime_CriticalStorageError, errorCode, "Unable to save data"); transactionScope.Complete(); } } #endregion } } } private Receipt CustomizeXZReport(Receipt receipt, RequestContext context, Shift shift) { Receipt customizedReceipt = new Receipt(); GetDeviceConfigurationDataRequest getDeviceConfigurationDataRequest = new GetDeviceConfigurationDataRequest(); SingleEntityDataServiceResponse<DeviceConfiguration> deviceConfiguration = originalReceiptsRequest.RequestContext.Execute<SingleEntityDataServiceResponse<DeviceConfiguration>>(getDeviceConfigurationDataRequest); this.getDateTimeShiftAndReportName(receipt, context, shift); this.getTerminalDetail(receipt, context, shift); this.getBeginingSalesInvoice(receipt, context, shift); this.getEndingSalesInvoice(receipt, context, shift); this.getBeginingSalesReturn(receipt, context, shift); this.getEndingSalesReturn(receipt, context, shift); this.getAllItemSoldAndReturn(receipt, context, shift); this.getRegulerDataInShift(receipt, context, shift, deviceConfiguration); customizedReceipt = this.GetDesignReceiptForXZReport(shift, receipt.ReceiptType, context); return customizedReceipt; } public void getRegulerDataInShift(Receipt receipt, RequestContext context, Shift shift, SingleEntityDataServiceResponse<DeviceConfiguration> deviceConfiguration) { XReadingData.STORE = shift.StoreId; XReadingData.TERMINALID = terminal.TerminalId; XReadingData.SHIFT = shift.ShiftId.ToString(); XReadingData.BEGININGBALANCE = globalLastShiftBalance; XReadingData.XREPORTID = XReadingNumber; XReadingData.NOOFTRANSACTION = shift.SaleTransactionCount; XReadingData.ROUNDING = shift.RoundedAmountTotal; XReadingData.NOOFABORTED = shift.VoidedSalesTotal; XReadingData.DOCNUM = XReadingNumber; XReadingData.TIN = deviceConfiguration.Entity.TaxIdNumber; XReadingData.STAFFNAME = this.GetEmployeeByStaffId(shift).Entity.Name; XReadingData.DATAAREAID = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; bool flag1 = shift.OverShortTotal < Decimal.Zero; if (flag1) XReadingData.SHORTAMOUNT = shift.OverShortTotal; else XReadingData.OVERAMOUNT = shift.OverShortTotal; //nghia.song change code get company and device name XReadingData.COMPANYADDRESS = originalReceiptsRequest.RequestContext.GetOrgUnit()?.OrgUnitFullAddress ?? string.Empty; XReadingData.COMPANYNAME = originalReceiptsRequest.RequestContext.GetChannel().Name ?? string.Empty; //nghia.song --end XReadingData.NOOFPAYINGCUST = shift.SaleTransactionCount + shift.CustomerCount; XReadingData.NETSALES = XReadingData.NETSALES + XReadingData.VATAMOUNT; XReadingData.ENDINGBALANCE = globalLastShiftBalance + XReadingData.NETSALES;//NS XReadingData.NOOFLOGON = shift.LogOnTransactionCount; XReadingData.GROSSSALES += XReadingData.RETURNAMOUNT; } public void getAllItemSoldAndReturn(Receipt receipt, RequestContext context, Shift shift) { var queryRetailTransactionTable = new SqlPagedQuery(QueryResultSettings.SingleRecord) { DatabaseSchema = "ax", Select = new ColumnSet(new string[] { "TRANSACTIONID", "NETAMOUNT", "TYPE", "ENTRYSTATUS", "RECEIPTID", "NUMBEROFITEMS" }), From = "RETAILTRANSACTIONTABLE", Where = "BATCHID = @BATCHID AND CHANNEL = @CHANNEL AND STORE = @STORE AND TERMINAL = @TERMINAL AND DATAAREAID = @DATAAREAID" }; queryRetailTransactionTable.Parameters["@BATCHID"] = shift.ShiftId; queryRetailTransactionTable.Parameters["@TERMINAL"] = terminal.TerminalId; queryRetailTransactionTable.Parameters["@STORE"] = shift.StoreId; queryRetailTransactionTable.Parameters["@CHANNEL"] = terminal.ChannelId; queryRetailTransactionTable.Parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; this.defineDataIn2List(); using (DatabaseContext databaseContext = new DatabaseContext(originalReceiptsRequest.RequestContext)) { var extensions = databaseContext.ReadEntity<ExtensionsEntity>(queryRetailTransactionTable); //LOOP all retail transaction in shift foreach (ExtensionsEntity extension in extensions) { //Get data in transaction string transactionId = extension.GetProperty("TRANSACTIONID").ToString(); this.sumDiscountAmountWithDiscountType(transactionId); this.sumVatAdjustByGroupName(transactionId); this.GetSalesTypeBreakDownAndAmountTotal(transactionId); this.specialDiscountZeroRated(transactionId); #region RECEIPTID if (decimal.Parse(extension.GetProperty("ENTRYSTATUS").ToString()) == 0 && decimal.Parse(extension.GetProperty("TYPE").ToString()) == 2) { var queryTotalItemSold = new SqlPagedQuery(QueryResultSettings.SingleRecord) { DatabaseSchema = "ax", Select = new ColumnSet("QTY"), From = "RETAILTRANSACTIONSALESTRANS", Where = "QTY < 0 AND TRANSACTIONSTATUS = 0 AND CHANNEL = @CHANNEL AND STORE = @STORE AND TERMINALID = @TERMINALID AND TRANSACTIONID = @TRANSACTIONID AND DATAAREAID = @DATAAREAID" }; queryTotalItemSold.Parameters["@CHANNEL"] = terminal.ChannelId; ; queryTotalItemSold.Parameters["@STORE"] = shift.StoreId; queryTotalItemSold.Parameters["@TERMINALID"] = shift.TerminalId; queryTotalItemSold.Parameters["@TRANSACTIONID"] = transactionId; queryTotalItemSold.Parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; using (DatabaseContext databaseContextD = new DatabaseContext(originalReceiptsRequest.RequestContext)) { foreach (ExtensionsEntity totalItemSold in databaseContextD.ReadEntity<ExtensionsEntity>(queryTotalItemSold)) { XReadingData.NUMBEROFITEMSOLD += (-1) * decimal.Parse(totalItemSold.GetProperty("QTY").ToString()); } } } if (decimal.Parse(extension.GetProperty("NETAMOUNT").ToString()) > 0) { XReadingData.NOOFRETURN++; } #endregion } } } public void getEndingSalesInvoice(Receipt receipt, RequestContext context, Shift shift) { var queryReatailTransactionDESC = new SqlPagedQuery(QueryResultSettings.SingleRecord) { DatabaseSchema = "ax", Select = new ColumnSet("TRANSACTIONID", "TRANSDATE", "RECEIPTID"), From = "RETAILTRANSACTIONTABLE", OrderBy = "TRANSDATE DESC, TRANSTIME DESC", Where = "ENTRYSTATUS = 0 AND TYPE = 2 AND CHANNEL = @CHANNEL AND BATCHID = @BATCHID AND STORE = @STORE AND TERMINAL = @TERMINAL AND NETAMOUNT < 0 AND DATAAREAID = @DATAAREAID" }; queryReatailTransactionDESC.Parameters["@CHANNEL"] = terminal.ChannelId; queryReatailTransactionDESC.Parameters["@BATCHID"] = shift.ShiftId; queryReatailTransactionDESC.Parameters["@STORE"] = shift.StoreId; queryReatailTransactionDESC.Parameters["@TERMINAL"] = terminal.TerminalId; queryReatailTransactionDESC.Parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; using (DatabaseContext databaseContext = new DatabaseContext(originalReceiptsRequest.RequestContext)) { ExtensionsEntity extensionsField = databaseContext.ReadEntity<ExtensionsEntity>(queryReatailTransactionDESC).FirstOrDefault(); if (extensionsField != null) { XReadingData.ENDINGSALESINVOICENO = extensionsField.GetProperty("RECEIPTID").ToString(); } } } public void getBeginingSalesReturn(Receipt receipt, RequestContext context, Shift shift) { var queryReatailTransactionReturnASC = new SqlPagedQuery(QueryResultSettings.SingleRecord) { DatabaseSchema = "ax", Select = new ColumnSet("TRANSACTIONID", "TRANSDATE", "RECEIPTID"), From = "RETAILTRANSACTIONTABLE", OrderBy = "TRANSDATE ASC, TRANSTIME ASC", Where = "TYPE = 2 AND CHANNEL = @CHANNEL AND BATCHID = @BATCHID AND STORE = @STORE AND TERMINAL = @TERMINAL AND NETAMOUNT >= 0 AND DATAAREAID = @DATAAREAID" }; queryReatailTransactionReturnASC.Parameters["@CHANNEL"] = terminal.ChannelId; queryReatailTransactionReturnASC.Parameters["@BATCHID"] = shift.ShiftId; queryReatailTransactionReturnASC.Parameters["@STORE"] = shift.StoreId; queryReatailTransactionReturnASC.Parameters["@TERMINAL"] = terminal.TerminalId; queryReatailTransactionReturnASC.Parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; using (DatabaseContext databaseContext = new DatabaseContext(originalReceiptsRequest.RequestContext)) { ExtensionsEntity extensionsField = databaseContext.ReadEntity<ExtensionsEntity>(queryReatailTransactionReturnASC).FirstOrDefault(); if (extensionsField != null) { XReadingData.BEGINNINGRETURNNO = extensionsField.GetProperty("RECEIPTID").ToString(); } } } public void getEndingSalesReturn(Receipt receipt, RequestContext context, Shift shift) { var queryReatailTransactionReturnDESC = new SqlPagedQuery(QueryResultSettings.SingleRecord) { DatabaseSchema = "ax", Select = new ColumnSet("TRANSACTIONID", "TRANSDATE", "RECEIPTID"), From = "RETAILTRANSACTIONTABLE", OrderBy = "TRANSDATE DESC, TRANSTIME DESC", Where = "TYPE = 2 AND CHANNEL = @CHANNEL AND BATCHID = @BATCHID AND STORE = @STORE AND TERMINAL = @TERMINAL AND NETAMOUNT >= 0 AND DATAAREAID = @DATAAREAID" }; queryReatailTransactionReturnDESC.Parameters["@CHANNEL"] = terminal.ChannelId; queryReatailTransactionReturnDESC.Parameters["@BATCHID"] = shift.ShiftId; queryReatailTransactionReturnDESC.Parameters["@STORE"] = shift.StoreId; queryReatailTransactionReturnDESC.Parameters["@TERMINAL"] = terminal.TerminalId; queryReatailTransactionReturnDESC.Parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; using (DatabaseContext databaseContext = new DatabaseContext(originalReceiptsRequest.RequestContext)) { ExtensionsEntity extensionsField = databaseContext.ReadEntity<ExtensionsEntity>(queryReatailTransactionReturnDESC).FirstOrDefault(); if (extensionsField != null) { XReadingData.ENDINGRETURNNO = extensionsField.GetProperty("RECEIPTID").ToString(); } } } public void getBeginingSalesInvoice(Receipt receipt, RequestContext context, Shift shift) { var queryReatailTransactionASC = new SqlPagedQuery(QueryResultSettings.SingleRecord) { DatabaseSchema = "ax", Select = new ColumnSet("TRANSACTIONID", "TRANSDATE", "RECEIPTID"), From = "RETAILTRANSACTIONTABLE", OrderBy = "TRANSDATE ASC, TRANSTIME ASC", Where = "ENTRYSTATUS = 0 AND TYPE = 2 AND CHANNEL = @CHANNEL AND BATCHID = @BATCHID AND STORE = @STORE AND TERMINAL = @TERMINAL AND NETAMOUNT <0 AND DATAAREAID = @DATAAREAID" }; queryReatailTransactionASC.Parameters["@CHANNEL"] = terminal.ChannelId; queryReatailTransactionASC.Parameters["@BATCHID"] = shift.ShiftId; queryReatailTransactionASC.Parameters["@STORE"] = shift.StoreId; queryReatailTransactionASC.Parameters["@TERMINAL"] = terminal.TerminalId; queryReatailTransactionASC.Parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; using (DatabaseContext databaseContext = new DatabaseContext(originalReceiptsRequest.RequestContext)) { ExtensionsEntity extensionsField = databaseContext.ReadEntity<ExtensionsEntity>(queryReatailTransactionASC).FirstOrDefault(); if (extensionsField != null) { XReadingData.BEGINNINGSALESINVOICENO = extensionsField.GetProperty("RECEIPTID").ToString(); } } } public void getTerminalDetail(Receipt receipt, RequestContext context, Shift shift) { var queryRetailTerminal = new SqlPagedQuery(QueryResultSettings.SingleRecord) { DatabaseSchema = "ext", Select = new ColumnSet(new string[] { "LAW_MACHINEIDENTIFICATIONNUMBER", "LAW_MACHINESERIALNUMBER", "LAW_PERMITTOUSENUMBER", "LAW_PTUDATEISSUED", "LAW_PTUVALIDTO", "LAW_ACCREDITATIONNUMBER", "LAW_ACCDTNDATEISSUED", "LAW_ACCDTNVALIDTO", "TERMINALID" }), From = "LAW_RETAILTERMINALTABLE", Where = "TERMINALID = @TERMINALID" }; queryRetailTerminal.Parameters["@TERMINALID"] = originalReceiptsRequest.RequestContext.GetTerminal().TerminalId; using (DatabaseContext databaseContext = new DatabaseContext(originalReceiptsRequest.RequestContext)) { ExtensionsEntity extensions = databaseContext.ReadEntity<ExtensionsEntity>(queryRetailTerminal).FirstOrDefault(); if (extensions != null) { //Header 1.5 XReadingData.MIN = extensions.GetProperty("LAW_MACHINESERIALNUMBER").ToString(); //Header 1.6 XReadingData.SN = extensions.GetProperty("LAW_MACHINESERIALNUMBER").ToString(); } } } public void getDateTimeShiftAndReportName(Receipt receipt, RequestContext context, Shift shift) { string str1 = string.Empty; string str2 = string.Empty; string str3 = string.Empty; string str4 = string.Empty; if (shift.StartDateTime.HasValue) { if (receipt.ReceiptType == ReceiptType.ZReport) { str1 = this.FormatDate(shift.StartDateTime, context); str2 = this.FormatTime(shift.StartDateTime, TimeFormattingType.SystemLongTime, context); } else { str1 = this.FormatDate(shift.StartDateTime, context); str2 = this.FormatTime(shift.StartDateTime, TimeFormattingType.SystemLongTime, context); } } XReadingData.ACTUALDATE = DateTime.Parse(str1); DateTime t = DateTime.ParseExact(str2, "h:mm:ss tt", CultureInfo.InvariantCulture); //if you really need a TimeSpan this will get the time elapsed since midnight: TimeSpan ts = t.TimeOfDay; XReadingData.ACTUALTIME = ts; if (shift.CloseDateTime.HasValue) { str3 = this.FormatDate(shift.CloseDateTime, context); str4 = this.FormatTime(shift.CloseDateTime, TimeFormattingType.SystemLongTime, context); } string empty = string.Empty; string str5; if (receipt.ReceiptType != ReceiptType.XReport) { if (receipt.ReceiptType != ReceiptType.ZReport) throw new NotSupportedException(string.Format("Unsupported Report Type '{0}'.", (object)receipt.ReceiptType)); str5 = shift.StaffId; XReadingData.REPORTNAME = "X-Reading Report"; } else { str5 = context.GetPrincipal().UserId; XReadingData.REPORTNAME = "Tender Report"; } } public class DistcountEntity { public string DiscountStr { get; set; } public decimal DiscountDecimal { get; set; } public decimal PrintingOrder { get; set; } public DistcountEntity(string _discountType, decimal _discountAmount, decimal _printingOrder) { DiscountStr = _discountType; DiscountDecimal = _discountAmount; PrintingOrder = _printingOrder; } } public void sumVatAdjustByGroupName(string transactionId) { var queryReatailTransDiscountGroupName = new SqlPagedQuery(QueryResultSettings.AllRecords) { DatabaseSchema = "ext", Select = new ColumnSet("DISCOUNTGROUPNAME", "TRANSACTIONID", "SALELINENUM"), From = "LAW_RETAILTRANSDISCOUNTGROUPBYGROUPNAMEVIEW", Where = "DATAAREAID = @DATAAREAID AND TRANSACTIONID = @TRANSACTIONID AND TERMINALID = @TERMINALID AND STOREID = @STOREID AND CHANNEL = @CHANNEL" }; queryReatailTransDiscountGroupName.Parameters["@TERMINALID"] = shift.TerminalId; queryReatailTransDiscountGroupName.Parameters["@STOREID"] = shift.StoreId; queryReatailTransDiscountGroupName.Parameters["@CHANNEL"] = terminal.ChannelId; queryReatailTransDiscountGroupName.Parameters["@TRANSACTIONID"] = transactionId; queryReatailTransDiscountGroupName.Parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; using (DatabaseContext databaseContext = new DatabaseContext(originalReceiptsRequest.RequestContext)) { var extensions = databaseContext.ReadEntity<ExtensionsEntity>(queryReatailTransDiscountGroupName); //LOOP all record on RETAILTRANSACTIONDISCOUNTTRANSEXTEND foreach (ExtensionsEntity extension in extensions) { decimal SALELINENUM = decimal.Parse(extension.GetProperty("SALELINENUM").ToString()); string discountGroupName = extension.GetProperty("DISCOUNTGROUPNAME").ToString(); decimal DiscountValue = this.sumDataInRetailTransactionTableExt(transactionId, SALELINENUM); int printingOrder = 0; var queryLPIDISCOUNTTYPE = new SqlPagedQuery(QueryResultSettings.AllRecords) { DatabaseSchema = "ext", Select = new ColumnSet("DISCOUNTGROUPNAME", "PRINTINGORDER"), From = "LAW_LPIDISCOUNTTYPE", Where = "DATAAREAID = @DATAAREAID AND DISCOUNTGROUPNAME = @DISCOUNTGROUPNAME" }; queryLPIDISCOUNTTYPE.Parameters["@DISCOUNTGROUPNAME"] = discountGroupName; queryLPIDISCOUNTTYPE.Parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; using (DatabaseContext databaseContextOrder = new DatabaseContext(originalReceiptsRequest.RequestContext)) { var extensionsOrder = databaseContextOrder.ReadEntity<ExtensionsEntity>(queryLPIDISCOUNTTYPE).FirstOrDefault(); if (extensionsOrder != null) { printingOrder = int.Parse(extensionsOrder.GetProperty("PRINTINGORDER").ToString()); } } listVATAdjustDiscountGroup.Add(new DistcountEntity(discountGroupName, (-1) * DiscountValue, printingOrder)); } } //TH ca bi thieu loai VAT var queryLPIDISCOUNTTYPEINCLUDE = new SqlPagedQuery(QueryResultSettings.AllRecords) { DatabaseSchema = "ext", Select = new ColumnSet("DISCOUNTGROUPNAME", "PRINTINGORDER"), From = "LAW_LPIDISCOUNTTYPE", Where = "DATAAREAID = @DATAAREAID" }; queryLPIDISCOUNTTYPEINCLUDE.Parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; using (DatabaseContext databaseContextOrder = new DatabaseContext(originalReceiptsRequest.RequestContext)) { var extensionsOrders = databaseContextOrder.ReadEntity<ExtensionsEntity>(queryLPIDISCOUNTTYPEINCLUDE); foreach (ExtensionsEntity extensionsOrder in extensionsOrders) { string discountType = extensionsOrder.GetProperty("DISCOUNTGROUPNAME").ToString(); int printingOrder = 0; if (!listDiscountType.Exists(x => x.DiscountStr == discountType)) { listVATAdjustDiscountGroup.Add(new DistcountEntity(discountType, 0, printingOrder)); } } //End } } public void specialDiscountZeroRated(string transactionId) { decimal zeroDiscount = 0; var queryReatailTableTrans = new SqlPagedQuery(QueryResultSettings.SingleRecord) { DatabaseSchema = "ext", Select = new ColumnSet("LAW_VATADJUSTMENT"), From = "LAW_RETAILTRANSACTIONSALESLINEEXTEND", Where = "LAW_ZERORATEDSALESAMOUNT != 0 AND DATAAREAID = @DATAAREAID AND CHANNEL = @CHANNEL AND TERMINALID = @TERMINALID AND TRANSACTIONID = @TRANSACTIONID AND STOREID = @STOREID" }; queryReatailTableTrans.Parameters["@CHANNEL"] = terminal.ChannelId; queryReatailTableTrans.Parameters["@STOREID"] = shift.StoreId; queryReatailTableTrans.Parameters["@TERMINALID"] = terminal.TerminalId; queryReatailTableTrans.Parameters["@TRANSACTIONID"] = transactionId; queryReatailTableTrans.Parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; using (DatabaseContext databaseContextField = new DatabaseContext(originalReceiptsRequest.RequestContext)) { var extensionsFields = databaseContextField.ReadEntity<ExtensionsEntity>(queryReatailTableTrans); foreach (ExtensionsEntity extensionsField in extensionsFields) zeroDiscount += decimal.Parse(extensionsField.GetProperty("LAW_VATADJUSTMENT").ToString()); } XReadingData.ZERORATEDDISCOUNT += (-1) * zeroDiscount; } public void defineDataIn2List() { //TH ca bi thieu loai VAT var queryLPIDISCOUNTTYPEINCLUDE = new SqlPagedQuery(QueryResultSettings.AllRecords) { DatabaseSchema = "ext", Select = new ColumnSet("DISCOUNTTYPENAME", "PRINTINGORDER", "DISCOUNTGROUPNAME"), From = "LAW_LPIDISCOUNTTYPE", Where = "DATAAREAID = @DATAAREAID", OrderBy = "PRINTINGORDER ASC" }; queryLPIDISCOUNTTYPEINCLUDE.Parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; using (DatabaseContext databaseContextOrder = new DatabaseContext(originalReceiptsRequest.RequestContext)) { var extensionsOrders = databaseContextOrder.ReadEntity<ExtensionsEntity>(queryLPIDISCOUNTTYPEINCLUDE); foreach (ExtensionsEntity extensionsOrder in extensionsOrders) { string discountType = extensionsOrder.GetProperty("DISCOUNTTYPENAME").ToString(); string discountGroup = extensionsOrder.GetProperty("DISCOUNTGROUPNAME").ToString(); int printingOrder = int.Parse(extensionsOrder.GetProperty("PRINTINGORDER").ToString()); listDiscountType.Add(new DistcountEntity(discountType, 0, printingOrder)); listVATAdjustDiscountGroup.Add(new DistcountEntity(discountGroup, 0, printingOrder)); } //End } } public decimal sumDataInRetailTransactionTableExt(string transactionId, decimal salesLineNum) { decimal VATAdjust = 0; var queryReatailTableTrans = new SqlPagedQuery(QueryResultSettings.SingleRecord) { DatabaseSchema = "ext", Select = new ColumnSet("LAW_VATADJUSTMENT"), From = "LAW_RETAILTRANSACTIONSALESLINEEXTEND", Where = "SALESLINENUM = @SALESLINENUM AND DATAAREAID = @DATAAREAID AND CHANNEL = @CHANNEL AND TERMINALID = @TERMINALID AND TRANSACTIONID = @TRANSACTIONID AND STOREID = @STOREID" }; queryReatailTableTrans.Parameters["@CHANNEL"] = terminal.ChannelId; queryReatailTableTrans.Parameters["@STOREID"] = shift.StoreId; queryReatailTableTrans.Parameters["@TERMINALID"] = terminal.TerminalId; queryReatailTableTrans.Parameters["@TRANSACTIONID"] = transactionId; queryReatailTableTrans.Parameters["@SALESLINENUM"] = salesLineNum; queryReatailTableTrans.Parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; using (DatabaseContext databaseContextField = new DatabaseContext(originalReceiptsRequest.RequestContext)) { ExtensionsEntity extensionsFields = databaseContextField.ReadEntity<ExtensionsEntity>(queryReatailTableTrans).FirstOrDefault(); VATAdjust = decimal.Parse(extensionsFields.GetProperty("LAW_VATADJUSTMENT").ToString()); } return VATAdjust; } public void sumDiscountAmountWithDiscountType(string transactionId) { var queryReatailTransDiscountTransExtend = new SqlPagedQuery(QueryResultSettings.AllRecords) { DatabaseSchema = "ext", Select = new ColumnSet("DISCOUNTTYPE", "TRANSACTIONID", "SALELINENUM"), From = "LAW_RETAILTRANSDISCOUNTGROUPBYDISCOUNTTYPEVIEW", Where = "DATAAREAID = @DATAAREAID AND TRANSACTIONID = @TRANSACTIONID AND TERMINALID = @TERMINALID AND STOREID = @STOREID AND CHANNEL = @CHANNEL" }; queryReatailTransDiscountTransExtend.Parameters["@TERMINALID"] = shift.TerminalId; queryReatailTransDiscountTransExtend.Parameters["@STOREID"] = shift.StoreId; queryReatailTransDiscountTransExtend.Parameters["@CHANNEL"] = terminal.ChannelId; queryReatailTransDiscountTransExtend.Parameters["@TRANSACTIONID"] = transactionId; queryReatailTransDiscountTransExtend.Parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; using (DatabaseContext databaseContext = new DatabaseContext(originalReceiptsRequest.RequestContext)) { var extensions = databaseContext.ReadEntity<ExtensionsEntity>(queryReatailTransDiscountTransExtend); //LOOP all record on RETAILTRANSACTIONDISCOUNTTRANSEXTEND foreach (ExtensionsEntity extension in extensions) { decimal SALELINENUM = decimal.Parse(extension.GetProperty("SALELINENUM").ToString()); string discountType = extension.GetProperty("DISCOUNTTYPE").ToString(); decimal DiscountValue = this.getDiscountAmountBaseOnDiscountType(transactionId, SALELINENUM); int printingOrder = 0; var queryLPIDISCOUNTTYPE = new SqlPagedQuery(QueryResultSettings.AllRecords) { DatabaseSchema = "ext", Select = new ColumnSet("DISCOUNTTYPENAME", "PRINTINGORDER"), From = "LAW_LPIDISCOUNTTYPE", Where = "DATAAREAID = @DATAAREAID AND DISCOUNTTYPENAME = @DISCOUNTTYPENAME" }; queryLPIDISCOUNTTYPE.Parameters["@DISCOUNTTYPENAME"] = discountType; queryLPIDISCOUNTTYPE.Parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; using (DatabaseContext databaseContextOrder = new DatabaseContext(originalReceiptsRequest.RequestContext)) { var extensionsOrder = databaseContextOrder.ReadEntity<ExtensionsEntity>(queryLPIDISCOUNTTYPE).FirstOrDefault(); if (extensionsOrder != null) { printingOrder = int.Parse(extensionsOrder.GetProperty("PRINTINGORDER").ToString()); } } listDiscountType.Add(new DistcountEntity(discountType, (-1) * DiscountValue, printingOrder)); } } } public decimal getDiscountAmountBaseOnDiscountType(string transactionId, decimal salesLineNum) { decimal discountAmt = 0; var queryReatailTransSalesTransExt = new SqlPagedQuery(QueryResultSettings.SingleRecord) { DatabaseSchema = "ax", Select = new ColumnSet("TERMINALID", "TRANSACTIONID", "STORE", "LINENUM", "CHANNEL", "DISCAMOUNTWITHOUTTAX"), From = "RETAILTRANSACTIONSALESTRANS", Where = "LINENUM = @SALESLINENUM AND DATAAREAID = @DATAAREAID AND CHANNEL = @CHANNEL AND TERMINALID = @TERMINALID AND TRANSACTIONID = @TRANSACTIONID AND STORE = @STORE" }; queryReatailTransSalesTransExt.Parameters["@CHANNEL"] = terminal.ChannelId; queryReatailTransSalesTransExt.Parameters["@STORE"] = shift.StoreId; queryReatailTransSalesTransExt.Parameters["@TERMINALID"] = terminal.TerminalId; queryReatailTransSalesTransExt.Parameters["@TRANSACTIONID"] = transactionId; queryReatailTransSalesTransExt.Parameters["@SALESLINENUM"] = salesLineNum; queryReatailTransSalesTransExt.Parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; using (DatabaseContext databaseContextField = new DatabaseContext(originalReceiptsRequest.RequestContext)) { ExtensionsEntity extensionsField = databaseContextField.ReadEntity<ExtensionsEntity>(queryReatailTransSalesTransExt).FirstOrDefault(); if (extensionsField != null) { //Get discount amount discountAmt = decimal.Parse(extensionsField.GetProperty("DISCAMOUNTWITHOUTTAX").ToString()); } } return discountAmt; } public void GetSalesTypeBreakDownAndAmountTotal(string transactionId) { decimal ZeroRatedSalesAmount = 0; decimal VATableSalesAmount = 0; decimal VATExemptSalesAmount = 0; decimal ZeroRatedSalesVATAmount = 0; decimal VATableSales = 0; decimal VATExemptSales = 0; decimal NetSales = 0; decimal Grosssales = 0; decimal ReturnAmount = 0; var queryRetailTransactionTable = new SqlPagedQuery(QueryResultSettings.SingleRecord) { DatabaseSchema = "ext", Select = new ColumnSet(new string[] { "LAW_VATEXEMPTSALESVATAMOUNT", "LAW_ZERORATEDSALESVATAMOUNT", "LAW_VATABLESSALESAMOUNT", "LAW_VATABLESSALESVATAMOUNT", "TRANSACTIONID", "LAW_VATEXEMPTSALESAMOUNT", "LAW_ZERORATEDSALESAMOUNT", "LAW_NETSALES", "LAW_LPITOTAL" }), From = "LAW_RETAILTRANSACTIONTABLEEXTEND", Where = "TRANSACTIONID = @TRANSACTIONID AND CHANNEL = @CHANNEL AND STOREID = @STOREID AND DATAAREAID = @DATAAREAID" }; queryRetailTransactionTable.Parameters["@STOREID"] = shift.StoreId; queryRetailTransactionTable.Parameters["@TRANSACTIONID"] = transactionId; queryRetailTransactionTable.Parameters["@CHANNEL"] = terminal.ChannelId; queryRetailTransactionTable.Parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; using (DatabaseContext databaseContextField = new DatabaseContext(originalReceiptsRequest.RequestContext)) { var extensionsField = databaseContextField.ReadEntity<ExtensionsEntity>(queryRetailTransactionTable); foreach (ExtensionsEntity extension in extensionsField) { //Get discount amount VATableSalesAmount += decimal.Parse(extension.GetProperty("LAW_VATABLESSALESAMOUNT").ToString()); VATableSales += decimal.Parse(extension.GetProperty("LAW_VATABLESSALESVATAMOUNT").ToString()); VATExemptSalesAmount += decimal.Parse(extension.GetProperty("LAW_VATEXEMPTSALESAMOUNT").ToString()); VATExemptSales += decimal.Parse(extension.GetProperty("LAW_VATEXEMPTSALESVATAMOUNT").ToString()); ZeroRatedSalesAmount += decimal.Parse(extension.GetProperty("LAW_ZERORATEDSALESAMOUNT").ToString()); ZeroRatedSalesVATAmount += decimal.Parse(extension.GetProperty("LAW_ZERORATEDSALESVATAMOUNT").ToString()); NetSales += decimal.Parse(extension.GetProperty("LAW_NETSALES").ToString()); Grosssales += decimal.Parse(extension.GetProperty("LAW_LPITOTAL").ToString()); if (decimal.Parse(extension.GetProperty("LAW_LPITOTAL").ToString()) > 0) { ReturnAmount += decimal.Parse(extension.GetProperty("LAW_LPITOTAL").ToString()); } } } XReadingData.VATAMOUNT += (-1) * (VATableSales + VATExemptSales + ZeroRatedSalesVATAmount); //XReadingData.ZERORATEDSALESVATAMOUNT += (-1) * ZeroRatedSalesAmount; XReadingData.ZERORATEDSALES += (-1) * ZeroRatedSalesAmount; XReadingData.VATABLESALES += (-1) * VATableSalesAmount; XReadingData.VATEXEMPTSALES += (-1) * VATExemptSalesAmount; //nghia.song can remove code nay sao XReadingData.NETSALES += NetSales; XReadingData.GROSSSALES += (-1) * Grosssales; XReadingData.RETURNAMOUNT += ReturnAmount; } private SingleEntityDataServiceResponse<Employee> GetEmployeeByStaffId(Shift shift) { SqlPagedQuery sqlPagedQuery = new SqlPagedQuery(QueryResultSettings.SingleRecord) { From = "GetEmployeeByStaffId(@nvc_StaffId, @nvc_DataAreaId)" }; sqlPagedQuery.Parameters["@nvc_StaffId"] = shift.StaffId; sqlPagedQuery.Parameters["@nvc_DataAreaId"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; Employee entity1; using (DatabaseContext databaseContext = new DatabaseContext(originalReceiptsRequest.RequestContext)) entity1 = databaseContext.ReadEntity<Employee>((IDatabaseQuery)sqlPagedQuery).SingleOrDefault<Employee>(); if (entity1 != null) { ChannelConfiguration channelConfiguration = originalReceiptsRequest.RequestContext.GetChannelConfiguration(); if (channelConfiguration != null) entity1.Images = RichMediaHelper.PopulateEmployeeMediaInformation(entity1.StaffId, entity1.ImageUri, channelConfiguration.EmployeeDefaultImageTemplate); else if (originalReceiptsRequest.RequestContext.GetPrincipal().ChannelId != 0L) { GetChannelConfigurationDataRequest configurationDataRequest = new GetChannelConfigurationDataRequest(originalReceiptsRequest.RequestContext.GetPrincipal().ChannelId); ChannelConfiguration entity2 = originalReceiptsRequest.RequestContext.Execute<SingleEntityDataServiceResponse<ChannelConfiguration>>((Request)configurationDataRequest).Entity; entity1.Images = RichMediaHelper.PopulateEmployeeMediaInformation(entity1.StaffId, entity1.ImageUri, entity2.EmployeeDefaultImageTemplate); } } return new SingleEntityDataServiceResponse<Employee>(entity1); } public string getOwnedBy(RequestContext context) { string OwnerName = ""; var querystoreView = new SqlPagedQuery(QueryResultSettings.SingleRecord) { DatabaseSchema = "ext", Select = new ColumnSet("NAMEALIAS"), From = "LAW_STOREVIEW", Where = "CHANNELID = @CHANNELID AND DATAAREAID = @DATAAREAID" }; querystoreView.Parameters["@CHANNELID"] = terminal.ChannelId; querystoreView.Parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; using (DatabaseContext databaseContext = new DatabaseContext(originalReceiptsRequest.RequestContext)) { ExtensionsEntity extensionsField = databaseContext.ReadEntity<ExtensionsEntity>(querystoreView).FirstOrDefault(); if (extensionsField != null) { OwnerName = extensionsField.GetProperty("NAMEALIAS").ToString(); } } return OwnerName; } private void PrepareXZReportHeader(StringBuilder reportLayout, Shift shift, ReceiptType receiptType, RequestContext context) { ThrowIf.Null<RequestContext>(context, "requestContext"); ThrowIf.Null<Shift>(shift, nameof(shift)); ChannelConfiguration channelConfiguration = context.GetChannelConfiguration(); ThrowIf.Null<ChannelConfiguration>(channelConfiguration, "context.GetChannelConfiguration()"); string str1 = string.Empty; string str2 = string.Empty; string str3 = string.Empty; string str4 = string.Empty; if (shift.StartDateTime.HasValue) { if (receiptType == ReceiptType.ZReport) { str1 = this.FormatDate(shift.StartDateTime, context); str2 = this.FormatTime(shift.StartDateTime, TimeFormattingType.SystemLongTime, context); } else { str1 = this.FormatDate(shift.StartDateTime, context); str2 = this.FormatTime(shift.StartDateTime, TimeFormattingType.SystemLongTime, context); } } if (shift.CloseDateTime.HasValue) { str3 = this.FormatDate(shift.CloseDateTime, context); str4 = this.FormatTime(shift.CloseDateTime, TimeFormattingType.SystemLongTime, context); } string empty = string.Empty; //Nghia.song customize X report reportLayout.AppendLine(originalReceiptsRequest.RequestContext.GetChannel().Name ?? string.Empty); reportLayout.AppendLine(originalReceiptsRequest.RequestContext.GetOrgUnit()?.OrgUnitFullAddress ?? string.Empty); this.AppendReportLine(context, reportLayout, "Owned by: ", this.getOwnedBy(originalReceiptsRequest.RequestContext)); this.AppendReportLine(context, reportLayout, "VAT Reg TIN: ", XReadingData.TIN); this.AppendReportLine(context, reportLayout, "MIN: ", XReadingData.MIN); this.AppendReportLine(context, reportLayout, "SN: ", XReadingData.SN); //this.AppendReportLine(context, reportLayout, "Contact: ", "1234-5678"); //this.AppendReportLine(context, reportLayout, "www.lawson.jp"); //nghia.song --end //reportLayout.AppendLine(this.SingleLine); string str5; if (receiptType != ReceiptType.XReport) { if (receiptType != ReceiptType.ZReport) throw new NotSupportedException(string.Format("Unsupported Report Type '{0}'.", (object)receiptType)); str5 = shift.StaffId; //this.AppendReportLine(context, reportLayout, "zReport"); } else { str5 = context.GetPrincipal().UserId; } this.AppendReportLine(context, reportLayout, XReadingData.REPORTNAME); if (receiptType == ReceiptType.ZReport) this.AppendReportLine(context, reportLayout, "ReportId:", XReadingData.XREPORTID); DateTimeOffset now = DateTimeOffset.Now; string str6 = this.FormatDate(new DateTimeOffset?(now), context); string str7 = this.FormatTime(new DateTimeOffset?(now), TimeFormattingType.SystemLongTime, context); if (channelConfiguration.CountryRegionISOCode == CountryRegionISOCode.SE) { reportLayout.AppendLine(this.FormatHeaderLineWithWrapping(context, "OrgUnitName", context.GetOrgUnit().OrgUnitName, true)); reportLayout.AppendLine(this.FormatHeaderLine(context, "OrgNumber", context.GetDeviceConfiguration().TaxIdNumber, true)); } reportLayout.Append(this.FormatHeaderLine(context, "StoreId", shift.StoreId, true)); reportLayout.AppendLine(this.FormatHeaderLine(context, "Date", str6, false)); reportLayout.Append(this.FormatHeaderLine(context, "Employee", str5, true)); // nghiasong customize x report reportLayout.AppendLine(this.FormatHeaderLine(context, "Operator name", XReadingData.STAFFNAME, false)); //nghia.song --end reportLayout.AppendLine(this.FormatHeaderLine(context, "Time", str7, false)); reportLayout.AppendLine(this.FormatHeaderLine(context, "RegisterNumber", shift.TerminalId, true)); reportLayout.AppendLine(this.SingleLine); reportLayout.AppendLine(this.FormatHeaderLine(context, "ShiftNumber", string.Format("{0}:{1}", (object)shift.TerminalId, (object)shift.ShiftId), true)); reportLayout.Append(this.FormatHeaderLine(context, "StartDate", str1, true)); if (receiptType == ReceiptType.ZReport) reportLayout.AppendLine(this.FormatHeaderLine(context, "EndDate", str3, false)); else reportLayout.AppendLine(); reportLayout.Append(this.FormatHeaderLine(context, "StartTime", str2, true)); if (receiptType == ReceiptType.ZReport) reportLayout.AppendLine(this.FormatHeaderLine(context, "EndTime", str4, false)); else reportLayout.AppendLine(); reportLayout.AppendLine(); } private Receipt GetDesignReceiptForXZReport(Shift shift, ReceiptType receiptType, RequestContext context) { DeviceConfiguration deviceConfiguration = context.GetDeviceConfiguration(); CountryRegionISOCode countryRegionIsoCode = context.GetChannelConfiguration().CountryRegionISOCode; if (deviceConfiguration != null && !deviceConfiguration.PrintXZReportsOnTerminal) throw new DataValidationException(DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_PrintXZReportNotConfigured, "The current terminal is not configured to print X or Z report."); StringBuilder stringBuilder = new StringBuilder(2500); Receipt receipt = new Receipt(); this.PrepareXZReportHeader(stringBuilder, shift, receiptType, context); receipt.Header = stringBuilder.ToString().TrimEnd(); header = receipt.Header; stringBuilder.Clear(); string currency = context.GetOrgUnit().Currency; stringBuilder.AppendLine(this.SingleLine); this.AppendReportLine(context, stringBuilder, "Gross Sales", (object)this.FormatNumber((Decimal)XReadingData.GROSSSALES, context)); stringBuilder.AppendLine(this.SingleLine); List<DistcountEntity> results = listDiscountType.GroupBy(l => l.DiscountStr).Select(cl => new DistcountEntity( cl.First().DiscountStr.ToString(), cl.Sum(c => c.DiscountDecimal), cl.First().PrintingOrder )).OrderBy(l => l.PrintingOrder).ToList(); decimal sumTotalDiscount = listDiscountType.Sum(x => x.DiscountDecimal); this.AppendReportLine(context, stringBuilder, "Discount:"); { foreach (var discount in results) { ParameterSet parameters = new ParameterSet(); parameters["@TERMINALID"] = shift.TerminalId; parameters["@SHIFTID"] = shift.ShiftId; parameters["@STORE"] = shift.StoreId; parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; parameters["@DISCOUNTTYPE"] = discount.DiscountStr; parameters["@AMOUNT"] = discount.DiscountDecimal; parameters["@PRINTINGORDER"] = discount.PrintingOrder; //TRANSDATE parameters["@TRANSDATE"] = DateTime.Now; using (TransactionScope transactionScope = new TransactionScope()) { if (receiptType == ReceiptType.ZReport) { int errorCode; using (var databaseContext = new DatabaseContext(originalReceiptsRequest)) { errorCode = databaseContext.ExecuteStoredProcedureNonQuery("[ext].[LAW_DISCOUNTGROUPINSHIFT_Insert]", parameters); } if (errorCode != 0) throw new StorageException(StorageErrors.Microsoft_Dynamics_Commerce_Runtime_CriticalStorageError, errorCode, "Unable to save data"); } transactionScope.Complete(); } this.AppendReportLine(context, stringBuilder, " " + discount.DiscountStr, (object)this.FormatNumber((Decimal)discount.DiscountDecimal, context)); } } stringBuilder.AppendLine(this.SingleLine); List<DistcountEntity> VATAdjustresults = listVATAdjustDiscountGroup.GroupBy(l => l.DiscountStr).Select(cl => new DistcountEntity( cl.First().DiscountStr.ToString(), cl.Sum(c => c.DiscountDecimal), cl.First().PrintingOrder )).OrderBy(l => l.PrintingOrder).ToList(); decimal sumVATAdjust = listVATAdjustDiscountGroup.Sum(x => x.DiscountDecimal); this.AppendReportLine(context, stringBuilder, "VAT Adjustment:"); { foreach (var discount in VATAdjustresults) { ParameterSet parameters = new ParameterSet(); parameters["@TERMINALID"] = shift.TerminalId; parameters["@SHIFTID"] = shift.ShiftId; parameters["@STORE"] = shift.StoreId; parameters["@DATAAREAID"] = originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId; parameters["@DISCOUNTGROUPNAME"] = discount.DiscountStr; parameters["@AMOUNT"] = discount.DiscountDecimal; parameters["@PRINTINGORDER"] = discount.PrintingOrder; parameters["@TRANSDATE"] = DateTime.Now; using (TransactionScope transactionScope = new TransactionScope()) { if (receiptType == ReceiptType.ZReport) { int errorCode; using (var databaseContext = new DatabaseContext(originalReceiptsRequest)) { errorCode = databaseContext.ExecuteStoredProcedureNonQuery("[ext].[LAW_VATADJUSTMENTINSHIFT_Insert]", parameters); } if (errorCode != 0) throw new StorageException(StorageErrors.Microsoft_Dynamics_Commerce_Runtime_CriticalStorageError, errorCode, "Unable to save data"); } transactionScope.Complete(); } this.AppendReportLine(context, stringBuilder, " " + discount.DiscountStr, (object)this.FormatNumber((Decimal)discount.DiscountDecimal, context)); } } this.AppendReportLine(context, stringBuilder, " Zero-Rated sales", (object)this.FormatNumber((Decimal)XReadingData.ZERORATEDDISCOUNT, context));//XReadingData.ZERORATEDDISCOUNT); this.AppendReportLine(context, stringBuilder, " Returns", (object)this.FormatNumber((-1) * XReadingData.RETURNAMOUNT, context));//(object)this.FormatCurrency((-1) * XReadingData.RETURNAMOUNT, currency, context, (string)null).Result); stringBuilder.AppendLine(this.SingleLine); this.AppendReportLine(context, stringBuilder, "NET Sales", (object)this.FormatNumber((Decimal)XReadingData.NETSALES, context)); stringBuilder.AppendLine(this.SingleLine); this.AppendReportLine(context, stringBuilder, "Tax code Amount"); this.AppendReportLine(context, stringBuilder, " VATable Sales", (object)this.FormatNumber((Decimal)XReadingData.VATABLESALES, context)); this.AppendReportLine(context, stringBuilder, " VAT Exempt Sales", (object)this.FormatNumber((Decimal)XReadingData.VATEXEMPTSALES, context)); this.AppendReportLine(context, stringBuilder, " Zero Rated Sales", (object)this.FormatNumber((Decimal)XReadingData.ZERORATEDSALES, context)); this.AppendReportLine(context, stringBuilder, " VAT Amount", (object)this.FormatNumber((Decimal)(XReadingData.VATAMOUNT), context)); //(XReadingData.VATABLESALES + XReadingData.VATEXEMPTSALES + XReadingData.ZERORATEDSALES); this.AppendReportLine(context, stringBuilder, "Statistics"); this.AppendReportLine(context, stringBuilder, "Sales", (object)this.FormatNumber((Decimal)shift.SaleTransactionCount, context)); this.AppendReportLine(context, stringBuilder, "CustomerSales", (object)this.FormatNumber((Decimal)shift.CustomerCount, context)); this.AppendReportLine(context, stringBuilder, "VoidedSales", (object)this.FormatNumber((Decimal)shift.VoidTransactionCount, context)); this.AppendReportLine(context, stringBuilder, "OpenDrawer", (object)this.FormatNumber((Decimal)shift.NoSaleTransactionCount, context)); //3. Customize to add statistics data: add some new rows in ‘Statistics’ part this.AppendReportLine(context, stringBuilder, "Item sold", (object)this.FormatNumber((Decimal)XReadingData.NUMBEROFITEMSOLD, context)); this.AppendReportLine(context, stringBuilder, "No . of paying customer", (object)this.FormatNumber((Decimal)XReadingData.NOOFPAYINGCUST, context)); //XReadingData.NOOFPAYINGCUST); this.AppendReportLine(context, stringBuilder, "No . of Suspended Trans", (object)this.FormatNumber((Decimal)XReadingData.NOOFSUSPENDED, context)); //XReadingData.NOOFSUSPENDED); this.AppendReportLine(context, stringBuilder, "No . of Returns", (object)this.FormatNumber((Decimal)XReadingData.NOOFRETURN, context)); //XReadingData.NOOFRETURN); this.AppendReportLine(context, stringBuilder, "No . of Suspended Trans", (object)this.FormatNumber((Decimal)XReadingData.NOOFSUSPENDED, context)); //XReadingData.NOOFSUSPENDED); this.AppendReportLine(context, stringBuilder, "No . of Logon", (object)this.FormatNumber((Decimal)shift.LogOnTransactionCount, context)); //XReadingData.NOOFSUSPENDED); //4. Customize to add new part at the bottom of report to display general information of the Shift stringBuilder.AppendLine(this.SingleLine); this.AppendReportLine(context, stringBuilder, "Beginging Balance", (object)this.FormatNumber((Decimal)XReadingData.BEGININGBALANCE, context)); //XReadingData.BEGININGBALANCE); this.AppendReportLine(context, stringBuilder, "Ending Balance", (object)this.FormatNumber((Decimal)XReadingData.ENDINGBALANCE, context)); //XReadingData.ENDINGBALANCE); this.AppendReportLine(context, stringBuilder, "Beginging SI", XReadingData.BEGINNINGSALESINVOICENO); this.AppendReportLine(context, stringBuilder, "Ending SI", XReadingData.ENDINGSALESINVOICENO); this.AppendReportLine(context, stringBuilder, "Beginging Return No.", XReadingData.BEGINNINGRETURNNO); this.AppendReportLine(context, stringBuilder, "Ending Return No.", XReadingData.ENDINGRETURNNO); stringBuilder.AppendLine(this.SingleLine); this.AppendReportLine(context, stringBuilder, "TenderTotals"); this.AppendReportLine(context, stringBuilder, "Tendered", (object)this.FormatCurrency(shift.TenderedTotal, currency, context, (string)null).Result); this.AppendReportLine(context, stringBuilder, "Change", (object)this.FormatCurrency(shift.ChangeTotal, currency, context, (string)null).Result); this.AppendReportLine(context, stringBuilder, "StartingAmount", (object)this.FormatCurrency(shift.StartingAmountTotal, currency, context, (string)null).Result); this.AppendReportLine(context, stringBuilder, "Added", (object)this.FormatCurrency(shift.FloatingEntryAmountTotal, currency, context, (string)null).Result); this.AppendReportLine(context, stringBuilder, "Removed", (object)this.FormatCurrency(shift.RemoveTenderAmountTotal, currency, context, (string)null).Result); this.AppendReportLine(context, stringBuilder, "BankDrop", (object)this.FormatCurrency(shift.BankDropTotal, currency, context, (string)null).Result); this.AppendReportLine(context, stringBuilder, "SafeDrop", (object)this.FormatCurrency(shift.SafeDropTotal, currency, context, (string)null).Result); this.AppendReportLine(context, stringBuilder, "Counted", (object)this.FormatCurrency(shift.DeclareTenderAmountTotal, currency, context, (string)null).Result); bool flag1 = shift.OverShortTotal < Decimal.Zero; this.AppendReportLine(context, stringBuilder, flag1 ? "Short" : "Over", (object)this.FormatCurrency(flag1 ? Decimal.Negate(shift.OverShortTotal) : shift.OverShortTotal, currency, context, (string)null).Result); stringBuilder.AppendLine(this.SingleLine); if (shift.AccountLines.Count > 0) { this.AppendReportLine(context, stringBuilder, "IncomeExpense"); foreach (ShiftAccountLine shiftAccountLine in (IEnumerable<ShiftAccountLine>)shift.AccountLines.OrderBy<ShiftAccountLine, IncomeExpenseAccountType>((Func<ShiftAccountLine, IncomeExpenseAccountType>)(a => a.AccountType))) { string empty = string.Empty; string textId; switch (shiftAccountLine.AccountType) { case IncomeExpenseAccountType.Income: textId = "Income"; break; case IncomeExpenseAccountType.Expense: textId = "Expense"; break; default: throw new NotSupportedException(string.Format("Unsupported account Type '{0}'.", (object)shiftAccountLine.AccountType)); } string localizedString = this.GetLocalizedString(textId, context); this.AppendReportLine(context, stringBuilder, string.Format("{0} [{1}]", (object)shiftAccountLine.AccountNumber, (object)localizedString), (object)this.FormatCurrency(shiftAccountLine.Amount, currency, context, (string)null).Result); } stringBuilder.AppendLine(); } switch (receiptType) { case ReceiptType.XReport: if (!deviceConfiguration.PrintTenderDetailsOnXReport) break; goto case ReceiptType.ZReport; case ReceiptType.ZReport: if (shift.TenderLines.Count > 0) { this.AppendReportLine(context, stringBuilder, "Tenders"); using (IEnumerator<ShiftTenderLine> enumerator = shift.TenderLines.OrderBy<ShiftTenderLine, string>((Func<ShiftTenderLine, string>)(t => t.TenderTypeName)).GetEnumerator()) { while (enumerator.MoveNext()) { ShiftTenderLine current = enumerator.Current; if (current.AddToTenderAmountOfTenderCurrency != Decimal.Zero || current.ShiftAmountOfTenderCurrency != Decimal.Zero || (current.TotalRemovedFromTenderAmountOfTenderCurrency != Decimal.Zero || current.DeclareTenderAmountOfTenderCurrency != Decimal.Zero) || (current.OverShortAmountOfTenderCurrency != Decimal.Zero || current.Count != 0)) { string str = current.TenderTypeName; if (currency != current.TenderCurrency) str = string.Format("{0} ({1})", (object)current.TenderTypeName, (object)current.TenderCurrency); string localizedString1 = this.GetLocalizedString("Added", context); string localizedString2 = this.GetLocalizedString("Collected", context); string localizedString3 = this.GetLocalizedString("Removed", context); this.AppendReportLine(context, stringBuilder, string.Format("{0} [{1}]", (object)str, (object)localizedString1), (object)this.FormatCurrency(current.AddToTenderAmountOfTenderCurrency, current.TenderCurrency, context, (string)null).Result); this.AppendReportLine(context, stringBuilder, string.Format("{0} [{1}]", (object)str, (object)localizedString2), (object)this.FormatCurrency(current.ShiftAmountOfTenderCurrency, current.TenderCurrency, context, (string)null).Result); this.AppendReportLine(context, stringBuilder, string.Format("{0} [{1}]", (object)str, (object)localizedString3), (object)this.FormatCurrency(current.TotalRemovedFromTenderAmountOfTenderCurrency, current.TenderCurrency, context, (string)null).Result); if (current.CountingRequired) { string localizedString4 = this.GetLocalizedString("Counted", context); string localizedString5 = this.GetLocalizedString("Short", context); string localizedString6 = this.GetLocalizedString("Over", context); this.AppendReportLine(context, stringBuilder, string.Format("{0} [{1}]", (object)str, (object)localizedString4), (object)this.FormatCurrency(current.DeclareTenderAmountOfTenderCurrency, current.TenderCurrency, context, (string)null).Result); bool flag2 = current.OverShortAmountOfTenderCurrency < Decimal.Zero; this.AppendReportLine(context, stringBuilder, string.Format("{0} [{1}]", (object)str, flag2 ? (object)localizedString5 : (object)localizedString6), (object)this.FormatCurrency(flag2 ? Decimal.Negate(current.OverShortAmountOfTenderCurrency) : current.OverShortAmountOfTenderCurrency, current.TenderCurrency, context, (string)null).Result); } string localizedString7 = this.GetLocalizedString("Transactions", context); this.AppendReportLine(context, stringBuilder, string.Format("{0} [{1}]", (object)str, (object)localizedString7), (object)current.Count); stringBuilder.AppendLine(); } } break; } } else break; } stringBuilder.AppendLine(); stringBuilder.AppendLine(); stringBuilder.AppendLine(); receipt.Body = stringBuilder.ToString(); body = receipt.Body; receipt.Width = 55; this.PopulateHardCodedReceiptData(receipt, receiptType, string.Empty, string.Empty, hardwareProfileId, context); XReadingData.HEADER = receipt.Header; XReadingData.BODY = receipt.Body; return receipt; } #region Formatter Helper struct ParseResult { public string ReceiptFieldName; public string Result; public bool IsValueZeroCurrency; public bool OmitFromReceipt; public ParseResult( string result, bool isValueZeroCurrency, string receiptFieldName = null, bool omitFromReceipt = false) { this.Result = result; this.IsValueZeroCurrency = isValueZeroCurrency; this.ReceiptFieldName = receiptFieldName; this.OmitFromReceipt = omitFromReceipt; } } private ParseResult FormatCurrency(Decimal value, string currencyCode, RequestContext context, string receiptFieldName = null) { string currencySymbol = string.Empty; int currencyDecimals = 0; if (!string.IsNullOrWhiteSpace(currencyCode)) { GetCurrenciesDataRequest currenciesDataRequest = new GetCurrenciesDataRequest(currencyCode, QueryResultSettings.SingleRecord); Currency currency = context.Runtime.Execute<EntityDataServiceResponse<Currency>>((Request)currenciesDataRequest, context).PagedEntityCollection.FirstOrDefault<Currency>(); currencySymbol = currency.CurrencySymbol; currencyDecimals = (int)currency.NumberOfDecimals; } GetFormattedCurrencyServiceRequest currencyServiceRequest = new GetFormattedCurrencyServiceRequest(value, currencySymbol, currencyDecimals); return new ParseResult(context.Execute<GetFormattedContentServiceResponse>((Request)currencyServiceRequest).FormattedValue, value == Decimal.Zero, receiptFieldName, false); } private bool IsValidDateTime(DateTimeOffset? dateTime) { return dateTime.HasValue && dateTime.Value.UtcDateTime.Year > 1900; } private string GetLanguage(ChannelConfiguration channelConfig) { ThrowIf.Null<ChannelConfiguration>(channelConfig, nameof(channelConfig)); return !string.IsNullOrEmpty(channelConfig.DefaultLanguageId) ? channelConfig.DefaultLanguageId : channelConfig.CompanyLanguageId; } private string GetLocalizedString(string textId, RequestContext context) { if (string.IsNullOrEmpty(textId)) return string.Empty; string textId1 = "Microsoft_Dynamics_Commerce_Runtime_Receipt_" + textId; string language = this.GetLanguage(context.GetChannelConfiguration()); string localizedString = this.GetLocalizedString(language, textId1, context); return string.IsNullOrEmpty(localizedString) ? textId : localizedString; } private string GetLocalizedString(string cultureName, string textId, RequestContext requestContext) { return this.GetLocalizedString(cultureName, textId, requestContext, (object[])null); } public string GetLocalizedString(string cultureName, string textId, params object[] args) { return this.GetLocalizedString(cultureName, textId, (RequestContext)null, args); } public string GetLocalizedString(string cultureName, string textId, RequestContext requestContext, params object[] args) { string str = (string)null; if (requestContext != null) { try { str = this.GetOverriddenLocalizedString(cultureName, textId, requestContext); } catch { } } if (str == null) { try { str = this.StringLocalizerTranslate(cultureName, textId, args); } catch { } } return str ?? string.Empty; } public string StringLocalizerTranslate(string cultureName, string textId, params object[] args) { if (string.IsNullOrWhiteSpace(textId)) return string.Empty; string empty = string.Empty; try { CultureInfo culture; try { culture = string.IsNullOrWhiteSpace(cultureName) ? CultureInfo.CurrentCulture : new CultureInfo(cultureName); } catch (CultureNotFoundException ex) { culture = CultureInfo.CurrentCulture; } string format = "";// string.emthis.resourceManager.GetString(textId, culture); //Need review return args == null ? format : string.Format((IFormatProvider)culture, format, args); } catch (Exception ex) { throw; } } private string GetOverriddenLocalizedString(string cultureName, string textId, RequestContext requestContext) { if (this.localizedTexts == null) this.InitializeLocalizedTextDictionary(cultureName, requestContext); string key = string.Format(this.localizedTextKeyFormat, (object)cultureName.ToLower(CultureInfo.InvariantCulture), (object)textId.ToLower(CultureInfo.InvariantCulture)); LocalizedText localizedText1 = (LocalizedText)null; if (this.localizedTexts.TryGetValue(key, out localizedText1)) return localizedText1.Text; GetLocalizedTextsDataRequest textsDataRequest = new GetLocalizedTextsDataRequest(cultureName, textId, QueryResultSettings.SingleRecord); PagedResult<LocalizedText> entityCollection = requestContext.Execute<EntityDataServiceResponse<LocalizedText>>((Request)textsDataRequest).PagedEntityCollection; if (entityCollection.IsNullOrEmpty<LocalizedText>()) return (string)null; LocalizedText localizedText2 = entityCollection.FirstOrDefault<LocalizedText>(); this.localizedTexts[key] = localizedText2; return localizedText2.Text; } private string FormatDate(DateTimeOffset? date, RequestContext context) { string str; if (!this.IsValidDateTime(date)) { str = this.GetLocalizedString("NotApplicable", context); } else { GetFormattedDateServiceRequest dateServiceRequest = new GetFormattedDateServiceRequest(date.Value); str = context.Execute<GetFormattedContentServiceResponse>((Request)dateServiceRequest).FormattedValue; } return str; } private string FormatTime( DateTimeOffset? time, TimeFormattingType timeFormattingType, RequestContext context) { if (!this.IsValidDateTime(time)) return this.GetLocalizedString("NotApplicable", context); GetFormattedTimeServiceRequest timeServiceRequest = new GetFormattedTimeServiceRequest(time.Value, timeFormattingType); return context.Execute<GetFormattedContentServiceResponse>((Request)timeServiceRequest).FormattedValue; } private void AppendReportLine(RequestContext context, StringBuilder receiptString, string titleResourceId) { titleResourceId = this.GetLocalizedString(titleResourceId, context); receiptString.AppendLine(titleResourceId); receiptString.AppendLine(this.SingleLine); } private string FormatHeaderLineWithWrapping(RequestContext context, string titleResourceId, string value, bool firstPart) { value = this.WrapHeaderValueString(value, firstPart); return this.FormatHeaderLine(context, titleResourceId, value, firstPart); } private string WrapHeaderValueString(string headerValue, bool firstPart) { int titleLength = firstPart ? 15 : 11; int num = 55 - titleLength - 2; string str1 = headerValue ?? string.Empty; string empty = string.Empty; int lineNumber = 0; while (str1.Length > num) { string str2 = str1.Substring(0, num) + Environment.NewLine; empty += this.FormatWrappedFieldValue(str2, titleLength, lineNumber); str1 = str1.Substring(num); ++lineNumber; } return empty + this.FormatWrappedFieldValue(str1, titleLength, lineNumber); } private string FormatWrappedFieldValue(string value, int titleLength, int lineNumber) { return (lineNumber > 0 ? string.Empty.PadLeft(titleLength + 2) : " ") + value; } private string FormatHeaderLine(RequestContext context, string titleResourceId, string value, bool firstPart) { string localizedString = this.GetLocalizedString(titleResourceId, context); int fullWidthCharsCount = this.GetFullWidthCharsCount(localizedString); return firstPart ? string.Format((IFormatProvider)this.GetCultureInfo(context.GetChannelConfiguration()), "{0}:{1}", (object)localizedString.PadRight(15 - fullWidthCharsCount, '.'), (object)value.PadLeft(13)) + " " : string.Format((IFormatProvider)this.GetCultureInfo(context.GetChannelConfiguration()), "{0}:{1}", (object)localizedString.PadRight(11 - fullWidthCharsCount, '.'), (object)value.PadLeft(12)); } private CultureInfo GetCultureInfo(ChannelConfiguration channelConfig) { return new CultureInfo(this.GetLanguage(channelConfig)); } private int GetFullWidthCharsCount(string item) { int num = 0; foreach (char ch in item) { if (ch >= '一' && ch <= '鿌') ++num; } return num; } private void AppendReportLine(RequestContext context, StringBuilder receiptString, string titleResourceId, object value) { titleResourceId = this.GetLocalizedString(titleResourceId, context); int fullWidthCharsCount = this.GetFullWidthCharsCount(titleResourceId); char paddingChar = fullWidthCharsCount > 0 ? 'ᅠ' : ' '; receiptString.AppendLine(string.Format((IFormatProvider)this.GetCultureInfo(context.GetChannelConfiguration()), "{0}:{1}", (object)titleResourceId, (object)value.ToString().PadLeft(55 - titleResourceId.Length - 2 - fullWidthCharsCount, paddingChar))); } private string FormatNumber(Decimal number, RequestContext context) { GetFormattedNumberServiceRequest numberServiceRequest = new GetFormattedNumberServiceRequest(number); return context.Execute<GetFormattedContentServiceResponse>((Request)numberServiceRequest).FormattedValue; } private string FormatPercentage(Decimal percentage, RequestContext context) { GetFormattedPercentageServiceRequest percentageServiceRequest = new GetFormattedPercentageServiceRequest(percentage); return context.Execute<GetFormattedContentServiceResponse>((Request)percentageServiceRequest).FormattedValue; } private TaxCodeInterval GetTaxCodeInterval(RequestContext context, string taxCode, DateTimeOffset transactionDate) { GetTaxCodeIntervalDataRequest intervalDataRequest = new GetTaxCodeIntervalDataRequest(taxCode, transactionDate); return context.Execute<SingleEntityDataServiceResponse<TaxCodeInterval>>((Request)intervalDataRequest).Entity; } private void PopulateHardCodedReceiptData(Receipt receipt, ReceiptType receiptType, string transactionId, string receiptId, string hardwareProfileId, RequestContext context) { receipt.ReceiptTitle = receiptType.ToString(); receipt.TransactionId = transactionId; receipt.ReceiptId = receiptId; receipt.ReceiptType = receiptType; ReadOnlyCollection<Printer> forHardcodeReceipt = this.GetPrinterForHardcodeReceipt(context, hardwareProfileId, receiptType); if (!forHardcodeReceipt.IsNullOrEmpty<Printer>()) receipt.Printers = (ICollection<Printer>)new Printer[1] { forHardcodeReceipt.First<Printer>() }; else receipt.Printers = (ICollection<Printer>)forHardcodeReceipt; this.ChangePrinterBehavior(receipt.Printers, receiptType); } private ReadOnlyCollection<Printer> GetPrinterForHardcodeReceipt(RequestContext context, string hardwareProfileId, ReceiptType receiptType) { Terminal terminal = context.GetTerminal(); if (string.IsNullOrEmpty(hardwareProfileId)) hardwareProfileId = terminal.HardwareProfile; GetHardwareProfileDataRequest profileDataRequest = new GetHardwareProfileDataRequest(hardwareProfileId, QueryResultSettings.SingleRecord); HardwareProfile entity = context.Runtime.Execute<SingleEntityDataServiceResponse<HardwareProfile>>((Request)profileDataRequest, context).Entity; if (entity != null && entity.Printers != null && entity.Printers.Any<HardwareProfilePrinter>()) { HardwareProfilePrinter hardwareProfilePrinter = entity.Printers.FirstOrDefault<HardwareProfilePrinter>((Func<HardwareProfilePrinter, bool>)(printer => (uint)printer.DeviceType > 0U)); if (hardwareProfilePrinter != null) return new List<Printer>() { new Printer() { ReceiptType = receiptType, PrintBehavior = PrintBehavior.Always, Terminal = terminal == null ? 0L : terminal.RecordId, HardwareProfileId = hardwareProfileId, Name = hardwareProfilePrinter.DeviceName, PrinterType = (int) hardwareProfilePrinter.DeviceType } }.AsReadOnly(); } return new List<Printer>().AsReadOnly(); } private void ChangePrinterBehavior(ICollection<Printer> printers, ReceiptType receiptType) { foreach (Printer printer in (IEnumerable<Printer>)printers) { printer.PrintBehavior = PrintBehavior.Always; printer.ReceiptLayoutId = (string)null; printer.ReceiptType = receiptType; } } private void InitializeLocalizedTextDictionary(string cultureName, RequestContext requestContext) { GetLocalizedTextsDataRequest textsDataRequest = new GetLocalizedTextsDataRequest(cultureName, (string)null, QueryResultSettings.AllRecords); PagedResult<LocalizedText> entityCollection = requestContext.Execute<EntityDataServiceResponse<LocalizedText>>((Request)textsDataRequest).PagedEntityCollection; if (!entityCollection.IsNullOrEmpty<LocalizedText>() && !entityCollection.Results.IsNullOrEmpty<LocalizedText>()) { this.localizedTexts = new Dictionary<string, LocalizedText>(entityCollection.Results.Count); foreach (LocalizedText localizedText in entityCollection) { string index = string.Format(this.localizedTextKeyFormat, (object)localizedText.LanguageId.ToLower(CultureInfo.InvariantCulture), (object)localizedText.TextId.ToLower(CultureInfo.InvariantCulture)); this.localizedTexts[index] = localizedText; } } else this.localizedTexts = new Dictionary<string, LocalizedText>(); } #endregion } } }