Save all data print in POS - Retail D365 - Song Nghia - Microsoft Dynamics Partner

Song Nghia - Microsoft Dynamics Partner

Song Nghia - Microsoft Dynamics Partner

Breaking

Monday, April 13, 2020

Save all data print in POS - Retail D365

Save all data print in POS - Retail D365

Song Nghia - Technical consultant

This class help you save all data print in POS Retail D365.
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.Text.RegularExpressions;
        using System.Transactions;
        using Microsoft.Dynamics.Commerce.Runtime.Data;

        public class EJFileLawsonService
        {
            GetReceiptServiceRequest originalReceiptsRequest;
            GetReceiptServiceResponse originalReceiptsResponse;

            public EJFileLawsonService(GetReceiptServiceRequest request, GetReceiptServiceResponse response)
            {
                originalReceiptsRequest = request;
                originalReceiptsResponse = response;
            }

            public void Process()
            {
                string finalReceipt = "";
                string finaleReceiptHTML = "", headerHTML = "", bodyHTML = "", footerHTML = "";
                int lineNum = 0;
                OrgUnit orgUnit = this.GetStoreFromContext(originalReceiptsRequest.RequestContext);
                foreach (Receipt receipt in originalReceiptsResponse.Receipts)
                {
                    lineNum++;
                    if (originalReceiptsRequest.IsCopy == false && originalReceiptsRequest.IsPreview == false)
                    {
                        finalReceipt = receipt.Header + receipt.Body + receipt.Footer;
                        finaleReceiptHTML = this.ConvertToHTML(finalReceipt);
                        headerHTML = this.ConvertToHTML(receipt.Header);
                        bodyHTML = this.ConvertToHTML(receipt.Body);
                        footerHTML = this.ConvertToHTML(receipt.Footer);
                        this.InsertDataIntoExTTable(finaleReceiptHTML, headerHTML, bodyHTML, footerHTML, originalReceiptsRequest, receipt, lineNum);
                    }
                }
            }
            private OrgUnit GetStoreFromContext(RequestContext context)
            {
                SearchOrgUnitDataRequest orgUnitDataRequest = new SearchOrgUnitDataRequest(context.GetPrincipal().ChannelId);
                return context.Execute<EntityDataServiceResponse<OrgUnit>>((Request)orgUnitDataRequest).PagedEntityCollection.SingleOrDefault<OrgUnit>();
            }

            private string ConvertToHTML(string receipt)
            {
                if (string.IsNullOrEmpty(receipt))
                    return receipt;
                string[] strArray = Regex.Split(receipt, "(&#x1B;\\|1C|&#x1B;\\|2C|&#x1B;\\|3C|&#x1B;\\|4C|\\r\\n)", RegexOptions.Multiline);
                StringBuilder stringBuilder = new StringBuilder();
                bool flag = false;
                foreach (string str in strArray)
                {
                    if (!string.IsNullOrEmpty(str))
                    {
                        if (!(str == "&#x1B;|1C") && !(str == "&#x1B;|3C"))
                        {
                            if (!(str == "&#x1B;|2C") && !(str == "&#x1B;|4C"))
                            {
                                if (str == "\r\n")
                                {
                                    stringBuilder.Append("\n");
                                }
                                else
                                {
                                    stringBuilder.Append(str);
                                    if (flag)
                                        stringBuilder.Append(new string(' ', str.Length));
                                }
                            }
                            else
                                flag = true;
                        }
                        else
                            flag = false;
                    }
                }
                receipt = this.RemoveLogo(stringBuilder.ToString());
                return receipt;
            }

            private string RemoveLogo(string receipt)
            {
                foreach (Match match in new Regex("<L(.?|:.+)>").Matches(receipt))
                    receipt = receipt.Replace(match.Value, string.Empty);
                return receipt;
            }

            private void InsertDataIntoExTTable(string _finalReceiptString, string _header, string _body, string _footer, GetReceiptServiceRequest _originalReceiptsRequest, Receipt _receipt, int _lineNum)
            {
                using (TransactionScope transactionScope = new TransactionScope())
                {
                    ParameterSet parameters = new ParameterSet();

                    if (_receipt.ReceiptType == ReceiptType.SalesReceipt || _receipt.ReceiptType == ReceiptType.SalesOrderReceipt || _receipt.ReceiptType == ReceiptType.SuspendedTransaction || _receipt.ReceiptType == ReceiptType.CustomReceipt6 || _receipt.ReceiptType == ReceiptType.CustomReceipt7)
                    {
                        parameters["@TERMINALID"] = _originalReceiptsRequest.SalesOrder.TerminalId;
                        parameters["@SHIFTID"] = _originalReceiptsRequest.SalesOrder.ShiftId;
                        parameters["@RECEIPTTYPES"] = _receipt.ReceiptTypeStrValue;
                        parameters["@CHANNEL"] = _originalReceiptsRequest.SalesOrder.ChannelId;
                        parameters["@TRANSACTIONDATETIME"] = _originalReceiptsRequest.SalesOrder.CreatedDateTime;
                        parameters["@TRANSACTIONDATE"] = _originalReceiptsRequest.SalesOrder.CreatedDateTime;
                        parameters["@TRANSACTIONTYPE"] = _originalReceiptsRequest.SalesOrder.TransactionTypeValue;
                        parameters["@TRANSACTIONID"] = _receipt.TransactionId;
                        parameters["@LINENUM"] = _lineNum;
                    }
                    else if (_receipt.ReceiptType == ReceiptType.SafeDrop || _receipt.ReceiptType == ReceiptType.FloatEntry || _receipt.ReceiptType == ReceiptType.StartingAmount
                        || _receipt.ReceiptType == ReceiptType.RemoveTender)
                    {
                        parameters["@TERMINALID"] = _originalReceiptsRequest.RequestContext.GetPrincipal().ShiftTerminalId;
                        parameters["@SHIFTID"] = _originalReceiptsRequest.RequestContext.GetPrincipal().ShiftId;
                        parameters["@RECEIPTTYPES"] = _receipt.ReceiptTypeStrValue;
                        parameters["@CHANNEL"] = _originalReceiptsRequest.RequestContext.GetPrincipal().ChannelId;
                        parameters["@TRANSACTIONDATETIME"] = DateTime.Now.ToUniversalTime();
                        parameters["@TRANSACTIONDATE"] = DateTime.Now.ToUniversalTime();
                        parameters["@TRANSACTIONTYPE"] = _originalReceiptsRequest.NonSalesTenderTransaction.TransactionTypeValue;
                        parameters["@TRANSACTIONID"] = _receipt.TransactionId;
                        parameters["@LINENUM"] = _lineNum;
                    }
                    else if (_receipt.ReceiptType == ReceiptType.TenderDeclaration)
                    {
                        parameters["@TERMINALID"] = _originalReceiptsRequest.DropAndDeclareTransaction.TerminalId;
                        parameters["@RECEIPTTYPES"] = _receipt.ReceiptTypeStrValue;
                        parameters["@SHIFTID"] = _originalReceiptsRequest.DropAndDeclareTransaction.ShiftId;
                        parameters["@CHANNEL"] = _originalReceiptsRequest.RequestContext.GetPrincipal().ChannelId;
                        parameters["@TRANSACTIONDATETIME"] = DateTime.Now.ToUniversalTime();
                        parameters["@TRANSACTIONDATE"] = DateTime.Now.ToUniversalTime();
                        parameters["@TRANSACTIONTYPE"] = _originalReceiptsRequest.DropAndDeclareTransaction.TransactionTypeValue;
                        parameters["@TRANSACTIONID"] = _receipt.TransactionId;
                        parameters["@LINENUM"] = _lineNum;
                    }
                    else if (_receipt.ReceiptType == ReceiptType.ZReport)
                    {
                        parameters["@TERMINALID"] = _originalReceiptsRequest.ShiftDetails.TerminalId;
                        parameters["@SHIFTID"] = _originalReceiptsRequest.ShiftDetails.ShiftId;
                        parameters["@RECEIPTTYPES"] = "X-Reading Report";
                        parameters["@CHANNEL"] = _originalReceiptsRequest.RequestContext.GetPrincipal().ChannelId;
                        parameters["@TRANSACTIONDATETIME"] = DateTime.Now.ToUniversalTime();
                        parameters["@TRANSACTIONDATE"] = DateTime.Now.ToUniversalTime();
                        parameters["@TRANSACTIONTYPE"] = 24;
                        parameters["@LINENUM"] = _lineNum;

                        /* Get XDOC Number*/
                        var queryRetailXReadingTransactionDetail = new SqlPagedQuery(QueryResultSettings.SingleRecord)
                        {
                            DatabaseSchema = "ext",
                            Select = new ColumnSet("DOCNUM"),
                            From = "LAW_RETAILXREADINGTRANSACTIONDETAIL",
                            Where = "STORE = @STORE AND TERMINALID = @TERMINALID AND DATAAREAID = @DATAAREAID AND SHIFT = @SHIFT"
                        };

                        string storeNum = this.GetStoreNumber(_originalReceiptsRequest);

                        queryRetailXReadingTransactionDetail.Parameters["@TERMINALID"] = _originalReceiptsRequest.ShiftDetails.TerminalId;
                        queryRetailXReadingTransactionDetail.Parameters["@STORE"] = storeNum;
                        queryRetailXReadingTransactionDetail.Parameters["@DATAAREAID"] = _originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId;
                        queryRetailXReadingTransactionDetail.Parameters["@SHIFT"] = _originalReceiptsRequest.ShiftDetails.ShiftId;

                        using (DatabaseContext databaseContextXReadingDetail = new DatabaseContext(_originalReceiptsRequest.RequestContext))
                        {
                            var xReadingEntityDetail = databaseContextXReadingDetail.ReadEntity<ExtensionsEntity>(queryRetailXReadingTransactionDetail).FirstOrDefault();
                            if (xReadingEntityDetail != null)
                            {
                                string XDOC = xReadingEntityDetail.GetProperty("DOCNUM").ToString();
                                parameters["@TRANSACTIONID"] = XDOC;

                            }
                        }
                    }
                    else if (_receipt.ReceiptType == ReceiptType.XReport)
                    {
                        parameters["@TERMINALID"] = _originalReceiptsRequest.ShiftDetails.TerminalId;
                        parameters["@SHIFTID"] = _originalReceiptsRequest.ShiftDetails.ShiftId;
                        parameters["@RECEIPTTYPES"] = "Tender Report";
                        parameters["@CHANNEL"] = _originalReceiptsRequest.RequestContext.GetPrincipal().ChannelId;
                        parameters["@TRANSACTIONDATETIME"] = DateTime.Now.ToUniversalTime();
                        parameters["@TRANSACTIONDATE"] = DateTime.Now.ToUniversalTime();
                        parameters["@TRANSACTIONTYPE"] = 24;
                        parameters["@TRANSACTIONID"] = DateTime.Now.ToString("yyyyMMddHHmmss");
                        parameters["@LINENUM"] = _lineNum;
                    }

                    parameters["@DATAAREAID"] = _originalReceiptsRequest.RequestContext.GetChannelConfiguration().InventLocationDataAreaId;
                    parameters["@EVENTCREATEDDATETIME"] = DateTime.Now.ToUniversalTime();
                    parameters["@REPLICATED"] = 0;
                    parameters["@RECEIPTID"] = _receipt.ReceiptId;
                    if(_receipt.ReceiptType == ReceiptType.CustomReceipt7)
                        parameters["@RECEIPTHEADER"] = "DIEP VIEN 007" +  _header;
                    else
                        parameters["@RECEIPTHEADER"] = _header;
                    parameters["@RECEIPTBODY"] = _body;
                    parameters["@RECEIPTFOOTER"] = _footer;
                    parameters["@RECEIPTSTRING"] = _finalReceiptString;

                    if (_receipt.ReceiptType == ReceiptType.CustomReceipt6)
                    {
                        parameters["@LINENUM"] = _lineNum + 1;
                    }

                    int errorCode;
                    using (var databaseContext = new DatabaseContext(_originalReceiptsRequest))
                    {
                        errorCode = databaseContext.ExecuteStoredProcedureNonQuery("[ext].[LAW_RETAILDOCUMENTSPRINTINGHISTORY_Insert]", parameters);
                    }

                    if (errorCode != 0)
                        throw new StorageException(StorageErrors.Microsoft_Dynamics_Commerce_Runtime_CriticalStorageError, errorCode, "Unable to save data");
                    transactionScope.Complete();

                }
            }

            public string GetStoreNumber(Request request)
            {
                long StoreRecId = request.RequestContext.GetPrincipal().ChannelId;
                string StoreNumber = string.Empty;

                var queryRetailStore = new SqlPagedQuery(QueryResultSettings.SingleRecord)
                {
                    DatabaseSchema = "ax",
                    Select = new ColumnSet(new string[] { "STORENUMBER" }),
                    From = "RETAILSTORETABLE",
                    Where = "RECID = @RECID"
                };

                queryRetailStore.Parameters["@RECID"] = StoreRecId;

                using (DatabaseContext databaseContext = new DatabaseContext(request.RequestContext))
                {
                    var extensions = databaseContext.ReadEntity<ExtensionsEntity>(queryRetailStore).FirstOrDefault();
                    StoreNumber = extensions.GetProperty("STORENUMBER").ToString();
                }

                return StoreNumber;
            }
        }
    }
}