@pmcretail/mapper-library 0.0.21 → 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/pmcretail-mapper-library.umd.js +2 -2
- package/bundles/pmcretail-mapper-library.umd.js.map +1 -1
- package/bundles/pmcretail-mapper-library.umd.min.js.map +1 -1
- package/esm2015/lib/WebReturn-mapper.class.js +3 -3
- package/esm5/lib/WebReturn-mapper.class.js +3 -3
- package/fesm2015/pmcretail-mapper-library.js +2 -2
- package/fesm2015/pmcretail-mapper-library.js.map +1 -1
- package/fesm5/pmcretail-mapper-library.js +2 -2
- package/fesm5/pmcretail-mapper-library.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/tslib/tslib.es6.js","ng://@pmcretail/mapper-library/lib/mapper-library.component.ts","ng://@pmcretail/mapper-library/lib/mapper-library.module.ts","ng://@pmcretail/mapper-library/lib/mapper-library.model.ts","ng://@pmcretail/mapper-library/lib/basket.service.ts","ng://@pmcretail/mapper-library/lib/number-util.service.ts","ng://@pmcretail/mapper-library/lib/TransactionDocumentBuilder.ts","ng://@pmcretail/mapper-library/lib/RJ-mapper.class.ts","ng://@pmcretail/mapper-library/lib/WebReturn-mapper.class.ts"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__values","o","Symbol","iterator","m","next","value","done","TypeError","__read","r","e","ar","push","error","__spread","concat","MapperLibraryComponent","ngOnInit","Component","args","selector","template","MapperLibraryModule","NgModule","declarations","imports","exports","TRANSACTION_TYPE","DELIVERY_METHODS","DELIVERY","DROP_SHIP","COLLECT_FROM_STORE","DISCOUNTTYPE","PERCENT","AMOUNT","BasketService","numberUtilService","currentBasket","products","transactionDiscount","quantity","total","saleTotal","baseCurrency","basketSource","BehaviorSubject","basket","asObservable","productSource","product","peerSource","peerSync","scanSource","scanner","defineProperty","_isMixedBasketSales","v","updateBasket","isMixedBasketSales","filterProductListWithWebOrder","updateBasketTotal","basketDetails","basketState","_b","tslib_1.__values","_c","trimTo2Decimal","console","log","transactionId","JSON","stringify","basketTotal","addlinePromotion","promotionList","result","linePromotions","_d","element","_e","e_3","_f","promotionelement","itemLineId","toString","addTransactionPromotion","basketdetails","_this","transactionPromotion","forEach","tPromotion","transactionPromotionEntryUpdated","itemLineIds","map","transactionPromotionProductPortionCalc","updateProductTotalForSummary","promotionLinePrice","lineDiscount","discountedLinePrice","totalLinePrice","Math","abs","refundedTotal","refundedQuantity","updateBasketTotalForSummary","info","updateTransactionPromotion","updateTransactionDiscount","Number","toFixed","discountTotal","reduce","_a","discountAmount","promotionAmount","updateBasketTotalWithoutDiscount","updateBasketTotalWithDiscounts","transactionDiscountAndPromotionProductortionCalculation","discount","transactionDiscountProductPortionCalc","promotion","percentage","includes","validateProductItemDiscount","productContributionInTotal","trimTo2Decimal2","itemDiscounts","trnDiscountsPortion","trnPromotionsPortion","refundPortion","discountable","markProduct","stopPeerSyncProcess","scanStart","isScanning","promotionRemainingCalculation","promotionValue","discountRemainingCalculation","discountValue","discountRefundedCalculation","generateNewItemLineId","largestNumber","a","b","max","updateBasketProductDataAsPerQuantity","getFlooredFixed","unitPrice","selectedPrice","isWebOrder","filter","x","filterProductListWithDelivery","deliveryMethod","filterProductListWithDeliveryGroup","group","deliveryGroup","generateNewDeliveryGroupNumber","parseInt","getDeliveryGroupNumbers","uniqueAndsortedResult","deliveryGroupArr","Array","from","Set","sort","updateProductsWithNewDeliveryGroupNumber","newGroupNumber","cBProducts","calculateEstimatedTime","time_1","estmatedTime_1","estimatedDays_1","leadTime","type","toLocaleLowerCase","updateProductsWithDeliveryGroupNumber","oldGroup","newGroup","getDeliveryInfo","groupInfo_1","groups","groupNumber","items","estimate","NumberUtilService","cp","no","d","floor","pow","AppendWithCurrencySymbol","numValue","currencyCode","returnValue","parseFloat","replace","transform","toLocaleUpperCase","Injectable","providedIn","CurrencyPipe","TransactionDocumentBuilder","transactionDoc","currencyPipe","basketService","storeInfo","parse","localStorage","getItem","transactionDocument","offlineTransactionId","transactionRef","dateTime","orgCode","storeId","storeNodeId","storeNodeStructure","deviceId","terminalId","userId","initiatingModule","export","basketSummary","operationStatus","createdAt","updatedAt","id","currentTransactionDetails","storeDetails","date","Date","random","substring","toISOString","transactionID","isOnline","saleExport","subsidiaryId","linePromotion","index","SKU","excludePromotion","barCode","barcode","barcodes","description","price","imageUrls","selectedRRPPrice","fullfilmentId","fullfilmentLocationName","giftCard","giftCardExpiryDate","giftCardNumberIssued","giftCardRecipientEmail","giftCardRecipientName","refundedPromotionalQuantity","refundPromotionalQuantity","refunded","refundedReasonDescription","refundedReason","isLastExchanged","exchange","proj","updateSaleTotal","totalItems","refundTotal","updateCurrentTransactionDetailsRefundTotal","updateCurrentTransactionDetailsDiscountTotal","discountTotal_1","updateCurrentTransactionDetailsTaxBreakdown","taxBreakdown","taxLines","totalTaxableAmount","taxLine","VAT","selectedVAT","VATCode","selectedVATCode","taxLineTotal","taxableAmount","PreTax","currentRefundPortion","VATTotal","updateCurrentTransactionDetailsTotalTaxSummary","totalTaxSummaryGroup","totalTaxSummaryArray","TaxSummary","PreTaxSum","TaxSum","TXrateSum","preparedArray","currentObj","ind","findIndex","totalTaxSummary","totalRefund","getRefundTotal","updateDiscountTotal","acc","val","find","el","undefined","this_1","some","exchangeId","exchangeItems","j","newItems","item","lineItemId","Quantity","addExchangeData","originalTransactionDocument","paymentDetails","splitPayment","isPaymentCompleted","currency","giftOption","gift","giftedReceipt","transactionCompletedAt","transCompletedAt","build","saleTotalInRefund","getBasketDetails","customer","getTransactionDiscountAndTransactionPromotionPortion","getTotalDiscountWithTransactionDiscountsAndPromotions","getRefundedTotalWithQuantity","filteredData","appendCurrencySymbol","returnval","getTotalWithLineDiscountAndLinePromotionApplied","saletotal","updateReasonCode","reasonCode","code","reasonDescription","name","updateManagerOverride","useroverride","override","updateUserID","userID","updateUserName","userName","addCustomerDetails","customerDetail","updateTaxBreakdown","updateTotalTaxSummary","addOriginalTransId","tranDoc","originalTransId","apiResponse","internalId","originalExternalId","addUnreferencedRefund","unreferencedRefund","docId","RJMapperBuilderClass","itemCount","rjObject","initilizeItemCount","setLineNumberForProducts","getDate","getPosbasketInfo","generateKeyword","generateId","majorVersion","minorVersion","manifestVersion","databaseSchemaVersion","basketType","getState","externalState","getheaderInfo","TimeZoneOffset","convertToString","generateTimezoneoffset","DateTimeCreated","OriginatedBy","DeviceID","CashierID","cashierId","CompanyID","companyId","StoreID","BranchID","branchId","TerminalNumber","terminalNumber","TransactionNumber","transactionNumber","TaxMethodID","taxMethodId","DynamicStockLookup","generateDynamicStockLookUp","BasketLanguageID","basketLanguageId","BasketCountryID","basketCountryId","BasketCurrencyID","TradingRegionID","tradingRegionId","Eurozone","EuroBaseExchangeRate","PrintableName","rjMapper","indexOf","splice","data","addProduct","getModifierItem","getTransactionPromotion","returnProduct","OriginalReceiptSupplied","OriginalBranchID","OriginalTerminalNumber","OriginalTransactionNumber","OriginalCashierNumber","getBasketDiscount","obj","xmlSchemaVersion","reasonDisplayText","discountType","toUpperCase","generateLineNumber","lineNo","XMLSchemaVersion","LineNumber","NetValue","EffectiveNetValue","Description","percentageDiscountReasonName","priceOverrideReasonName","UserID","AuthorisingUserID","ReasonCodeID","percentageDiscountReasonCode","priceOverrideReasonCode","ModifiedLineNumber","ModifiedIndex","getTrailerInfo","Trailer","DateTimeCompleted","CompletedBy","Total","ItemCount","ItemQuantity","NetItemQuantity","TaxTotal","removeDecimal","SequenceDeviceID","SequenceNumber","addDecimal","promotionId","displayText","getNumber","promotionTrigger","getTenderInfo","externalTenderKey","paymentType","round","amount","getDescription","TenderType","externalTenderType","TenderSubType","externalSubTenderType","TenderAmount","CurrencyID","CurrencyDescription","GiftVoucherSalesAllowed","AllowRechargeableVoucherSales","GiftVoucherID","obj1","IncludeInTransactionTotalCheck","OpenDrawerAtEnd","productId","lineNumber","ProductID","itemLineIdArray","cardType","getMMGROUPID","attributes","filterValue","attribute","setDeviceInfo","setTransactionNumber","setManifestVersion","setDatabaseSchemaVersion","setBasketType","setTradingRegionID","setCompanyID","setTaxMethodID","setMajorVersion","setMinorVersion","setXMLSchemaVersion","setExternalState","setCashierID","setTerminalNumber","setBasketLanguageID","setBasketCountryID","setBasketCurrencyID","basketCurrencyId","setBranchID","setSalesPersonName","salesPersonName","newDateTime","getTimezoneOffset","taxTotal","getQuantity","getOriginalTax","ModifierValue","ModifierDateTime","ModifierReasonID","ModifierDescription","DiscountType","OriginalPrice","DiscountedValue","DiscountPercentage","percentageDiscountValue","RoundingRule","ModifierReasonDescription","NewPrice","ExtendedValue","UnitPrice","discountObj","BasketDiscountLineNumber","getLineNumber","getDiscountedValue","totaltransactionDiscount","transactionPromo","promotionObj","PromotionID","PromotionDescription","HitNumber","PromotionHitProductQuantity","PromotionHitQuantity","SalespersonID","SalespersonName","TaxCode","TaxModifiable","OriginalTaxAmount","TaxAmount","OriginalTaxAmountSet","HandKeyed","CustomerDetails","Perishable","MMGroupID","totaltransactionDiscount_1","Hit","Saving","getSaving","ISaving","transactionPromotion_1","pricebeforetax","offset","offsetHours","offsetMinutes","offsetSign","String","padStart","promotionInfo","WebReturnMapperBuilderClass","document","webReturnObject","firstName","lastName","email","postCode","billingAddress","shippingAddress","WebReturnMapper","getUTCDateTime","getText","updated_at","base_currency_code","store_id","created_at","order_id","customer_firstname","customer_lastname","customer_email","billing_address","street","city","region","postcode","country","shipping_address","discount_amount","base_total_paid","base_total_invoiced","total_qty_ordered","base_total_refunded","item_id","sku","qty_ordered","qty_refunded","original_price","base_original_price","text"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, OnInit } from '@angular/core';\n\n@Component({\n selector: 'lib-mapper-library',\n template: `\n <p>\n mapper-library works!\n </p>\n `,\n styles: [\n ]\n})\nexport class MapperLibraryComponent implements OnInit {\n\n constructor() { }\n\n ngOnInit(): void {\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { MapperLibraryComponent } from './mapper-library.component';\n\n\n\n@NgModule({\n declarations: [\n MapperLibraryComponent\n ],\n imports: [\n ],\n exports: [\n MapperLibraryComponent\n ]\n})\nexport class MapperLibraryModule { }\n","\r\n\r\nexport enum TRANSACTION_TYPE {\r\n SALE = \"SALE\",\r\n REFUND = \"REFUND\",\r\n SALE_REFUND = \"SALE_REFUND\",\r\n SALE_EXCHANGE = \"SALE_EXCHANGE\",\r\n VOID = \"VOID\"\r\n}\r\n\r\nexport interface ItemDiscount {\r\n trnDiscountsPortion: number;\r\n trnPromotionsPortion: number;\r\n refundPortion: number;\r\n currentRefundPortion?: number;\r\n}\r\n\r\nexport enum DELIVERY_METHODS {\r\n DELIVERY = 1,\r\n DROP_SHIP = 2,\r\n COLLECT_FROM_STORE = 3,\r\n}\r\n\r\nexport interface ProductChange {\r\n itemLineId?: number;\r\n SKU: string;\r\n quantity: number;\r\n selectedPrice?: number;\r\n lineDiscount?: LineDiscount;\r\n linePromotions?: LinePromotions;\r\n exchange?: Exchange;\r\n refundedQuantity?: number; // contains quantity of both full priced and promotional quantities\r\n refundPromotionalQuantity?: number; // promotional quantity\r\n refunded?: boolean;\r\n refundedTotal?: number;\r\n refundedReason?: string;\r\n refundedReasonDescription?: string;\r\n isChecked?: boolean;\r\n sealed?: boolean;\r\n isLastExchanged?: boolean;\r\n}\r\n\r\n/**\r\n * Product\r\n */\r\nexport interface Product extends ProductChange {\r\n itemLineId?: number;\r\n status: number;\r\n subGroup: number;\r\n brand: string;\r\n currency: string;\r\n category: string;\r\n countryofOrigin: string;\r\n productId: string;\r\n productType: number;\r\n name?: string;\r\n imageUrls: [string];\r\n isImageFailToLoad?: boolean;\r\n size: string;\r\n type: string;\r\n season: number;\r\n productGroup: number;\r\n styleCode: string;\r\n nodeStructure: NodeStructure[];\r\n barcode: string;\r\n price: Price[];\r\n colour: string;\r\n description: string;\r\n totalLinePrice: number;\r\n total: number;\r\n addedInBasket?: boolean;\r\n selectedVAT?: number;\r\n selectedVATCode?: string;\r\n selectedRRPPrice?: number;\r\n lineDiscount?: LineDiscount;\r\n exchange?: Exchange;\r\n // refundedQuantity?: number;\r\n // refunded?: boolean;\r\n // refundedTotal?: number;\r\n // refundedReasonDescription?:string;\r\n // isChecked?:boolean;\r\n refundPromotionalQuantity?: number; // promotional quantity\r\n exchangeReason?: string;\r\n exchangeQuantity?: number;\r\n itemDiscounts: ItemDiscount;\r\n\r\n giftCardNumberIssued?: string;\r\n giftCardAmount?: number;\r\n giftCardRecipientEmail?: string;\r\n giftCardExpiryDate?: string;\r\n giftCardRecipientName?: string;\r\n giftCard?: boolean;\r\n\r\n discountable: boolean;\r\n // sealed?:boolean;\r\n excludePromotion: boolean;\r\n categories: Categories[];\r\n descriptions: Descriptions[];\r\n barcodes: string[];\r\n\r\n //New Feilds\r\n externalId: string;\r\n createdDate: string;\r\n updatedDate: string;\r\n createdBy: string;\r\n updatedBy: string;\r\n attributes: CoreAttribute[];\r\n id: string;\r\n long_description: string;\r\n\r\n // Mixed Sales fields\r\n isWebOrder?: boolean,\r\n fullfilmentId: string,\r\n fullfilmentLocationName?: string,\r\n deliveryMethod?: string,\r\n deliveryGroup?: string,\r\n selectedInventory?: InventoryInfo;\r\n leadTime?: leadTime\r\n}\r\nexport interface leadTime {\r\n type: string,\r\n value: string\r\n}\r\n\r\nexport interface Exchange {\r\n exchangeId: number,\r\n lineItemId: number,\r\n reason: string,\r\n quantity: number,\r\n newItems: Product[];\r\n}\r\n\r\nexport interface Categories {\r\n id: string;\r\n parentId: string;\r\n name: string;\r\n categoryId: string;\r\n status: boolean;\r\n}\r\n\r\nexport interface Descriptions {\r\n name: string;\r\n countryCode: string;\r\n value: string;\r\n}\r\n\r\nexport interface CoreAttribute {\r\n name: string;\r\n value: string;\r\n searchable: boolean;\r\n countryCode: string;\r\n}\r\n\r\n/**\r\n * Basket\r\n */\r\n\r\nexport interface Basket {\r\n subsidiaryId?: string;\r\n products: Product[];\r\n transactionDiscount: any[];\r\n quantity: number;\r\n total: number;\r\n saleTotal: number;\r\n discountTotal?: number;\r\n transactionId?: string;\r\n offlineTransactionId?: string;\r\n baseCurrency: string;\r\n basketTotal?: number;\r\n refundTotal?: number;\r\n transactionPromotion?: TransactionPromotion[];\r\n customer?: any;\r\n exchange?: Exchange[];\r\n inStoreFlag?: boolean\r\n}\r\n\r\n\r\n\r\n/**\r\n * Price\r\n */\r\nexport interface Price {\r\n VAT: number;\r\n VATCode: string;\r\n salesPrice: number;\r\n currencyCode: string;\r\n RRPPrice: number;\r\n}\r\n\r\n/**\r\n * Node structure\r\n */\r\ninterface NodeStructure {\r\n status: boolean;\r\n name: string;\r\n nodeType: string;\r\n isOverride: boolean;\r\n nodeId: string;\r\n parentId: string;\r\n}\r\n\r\n/**\r\n * Line Discount\r\n */\r\nexport interface LineDiscount {\r\n itemLineId: string,\r\n discountAmount: number,\r\n discountType: string,\r\n // reasonCode: string,\r\n name?: string,\r\n unitPrice: number,\r\n discountedLinePrice?: number,\r\n priceManagerOverride?: UserOverride,\r\n priceOverrideReasonCode?: string,\r\n priceOverrideReasonName?: string,\r\n priceOverrideAmount?: number,\r\n percentageDiscountManagerOverride?: UserOverride,\r\n percentageDiscountReasonCode?: string,\r\n percentageDiscountReasonName?: string,\r\n percentageDiscountValue?: number\r\n}\r\n\r\n/**\r\n * User Override\r\n */\r\nexport interface UserOverride {\r\n userId: string,\r\n automaticApprove: string,\r\n originalUserId: string\r\n}\r\n\r\n/**\r\n* line Promotions\r\n*/\r\nexport interface LinePromotions {\r\n\r\n trigger: Trigger[],\r\n itemLineId: number,\r\n promotionId: string,\r\n displayText: string,\r\n promotionType: string,\r\n promotionAmount: number,\r\n name: string,\r\n promotionInfo: string,\r\n promotionLinePrice: number\r\n refunded?: boolean;\r\n}\r\n\r\n/**\r\n* trigger\r\n*/\r\nexport interface Trigger {\r\n itemLineId: string;\r\n quantity?: number;\r\n totalQuantity?: number;\r\n}\r\n\r\n/**\r\n* Transaction Promotion\r\n*/\r\nexport interface TransactionPromotion {\r\n displayText: string;\r\n name: string;\r\n promotionAmount: number;\r\n promotionId: string;\r\n promotionInfo: string;\r\n promotionType: string;\r\n itemLineIds: number[];\r\n\r\n}\r\n\r\nexport interface RefundProductChange {\r\n itemLineId?: number;\r\n refundedQuantity?: number;\r\n refundedPromotionalQuantity?: number;\r\n refundTotal?: number;\r\n refundedReason?: string;\r\n refundedReasonDescription?: string;\r\n refundWithPromotion: boolean;\r\n isLastExchanged?: boolean;\r\n}\r\n\r\nexport interface InventoryInfo {\r\n storeName: string,\r\n storeId: string,\r\n quantityAvailable: number,\r\n quantityRequired: number\r\n}\r\n\r\nexport interface InventoryRequestInfo extends InventoryInfo {\r\n requestedQuantity: number,\r\n requestedAction: DELIVERY_METHODS\r\n}\r\n\r\nexport interface DeliveryInfo {\r\n groups: DeliveryGroupInfo[]\r\n}\r\n\r\nexport interface DeliveryGroupInfo {\r\n groupNumber: number;\r\n items: Product[];\r\n estimate?: Estimate;\r\n}\r\n\r\nexport interface Estimate {\r\n type: string,\r\n value: string\r\n}\r\n\r\nexport interface TransactionDocument {\r\n transactionId?: string;\r\n subsidiaryId?: string;\r\n offlineTransactionId?:string;\r\n transactionRef?: string;\r\n dateTime?: string;\r\n orgCode: string;\r\n storeId: string;\r\n storeNodeId:string;\r\n storeNodeStructure:string;\r\n deviceId: string;\r\n terminalId:string;\r\n initiatingModule :string;\r\n export:boolean;\r\n userId?: string;\r\n userName?:string;\r\n customer?: Customer;\r\n basket: any;\r\n basketSummary: any;\r\n // lineDiscount: LineDiscount[];\r\n baseCurrency: string;\r\n splitPayment?:boolean;\r\n isPaymentCompleted?:boolean;\r\n paymentDetails?: any;\r\n type?: string;\r\n operationStatus?: string;\r\n createdAt?: string;\r\n updatedAt?: string;\r\n transCompletedAt?: string;\r\n id?: string;\r\n saleTotal?: number;\r\n reasonCode?: string;\r\n reasonDescription?: string;\r\n override?: UserOverride;\r\n originalTransId?:string;\r\n originalExternalId?: string;\r\n apiResponse?: APIResponse; // TODO add handler as per export provider\r\n unreferencedRefund?:boolean;\r\n giftedReceipt?:boolean;\r\n currentTransactionDetails?:any;\r\n isChecked?:boolean;\r\n}\r\n\r\nexport interface APIResponse\r\n{\r\n internalId?:number;\r\n tranid?:string\r\n}\r\n\r\nexport interface CurrentTransactionDetails{\r\n products: Product[];\r\n lineDiscount?:LineDiscount[];\r\n linePromotion?:LinePromotions[];\r\n transactionPromotion?:TransactionPromotion[];\r\n transactionDiscount?:TransactionDiscount[];\r\n basketSummary?:BasketSummary; \r\n taxBreakdown?:TaxBreakdown; \r\n totalTaxSummary?:TotalTaxSummary[];\r\n}\r\nexport interface BasketSummary {\r\n totalItems: number;\r\n saleTotal: number;\r\n VATTotal: number;\r\n discountTotal: number;\r\n basketTotal: number;\r\n refundTotal?:number;\r\n}\r\n\r\nexport interface TransactionDiscount{\r\n discountAmount:number;\r\n discountType:String;\r\n reasonCode:string;\r\n override?: UserOverride;\r\n itemLineIds?:number[];\r\n}\r\n\r\nexport interface TBasket {\r\n products: TProduct[];\r\n lineDiscount:LineDiscount[];\r\n exchange:Exchange[];\r\n linePromotion:LinePromotions[];\r\n transactionPromotion?:TransactionPromotion[];\r\n transactionDiscount?:TransactionDiscount[];\r\n taxBreakdown?:TaxBreakdown;\r\n totalTaxSummary?:TotalTaxSummary[];\r\n\r\n \r\n}\r\n\r\nexport interface TExchange{\r\n exchangeId?:number,\r\n lineItemId?: number,\r\n reason?: string,\r\n quantity?: number,\r\n newItems?:TNewItems[];\r\n }\r\n \r\n export interface TNewItems{\r\n lineItemId:number,\r\n Quantity:number\r\n }\r\n\r\nexport interface TProduct {\r\n itemLineId: string;\r\n SKU: string;\r\n description: string;\r\n imageUrls: [string];\r\n price: number;\r\n taxCode?: string;\r\n taxPercent?: string;\r\n quantity: number;\r\n refundedQuantity?: number;\r\n refundedPromotionalQuantity?:number;\r\n refunded?: boolean;\r\n refundedTotal?: number;\r\n refundedReason?:string;\r\n refundedReasonDescription?:string;\r\n selectedRRPPrice?: number;\r\n totalLinePrice: number;\r\n barCode?: string;\r\n barcodes?: string[];\r\n flagged?: boolean;\r\n exchange?:Exchange;\r\n excludePromotion:boolean;\r\n discountable?:boolean;\r\n\r\n itemDiscounts?:ItemDiscounts;\r\n isLastExchanged?: boolean;\r\n\r\n // Mixed Sales fields\r\n fullfilmentId:string,\r\n fullfilmentLocationName:string,\r\n deliveryMethod?:string,\r\n deliveryGroup?:string,\r\n giftCardNumberIssued?: string,\r\n giftCardAmount?: number,\r\n giftCardRecipientEmail?: string,\r\n giftCardExpiryDate?: string ,\r\n giftCardRecipientName?: string,\r\n giftCard?:boolean,\r\n currency?:string,\r\n isWebOrder?:boolean,\r\n leadTime?: leadTime\r\n \r\n // currenttransaction doc changes\r\n lineDiscount?:any\r\n\r\n attributes?:CoreAttribute[];\r\n}\r\n\r\nexport interface ItemDiscounts{\r\n trnDiscountsPortion:number;\r\n trnPromotionsPortion:number;\r\n refundPortion:number;\r\n}\r\n\r\n\r\n\r\nexport interface Customer {\r\n id: string;\r\n title?: string;\r\n firstName: string;\r\n lastName: string;\r\n email: string;\r\n postCode: string;\r\n telephone?: string;\r\n billingAddress?: Address;\r\n shippingAddress?: Address;\r\n addressDetail?: string;\r\n noCustomerSelected?: boolean;\r\n externalId?: string; \r\n \r\n}\r\n\r\nexport interface Address \r\n{\r\n address1?: string;\r\n address2?: string;\r\n address3?: string;\r\n city?: string;\r\n county?: string;\r\n postCode?: string;\r\n country?: string;\r\n }\r\n\r\nexport interface PaymentDetails {\r\n cardNumber?: any;\r\n sqNo?:number;\r\n result?: string;\r\n currency: string;\r\n amount: string;\r\n authcode?: string;\r\n pan?: string;\r\n cardType?: string;\r\n transactionDate?: string;\r\n mid?: string;\r\n tid?: string;\r\n cvm?: string;\r\n hostReferenceId?: string;\r\n aid?: string;\r\n receiptNo?: string;\r\n expirydate?: string;\r\n transactionReference: string;\r\n applicationVersion?: string;\r\n entryMethod?:string;\r\n transactionType:string;\r\n totalamount:string;\r\n paymentType?:string;\r\n}\r\n\r\nexport interface TaxBreakdown\r\n{\r\n taxLines : TaxLine[],\r\n totalTaxableAmount: number;\r\n}\r\n\r\nexport interface TotalTaxSummary{\r\n VATCode:string,\r\n VAT : number;\r\n PreTaxSum: number\r\n TaxSum: number\r\n TXrateSum: number\r\n}\r\n\r\nexport interface TaxLine\r\n{\r\n itemLineId: number,\r\n taxableAmount: number,\r\n taxLineTotal: number,\r\n VAT: number,\r\n VATCode : string,\r\n PreTax: number\r\n}\r\n\r\nexport enum DISCOUNTTYPE {\r\n PERCENT = 'Percent',\r\n AMOUNT = 'AMOUNT'\r\n}","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { DELIVERY_METHODS } from './mapper-library.model';\r\nimport { Basket, DeliveryGroupInfo, DeliveryInfo, Product, TransactionPromotion } from './mapper-library.model';\r\nimport { TransactionDiscount } from './mapper-library.model';\r\nimport { NumberUtilService } from './number-util.service';\r\n\r\nexport class BasketService {\r\n currentBasket: Basket = {\r\n products: [],\r\n transactionDiscount: [],\r\n quantity: 0,\r\n total: 0,\r\n saleTotal: 0,\r\n baseCurrency: ''\r\n };\r\n\r\n private basketSource = new BehaviorSubject<any>(null);\r\n basket = this.basketSource.asObservable();\r\n\r\n private productSource = new BehaviorSubject<any>(null);\r\n product = this.productSource.asObservable();\r\n\r\n private peerSource = new BehaviorSubject<boolean>(false);\r\n peerSync = this.peerSource.asObservable();\r\n\r\n private scanSource = new BehaviorSubject<boolean>(false);\r\n scanner = this.scanSource.asObservable();\r\n\r\n private _isMixedBasketSales: boolean | undefined;\r\n public get isMixedBasketSales(): any {\r\n return this._isMixedBasketSales;\r\n }\r\n public set isMixedBasketSales(v: any) {\r\n this._isMixedBasketSales = v;\r\n }\r\n\r\n\r\n constructor(private numberUtilService: NumberUtilService) { }\r\n\r\n updateBasket(basket: Basket) {\r\n this.currentBasket = basket;\r\n this.isMixedBasketSales = this.filterProductListWithWebOrder(true).length > 0;\r\n this.basketSource.next(basket);\r\n }\r\n\r\n /**\r\n * calculates the total basket value and quantity\r\n * @param null\r\n * @returns void\r\n */\r\n updateBasketTotal(basketDetails: { quantity: number; total: number; products: any; transactionId: any; basketTotal: any; }, basketState: { updateBasket: (arg0: any) => void; }) {\r\n basketDetails.quantity = 0;\r\n basketDetails.total = 0;\r\n for (const p of basketDetails.products) {\r\n basketDetails.quantity = basketDetails.quantity + p.quantity;\r\n basketDetails.total =\r\n this.numberUtilService.trimTo2Decimal(basketDetails.total) +\r\n this.numberUtilService.trimTo2Decimal(p.total);\r\n }\r\n console.log(\r\n \"e:basket :basket service : basketDetails updated values for transaction id\",\r\n basketDetails.transactionId,\r\n JSON.stringify(basketDetails)\r\n );\r\n basketDetails.basketTotal = basketDetails.total;\r\n basketState.updateBasket(basketDetails);\r\n }\r\n\r\n /**\r\n * add Line promotion\r\n * @param null\r\n * @returns basketDetails\r\n */\r\n addlinePromotion(promotionList: { result: { linePromotions: string | any[]; }; }, basketDetails: { products: any; }) {\r\n console.log(\r\n \"e:basket :basket Service : promotionList and basketDetails for linePromotions\",\r\n JSON.stringify(promotionList),\r\n JSON.stringify(basketDetails)\r\n );\r\n if (\r\n promotionList &&\r\n promotionList.result &&\r\n promotionList.result.linePromotions &&\r\n promotionList.result.linePromotions.length > 0\r\n ) {\r\n for (var element of basketDetails.products) {\r\n for (var promotionelement of promotionList.result.linePromotions) {\r\n if (\r\n element.itemLineId.toString() ===\r\n promotionelement.itemLineId.toString()\r\n ) {\r\n element.linePromotions = promotionelement;\r\n }\r\n }\r\n }\r\n }\r\n return basketDetails;\r\n }\r\n\r\n /**\r\n * add Transaction promotion\r\n * @param null\r\n * @returns basketDetails\r\n */\r\n\r\n addTransactionPromotion(promotionList: { result: { transactionPromotion: any }; }, basketdetails: Basket) {\r\n console.log(\r\n \"e:basket :basket Service : promotionList and basketDetails for transactionPromotion\",\r\n JSON.stringify(promotionList),\r\n JSON.stringify(basketdetails),\r\n JSON.stringify(basketdetails.transactionPromotion)\r\n );\r\n if (\r\n promotionList &&\r\n promotionList.result &&\r\n promotionList.result.transactionPromotion &&\r\n promotionList.result.transactionPromotion.length > 0\r\n ) {\r\n promotionList.result.transactionPromotion.forEach((tPromotion: any) => {\r\n let transactionPromotionEntryUpdated: any = Object.assign(\r\n {},\r\n tPromotion\r\n );\r\n\r\n transactionPromotionEntryUpdated.itemLineIds = basketdetails.products.map(\r\n (product) => {\r\n return product.itemLineId;\r\n }\r\n );\r\n\r\n if (!basketdetails.transactionPromotion) {\r\n basketdetails.transactionPromotion = [];\r\n }\r\n basketdetails.transactionPromotion.push(\r\n transactionPromotionEntryUpdated\r\n );\r\n\r\n basketdetails = this.transactionPromotionProductPortionCalc(\r\n basketdetails,\r\n transactionPromotionEntryUpdated\r\n );\r\n });\r\n }\r\n console.log(\r\n \"basket details in refund calculation file\",\r\n JSON.stringify(basketdetails)\r\n );\r\n return basketdetails;\r\n }\r\n\r\n updateProductTotalForSummary(basketDetails: { total: string | number; quantity: string | number; products: any; }) {\r\n /*sale- product refundedQuantity = undefined\r\n partial refund - product refundedQuantity is > 0\r\n total refund - proudct refundedQuantity is > 0\r\n exchange - exchange product refundedQuantity is > 0 \r\n new product refundedQuantity = undefined \r\n old product without exchange refundedQuantity = 0\r\n unreference refund-product refundedQuantity is > 0 */\r\n\r\n basketDetails.total = 0;\r\n basketDetails.quantity = 0;\r\n for (var product of basketDetails.products) {\r\n if (product.linePromotions) {\r\n product.total = product.linePromotions.promotionLinePrice;\r\n } else if (product.lineDiscount && !product.linePromotions) {\r\n product.total = product.lineDiscount.discountedLinePrice;\r\n } else {\r\n product.total = product.totalLinePrice;\r\n }\r\n product.total =\r\n product.total -\r\n Math.abs(product.refundedTotal ? product.refundedTotal : 0);\r\n\r\n basketDetails.total += product.total;\r\n basketDetails.quantity =\r\n basketDetails.quantity +\r\n (product.quantity -\r\n (product.refundedQuantity ? product.refundedQuantity : 0));\r\n console.log(\r\n \"e-basket:ExchangeSummaryScreen:update basketdetails total :\" +\r\n basketDetails.total +\r\n \" Product line ID : \" +\r\n product.itemLineId +\r\n \" product total : \" +\r\n product.total,\r\n \"quantity : \" + basketDetails.quantity\r\n );\r\n }\r\n return this.updateBasketTotalForSummary(basketDetails);\r\n }\r\n\r\n updateBasketTotalForSummary(basketDetails: any) {\r\n basketDetails.basketTotal = basketDetails.total;\r\n console.info(\r\n \"ebasket : basket Service : update Basket Total for transaction transactionDiscount \",\r\n JSON.stringify(basketDetails.transactionDiscount)\r\n );\r\n\r\n console.info(\r\n \"ebasket : basket Service : update Basket Total for transaction transactionPromotion \",\r\n JSON.stringify(basketDetails.transactionPromotion)\r\n );\r\n\r\n basketDetails = this.updateTransactionPromotion(basketDetails);\r\n basketDetails = this.updateTransactionDiscount(basketDetails);\r\n basketDetails.basketTotal = Number(basketDetails.basketTotal.toFixed(2));\r\n\r\n console.info(\r\n \"ebasket : basket Service : update Basket Total: basketTotal after promotion applied for basketTotal\",\r\n basketDetails.basketTotal\r\n );\r\n return basketDetails;\r\n }\r\n\r\n updateTransactionDiscount(basketDetails: { transactionDiscount: any[]; basketTotal: number; }) {\r\n if (\r\n basketDetails.transactionDiscount &&\r\n basketDetails.transactionDiscount.length > 0\r\n ) {\r\n const discountTotal = basketDetails.transactionDiscount.reduce(\r\n (n: any, { discountAmount }: any) => n + discountAmount,\r\n 0\r\n );\r\n console.log(\"ebasket : basket Service : discountTotal \", discountTotal);\r\n basketDetails.basketTotal =\r\n basketDetails.basketTotal - Math.abs(discountTotal);\r\n }\r\n return basketDetails;\r\n }\r\n\r\n updateTransactionPromotion(basketDetails: { transactionPromotion: any[]; basketTotal: number; }) {\r\n if (\r\n basketDetails.transactionPromotion &&\r\n basketDetails.transactionPromotion.length > 0\r\n ) {\r\n const discountTotal = basketDetails.transactionPromotion.reduce(\r\n (n: any, { promotionAmount }: any) => n + promotionAmount,\r\n 0\r\n );\r\n basketDetails.basketTotal =\r\n basketDetails.basketTotal - Math.abs(discountTotal);\r\n }\r\n return basketDetails;\r\n }\r\n\r\n updateBasketTotalWithoutDiscount(basket: Basket): Basket {\r\n basket.total = 0;\r\n basket.quantity = 0;\r\n\r\n for (var product of basket.products) {\r\n if (product.linePromotions) {\r\n product.total = product.linePromotions.promotionLinePrice;\r\n } else if (product.lineDiscount && !product.linePromotions) {\r\n product.total = product.lineDiscount.discountedLinePrice || 0;\r\n } else {\r\n product.total = product.totalLinePrice;\r\n }\r\n\r\n product.total =\r\n product.total -\r\n Math.abs(product.refundedTotal ? product.refundedTotal : 0);\r\n basket.total += product.total;\r\n basket.quantity =\r\n basket.quantity +\r\n (product.quantity -\r\n (product.refundedQuantity ? product.refundedQuantity : 0));\r\n\r\n console.log(\r\n \"e-basket:basket service:update basketdetails total :\" +\r\n JSON.stringify(basket) +\r\n basket.total +\r\n \" Product line ID : \" +\r\n product.itemLineId +\r\n \" product total : \" +\r\n product.total\r\n );\r\n }\r\n\r\n basket.basketTotal = basket.total;\r\n return basket;\r\n }\r\n\r\n updateBasketTotalWithDiscounts(basket: any): Basket {\r\n console.log(\r\n \"e:basket :RefundBasketScreen : this.basketDetails new values\",\r\n basket,\r\n JSON.stringify(basket.basketTotal)\r\n );\r\n if (basket.transactionPromotion && basket.transactionPromotion.length > 0) {\r\n const discountTotal = basket.transactionPromotion.reduce(\r\n (n: any, { promotionAmount }: any) => n + promotionAmount,\r\n 0\r\n );\r\n basket.basketTotal = basket.basketTotal - discountTotal;\r\n }\r\n if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {\r\n const discountTotal = basket.transactionDiscount.reduce(\r\n (n: any, { discountAmount }: any) => n + discountAmount,\r\n 0\r\n );\r\n\r\n basket.basketTotal = basket.basketTotal - discountTotal;\r\n }\r\n console.log(\r\n \"e:basket :RefundBasketScreen : basket new values\",\r\n JSON.stringify(basket)\r\n );\r\n\r\n return basket;\r\n }\r\n\r\n transactionDiscountAndPromotionProductortionCalculation(basket: Basket) {\r\n if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {\r\n basket.transactionDiscount.forEach(\r\n (discount) =>\r\n (basket = this.transactionDiscountProductPortionCalc(\r\n basket,\r\n discount\r\n ))\r\n );\r\n }\r\n\r\n if (basket.transactionPromotion && basket.transactionPromotion.length > 0) {\r\n basket.transactionPromotion.forEach((promotion) => {\r\n basket = this.transactionPromotionProductPortionCalc(basket, promotion);\r\n });\r\n }\r\n console.log(\r\n \"ebasket: basket item discount protion calculation\",\r\n basket,\r\n basket.products\r\n );\r\n return basket;\r\n }\r\n\r\n transactionPromotionProductPortionCalc(\r\n basket: any,\r\n promotion: any\r\n ) {\r\n let total = 0;\r\n let percentage = 0;\r\n {\r\n basket.products.forEach((p:any) => {\r\n if (promotion.itemLineIds.includes(p.itemLineId)) {\r\n p = this.validateProductItemDiscount(p);\r\n const productContributionInTotal =\r\n this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnDiscountsPortion) +\r\n this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnPromotionsPortion) -\r\n this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.refundPortion);\r\n total += (p.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal));\r\n }\r\n });\r\n console.log(\r\n `ebasket: trnsactionPromotion: ${JSON.stringify(\r\n promotion\r\n )}, selected products total: ${total}`\r\n );\r\n basket.products.forEach((product: any) => {\r\n product = this.validateProductItemDiscount(product);\r\n\r\n const productContributionInTotal =\r\n this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion) +\r\n this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion) -\r\n this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.refundPortion);\r\n\r\n if (promotion.itemLineIds.includes(product.itemLineId)) {\r\n percentage = ((product.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal)) / total) * 100;\r\n product.itemDiscounts.trnPromotionsPortion +=\r\n (promotion.promotionAmount * percentage) / 100;\r\n product.itemDiscounts.trnPromotionsPortion = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion);\r\n }\r\n });\r\n }\r\n return basket;\r\n }\r\n\r\n transactionDiscountProductPortionCalc(\r\n basket: any,\r\n discount: any\r\n ) {\r\n let total = 0;\r\n let percentage = 0;\r\n\r\n basket.products.forEach((p: any) => {\r\n if (discount.itemLineIds.includes(p.itemLineId)) {\r\n p = this.validateProductItemDiscount(p);\r\n const productContributionInTotal =\r\n this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnDiscountsPortion) +\r\n this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnPromotionsPortion) -\r\n this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.refundPortion);\r\n\r\n\r\n total += (p.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal));\r\n }\r\n });\r\n\r\n console.log(\r\n `ebasket: trnsactionDiscount: ${JSON.stringify(\r\n discount\r\n )}, selected products total: ${total}`\r\n );\r\n\r\n basket.products.forEach((product:any) => {\r\n product = this.validateProductItemDiscount(product);\r\n console.log(product.discountable, \"ebasket : basket service : discountable in basket service\");\r\n\r\n const productContributionInTotal =\r\n this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion) +\r\n this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion) -\r\n this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.refundPortion);\r\n\r\n if (discount.itemLineIds.includes(product.itemLineId) && product.discountable == true) {\r\n percentage = ((product.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal)) / total) * 100;\r\n product.itemDiscounts.trnDiscountsPortion +=\r\n (discount.discountAmount * percentage) / 100;\r\n product.itemDiscounts.trnDiscountsPortion = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion)\r\n }\r\n });\r\n return basket;\r\n }\r\n\r\n public validateProductItemDiscount(product: Product) {\r\n if (!product.itemDiscounts) {\r\n product.itemDiscounts = {\r\n trnDiscountsPortion: 0,\r\n trnPromotionsPortion: 0,\r\n refundPortion: 0,\r\n };\r\n }\r\n return product;\r\n }\r\n\r\n markProduct(product: Product) {\r\n this.productSource.next(product);\r\n }\r\n stopPeerSyncProcess(peerSync: boolean) {\r\n this.peerSource.next(peerSync);\r\n }\r\n\r\n scanStart(isScanning: boolean) {\r\n this.scanSource.next(isScanning);\r\n }\r\n\r\n promotionRemainingCalculation(promotion: TransactionPromotion[]) {\r\n var promotionValue = 0;\r\n promotion.forEach((element) => {\r\n promotionValue += element.promotionAmount;\r\n });\r\n return promotionValue;\r\n }\r\n\r\n discountRemainingCalculation(discount: TransactionDiscount[]) {\r\n var discountValue = 0;\r\n discount.forEach((element) => {\r\n discountValue += element.discountAmount;\r\n });\r\n return discountValue;\r\n }\r\n\r\n discountRefundedCalculation(discount: TransactionDiscount[]) {\r\n var discountValue = 0;\r\n discount.forEach((element) => {\r\n if (element.discountAmount < 0) {\r\n discountValue += element.discountAmount;\r\n }\r\n });\r\n return discountValue;\r\n }\r\n\r\n generateNewItemLineId(products: Product[]) {\r\n let largestNumber: any = 0;\r\n\r\n if (products.length > 0) {\r\n let itemLineIdArray = products.map((product) => {\r\n return product.itemLineId;\r\n });\r\n\r\n largestNumber = itemLineIdArray.reduce((a :any, b:any) => Math.max(a, b));\r\n }\r\n\r\n return largestNumber + 1;\r\n }\r\n\r\n updateBasketProductDataAsPerQuantity(\r\n product: any,\r\n quantity: number\r\n ): Product {\r\n\r\n console.log(`ebasket: updateBasketProductDataAsPerQuantity : ${quantity} product: ${JSON.stringify(product)}`);\r\n product.quantity = quantity;\r\n if (product.hasOwnProperty(\"lineDiscount\")) {\r\n // && this.product.quantity !== this.productDetailForm.controls.quantity.value\r\n product.lineDiscount.discountedLinePrice = Number(\r\n this.numberUtilService.getFlooredFixed(\r\n product.lineDiscount.unitPrice * quantity,\r\n 2\r\n )\r\n );\r\n product.lineDiscount.discountAmount =\r\n product.totalLinePrice - product.lineDiscount.discountedLinePrice;\r\n } else {\r\n product.totalLinePrice =\r\n quantity * this.numberUtilService.trimTo2Decimal(product.selectedPrice);\r\n }\r\n if (product.lineDiscount) {\r\n product.total = product.lineDiscount.discountedLinePrice;\r\n } else {\r\n product.total = product.totalLinePrice;\r\n }\r\n console.log(`ebasket: updateBasketProductDataAsPerQuantity : ${quantity} product: ${JSON.stringify(product)}`);\r\n\r\n return product;\r\n }\r\n\r\n filterProductListWithWebOrder(isWebOrder: boolean): Product[] {\r\n console.log(\"ebasket: filterProductListWithWebOrder hit\", JSON.stringify(this.currentBasket.products));\r\n if (isWebOrder)\r\n return this.currentBasket.products.filter((x) => x.isWebOrder);\r\n else {\r\n return this.currentBasket.products.filter((x) => !x.isWebOrder);\r\n }\r\n }\r\n\r\n filterProductListWithDelivery(): Product[] {\r\n console.log(\"ebasket: filterProductListWithDelivery hit\", JSON.stringify(this.currentBasket.products));\r\n return this.currentBasket.products.filter((x) => x.deliveryMethod === DELIVERY_METHODS.DELIVERY.toString());\r\n }\r\n\r\n filterProductListWithDeliveryGroup(group: string, products: Product[]): Product[] {\r\n console.log(\"ebasket: filterProductListWithDeliveryGroup hit\", JSON.stringify(products));\r\n return products.filter((x) => x.deliveryGroup === group);\r\n }\r\n\r\n generateNewDeliveryGroupNumber(products: Product[]) {\r\n let largestNumber = 0;\r\n\r\n if (products.length > 0) {\r\n let deliveryGroupArr = products.map((product) => {\r\n if (product.deliveryGroup) {\r\n return parseInt(product.deliveryGroup);\r\n }\r\n return 0;\r\n });\r\n\r\n largestNumber = deliveryGroupArr.reduce((a, b) => Math.max(a, b));\r\n }\r\n\r\n return (largestNumber + 1).toString();\r\n }\r\n\r\n getDeliveryGroupNumbers(products: Product[]) {\r\n console.log(\"getDeliveryGroupNumbers initiating : \", JSON.stringify(products));\r\n\r\n let uniqueAndsortedResult: number[] = [];\r\n\r\n if (products.length > 0) {\r\n let deliveryGroupArr = products.map((product) => {\r\n if (product.deliveryGroup) {\r\n return parseInt(product.deliveryGroup);\r\n }\r\n else if (product.deliveryMethod === \"1\") {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n\r\n uniqueAndsortedResult = Array.from(new Set(deliveryGroupArr)).sort((a, b) => a - b);\r\n console.log(\"getDeliveryGroupNumbers : \", JSON.stringify(uniqueAndsortedResult));\r\n }\r\n return uniqueAndsortedResult;\r\n }\r\n\r\n updateProductsWithNewDeliveryGroupNumber(products: Product[]) {\r\n console.log(\"updateProductsWithNewDeliveryGroupNumber initiating : \", JSON.stringify(products));\r\n\r\n let newGroupNumber = this.generateNewDeliveryGroupNumber(this.currentBasket.products);\r\n if (products.length > 0) {\r\n this.currentBasket.products.forEach(cBProducts => {\r\n products.forEach(element => {\r\n if (cBProducts.itemLineId === element.itemLineId) {\r\n cBProducts.deliveryGroup = newGroupNumber;\r\n }\r\n\r\n });\r\n });\r\n\r\n }\r\n\r\n this.updateBasket(this.currentBasket);\r\n return;\r\n }\r\n\r\n calculateEstimatedTime(products: any[]) {\r\n try {\r\n let time;\r\n let estmatedTime: number = 0;\r\n let estimatedDays: string = \"Hours\";\r\n products.forEach((element: { leadTime: { type: string; value: any; }; }) => {\r\n\r\n if (element.leadTime.type.toLocaleLowerCase() === \"weeks\") {\r\n time = Number(element.leadTime.value) * 24 * 7;\r\n estmatedTime = Math.max(estmatedTime, time);\r\n estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays\r\n console.log(\"week\", estmatedTime, estimatedDays);\r\n\r\n } else if (element.leadTime.type.toLocaleLowerCase() === \"days\") {\r\n time = Number(element.leadTime.value) * 24;\r\n estmatedTime = Math.max(estmatedTime, time);\r\n estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays\r\n\r\n console.log(\"days\", estmatedTime, estimatedDays);\r\n\r\n }\r\n else if (element.leadTime.type.toLocaleLowerCase() === \"months\") {\r\n time = Number(element.leadTime.value) * 24 * 30;\r\n estmatedTime = Math.max(estmatedTime, time);\r\n estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays\r\n\r\n console.log(\"months\", estmatedTime, estimatedDays);\r\n\r\n }\r\n else if (element.leadTime.type.toLocaleLowerCase() === \"years\") {\r\n time = Number(element.leadTime.value) * 24 * 365;\r\n estmatedTime = Math.max(estmatedTime, time);\r\n estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays\r\n\r\n console.log(\"years\", estmatedTime, estimatedDays);\r\n\r\n } else {\r\n time = Number(element.leadTime.value);\r\n estmatedTime = Math.max(estmatedTime, time);\r\n estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;\r\n console.log(\"hours\", estmatedTime, estimatedDays);\r\n\r\n }\r\n });\r\n\r\n if (estimatedDays.toLocaleLowerCase() === \"days\") {\r\n estmatedTime = estmatedTime / 24;\r\n } else if (estimatedDays.toLocaleLowerCase() === \"weeks\") {\r\n estmatedTime = estmatedTime / (24 * 7);\r\n } else if (estimatedDays.toLocaleLowerCase() === \"months\") {\r\n estmatedTime = estmatedTime / (24 * 30);\r\n } else if (estimatedDays.toLocaleLowerCase() === \"years\") {\r\n estmatedTime = estmatedTime / (24 * 365);\r\n }\r\n\r\n let estimate = {\r\n value: estmatedTime.toString(),\r\n type: estimatedDays\r\n }\r\n return estimate;\r\n } catch (error) {\r\n console.log(\"error in calculateEstimatedTime\", error);\r\n }\r\n return 0;\r\n }\r\n\r\n updateProductsWithDeliveryGroupNumber(oldGroup: string, newGroup: string) {\r\n console.log(\"updateProductsWithDeliveryGroupNumber initiating\");\r\n\r\n this.currentBasket.products.forEach(cBProducts => {\r\n if (cBProducts.deliveryGroup === oldGroup) {\r\n cBProducts.deliveryGroup = newGroup;\r\n }\r\n\r\n });\r\n\r\n this.updateBasket(this.currentBasket);\r\n return;\r\n }\r\n\r\n getDeliveryInfo(): any {\r\n console.log(\"getDeliveryGroupInfor initiating\");\r\n try {\r\n let groupInfo: DeliveryInfo = {\r\n groups: []\r\n }\r\n\r\n this.getDeliveryGroupNumbers(this.currentBasket.products).forEach((groupNumber) => {\r\n let group: any = {\r\n groupNumber: groupNumber,\r\n items: [],\r\n estimate: {\r\n type: \"Hours\",\r\n value: \"0\"\r\n }\r\n }\r\n this.currentBasket.products.forEach(cBProducts => {\r\n if (cBProducts.deliveryGroup === groupNumber.toString()) {\r\n group.items.push(cBProducts);\r\n }\r\n });\r\n\r\n group.estimate = this.calculateEstimatedTime(group.items);\r\n\r\n groupInfo.groups.push(group);\r\n\r\n });\r\n\r\n return groupInfo;\r\n }\r\n catch (error) {\r\n console.log(\"error\", error);\r\n }\r\n }\r\n}\r\n","import { CurrencyPipe } from \"@angular/common\";\r\nimport { Injectable } from \"@angular/core\";\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class NumberUtilService {\r\n constructor( private cp: CurrencyPipe) {}\r\n\r\n trimTo2Decimal(no: any) {\r\n //return Math.floor(no * 100) / 100;\r\n return no;\r\n }\r\n\r\n trimTo2Decimal2(no: number) {\r\n return Number(this.getFlooredFixed(no,2));\r\n }\r\n\r\n getFlooredFixed(v:any, d:any) {\r\n return (Math.floor(v * Math.pow(10, d)) / Math.pow(10, d)).toFixed(d);\r\n }\r\n\r\n AppendWithCurrencySymbol(numValue: any, currencyCode: string): string {\r\n let returnValue: any = \"\";\r\n if (numValue) {\r\n const numb: number = parseFloat(numValue.toString().replace(',',''));\r\n returnValue = this.cp.transform(\r\n Number(numValue).toFixed(2),\r\n currencyCode.toLocaleUpperCase(),\r\n \"symbol\"\r\n );\r\n console.log(\"AppendWithCurrencySymbol :\" + returnValue);\r\n } else {\r\n returnValue = this.cp.transform(\r\n \"0.00\",\r\n currencyCode.toLocaleUpperCase(),\r\n \"symbol\"\r\n );\r\n }\r\n return returnValue;\r\n }\r\n}\r\n","import { CurrencyPipe } from \"@angular/common\";\r\nimport { BasketSummary, CurrentTransactionDetails, Customer, DELIVERY_METHODS, ItemDiscounts, TaxBreakdown, TaxLine, TBasket, TotalTaxSummary, TProduct, TransactionDocument } from \"./mapper-library.model\";\r\nimport { TRANSACTION_TYPE, Basket, LineDiscount, LinePromotions, Product, UserOverride } from \"./mapper-library.model\";\r\nimport { BasketService } from \"./basket.service\";\r\nimport { NumberUtilService } from \"./number-util.service\";\r\n\r\n/**\r\n * Transaction document builder\r\n */\r\nexport class TransactionDocumentBuilder {\r\n private transactionDocument: TransactionDocument;\r\n private numberUtilService: NumberUtilService;\r\n private storeInfo : any;\r\n \r\n constructor(\r\n transactionDoc?: TransactionDocument,\r\n private currencyPipe?: CurrencyPipe,\r\n private basketService?: BasketService | any,\r\n ) {\r\n this.numberUtilService = new NumberUtilService(currencyPipe);\r\n this.basketService = new BasketService(this.numberUtilService);\r\n this.storeInfo = JSON.parse(localStorage.getItem('storeInfo') || '{}');\r\n if (transactionDoc) {\r\n this.transactionDocument = transactionDoc;\r\n } else {\r\n this.transactionDocument = {\r\n transactionId: \"\",\r\n offlineTransactionId: \"\",\r\n transactionRef: \"\",\r\n dateTime: \"\",\r\n orgCode: \"\",\r\n storeId: \"\",\r\n storeNodeId: \"\",\r\n storeNodeStructure: \"\",\r\n deviceId: \"\",\r\n terminalId: \"\",\r\n userId: \"\",\r\n initiatingModule : \"eBasket\",\r\n export: false,\r\n basket: {} as TBasket,\r\n basketSummary: {} as BasketSummary,\r\n baseCurrency: \"\",\r\n type: \"\",\r\n operationStatus: \"\",\r\n createdAt: \"\",\r\n updatedAt: \"\",\r\n id: \"\",\r\n currentTransactionDetails: {} as CurrentTransactionDetails,\r\n saleTotal: 0,\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Transactions ref\r\n * @returns ref\r\n */\r\n transactionRef(): TransactionDocumentBuilder {\r\n const storeDetails = JSON.parse(localStorage.getItem('storeInfo') || '{}');\r\n const date = new Date();\r\n const random = (((1 + Math.random()) * 0x10000) | 0)\r\n .toString(16)\r\n .substring(1);\r\n this.transactionDocument.transactionRef =\r\n storeDetails.orgCode + storeDetails.storeId + date.toISOString() + random;\r\n console.log(\"ebasket: transaction ref created\", this.transactionDocument.transactionRef)\r\n return this;\r\n }\r\n\r\n /**\r\n * Transactions id\r\n * @param transactionID\r\n * @returns id\r\n */\r\n transactionId(transactionID: string, isOnline: boolean = true): TransactionDocumentBuilder {\r\n if (isOnline) {\r\n this.transactionDocument.transactionId = transactionID;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Transactions id\r\n * @param transactionID\r\n * @returns id\r\n */\r\n offlineTransactionId(transactionID: string, isOnline: any): TransactionDocumentBuilder {\r\n if (!isOnline) {\r\n this.transactionDocument.offlineTransactionId = transactionID;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * storeNode Id\r\n * @param storeNodeId\r\n * @returns id\r\n */\r\n storeNodeId(storeNodeId: string): TransactionDocumentBuilder {\r\n this.transactionDocument.storeNodeId = storeNodeId;\r\n return this;\r\n }\r\n\r\n /**\r\n* storeNode structure\r\n* @param storeNodeStructure\r\n* @returns id\r\n*/\r\n storeNodeStructure(storeNodeStructure: string): TransactionDocumentBuilder {\r\n this.transactionDocument.storeNodeStructure = storeNodeStructure;\r\n return this;\r\n }\r\n\r\n /**\r\n * Orgs code\r\n * @param orgCode\r\n * @returns code\r\n */\r\n orgCode(orgCode: any): TransactionDocumentBuilder {\r\n this.transactionDocument.orgCode = orgCode;\r\n return this;\r\n }\r\n /**\r\n * Stores id\r\n * @param storeId\r\n * @returns id\r\n */\r\n storeId(storeId: any): TransactionDocumentBuilder {\r\n this.transactionDocument.storeId = storeId;\r\n return this;\r\n }\r\n /**\r\n * Dates time\r\n * @returns time\r\n */\r\n dateTime(): TransactionDocumentBuilder {\r\n const date = new Date();\r\n this.transactionDocument.dateTime = date.toISOString();\r\n return this;\r\n }\r\n /**\r\n * Devices id\r\n * @param deviceId\r\n * @returns id\r\n */\r\n deviceId(deviceId: any): TransactionDocumentBuilder {\r\n this.transactionDocument.deviceId = deviceId;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * terminal id\r\n * @param terminalId\r\n * @returns id\r\n */\r\n terminalId(terminalId: any): TransactionDocumentBuilder {\r\n this.transactionDocument.terminalId = terminalId;\r\n return this;\r\n }\r\n\r\n\r\n\r\n\r\n\r\n /**\r\n * saleExport\r\n * @param saleExport\r\n * @returns id\r\n */\r\n export(saleExport: any): TransactionDocumentBuilder {\r\n this.transactionDocument.export = saleExport;\r\n return this;\r\n }\r\n\r\n\r\n\r\n /* customer(): TransactionDocumentBuilder {\r\n const user = JSON.parse(localStorage.getItem('userDetails'));\r\n this.transactionDocument.customer = user;\r\n return this;\r\n } */\r\n /**\r\n * Baskets transaction document builder\r\n * @param basketDetails\r\n * @returns basket\r\n */\r\n basket(basketDetails: Basket): TransactionDocumentBuilder {\r\n console.log(\"ebasket: basket details update in transaction document\", JSON.stringify(basketDetails));\r\n\r\n this.transactionDocument.subsidiaryId = basketDetails.subsidiaryId || (localStorage.getItem('subsidiaryId') || '');\r\n this.transactionDocument.basket.products = [] as TProduct[];\r\n this.transactionDocument.basket.lineDiscount = [];\r\n this.transactionDocument.basket.linePromotion = [];\r\n this.transactionDocument.basket.transactionPromotion = [];\r\n basketDetails.products.forEach((product: any, index) => {\r\n const p = {} as TProduct;\r\n p.itemDiscounts = {} as ItemDiscounts;\r\n p.SKU = product.SKU;\r\n p.excludePromotion = product.excludePromotion;\r\n p.barCode = product.barcode;\r\n p.barcodes = product.barcodes;\r\n p.description = product.description;\r\n p.itemLineId = product.itemLineId ? product.itemLineId.toString() : \"\" + (index + 1);\r\n p.price = product.selectedPrice;\r\n p.quantity = product.quantity;\r\n p.totalLinePrice = product.quantity * product.selectedPrice;\r\n p.imageUrls = product.imageUrls;\r\n p.selectedRRPPrice = product.selectedRRPPrice;\r\n\r\n //inventory fields\r\n \r\n p.fullfilmentId = product.fullfilmentId? product.fullfilmentId: this.storeInfo.storeId;\r\n\r\n p.fullfilmentLocationName = product.fullfilmentLocationName;\r\n p.deliveryGroup = product.deliveryGroup;\r\n p.leadTime = product.leadTime;\r\n p.deliveryMethod = product.deliveryMethod;\r\n\r\n p.giftCard = product.giftCard;\r\n p.giftCardExpiryDate = product.giftCardExpiryDate;\r\n p.giftCardNumberIssued = product.giftCardNumberIssued;\r\n p.giftCardRecipientEmail = product.giftCardRecipientEmail;\r\n p.giftCardRecipientName = product.giftCardRecipientName;\r\n\r\n if (product.refundedQuantity > 0) {\r\n p.refundedQuantity = product.refundedQuantity;\r\n p.refundedPromotionalQuantity = product.refundPromotionalQuantity;\r\n p.refunded = product.refunded;\r\n p.refundedReasonDescription = product.refundedReasonDescription;\r\n p.refundedReason = product.refundedReason;\r\n if (!p.refundedReasonDescription) {\r\n p.refundedReasonDescription = p.refundedReason;\r\n }\r\n p.refundedTotal = product.refundedTotal;\r\n p.isLastExchanged = product.isLastExchanged;\r\n }\r\n\r\n if (product.exchange) {\r\n p.exchange = product.exchange;\r\n }\r\n if (product.lineDiscount) {\r\n p.lineDiscount = product.lineDiscount;\r\n }\r\n p.itemDiscounts = product.itemDiscounts as ItemDiscounts;\r\n this.transactionDocument.basket.products.push(p);\r\n this.lineDiscount(basketDetails);\r\n });\r\n console.info(\"ebasket: transactiondocument basket details updated\", JSON.stringify(this.transactionDocument.basket));\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * current transaction Details Total(New Products)\r\n * @returns currentTransactionDetails\r\n */\r\n\r\n currentTransactionDetails(basket: Basket): TransactionDocumentBuilder {\r\n console.log(\"ebasket: current transaction details for exchanges\", basket);\r\n this.transactionDocument.currentTransactionDetails.products = [] as Product[];\r\n this.transactionDocument.currentTransactionDetails.linePromotion = [] as LinePromotions[];\r\n this.transactionDocument.currentTransactionDetails.lineDiscount = [] as LineDiscount[];\r\n this.transactionDocument.currentTransactionDetails.transactionDiscount = [];\r\n this.transactionDocument.currentTransactionDetails.products = basket.products;\r\n this.transactionDocument.currentTransactionDetails.products = this.transactionDocument.currentTransactionDetails.products.filter(\r\n ( proj: { refundedQuantity: number; }) => proj.refundedQuantity != 0\r\n );\r\n\r\n this.transactionDocument.currentTransactionDetails.products.forEach((product: { refundedQuantity: any; quantity: any; totalLinePrice: number; refundedTotal: number; total: any; refunded: boolean; linePromotions: any; lineDiscount: any; }) => {\r\n if (product.refundedQuantity) {\r\n product.quantity = product.refundedQuantity;\r\n // updating total line price with actual price to be refunded including the refunding qty\r\n product.totalLinePrice = Math.abs(product.refundedTotal);\r\n product.total = product.totalLinePrice;\r\n if (product.quantity === product.refundedQuantity) {\r\n product.refunded = true;\r\n }\r\n }\r\n //Updating line promotions and line discounts \r\n if (product.linePromotions && !product.refundedQuantity) {\r\n this.transactionDocument.currentTransactionDetails.linePromotion.push(product.linePromotions)\r\n }\r\n if (product.lineDiscount && !product.refundedQuantity) {\r\n this.transactionDocument.currentTransactionDetails.lineDiscount.push(product.lineDiscount)\r\n }\r\n });\r\n\r\n console.log(\"ebasket: current transaction details after removing old products\", this.transactionDocument.currentTransactionDetails.products);\r\n\r\n if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {\r\n this.transactionDocument.currentTransactionDetails.transactionDiscount.push(...basket.transactionDiscount);\r\n }\r\n this.transactionDocument.currentTransactionDetails.basketSummary = {} as BasketSummary;\r\n\r\n this.transactionDocument.currentTransactionDetails.basketSummary.saleTotal = this.numberUtilService.trimTo2Decimal2(this.updateSaleTotal(this.transactionDocument.currentTransactionDetails));\r\n this.transactionDocument.currentTransactionDetails.basketSummary.totalItems = basket.quantity;\r\n\r\n\r\n this.transactionDocument.currentTransactionDetails.basketSummary.basketTotal = basket.basketTotal;\r\n this.transactionDocument.currentTransactionDetails.basketSummary.refundTotal = this.updateCurrentTransactionDetailsRefundTotal();\r\n // For partial refund discount is updatied in total line price so discountTotal will always be zero & in case of exchange discount total is calculated\r\n\r\n if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_EXCHANGE) {\r\n this.transactionDocument.currentTransactionDetails.basketSummary.discountTotal = this.numberUtilService.trimTo2Decimal2(this.updateCurrentTransactionDetailsDiscountTotal());\r\n } else {\r\n if (this.transactionDocument.currentTransactionDetails.transactionDiscount && this.transactionDocument.currentTransactionDetails.transactionDiscount.length > 0) {\r\n let discountTotal = 0;\r\n this.transactionDocument.currentTransactionDetails.transactionDiscount.forEach((discount: { discountAmount: number; }) => {\r\n discountTotal += discount.discountAmount;\r\n });\r\n this.transactionDocument.currentTransactionDetails.basketSummary.discountTotal = Math.abs(discountTotal);\r\n } else {\r\n this.transactionDocument.currentTransactionDetails.basketSummary.discountTotal = 0;\r\n }\r\n }\r\n\r\n console.log(\"ebasket:this.transactionDocument.currentTransactionDetails\", JSON.stringify(this.transactionDocument.currentTransactionDetails));\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * current transaction Tax Total\r\n * @returns Tax Total\r\n */\r\n\r\n updateCurrentTransactionDetailsTaxBreakdown(basketDetails: Basket): TransactionDocumentBuilder {\r\n let transactionDiscountTotal = 0;\r\n let taxBreakdown: TaxBreakdown = {\r\n taxLines: [],\r\n totalTaxableAmount: 0,\r\n };\r\n\r\n if (this.transactionDocument.currentTransactionDetails.transactionDiscount && this.transactionDocument.currentTransactionDetails.transactionDiscount.length > 0) {\r\n this.transactionDocument.currentTransactionDetails.transactionDiscount.forEach((discount: { discountAmount: number; }) => {\r\n transactionDiscountTotal += discount.discountAmount;\r\n });\r\n }\r\n\r\n if (this.transactionDocument.currentTransactionDetails.products && this.transactionDocument.currentTransactionDetails.products.length > 0) {\r\n this.transactionDocument.currentTransactionDetails.products.forEach((product: { itemLineId: any; selectedVAT: any; selectedVATCode: any; total: any; refundedQuantity: number; itemDiscounts: { currentRefundPortion: number; trnDiscountsPortion: number; trnPromotionsPortion: number; }; }) => {\r\n let taxLine: TaxLine = {\r\n itemLineId: product.itemLineId,\r\n VAT: product.selectedVAT ? product.selectedVAT : 0,\r\n VATCode: product.selectedVATCode,\r\n taxLineTotal: 0,\r\n taxableAmount: product.total,\r\n PreTax: 0\r\n\r\n };\r\n console.info(\"Product contribution : item line ID :current transaction Details\",\r\n product.itemLineId, \"tax line :\", JSON.stringify(taxLine), JSON.stringify(basketDetails.basketTotal));\r\n\r\n //step 1\r\n // if Transaction Discount and/or promotion applied, find net selling price of each product as taxableamount\r\n\r\n //If transaction discount/promotion is applied taxable amount should be deducting transaction promotion and transaction disacount portion\r\n if (product.refundedQuantity && product.refundedQuantity > 0) {\r\n\r\n taxLine.taxableAmount = -Math.abs(taxLine.taxableAmount - product.itemDiscounts.currentRefundPortion);\r\n } else {\r\n taxLine.taxableAmount = taxLine.taxableAmount - product.itemDiscounts.trnDiscountsPortion - product.itemDiscounts.trnPromotionsPortion;\r\n }\r\n\r\n //step 2 - find pre tax\r\n taxLine.PreTax = this.numberUtilService.trimTo2Decimal2((taxLine.taxableAmount * 100) / (100 + taxLine.VAT));\r\n\r\n //step 3 - Update taxbreakdown\r\n taxBreakdown.totalTaxableAmount += taxLine.taxableAmount;\r\n taxLine.taxableAmount = this.numberUtilService.trimTo2Decimal2(taxLine.taxableAmount);\r\n \r\n // step 4 - update tax Line total\r\n taxLine.taxLineTotal = this.numberUtilService.trimTo2Decimal2(taxLine.taxableAmount - taxLine.PreTax);\r\n taxBreakdown.taxLines.push(taxLine);\r\n });\r\n }\r\n\r\n taxBreakdown.totalTaxableAmount = this.numberUtilService.trimTo2Decimal2(taxBreakdown.totalTaxableAmount);\r\n this.transactionDocument.currentTransactionDetails.taxBreakdown = taxBreakdown;\r\n if (this.transactionDocument.currentTransactionDetails.taxBreakdown && this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines && this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines.length > 0) {\r\n this.transactionDocument.currentTransactionDetails.basketSummary.VATTotal = this.numberUtilService.trimTo2Decimal2(this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines.reduce(\r\n (n: any, { taxLineTotal }: any) => n + taxLineTotal,\r\n 0\r\n ));\r\n }\r\n else {\r\n this.transactionDocument.currentTransactionDetails.basketSummary.VATTotal = 0.00;\r\n }\r\n\r\n console.log(\"eBasket:after calculating tax currenttransactionDetails\", this.transactionDocument.currentTransactionDetails)\r\n return this;\r\n }\r\n\r\n updateCurrentTransactionDetailsTotalTaxSummary(): TransactionDocumentBuilder {\r\n \r\n console.log(\"Total Tax Summery Request :\", JSON.stringify(this.transactionDocument.currentTransactionDetails.taxBreakdown));\r\n\r\n let totalTaxSummaryArray: TotalTaxSummary[] = []\r\n let totalTaxSummaryGroup = []\r\n\r\n console.log(\"Tax Lines for Total Tax Summery :\", JSON.stringify(this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines));\r\n\r\n this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines.forEach((element: { VATCode: any; VAT: any; PreTax: any; taxLineTotal: any; }) => {\r\n let TaxSummary: TotalTaxSummary = {\r\n VATCode:\"\",\r\n VAT: -12345,\r\n PreTaxSum: 0,\r\n TaxSum: 0,\r\n TXrateSum: 0\r\n };\r\n TaxSummary.VATCode=element.VATCode;\r\n TaxSummary.VAT = element.VAT; \r\n \r\n TaxSummary.PreTaxSum = this.numberUtilService.trimTo2Decimal2(element.PreTax); \r\n TaxSummary.TaxSum = this.numberUtilService.trimTo2Decimal2(element.taxLineTotal);\r\n TaxSummary.TXrateSum = this.numberUtilService.trimTo2Decimal2(TaxSummary.PreTaxSum + TaxSummary.TaxSum); \r\n totalTaxSummaryArray.push(TaxSummary);\r\n })\r\n\r\n console.log(\"Total Tax Summery Without Grouped : \", JSON.stringify(totalTaxSummaryArray));\r\n \r\n totalTaxSummaryGroup = totalTaxSummaryArray.reduce((preparedArray:any,currentObj:any) => {\r\n let ind = preparedArray.findIndex((x: { VAT: any; }) => x.VAT === currentObj.VAT);\r\n if(ind === -1){\r\n preparedArray.push(currentObj)\r\n }else {\r\n preparedArray[ind].VATCode = currentObj.VATCode;\r\n preparedArray[ind].VAT = currentObj.VAT;\r\n preparedArray[ind].PreTaxSum += currentObj.PreTaxSum;\r\n preparedArray[ind].TaxSum += currentObj.TaxSum;\r\n preparedArray[ind].TXrateSum += currentObj.TXrateSum;\r\n }\r\n return preparedArray;\r\n },[])\r\n // listOfTags.map(x => unique.filter(a => a.label == x.label && a.color == x.color).length > 0 ? null : unique.push(x));\r\n\r\n console.log(\"Total Tax Summer Group :\", JSON.stringify(totalTaxSummaryGroup));\r\n\r\n this.transactionDocument.currentTransactionDetails.totalTaxSummary = totalTaxSummaryGroup;\r\n return this;\r\n\r\n }\r\n\r\n /**\r\n * current transaction Disocunt Total\r\n * @returns Discount Total\r\n */\r\n updateCurrentTransactionDetailsDiscountTotal() {\r\n let refundTotal = this.transactionDocument.currentTransactionDetails.basketSummary.refundTotal ? this.transactionDocument.currentTransactionDetails.basketSummary.refundTotal : 0;\r\n\r\n console.log(\"e-basket: transaction builder updateCurrentTransactionDetailsDiscountTotal: discountTotal\", refundTotal, this.transactionDocument.currentTransactionDetails.basketSummary.basketTotal, this.transactionDocument.currentTransactionDetails.basketSummary.saleTotal);\r\n const discountTotal =\r\n Math.abs(\r\n Math.abs(this.transactionDocument.currentTransactionDetails.basketSummary.saleTotal) -\r\n (Math.abs(this.transactionDocument.currentTransactionDetails.basketSummary.basketTotal) + Math.abs(refundTotal))\r\n );\r\n console.log(\"e-basket: transaction builder updateCurrentTransactionDetailsDiscountTotal: discountTotal\", discountTotal)\r\n return Number(discountTotal.toFixed(2));\r\n }\r\n\r\n /**\r\n * current transaction Refund Total\r\n * @returns Refund Total\r\n */\r\n updateCurrentTransactionDetailsRefundTotal() {\r\n let totalRefund = 0;\r\n for (let index = 0; index < this.transactionDocument.currentTransactionDetails.products.length; index++) {\r\n const product: Product = this.transactionDocument.currentTransactionDetails.products[index];\r\n if (product.refundedTotal) {\r\n totalRefund = totalRefund + product.refundedTotal;\r\n }\r\n console.log(\"ebasket : transaction Service: totalRefund for Current TransactionDetails\" + totalRefund)\r\n }\r\n return totalRefund;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Baskets summary\r\n * @param basketDetails\r\n * @returns summary\r\n */\r\n basketSummary(basketDetails: Basket): TransactionDocumentBuilder {\r\n this.transactionDocument.basketSummary.basketTotal = this.numberUtilService.trimTo2Decimal(basketDetails.basketTotal);\r\n\r\n this.transactionDocument.basketSummary.saleTotal = this.numberUtilService.trimTo2Decimal2(this.updateSaleTotal(\r\n basketDetails\r\n ));\r\n this.transactionDocument.basketSummary.refundTotal = this.getRefundTotal();\r\n if (\r\n this.transactionDocument.basket.lineDiscount ||\r\n this.transactionDocument.basket.linePromotion\r\n ) {\r\n this.transactionDocument.basketSummary.discountTotal = this.numberUtilService.trimTo2Decimal2(this.updateDiscountTotal());\r\n }\r\n this.transactionDocument.basketSummary.totalItems = basketDetails.quantity;\r\n\r\n\r\n if (this.transactionDocument.basket.taxBreakdown) {\r\n this.transactionDocument.basketSummary.VATTotal = this.numberUtilService.trimTo2Decimal2(this.transactionDocument.basket.taxBreakdown.taxLines.reduce(\r\n (n: any, { taxLineTotal }: any) => n + taxLineTotal,\r\n 0\r\n ));\r\n }\r\n else {\r\n this.transactionDocument.basketSummary.VATTotal = 0.00;\r\n }\r\n\r\n console.info(\"ebasket: basketsummary updated in transaction document: \", JSON.stringify(this.transactionDocument.basketSummary));\r\n return this;\r\n }\r\n\r\n /**\r\n * Line Discount\r\n * @param basketDetails\r\n * @returns line Discount\r\n */\r\n lineDiscount(basketDetails: Basket): TransactionDocumentBuilder {\r\n this.transactionDocument.basket.lineDiscount = [];\r\n for (let index = 0; index < basketDetails.products.length; index++) {\r\n const element = basketDetails.products[index];\r\n if (element.lineDiscount) {\r\n this.transactionDocument.basket.lineDiscount.push(element.lineDiscount);\r\n this.transactionDocument.basket.lineDiscount = this.transactionDocument.basket.lineDiscount.reduce(\r\n (acc: any[], val: { itemLineId: any; }) => {\r\n if (!acc.find((el: { itemLineId: any; }) => el.itemLineId === val.itemLineId)) {\r\n acc.push(val);\r\n }\r\n return acc;\r\n },\r\n []\r\n );\r\n }\r\n\r\n // console.info(\r\n // \"e-basket :line discount updated in transaction document\",\r\n // this.transactionDocument.basket.lineDiscount\r\n // );\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * exchange\r\n * @param basketDetails\r\n * @returns exchange \r\n */\r\n exchange(basketDetails: Basket): TransactionDocumentBuilder {\r\n this.transactionDocument.basket.exchange = basketDetails.exchange && basketDetails.exchange.length > 0 ? [...basketDetails.exchange] : [];\r\n for (let index = 0; index < basketDetails.products.length; index++) {\r\n\r\n const element: any = basketDetails.products[index];\r\n if (element.exchange != undefined) {\r\n const isPresent = this.transactionDocument.basket.exchange.some((el: { exchangeId: any; }) => el.exchangeId === element.exchange.exchangeId);\r\n if (!isPresent) {\r\n let exchangeItems = [];\r\n for (let j = 0; j < element.exchange.newItems.length; j++) {\r\n const item = element.exchange.newItems[j];\r\n let newItems: any = { lineItemId: item.itemLineId, Quantity: item.quantity }\r\n exchangeItems.push(newItems);\r\n }\r\n element.exchange.newItems = [...exchangeItems];\r\n this.transactionDocument.basket.exchange.push(element.exchange);\r\n }\r\n }\r\n console.log(\r\n \"e-basket :TransactionDocumentBuilder: this.transactionDocument.basket exchange\",\r\n JSON.stringify(this.transactionDocument.basket.exchange)\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * add previous exchange data\r\n * @param originalTransactionDocument\r\n * @returns line Promotions\r\n */\r\n addExchangeData(originalTransactionDocument: TransactionDocument): TransactionDocumentBuilder {\r\n this.transactionDocument.basket.exchange = originalTransactionDocument.basket.exchange ? [...originalTransactionDocument.basket.exchange] : null;\r\n return this;\r\n }\r\n\r\n /**\r\n * line Promotions\r\n * @param basketDetails\r\n * @returns line Promotions\r\n */\r\n linePromotion(basketDetails: Basket): TransactionDocumentBuilder {\r\n this.transactionDocument.basket.linePromotion = [];\r\n for (let index = 0; index < basketDetails.products.length; index++) {\r\n const element = basketDetails.products[index];\r\n if (element.linePromotions) {\r\n this.transactionDocument.basket.linePromotion.push(\r\n element.linePromotions\r\n );\r\n this.transactionDocument.basket.linePromotion = this.transactionDocument.basket.linePromotion.reduce(\r\n (acc: any[], val: { itemLineId: any; }) => {\r\n if (!acc.find((el: { itemLineId: any; }) => el.itemLineId === val.itemLineId)) {\r\n acc.push(val);\r\n }\r\n return acc;\r\n },\r\n []\r\n );\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * transaction Promotion\r\n * @param basketDetails\r\n * @returns transaction Promotion\r\n */\r\n transactionPromotion(basketDetails: Basket): TransactionDocumentBuilder {\r\n if (basketDetails.transactionPromotion) {\r\n this.transactionDocument.basket.transactionPromotion =\r\n basketDetails.transactionPromotion;\r\n // for (let index = 0; index < basketDetails.TransactionDiscount.length; index++) {\r\n // this.transactionDocument.basket.transactionPromotion.push(element.linePromotions)\r\n // this.transactionDocument.basket.transactionPromotion = this.transactionDocument.basket.linePromotions.reduce((acc, val) => {\r\n // if (!acc.find(el => el.itemLineId === val.itemLineId)) {\r\n // acc.push(val);\r\n // }\r\n // return acc;\r\n // }, []);\r\n // }\r\n console.log(\r\n \"e-basket :TransactionDocumentBuilder: this.transactionDocument.basket.transactionPromotion\",\r\n JSON.stringify(this.transactionDocument.basket.transactionPromotion)\r\n );\r\n }\r\n return this;\r\n }\r\n\r\n transactionDiscount(basketDetails: Basket): TransactionDocumentBuilder {\r\n if (basketDetails.transactionDiscount) {\r\n this.transactionDocument.basket.transactionDiscount =\r\n basketDetails.transactionDiscount;\r\n\r\n console.log(\r\n \"e-basket :TransactionDocumentBuilder: transaction Discount\",\r\n JSON.stringify(this.transactionDocument.basket.transactionDiscount)\r\n );\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Payments details\r\n * @param paymentDetails\r\n * @returns\r\n */\r\n paymentDetails(paymentDetails: any) {\r\n console.info(\"ebasket : payment details after transaction completed\",JSON.stringify(paymentDetails));\r\n \r\n this.transactionDocument.paymentDetails = paymentDetails;\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Payments details\r\n * @param paymentDetails\r\n * @returns\r\n */\r\n splitPayment(splitPayment: boolean) { \r\n this.transactionDocument.splitPayment = splitPayment;\r\n return this;\r\n } \r\n\r\n /**\r\n * Payments details\r\n * @param paymentDetails\r\n * @returns\r\n */\r\n isPaymentCompleted(isPaymentCompleted: boolean) {\r\n this.transactionDocument.isPaymentCompleted = isPaymentCompleted;\r\n return this;\r\n } \r\n \r\n\r\n\r\n\r\n /**\r\n * Bases currency\r\n * @param currency\r\n * @returns currency\r\n */\r\n baseCurrency(currency: any): TransactionDocumentBuilder {\r\n this.transactionDocument.baseCurrency = currency;\r\n return this;\r\n }\r\n\r\n /**\r\n * gift option at\r\n * @returns at\r\n */\r\n giftOption(gift: any): TransactionDocumentBuilder {\r\n console.log(\r\n \"e-basket :TransactionDocumentBuilder: this.transactionDocument.giftoption\",\r\n gift\r\n );\r\n if (gift) {\r\n this.transactionDocument.giftedReceipt = gift;\r\n }\r\n return this;\r\n }\r\n /**\r\n\r\n/**\r\n * manual Discount\r\n * @param discountData\r\n * @returns\r\n */\r\n\r\n // manualDiscount(discountData : basketDiscount):TransactionDocumentBuilder {\r\n // let saleTotal = this.transactionDocument.basketSummary.basketTotal;\r\n // if(discountData.discountType =='Percent'){\r\n // this.transactionDocument.basketSummary.basketTotal = saleTotal-(saleTotal*(discountData.discountAmount/100));\r\n // discountData.discountAmount = -1*(saleTotal-this.transactionDocument.basketSummary.basketTotal);\r\n // }else {\r\n // this.transactionDocument.basketSummary.basketTotal =saleTotal-discountData.discountAmount;\r\n // discountData.discountAmount = -1*discountData.discountAmount;\r\n // }\r\n // this.transactionDocument.transactionDiscount.push(discountData);\r\n // return this;\r\n\r\n // }\r\n\r\n /**\r\n * Types transaction document builder\r\n * @param t\r\n * @returns type\r\n */\r\n type(t: any): TransactionDocumentBuilder {\r\n this.transactionDocument.type = t;\r\n return this;\r\n }\r\n /**\r\n * Operations status\r\n * @param o\r\n * @returns status\r\n */\r\n operationStatus(o: any): TransactionDocumentBuilder {\r\n this.transactionDocument.operationStatus = o;\r\n return this;\r\n }\r\n /**\r\n * Created at\r\n * @returns at\r\n */\r\n createdAt(): TransactionDocumentBuilder {\r\n const date = new Date();\r\n this.transactionDocument.createdAt = date.toISOString();\r\n this.transactionDocument.updatedAt = date.toISOString();\r\n return this;\r\n }\r\n /**\r\n * Updated at\r\n * @returns at\r\n */\r\n updatedAt(): TransactionDocumentBuilder {\r\n const date = new Date();\r\n this.transactionDocument.updatedAt = date.toISOString();\r\n return this;\r\n }\r\n /**\r\n * transsaction completion at\r\n * @returns transaction completion date\r\n */\r\n transactionCompletedAt(): TransactionDocumentBuilder {\r\n const date = new Date();\r\n this.transactionDocument.transCompletedAt = date.toISOString();\r\n return this;\r\n }\r\n /**\r\n * Builds transaction document builder\r\n * @returns build\r\n */\r\n build(): TransactionDocument {\r\n return this.transactionDocument;\r\n }\r\n\r\n /**\r\n * Sales total in refund\r\n * @param saleTotal\r\n * @returns total in refund\r\n */\r\n saleTotalInRefund(saleTotal: number): TransactionDocumentBuilder {\r\n this.transactionDocument.saleTotal = saleTotal;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets basket details\r\n * @returns basket details\r\n */\r\n getBasketDetails(): Basket {\r\n console.info(\"ebasket: Getting Basket for transactionDocument\", JSON.stringify(this.transactionDocument));\r\n\r\n let basket: Basket = {\r\n subsidiaryId : this.transactionDocument.subsidiaryId,\r\n transactionDiscount: this.transactionDocument.basket.transactionDiscount,\r\n transactionPromotion: this.transactionDocument.basket.transactionPromotion,\r\n transactionId: this.transactionDocument.transactionId,\r\n offlineTransactionId: this.transactionDocument.offlineTransactionId,\r\n total: this.transactionDocument.basketSummary.basketTotal,\r\n basketTotal: this.transactionDocument.basketSummary.basketTotal,\r\n discountTotal: this.transactionDocument.basketSummary.discountTotal,\r\n saleTotal: this.transactionDocument.basketSummary.saleTotal,\r\n refundTotal: this.transactionDocument.basketSummary.refundTotal,\r\n quantity: this.transactionDocument.basketSummary.totalItems,\r\n products: [],\r\n baseCurrency: this.transactionDocument.baseCurrency,\r\n customer: this.transactionDocument.customer,\r\n };\r\n\r\n basket.products = [] as Product[];\r\n this.transactionDocument.basket.products.forEach((product: { SKU: any; barCode: any; barcodes: any; description: any; imageUrls: any; totalLinePrice: any; itemLineId: any; excludePromotion: any; price: any; quantity: any; selectedRRPPrice: any; fullfilmentId: any; fullfilmentLocationName: any; deliveryGroup: string; leadTime: any; deliveryMethod: any; giftCard: any; giftCardExpiryDate: any; giftCardNumberIssued: any; giftCardRecipientEmail: any; giftCardRecipientName: any; refundedTotal: any; refundedQuantity: number; refundedReasonDescription: any; refundedReason: any; refundedPromotionalQuantity: any; isLastExchanged: any; }, index: any) => {\r\n console.log(JSON.stringify(product), \"ebasket: basket detail update in basket\");\r\n const p = {} as any;\r\n p.SKU = product.SKU;\r\n p.barcode = product.barCode;\r\n p.barcodes = product.barcodes;\r\n\r\n p.description = product.description;\r\n p.imageUrls = product.imageUrls;\r\n p.currency = this.transactionDocument.baseCurrency;\r\n p.totalLinePrice = product.totalLinePrice;\r\n p.itemLineId = Number(product.itemLineId);\r\n p.excludePromotion = product.excludePromotion;\r\n\r\n p.selectedPrice = product.price;\r\n p.quantity = product.quantity;\r\n p.total = product.totalLinePrice;\r\n p.selectedRRPPrice = product.selectedRRPPrice;\r\n\r\n p.fullfilmentId = product.fullfilmentId;\r\n p.fullfilmentLocationName = product.fullfilmentLocationName;\r\n p.deliveryGroup = product.deliveryGroup || \"1\";\r\n p.leadTime = product.leadTime;\r\n p.deliveryMethod = product.deliveryMethod || DELIVERY_METHODS.COLLECT_FROM_STORE.toString();\r\n\r\n if(p.fullfilmentId != this.transactionDocument.storeId)\r\n {\r\n p.isWebOrder = true;\r\n }\r\n \r\n p.giftCard = product.giftCard;\r\n p.giftCardExpiryDate = product.giftCardExpiryDate;\r\n p.giftCardNumberIssued = product.giftCardNumberIssued;\r\n p.giftCardRecipientEmail = product.giftCardRecipientEmail;\r\n p.giftCardRecipientName = product.giftCardRecipientName;\r\n \r\n if (\r\n this.transactionDocument.basket.lineDiscount &&\r\n this.transactionDocument.basket.lineDiscount.length > 0\r\n ) {\r\n this.transactionDocument.basket.lineDiscount.forEach((lineDiscount: { itemLineId: { toString: () => any; }; discountedLinePrice: any; }) => {\r\n if (product.itemLineId === lineDiscount.itemLineId.toString()) {\r\n p.lineDiscount = lineDiscount;\r\n p.total = lineDiscount.discountedLinePrice;\r\n }\r\n });\r\n }\r\n\r\n if (\r\n this.transactionDocument.basket.linePromotion &&\r\n this.transactionDocument.basket.linePromotion.length > 0\r\n ) {\r\n this.transactionDocument.basket.linePromotion.forEach((linePromotion: { itemLineId: { toString: () => any; }; promotionLinePrice: any; }) => {\r\n if (product.itemLineId === linePromotion.itemLineId.toString()) {\r\n p.linePromotions = linePromotion;\r\n p.total = linePromotion.promotionLinePrice;\r\n }\r\n });\r\n }\r\n\r\n if (\r\n this.transactionDocument.basket.taxBreakdown &&\r\n this.transactionDocument.basket.taxBreakdown.taxLines.length > 0\r\n ) {\r\n this.transactionDocument.basket.taxBreakdown.taxLines.forEach((taxLine: { itemLineId: { toString: () => any; }; VAT: any; VATCode: any; }) => {\r\n if (product.itemLineId && product.itemLineId === taxLine.itemLineId.toString()) {\r\n p.selectedVAT = taxLine.VAT;\r\n p.selectedVATCode = taxLine.VATCode;\r\n }\r\n });\r\n }\r\n\r\n if (this.transactionDocument.type === TRANSACTION_TYPE.REFUND) {\r\n p.total = product.refundedTotal;\r\n } else if ((this.transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND || TRANSACTION_TYPE.SALE_EXCHANGE) && product.refundedQuantity > 0) {\r\n p.refundedReasonDescription = product.refundedReasonDescription;\r\n p.refundedReason = product.refundedReason;\r\n if (!p.refundedReasonDescription) {\r\n p.refundedReasonDescription = p.refundedReason;\r\n }\r\n p.refundedQuantity = product.refundedQuantity;\r\n p.refundPromotionalQuantity = product.refundedPromotionalQuantity;\r\n p.refundedTotal = product.refundedTotal;\r\n p.total -= Math.abs(p.refundedTotal);\r\n p.isLastExchanged = product.isLastExchanged;\r\n }\r\n\r\n if (this.transactionDocument.type === TRANSACTION_TYPE.REFUND) {\r\n if (p.total > 0) {\r\n p.total *= -1;\r\n }\r\n }\r\n\r\n basket.products.push(p);\r\n\r\n });\r\n\r\n basket = this.getTransactionDiscountAndTransactionPromotionPortion(basket);\r\n basket.total = (basket.basketTotal || 0) + this.getTotalDiscountWithTransactionDiscountsAndPromotions(basket);\r\n if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND) {\r\n basket.quantity = this.getRefundedTotalWithQuantity(basket);\r\n }\r\n console.info(\"ebasket: Basket created successfully\", JSON.stringify(basket))\r\n return basket;\r\n }\r\n\r\n /**\r\n * Gets basket details\r\n * @returns refund basket details\r\n */\r\n // getRefundBasketDetails(): Basket {\r\n // let basket: Basket = {\r\n // subsidiaryId : this.transactionDocument.subsidiaryId,\r\n // transactionDiscount: this.transactionDocument.basket.transactionDiscount,\r\n // transactionPromotion: this.transactionDocument.basket.transactionPromotion,\r\n // transactionId: this.transactionDocument.transactionId,\r\n // total: this.transactionDocument.basketSummary.basketTotal,\r\n // basketTotal: this.transactionDocument.basketSummary.basketTotal,\r\n // discountTotal: this.transactionDocument.basketSummary.discountTotal,\r\n // saleTotal: this.transactionDocument.basketSummary.saleTotal,\r\n // quantity: this.transactionDocument.basketSummary.totalItems,\r\n // products: [],\r\n // baseCurrency: this.transactionDocument.baseCurrency,\r\n // customer: this.transactionDocument.customer,\r\n // };\r\n\r\n // basket.products = [] as Product[];\r\n // this.transactionDocument.basket.products.forEach((product: { SKU: any; barCode: any; barcodes: any; description: any; imageUrls: any; totalLinePrice: any; itemLineId: any; excludePromotion: any; price: number; quantity: any; selectedRRPPrice: any; fullfilmentId: any; fullfilmentLocationName: any; deliveryGroup: string; leadTime: any; deliveryMethod: any; giftCard: any; giftCardExpiryDate: any; giftCardNumberIssued: any; giftCardRecipientEmail: any; giftCardRecipientName: any; itemDiscounts: any; refundedPromotionalQuantity: any; refundedQuantity: number; refunded: any; isLastExchanged: any; exchange: any; refundedTotal: number; }, index: any) => {\r\n // const p = {} as Product;\r\n // p.SKU = product.SKU;\r\n // p.barcode = product.barCode;\r\n // p.barcodes = product.barcodes;\r\n\r\n // p.description = product.description;\r\n // p.imageUrls = product.imageUrls;\r\n // p.currency = this.transactionDocument.baseCurrency;\r\n // p.totalLinePrice = product.totalLinePrice;\r\n // p.itemLineId = Number(product.itemLineId);\r\n // p.excludePromotion = product.excludePromotion;\r\n\r\n // p.selectedPrice = product.price;\r\n // p.quantity = product.quantity;\r\n // p.total = product.totalLinePrice;\r\n // p.selectedRRPPrice = product.selectedRRPPrice;\r\n\r\n // p.fullfilmentId = product.fullfilmentId;\r\n // p.fullfilmentLocationName = product.fullfilmentLocationName;\r\n // p.deliveryGroup = product.deliveryGroup || \"1\";\r\n // p.leadTime = product.leadTime;\r\n // p.deliveryMethod = product.deliveryMethod || DELIVERY_METHODS.COLLECT_FROM_STORE.toString();\r\n\r\n // p.giftCard = product.giftCard;\r\n // p.giftCardExpiryDate = product.giftCardExpiryDate;\r\n // p.giftCardNumberIssued = product.giftCardNumberIssued;\r\n // p.giftCardRecipientEmail = product.giftCardRecipientEmail;\r\n // p.giftCardRecipientName = product.giftCardRecipientName;\r\n \r\n \r\n // if(p.fullfilmentId != this.transactionDocument.storeId)\r\n // {\r\n // p.isWebOrder = true;\r\n // }\r\n \r\n // if (product.itemDiscounts) {\r\n // p.itemDiscounts = product.itemDiscounts as ItemDiscount;\r\n // }\r\n\r\n // // if(!p.itemDiscounts){\r\n // // console.log(p.itemDiscounts);\r\n\r\n // // this.basketService.transactionDiscountAndPromotionProductortionCalculation(basket);\r\n // // }\r\n // p.refundPromotionalQuantity = product.refundedPromotionalQuantity ? product.refundedPromotionalQuantity : 0;\r\n\r\n // if (product.refundedQuantity) {\r\n // p.quantity = p.quantity - product.refundedQuantity;\r\n // p.totalLinePrice = (p.quantity * product.price);\r\n // p.total = p.totalLinePrice;\r\n // // p.refundPromotionalQuantity = product.refundedPromotionalQuantity;\r\n // p.refunded = product.refunded;\r\n // p.isLastExchanged = product.isLastExchanged;\r\n // }\r\n // if (product.exchange) {\r\n // p.exchange = product.exchange;\r\n // }\r\n\r\n // if (\r\n // this.transactionDocument.basket.lineDiscount &&\r\n // this.transactionDocument.basket.lineDiscount.length > 0\r\n // ) {\r\n\r\n // this.transactionDocument.basket.lineDiscount.forEach((lineDiscount: { itemLineId: { toString: () => any; }; discountedLinePrice: any; }) => {\r\n\r\n // if (product.itemLineId === lineDiscount.itemLineId.toString() && product.refundedQuantity > 0) {\r\n // p.lineDiscount = Object.assign({}, lineDiscount);\r\n // p.lineDiscount.discountedLinePrice = p.lineDiscount.unitPrice * p.quantity\r\n // p.lineDiscount.discountAmount = p.total - p.lineDiscount.discountedLinePrice\r\n // p.total = p.lineDiscount.discountedLinePrice;\r\n // } else if (product.itemLineId === lineDiscount.itemLineId.toString()) {\r\n // p.lineDiscount = lineDiscount;\r\n // p.total = lineDiscount.discountedLinePrice\r\n // }\r\n // });\r\n // }\r\n\r\n // if (\r\n // this.transactionDocument.basket.linePromotion &&\r\n // this.transactionDocument.basket.linePromotion.length > 0\r\n // ) {\r\n // this.transactionDocument.basket.linePromotion.forEach((linePromotion: { itemLineId: { toString: () => any; }; refunded: any; }) => {\r\n // if (product.itemLineId === linePromotion.itemLineId.toString() && !linePromotion.refunded) {\r\n // p.linePromotions = linePromotion;\r\n // p.total = p.linePromotions.promotionLinePrice;\r\n // p.total = p.total - (product.refundedTotal ? Math.abs(product.refundedTotal) : 0);\r\n // }\r\n // });\r\n // }\r\n\r\n // p.refundedQuantity = 0;\r\n // p.refundedTotal = 0;\r\n\r\n // if (\r\n // this.transactionDocument.basket.taxBreakdown &&\r\n // this.transactionDocument.basket.taxBreakdown.taxLines.length > 0\r\n // ) {\r\n // this.transactionDocument.basket.taxBreakdown.taxLines.forEach((taxLine: { itemLineId: { toString: () => any; }; VAT: any; VATCode: any; }) => {\r\n // if (product.itemLineId === taxLine.itemLineId.toString()) {\r\n // p.selectedVAT = taxLine.VAT;\r\n // p.selectedVATCode = taxLine.VATCode;\r\n // }\r\n // });\r\n // }\r\n\r\n // if (p.quantity > 0) {\r\n // basket.products.push(p);\r\n // }\r\n // });\r\n // // product.itemDiscounts\r\n // if (!basket.products[0].hasOwnProperty('itemDiscounts')) {\r\n // basket = this.getTransactionDiscountAndTransactionPromotionPortion(basket);\r\n\r\n // }\r\n\r\n // console.log(\"ebasket : TransactionDocumentBuilder :new created refunded basket\", JSON.stringify(basket))\r\n // basket.quantity = basket.products.reduce(\r\n // (n: any, { quantity }: any) => n + quantity,\r\n // 0\r\n // );\r\n // basket.total = this.getTotalWithLineDiscountAndLinePromotionApplied(basket);\r\n // basket.basketTotal = basket.total;\r\n // basket.basketTotal = basket.basketTotal - this.getTotalDiscountWithTransactionDiscountsAndPromotions(basket);\r\n // console.log(\r\n // \"ebasket : TransactionDocumentBuilder : update Basket Total: after promotion :basketTotal\",\r\n // basket.basketTotal\r\n // );\r\n\r\n // console.log(\r\n // \"e:basket :TransactionDocumentBuilder : basketDetails updated values\",\r\n // JSON.stringify(basket)\r\n // );\r\n // return basket;\r\n // }\r\n\r\n\r\n getTransactionDiscountAndTransactionPromotionPortion(basket:any) {\r\n if (\r\n basket.transactionDiscount &&\r\n basket.transactionDiscount.length > 0\r\n ) {\r\n basket.transactionDiscount.forEach((discount: { itemLineIds: any; }) => {\r\n if (!discount.itemLineIds) {\r\n discount.itemLineIds = basket.products.map((product: { itemLineId: any; }) => {\r\n return product.itemLineId\r\n });\r\n }\r\n basket = this.basketService.transactionDiscountProductPortionCalc(basket, discount);\r\n });\r\n }\r\n if (\r\n basket.transactionPromotion &&\r\n basket.transactionPromotion.length > 0\r\n ) {\r\n basket.transactionPromotion.forEach((tPromotion: { itemLineIds: any; }) => {\r\n if (!tPromotion.itemLineIds) {\r\n const filteredData = basket.products.filter(\r\n (item: { excludePromotion: boolean; }) => {\r\n return item.excludePromotion === false;\r\n });\r\n\r\n tPromotion.itemLineIds =\r\n filteredData.map((product: { itemLineId: any; }) => {\r\n return product.itemLineId\r\n });\r\n }\r\n basket = this.basketService.transactionPromotionProductPortionCalc(basket, tPromotion);\r\n });\r\n }\r\n\r\n return basket;\r\n }\r\n\r\n\r\n getTotalDiscountWithTransactionDiscountsAndPromotions(basketDetails: any) {\r\n\r\n let discountTotal = 0;\r\n if (\r\n basketDetails.transactionPromotion &&\r\n basketDetails.transactionPromotion.length > 0\r\n ) {\r\n discountTotal += basketDetails.transactionPromotion.reduce(\r\n (n: any, { promotionAmount }: any) => n + promotionAmount,\r\n 0\r\n );\r\n }\r\n if (\r\n basketDetails.transactionDiscount &&\r\n basketDetails.transactionDiscount.length > 0\r\n ) {\r\n\r\n discountTotal += basketDetails.transactionDiscount.reduce(\r\n (n: any, { discountAmount }: any) => n + discountAmount,\r\n 0\r\n );\r\n\r\n\r\n }\r\n console.log(\"ebasket : TransactionDocumentBuilder : Transaction discount Total:\", discountTotal);\r\n\r\n return discountTotal;\r\n }\r\n\r\n\r\n appendCurrencySymbol(currency: number, value: number) {\r\n // value=this.decimalpipe.transform(value,'1.2');\r\n if (value >= 0) {\r\n const returnval = currency + value;\r\n console.log(returnval, \"ebasket: add currency with value\");\r\n return returnval;\r\n } else {\r\n const returnval = \"-\" + (currency + value * -1);\r\n console.log(returnval, \"-(currency+(value*-1))\");\r\n return returnval;\r\n }\r\n }\r\n\r\n // /**\r\n // * Updates total refund\r\n // * @returns total refund\r\n // */\r\n // updateTotalRefund(): TransactionDocumentBuilder {\r\n // this.transactionDocument.basket.products.forEach((product) => {\r\n // product.refundedQuantity = product.quantity;\r\n // product.refundedTotal = product.totalLinePrice * -1;\r\n // console.log(\r\n // \"ebasket: Transaction price override :\",\r\n // this.transactionDocument.basket.lineDiscount\r\n // );\r\n\r\n // if (\r\n // this.transactionDocument.basket.linePromotion &&\r\n // this.transactionDocument.basket.linePromotion.length > 0\r\n // ) {\r\n // this.transactionDocument.basket.linePromotion.forEach((linePromotion) => {\r\n // console.log(\r\n // \"Promotion: basket linePromotion : \",\r\n // this.transactionDocument.basket.linePromotion\r\n // );\r\n // console.log(\r\n // \"linePromotion.itemLineId.toString() : \",\r\n // linePromotion.itemLineId.toString()\r\n // );\r\n // console.log(\r\n // \"condition : \" +\r\n // (product.itemLineId === linePromotion.itemLineId.toString())\r\n // );\r\n\r\n // if (product.itemLineId === linePromotion.itemLineId.toString()) {\r\n // product.refundedTotal =\r\n // linePromotion.promotionLinePrice * -1;\r\n // }\r\n // });\r\n // } else\r\n // if (\r\n // this.transactionDocument.basket.lineDiscount &&\r\n // this.transactionDocument.basket.lineDiscount.length > 0\r\n // ) {\r\n // this.transactionDocument.basket.lineDiscount.forEach((lineDiscount) => {\r\n // console.log(\r\n // \"product.itemLineId : \" +\r\n // this.transactionDocument.basket.lineDiscount\r\n // );\r\n // console.log(\r\n // \"lineDiscount.itemLineId.toString() : \" +\r\n // lineDiscount.itemLineId.toString()\r\n // );\r\n // console.log(\r\n // \"condition : \" +\r\n // (product.itemLineId === lineDiscount.itemLineId.toString())\r\n // );\r\n\r\n // if (product.itemLineId === lineDiscount.itemLineId.toString()) {\r\n // product.refundedTotal = lineDiscount.unitPrice * product.refundedQuantity * -1;\r\n // }\r\n // });\r\n // }\r\n\r\n // console.log(\"Product description :\" + product.description);\r\n // console.log(\"Product total :\" + product.refundedTotal);\r\n // // product.displayrefundedamount=this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency],product.refundedTotal);\r\n // // console.log(product.displayrefundedamount,\"displayrefundedamount\");\r\n // product.refunded = true;\r\n // });\r\n // const baskettotal = (this.transactionDocument.basketSummary.basketTotal *= -1);\r\n // // this.transactionDocument.basketSummary.displaybaskettotal=this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency], baskettotal);\r\n // const saletotal = (this.transactionDocument.basketSummary.saleTotal *= -1);\r\n // // this.transactionDocument.basketSummary.displaysaletotal = this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency], saletotal);\r\n // (this.transactionDocument.basketSummary.VATTotal *= -1);\r\n // return this;\r\n // }\r\n\r\n /**\r\n * Sale Total\r\n * @param basketDetails\r\n * @returns Sale Total\r\n */\r\n updateSaleTotal(basketDetails: { products: any[]; }) {\r\n const saleTotal = basketDetails.products.reduce(\r\n (n: any, { totalLinePrice }: any) => n + totalLinePrice,\r\n 0\r\n );\r\n return saleTotal\r\n }\r\n\r\n getTotalWithLineDiscountAndLinePromotionApplied(basketDetails: { products: any; }): number {\r\n let saletotal: number = 0.0;\r\n for (let product of basketDetails.products) {\r\n // if (product.linePromotions) {\r\n // saletotal += product.linePromotions.promotionLinePrice;\r\n // } else if (\r\n // product.lineDiscount &&\r\n // !product.linePromotions\r\n // ) {\r\n // saletotal +=\r\n // product.quantity * Number(product.lineDiscount.unitPrice.toFixed(2));\r\n // } else {\r\n // saletotal +=\r\n // product.quantity * Number(product.selectedPrice.toFixed(2));\r\n // }\r\n saletotal += product.total;\r\n console.log(\r\n \"e-basket:update product Total:\" + saletotal,\r\n JSON.stringify(product)\r\n );\r\n }\r\n return saletotal;\r\n }\r\n\r\n getRefundedTotalWithQuantity(basketDetails: { products: string | any[]; }): number {\r\n let quantity = 0;\r\n for (let index = 0; index < basketDetails.products.length; index++) {\r\n const product: any = basketDetails.products[index];\r\n\r\n if (!product.refundedReasonDescription) {\r\n\r\n quantity = quantity + product.quantity;\r\n\r\n } else {\r\n quantity = quantity + (product.quantity - product.refundedQuantity);\r\n\r\n // basketDetails.total = basketDetails.total + product.refundedTotal;\r\n\r\n }\r\n }\r\n return quantity;\r\n\r\n }\r\n\r\n /**\r\n * Discount Total\r\n * @returns Discount Total\r\n */\r\n updateDiscountTotal() {\r\n let refundTotal = this.transactionDocument.basketSummary.refundTotal ? this.transactionDocument.basketSummary.refundTotal : 0;\r\n console.info(\"e-basket: transaction builder: refundTotal\", JSON.stringify(refundTotal),\r\n JSON.stringify(this.transactionDocument.basketSummary));\r\n const discountTotal =\r\n Math.abs(\r\n Math.abs(this.transactionDocument.basketSummary.saleTotal) -\r\n (\r\n Math.abs(this.transactionDocument.basketSummary.basketTotal) + Math.abs(refundTotal)\r\n )\r\n );\r\n console.log(\"e-basket: transaction builder: discountTotal\", JSON.stringify(discountTotal))\r\n return Number(discountTotal.toFixed(2));\r\n }\r\n\r\n updateReasonCode(reasonCode: {\r\n code: string;\r\n name: string;\r\n }): TransactionDocumentBuilder {\r\n this.transactionDocument.reasonCode = reasonCode.code;\r\n this.transactionDocument.reasonDescription = reasonCode.name;\r\n return this;\r\n }\r\n\r\n updateManagerOverride(\r\n useroverride: UserOverride\r\n ): TransactionDocumentBuilder {\r\n this.transactionDocument.override = useroverride;\r\n return this;\r\n }\r\n\r\n updateUserID(\r\n userID: string\r\n ): TransactionDocumentBuilder {\r\n this.transactionDocument.userId = userID;\r\n return this;\r\n }\r\n\r\n updateUserName(name: any) : TransactionDocumentBuilder {\r\n this.transactionDocument.userName = name;\r\n return this;\r\n\r\n }\r\n \r\n addCustomerDetails(customerDetail: Customer): TransactionDocumentBuilder {\r\n this.transactionDocument.customer = customerDetail;\r\n return this;\r\n }\r\n\r\n updateTaxBreakdown(basketDetails: Basket): TransactionDocumentBuilder {\r\n // let transactionDiscountTotal = 0;\r\n let taxBreakdown: TaxBreakdown = {\r\n taxLines: [],\r\n totalTaxableAmount: 0,\r\n };\r\n\r\n\r\n\r\n // if (this.transactionDocument.basket.transactionDiscount && this.transactionDocument.basket.transactionDiscount.length > 0) {\r\n // this.transactionDocument.basket.transactionDiscount.forEach((discount) => {\r\n // transactionDiscountTotal += discount.discountAmount;\r\n // });\r\n // }\r\n\r\n // if (this.transactionDocument.basket.transactionPromotion && this.transactionDocument.basket.transactionPromotion.length > 0) {\r\n // this.transactionDocument.basket.transactionPromotion.forEach(\r\n // (promotion) => {\r\n // transactionDiscountTotal += promotion.promotionAmount;\r\n // }\r\n // );\r\n // }\r\n\r\n basketDetails.products.forEach((product: any) => {\r\n let taxLine: TaxLine = {\r\n itemLineId: product.itemLineId,\r\n VAT: product.selectedVAT ? product.selectedVAT : 0,\r\n VATCode: product.selectedVATCode,\r\n taxLineTotal: 0,\r\n taxableAmount: product.total,\r\n PreTax: 0\r\n };\r\n console.info(\"Product contribution : item line ID :\", product.itemLineId,\r\n \"tax line :\", JSON.stringify(taxLine));\r\n\r\n // step 1\r\n // if Transaction Discount and/or promotion applied, find net selling price of each product as taxableamount\r\n // if (transactionDiscountTotal > 0) {\r\n product = this.basketService.validateProductItemDiscount(product);\r\n\r\n const productContributionInTotal =\r\n product.itemDiscounts.trnDiscountsPortion +\r\n product.itemDiscounts.trnPromotionsPortion -\r\n product.itemDiscounts.refundPortion;\r\n // tp+td-rp;\r\n\r\n console.info(\"Product contribution : item line ID :\", product.itemLineId,\r\n \"contribution :\", JSON.stringify(productContributionInTotal));\r\n // calculate net selling price after applying transaction discount as per product contribution\r\n taxLine.taxableAmount -= productContributionInTotal;\r\n // }\r\n\r\n //step 2 - find pre tax\r\n taxLine.PreTax = this.numberUtilService.trimTo2Decimal2((taxLine.taxableAmount * 100) / (100 + taxLine.VAT));\r\n\r\n //step 3 - Update taxbreakdown\r\n taxBreakdown.totalTaxableAmount += taxLine.taxableAmount;\r\n taxLine.taxableAmount = this.numberUtilService.trimTo2Decimal2(taxLine.taxableAmount);\r\n \r\n // step 4 - update tax Line total\r\n taxLine.taxLineTotal = this.numberUtilService.trimTo2Decimal2(taxLine.taxableAmount - taxLine.PreTax);\r\n taxBreakdown.taxLines.push(taxLine);\r\n });\r\n\r\n taxBreakdown.totalTaxableAmount = this.numberUtilService.trimTo2Decimal2(taxBreakdown.totalTaxableAmount);\r\n this.transactionDocument.basket.taxBreakdown = taxBreakdown;\r\n return this;\r\n }\r\n\r\n updateTotalTaxSummary(): TransactionDocumentBuilder {\r\n\r\n console.log(\"Total Tax Summery Request :\", JSON.stringify(this.transactionDocument.basket.taxBreakdown));\r\n\r\n\r\n let totalTaxSummaryArray: TotalTaxSummary[] = []\r\n let totalTaxSummaryGroup = []\r\n\r\n console.log(\"Tax Lines for Total Tax Summery :\", JSON.stringify(this.transactionDocument.basket.taxBreakdown.taxLines));\r\n\r\n\r\n this.transactionDocument.basket.taxBreakdown.taxLines.forEach((element: { VATCode: any; VAT: any; PreTax: any; taxLineTotal: any; }) => {\r\n let TaxSummary: TotalTaxSummary = {\r\n VATCode: \"\",\r\n VAT: -12345,\r\n PreTaxSum: 0,\r\n TaxSum: 0,\r\n TXrateSum: 0\r\n \r\n };\r\n TaxSummary.VATCode = element.VATCode;\r\n TaxSummary.VAT = element.VAT; \r\n TaxSummary.PreTaxSum = this.numberUtilService.trimTo2Decimal2(element.PreTax);\r\n TaxSummary.TaxSum = this.numberUtilService.trimTo2Decimal2(element.taxLineTotal);\r\n TaxSummary.TXrateSum = this.numberUtilService.trimTo2Decimal2(TaxSummary.PreTaxSum + TaxSummary.TaxSum); \r\n totalTaxSummaryArray.push(TaxSummary);\r\n })\r\n\r\n console.log(\"Total Tax Summery Without Grouped : \", JSON.stringify(totalTaxSummaryArray));\r\n \r\n totalTaxSummaryGroup = totalTaxSummaryArray.reduce((preparedArray:any,currentObj) => {\r\n\r\n let ind = preparedArray.findIndex((x: { VAT: any; }) => x.VAT === currentObj.VAT);\r\n if(ind === -1){\r\n preparedArray.push(currentObj)\r\n }else {\r\n preparedArray[ind].VATCode = currentObj.VATCode;\r\n preparedArray[ind].VAT = currentObj.VAT;\r\n preparedArray[ind].PreTaxSum += currentObj.PreTaxSum;\r\n preparedArray[ind].TaxSum += currentObj.TaxSum;\r\n preparedArray[ind].TXrateSum += currentObj.TXrateSum;\r\n }\r\n return preparedArray;\r\n },[])\r\n \r\n console.log(\"Total Tax Summer Group :\",totalTaxSummaryGroup);\r\n\r\n\r\n this.transactionDocument.basket.totalTaxSummary = totalTaxSummaryGroup;\r\n\r\n return this;\r\n\r\n }\r\n\r\n\r\n /**\r\n * TransactionId\r\n * @returns OriginalTransactionId\r\n */\r\n addOriginalTransId(tranDoc:TransactionDocument): TransactionDocumentBuilder {\r\n if (this.transactionDocument.type === TRANSACTION_TYPE.REFUND || this.transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND || this.transactionDocument.type === TRANSACTION_TYPE.SALE_EXCHANGE) {\r\n this.transactionDocument.originalTransId = tranDoc.transactionId;\r\n if(tranDoc.apiResponse && tranDoc.apiResponse.internalId)\r\n {\r\n this.transactionDocument.originalExternalId = tranDoc.apiResponse.internalId.toString();\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * unreferenced Refund\r\n * @returns boolean value\r\n */\r\n addUnreferencedRefund(): TransactionDocumentBuilder {\r\n this.transactionDocument.unreferencedRefund = true;\r\n return this;\r\n }\r\n\r\n getRefundTotal() {\r\n let totalRefund = 0;\r\n for (let index = 0; index < this.transactionDocument.basket.products.length; index++) {\r\n const product: TProduct = this.transactionDocument.basket.products[index];\r\n if (product.refundedTotal) {\r\n totalRefund = totalRefund + product.refundedTotal;\r\n }\r\n console.log(\"ebasket : transaction Service: totalRefund\" + totalRefund)\r\n }\r\n return totalRefund;\r\n }\r\n\r\n docId(docId: any): TransactionDocumentBuilder {\r\n this.transactionDocument.id = docId;\r\n return this;\r\n }\r\n}\r\n","import { DISCOUNTTYPE, LineDiscount, TProduct, TransactionDiscount, TransactionDocument, TRANSACTION_TYPE } from \"./mapper-library.model\"\r\nimport { TransactionDocumentBuilder } from \"./TransactionDocumentBuilder\";\r\nexport class RJMapperBuilderClass {\r\n\r\n private transactionDocument: TransactionDocument;\r\n private deviceId: any;\r\n private transactionNumber: any;\r\n private manifestVersion: any;\r\n private databaseSchemaVersion: any;\r\n private basketType: any;\r\n private xmlSchemaVersion: any;\r\n private majorVersion: any;\r\n private minorVersion: any;\r\n private externalState: any;\r\n private cashierId: any;\r\n private companyId: any;\r\n private terminalNumber: any;\r\n private taxMethodId: any;\r\n private tradingRegionId: any;\r\n private basketCurrencyId: any;\r\n private basketCountryId: any;\r\n private basketLanguageId: any;\r\n private itemCount = 0;\r\n private largestNumber = 0;\r\n private branchId: any;\r\n private createdAt: any;\r\n private updatedAt :any;\r\n private salesPersonName: any;\r\n private rjObject: any = {}\r\n\r\n constructor(transactionDoc?: TransactionDocument) {\r\n if (transactionDoc) {\r\n this.transactionDocument = transactionDoc;\r\n } else {\r\n this.transactionDocument = {\r\n transactionId: \"\",\r\n offlineTransactionId: \"\",\r\n transactionRef: \"\",\r\n dateTime: \"\",\r\n orgCode: \"\",\r\n storeId: \"\",\r\n storeNodeId: \"\",\r\n storeNodeStructure: \"\",\r\n deviceId: \"\",\r\n terminalId: \"\",\r\n userId: \"\",\r\n initiatingModule: \"eBasket\",\r\n export: false,\r\n basket: {} as any,\r\n basketSummary: {} as any,\r\n baseCurrency: \"\",\r\n type: \"\",\r\n operationStatus: \"\",\r\n createdAt: \"\",\r\n updatedAt: \"\",\r\n id: \"\",\r\n currentTransactionDetails: {} as any,\r\n saleTotal: 0,\r\n };\r\n }\r\n this.initilizeItemCount();\r\n this.setLineNumberForProducts();\r\n this.createdAt = this.getDate(this.transactionDocument.createdAt);\r\n this.updatedAt = this.getDate(this.transactionDocument.updatedAt);\r\n }\r\n\r\n getPosbasketInfo() {\r\n this.rjObject['Keyword'] = this.generateKeyword();\r\n this.rjObject['ID'] = this.generateId(this.createdAt);\r\n this.rjObject['XMLSchemaVersion'] = '2';\r\n this.rjObject['LastUpdated'] = this.updatedAt;\r\n this.rjObject['MajorVersion'] = this.majorVersion;\r\n this.rjObject['MinorVersion'] = this.minorVersion;\r\n this.rjObject['ManifestVersion'] = this.manifestVersion;\r\n this.rjObject['DatabaseSchemaVersion'] = this.databaseSchemaVersion;\r\n this.rjObject['BasketType'] = this.basketType;\r\n this.rjObject['State'] = this.getState();\r\n this.rjObject['ExternalState'] = this.externalState;\r\n\r\n return this;\r\n }\r\n\r\n\r\n getheaderInfo() {\r\n this.rjObject['Header'] = {};\r\n this.rjObject['Header'].TimeZoneOffset = this.convertToString(this.generateTimezoneoffset(this.transactionDocument.createdAt));\r\n this.rjObject['Header'].DateTimeCreated = this.createdAt;\r\n this.rjObject['Header'].OriginatedBy = {};\r\n this.rjObject['Header'].OriginatedBy.DeviceID = this.deviceId;\r\n this.rjObject['Header'].OriginatedBy.CashierID = this.cashierId;\r\n this.rjObject['Header'].OriginatedBy.CompanyID = this.companyId;\r\n this.rjObject['Header'].OriginatedBy.StoreID = this.transactionDocument.storeId;\r\n this.rjObject['Header'].OriginatedBy.BranchID = this.branchId;\r\n this.rjObject['Header'].OriginatedBy.TerminalNumber = this.terminalNumber;\r\n this.rjObject['Header'].OriginatedBy.TransactionNumber = this.transactionNumber;\r\n this.rjObject['Header'].TaxMethodID = this.taxMethodId;\r\n this.rjObject['Header'].DynamicStockLookup = this.generateDynamicStockLookUp();\r\n this.rjObject['Header'].BasketLanguageID = this.basketLanguageId; //todo\r\n this.rjObject['Header'].BasketCountryID = this.basketCountryId; //todo\r\n this.rjObject['Header'].BasketCurrencyID = this.transactionDocument.baseCurrency;\r\n this.rjObject['Header'].TradingRegionID = this.tradingRegionId;\r\n this.rjObject['Header'].Eurozone = \" \";//unknown\r\n this.rjObject['Header'].EuroBaseExchangeRate = \"\"; //unknown\r\n this.rjObject['Header'].PrintableName = this.transactionDocument.userName; //unknown\r\n\r\n return this;\r\n }\r\n\r\n rjMapper() {\r\n var transactionDiscount:any = [] ;\r\n if (this.transactionDocument.basket.transactionDiscount && this.transactionDocument.basket.transactionDiscount.length > 0) {\r\n transactionDiscount = this.transactionDocument.basket.transactionDiscount\r\n }\r\n if (this.transactionDocument.type === TRANSACTION_TYPE.SALE) {\r\n this.rjObject['ProductSale'] = [];\r\n this.rjObject['ModifierItem'] = [];\r\n\r\n this.transactionDocument.basket.products.forEach((element: any) => {\r\n let lineDiscount = [];\r\n if (this.transactionDocument.basket.lineDiscount && this.transactionDocument.basket.lineDiscount.length > 0) {\r\n lineDiscount = this.transactionDocument.basket.lineDiscount.filter((x: any) => x.itemLineId === element.itemLineId);\r\n if (lineDiscount.length > 0) {\r\n const index = this.transactionDocument.basket.lineDiscount.indexOf(lineDiscount[0]);\r\n if (index > -1) {\r\n this.transactionDocument.basket.lineDiscount.splice(index, 1);\r\n }\r\n }\r\n }\r\n let data = this.addProduct(element, (lineDiscount.length > 0 ? lineDiscount[0] : null),(transactionDiscount.length > 0 ? transactionDiscount : null));\r\n this.rjObject['ProductSale'].push(data);\r\n this.getModifierItem(lineDiscount.length > 0 ? lineDiscount[0] : null, element.itemLineId);\r\n });\r\n let transactionPromotion = [];\r\n if (this.transactionDocument.basket.transactionPromotion && this.transactionDocument.basket.transactionPromotion.length > 0) {\r\n transactionPromotion = this.transactionDocument.basket.transactionPromotion;\r\n this.getTransactionPromotion(transactionPromotion);\r\n }\r\n } else if (this.transactionDocument.type === TRANSACTION_TYPE.REFUND) {\r\n this.rjObject['ProductReturn'] = [];\r\n this.rjObject['ModifierItem'] = []; \r\n this.transactionDocument.basket.products.forEach((element: any) => {\r\n let data = this.returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null),(transactionDiscount.length > 0 ? transactionDiscount : null));\r\n this.rjObject['ProductReturn'].push(data);\r\n this.getModifierItem(element.lineDiscount, element.itemLineId);\r\n });\r\n } else if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND) {\r\n this.rjObject['ProductReturn'] = [];\r\n this.rjObject['ModifierItem'] = [];\r\n \r\n let transactionDoc: any = new TransactionDocumentBuilder().basket(this.transactionDocument.currentTransactionDetails).build();\r\n transactionDoc.basket.products.forEach((element: any) => {\r\n let data = this.returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null),(transactionDiscount.length > 0 ? transactionDiscount : null));\r\n let obj = {\r\n \"OriginalReceiptSupplied\": 0,\r\n \"OriginalBranchID\": 0,\r\n \"OriginalTerminalNumber\": 0,\r\n \"OriginalTransactionNumber\": 0,\r\n \"OriginalCashierNumber\": 0\r\n };\r\n data['Return'] = {...data['Return'], ...obj};\r\n this.rjObject['ProductReturn'].push(data);\r\n this.getModifierItem(element.lineDiscount, element.itemLineId);\r\n })\r\n } else if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_EXCHANGE) {\r\n this.rjObject['ProductReturn'] = [];\r\n this.rjObject['ProductSale'] = [];\r\n this.rjObject['ModifierItem'] = [];\r\n \r\n let transactionDoc: any = new TransactionDocumentBuilder().basket(this.transactionDocument.currentTransactionDetails).build();\r\n transactionDoc.basket.products.forEach((element: any) => {\r\n if (element.refundedQuantity > 0) {\r\n let returnProduct = this.returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null),(transactionDiscount.length > 0 ? transactionDiscount : null));\r\n let obj = {\r\n \"OriginalReceiptSupplied\": 0,\r\n \"OriginalBranchID\": 0,\r\n \"OriginalTerminalNumber\": 0,\r\n \"OriginalTransactionNumber\": 0,\r\n \"OriginalCashierNumber\": 0\r\n };\r\n returnProduct['Return'] = {...returnProduct['Return'], ...obj};\r\n this.rjObject['ProductReturn'].push(returnProduct);\r\n } else {\r\n let addProduct = this.addProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null) ,(transactionDiscount.length > 0 ? transactionDiscount : null));\r\n this.rjObject['ProductSale'].push(addProduct);\r\n }\r\n this.getModifierItem(element.lineDiscount, element.itemLineId);\r\n })\r\n\r\n }\r\n return this;\r\n }\r\n\r\n getBasketDiscount() {\r\n if (!this.transactionDocument.basket.transactionDiscount) return this;\r\n this.rjObject['BasketDiscount'] = [];\r\n this.transactionDocument.basket.transactionDiscount.forEach((element: any) => {\r\n let obj: any = {}\r\n obj['XMLSchemaVersion'] = this.xmlSchemaVersion;\r\n obj['DeviceID']=this.deviceId;\r\n obj['DateTimeCreated']=this.updatedAt;\r\n obj['NetValue'] = this.convertToString(element.discountAmount * -1);\r\n obj['EffectiveNetValue'] =this.convertToString( element.discountAmount * -1);\r\n obj['Description'] = element.reasonDisplayText;\r\n obj['UserID'] = this.transactionDocument.userName;\r\n obj['ReasonCodeID'] = element.reasonCode;\r\n obj['DiscountType'] = this.convertToString(element.discountType.toUpperCase() == DISCOUNTTYPE.PERCENT.toUpperCase() ? 0 : 1); \r\n obj['RoundingRule'] = this.convertToString(2);\r\n obj['ModifiedLineNumber'] = element.itemLineIds; \r\n obj['LineNumber'] = this.convertToString(this.generateLineNumber()); \r\n obj['DiscountedValue'] = this.transactionDocument.basketSummary.basketTotal + this.transactionDocument.basketSummary.discountTotal;\r\n if(element.discountType.toUpperCase() == DISCOUNTTYPE.PERCENT.toUpperCase()){\r\n obj['DiscountPercentage'] = this.convertToString((element.discountAmount / this.transactionDocument.basketSummary.basketTotal).toFixed(1))\r\n }\r\n if(this.transactionDocument.type === 'REFUND'){\r\n obj['NetValue'] = this.convertToString(element.discountAmount < 0 ? -element.discountAmount : element.discountAmount);\r\n obj['EffectiveNetValue'] =this.convertToString( element.discountAmount < 0 ? -element.discountAmount : element.discountAmount);\r\n }\r\n\r\n this.rjObject['BasketDiscount'].push(obj);\r\n });\r\n return this;\r\n }\r\n\r\n getModifierItem(data: any, lineNo: any) {\r\n if (data && lineNo) {\r\n let obj: any = {};\r\n obj.XMLSchemaVersion = 1;\r\n obj.LineNumber = this.generateLineNumber();\r\n obj.NetValue = 0;\r\n obj.EffectiveNetValue = 0;\r\n obj.Description = data.percentageDiscountReasonName ? data.percentageDiscountReasonName : data.priceOverrideReasonName;\r\n obj.DeviceID = this.deviceId;\r\n obj.UserID = this.transactionDocument.userName;\r\n obj.DateTimeCreated = this.updatedAt;\r\n obj.AuthorisingUserID = this.transactionDocument.userName;\r\n obj.ReasonCodeID = data.percentageDiscountReasonCode ? data.percentageDiscountReasonCode : data.priceOverrideReasonCode;\r\n obj.ModifiedLineNumber = lineNo;\r\n obj.ModifiedIndex = 1;\r\n\r\n this.rjObject['ModifierItem'].push(obj);\r\n }\r\n }\r\n\r\n getTrailerInfo() {\r\n this.rjObject['Trailer'] = {};\r\n this.rjObject.Trailer.DateTimeCompleted = this.updatedAt;\r\n this.rjObject.Trailer.CompletedBy = {};\r\n this.rjObject.Trailer.CompletedBy.DeviceID = this.deviceId;\r\n this.rjObject.Trailer.CompletedBy.CashierID = this.cashierId;\r\n this.rjObject.Trailer.CompletedBy.StoreID = this.transactionDocument.storeId;\r\n this.rjObject.Trailer.CompletedBy.BranchID = this.branchId;\r\n this.rjObject.Trailer.CompletedBy.TerminalNumber = this.terminalNumber;\r\n this.rjObject.Trailer.CompletedBy.TransactionNumber = this.transactionNumber;\r\n this.rjObject.Trailer.Total = this.convertToString(this.transactionDocument.basketSummary.basketTotal * 100);\r\n this.rjObject.Trailer.ItemCount = this.itemCount; //gives total count for product\r\n this.rjObject.Trailer.ItemQuantity = this.convertToString(this.transactionDocument.basketSummary.totalItems);\r\n this.rjObject.Trailer.NetItemQuantity = this.convertToString(this.transactionDocument.basketSummary.totalItems);\r\n this.rjObject.Trailer.TaxTotal = this.convertToString(this.removeDecimal(this.transactionDocument.basketSummary.VATTotal));\r\n this.rjObject.Trailer.SequenceDeviceID = this.deviceId;\r\n this.rjObject.Trailer.SequenceNumber = 'snsn' //static for now\r\n\r\n this.rjObject['Trailer']['TaxItem'] = [];\r\n this.transactionDocument.basket.taxBreakdown.taxLines.forEach((element: any) => {\r\n let obj: any = {};\r\n\r\n obj['XMLSchemaVersion'] = this.xmlSchemaVersion;\r\n obj['TaxRate'] = this.convertToString(element.VATCode);\r\n obj['TaxableTotal'] = this.convertToString(this.removeDecimal(element.taxableAmount));\r\n obj['TaxTotal'] = this.convertToString(this.removeDecimal(this.removeDecimal(element.taxLineTotal)));\r\n obj['TaxDescription'] = this.convertToString(element.VATCode);\r\n obj['TaxIncluded'] = '1';\r\n obj['TaxPercentage'] = this.addDecimal(element.VAT.toFixed(2)).toFixed(2);\r\n\r\n this.rjObject['Trailer']['TaxItem'].push(obj)\r\n });\r\n if (this.transactionDocument.basket.linePromotion.length > 0 || this.transactionDocument.basket.linePromotion.length > 0) {\r\n this.rjObject['Trailer']['PromotionItem'] = [];\r\n if (this.transactionDocument.basket.linePromotion.length > 0) {\r\n this.transactionDocument.basket.linePromotion.forEach((element: any) => {\r\n let obj: any = {};\r\n\r\n obj['PromotionID'] = element.promotionId;\r\n obj['PromotionSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;\r\n obj['PromotionQuantity'] = \"1\";\r\n obj['PromotionDescription'] = element.displayText;\r\n obj['PromotionHit'] = {}\r\n obj['PromotionHit']['XMLSchemaVersion'] = this.xmlSchemaVersion;\r\n obj['PromotionHit']['HitNumber'] = \"1\";\r\n obj['PromotionHit']['HitQuantity'] = \"1\";\r\n obj['PromotionHit']['HitSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;\r\n obj['PromotionHit']['PromotionTrigger'] = {};\r\n let product = this.transactionDocument.basket.products.find((item: any) => item.itemLineId == element.itemLineId);\r\n obj['PromotionHit']['PromotionTrigger']['XMLSchemaVersion'] = this.xmlSchemaVersion;\r\n obj['PromotionHit']['PromotionTrigger']['ProductID'] = product.SKU;\r\n obj['PromotionHit']['PromotionTrigger']['UnitValue'] = this.convertToString(element.promotionLinePrice / product.quantity);\r\n obj['PromotionHit']['PromotionTrigger']['LineNumber'] = this.getNumber(product.SKU);\r\n obj['PromotionHit']['PromotionTrigger']['Quantity'] = this.convertToString(product.quantity.toFixed(1));\r\n obj['PromotionHit']['PromotionTrigger']['TaxCode'] = this.transactionDocument.basket.taxBreakdown.taxLines.find((item: any) => item.itemLineId == element.itemLineId).VATCode;\r\n this.rjObject['Trailer']['PromotionItem'].push(obj);\r\n });\r\n }\r\n\r\n if (this.transactionDocument.basket.transactionPromotion.length > 0) {\r\n\r\n this.transactionDocument.basket.transactionPromotion.forEach((element: any) => {\r\n let obj: any = {};\r\n obj['PromotionID'] = element.promotionId;\r\n obj['PromotionSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;\r\n obj['PromotionQuantity'] = \"1\";\r\n obj['PromotionDescription'] = element.displayText;\r\n obj['PromotionHit'] = {}\r\n obj['PromotionHit']['XMLSchemaVersion'] = this.xmlSchemaVersion;\r\n obj['PromotionHit']['HitNumber'] = \"1\";\r\n obj['PromotionHit']['HitQuantity'] = \"1\";\r\n obj['PromotionHit']['HitSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;\r\n obj['PromotionHit']['PromotionTrigger'] = [];\r\n this.transactionDocument.basket.products.forEach((product: any) => {\r\n let promotionTrigger = {};\r\n element.itemLineIds.forEach((itemLineId: any) => {\r\n if (JSON.stringify(itemLineId) === product.itemLineId) {\r\n promotionTrigger['XMLSchemaVersion'] = this.xmlSchemaVersion;\r\n promotionTrigger['ProductID'] = product.SKU;\r\n promotionTrigger['UnitValue'] = this.convertToString(element.promotionLinePrice / product.quantity);\r\n promotionTrigger['LineNumber'] = this.getNumber(product.SKU);\r\n promotionTrigger['Quantity'] = this.convertToString(product.quantity);\r\n promotionTrigger['TaxCode'] = this.transactionDocument.basket.taxBreakdown.taxLines.find((item: any) => item.itemLineId == product.itemLineId).VATCode;\r\n obj['PromotionHit']['PromotionTrigger'].push(promotionTrigger);\r\n }\r\n });\r\n });\r\n this.rjObject['Trailer']['PromotionItem'].push(obj);\r\n });\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n getTenderInfo() {\r\n if (this.transactionDocument.paymentDetails && this.transactionDocument.paymentDetails.length > 0) {\r\n this.transactionDocument.paymentDetails.forEach((element: any) => {\r\n if(element.externalTenderKey){\r\n this.rjObject[element.externalTenderKey] = [];\r\n if (element.paymentType.toUpperCase() === 'GIFT CARD') {\r\n let obj = {\r\n XMLSchemaVersion: this.xmlSchemaVersion,\r\n LineNumber: this.generateLineNumber(),\r\n NetValue: this.convertToString(-1 * this.removeDecimal((Math.round(element.amount)))),\r\n EffectiveNetValue: this.convertToString(-1 * this.removeDecimal((Math.round(element.amount)))),\r\n Description: this.getDescription(element),\r\n DeviceID: this.deviceId,\r\n UserID: this.transactionDocument.userName,\r\n DateTimeCreated: this.updatedAt,\r\n TenderType: element.externalTenderType ? element.externalTenderType : '',\r\n TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',\r\n TenderAmount: this.convertToString(-1 * this.removeDecimal((Math.round(element.amount)))),\r\n CurrencyID: this.transactionDocument.baseCurrency,\r\n CurrencyDescription: this.transactionDocument.baseCurrency,\r\n GiftVoucherSalesAllowed: '',//todo\r\n AllowRechargeableVoucherSales: '',//todo\r\n GiftVoucherID: ''\r\n }\r\n this.rjObject[element.externalTenderKey].push(obj)\r\n }\r\n else {\r\n let obj1 = {\r\n XMLSchemaVersion: \"1\",\r\n LineNumber: this.generateLineNumber(),//todo\r\n NetValue: this.convertToString(-1 * this.removeDecimal(Math.round(element.amount))),\r\n EffectiveNetValue: this.convertToString(-1 * this.removeDecimal(Math.round(element.amount))),\r\n Description: this.getDescription(element),\r\n DeviceID: this.deviceId,\r\n UserID: this.transactionDocument.userName,\r\n DateTimeCreated: this.updatedAt,\r\n TenderType: element.externalTenderType ? element.externalTenderType : '',\r\n TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',\r\n TenderAmount: this.convertToString(-1 * this.removeDecimal(Math.round(element.amount))),\r\n CurrencyID: this.transactionDocument.baseCurrency,\r\n CurrencyDescription: this.transactionDocument.baseCurrency,\r\n IncludeInTransactionTotalCheck: \"1\",\r\n AllowRechargeableVoucherSales: \"1\",\r\n OpenDrawerAtEnd: \"1\"\r\n }\r\n this.rjObject[element.externalTenderKey].push(obj1)\r\n }\r\n } else{\r\n this.rjObject['CashTender'] = [];\r\n if (element.paymentType.toUpperCase() === 'GIFT CARD') {\r\n let obj = {\r\n XMLSchemaVersion: this.xmlSchemaVersion,\r\n LineNumber: this.generateLineNumber(),\r\n NetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),\r\n EffectiveNetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),\r\n Description: this.getDescription(element),\r\n DeviceID: this.deviceId,\r\n UserID: this.transactionDocument.userName,\r\n DateTimeCreated: this.updatedAt,\r\n TenderType: element.externalTenderType ? element.externalTenderType : '',\r\n TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',\r\n TenderAmount: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),\r\n CurrencyID: this.transactionDocument.baseCurrency,\r\n CurrencyDescription: this.transactionDocument.baseCurrency,\r\n GiftVoucherSalesAllowed: '',//todo\r\n AllowRechargeableVoucherSales: '',//todo\r\n GiftVoucherID: ''\r\n }\r\n this.rjObject['CashTender'].push(obj)\r\n }\r\n else {\r\n let obj1 = {\r\n XMLSchemaVersion: \"1\",\r\n LineNumber: this.generateLineNumber(),\r\n NetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),\r\n EffectiveNetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),\r\n Description: this.getDescription(element),\r\n DeviceID: this.deviceId,\r\n UserID: this.transactionDocument.userName,\r\n DateTimeCreated: this.updatedAt,\r\n TenderType: element.externalTenderType ? element.externalTenderType : '',\r\n TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',\r\n TenderAmount: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),\r\n CurrencyID: this.transactionDocument.baseCurrency,\r\n CurrencyDescription: this.transactionDocument.baseCurrency,\r\n IncludeInTransactionTotalCheck: \"1\",\r\n AllowRechargeableVoucherSales: \"1\",\r\n OpenDrawerAtEnd: \"1\"\r\n }\r\n this.rjObject['CashTender'].push(obj1)\r\n }\r\n }\r\n });\r\n }\r\n return this;\r\n }\r\n\r\n getNumber(productId) {\r\n let lineNumber; \r\n for (let i = 0; i < this.rjObject['ProductSale'].length; i++) {\r\n const element = this.rjObject['ProductSale'][i];\r\n if(JSON.stringify(productId) === JSON.stringify(element.ProductID)){\r\n lineNumber = element.LineNumber;\r\n break;\r\n }\r\n }\r\n return lineNumber;\r\n }\r\n\r\n setLineNumberForProducts() {\r\n let itemLineIdArray = [];\r\n itemLineIdArray = this.transactionDocument.basket.products.map((product: any) => {\r\n return parseInt(product.itemLineId);\r\n })\r\n this.largestNumber = itemLineIdArray.reduce((a: any, b: any) => Math.max(a, b));\r\n }\r\n\r\n generateLineNumber() {\r\n this.largestNumber += 1;\r\n this.itemCount += 1;\r\n return this.largestNumber;\r\n }\r\n\r\n initilizeItemCount() {\r\n this.itemCount = this.transactionDocument.basket.products.length;\r\n }\r\n\r\n build() {\r\n return this.rjObject;\r\n }\r\n\r\n getDescription(element: any) {\r\n if (element.paymentType.toUpperCase() === 'CARD') {\r\n return element.cardType\r\n }\r\n else {\r\n return element.paymentType;\r\n }\r\n }\r\n\r\n getMMGROUPID(attributes) {\r\n if (attributes && attributes.length > 0) {\r\n let filterValue = attributes.filter((attribute) => attribute.name === \"MMGROUPID\");\r\n if(filterValue && filterValue.length > 0){\r\n return filterValue[0].value;\r\n }\r\n }\r\n }\r\n\r\n setDeviceInfo(id: any) {\r\n this.deviceId = id\r\n return this\r\n }\r\n\r\n removeDecimal(value: number) {\r\n return value * 100;\r\n }\r\n\r\n addDecimal(value: number) {\r\n return value /100;\r\n }\r\n\r\n setTransactionNumber(value: any) {\r\n this.transactionNumber = value;\r\n return this\r\n }\r\n\r\n setManifestVersion(value: any) {\r\n this.manifestVersion = value;\r\n return this\r\n }\r\n\r\n setDatabaseSchemaVersion(value: any) {\r\n this.databaseSchemaVersion = value;\r\n return this\r\n }\r\n\r\n setBasketType(value: any) {\r\n this.basketType = value;\r\n return this\r\n }\r\n\r\n setTradingRegionID(value: any) {\r\n this.tradingRegionId = value\r\n return this\r\n }\r\n\r\n setCompanyID(value: any) {\r\n this.companyId = value\r\n return this\r\n }\r\n\r\n setTaxMethodID(value: any) {\r\n this.taxMethodId = value\r\n return this\r\n }\r\n\r\n setMajorVersion(value: any) {\r\n this.majorVersion = value\r\n return this\r\n }\r\n\r\n setMinorVersion(value: any) {\r\n this.minorVersion = value\r\n return this\r\n }\r\n\r\n setXMLSchemaVersion(value: any) {\r\n this.xmlSchemaVersion = value\r\n return this\r\n }\r\n\r\n setExternalState(value: any) {\r\n this.externalState = value\r\n return this\r\n }\r\n\r\n setCashierID() {\r\n this.cashierId = (this.transactionDocument && this.transactionDocument.userName) ? this.transactionDocument.userName : '';\r\n return this\r\n }\r\n\r\n setTerminalNumber(value: any) {\r\n this.terminalNumber = value;\r\n return this;\r\n }\r\n\r\n setBasketLanguageID(value: any) {\r\n this.basketLanguageId = value;\r\n return this;\r\n }\r\n setBasketCountryID(value: any) {\r\n this.basketCountryId = value;\r\n return this;\r\n }\r\n\r\n setBasketCurrencyID(value: any) {\r\n this.basketCurrencyId = value;\r\n return this;\r\n }\r\n\r\n setBranchID(value: any) {\r\n this.branchId = value;\r\n return this;\r\n }\r\n\r\n setSalesPersonName(value: any) {\r\n this.salesPersonName = value;\r\n return this;\r\n }\r\n\r\n generateId(date: any) {\r\n let newDateTime = date.replace(/[^0-9]/g, '')\r\n let id = (this.deviceId + '|' + newDateTime + '|' + this.transactionNumber).toString();\r\n return id;\r\n } \r\n\r\n generateTimezoneoffset(date: any) {\r\n let x = date ? date : '';\r\n return new Date(x).getTimezoneOffset();\r\n }\r\n\r\n generateKeyword() {\r\n let x = (this.companyId + '|' + this.transactionDocument.storeId + '|' + this.terminalNumber + '|' + this.transactionNumber).toString();\r\n return x;\r\n }\r\n\r\n getState() {\r\n if (this.transactionDocument.operationStatus === 'PAY_SUCCESS') {\r\n return 'Completed';\r\n }\r\n else {\r\n return 'Cancelled';\r\n }\r\n }\r\n\r\n returnProduct(element: any, lineDiscount: LineDiscount , transactionDiscount: TransactionDiscount) {\r\n let obj: any = {};\r\n let taxTotal = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item: any) => item.itemLineId == element['itemLineId']);\r\n obj['XMLSchemaVersion'] = this.xmlSchemaVersion;\r\n obj['LineNumber'] = element['itemLineId'];\r\n obj['NetValue'] = this.removeDecimal(element['refundedTotal']);\r\n obj['EffectiveNetValue'] = this.removeDecimal(element['refundedTotal']);\r\n obj['Description'] = element['description'];\r\n obj['DeviceID'] = this.transactionDocument['terminalId'];\r\n obj['UserID'] = this.transactionDocument.userName;\r\n obj['DateTimeCreated'] = this.createdAt;\r\n obj['ExtendedValue'] = this.removeDecimal(element['totalLinePrice']*-1);\r\n obj['UnitPrice'] = this.removeDecimal(element['price']);\r\n obj['Quantity'] = this.getQuantity(element);\r\n obj['OriginalTaxAmountSet'] = 1;\r\n obj['ProductID'] = element['SKU'];\r\n obj['HandKeyed'] = 1;\r\n obj['LongDescription'] = element['description'];\r\n obj['Return'] = {};\r\n obj['Return']['ReturnReasonID'] = element['refundedReason'];\r\n obj['Return']['ReturnDescription'] = element['refundedReasonDescription'];\r\n obj['Return']['ReturnToStock'] = this.getQuantity(element);\r\n obj['TaxCode'] = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item: any) => item.itemLineId == element['itemLineId']).VATCode;\r\n\r\n obj['DisplayTaxCode'] = ''; // todo\r\n obj['ProductAttributes'] = ''; //todo - not required\r\n obj['Perishable'] = this.getMMGROUPID(element.attributes);\r\n //obj['MMGroupID'] = this.getCaregories(element);\r\n obj['MMGroupID'] = this.getMMGROUPID(element.attributes);\r\n obj['CustomerDetails'] = \"\"; // todo - blank\r\n obj['TotalPromotionSaving'] = element['promotionAmount'] || -1; // TODO\r\n obj['OriginalTaxAmount'] = this.convertToString((this.removeDecimal(this.getOriginalTax(element,taxTotal.VAT) * -1)).toFixed(2));\r\n obj['taxAmount'] = this.removeDecimal(taxTotal.taxLineTotal < 0 ?(taxTotal.taxLineTotal) : (-taxTotal.taxLineTotal));\r\n\r\n if (lineDiscount) {\r\n if (lineDiscount.percentageDiscountReasonName && lineDiscount.percentageDiscountReasonCode) {\r\n // line discount\r\n obj['Discount'] = {};\r\n obj['Discount'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;\r\n obj['Discount'].ModifierDateTime = obj.DateTimeCreated;\r\n obj['Discount'].ModifierReasonID = lineDiscount.percentageDiscountReasonCode;\r\n obj['Discount'].ModifierDescription = lineDiscount.percentageDiscountReasonName;\r\n obj['Discount'].AuthorisingUserID = this.transactionDocument.userName;\r\n obj['Discount'].DiscountType = lineDiscount.discountType;\r\n obj['Discount'].XMLSchemaVersion = 1;\r\n obj['Discount'].OriginalPrice = this.removeDecimal(lineDiscount.discountAmount + (lineDiscount.discountedLinePrice || 0));\r\n obj['Discount'].DiscountedValue = this.removeDecimal(lineDiscount.unitPrice);\r\n obj['Discount'].DiscountPercentage = lineDiscount.percentageDiscountValue;\r\n obj['Discount'].RoundingRule = 2;\r\n }\r\n\r\n if (lineDiscount.priceOverrideReasonCode && lineDiscount.priceOverrideReasonName) {\r\n //price override\r\n obj['PriceOverride'] = {};\r\n obj['PriceOverride'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;\r\n obj['PriceOverride'].ModifierDateTime = obj.DateTimeCreated;\r\n obj['PriceOverride'].ModifierReasonID = lineDiscount.priceOverrideReasonCode;\r\n obj['PriceOverride'].ModifierReasonDescription = lineDiscount.priceOverrideReasonName;\r\n obj['PriceOverride'].AuthorisingUserID = this.transactionDocument.userName;\r\n obj['PriceOverride'].XMLSchemaVersion = 1;\r\n obj['PriceOverride'].NewPrice = this.removeDecimal(lineDiscount.unitPrice);\r\n obj['PriceOverride'].OriginalPrice = this.removeDecimal(lineDiscount.discountedLinePrice || 0 + lineDiscount.discountAmount);\r\n }\r\n\r\n //update the product price\r\n obj.NetValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;\r\n obj.EffectiveNetValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;\r\n obj.ExtendedValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;\r\n obj.UnitPrice = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;\r\n }\r\n\r\n if(transactionDiscount) {\r\n obj['BasketDiscountModifier'] = [];\r\n this.transactionDocument.basket.transactionDiscount.forEach((e: any) => { \r\n let discountObj: any ={}\r\n e.itemLineIds.forEach((x: any) => {\r\n if (x == element.itemLineId) { \r\n var discountAmount = this.convertToString(e.discountAmount * -1); \r\n discountObj.BasketDiscountLineNumber = this.getLineNumber(e,discountAmount);\r\n discountObj.XMLSchemaVersion = this.xmlSchemaVersion;\r\n discountObj.DiscountedValue = this.getDiscountedValue(element.totalLinePrice, e.discountAmount);\r\n obj['BasketDiscountModifier'].push(discountObj);\r\n } \r\n }); \r\n });\r\n var totaltransactionDiscount = 0;\r\n obj['BasketDiscountModifier'].forEach((value:any)=>{\r\n totaltransactionDiscount = totaltransactionDiscount + value.DiscountedValue;\r\n });\r\n //update the product price\r\n obj['EffectiveNetValue'] = obj.EffectiveNetValue + totaltransactionDiscount;\r\n }\r\n\r\n if (this.transactionDocument.basket.transactionPromotion.length > 0) {\r\n obj['PromotionSaving'] = [];\r\n this.transactionDocument.basket.transactionPromotion.forEach((transactionPromo: any) => {\r\n let promotionObj: any = {};\r\n transactionPromo.itemLineIds.forEach((itemLineId: any) => {\r\n if (itemLineId == element.itemLineId) {\r\n promotionObj.ModifierValue = transactionPromo.promotionAmount;\r\n promotionObj.ModifierDateTime = this.transactionDocument.createdAt;\r\n promotionObj.ModifierDescription = transactionPromo.displayText;\r\n promotionObj.XMLSchemaVersion = this.xmlSchemaVersion;\r\n promotionObj.PromotionID = transactionPromo.promotionId;\r\n promotionObj.PromotionDescription = transactionPromo.displayText;\r\n promotionObj.HitNumber = '1';\r\n promotionObj.PromotionHitProductQuantity = this.getQuantity(element);\r\n promotionObj.PromotionHitQuantity = this.getQuantity(element) * -1;\r\n obj['PromotionSaving'].push(promotionObj);\r\n }\r\n });\r\n });\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n addProduct(element: TProduct, lineDiscount: LineDiscount, transactionDiscount: TransactionDiscount) {\r\n let taxTotal = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item: any) => item.itemLineId == element['itemLineId']);\r\n let obj: any = {\r\n XMLSchemaVersion: this.xmlSchemaVersion,\r\n LineNumber: element.itemLineId,\r\n NetValue: this.removeDecimal(element.totalLinePrice),\r\n EffectiveNetValue: this.removeDecimal(element.totalLinePrice),\r\n Description: element.description,\r\n DeviceID: this.deviceId,\r\n UserID: this.transactionDocument.userName,\r\n DateTimeCreated: this.createdAt,\r\n ExtendedValue: this.removeDecimal(element.price),\r\n UnitPrice: this.removeDecimal(element.price),\r\n //MMGroupID: this.getCaregories(element),\r\n Quantity: element.quantity,\r\n SalespersonID: this.transactionDocument.userName,\r\n SalespersonName: this.salesPersonName,\r\n TaxCode: this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item: any) => item.itemLineId == element['itemLineId']).VATCode,\r\n TaxModifiable: \"1\", //todo\r\n OriginalTaxAmount : this.convertToString((this.removeDecimal(this.getOriginalTax(element,taxTotal.VAT)).toFixed(2))),\r\n TaxAmount : this.convertToString(this.removeDecimal(taxTotal.taxLineTotal)),\r\n OriginalTaxAmountSet: \"1\",//todo\r\n ProductID: element.SKU,\r\n HandKeyed: \"1\",//todo\r\n CustomerDetails: \"\",\r\n Perishable: this.getMMGROUPID(element.attributes),\r\n MMGroupID: this.getMMGROUPID(element.attributes)\r\n }\r\n if (lineDiscount) {\r\n if (lineDiscount.percentageDiscountReasonName && lineDiscount.percentageDiscountReasonCode) {\r\n // line discount\r\n obj['Discount'] = {};\r\n obj['Discount'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;\r\n obj['Discount'].ModifierDateTime = obj.DateTimeCreated;\r\n obj['Discount'].ModifierReasonID = lineDiscount.percentageDiscountReasonCode;\r\n obj['Discount'].ModifierDescription = lineDiscount.percentageDiscountReasonName;\r\n obj['Discount'].AuthorisingUserID = this.transactionDocument.userName;\r\n obj['Discount'].DiscountType = lineDiscount.discountType;\r\n obj['Discount'].XMLSchemaVersion = 1;\r\n obj['Discount'].OriginalPrice = this.removeDecimal(lineDiscount.discountAmount + (lineDiscount.discountedLinePrice || 0));\r\n obj['Discount'].DiscountedValue = this.removeDecimal(lineDiscount.unitPrice);\r\n obj['Discount'].DiscountPercentage = lineDiscount.percentageDiscountValue;\r\n obj['Discount'].RoundingRule = 2;\r\n }\r\n\r\n if (lineDiscount.priceOverrideReasonCode && lineDiscount.priceOverrideReasonName) {\r\n //price override\r\n obj['PriceOverride'] = {};\r\n obj['PriceOverride'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;\r\n obj['PriceOverride'].ModifierDateTime = obj.DateTimeCreated;\r\n obj['PriceOverride'].ModifierReasonID = lineDiscount.priceOverrideReasonCode;\r\n obj['PriceOverride'].ModifierReasonDescription = lineDiscount.priceOverrideReasonName;\r\n obj['PriceOverride'].AuthorisingUserID = this.transactionDocument.userName;\r\n obj['PriceOverride'].XMLSchemaVersion = this.xmlSchemaVersion;\r\n obj['PriceOverride'].NewPrice = this.removeDecimal(lineDiscount.unitPrice);\r\n obj['PriceOverride'].OriginalPrice = this.removeDecimal(lineDiscount.discountedLinePrice || 0 + lineDiscount.discountAmount);\r\n }\r\n\r\n //update the product price\r\n obj['NetValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);\r\n obj['EffectiveNetValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);\r\n obj['ExtendedValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);\r\n obj['UnitPrice'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);\r\n }\r\n\r\n if(transactionDiscount) {\r\n obj['BasketDiscountModifier'] = [];\r\n this.transactionDocument.basket.transactionDiscount.forEach((e:any) => { \r\n let discountObj: any ={};\r\n e.itemLineIds.forEach((itemLineId: any) => {\r\n if (itemLineId == element.itemLineId) { \r\n let discountAmount = this.convertToString(e.discountAmount * -1); \r\n discountObj.XMLSchemaVersion = this.xmlSchemaVersion;\r\n discountObj.DiscountedValue = -(this.getDiscountedValue(element.totalLinePrice, e.discountAmount));\r\n discountObj.BasketDiscountLineNumber = this.getLineNumber(e,discountAmount) ;\r\n obj['BasketDiscountModifier'].push(discountObj); \r\n } \r\n }); \r\n });\r\n let totaltransactionDiscount = 0;\r\n obj['BasketDiscountModifier'].forEach((value:any)=>{\r\n totaltransactionDiscount = totaltransactionDiscount + value.DiscountedValue;\r\n });\r\n //update the product price\r\n obj['EffectiveNetValue'] = obj.EffectiveNetValue + totaltransactionDiscount; \r\n }\r\n \r\n if (this.transactionDocument.basket.transactionPromotion.length > 0 || this.transactionDocument.basket.linePromotion.length > 0) {\r\n obj['DistributedPromotionSaving'] = [];\r\n if (this.transactionDocument.basket.transactionPromotion.length > 0) {\r\n this.transactionDocument.basket.transactionPromotion.forEach((e: any) => {\r\n let promotionObj: any = {};\r\n e.itemLineIds.forEach((itemLineId: any) => {\r\n if (itemLineId == element.itemLineId) {\r\n promotionObj.PromotionID = e.promotionId;\r\n promotionObj.Hit = '1';\r\n promotionObj.Saving = this.getSaving(element.totalLinePrice, e.promotionAmount);\r\n promotionObj.ISaving = this.getSaving(element.totalLinePrice, e.promotionAmount);\r\n obj['DistributedPromotionSaving'].push(promotionObj);\r\n }\r\n });\r\n });\r\n }\r\n\r\n if (this.transactionDocument.basket.linePromotion.length > 0) {\r\n this.transactionDocument.basket.linePromotion.forEach((linePromotion: any) => {\r\n let promotionObj: any = {};\r\n if (element.itemLineId == linePromotion.itemLineId) {\r\n promotionObj.PromotionID = linePromotion.promotionId;\r\n promotionObj.Hit = \"1\";\r\n promotionObj.Saving = linePromotion.promotionLinePrice;\r\n promotionObj.ISaving = linePromotion.promotionLinePrice;\r\n obj['DistributedPromotionSaving'].push(promotionObj);\r\n }\r\n });\r\n }\r\n let transactionPromotion = 0;\r\n obj['DistributedPromotionSaving'].forEach((value: any) => {\r\n transactionPromotion = transactionPromotion + value.Saving;\r\n });\r\n obj['EffectiveNetValue'] = obj.EffectiveNetValue + transactionPromotion;\r\n }\r\n return obj;\r\n }\r\n\r\n getSaving(price,promotionAmount): any {\r\n let Saving = (price*promotionAmount)/this.transactionDocument.basketSummary.saleTotal;\r\n return Saving;\r\n }\r\n\r\n getLineNumber(value: any,discountAmount:string ){\r\n let lineNumber;\r\n for (let i = 0; i < this.rjObject['BasketDiscount'].length; i++) {\r\n const element = this.rjObject['BasketDiscount'][i];\r\n if( value.reasonCode === element.ReasonCodeID && discountAmount === element.NetValue){\r\n lineNumber = element.LineNumber;\r\n break; \r\n } \r\n }\r\n return lineNumber; \r\n }\r\n\r\n\r\n getDiscountedValue(price:any ,discountAmount:any ) {\r\n let DiscountedValue =((price * discountAmount)/this.transactionDocument.basketSummary.saleTotal)*100 ;\r\n return DiscountedValue;\r\n }\r\n\r\n getOriginalTax(element: TProduct, VAT) {\r\n let pricebeforetax = (element.price * 100)/(100 + VAT )\r\n let originaltax= element.price - pricebeforetax\r\n return originaltax;\r\n }\r\n\r\n convertToString(value: any) {\r\n try {\r\n value = JSON.stringify(value);\r\n return value;\r\n }\r\n catch (e) {\r\n console.log(value, 'can not be converted in string', e);\r\n }\r\n }\r\n\r\n generateDynamicStockLookUp() {\r\n let x = '0';\r\n this.transactionDocument.basket.products.forEach((element: any) => {\r\n if (element.deliveryMethod === '1' || element.deliveryMethod === '2') {\r\n x = '1';\r\n }\r\n });\r\n return x;\r\n }\r\n\r\n // getAttributes(){\r\n // let name: string | any[] = []\r\n // this.transactionDocument.basket.products.forEach((element: any) => {\r\n // if (element && element.attributes && element.attributes.length > 0) {\r\n // name = element.attributes.filter((x: any) => x.name.toUpperCase() === element.name.toUpperCase());\r\n // }\r\n // });\r\n // if (name.length > 0) {\r\n // return name[0].value\r\n // }\r\n // else{\r\n // return \"\"\r\n // }\r\n // }\r\n\r\n // getCaregories(element) {\r\n // let MMGroupId = \" \";\r\n // if (element.categories && element.categories.length > 0) {\r\n // let categories = element.categories.filter((x) => x.parentId != '');\r\n // let value = categories.filter((x) => x.id != x.parentId);\r\n // MMGroupId = value[0].name;\r\n // }\r\n // return MMGroupId;\r\n // }\r\n\r\n getDate(date:string){\r\n let offset = this.generateTimezoneoffset(date) * -1;\r\n let offsetHours = Math.abs(Math.floor(offset / 60)); \r\n\t let offsetMinutes = Math.abs(offset) - offsetHours * 60;\r\n\r\n let offsetSign = '+';\r\n if (offset < 0) {\r\n offsetSign = '-';\r\n }\r\n\r\n let newdate = date.substring(0,19);\r\n const x = (newdate+ offsetSign +String(offsetHours).padStart(2, '0')+':'+String(offsetMinutes).padStart(2, '0')).toString();\r\n return x; \r\n }\r\n \r\n getTransactionPromotion(transactionPromotion){\r\n if(transactionPromotion && transactionPromotion.length > 0){\r\n this.rjObject['PromoVoucherItem'] = {};\r\n this.rjObject['PromoVoucherItem']['XMLSchemaVersion'] = this.xmlSchemaVersion;\r\n this.rjObject['PromoVoucherItem']['LineNumber'] = this.generateLineNumber();\r\n this.rjObject['PromoVoucherItem']['NetValue'] = this.removeDecimal(transactionPromotion[0].promotionLinePrice) * -1;\r\n this.rjObject['PromoVoucherItem']['EffectiveNetValue'] = this.removeDecimal(transactionPromotion[0].promotionLinePrice) * -1;\r\n this.rjObject['PromoVoucherItem']['Description'] = transactionPromotion[0].promotionInfo;\r\n this.rjObject['PromoVoucherItem']['DeviceID'] = this.deviceId;\r\n this.rjObject['PromoVoucherItem']['UserID'] = this.transactionDocument.userName;\r\n this.rjObject['PromoVoucherItem']['DateTimeCreated'] = this.createdAt;\r\n this.rjObject['PromoVoucherItem']['ProductId'] = \"\"; //todo\r\n this.rjObject['PromoVoucherItem']['SerialNumber'] = \"\" ; //todo\r\n this.rjObject['PromoVoucherItem']['MMGroupId'] = \"\";\r\n }\r\n }\r\n \r\n getQuantity(element: any) {\r\n let quantity\r\n if(this.transactionDocument.unreferencedRefund){\r\n quantity = element['quantity'] < 0 ? element['quantity'] : (-element['quantity']);\r\n }\r\n else{\r\n quantity = element['refundedQuantity'] < 0 ? element['refundedQuantity'] : (-element['refundedQuantity']);\r\n }\r\n return quantity;\r\n }\r\n}\r\n","import { TransactionDocument } from \"./mapper-library.model\";\r\n\r\nexport class WebReturnMapperBuilderClass {\r\n\r\n private document: any;\r\n private webReturnObject: TransactionDocument = {\r\n id: '',\r\n orgCode: \"\",\r\n storeId: \"\",\r\n storeNodeId: \"\",\r\n storeNodeStructure: \"\",\r\n deviceId: \"\",\r\n terminalId: \"\",\r\n initiatingModule: \"\",\r\n export: false,\r\n basket: {},\r\n basketSummary: {},\r\n baseCurrency: \"\",\r\n customer: {\r\n firstName: '',\r\n lastName: '',\r\n email: '',\r\n postCode: '',\r\n id: '',\r\n billingAddress: {},\r\n shippingAddress: {},\r\n\r\n }\r\n }\r\n\r\n constructor(document) {\r\n if (document) {\r\n this.document = document;\r\n }\r\n }\r\n\r\n WebReturnMapper() {\r\n this.webReturnObject['type'] = 'WEB_RETURNS';\r\n this.webReturnObject['datetime'] = this.getUTCDateTime(this.getText(this.document.updated_at));\r\n this.webReturnObject.baseCurrency = this.getText(this.document.base_currency_code);\r\n this.webReturnObject.storeId = this.getText(this.document.store_id);\r\n this.webReturnObject.subsidiaryId = '1';\r\n this.webReturnObject.initiatingModule = 'MAGENTO';\r\n this.webReturnObject.createdAt = this.getUTCDateTime(this.getText(this.document.created_at));\r\n this.webReturnObject.updatedAt = this.getUTCDateTime(this.getText(this.document.updated_at));\r\n this.webReturnObject.export = true;\r\n this.webReturnObject.transCompletedAt = this.getUTCDateTime(this.getText(this.document.updated_at));\r\n this.webReturnObject['externalTransactionId'] = this.getText(this.document.order_id);\r\n\r\n // customer\r\n this.webReturnObject['customer']['firstName'] = this.getText(this.document.customer_firstname) || '';\r\n this.webReturnObject['customer']['lastName'] = this.getText(this.document.customer_lastname) || '';\r\n this.webReturnObject['customer']['email'] = this.getText(this.document.customer_email) || '';\r\n this.webReturnObject['customer']['postCode'] = '';\r\n\r\n // Billing address\r\n this.webReturnObject['customer']['billingAddress']['address1'] = (this.document.billing_address && this.document.billing_address.street) ? this.getText(this.document.billing_address.street) : '';\r\n this.webReturnObject['customer']['billingAddress']['city'] = (this.document.billing_address && this.document.billing_address.city) ? this.getText(this.document.billing_address.city) : '';\r\n this.webReturnObject['customer']['billingAddress']['county'] = (this.document.billing_address && this.document.billing_address.region) ? this.getText(this.document.billing_address.region) : '';\r\n this.webReturnObject['customer']['billingAddress']['postCode'] = (this.document.billing_address && this.document.billing_address.postcode) ? this.getText(this.document.billing_address.postcode) : '';\r\n this.webReturnObject['customer']['billingAddress']['country'] = (this.document.billing_address && this.document.billing_address.country) ? this.getText(this.document.billing_address.country) : '';\r\n\r\n // Shipping address\r\n this.webReturnObject['customer']['shippingAddress']['address1'] = (this.document.shipping_address && this.document.shipping_address.street) ? this.getText(this.document.shipping_address.street) : '';\r\n this.webReturnObject['customer']['shippingAddress']['city'] = (this.document.shipping_address && this.document.shipping_address.city) ? this.getText(this.document.shipping_address.city) : '';\r\n this.webReturnObject['customer']['shippingAddress']['county'] = (this.document.shipping_address && this.document.shipping_address.region) ? this.getText(this.document.shipping_address.region) : '';\r\n this.webReturnObject['customer']['shippingAddress']['postCode'] = (this.document.shipping_address && this.document.shipping_address.postcode) ? this.getText(this.document.shipping_address.postcode) : '';\r\n this.webReturnObject['customer']['shippingAddress']['country'] = (this.document.shipping_address && this.document.shipping_address.country) ? this.getText(this.document.shipping_address.country) : '';\r\n\r\n // basketSummary \r\n this.webReturnObject.basketSummary['discountTotal'] = Number(this.document.discount_amount ? this.getText(this.document.discount_amount) : 0);\r\n this.webReturnObject.basketSummary['VATTotal'] = Number(this.document.base_total_paid ? this.getText(this.document.base_total_paid) : 0);\r\n this.webReturnObject.basketSummary['saleTotal'] = Number(this.document.base_total_invoiced ? this.getText(this.document.base_total_invoiced) : 0);\r\n this.webReturnObject.basketSummary['basketTotal'] = Number(this.document.base_total_paid ? this.getText(this.document.base_total_paid) : 0);\r\n this.webReturnObject.basketSummary['totalItems'] = Number(this.document.total_qty_ordered ? this.getText(this.document.total_qty_ordered) : 0);\r\n this.webReturnObject.basketSummary['refundTotal'] = Number(this.document.base_total_refunded ? this.getText(this.document.base_total_refunded) : 0);\r\n\r\n // basket line discount\r\n this.webReturnObject.basket['lineDiscount'] = [];\r\n\r\n let lineDiscount = {\r\n itemLineId: (this.document.items && this.document.items.item && this.document.items.item.item_id) ? this.getText(this.document.items.item.item_id) : 0,\r\n discountAmount: (this.document.items && this.document.items.item && this.document.items.item.discount_amount) ? Number(this.getText(this.document.items.item.discount_amount)) : 0\r\n }\r\n this.webReturnObject.basket['lineDiscount'].push(lineDiscount);\r\n\r\n // basket transaction discount\r\n this.webReturnObject.basket['transactionDiscount'] = [];\r\n\r\n let transactionDiscount = {\r\n discountAmount: (this.document && this.document.discount_amount) ? Number(this.getText(this.document.discount_amount)) : 0\r\n }\r\n this.webReturnObject.basket['transactionDiscount'].push(transactionDiscount);\r\n\r\n // basket products \r\n this.webReturnObject.basket['products'] = [];\r\n let product : any= {};\r\n if (this.document.items && this.document.items.item && this.document.items.item) {\r\n if (this.document.items.item instanceof Array) {\r\n this.document.items.item.forEach(element => {\r\n product = {\r\n description: (element.name) ? this.getText(element.name) : '',\r\n SKU: (element.sku) ? this.getText(element.sku) : '',\r\n quantity: (element.qty_ordered) ? Number(this.getText(element.qty_ordered)) : 0,\r\n refundedQuantity: (element.qty_refunded) ? Number(this.getText(this.document.items.item.qty_refunded)) : 0,\r\n price: (element.original_price) ? Number(this.getText(element.original_price)) : 0,\r\n itemLineId: (element.item_id) ? Number(this.getText(element.item_id)) : 0,\r\n // totalLinePrice: (element.row_invoiced) ? Number(this.getText(element.row_invoiced)) : 0,\r\n totalLinePrice: (element.qty_ordered - element.qty_refunded) * element.base_original_price || 0,\r\n }\r\n if (product && product.price != 0) {\r\n this.webReturnObject.basket['products'].push(product);\r\n }\r\n });\r\n } else {\r\n product = {\r\n description: (this.document.items && this.document.items.item && this.document.items.item.name) ? this.getText(this.document.items.item.name) : '',\r\n SKU: (this.document.items && this.document.items.item && this.document.items.item.sku) ? this.getText(this.document.items.item.sku) : '',\r\n quantity: (this.document.items && this.document.items.item && this.document.items.item.qty_ordered) ? Number(this.getText(this.document.items.item.qty_ordered)) : 0,\r\n refundedQuantity: (this.document.items && this.document.items.item && this.document.items.item.qty_refunded) ? Number(this.getText(this.document.items.item.qty_refunded)) : 0,\r\n price: (this.document.items && this.document.items.item && this.document.items.item.original_price) ? Number(this.getText(this.document.items.item.original_price)) : 0,\r\n itemLineId: (this.document.items && this.document.items.item && this.document.items.item.item_id) ? Number(this.getText(this.document.items.item.item_id)) : 0,\r\n // totalLinePrice: (this.document.items && this.document.items.item && this.document.items.item.row_invoiced) ? Number(this.getText(this.document.items.item.row_invoiced)) : 0,\r\n totalLinePrice: (this.document.items.item.qty_ordered - this.document.items.item.qty_refunded) * this.document.items.item.base_original_price || 0,\r\n }\r\n if (product && product.price != 0) {\r\n this.webReturnObject.basket['products'].push(product);\r\n }\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n deviceId(deviceId) {\r\n this.webReturnObject.deviceId = deviceId;\r\n return this;\r\n }\r\n\r\n terminalId(terminalId) {\r\n this.webReturnObject.terminalId = terminalId;\r\n return this;\r\n }\r\n\r\n orgCode(orgCode) {\r\n this.webReturnObject.orgCode = orgCode;\r\n return this;\r\n }\r\n\r\n storeId(storeId) {\r\n this.webReturnObject.storeId = storeId;\r\n return this;\r\n }\r\n\r\n storeNodeId(storeNodeId: string) {\r\n this.webReturnObject.storeNodeId = storeNodeId;\r\n return this;\r\n }\r\n\r\n storeNodeStructure(storeNodeStructure: string) {\r\n this.webReturnObject.storeNodeStructure = storeNodeStructure;\r\n return this;\r\n }\r\n\r\n docId(docId) {\r\n this.webReturnObject.id = docId;\r\n return this;\r\n }\r\n\r\n updateUserID(userID: string) {\r\n this.webReturnObject.userId = userID;\r\n return this;\r\n }\r\n\r\n updateUserName(name) {\r\n this.webReturnObject.userName = name;\r\n return this;\r\n }\r\n\r\n build() {\r\n return this.webReturnObject;\r\n }\r\n\r\n getText(obj) {\r\n if (obj && obj.text) {\r\n return obj.text;\r\n } else {\r\n return obj;\r\n }\r\n }\r\n\r\n getUTCDateTime(date) {\r\n if (date) {\r\n return new Date(date).toISOString();\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/tslib/tslib.es6.js","ng://@pmcretail/mapper-library/lib/mapper-library.component.ts","ng://@pmcretail/mapper-library/lib/mapper-library.module.ts","ng://@pmcretail/mapper-library/lib/mapper-library.model.ts","ng://@pmcretail/mapper-library/lib/basket.service.ts","ng://@pmcretail/mapper-library/lib/number-util.service.ts","ng://@pmcretail/mapper-library/lib/TransactionDocumentBuilder.ts","ng://@pmcretail/mapper-library/lib/RJ-mapper.class.ts","ng://@pmcretail/mapper-library/lib/WebReturn-mapper.class.ts"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__values","o","Symbol","iterator","m","next","value","done","TypeError","__read","r","e","ar","push","error","__spread","concat","MapperLibraryComponent","ngOnInit","Component","args","selector","template","MapperLibraryModule","NgModule","declarations","imports","exports","TRANSACTION_TYPE","DELIVERY_METHODS","DELIVERY","DROP_SHIP","COLLECT_FROM_STORE","DISCOUNTTYPE","PERCENT","AMOUNT","BasketService","numberUtilService","currentBasket","products","transactionDiscount","quantity","total","saleTotal","baseCurrency","basketSource","BehaviorSubject","basket","asObservable","productSource","product","peerSource","peerSync","scanSource","scanner","defineProperty","_isMixedBasketSales","v","updateBasket","isMixedBasketSales","filterProductListWithWebOrder","updateBasketTotal","basketDetails","basketState","_b","tslib_1.__values","_c","trimTo2Decimal","console","log","transactionId","JSON","stringify","basketTotal","addlinePromotion","promotionList","result","linePromotions","_d","element","_e","e_3","_f","promotionelement","itemLineId","toString","addTransactionPromotion","basketdetails","_this","transactionPromotion","forEach","tPromotion","transactionPromotionEntryUpdated","itemLineIds","map","transactionPromotionProductPortionCalc","updateProductTotalForSummary","promotionLinePrice","lineDiscount","discountedLinePrice","totalLinePrice","Math","abs","refundedTotal","refundedQuantity","updateBasketTotalForSummary","info","updateTransactionPromotion","updateTransactionDiscount","Number","toFixed","discountTotal","reduce","_a","discountAmount","promotionAmount","updateBasketTotalWithoutDiscount","updateBasketTotalWithDiscounts","transactionDiscountAndPromotionProductortionCalculation","discount","transactionDiscountProductPortionCalc","promotion","percentage","includes","validateProductItemDiscount","productContributionInTotal","trimTo2Decimal2","itemDiscounts","trnDiscountsPortion","trnPromotionsPortion","refundPortion","discountable","markProduct","stopPeerSyncProcess","scanStart","isScanning","promotionRemainingCalculation","promotionValue","discountRemainingCalculation","discountValue","discountRefundedCalculation","generateNewItemLineId","largestNumber","a","b","max","updateBasketProductDataAsPerQuantity","getFlooredFixed","unitPrice","selectedPrice","isWebOrder","filter","x","filterProductListWithDelivery","deliveryMethod","filterProductListWithDeliveryGroup","group","deliveryGroup","generateNewDeliveryGroupNumber","parseInt","getDeliveryGroupNumbers","uniqueAndsortedResult","deliveryGroupArr","Array","from","Set","sort","updateProductsWithNewDeliveryGroupNumber","newGroupNumber","cBProducts","calculateEstimatedTime","time_1","estmatedTime_1","estimatedDays_1","leadTime","type","toLocaleLowerCase","updateProductsWithDeliveryGroupNumber","oldGroup","newGroup","getDeliveryInfo","groupInfo_1","groups","groupNumber","items","estimate","NumberUtilService","cp","no","d","floor","pow","AppendWithCurrencySymbol","numValue","currencyCode","returnValue","parseFloat","replace","transform","toLocaleUpperCase","Injectable","providedIn","CurrencyPipe","TransactionDocumentBuilder","transactionDoc","currencyPipe","basketService","storeInfo","parse","localStorage","getItem","transactionDocument","offlineTransactionId","transactionRef","dateTime","orgCode","storeId","storeNodeId","storeNodeStructure","deviceId","terminalId","userId","initiatingModule","export","basketSummary","operationStatus","createdAt","updatedAt","id","currentTransactionDetails","storeDetails","date","Date","random","substring","toISOString","transactionID","isOnline","saleExport","subsidiaryId","linePromotion","index","SKU","excludePromotion","barCode","barcode","barcodes","description","price","imageUrls","selectedRRPPrice","fullfilmentId","fullfilmentLocationName","giftCard","giftCardExpiryDate","giftCardNumberIssued","giftCardRecipientEmail","giftCardRecipientName","refundedPromotionalQuantity","refundPromotionalQuantity","refunded","refundedReasonDescription","refundedReason","isLastExchanged","exchange","proj","updateSaleTotal","totalItems","refundTotal","updateCurrentTransactionDetailsRefundTotal","updateCurrentTransactionDetailsDiscountTotal","discountTotal_1","updateCurrentTransactionDetailsTaxBreakdown","taxBreakdown","taxLines","totalTaxableAmount","taxLine","VAT","selectedVAT","VATCode","selectedVATCode","taxLineTotal","taxableAmount","PreTax","currentRefundPortion","VATTotal","updateCurrentTransactionDetailsTotalTaxSummary","totalTaxSummaryGroup","totalTaxSummaryArray","TaxSummary","PreTaxSum","TaxSum","TXrateSum","preparedArray","currentObj","ind","findIndex","totalTaxSummary","totalRefund","getRefundTotal","updateDiscountTotal","acc","val","find","el","undefined","this_1","some","exchangeId","exchangeItems","j","newItems","item","lineItemId","Quantity","addExchangeData","originalTransactionDocument","paymentDetails","splitPayment","isPaymentCompleted","currency","giftOption","gift","giftedReceipt","transactionCompletedAt","transCompletedAt","build","saleTotalInRefund","getBasketDetails","customer","getTransactionDiscountAndTransactionPromotionPortion","getTotalDiscountWithTransactionDiscountsAndPromotions","getRefundedTotalWithQuantity","filteredData","appendCurrencySymbol","returnval","getTotalWithLineDiscountAndLinePromotionApplied","saletotal","updateReasonCode","reasonCode","code","reasonDescription","name","updateManagerOverride","useroverride","override","updateUserID","userID","updateUserName","userName","addCustomerDetails","customerDetail","updateTaxBreakdown","updateTotalTaxSummary","addOriginalTransId","tranDoc","originalTransId","apiResponse","internalId","originalExternalId","addUnreferencedRefund","unreferencedRefund","docId","RJMapperBuilderClass","itemCount","rjObject","initilizeItemCount","setLineNumberForProducts","getDate","getPosbasketInfo","generateKeyword","generateId","majorVersion","minorVersion","manifestVersion","databaseSchemaVersion","basketType","getState","externalState","getheaderInfo","TimeZoneOffset","convertToString","generateTimezoneoffset","DateTimeCreated","OriginatedBy","DeviceID","CashierID","cashierId","CompanyID","companyId","StoreID","BranchID","branchId","TerminalNumber","terminalNumber","TransactionNumber","transactionNumber","TaxMethodID","taxMethodId","DynamicStockLookup","generateDynamicStockLookUp","BasketLanguageID","basketLanguageId","BasketCountryID","basketCountryId","BasketCurrencyID","TradingRegionID","tradingRegionId","Eurozone","EuroBaseExchangeRate","PrintableName","rjMapper","indexOf","splice","data","addProduct","getModifierItem","getTransactionPromotion","returnProduct","OriginalReceiptSupplied","OriginalBranchID","OriginalTerminalNumber","OriginalTransactionNumber","OriginalCashierNumber","getBasketDiscount","obj","xmlSchemaVersion","reasonDisplayText","discountType","toUpperCase","generateLineNumber","lineNo","XMLSchemaVersion","LineNumber","NetValue","EffectiveNetValue","Description","percentageDiscountReasonName","priceOverrideReasonName","UserID","AuthorisingUserID","ReasonCodeID","percentageDiscountReasonCode","priceOverrideReasonCode","ModifiedLineNumber","ModifiedIndex","getTrailerInfo","Trailer","DateTimeCompleted","CompletedBy","Total","ItemCount","ItemQuantity","NetItemQuantity","TaxTotal","removeDecimal","SequenceDeviceID","SequenceNumber","addDecimal","promotionId","displayText","getNumber","promotionTrigger","getTenderInfo","externalTenderKey","paymentType","round","amount","getDescription","TenderType","externalTenderType","TenderSubType","externalSubTenderType","TenderAmount","CurrencyID","CurrencyDescription","GiftVoucherSalesAllowed","AllowRechargeableVoucherSales","GiftVoucherID","obj1","IncludeInTransactionTotalCheck","OpenDrawerAtEnd","productId","lineNumber","ProductID","itemLineIdArray","cardType","getMMGROUPID","attributes","filterValue","attribute","setDeviceInfo","setTransactionNumber","setManifestVersion","setDatabaseSchemaVersion","setBasketType","setTradingRegionID","setCompanyID","setTaxMethodID","setMajorVersion","setMinorVersion","setXMLSchemaVersion","setExternalState","setCashierID","setTerminalNumber","setBasketLanguageID","setBasketCountryID","setBasketCurrencyID","basketCurrencyId","setBranchID","setSalesPersonName","salesPersonName","newDateTime","getTimezoneOffset","taxTotal","getQuantity","getOriginalTax","ModifierValue","ModifierDateTime","ModifierReasonID","ModifierDescription","DiscountType","OriginalPrice","DiscountedValue","DiscountPercentage","percentageDiscountValue","RoundingRule","ModifierReasonDescription","NewPrice","ExtendedValue","UnitPrice","discountObj","BasketDiscountLineNumber","getLineNumber","getDiscountedValue","totaltransactionDiscount","transactionPromo","promotionObj","PromotionID","PromotionDescription","HitNumber","PromotionHitProductQuantity","PromotionHitQuantity","SalespersonID","SalespersonName","TaxCode","TaxModifiable","OriginalTaxAmount","TaxAmount","OriginalTaxAmountSet","HandKeyed","CustomerDetails","Perishable","MMGroupID","totaltransactionDiscount_1","Hit","Saving","getSaving","ISaving","transactionPromotion_1","pricebeforetax","offset","offsetHours","offsetMinutes","offsetSign","String","padStart","promotionInfo","WebReturnMapperBuilderClass","document","webReturnObject","firstName","lastName","email","postCode","billingAddress","shippingAddress","WebReturnMapper","getUTCDateTime","getText","updated_at","base_currency_code","store_id","created_at","order_id","customer_firstname","customer_lastname","customer_email","billing_address","street","city","region","postcode","country","shipping_address","discount_amount","base_total_paid","base_total_invoiced","total_qty_ordered","base_total_refunded","item_id","sku","qty_ordered","qty_refunded","original_price","base_original_price","text"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, OnInit } from '@angular/core';\n\n@Component({\n selector: 'lib-mapper-library',\n template: `\n <p>\n mapper-library works!\n </p>\n `,\n styles: [\n ]\n})\nexport class MapperLibraryComponent implements OnInit {\n\n constructor() { }\n\n ngOnInit(): void {\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { MapperLibraryComponent } from './mapper-library.component';\n\n\n\n@NgModule({\n declarations: [\n MapperLibraryComponent\n ],\n imports: [\n ],\n exports: [\n MapperLibraryComponent\n ]\n})\nexport class MapperLibraryModule { }\n","\r\n\r\nexport enum TRANSACTION_TYPE {\r\n SALE = \"SALE\",\r\n REFUND = \"REFUND\",\r\n SALE_REFUND = \"SALE_REFUND\",\r\n SALE_EXCHANGE = \"SALE_EXCHANGE\",\r\n VOID = \"VOID\"\r\n}\r\n\r\nexport interface ItemDiscount {\r\n trnDiscountsPortion: number;\r\n trnPromotionsPortion: number;\r\n refundPortion: number;\r\n currentRefundPortion?: number;\r\n}\r\n\r\nexport enum DELIVERY_METHODS {\r\n DELIVERY = 1,\r\n DROP_SHIP = 2,\r\n COLLECT_FROM_STORE = 3,\r\n}\r\n\r\nexport interface ProductChange {\r\n itemLineId?: number;\r\n SKU: string;\r\n quantity: number;\r\n selectedPrice?: number;\r\n lineDiscount?: LineDiscount;\r\n linePromotions?: LinePromotions;\r\n exchange?: Exchange;\r\n refundedQuantity?: number; // contains quantity of both full priced and promotional quantities\r\n refundPromotionalQuantity?: number; // promotional quantity\r\n refunded?: boolean;\r\n refundedTotal?: number;\r\n refundedReason?: string;\r\n refundedReasonDescription?: string;\r\n isChecked?: boolean;\r\n sealed?: boolean;\r\n isLastExchanged?: boolean;\r\n}\r\n\r\n/**\r\n * Product\r\n */\r\nexport interface Product extends ProductChange {\r\n itemLineId?: number;\r\n status: number;\r\n subGroup: number;\r\n brand: string;\r\n currency: string;\r\n category: string;\r\n countryofOrigin: string;\r\n productId: string;\r\n productType: number;\r\n name?: string;\r\n imageUrls: [string];\r\n isImageFailToLoad?: boolean;\r\n size: string;\r\n type: string;\r\n season: number;\r\n productGroup: number;\r\n styleCode: string;\r\n nodeStructure: NodeStructure[];\r\n barcode: string;\r\n price: Price[];\r\n colour: string;\r\n description: string;\r\n totalLinePrice: number;\r\n total: number;\r\n addedInBasket?: boolean;\r\n selectedVAT?: number;\r\n selectedVATCode?: string;\r\n selectedRRPPrice?: number;\r\n lineDiscount?: LineDiscount;\r\n exchange?: Exchange;\r\n // refundedQuantity?: number;\r\n // refunded?: boolean;\r\n // refundedTotal?: number;\r\n // refundedReasonDescription?:string;\r\n // isChecked?:boolean;\r\n refundPromotionalQuantity?: number; // promotional quantity\r\n exchangeReason?: string;\r\n exchangeQuantity?: number;\r\n itemDiscounts: ItemDiscount;\r\n\r\n giftCardNumberIssued?: string;\r\n giftCardAmount?: number;\r\n giftCardRecipientEmail?: string;\r\n giftCardExpiryDate?: string;\r\n giftCardRecipientName?: string;\r\n giftCard?: boolean;\r\n\r\n discountable: boolean;\r\n // sealed?:boolean;\r\n excludePromotion: boolean;\r\n categories: Categories[];\r\n descriptions: Descriptions[];\r\n barcodes: string[];\r\n\r\n //New Feilds\r\n externalId: string;\r\n createdDate: string;\r\n updatedDate: string;\r\n createdBy: string;\r\n updatedBy: string;\r\n attributes: CoreAttribute[];\r\n id: string;\r\n long_description: string;\r\n\r\n // Mixed Sales fields\r\n isWebOrder?: boolean,\r\n fullfilmentId: string,\r\n fullfilmentLocationName?: string,\r\n deliveryMethod?: string,\r\n deliveryGroup?: string,\r\n selectedInventory?: InventoryInfo;\r\n leadTime?: leadTime\r\n}\r\nexport interface leadTime {\r\n type: string,\r\n value: string\r\n}\r\n\r\nexport interface Exchange {\r\n exchangeId: number,\r\n lineItemId: number,\r\n reason: string,\r\n quantity: number,\r\n newItems: Product[];\r\n}\r\n\r\nexport interface Categories {\r\n id: string;\r\n parentId: string;\r\n name: string;\r\n categoryId: string;\r\n status: boolean;\r\n}\r\n\r\nexport interface Descriptions {\r\n name: string;\r\n countryCode: string;\r\n value: string;\r\n}\r\n\r\nexport interface CoreAttribute {\r\n name: string;\r\n value: string;\r\n searchable: boolean;\r\n countryCode: string;\r\n}\r\n\r\n/**\r\n * Basket\r\n */\r\n\r\nexport interface Basket {\r\n subsidiaryId?: string;\r\n products: Product[];\r\n transactionDiscount: any[];\r\n quantity: number;\r\n total: number;\r\n saleTotal: number;\r\n discountTotal?: number;\r\n transactionId?: string;\r\n offlineTransactionId?: string;\r\n baseCurrency: string;\r\n basketTotal?: number;\r\n refundTotal?: number;\r\n transactionPromotion?: TransactionPromotion[];\r\n customer?: any;\r\n exchange?: Exchange[];\r\n inStoreFlag?: boolean\r\n}\r\n\r\n\r\n\r\n/**\r\n * Price\r\n */\r\nexport interface Price {\r\n VAT: number;\r\n VATCode: string;\r\n salesPrice: number;\r\n currencyCode: string;\r\n RRPPrice: number;\r\n}\r\n\r\n/**\r\n * Node structure\r\n */\r\ninterface NodeStructure {\r\n status: boolean;\r\n name: string;\r\n nodeType: string;\r\n isOverride: boolean;\r\n nodeId: string;\r\n parentId: string;\r\n}\r\n\r\n/**\r\n * Line Discount\r\n */\r\nexport interface LineDiscount {\r\n itemLineId: string,\r\n discountAmount: number,\r\n discountType: string,\r\n // reasonCode: string,\r\n name?: string,\r\n unitPrice: number,\r\n discountedLinePrice?: number,\r\n priceManagerOverride?: UserOverride,\r\n priceOverrideReasonCode?: string,\r\n priceOverrideReasonName?: string,\r\n priceOverrideAmount?: number,\r\n percentageDiscountManagerOverride?: UserOverride,\r\n percentageDiscountReasonCode?: string,\r\n percentageDiscountReasonName?: string,\r\n percentageDiscountValue?: number\r\n}\r\n\r\n/**\r\n * User Override\r\n */\r\nexport interface UserOverride {\r\n userId: string,\r\n automaticApprove: string,\r\n originalUserId: string\r\n}\r\n\r\n/**\r\n* line Promotions\r\n*/\r\nexport interface LinePromotions {\r\n\r\n trigger: Trigger[],\r\n itemLineId: number,\r\n promotionId: string,\r\n displayText: string,\r\n promotionType: string,\r\n promotionAmount: number,\r\n name: string,\r\n promotionInfo: string,\r\n promotionLinePrice: number\r\n refunded?: boolean;\r\n}\r\n\r\n/**\r\n* trigger\r\n*/\r\nexport interface Trigger {\r\n itemLineId: string;\r\n quantity?: number;\r\n totalQuantity?: number;\r\n}\r\n\r\n/**\r\n* Transaction Promotion\r\n*/\r\nexport interface TransactionPromotion {\r\n displayText: string;\r\n name: string;\r\n promotionAmount: number;\r\n promotionId: string;\r\n promotionInfo: string;\r\n promotionType: string;\r\n itemLineIds: number[];\r\n\r\n}\r\n\r\nexport interface RefundProductChange {\r\n itemLineId?: number;\r\n refundedQuantity?: number;\r\n refundedPromotionalQuantity?: number;\r\n refundTotal?: number;\r\n refundedReason?: string;\r\n refundedReasonDescription?: string;\r\n refundWithPromotion: boolean;\r\n isLastExchanged?: boolean;\r\n}\r\n\r\nexport interface InventoryInfo {\r\n storeName: string,\r\n storeId: string,\r\n quantityAvailable: number,\r\n quantityRequired: number\r\n}\r\n\r\nexport interface InventoryRequestInfo extends InventoryInfo {\r\n requestedQuantity: number,\r\n requestedAction: DELIVERY_METHODS\r\n}\r\n\r\nexport interface DeliveryInfo {\r\n groups: DeliveryGroupInfo[]\r\n}\r\n\r\nexport interface DeliveryGroupInfo {\r\n groupNumber: number;\r\n items: Product[];\r\n estimate?: Estimate;\r\n}\r\n\r\nexport interface Estimate {\r\n type: string,\r\n value: string\r\n}\r\n\r\nexport interface TransactionDocument {\r\n transactionId?: string;\r\n subsidiaryId?: string;\r\n offlineTransactionId?:string;\r\n transactionRef?: string;\r\n dateTime?: string;\r\n orgCode: string;\r\n storeId: string;\r\n storeNodeId:string;\r\n storeNodeStructure:string;\r\n deviceId: string;\r\n terminalId:string;\r\n initiatingModule :string;\r\n export:boolean;\r\n userId?: string;\r\n userName?:string;\r\n customer?: Customer;\r\n basket: any;\r\n basketSummary: any;\r\n // lineDiscount: LineDiscount[];\r\n baseCurrency: string;\r\n splitPayment?:boolean;\r\n isPaymentCompleted?:boolean;\r\n paymentDetails?: any;\r\n type?: string;\r\n operationStatus?: string;\r\n createdAt?: string;\r\n updatedAt?: string;\r\n transCompletedAt?: string;\r\n id?: string;\r\n saleTotal?: number;\r\n reasonCode?: string;\r\n reasonDescription?: string;\r\n override?: UserOverride;\r\n originalTransId?:string;\r\n originalExternalId?: string;\r\n apiResponse?: APIResponse; // TODO add handler as per export provider\r\n unreferencedRefund?:boolean;\r\n giftedReceipt?:boolean;\r\n currentTransactionDetails?:any;\r\n isChecked?:boolean;\r\n}\r\n\r\nexport interface APIResponse\r\n{\r\n internalId?:number;\r\n tranid?:string\r\n}\r\n\r\nexport interface CurrentTransactionDetails{\r\n products: Product[];\r\n lineDiscount?:LineDiscount[];\r\n linePromotion?:LinePromotions[];\r\n transactionPromotion?:TransactionPromotion[];\r\n transactionDiscount?:TransactionDiscount[];\r\n basketSummary?:BasketSummary; \r\n taxBreakdown?:TaxBreakdown; \r\n totalTaxSummary?:TotalTaxSummary[];\r\n}\r\nexport interface BasketSummary {\r\n totalItems: number;\r\n saleTotal: number;\r\n VATTotal: number;\r\n discountTotal: number;\r\n basketTotal: number;\r\n refundTotal?:number;\r\n}\r\n\r\nexport interface TransactionDiscount{\r\n discountAmount:number;\r\n discountType:String;\r\n reasonCode:string;\r\n override?: UserOverride;\r\n itemLineIds?:number[];\r\n}\r\n\r\nexport interface TBasket {\r\n products: TProduct[];\r\n lineDiscount:LineDiscount[];\r\n exchange:Exchange[];\r\n linePromotion:LinePromotions[];\r\n transactionPromotion?:TransactionPromotion[];\r\n transactionDiscount?:TransactionDiscount[];\r\n taxBreakdown?:TaxBreakdown;\r\n totalTaxSummary?:TotalTaxSummary[];\r\n\r\n \r\n}\r\n\r\nexport interface TExchange{\r\n exchangeId?:number,\r\n lineItemId?: number,\r\n reason?: string,\r\n quantity?: number,\r\n newItems?:TNewItems[];\r\n }\r\n \r\n export interface TNewItems{\r\n lineItemId:number,\r\n Quantity:number\r\n }\r\n\r\nexport interface TProduct {\r\n itemLineId: string;\r\n SKU: string;\r\n description: string;\r\n imageUrls: [string];\r\n price: number;\r\n taxCode?: string;\r\n taxPercent?: string;\r\n quantity: number;\r\n refundedQuantity?: number;\r\n refundedPromotionalQuantity?:number;\r\n refunded?: boolean;\r\n refundedTotal?: number;\r\n refundedReason?:string;\r\n refundedReasonDescription?:string;\r\n selectedRRPPrice?: number;\r\n totalLinePrice: number;\r\n barCode?: string;\r\n barcodes?: string[];\r\n flagged?: boolean;\r\n exchange?:Exchange;\r\n excludePromotion:boolean;\r\n discountable?:boolean;\r\n\r\n itemDiscounts?:ItemDiscounts;\r\n isLastExchanged?: boolean;\r\n\r\n // Mixed Sales fields\r\n fullfilmentId:string,\r\n fullfilmentLocationName:string,\r\n deliveryMethod?:string,\r\n deliveryGroup?:string,\r\n giftCardNumberIssued?: string,\r\n giftCardAmount?: number,\r\n giftCardRecipientEmail?: string,\r\n giftCardExpiryDate?: string ,\r\n giftCardRecipientName?: string,\r\n giftCard?:boolean,\r\n currency?:string,\r\n isWebOrder?:boolean,\r\n leadTime?: leadTime\r\n \r\n // currenttransaction doc changes\r\n lineDiscount?:any\r\n\r\n attributes?:CoreAttribute[];\r\n}\r\n\r\nexport interface ItemDiscounts{\r\n trnDiscountsPortion:number;\r\n trnPromotionsPortion:number;\r\n refundPortion:number;\r\n}\r\n\r\n\r\n\r\nexport interface Customer {\r\n id: string;\r\n title?: string;\r\n firstName: string;\r\n lastName: string;\r\n email: string;\r\n postCode: string;\r\n telephone?: string;\r\n billingAddress?: Address;\r\n shippingAddress?: Address;\r\n addressDetail?: string;\r\n noCustomerSelected?: boolean;\r\n externalId?: string; \r\n \r\n}\r\n\r\nexport interface Address \r\n{\r\n address1?: string;\r\n address2?: string;\r\n address3?: string;\r\n city?: string;\r\n county?: string;\r\n postCode?: string;\r\n country?: string;\r\n }\r\n\r\nexport interface PaymentDetails {\r\n cardNumber?: any;\r\n sqNo?:number;\r\n result?: string;\r\n currency: string;\r\n amount: string;\r\n authcode?: string;\r\n pan?: string;\r\n cardType?: string;\r\n transactionDate?: string;\r\n mid?: string;\r\n tid?: string;\r\n cvm?: string;\r\n hostReferenceId?: string;\r\n aid?: string;\r\n receiptNo?: string;\r\n expirydate?: string;\r\n transactionReference: string;\r\n applicationVersion?: string;\r\n entryMethod?:string;\r\n transactionType:string;\r\n totalamount:string;\r\n paymentType?:string;\r\n}\r\n\r\nexport interface TaxBreakdown\r\n{\r\n taxLines : TaxLine[],\r\n totalTaxableAmount: number;\r\n}\r\n\r\nexport interface TotalTaxSummary{\r\n VATCode:string,\r\n VAT : number;\r\n PreTaxSum: number\r\n TaxSum: number\r\n TXrateSum: number\r\n}\r\n\r\nexport interface TaxLine\r\n{\r\n itemLineId: number,\r\n taxableAmount: number,\r\n taxLineTotal: number,\r\n VAT: number,\r\n VATCode : string,\r\n PreTax: number\r\n}\r\n\r\nexport enum DISCOUNTTYPE {\r\n PERCENT = 'Percent',\r\n AMOUNT = 'AMOUNT'\r\n}","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { DELIVERY_METHODS } from './mapper-library.model';\r\nimport { Basket, DeliveryGroupInfo, DeliveryInfo, Product, TransactionPromotion } from './mapper-library.model';\r\nimport { TransactionDiscount } from './mapper-library.model';\r\nimport { NumberUtilService } from './number-util.service';\r\n\r\nexport class BasketService {\r\n currentBasket: Basket = {\r\n products: [],\r\n transactionDiscount: [],\r\n quantity: 0,\r\n total: 0,\r\n saleTotal: 0,\r\n baseCurrency: ''\r\n };\r\n\r\n private basketSource = new BehaviorSubject<any>(null);\r\n basket = this.basketSource.asObservable();\r\n\r\n private productSource = new BehaviorSubject<any>(null);\r\n product = this.productSource.asObservable();\r\n\r\n private peerSource = new BehaviorSubject<boolean>(false);\r\n peerSync = this.peerSource.asObservable();\r\n\r\n private scanSource = new BehaviorSubject<boolean>(false);\r\n scanner = this.scanSource.asObservable();\r\n\r\n private _isMixedBasketSales: boolean | undefined;\r\n public get isMixedBasketSales(): any {\r\n return this._isMixedBasketSales;\r\n }\r\n public set isMixedBasketSales(v: any) {\r\n this._isMixedBasketSales = v;\r\n }\r\n\r\n\r\n constructor(private numberUtilService: NumberUtilService) { }\r\n\r\n updateBasket(basket: Basket) {\r\n this.currentBasket = basket;\r\n this.isMixedBasketSales = this.filterProductListWithWebOrder(true).length > 0;\r\n this.basketSource.next(basket);\r\n }\r\n\r\n /**\r\n * calculates the total basket value and quantity\r\n * @param null\r\n * @returns void\r\n */\r\n updateBasketTotal(basketDetails: { quantity: number; total: number; products: any; transactionId: any; basketTotal: any; }, basketState: { updateBasket: (arg0: any) => void; }) {\r\n basketDetails.quantity = 0;\r\n basketDetails.total = 0;\r\n for (const p of basketDetails.products) {\r\n basketDetails.quantity = basketDetails.quantity + p.quantity;\r\n basketDetails.total =\r\n this.numberUtilService.trimTo2Decimal(basketDetails.total) +\r\n this.numberUtilService.trimTo2Decimal(p.total);\r\n }\r\n console.log(\r\n \"e:basket :basket service : basketDetails updated values for transaction id\",\r\n basketDetails.transactionId,\r\n JSON.stringify(basketDetails)\r\n );\r\n basketDetails.basketTotal = basketDetails.total;\r\n basketState.updateBasket(basketDetails);\r\n }\r\n\r\n /**\r\n * add Line promotion\r\n * @param null\r\n * @returns basketDetails\r\n */\r\n addlinePromotion(promotionList: { result: { linePromotions: string | any[]; }; }, basketDetails: { products: any; }) {\r\n console.log(\r\n \"e:basket :basket Service : promotionList and basketDetails for linePromotions\",\r\n JSON.stringify(promotionList),\r\n JSON.stringify(basketDetails)\r\n );\r\n if (\r\n promotionList &&\r\n promotionList.result &&\r\n promotionList.result.linePromotions &&\r\n promotionList.result.linePromotions.length > 0\r\n ) {\r\n for (var element of basketDetails.products) {\r\n for (var promotionelement of promotionList.result.linePromotions) {\r\n if (\r\n element.itemLineId.toString() ===\r\n promotionelement.itemLineId.toString()\r\n ) {\r\n element.linePromotions = promotionelement;\r\n }\r\n }\r\n }\r\n }\r\n return basketDetails;\r\n }\r\n\r\n /**\r\n * add Transaction promotion\r\n * @param null\r\n * @returns basketDetails\r\n */\r\n\r\n addTransactionPromotion(promotionList: { result: { transactionPromotion: any }; }, basketdetails: Basket) {\r\n console.log(\r\n \"e:basket :basket Service : promotionList and basketDetails for transactionPromotion\",\r\n JSON.stringify(promotionList),\r\n JSON.stringify(basketdetails),\r\n JSON.stringify(basketdetails.transactionPromotion)\r\n );\r\n if (\r\n promotionList &&\r\n promotionList.result &&\r\n promotionList.result.transactionPromotion &&\r\n promotionList.result.transactionPromotion.length > 0\r\n ) {\r\n promotionList.result.transactionPromotion.forEach((tPromotion: any) => {\r\n let transactionPromotionEntryUpdated: any = Object.assign(\r\n {},\r\n tPromotion\r\n );\r\n\r\n transactionPromotionEntryUpdated.itemLineIds = basketdetails.products.map(\r\n (product) => {\r\n return product.itemLineId;\r\n }\r\n );\r\n\r\n if (!basketdetails.transactionPromotion) {\r\n basketdetails.transactionPromotion = [];\r\n }\r\n basketdetails.transactionPromotion.push(\r\n transactionPromotionEntryUpdated\r\n );\r\n\r\n basketdetails = this.transactionPromotionProductPortionCalc(\r\n basketdetails,\r\n transactionPromotionEntryUpdated\r\n );\r\n });\r\n }\r\n console.log(\r\n \"basket details in refund calculation file\",\r\n JSON.stringify(basketdetails)\r\n );\r\n return basketdetails;\r\n }\r\n\r\n updateProductTotalForSummary(basketDetails: { total: string | number; quantity: string | number; products: any; }) {\r\n /*sale- product refundedQuantity = undefined\r\n partial refund - product refundedQuantity is > 0\r\n total refund - proudct refundedQuantity is > 0\r\n exchange - exchange product refundedQuantity is > 0 \r\n new product refundedQuantity = undefined \r\n old product without exchange refundedQuantity = 0\r\n unreference refund-product refundedQuantity is > 0 */\r\n\r\n basketDetails.total = 0;\r\n basketDetails.quantity = 0;\r\n for (var product of basketDetails.products) {\r\n if (product.linePromotions) {\r\n product.total = product.linePromotions.promotionLinePrice;\r\n } else if (product.lineDiscount && !product.linePromotions) {\r\n product.total = product.lineDiscount.discountedLinePrice;\r\n } else {\r\n product.total = product.totalLinePrice;\r\n }\r\n product.total =\r\n product.total -\r\n Math.abs(product.refundedTotal ? product.refundedTotal : 0);\r\n\r\n basketDetails.total += product.total;\r\n basketDetails.quantity =\r\n basketDetails.quantity +\r\n (product.quantity -\r\n (product.refundedQuantity ? product.refundedQuantity : 0));\r\n console.log(\r\n \"e-basket:ExchangeSummaryScreen:update basketdetails total :\" +\r\n basketDetails.total +\r\n \" Product line ID : \" +\r\n product.itemLineId +\r\n \" product total : \" +\r\n product.total,\r\n \"quantity : \" + basketDetails.quantity\r\n );\r\n }\r\n return this.updateBasketTotalForSummary(basketDetails);\r\n }\r\n\r\n updateBasketTotalForSummary(basketDetails: any) {\r\n basketDetails.basketTotal = basketDetails.total;\r\n console.info(\r\n \"ebasket : basket Service : update Basket Total for transaction transactionDiscount \",\r\n JSON.stringify(basketDetails.transactionDiscount)\r\n );\r\n\r\n console.info(\r\n \"ebasket : basket Service : update Basket Total for transaction transactionPromotion \",\r\n JSON.stringify(basketDetails.transactionPromotion)\r\n );\r\n\r\n basketDetails = this.updateTransactionPromotion(basketDetails);\r\n basketDetails = this.updateTransactionDiscount(basketDetails);\r\n basketDetails.basketTotal = Number(basketDetails.basketTotal.toFixed(2));\r\n\r\n console.info(\r\n \"ebasket : basket Service : update Basket Total: basketTotal after promotion applied for basketTotal\",\r\n basketDetails.basketTotal\r\n );\r\n return basketDetails;\r\n }\r\n\r\n updateTransactionDiscount(basketDetails: { transactionDiscount: any[]; basketTotal: number; }) {\r\n if (\r\n basketDetails.transactionDiscount &&\r\n basketDetails.transactionDiscount.length > 0\r\n ) {\r\n const discountTotal = basketDetails.transactionDiscount.reduce(\r\n (n: any, { discountAmount }: any) => n + discountAmount,\r\n 0\r\n );\r\n console.log(\"ebasket : basket Service : discountTotal \", discountTotal);\r\n basketDetails.basketTotal =\r\n basketDetails.basketTotal - Math.abs(discountTotal);\r\n }\r\n return basketDetails;\r\n }\r\n\r\n updateTransactionPromotion(basketDetails: { transactionPromotion: any[]; basketTotal: number; }) {\r\n if (\r\n basketDetails.transactionPromotion &&\r\n basketDetails.transactionPromotion.length > 0\r\n ) {\r\n const discountTotal = basketDetails.transactionPromotion.reduce(\r\n (n: any, { promotionAmount }: any) => n + promotionAmount,\r\n 0\r\n );\r\n basketDetails.basketTotal =\r\n basketDetails.basketTotal - Math.abs(discountTotal);\r\n }\r\n return basketDetails;\r\n }\r\n\r\n updateBasketTotalWithoutDiscount(basket: Basket): Basket {\r\n basket.total = 0;\r\n basket.quantity = 0;\r\n\r\n for (var product of basket.products) {\r\n if (product.linePromotions) {\r\n product.total = product.linePromotions.promotionLinePrice;\r\n } else if (product.lineDiscount && !product.linePromotions) {\r\n product.total = product.lineDiscount.discountedLinePrice || 0;\r\n } else {\r\n product.total = product.totalLinePrice;\r\n }\r\n\r\n product.total =\r\n product.total -\r\n Math.abs(product.refundedTotal ? product.refundedTotal : 0);\r\n basket.total += product.total;\r\n basket.quantity =\r\n basket.quantity +\r\n (product.quantity -\r\n (product.refundedQuantity ? product.refundedQuantity : 0));\r\n\r\n console.log(\r\n \"e-basket:basket service:update basketdetails total :\" +\r\n JSON.stringify(basket) +\r\n basket.total +\r\n \" Product line ID : \" +\r\n product.itemLineId +\r\n \" product total : \" +\r\n product.total\r\n );\r\n }\r\n\r\n basket.basketTotal = basket.total;\r\n return basket;\r\n }\r\n\r\n updateBasketTotalWithDiscounts(basket: any): Basket {\r\n console.log(\r\n \"e:basket :RefundBasketScreen : this.basketDetails new values\",\r\n basket,\r\n JSON.stringify(basket.basketTotal)\r\n );\r\n if (basket.transactionPromotion && basket.transactionPromotion.length > 0) {\r\n const discountTotal = basket.transactionPromotion.reduce(\r\n (n: any, { promotionAmount }: any) => n + promotionAmount,\r\n 0\r\n );\r\n basket.basketTotal = basket.basketTotal - discountTotal;\r\n }\r\n if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {\r\n const discountTotal = basket.transactionDiscount.reduce(\r\n (n: any, { discountAmount }: any) => n + discountAmount,\r\n 0\r\n );\r\n\r\n basket.basketTotal = basket.basketTotal - discountTotal;\r\n }\r\n console.log(\r\n \"e:basket :RefundBasketScreen : basket new values\",\r\n JSON.stringify(basket)\r\n );\r\n\r\n return basket;\r\n }\r\n\r\n transactionDiscountAndPromotionProductortionCalculation(basket: Basket) {\r\n if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {\r\n basket.transactionDiscount.forEach(\r\n (discount) =>\r\n (basket = this.transactionDiscountProductPortionCalc(\r\n basket,\r\n discount\r\n ))\r\n );\r\n }\r\n\r\n if (basket.transactionPromotion && basket.transactionPromotion.length > 0) {\r\n basket.transactionPromotion.forEach((promotion) => {\r\n basket = this.transactionPromotionProductPortionCalc(basket, promotion);\r\n });\r\n }\r\n console.log(\r\n \"ebasket: basket item discount protion calculation\",\r\n basket,\r\n basket.products\r\n );\r\n return basket;\r\n }\r\n\r\n transactionPromotionProductPortionCalc(\r\n basket: any,\r\n promotion: any\r\n ) {\r\n let total = 0;\r\n let percentage = 0;\r\n {\r\n basket.products.forEach((p:any) => {\r\n if (promotion.itemLineIds.includes(p.itemLineId)) {\r\n p = this.validateProductItemDiscount(p);\r\n const productContributionInTotal =\r\n this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnDiscountsPortion) +\r\n this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnPromotionsPortion) -\r\n this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.refundPortion);\r\n total += (p.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal));\r\n }\r\n });\r\n console.log(\r\n `ebasket: trnsactionPromotion: ${JSON.stringify(\r\n promotion\r\n )}, selected products total: ${total}`\r\n );\r\n basket.products.forEach((product: any) => {\r\n product = this.validateProductItemDiscount(product);\r\n\r\n const productContributionInTotal =\r\n this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion) +\r\n this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion) -\r\n this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.refundPortion);\r\n\r\n if (promotion.itemLineIds.includes(product.itemLineId)) {\r\n percentage = ((product.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal)) / total) * 100;\r\n product.itemDiscounts.trnPromotionsPortion +=\r\n (promotion.promotionAmount * percentage) / 100;\r\n product.itemDiscounts.trnPromotionsPortion = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion);\r\n }\r\n });\r\n }\r\n return basket;\r\n }\r\n\r\n transactionDiscountProductPortionCalc(\r\n basket: any,\r\n discount: any\r\n ) {\r\n let total = 0;\r\n let percentage = 0;\r\n\r\n basket.products.forEach((p: any) => {\r\n if (discount.itemLineIds.includes(p.itemLineId)) {\r\n p = this.validateProductItemDiscount(p);\r\n const productContributionInTotal =\r\n this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnDiscountsPortion) +\r\n this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnPromotionsPortion) -\r\n this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.refundPortion);\r\n\r\n\r\n total += (p.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal));\r\n }\r\n });\r\n\r\n console.log(\r\n `ebasket: trnsactionDiscount: ${JSON.stringify(\r\n discount\r\n )}, selected products total: ${total}`\r\n );\r\n\r\n basket.products.forEach((product:any) => {\r\n product = this.validateProductItemDiscount(product);\r\n console.log(product.discountable, \"ebasket : basket service : discountable in basket service\");\r\n\r\n const productContributionInTotal =\r\n this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion) +\r\n this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion) -\r\n this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.refundPortion);\r\n\r\n if (discount.itemLineIds.includes(product.itemLineId) && product.discountable == true) {\r\n percentage = ((product.total - this.numberUtilService.trimTo2Decimal2(productContributionInTotal)) / total) * 100;\r\n product.itemDiscounts.trnDiscountsPortion +=\r\n (discount.discountAmount * percentage) / 100;\r\n product.itemDiscounts.trnDiscountsPortion = this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion)\r\n }\r\n });\r\n return basket;\r\n }\r\n\r\n public validateProductItemDiscount(product: Product) {\r\n if (!product.itemDiscounts) {\r\n product.itemDiscounts = {\r\n trnDiscountsPortion: 0,\r\n trnPromotionsPortion: 0,\r\n refundPortion: 0,\r\n };\r\n }\r\n return product;\r\n }\r\n\r\n markProduct(product: Product) {\r\n this.productSource.next(product);\r\n }\r\n stopPeerSyncProcess(peerSync: boolean) {\r\n this.peerSource.next(peerSync);\r\n }\r\n\r\n scanStart(isScanning: boolean) {\r\n this.scanSource.next(isScanning);\r\n }\r\n\r\n promotionRemainingCalculation(promotion: TransactionPromotion[]) {\r\n var promotionValue = 0;\r\n promotion.forEach((element) => {\r\n promotionValue += element.promotionAmount;\r\n });\r\n return promotionValue;\r\n }\r\n\r\n discountRemainingCalculation(discount: TransactionDiscount[]) {\r\n var discountValue = 0;\r\n discount.forEach((element) => {\r\n discountValue += element.discountAmount;\r\n });\r\n return discountValue;\r\n }\r\n\r\n discountRefundedCalculation(discount: TransactionDiscount[]) {\r\n var discountValue = 0;\r\n discount.forEach((element) => {\r\n if (element.discountAmount < 0) {\r\n discountValue += element.discountAmount;\r\n }\r\n });\r\n return discountValue;\r\n }\r\n\r\n generateNewItemLineId(products: Product[]) {\r\n let largestNumber: any = 0;\r\n\r\n if (products.length > 0) {\r\n let itemLineIdArray = products.map((product) => {\r\n return product.itemLineId;\r\n });\r\n\r\n largestNumber = itemLineIdArray.reduce((a :any, b:any) => Math.max(a, b));\r\n }\r\n\r\n return largestNumber + 1;\r\n }\r\n\r\n updateBasketProductDataAsPerQuantity(\r\n product: any,\r\n quantity: number\r\n ): Product {\r\n\r\n console.log(`ebasket: updateBasketProductDataAsPerQuantity : ${quantity} product: ${JSON.stringify(product)}`);\r\n product.quantity = quantity;\r\n if (product.hasOwnProperty(\"lineDiscount\")) {\r\n // && this.product.quantity !== this.productDetailForm.controls.quantity.value\r\n product.lineDiscount.discountedLinePrice = Number(\r\n this.numberUtilService.getFlooredFixed(\r\n product.lineDiscount.unitPrice * quantity,\r\n 2\r\n )\r\n );\r\n product.lineDiscount.discountAmount =\r\n product.totalLinePrice - product.lineDiscount.discountedLinePrice;\r\n } else {\r\n product.totalLinePrice =\r\n quantity * this.numberUtilService.trimTo2Decimal(product.selectedPrice);\r\n }\r\n if (product.lineDiscount) {\r\n product.total = product.lineDiscount.discountedLinePrice;\r\n } else {\r\n product.total = product.totalLinePrice;\r\n }\r\n console.log(`ebasket: updateBasketProductDataAsPerQuantity : ${quantity} product: ${JSON.stringify(product)}`);\r\n\r\n return product;\r\n }\r\n\r\n filterProductListWithWebOrder(isWebOrder: boolean): Product[] {\r\n console.log(\"ebasket: filterProductListWithWebOrder hit\", JSON.stringify(this.currentBasket.products));\r\n if (isWebOrder)\r\n return this.currentBasket.products.filter((x) => x.isWebOrder);\r\n else {\r\n return this.currentBasket.products.filter((x) => !x.isWebOrder);\r\n }\r\n }\r\n\r\n filterProductListWithDelivery(): Product[] {\r\n console.log(\"ebasket: filterProductListWithDelivery hit\", JSON.stringify(this.currentBasket.products));\r\n return this.currentBasket.products.filter((x) => x.deliveryMethod === DELIVERY_METHODS.DELIVERY.toString());\r\n }\r\n\r\n filterProductListWithDeliveryGroup(group: string, products: Product[]): Product[] {\r\n console.log(\"ebasket: filterProductListWithDeliveryGroup hit\", JSON.stringify(products));\r\n return products.filter((x) => x.deliveryGroup === group);\r\n }\r\n\r\n generateNewDeliveryGroupNumber(products: Product[]) {\r\n let largestNumber = 0;\r\n\r\n if (products.length > 0) {\r\n let deliveryGroupArr = products.map((product) => {\r\n if (product.deliveryGroup) {\r\n return parseInt(product.deliveryGroup);\r\n }\r\n return 0;\r\n });\r\n\r\n largestNumber = deliveryGroupArr.reduce((a, b) => Math.max(a, b));\r\n }\r\n\r\n return (largestNumber + 1).toString();\r\n }\r\n\r\n getDeliveryGroupNumbers(products: Product[]) {\r\n console.log(\"getDeliveryGroupNumbers initiating : \", JSON.stringify(products));\r\n\r\n let uniqueAndsortedResult: number[] = [];\r\n\r\n if (products.length > 0) {\r\n let deliveryGroupArr = products.map((product) => {\r\n if (product.deliveryGroup) {\r\n return parseInt(product.deliveryGroup);\r\n }\r\n else if (product.deliveryMethod === \"1\") {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n\r\n uniqueAndsortedResult = Array.from(new Set(deliveryGroupArr)).sort((a, b) => a - b);\r\n console.log(\"getDeliveryGroupNumbers : \", JSON.stringify(uniqueAndsortedResult));\r\n }\r\n return uniqueAndsortedResult;\r\n }\r\n\r\n updateProductsWithNewDeliveryGroupNumber(products: Product[]) {\r\n console.log(\"updateProductsWithNewDeliveryGroupNumber initiating : \", JSON.stringify(products));\r\n\r\n let newGroupNumber = this.generateNewDeliveryGroupNumber(this.currentBasket.products);\r\n if (products.length > 0) {\r\n this.currentBasket.products.forEach(cBProducts => {\r\n products.forEach(element => {\r\n if (cBProducts.itemLineId === element.itemLineId) {\r\n cBProducts.deliveryGroup = newGroupNumber;\r\n }\r\n\r\n });\r\n });\r\n\r\n }\r\n\r\n this.updateBasket(this.currentBasket);\r\n return;\r\n }\r\n\r\n calculateEstimatedTime(products: any[]) {\r\n try {\r\n let time;\r\n let estmatedTime: number = 0;\r\n let estimatedDays: string = \"Hours\";\r\n products.forEach((element: { leadTime: { type: string; value: any; }; }) => {\r\n\r\n if (element.leadTime.type.toLocaleLowerCase() === \"weeks\") {\r\n time = Number(element.leadTime.value) * 24 * 7;\r\n estmatedTime = Math.max(estmatedTime, time);\r\n estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays\r\n console.log(\"week\", estmatedTime, estimatedDays);\r\n\r\n } else if (element.leadTime.type.toLocaleLowerCase() === \"days\") {\r\n time = Number(element.leadTime.value) * 24;\r\n estmatedTime = Math.max(estmatedTime, time);\r\n estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays\r\n\r\n console.log(\"days\", estmatedTime, estimatedDays);\r\n\r\n }\r\n else if (element.leadTime.type.toLocaleLowerCase() === \"months\") {\r\n time = Number(element.leadTime.value) * 24 * 30;\r\n estmatedTime = Math.max(estmatedTime, time);\r\n estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays\r\n\r\n console.log(\"months\", estmatedTime, estimatedDays);\r\n\r\n }\r\n else if (element.leadTime.type.toLocaleLowerCase() === \"years\") {\r\n time = Number(element.leadTime.value) * 24 * 365;\r\n estmatedTime = Math.max(estmatedTime, time);\r\n estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays\r\n\r\n console.log(\"years\", estmatedTime, estimatedDays);\r\n\r\n } else {\r\n time = Number(element.leadTime.value);\r\n estmatedTime = Math.max(estmatedTime, time);\r\n estimatedDays = (estmatedTime === time) ? element.leadTime.type : estimatedDays;\r\n console.log(\"hours\", estmatedTime, estimatedDays);\r\n\r\n }\r\n });\r\n\r\n if (estimatedDays.toLocaleLowerCase() === \"days\") {\r\n estmatedTime = estmatedTime / 24;\r\n } else if (estimatedDays.toLocaleLowerCase() === \"weeks\") {\r\n estmatedTime = estmatedTime / (24 * 7);\r\n } else if (estimatedDays.toLocaleLowerCase() === \"months\") {\r\n estmatedTime = estmatedTime / (24 * 30);\r\n } else if (estimatedDays.toLocaleLowerCase() === \"years\") {\r\n estmatedTime = estmatedTime / (24 * 365);\r\n }\r\n\r\n let estimate = {\r\n value: estmatedTime.toString(),\r\n type: estimatedDays\r\n }\r\n return estimate;\r\n } catch (error) {\r\n console.log(\"error in calculateEstimatedTime\", error);\r\n }\r\n return 0;\r\n }\r\n\r\n updateProductsWithDeliveryGroupNumber(oldGroup: string, newGroup: string) {\r\n console.log(\"updateProductsWithDeliveryGroupNumber initiating\");\r\n\r\n this.currentBasket.products.forEach(cBProducts => {\r\n if (cBProducts.deliveryGroup === oldGroup) {\r\n cBProducts.deliveryGroup = newGroup;\r\n }\r\n\r\n });\r\n\r\n this.updateBasket(this.currentBasket);\r\n return;\r\n }\r\n\r\n getDeliveryInfo(): any {\r\n console.log(\"getDeliveryGroupInfor initiating\");\r\n try {\r\n let groupInfo: DeliveryInfo = {\r\n groups: []\r\n }\r\n\r\n this.getDeliveryGroupNumbers(this.currentBasket.products).forEach((groupNumber) => {\r\n let group: any = {\r\n groupNumber: groupNumber,\r\n items: [],\r\n estimate: {\r\n type: \"Hours\",\r\n value: \"0\"\r\n }\r\n }\r\n this.currentBasket.products.forEach(cBProducts => {\r\n if (cBProducts.deliveryGroup === groupNumber.toString()) {\r\n group.items.push(cBProducts);\r\n }\r\n });\r\n\r\n group.estimate = this.calculateEstimatedTime(group.items);\r\n\r\n groupInfo.groups.push(group);\r\n\r\n });\r\n\r\n return groupInfo;\r\n }\r\n catch (error) {\r\n console.log(\"error\", error);\r\n }\r\n }\r\n}\r\n","import { CurrencyPipe } from \"@angular/common\";\r\nimport { Injectable } from \"@angular/core\";\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class NumberUtilService {\r\n constructor( private cp: CurrencyPipe) {}\r\n\r\n trimTo2Decimal(no: any) {\r\n //return Math.floor(no * 100) / 100;\r\n return no;\r\n }\r\n\r\n trimTo2Decimal2(no: number) {\r\n return Number(this.getFlooredFixed(no,2));\r\n }\r\n\r\n getFlooredFixed(v:any, d:any) {\r\n return (Math.floor(v * Math.pow(10, d)) / Math.pow(10, d)).toFixed(d);\r\n }\r\n\r\n AppendWithCurrencySymbol(numValue: any, currencyCode: string): string {\r\n let returnValue: any = \"\";\r\n if (numValue) {\r\n const numb: number = parseFloat(numValue.toString().replace(',',''));\r\n returnValue = this.cp.transform(\r\n Number(numValue).toFixed(2),\r\n currencyCode.toLocaleUpperCase(),\r\n \"symbol\"\r\n );\r\n console.log(\"AppendWithCurrencySymbol :\" + returnValue);\r\n } else {\r\n returnValue = this.cp.transform(\r\n \"0.00\",\r\n currencyCode.toLocaleUpperCase(),\r\n \"symbol\"\r\n );\r\n }\r\n return returnValue;\r\n }\r\n}\r\n","import { CurrencyPipe } from \"@angular/common\";\r\nimport { BasketSummary, CurrentTransactionDetails, Customer, DELIVERY_METHODS, ItemDiscounts, TaxBreakdown, TaxLine, TBasket, TotalTaxSummary, TProduct, TransactionDocument } from \"./mapper-library.model\";\r\nimport { TRANSACTION_TYPE, Basket, LineDiscount, LinePromotions, Product, UserOverride } from \"./mapper-library.model\";\r\nimport { BasketService } from \"./basket.service\";\r\nimport { NumberUtilService } from \"./number-util.service\";\r\n\r\n/**\r\n * Transaction document builder\r\n */\r\nexport class TransactionDocumentBuilder {\r\n private transactionDocument: TransactionDocument;\r\n private numberUtilService: NumberUtilService;\r\n private storeInfo : any;\r\n \r\n constructor(\r\n transactionDoc?: TransactionDocument,\r\n private currencyPipe?: CurrencyPipe,\r\n private basketService?: BasketService | any,\r\n ) {\r\n this.numberUtilService = new NumberUtilService(currencyPipe);\r\n this.basketService = new BasketService(this.numberUtilService);\r\n this.storeInfo = JSON.parse(localStorage.getItem('storeInfo') || '{}');\r\n if (transactionDoc) {\r\n this.transactionDocument = transactionDoc;\r\n } else {\r\n this.transactionDocument = {\r\n transactionId: \"\",\r\n offlineTransactionId: \"\",\r\n transactionRef: \"\",\r\n dateTime: \"\",\r\n orgCode: \"\",\r\n storeId: \"\",\r\n storeNodeId: \"\",\r\n storeNodeStructure: \"\",\r\n deviceId: \"\",\r\n terminalId: \"\",\r\n userId: \"\",\r\n initiatingModule : \"eBasket\",\r\n export: false,\r\n basket: {} as TBasket,\r\n basketSummary: {} as BasketSummary,\r\n baseCurrency: \"\",\r\n type: \"\",\r\n operationStatus: \"\",\r\n createdAt: \"\",\r\n updatedAt: \"\",\r\n id: \"\",\r\n currentTransactionDetails: {} as CurrentTransactionDetails,\r\n saleTotal: 0,\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Transactions ref\r\n * @returns ref\r\n */\r\n transactionRef(): TransactionDocumentBuilder {\r\n const storeDetails = JSON.parse(localStorage.getItem('storeInfo') || '{}');\r\n const date = new Date();\r\n const random = (((1 + Math.random()) * 0x10000) | 0)\r\n .toString(16)\r\n .substring(1);\r\n this.transactionDocument.transactionRef =\r\n storeDetails.orgCode + storeDetails.storeId + date.toISOString() + random;\r\n console.log(\"ebasket: transaction ref created\", this.transactionDocument.transactionRef)\r\n return this;\r\n }\r\n\r\n /**\r\n * Transactions id\r\n * @param transactionID\r\n * @returns id\r\n */\r\n transactionId(transactionID: string, isOnline: boolean = true): TransactionDocumentBuilder {\r\n if (isOnline) {\r\n this.transactionDocument.transactionId = transactionID;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Transactions id\r\n * @param transactionID\r\n * @returns id\r\n */\r\n offlineTransactionId(transactionID: string, isOnline: any): TransactionDocumentBuilder {\r\n if (!isOnline) {\r\n this.transactionDocument.offlineTransactionId = transactionID;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * storeNode Id\r\n * @param storeNodeId\r\n * @returns id\r\n */\r\n storeNodeId(storeNodeId: string): TransactionDocumentBuilder {\r\n this.transactionDocument.storeNodeId = storeNodeId;\r\n return this;\r\n }\r\n\r\n /**\r\n* storeNode structure\r\n* @param storeNodeStructure\r\n* @returns id\r\n*/\r\n storeNodeStructure(storeNodeStructure: string): TransactionDocumentBuilder {\r\n this.transactionDocument.storeNodeStructure = storeNodeStructure;\r\n return this;\r\n }\r\n\r\n /**\r\n * Orgs code\r\n * @param orgCode\r\n * @returns code\r\n */\r\n orgCode(orgCode: any): TransactionDocumentBuilder {\r\n this.transactionDocument.orgCode = orgCode;\r\n return this;\r\n }\r\n /**\r\n * Stores id\r\n * @param storeId\r\n * @returns id\r\n */\r\n storeId(storeId: any): TransactionDocumentBuilder {\r\n this.transactionDocument.storeId = storeId;\r\n return this;\r\n }\r\n /**\r\n * Dates time\r\n * @returns time\r\n */\r\n dateTime(): TransactionDocumentBuilder {\r\n const date = new Date();\r\n this.transactionDocument.dateTime = date.toISOString();\r\n return this;\r\n }\r\n /**\r\n * Devices id\r\n * @param deviceId\r\n * @returns id\r\n */\r\n deviceId(deviceId: any): TransactionDocumentBuilder {\r\n this.transactionDocument.deviceId = deviceId;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * terminal id\r\n * @param terminalId\r\n * @returns id\r\n */\r\n terminalId(terminalId: any): TransactionDocumentBuilder {\r\n this.transactionDocument.terminalId = terminalId;\r\n return this;\r\n }\r\n\r\n\r\n\r\n\r\n\r\n /**\r\n * saleExport\r\n * @param saleExport\r\n * @returns id\r\n */\r\n export(saleExport: any): TransactionDocumentBuilder {\r\n this.transactionDocument.export = saleExport;\r\n return this;\r\n }\r\n\r\n\r\n\r\n /* customer(): TransactionDocumentBuilder {\r\n const user = JSON.parse(localStorage.getItem('userDetails'));\r\n this.transactionDocument.customer = user;\r\n return this;\r\n } */\r\n /**\r\n * Baskets transaction document builder\r\n * @param basketDetails\r\n * @returns basket\r\n */\r\n basket(basketDetails: Basket): TransactionDocumentBuilder {\r\n console.log(\"ebasket: basket details update in transaction document\", JSON.stringify(basketDetails));\r\n\r\n this.transactionDocument.subsidiaryId = basketDetails.subsidiaryId || (localStorage.getItem('subsidiaryId') || '');\r\n this.transactionDocument.basket.products = [] as TProduct[];\r\n this.transactionDocument.basket.lineDiscount = [];\r\n this.transactionDocument.basket.linePromotion = [];\r\n this.transactionDocument.basket.transactionPromotion = [];\r\n basketDetails.products.forEach((product: any, index) => {\r\n const p = {} as TProduct;\r\n p.itemDiscounts = {} as ItemDiscounts;\r\n p.SKU = product.SKU;\r\n p.excludePromotion = product.excludePromotion;\r\n p.barCode = product.barcode;\r\n p.barcodes = product.barcodes;\r\n p.description = product.description;\r\n p.itemLineId = product.itemLineId ? product.itemLineId.toString() : \"\" + (index + 1);\r\n p.price = product.selectedPrice;\r\n p.quantity = product.quantity;\r\n p.totalLinePrice = product.quantity * product.selectedPrice;\r\n p.imageUrls = product.imageUrls;\r\n p.selectedRRPPrice = product.selectedRRPPrice;\r\n\r\n //inventory fields\r\n \r\n p.fullfilmentId = product.fullfilmentId? product.fullfilmentId: this.storeInfo.storeId;\r\n\r\n p.fullfilmentLocationName = product.fullfilmentLocationName;\r\n p.deliveryGroup = product.deliveryGroup;\r\n p.leadTime = product.leadTime;\r\n p.deliveryMethod = product.deliveryMethod;\r\n\r\n p.giftCard = product.giftCard;\r\n p.giftCardExpiryDate = product.giftCardExpiryDate;\r\n p.giftCardNumberIssued = product.giftCardNumberIssued;\r\n p.giftCardRecipientEmail = product.giftCardRecipientEmail;\r\n p.giftCardRecipientName = product.giftCardRecipientName;\r\n\r\n if (product.refundedQuantity > 0) {\r\n p.refundedQuantity = product.refundedQuantity;\r\n p.refundedPromotionalQuantity = product.refundPromotionalQuantity;\r\n p.refunded = product.refunded;\r\n p.refundedReasonDescription = product.refundedReasonDescription;\r\n p.refundedReason = product.refundedReason;\r\n if (!p.refundedReasonDescription) {\r\n p.refundedReasonDescription = p.refundedReason;\r\n }\r\n p.refundedTotal = product.refundedTotal;\r\n p.isLastExchanged = product.isLastExchanged;\r\n }\r\n\r\n if (product.exchange) {\r\n p.exchange = product.exchange;\r\n }\r\n if (product.lineDiscount) {\r\n p.lineDiscount = product.lineDiscount;\r\n }\r\n p.itemDiscounts = product.itemDiscounts as ItemDiscounts;\r\n this.transactionDocument.basket.products.push(p);\r\n this.lineDiscount(basketDetails);\r\n });\r\n console.info(\"ebasket: transactiondocument basket details updated\", JSON.stringify(this.transactionDocument.basket));\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * current transaction Details Total(New Products)\r\n * @returns currentTransactionDetails\r\n */\r\n\r\n currentTransactionDetails(basket: Basket): TransactionDocumentBuilder {\r\n console.log(\"ebasket: current transaction details for exchanges\", basket);\r\n this.transactionDocument.currentTransactionDetails.products = [] as Product[];\r\n this.transactionDocument.currentTransactionDetails.linePromotion = [] as LinePromotions[];\r\n this.transactionDocument.currentTransactionDetails.lineDiscount = [] as LineDiscount[];\r\n this.transactionDocument.currentTransactionDetails.transactionDiscount = [];\r\n this.transactionDocument.currentTransactionDetails.products = basket.products;\r\n this.transactionDocument.currentTransactionDetails.products = this.transactionDocument.currentTransactionDetails.products.filter(\r\n ( proj: { refundedQuantity: number; }) => proj.refundedQuantity != 0\r\n );\r\n\r\n this.transactionDocument.currentTransactionDetails.products.forEach((product: { refundedQuantity: any; quantity: any; totalLinePrice: number; refundedTotal: number; total: any; refunded: boolean; linePromotions: any; lineDiscount: any; }) => {\r\n if (product.refundedQuantity) {\r\n product.quantity = product.refundedQuantity;\r\n // updating total line price with actual price to be refunded including the refunding qty\r\n product.totalLinePrice = Math.abs(product.refundedTotal);\r\n product.total = product.totalLinePrice;\r\n if (product.quantity === product.refundedQuantity) {\r\n product.refunded = true;\r\n }\r\n }\r\n //Updating line promotions and line discounts \r\n if (product.linePromotions && !product.refundedQuantity) {\r\n this.transactionDocument.currentTransactionDetails.linePromotion.push(product.linePromotions)\r\n }\r\n if (product.lineDiscount && !product.refundedQuantity) {\r\n this.transactionDocument.currentTransactionDetails.lineDiscount.push(product.lineDiscount)\r\n }\r\n });\r\n\r\n console.log(\"ebasket: current transaction details after removing old products\", this.transactionDocument.currentTransactionDetails.products);\r\n\r\n if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {\r\n this.transactionDocument.currentTransactionDetails.transactionDiscount.push(...basket.transactionDiscount);\r\n }\r\n this.transactionDocument.currentTransactionDetails.basketSummary = {} as BasketSummary;\r\n\r\n this.transactionDocument.currentTransactionDetails.basketSummary.saleTotal = this.numberUtilService.trimTo2Decimal2(this.updateSaleTotal(this.transactionDocument.currentTransactionDetails));\r\n this.transactionDocument.currentTransactionDetails.basketSummary.totalItems = basket.quantity;\r\n\r\n\r\n this.transactionDocument.currentTransactionDetails.basketSummary.basketTotal = basket.basketTotal;\r\n this.transactionDocument.currentTransactionDetails.basketSummary.refundTotal = this.updateCurrentTransactionDetailsRefundTotal();\r\n // For partial refund discount is updatied in total line price so discountTotal will always be zero & in case of exchange discount total is calculated\r\n\r\n if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_EXCHANGE) {\r\n this.transactionDocument.currentTransactionDetails.basketSummary.discountTotal = this.numberUtilService.trimTo2Decimal2(this.updateCurrentTransactionDetailsDiscountTotal());\r\n } else {\r\n if (this.transactionDocument.currentTransactionDetails.transactionDiscount && this.transactionDocument.currentTransactionDetails.transactionDiscount.length > 0) {\r\n let discountTotal = 0;\r\n this.transactionDocument.currentTransactionDetails.transactionDiscount.forEach((discount: { discountAmount: number; }) => {\r\n discountTotal += discount.discountAmount;\r\n });\r\n this.transactionDocument.currentTransactionDetails.basketSummary.discountTotal = Math.abs(discountTotal);\r\n } else {\r\n this.transactionDocument.currentTransactionDetails.basketSummary.discountTotal = 0;\r\n }\r\n }\r\n\r\n console.log(\"ebasket:this.transactionDocument.currentTransactionDetails\", JSON.stringify(this.transactionDocument.currentTransactionDetails));\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * current transaction Tax Total\r\n * @returns Tax Total\r\n */\r\n\r\n updateCurrentTransactionDetailsTaxBreakdown(basketDetails: Basket): TransactionDocumentBuilder {\r\n let transactionDiscountTotal = 0;\r\n let taxBreakdown: TaxBreakdown = {\r\n taxLines: [],\r\n totalTaxableAmount: 0,\r\n };\r\n\r\n if (this.transactionDocument.currentTransactionDetails.transactionDiscount && this.transactionDocument.currentTransactionDetails.transactionDiscount.length > 0) {\r\n this.transactionDocument.currentTransactionDetails.transactionDiscount.forEach((discount: { discountAmount: number; }) => {\r\n transactionDiscountTotal += discount.discountAmount;\r\n });\r\n }\r\n\r\n if (this.transactionDocument.currentTransactionDetails.products && this.transactionDocument.currentTransactionDetails.products.length > 0) {\r\n this.transactionDocument.currentTransactionDetails.products.forEach((product: { itemLineId: any; selectedVAT: any; selectedVATCode: any; total: any; refundedQuantity: number; itemDiscounts: { currentRefundPortion: number; trnDiscountsPortion: number; trnPromotionsPortion: number; }; }) => {\r\n let taxLine: TaxLine = {\r\n itemLineId: product.itemLineId,\r\n VAT: product.selectedVAT ? product.selectedVAT : 0,\r\n VATCode: product.selectedVATCode,\r\n taxLineTotal: 0,\r\n taxableAmount: product.total,\r\n PreTax: 0\r\n\r\n };\r\n console.info(\"Product contribution : item line ID :current transaction Details\",\r\n product.itemLineId, \"tax line :\", JSON.stringify(taxLine), JSON.stringify(basketDetails.basketTotal));\r\n\r\n //step 1\r\n // if Transaction Discount and/or promotion applied, find net selling price of each product as taxableamount\r\n\r\n //If transaction discount/promotion is applied taxable amount should be deducting transaction promotion and transaction disacount portion\r\n if (product.refundedQuantity && product.refundedQuantity > 0) {\r\n\r\n taxLine.taxableAmount = -Math.abs(taxLine.taxableAmount - product.itemDiscounts.currentRefundPortion);\r\n } else {\r\n taxLine.taxableAmount = taxLine.taxableAmount - product.itemDiscounts.trnDiscountsPortion - product.itemDiscounts.trnPromotionsPortion;\r\n }\r\n\r\n //step 2 - find pre tax\r\n taxLine.PreTax = this.numberUtilService.trimTo2Decimal2((taxLine.taxableAmount * 100) / (100 + taxLine.VAT));\r\n\r\n //step 3 - Update taxbreakdown\r\n taxBreakdown.totalTaxableAmount += taxLine.taxableAmount;\r\n taxLine.taxableAmount = this.numberUtilService.trimTo2Decimal2(taxLine.taxableAmount);\r\n \r\n // step 4 - update tax Line total\r\n taxLine.taxLineTotal = this.numberUtilService.trimTo2Decimal2(taxLine.taxableAmount - taxLine.PreTax);\r\n taxBreakdown.taxLines.push(taxLine);\r\n });\r\n }\r\n\r\n taxBreakdown.totalTaxableAmount = this.numberUtilService.trimTo2Decimal2(taxBreakdown.totalTaxableAmount);\r\n this.transactionDocument.currentTransactionDetails.taxBreakdown = taxBreakdown;\r\n if (this.transactionDocument.currentTransactionDetails.taxBreakdown && this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines && this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines.length > 0) {\r\n this.transactionDocument.currentTransactionDetails.basketSummary.VATTotal = this.numberUtilService.trimTo2Decimal2(this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines.reduce(\r\n (n: any, { taxLineTotal }: any) => n + taxLineTotal,\r\n 0\r\n ));\r\n }\r\n else {\r\n this.transactionDocument.currentTransactionDetails.basketSummary.VATTotal = 0.00;\r\n }\r\n\r\n console.log(\"eBasket:after calculating tax currenttransactionDetails\", this.transactionDocument.currentTransactionDetails)\r\n return this;\r\n }\r\n\r\n updateCurrentTransactionDetailsTotalTaxSummary(): TransactionDocumentBuilder {\r\n \r\n console.log(\"Total Tax Summery Request :\", JSON.stringify(this.transactionDocument.currentTransactionDetails.taxBreakdown));\r\n\r\n let totalTaxSummaryArray: TotalTaxSummary[] = []\r\n let totalTaxSummaryGroup = []\r\n\r\n console.log(\"Tax Lines for Total Tax Summery :\", JSON.stringify(this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines));\r\n\r\n this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines.forEach((element: { VATCode: any; VAT: any; PreTax: any; taxLineTotal: any; }) => {\r\n let TaxSummary: TotalTaxSummary = {\r\n VATCode:\"\",\r\n VAT: -12345,\r\n PreTaxSum: 0,\r\n TaxSum: 0,\r\n TXrateSum: 0\r\n };\r\n TaxSummary.VATCode=element.VATCode;\r\n TaxSummary.VAT = element.VAT; \r\n \r\n TaxSummary.PreTaxSum = this.numberUtilService.trimTo2Decimal2(element.PreTax); \r\n TaxSummary.TaxSum = this.numberUtilService.trimTo2Decimal2(element.taxLineTotal);\r\n TaxSummary.TXrateSum = this.numberUtilService.trimTo2Decimal2(TaxSummary.PreTaxSum + TaxSummary.TaxSum); \r\n totalTaxSummaryArray.push(TaxSummary);\r\n })\r\n\r\n console.log(\"Total Tax Summery Without Grouped : \", JSON.stringify(totalTaxSummaryArray));\r\n \r\n totalTaxSummaryGroup = totalTaxSummaryArray.reduce((preparedArray:any,currentObj:any) => {\r\n let ind = preparedArray.findIndex((x: { VAT: any; }) => x.VAT === currentObj.VAT);\r\n if(ind === -1){\r\n preparedArray.push(currentObj)\r\n }else {\r\n preparedArray[ind].VATCode = currentObj.VATCode;\r\n preparedArray[ind].VAT = currentObj.VAT;\r\n preparedArray[ind].PreTaxSum += currentObj.PreTaxSum;\r\n preparedArray[ind].TaxSum += currentObj.TaxSum;\r\n preparedArray[ind].TXrateSum += currentObj.TXrateSum;\r\n }\r\n return preparedArray;\r\n },[])\r\n // listOfTags.map(x => unique.filter(a => a.label == x.label && a.color == x.color).length > 0 ? null : unique.push(x));\r\n\r\n console.log(\"Total Tax Summer Group :\", JSON.stringify(totalTaxSummaryGroup));\r\n\r\n this.transactionDocument.currentTransactionDetails.totalTaxSummary = totalTaxSummaryGroup;\r\n return this;\r\n\r\n }\r\n\r\n /**\r\n * current transaction Disocunt Total\r\n * @returns Discount Total\r\n */\r\n updateCurrentTransactionDetailsDiscountTotal() {\r\n let refundTotal = this.transactionDocument.currentTransactionDetails.basketSummary.refundTotal ? this.transactionDocument.currentTransactionDetails.basketSummary.refundTotal : 0;\r\n\r\n console.log(\"e-basket: transaction builder updateCurrentTransactionDetailsDiscountTotal: discountTotal\", refundTotal, this.transactionDocument.currentTransactionDetails.basketSummary.basketTotal, this.transactionDocument.currentTransactionDetails.basketSummary.saleTotal);\r\n const discountTotal =\r\n Math.abs(\r\n Math.abs(this.transactionDocument.currentTransactionDetails.basketSummary.saleTotal) -\r\n (Math.abs(this.transactionDocument.currentTransactionDetails.basketSummary.basketTotal) + Math.abs(refundTotal))\r\n );\r\n console.log(\"e-basket: transaction builder updateCurrentTransactionDetailsDiscountTotal: discountTotal\", discountTotal)\r\n return Number(discountTotal.toFixed(2));\r\n }\r\n\r\n /**\r\n * current transaction Refund Total\r\n * @returns Refund Total\r\n */\r\n updateCurrentTransactionDetailsRefundTotal() {\r\n let totalRefund = 0;\r\n for (let index = 0; index < this.transactionDocument.currentTransactionDetails.products.length; index++) {\r\n const product: Product = this.transactionDocument.currentTransactionDetails.products[index];\r\n if (product.refundedTotal) {\r\n totalRefund = totalRefund + product.refundedTotal;\r\n }\r\n console.log(\"ebasket : transaction Service: totalRefund for Current TransactionDetails\" + totalRefund)\r\n }\r\n return totalRefund;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Baskets summary\r\n * @param basketDetails\r\n * @returns summary\r\n */\r\n basketSummary(basketDetails: Basket): TransactionDocumentBuilder {\r\n this.transactionDocument.basketSummary.basketTotal = this.numberUtilService.trimTo2Decimal(basketDetails.basketTotal);\r\n\r\n this.transactionDocument.basketSummary.saleTotal = this.numberUtilService.trimTo2Decimal2(this.updateSaleTotal(\r\n basketDetails\r\n ));\r\n this.transactionDocument.basketSummary.refundTotal = this.getRefundTotal();\r\n if (\r\n this.transactionDocument.basket.lineDiscount ||\r\n this.transactionDocument.basket.linePromotion\r\n ) {\r\n this.transactionDocument.basketSummary.discountTotal = this.numberUtilService.trimTo2Decimal2(this.updateDiscountTotal());\r\n }\r\n this.transactionDocument.basketSummary.totalItems = basketDetails.quantity;\r\n\r\n\r\n if (this.transactionDocument.basket.taxBreakdown) {\r\n this.transactionDocument.basketSummary.VATTotal = this.numberUtilService.trimTo2Decimal2(this.transactionDocument.basket.taxBreakdown.taxLines.reduce(\r\n (n: any, { taxLineTotal }: any) => n + taxLineTotal,\r\n 0\r\n ));\r\n }\r\n else {\r\n this.transactionDocument.basketSummary.VATTotal = 0.00;\r\n }\r\n\r\n console.info(\"ebasket: basketsummary updated in transaction document: \", JSON.stringify(this.transactionDocument.basketSummary));\r\n return this;\r\n }\r\n\r\n /**\r\n * Line Discount\r\n * @param basketDetails\r\n * @returns line Discount\r\n */\r\n lineDiscount(basketDetails: Basket): TransactionDocumentBuilder {\r\n this.transactionDocument.basket.lineDiscount = [];\r\n for (let index = 0; index < basketDetails.products.length; index++) {\r\n const element = basketDetails.products[index];\r\n if (element.lineDiscount) {\r\n this.transactionDocument.basket.lineDiscount.push(element.lineDiscount);\r\n this.transactionDocument.basket.lineDiscount = this.transactionDocument.basket.lineDiscount.reduce(\r\n (acc: any[], val: { itemLineId: any; }) => {\r\n if (!acc.find((el: { itemLineId: any; }) => el.itemLineId === val.itemLineId)) {\r\n acc.push(val);\r\n }\r\n return acc;\r\n },\r\n []\r\n );\r\n }\r\n\r\n // console.info(\r\n // \"e-basket :line discount updated in transaction document\",\r\n // this.transactionDocument.basket.lineDiscount\r\n // );\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * exchange\r\n * @param basketDetails\r\n * @returns exchange \r\n */\r\n exchange(basketDetails: Basket): TransactionDocumentBuilder {\r\n this.transactionDocument.basket.exchange = basketDetails.exchange && basketDetails.exchange.length > 0 ? [...basketDetails.exchange] : [];\r\n for (let index = 0; index < basketDetails.products.length; index++) {\r\n\r\n const element: any = basketDetails.products[index];\r\n if (element.exchange != undefined) {\r\n const isPresent = this.transactionDocument.basket.exchange.some((el: { exchangeId: any; }) => el.exchangeId === element.exchange.exchangeId);\r\n if (!isPresent) {\r\n let exchangeItems = [];\r\n for (let j = 0; j < element.exchange.newItems.length; j++) {\r\n const item = element.exchange.newItems[j];\r\n let newItems: any = { lineItemId: item.itemLineId, Quantity: item.quantity }\r\n exchangeItems.push(newItems);\r\n }\r\n element.exchange.newItems = [...exchangeItems];\r\n this.transactionDocument.basket.exchange.push(element.exchange);\r\n }\r\n }\r\n console.log(\r\n \"e-basket :TransactionDocumentBuilder: this.transactionDocument.basket exchange\",\r\n JSON.stringify(this.transactionDocument.basket.exchange)\r\n );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * add previous exchange data\r\n * @param originalTransactionDocument\r\n * @returns line Promotions\r\n */\r\n addExchangeData(originalTransactionDocument: TransactionDocument): TransactionDocumentBuilder {\r\n this.transactionDocument.basket.exchange = originalTransactionDocument.basket.exchange ? [...originalTransactionDocument.basket.exchange] : null;\r\n return this;\r\n }\r\n\r\n /**\r\n * line Promotions\r\n * @param basketDetails\r\n * @returns line Promotions\r\n */\r\n linePromotion(basketDetails: Basket): TransactionDocumentBuilder {\r\n this.transactionDocument.basket.linePromotion = [];\r\n for (let index = 0; index < basketDetails.products.length; index++) {\r\n const element = basketDetails.products[index];\r\n if (element.linePromotions) {\r\n this.transactionDocument.basket.linePromotion.push(\r\n element.linePromotions\r\n );\r\n this.transactionDocument.basket.linePromotion = this.transactionDocument.basket.linePromotion.reduce(\r\n (acc: any[], val: { itemLineId: any; }) => {\r\n if (!acc.find((el: { itemLineId: any; }) => el.itemLineId === val.itemLineId)) {\r\n acc.push(val);\r\n }\r\n return acc;\r\n },\r\n []\r\n );\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * transaction Promotion\r\n * @param basketDetails\r\n * @returns transaction Promotion\r\n */\r\n transactionPromotion(basketDetails: Basket): TransactionDocumentBuilder {\r\n if (basketDetails.transactionPromotion) {\r\n this.transactionDocument.basket.transactionPromotion =\r\n basketDetails.transactionPromotion;\r\n // for (let index = 0; index < basketDetails.TransactionDiscount.length; index++) {\r\n // this.transactionDocument.basket.transactionPromotion.push(element.linePromotions)\r\n // this.transactionDocument.basket.transactionPromotion = this.transactionDocument.basket.linePromotions.reduce((acc, val) => {\r\n // if (!acc.find(el => el.itemLineId === val.itemLineId)) {\r\n // acc.push(val);\r\n // }\r\n // return acc;\r\n // }, []);\r\n // }\r\n console.log(\r\n \"e-basket :TransactionDocumentBuilder: this.transactionDocument.basket.transactionPromotion\",\r\n JSON.stringify(this.transactionDocument.basket.transactionPromotion)\r\n );\r\n }\r\n return this;\r\n }\r\n\r\n transactionDiscount(basketDetails: Basket): TransactionDocumentBuilder {\r\n if (basketDetails.transactionDiscount) {\r\n this.transactionDocument.basket.transactionDiscount =\r\n basketDetails.transactionDiscount;\r\n\r\n console.log(\r\n \"e-basket :TransactionDocumentBuilder: transaction Discount\",\r\n JSON.stringify(this.transactionDocument.basket.transactionDiscount)\r\n );\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Payments details\r\n * @param paymentDetails\r\n * @returns\r\n */\r\n paymentDetails(paymentDetails: any) {\r\n console.info(\"ebasket : payment details after transaction completed\",JSON.stringify(paymentDetails));\r\n \r\n this.transactionDocument.paymentDetails = paymentDetails;\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Payments details\r\n * @param paymentDetails\r\n * @returns\r\n */\r\n splitPayment(splitPayment: boolean) { \r\n this.transactionDocument.splitPayment = splitPayment;\r\n return this;\r\n } \r\n\r\n /**\r\n * Payments details\r\n * @param paymentDetails\r\n * @returns\r\n */\r\n isPaymentCompleted(isPaymentCompleted: boolean) {\r\n this.transactionDocument.isPaymentCompleted = isPaymentCompleted;\r\n return this;\r\n } \r\n \r\n\r\n\r\n\r\n /**\r\n * Bases currency\r\n * @param currency\r\n * @returns currency\r\n */\r\n baseCurrency(currency: any): TransactionDocumentBuilder {\r\n this.transactionDocument.baseCurrency = currency;\r\n return this;\r\n }\r\n\r\n /**\r\n * gift option at\r\n * @returns at\r\n */\r\n giftOption(gift: any): TransactionDocumentBuilder {\r\n console.log(\r\n \"e-basket :TransactionDocumentBuilder: this.transactionDocument.giftoption\",\r\n gift\r\n );\r\n if (gift) {\r\n this.transactionDocument.giftedReceipt = gift;\r\n }\r\n return this;\r\n }\r\n /**\r\n\r\n/**\r\n * manual Discount\r\n * @param discountData\r\n * @returns\r\n */\r\n\r\n // manualDiscount(discountData : basketDiscount):TransactionDocumentBuilder {\r\n // let saleTotal = this.transactionDocument.basketSummary.basketTotal;\r\n // if(discountData.discountType =='Percent'){\r\n // this.transactionDocument.basketSummary.basketTotal = saleTotal-(saleTotal*(discountData.discountAmount/100));\r\n // discountData.discountAmount = -1*(saleTotal-this.transactionDocument.basketSummary.basketTotal);\r\n // }else {\r\n // this.transactionDocument.basketSummary.basketTotal =saleTotal-discountData.discountAmount;\r\n // discountData.discountAmount = -1*discountData.discountAmount;\r\n // }\r\n // this.transactionDocument.transactionDiscount.push(discountData);\r\n // return this;\r\n\r\n // }\r\n\r\n /**\r\n * Types transaction document builder\r\n * @param t\r\n * @returns type\r\n */\r\n type(t: any): TransactionDocumentBuilder {\r\n this.transactionDocument.type = t;\r\n return this;\r\n }\r\n /**\r\n * Operations status\r\n * @param o\r\n * @returns status\r\n */\r\n operationStatus(o: any): TransactionDocumentBuilder {\r\n this.transactionDocument.operationStatus = o;\r\n return this;\r\n }\r\n /**\r\n * Created at\r\n * @returns at\r\n */\r\n createdAt(): TransactionDocumentBuilder {\r\n const date = new Date();\r\n this.transactionDocument.createdAt = date.toISOString();\r\n this.transactionDocument.updatedAt = date.toISOString();\r\n return this;\r\n }\r\n /**\r\n * Updated at\r\n * @returns at\r\n */\r\n updatedAt(): TransactionDocumentBuilder {\r\n const date = new Date();\r\n this.transactionDocument.updatedAt = date.toISOString();\r\n return this;\r\n }\r\n /**\r\n * transsaction completion at\r\n * @returns transaction completion date\r\n */\r\n transactionCompletedAt(): TransactionDocumentBuilder {\r\n const date = new Date();\r\n this.transactionDocument.transCompletedAt = date.toISOString();\r\n return this;\r\n }\r\n /**\r\n * Builds transaction document builder\r\n * @returns build\r\n */\r\n build(): TransactionDocument {\r\n return this.transactionDocument;\r\n }\r\n\r\n /**\r\n * Sales total in refund\r\n * @param saleTotal\r\n * @returns total in refund\r\n */\r\n saleTotalInRefund(saleTotal: number): TransactionDocumentBuilder {\r\n this.transactionDocument.saleTotal = saleTotal;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets basket details\r\n * @returns basket details\r\n */\r\n getBasketDetails(): Basket {\r\n console.info(\"ebasket: Getting Basket for transactionDocument\", JSON.stringify(this.transactionDocument));\r\n\r\n let basket: Basket = {\r\n subsidiaryId : this.transactionDocument.subsidiaryId,\r\n transactionDiscount: this.transactionDocument.basket.transactionDiscount,\r\n transactionPromotion: this.transactionDocument.basket.transactionPromotion,\r\n transactionId: this.transactionDocument.transactionId,\r\n offlineTransactionId: this.transactionDocument.offlineTransactionId,\r\n total: this.transactionDocument.basketSummary.basketTotal,\r\n basketTotal: this.transactionDocument.basketSummary.basketTotal,\r\n discountTotal: this.transactionDocument.basketSummary.discountTotal,\r\n saleTotal: this.transactionDocument.basketSummary.saleTotal,\r\n refundTotal: this.transactionDocument.basketSummary.refundTotal,\r\n quantity: this.transactionDocument.basketSummary.totalItems,\r\n products: [],\r\n baseCurrency: this.transactionDocument.baseCurrency,\r\n customer: this.transactionDocument.customer,\r\n };\r\n\r\n basket.products = [] as Product[];\r\n this.transactionDocument.basket.products.forEach((product: { SKU: any; barCode: any; barcodes: any; description: any; imageUrls: any; totalLinePrice: any; itemLineId: any; excludePromotion: any; price: any; quantity: any; selectedRRPPrice: any; fullfilmentId: any; fullfilmentLocationName: any; deliveryGroup: string; leadTime: any; deliveryMethod: any; giftCard: any; giftCardExpiryDate: any; giftCardNumberIssued: any; giftCardRecipientEmail: any; giftCardRecipientName: any; refundedTotal: any; refundedQuantity: number; refundedReasonDescription: any; refundedReason: any; refundedPromotionalQuantity: any; isLastExchanged: any; }, index: any) => {\r\n console.log(JSON.stringify(product), \"ebasket: basket detail update in basket\");\r\n const p = {} as any;\r\n p.SKU = product.SKU;\r\n p.barcode = product.barCode;\r\n p.barcodes = product.barcodes;\r\n\r\n p.description = product.description;\r\n p.imageUrls = product.imageUrls;\r\n p.currency = this.transactionDocument.baseCurrency;\r\n p.totalLinePrice = product.totalLinePrice;\r\n p.itemLineId = Number(product.itemLineId);\r\n p.excludePromotion = product.excludePromotion;\r\n\r\n p.selectedPrice = product.price;\r\n p.quantity = product.quantity;\r\n p.total = product.totalLinePrice;\r\n p.selectedRRPPrice = product.selectedRRPPrice;\r\n\r\n p.fullfilmentId = product.fullfilmentId;\r\n p.fullfilmentLocationName = product.fullfilmentLocationName;\r\n p.deliveryGroup = product.deliveryGroup || \"1\";\r\n p.leadTime = product.leadTime;\r\n p.deliveryMethod = product.deliveryMethod || DELIVERY_METHODS.COLLECT_FROM_STORE.toString();\r\n\r\n if(p.fullfilmentId != this.transactionDocument.storeId)\r\n {\r\n p.isWebOrder = true;\r\n }\r\n \r\n p.giftCard = product.giftCard;\r\n p.giftCardExpiryDate = product.giftCardExpiryDate;\r\n p.giftCardNumberIssued = product.giftCardNumberIssued;\r\n p.giftCardRecipientEmail = product.giftCardRecipientEmail;\r\n p.giftCardRecipientName = product.giftCardRecipientName;\r\n \r\n if (\r\n this.transactionDocument.basket.lineDiscount &&\r\n this.transactionDocument.basket.lineDiscount.length > 0\r\n ) {\r\n this.transactionDocument.basket.lineDiscount.forEach((lineDiscount: { itemLineId: { toString: () => any; }; discountedLinePrice: any; }) => {\r\n if (product.itemLineId === lineDiscount.itemLineId.toString()) {\r\n p.lineDiscount = lineDiscount;\r\n p.total = lineDiscount.discountedLinePrice;\r\n }\r\n });\r\n }\r\n\r\n if (\r\n this.transactionDocument.basket.linePromotion &&\r\n this.transactionDocument.basket.linePromotion.length > 0\r\n ) {\r\n this.transactionDocument.basket.linePromotion.forEach((linePromotion: { itemLineId: { toString: () => any; }; promotionLinePrice: any; }) => {\r\n if (product.itemLineId === linePromotion.itemLineId.toString()) {\r\n p.linePromotions = linePromotion;\r\n p.total = linePromotion.promotionLinePrice;\r\n }\r\n });\r\n }\r\n\r\n if (\r\n this.transactionDocument.basket.taxBreakdown &&\r\n this.transactionDocument.basket.taxBreakdown.taxLines.length > 0\r\n ) {\r\n this.transactionDocument.basket.taxBreakdown.taxLines.forEach((taxLine: { itemLineId: { toString: () => any; }; VAT: any; VATCode: any; }) => {\r\n if (product.itemLineId && product.itemLineId === taxLine.itemLineId.toString()) {\r\n p.selectedVAT = taxLine.VAT;\r\n p.selectedVATCode = taxLine.VATCode;\r\n }\r\n });\r\n }\r\n\r\n if (this.transactionDocument.type === TRANSACTION_TYPE.REFUND) {\r\n p.total = product.refundedTotal;\r\n } else if ((this.transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND || TRANSACTION_TYPE.SALE_EXCHANGE) && product.refundedQuantity > 0) {\r\n p.refundedReasonDescription = product.refundedReasonDescription;\r\n p.refundedReason = product.refundedReason;\r\n if (!p.refundedReasonDescription) {\r\n p.refundedReasonDescription = p.refundedReason;\r\n }\r\n p.refundedQuantity = product.refundedQuantity;\r\n p.refundPromotionalQuantity = product.refundedPromotionalQuantity;\r\n p.refundedTotal = product.refundedTotal;\r\n p.total -= Math.abs(p.refundedTotal);\r\n p.isLastExchanged = product.isLastExchanged;\r\n }\r\n\r\n if (this.transactionDocument.type === TRANSACTION_TYPE.REFUND) {\r\n if (p.total > 0) {\r\n p.total *= -1;\r\n }\r\n }\r\n\r\n basket.products.push(p);\r\n\r\n });\r\n\r\n basket = this.getTransactionDiscountAndTransactionPromotionPortion(basket);\r\n basket.total = (basket.basketTotal || 0) + this.getTotalDiscountWithTransactionDiscountsAndPromotions(basket);\r\n if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND) {\r\n basket.quantity = this.getRefundedTotalWithQuantity(basket);\r\n }\r\n console.info(\"ebasket: Basket created successfully\", JSON.stringify(basket))\r\n return basket;\r\n }\r\n\r\n /**\r\n * Gets basket details\r\n * @returns refund basket details\r\n */\r\n // getRefundBasketDetails(): Basket {\r\n // let basket: Basket = {\r\n // subsidiaryId : this.transactionDocument.subsidiaryId,\r\n // transactionDiscount: this.transactionDocument.basket.transactionDiscount,\r\n // transactionPromotion: this.transactionDocument.basket.transactionPromotion,\r\n // transactionId: this.transactionDocument.transactionId,\r\n // total: this.transactionDocument.basketSummary.basketTotal,\r\n // basketTotal: this.transactionDocument.basketSummary.basketTotal,\r\n // discountTotal: this.transactionDocument.basketSummary.discountTotal,\r\n // saleTotal: this.transactionDocument.basketSummary.saleTotal,\r\n // quantity: this.transactionDocument.basketSummary.totalItems,\r\n // products: [],\r\n // baseCurrency: this.transactionDocument.baseCurrency,\r\n // customer: this.transactionDocument.customer,\r\n // };\r\n\r\n // basket.products = [] as Product[];\r\n // this.transactionDocument.basket.products.forEach((product: { SKU: any; barCode: any; barcodes: any; description: any; imageUrls: any; totalLinePrice: any; itemLineId: any; excludePromotion: any; price: number; quantity: any; selectedRRPPrice: any; fullfilmentId: any; fullfilmentLocationName: any; deliveryGroup: string; leadTime: any; deliveryMethod: any; giftCard: any; giftCardExpiryDate: any; giftCardNumberIssued: any; giftCardRecipientEmail: any; giftCardRecipientName: any; itemDiscounts: any; refundedPromotionalQuantity: any; refundedQuantity: number; refunded: any; isLastExchanged: any; exchange: any; refundedTotal: number; }, index: any) => {\r\n // const p = {} as Product;\r\n // p.SKU = product.SKU;\r\n // p.barcode = product.barCode;\r\n // p.barcodes = product.barcodes;\r\n\r\n // p.description = product.description;\r\n // p.imageUrls = product.imageUrls;\r\n // p.currency = this.transactionDocument.baseCurrency;\r\n // p.totalLinePrice = product.totalLinePrice;\r\n // p.itemLineId = Number(product.itemLineId);\r\n // p.excludePromotion = product.excludePromotion;\r\n\r\n // p.selectedPrice = product.price;\r\n // p.quantity = product.quantity;\r\n // p.total = product.totalLinePrice;\r\n // p.selectedRRPPrice = product.selectedRRPPrice;\r\n\r\n // p.fullfilmentId = product.fullfilmentId;\r\n // p.fullfilmentLocationName = product.fullfilmentLocationName;\r\n // p.deliveryGroup = product.deliveryGroup || \"1\";\r\n // p.leadTime = product.leadTime;\r\n // p.deliveryMethod = product.deliveryMethod || DELIVERY_METHODS.COLLECT_FROM_STORE.toString();\r\n\r\n // p.giftCard = product.giftCard;\r\n // p.giftCardExpiryDate = product.giftCardExpiryDate;\r\n // p.giftCardNumberIssued = product.giftCardNumberIssued;\r\n // p.giftCardRecipientEmail = product.giftCardRecipientEmail;\r\n // p.giftCardRecipientName = product.giftCardRecipientName;\r\n \r\n \r\n // if(p.fullfilmentId != this.transactionDocument.storeId)\r\n // {\r\n // p.isWebOrder = true;\r\n // }\r\n \r\n // if (product.itemDiscounts) {\r\n // p.itemDiscounts = product.itemDiscounts as ItemDiscount;\r\n // }\r\n\r\n // // if(!p.itemDiscounts){\r\n // // console.log(p.itemDiscounts);\r\n\r\n // // this.basketService.transactionDiscountAndPromotionProductortionCalculation(basket);\r\n // // }\r\n // p.refundPromotionalQuantity = product.refundedPromotionalQuantity ? product.refundedPromotionalQuantity : 0;\r\n\r\n // if (product.refundedQuantity) {\r\n // p.quantity = p.quantity - product.refundedQuantity;\r\n // p.totalLinePrice = (p.quantity * product.price);\r\n // p.total = p.totalLinePrice;\r\n // // p.refundPromotionalQuantity = product.refundedPromotionalQuantity;\r\n // p.refunded = product.refunded;\r\n // p.isLastExchanged = product.isLastExchanged;\r\n // }\r\n // if (product.exchange) {\r\n // p.exchange = product.exchange;\r\n // }\r\n\r\n // if (\r\n // this.transactionDocument.basket.lineDiscount &&\r\n // this.transactionDocument.basket.lineDiscount.length > 0\r\n // ) {\r\n\r\n // this.transactionDocument.basket.lineDiscount.forEach((lineDiscount: { itemLineId: { toString: () => any; }; discountedLinePrice: any; }) => {\r\n\r\n // if (product.itemLineId === lineDiscount.itemLineId.toString() && product.refundedQuantity > 0) {\r\n // p.lineDiscount = Object.assign({}, lineDiscount);\r\n // p.lineDiscount.discountedLinePrice = p.lineDiscount.unitPrice * p.quantity\r\n // p.lineDiscount.discountAmount = p.total - p.lineDiscount.discountedLinePrice\r\n // p.total = p.lineDiscount.discountedLinePrice;\r\n // } else if (product.itemLineId === lineDiscount.itemLineId.toString()) {\r\n // p.lineDiscount = lineDiscount;\r\n // p.total = lineDiscount.discountedLinePrice\r\n // }\r\n // });\r\n // }\r\n\r\n // if (\r\n // this.transactionDocument.basket.linePromotion &&\r\n // this.transactionDocument.basket.linePromotion.length > 0\r\n // ) {\r\n // this.transactionDocument.basket.linePromotion.forEach((linePromotion: { itemLineId: { toString: () => any; }; refunded: any; }) => {\r\n // if (product.itemLineId === linePromotion.itemLineId.toString() && !linePromotion.refunded) {\r\n // p.linePromotions = linePromotion;\r\n // p.total = p.linePromotions.promotionLinePrice;\r\n // p.total = p.total - (product.refundedTotal ? Math.abs(product.refundedTotal) : 0);\r\n // }\r\n // });\r\n // }\r\n\r\n // p.refundedQuantity = 0;\r\n // p.refundedTotal = 0;\r\n\r\n // if (\r\n // this.transactionDocument.basket.taxBreakdown &&\r\n // this.transactionDocument.basket.taxBreakdown.taxLines.length > 0\r\n // ) {\r\n // this.transactionDocument.basket.taxBreakdown.taxLines.forEach((taxLine: { itemLineId: { toString: () => any; }; VAT: any; VATCode: any; }) => {\r\n // if (product.itemLineId === taxLine.itemLineId.toString()) {\r\n // p.selectedVAT = taxLine.VAT;\r\n // p.selectedVATCode = taxLine.VATCode;\r\n // }\r\n // });\r\n // }\r\n\r\n // if (p.quantity > 0) {\r\n // basket.products.push(p);\r\n // }\r\n // });\r\n // // product.itemDiscounts\r\n // if (!basket.products[0].hasOwnProperty('itemDiscounts')) {\r\n // basket = this.getTransactionDiscountAndTransactionPromotionPortion(basket);\r\n\r\n // }\r\n\r\n // console.log(\"ebasket : TransactionDocumentBuilder :new created refunded basket\", JSON.stringify(basket))\r\n // basket.quantity = basket.products.reduce(\r\n // (n: any, { quantity }: any) => n + quantity,\r\n // 0\r\n // );\r\n // basket.total = this.getTotalWithLineDiscountAndLinePromotionApplied(basket);\r\n // basket.basketTotal = basket.total;\r\n // basket.basketTotal = basket.basketTotal - this.getTotalDiscountWithTransactionDiscountsAndPromotions(basket);\r\n // console.log(\r\n // \"ebasket : TransactionDocumentBuilder : update Basket Total: after promotion :basketTotal\",\r\n // basket.basketTotal\r\n // );\r\n\r\n // console.log(\r\n // \"e:basket :TransactionDocumentBuilder : basketDetails updated values\",\r\n // JSON.stringify(basket)\r\n // );\r\n // return basket;\r\n // }\r\n\r\n\r\n getTransactionDiscountAndTransactionPromotionPortion(basket:any) {\r\n if (\r\n basket.transactionDiscount &&\r\n basket.transactionDiscount.length > 0\r\n ) {\r\n basket.transactionDiscount.forEach((discount: { itemLineIds: any; }) => {\r\n if (!discount.itemLineIds) {\r\n discount.itemLineIds = basket.products.map((product: { itemLineId: any; }) => {\r\n return product.itemLineId\r\n });\r\n }\r\n basket = this.basketService.transactionDiscountProductPortionCalc(basket, discount);\r\n });\r\n }\r\n if (\r\n basket.transactionPromotion &&\r\n basket.transactionPromotion.length > 0\r\n ) {\r\n basket.transactionPromotion.forEach((tPromotion: { itemLineIds: any; }) => {\r\n if (!tPromotion.itemLineIds) {\r\n const filteredData = basket.products.filter(\r\n (item: { excludePromotion: boolean; }) => {\r\n return item.excludePromotion === false;\r\n });\r\n\r\n tPromotion.itemLineIds =\r\n filteredData.map((product: { itemLineId: any; }) => {\r\n return product.itemLineId\r\n });\r\n }\r\n basket = this.basketService.transactionPromotionProductPortionCalc(basket, tPromotion);\r\n });\r\n }\r\n\r\n return basket;\r\n }\r\n\r\n\r\n getTotalDiscountWithTransactionDiscountsAndPromotions(basketDetails: any) {\r\n\r\n let discountTotal = 0;\r\n if (\r\n basketDetails.transactionPromotion &&\r\n basketDetails.transactionPromotion.length > 0\r\n ) {\r\n discountTotal += basketDetails.transactionPromotion.reduce(\r\n (n: any, { promotionAmount }: any) => n + promotionAmount,\r\n 0\r\n );\r\n }\r\n if (\r\n basketDetails.transactionDiscount &&\r\n basketDetails.transactionDiscount.length > 0\r\n ) {\r\n\r\n discountTotal += basketDetails.transactionDiscount.reduce(\r\n (n: any, { discountAmount }: any) => n + discountAmount,\r\n 0\r\n );\r\n\r\n\r\n }\r\n console.log(\"ebasket : TransactionDocumentBuilder : Transaction discount Total:\", discountTotal);\r\n\r\n return discountTotal;\r\n }\r\n\r\n\r\n appendCurrencySymbol(currency: number, value: number) {\r\n // value=this.decimalpipe.transform(value,'1.2');\r\n if (value >= 0) {\r\n const returnval = currency + value;\r\n console.log(returnval, \"ebasket: add currency with value\");\r\n return returnval;\r\n } else {\r\n const returnval = \"-\" + (currency + value * -1);\r\n console.log(returnval, \"-(currency+(value*-1))\");\r\n return returnval;\r\n }\r\n }\r\n\r\n // /**\r\n // * Updates total refund\r\n // * @returns total refund\r\n // */\r\n // updateTotalRefund(): TransactionDocumentBuilder {\r\n // this.transactionDocument.basket.products.forEach((product) => {\r\n // product.refundedQuantity = product.quantity;\r\n // product.refundedTotal = product.totalLinePrice * -1;\r\n // console.log(\r\n // \"ebasket: Transaction price override :\",\r\n // this.transactionDocument.basket.lineDiscount\r\n // );\r\n\r\n // if (\r\n // this.transactionDocument.basket.linePromotion &&\r\n // this.transactionDocument.basket.linePromotion.length > 0\r\n // ) {\r\n // this.transactionDocument.basket.linePromotion.forEach((linePromotion) => {\r\n // console.log(\r\n // \"Promotion: basket linePromotion : \",\r\n // this.transactionDocument.basket.linePromotion\r\n // );\r\n // console.log(\r\n // \"linePromotion.itemLineId.toString() : \",\r\n // linePromotion.itemLineId.toString()\r\n // );\r\n // console.log(\r\n // \"condition : \" +\r\n // (product.itemLineId === linePromotion.itemLineId.toString())\r\n // );\r\n\r\n // if (product.itemLineId === linePromotion.itemLineId.toString()) {\r\n // product.refundedTotal =\r\n // linePromotion.promotionLinePrice * -1;\r\n // }\r\n // });\r\n // } else\r\n // if (\r\n // this.transactionDocument.basket.lineDiscount &&\r\n // this.transactionDocument.basket.lineDiscount.length > 0\r\n // ) {\r\n // this.transactionDocument.basket.lineDiscount.forEach((lineDiscount) => {\r\n // console.log(\r\n // \"product.itemLineId : \" +\r\n // this.transactionDocument.basket.lineDiscount\r\n // );\r\n // console.log(\r\n // \"lineDiscount.itemLineId.toString() : \" +\r\n // lineDiscount.itemLineId.toString()\r\n // );\r\n // console.log(\r\n // \"condition : \" +\r\n // (product.itemLineId === lineDiscount.itemLineId.toString())\r\n // );\r\n\r\n // if (product.itemLineId === lineDiscount.itemLineId.toString()) {\r\n // product.refundedTotal = lineDiscount.unitPrice * product.refundedQuantity * -1;\r\n // }\r\n // });\r\n // }\r\n\r\n // console.log(\"Product description :\" + product.description);\r\n // console.log(\"Product total :\" + product.refundedTotal);\r\n // // product.displayrefundedamount=this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency],product.refundedTotal);\r\n // // console.log(product.displayrefundedamount,\"displayrefundedamount\");\r\n // product.refunded = true;\r\n // });\r\n // const baskettotal = (this.transactionDocument.basketSummary.basketTotal *= -1);\r\n // // this.transactionDocument.basketSummary.displaybaskettotal=this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency], baskettotal);\r\n // const saletotal = (this.transactionDocument.basketSummary.saleTotal *= -1);\r\n // // this.transactionDocument.basketSummary.displaysaletotal = this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency], saletotal);\r\n // (this.transactionDocument.basketSummary.VATTotal *= -1);\r\n // return this;\r\n // }\r\n\r\n /**\r\n * Sale Total\r\n * @param basketDetails\r\n * @returns Sale Total\r\n */\r\n updateSaleTotal(basketDetails: { products: any[]; }) {\r\n const saleTotal = basketDetails.products.reduce(\r\n (n: any, { totalLinePrice }: any) => n + totalLinePrice,\r\n 0\r\n );\r\n return saleTotal\r\n }\r\n\r\n getTotalWithLineDiscountAndLinePromotionApplied(basketDetails: { products: any; }): number {\r\n let saletotal: number = 0.0;\r\n for (let product of basketDetails.products) {\r\n // if (product.linePromotions) {\r\n // saletotal += product.linePromotions.promotionLinePrice;\r\n // } else if (\r\n // product.lineDiscount &&\r\n // !product.linePromotions\r\n // ) {\r\n // saletotal +=\r\n // product.quantity * Number(product.lineDiscount.unitPrice.toFixed(2));\r\n // } else {\r\n // saletotal +=\r\n // product.quantity * Number(product.selectedPrice.toFixed(2));\r\n // }\r\n saletotal += product.total;\r\n console.log(\r\n \"e-basket:update product Total:\" + saletotal,\r\n JSON.stringify(product)\r\n );\r\n }\r\n return saletotal;\r\n }\r\n\r\n getRefundedTotalWithQuantity(basketDetails: { products: string | any[]; }): number {\r\n let quantity = 0;\r\n for (let index = 0; index < basketDetails.products.length; index++) {\r\n const product: any = basketDetails.products[index];\r\n\r\n if (!product.refundedReasonDescription) {\r\n\r\n quantity = quantity + product.quantity;\r\n\r\n } else {\r\n quantity = quantity + (product.quantity - product.refundedQuantity);\r\n\r\n // basketDetails.total = basketDetails.total + product.refundedTotal;\r\n\r\n }\r\n }\r\n return quantity;\r\n\r\n }\r\n\r\n /**\r\n * Discount Total\r\n * @returns Discount Total\r\n */\r\n updateDiscountTotal() {\r\n let refundTotal = this.transactionDocument.basketSummary.refundTotal ? this.transactionDocument.basketSummary.refundTotal : 0;\r\n console.info(\"e-basket: transaction builder: refundTotal\", JSON.stringify(refundTotal),\r\n JSON.stringify(this.transactionDocument.basketSummary));\r\n const discountTotal =\r\n Math.abs(\r\n Math.abs(this.transactionDocument.basketSummary.saleTotal) -\r\n (\r\n Math.abs(this.transactionDocument.basketSummary.basketTotal) + Math.abs(refundTotal)\r\n )\r\n );\r\n console.log(\"e-basket: transaction builder: discountTotal\", JSON.stringify(discountTotal))\r\n return Number(discountTotal.toFixed(2));\r\n }\r\n\r\n updateReasonCode(reasonCode: {\r\n code: string;\r\n name: string;\r\n }): TransactionDocumentBuilder {\r\n this.transactionDocument.reasonCode = reasonCode.code;\r\n this.transactionDocument.reasonDescription = reasonCode.name;\r\n return this;\r\n }\r\n\r\n updateManagerOverride(\r\n useroverride: UserOverride\r\n ): TransactionDocumentBuilder {\r\n this.transactionDocument.override = useroverride;\r\n return this;\r\n }\r\n\r\n updateUserID(\r\n userID: string\r\n ): TransactionDocumentBuilder {\r\n this.transactionDocument.userId = userID;\r\n return this;\r\n }\r\n\r\n updateUserName(name: any) : TransactionDocumentBuilder {\r\n this.transactionDocument.userName = name;\r\n return this;\r\n\r\n }\r\n \r\n addCustomerDetails(customerDetail: Customer): TransactionDocumentBuilder {\r\n this.transactionDocument.customer = customerDetail;\r\n return this;\r\n }\r\n\r\n updateTaxBreakdown(basketDetails: Basket): TransactionDocumentBuilder {\r\n // let transactionDiscountTotal = 0;\r\n let taxBreakdown: TaxBreakdown = {\r\n taxLines: [],\r\n totalTaxableAmount: 0,\r\n };\r\n\r\n\r\n\r\n // if (this.transactionDocument.basket.transactionDiscount && this.transactionDocument.basket.transactionDiscount.length > 0) {\r\n // this.transactionDocument.basket.transactionDiscount.forEach((discount) => {\r\n // transactionDiscountTotal += discount.discountAmount;\r\n // });\r\n // }\r\n\r\n // if (this.transactionDocument.basket.transactionPromotion && this.transactionDocument.basket.transactionPromotion.length > 0) {\r\n // this.transactionDocument.basket.transactionPromotion.forEach(\r\n // (promotion) => {\r\n // transactionDiscountTotal += promotion.promotionAmount;\r\n // }\r\n // );\r\n // }\r\n\r\n basketDetails.products.forEach((product: any) => {\r\n let taxLine: TaxLine = {\r\n itemLineId: product.itemLineId,\r\n VAT: product.selectedVAT ? product.selectedVAT : 0,\r\n VATCode: product.selectedVATCode,\r\n taxLineTotal: 0,\r\n taxableAmount: product.total,\r\n PreTax: 0\r\n };\r\n console.info(\"Product contribution : item line ID :\", product.itemLineId,\r\n \"tax line :\", JSON.stringify(taxLine));\r\n\r\n // step 1\r\n // if Transaction Discount and/or promotion applied, find net selling price of each product as taxableamount\r\n // if (transactionDiscountTotal > 0) {\r\n product = this.basketService.validateProductItemDiscount(product);\r\n\r\n const productContributionInTotal =\r\n product.itemDiscounts.trnDiscountsPortion +\r\n product.itemDiscounts.trnPromotionsPortion -\r\n product.itemDiscounts.refundPortion;\r\n // tp+td-rp;\r\n\r\n console.info(\"Product contribution : item line ID :\", product.itemLineId,\r\n \"contribution :\", JSON.stringify(productContributionInTotal));\r\n // calculate net selling price after applying transaction discount as per product contribution\r\n taxLine.taxableAmount -= productContributionInTotal;\r\n // }\r\n\r\n //step 2 - find pre tax\r\n taxLine.PreTax = this.numberUtilService.trimTo2Decimal2((taxLine.taxableAmount * 100) / (100 + taxLine.VAT));\r\n\r\n //step 3 - Update taxbreakdown\r\n taxBreakdown.totalTaxableAmount += taxLine.taxableAmount;\r\n taxLine.taxableAmount = this.numberUtilService.trimTo2Decimal2(taxLine.taxableAmount);\r\n \r\n // step 4 - update tax Line total\r\n taxLine.taxLineTotal = this.numberUtilService.trimTo2Decimal2(taxLine.taxableAmount - taxLine.PreTax);\r\n taxBreakdown.taxLines.push(taxLine);\r\n });\r\n\r\n taxBreakdown.totalTaxableAmount = this.numberUtilService.trimTo2Decimal2(taxBreakdown.totalTaxableAmount);\r\n this.transactionDocument.basket.taxBreakdown = taxBreakdown;\r\n return this;\r\n }\r\n\r\n updateTotalTaxSummary(): TransactionDocumentBuilder {\r\n\r\n console.log(\"Total Tax Summery Request :\", JSON.stringify(this.transactionDocument.basket.taxBreakdown));\r\n\r\n\r\n let totalTaxSummaryArray: TotalTaxSummary[] = []\r\n let totalTaxSummaryGroup = []\r\n\r\n console.log(\"Tax Lines for Total Tax Summery :\", JSON.stringify(this.transactionDocument.basket.taxBreakdown.taxLines));\r\n\r\n\r\n this.transactionDocument.basket.taxBreakdown.taxLines.forEach((element: { VATCode: any; VAT: any; PreTax: any; taxLineTotal: any; }) => {\r\n let TaxSummary: TotalTaxSummary = {\r\n VATCode: \"\",\r\n VAT: -12345,\r\n PreTaxSum: 0,\r\n TaxSum: 0,\r\n TXrateSum: 0\r\n \r\n };\r\n TaxSummary.VATCode = element.VATCode;\r\n TaxSummary.VAT = element.VAT; \r\n TaxSummary.PreTaxSum = this.numberUtilService.trimTo2Decimal2(element.PreTax);\r\n TaxSummary.TaxSum = this.numberUtilService.trimTo2Decimal2(element.taxLineTotal);\r\n TaxSummary.TXrateSum = this.numberUtilService.trimTo2Decimal2(TaxSummary.PreTaxSum + TaxSummary.TaxSum); \r\n totalTaxSummaryArray.push(TaxSummary);\r\n })\r\n\r\n console.log(\"Total Tax Summery Without Grouped : \", JSON.stringify(totalTaxSummaryArray));\r\n \r\n totalTaxSummaryGroup = totalTaxSummaryArray.reduce((preparedArray:any,currentObj) => {\r\n\r\n let ind = preparedArray.findIndex((x: { VAT: any; }) => x.VAT === currentObj.VAT);\r\n if(ind === -1){\r\n preparedArray.push(currentObj)\r\n }else {\r\n preparedArray[ind].VATCode = currentObj.VATCode;\r\n preparedArray[ind].VAT = currentObj.VAT;\r\n preparedArray[ind].PreTaxSum += currentObj.PreTaxSum;\r\n preparedArray[ind].TaxSum += currentObj.TaxSum;\r\n preparedArray[ind].TXrateSum += currentObj.TXrateSum;\r\n }\r\n return preparedArray;\r\n },[])\r\n \r\n console.log(\"Total Tax Summer Group :\",totalTaxSummaryGroup);\r\n\r\n\r\n this.transactionDocument.basket.totalTaxSummary = totalTaxSummaryGroup;\r\n\r\n return this;\r\n\r\n }\r\n\r\n\r\n /**\r\n * TransactionId\r\n * @returns OriginalTransactionId\r\n */\r\n addOriginalTransId(tranDoc:TransactionDocument): TransactionDocumentBuilder {\r\n if (this.transactionDocument.type === TRANSACTION_TYPE.REFUND || this.transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND || this.transactionDocument.type === TRANSACTION_TYPE.SALE_EXCHANGE) {\r\n this.transactionDocument.originalTransId = tranDoc.transactionId;\r\n if(tranDoc.apiResponse && tranDoc.apiResponse.internalId)\r\n {\r\n this.transactionDocument.originalExternalId = tranDoc.apiResponse.internalId.toString();\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * unreferenced Refund\r\n * @returns boolean value\r\n */\r\n addUnreferencedRefund(): TransactionDocumentBuilder {\r\n this.transactionDocument.unreferencedRefund = true;\r\n return this;\r\n }\r\n\r\n getRefundTotal() {\r\n let totalRefund = 0;\r\n for (let index = 0; index < this.transactionDocument.basket.products.length; index++) {\r\n const product: TProduct = this.transactionDocument.basket.products[index];\r\n if (product.refundedTotal) {\r\n totalRefund = totalRefund + product.refundedTotal;\r\n }\r\n console.log(\"ebasket : transaction Service: totalRefund\" + totalRefund)\r\n }\r\n return totalRefund;\r\n }\r\n\r\n docId(docId: any): TransactionDocumentBuilder {\r\n this.transactionDocument.id = docId;\r\n return this;\r\n }\r\n}\r\n","import { DISCOUNTTYPE, LineDiscount, TProduct, TransactionDiscount, TransactionDocument, TRANSACTION_TYPE } from \"./mapper-library.model\"\r\nimport { TransactionDocumentBuilder } from \"./TransactionDocumentBuilder\";\r\nexport class RJMapperBuilderClass {\r\n\r\n private transactionDocument: TransactionDocument;\r\n private deviceId: any;\r\n private transactionNumber: any;\r\n private manifestVersion: any;\r\n private databaseSchemaVersion: any;\r\n private basketType: any;\r\n private xmlSchemaVersion: any;\r\n private majorVersion: any;\r\n private minorVersion: any;\r\n private externalState: any;\r\n private cashierId: any;\r\n private companyId: any;\r\n private terminalNumber: any;\r\n private taxMethodId: any;\r\n private tradingRegionId: any;\r\n private basketCurrencyId: any;\r\n private basketCountryId: any;\r\n private basketLanguageId: any;\r\n private itemCount = 0;\r\n private largestNumber = 0;\r\n private branchId: any;\r\n private createdAt: any;\r\n private updatedAt :any;\r\n private salesPersonName: any;\r\n private rjObject: any = {}\r\n\r\n constructor(transactionDoc?: TransactionDocument) {\r\n if (transactionDoc) {\r\n this.transactionDocument = transactionDoc;\r\n } else {\r\n this.transactionDocument = {\r\n transactionId: \"\",\r\n offlineTransactionId: \"\",\r\n transactionRef: \"\",\r\n dateTime: \"\",\r\n orgCode: \"\",\r\n storeId: \"\",\r\n storeNodeId: \"\",\r\n storeNodeStructure: \"\",\r\n deviceId: \"\",\r\n terminalId: \"\",\r\n userId: \"\",\r\n initiatingModule: \"eBasket\",\r\n export: false,\r\n basket: {} as any,\r\n basketSummary: {} as any,\r\n baseCurrency: \"\",\r\n type: \"\",\r\n operationStatus: \"\",\r\n createdAt: \"\",\r\n updatedAt: \"\",\r\n id: \"\",\r\n currentTransactionDetails: {} as any,\r\n saleTotal: 0,\r\n };\r\n }\r\n this.initilizeItemCount();\r\n this.setLineNumberForProducts();\r\n this.createdAt = this.getDate(this.transactionDocument.createdAt);\r\n this.updatedAt = this.getDate(this.transactionDocument.updatedAt);\r\n }\r\n\r\n getPosbasketInfo() {\r\n this.rjObject['Keyword'] = this.generateKeyword();\r\n this.rjObject['ID'] = this.generateId(this.createdAt);\r\n this.rjObject['XMLSchemaVersion'] = '2';\r\n this.rjObject['LastUpdated'] = this.updatedAt;\r\n this.rjObject['MajorVersion'] = this.majorVersion;\r\n this.rjObject['MinorVersion'] = this.minorVersion;\r\n this.rjObject['ManifestVersion'] = this.manifestVersion;\r\n this.rjObject['DatabaseSchemaVersion'] = this.databaseSchemaVersion;\r\n this.rjObject['BasketType'] = this.basketType;\r\n this.rjObject['State'] = this.getState();\r\n this.rjObject['ExternalState'] = this.externalState;\r\n\r\n return this;\r\n }\r\n\r\n\r\n getheaderInfo() {\r\n this.rjObject['Header'] = {};\r\n this.rjObject['Header'].TimeZoneOffset = this.convertToString(this.generateTimezoneoffset(this.transactionDocument.createdAt));\r\n this.rjObject['Header'].DateTimeCreated = this.createdAt;\r\n this.rjObject['Header'].OriginatedBy = {};\r\n this.rjObject['Header'].OriginatedBy.DeviceID = this.deviceId;\r\n this.rjObject['Header'].OriginatedBy.CashierID = this.cashierId;\r\n this.rjObject['Header'].OriginatedBy.CompanyID = this.companyId;\r\n this.rjObject['Header'].OriginatedBy.StoreID = this.transactionDocument.storeId;\r\n this.rjObject['Header'].OriginatedBy.BranchID = this.branchId;\r\n this.rjObject['Header'].OriginatedBy.TerminalNumber = this.terminalNumber;\r\n this.rjObject['Header'].OriginatedBy.TransactionNumber = this.transactionNumber;\r\n this.rjObject['Header'].TaxMethodID = this.taxMethodId;\r\n this.rjObject['Header'].DynamicStockLookup = this.generateDynamicStockLookUp();\r\n this.rjObject['Header'].BasketLanguageID = this.basketLanguageId; //todo\r\n this.rjObject['Header'].BasketCountryID = this.basketCountryId; //todo\r\n this.rjObject['Header'].BasketCurrencyID = this.transactionDocument.baseCurrency;\r\n this.rjObject['Header'].TradingRegionID = this.tradingRegionId;\r\n this.rjObject['Header'].Eurozone = \" \";//unknown\r\n this.rjObject['Header'].EuroBaseExchangeRate = \"\"; //unknown\r\n this.rjObject['Header'].PrintableName = this.transactionDocument.userName; //unknown\r\n\r\n return this;\r\n }\r\n\r\n rjMapper() {\r\n var transactionDiscount:any = [] ;\r\n if (this.transactionDocument.basket.transactionDiscount && this.transactionDocument.basket.transactionDiscount.length > 0) {\r\n transactionDiscount = this.transactionDocument.basket.transactionDiscount\r\n }\r\n if (this.transactionDocument.type === TRANSACTION_TYPE.SALE) {\r\n this.rjObject['ProductSale'] = [];\r\n this.rjObject['ModifierItem'] = [];\r\n\r\n this.transactionDocument.basket.products.forEach((element: any) => {\r\n let lineDiscount = [];\r\n if (this.transactionDocument.basket.lineDiscount && this.transactionDocument.basket.lineDiscount.length > 0) {\r\n lineDiscount = this.transactionDocument.basket.lineDiscount.filter((x: any) => x.itemLineId === element.itemLineId);\r\n if (lineDiscount.length > 0) {\r\n const index = this.transactionDocument.basket.lineDiscount.indexOf(lineDiscount[0]);\r\n if (index > -1) {\r\n this.transactionDocument.basket.lineDiscount.splice(index, 1);\r\n }\r\n }\r\n }\r\n let data = this.addProduct(element, (lineDiscount.length > 0 ? lineDiscount[0] : null),(transactionDiscount.length > 0 ? transactionDiscount : null));\r\n this.rjObject['ProductSale'].push(data);\r\n this.getModifierItem(lineDiscount.length > 0 ? lineDiscount[0] : null, element.itemLineId);\r\n });\r\n let transactionPromotion = [];\r\n if (this.transactionDocument.basket.transactionPromotion && this.transactionDocument.basket.transactionPromotion.length > 0) {\r\n transactionPromotion = this.transactionDocument.basket.transactionPromotion;\r\n this.getTransactionPromotion(transactionPromotion);\r\n }\r\n } else if (this.transactionDocument.type === TRANSACTION_TYPE.REFUND) {\r\n this.rjObject['ProductReturn'] = [];\r\n this.rjObject['ModifierItem'] = []; \r\n this.transactionDocument.basket.products.forEach((element: any) => {\r\n let data = this.returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null),(transactionDiscount.length > 0 ? transactionDiscount : null));\r\n this.rjObject['ProductReturn'].push(data);\r\n this.getModifierItem(element.lineDiscount, element.itemLineId);\r\n });\r\n } else if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND) {\r\n this.rjObject['ProductReturn'] = [];\r\n this.rjObject['ModifierItem'] = [];\r\n \r\n let transactionDoc: any = new TransactionDocumentBuilder().basket(this.transactionDocument.currentTransactionDetails).build();\r\n transactionDoc.basket.products.forEach((element: any) => {\r\n let data = this.returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null),(transactionDiscount.length > 0 ? transactionDiscount : null));\r\n let obj = {\r\n \"OriginalReceiptSupplied\": 0,\r\n \"OriginalBranchID\": 0,\r\n \"OriginalTerminalNumber\": 0,\r\n \"OriginalTransactionNumber\": 0,\r\n \"OriginalCashierNumber\": 0\r\n };\r\n data['Return'] = {...data['Return'], ...obj};\r\n this.rjObject['ProductReturn'].push(data);\r\n this.getModifierItem(element.lineDiscount, element.itemLineId);\r\n })\r\n } else if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_EXCHANGE) {\r\n this.rjObject['ProductReturn'] = [];\r\n this.rjObject['ProductSale'] = [];\r\n this.rjObject['ModifierItem'] = [];\r\n \r\n let transactionDoc: any = new TransactionDocumentBuilder().basket(this.transactionDocument.currentTransactionDetails).build();\r\n transactionDoc.basket.products.forEach((element: any) => {\r\n if (element.refundedQuantity > 0) {\r\n let returnProduct = this.returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null),(transactionDiscount.length > 0 ? transactionDiscount : null));\r\n let obj = {\r\n \"OriginalReceiptSupplied\": 0,\r\n \"OriginalBranchID\": 0,\r\n \"OriginalTerminalNumber\": 0,\r\n \"OriginalTransactionNumber\": 0,\r\n \"OriginalCashierNumber\": 0\r\n };\r\n returnProduct['Return'] = {...returnProduct['Return'], ...obj};\r\n this.rjObject['ProductReturn'].push(returnProduct);\r\n } else {\r\n let addProduct = this.addProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null) ,(transactionDiscount.length > 0 ? transactionDiscount : null));\r\n this.rjObject['ProductSale'].push(addProduct);\r\n }\r\n this.getModifierItem(element.lineDiscount, element.itemLineId);\r\n })\r\n\r\n }\r\n return this;\r\n }\r\n\r\n getBasketDiscount() {\r\n if (!this.transactionDocument.basket.transactionDiscount) return this;\r\n this.rjObject['BasketDiscount'] = [];\r\n this.transactionDocument.basket.transactionDiscount.forEach((element: any) => {\r\n let obj: any = {}\r\n obj['XMLSchemaVersion'] = this.xmlSchemaVersion;\r\n obj['DeviceID']=this.deviceId;\r\n obj['DateTimeCreated']=this.updatedAt;\r\n obj['NetValue'] = this.convertToString(element.discountAmount * -1);\r\n obj['EffectiveNetValue'] =this.convertToString( element.discountAmount * -1);\r\n obj['Description'] = element.reasonDisplayText;\r\n obj['UserID'] = this.transactionDocument.userName;\r\n obj['ReasonCodeID'] = element.reasonCode;\r\n obj['DiscountType'] = this.convertToString(element.discountType.toUpperCase() == DISCOUNTTYPE.PERCENT.toUpperCase() ? 0 : 1); \r\n obj['RoundingRule'] = this.convertToString(2);\r\n obj['ModifiedLineNumber'] = element.itemLineIds; \r\n obj['LineNumber'] = this.convertToString(this.generateLineNumber()); \r\n obj['DiscountedValue'] = this.transactionDocument.basketSummary.basketTotal + this.transactionDocument.basketSummary.discountTotal;\r\n if(element.discountType.toUpperCase() == DISCOUNTTYPE.PERCENT.toUpperCase()){\r\n obj['DiscountPercentage'] = this.convertToString((element.discountAmount / this.transactionDocument.basketSummary.basketTotal).toFixed(1))\r\n }\r\n if(this.transactionDocument.type === 'REFUND'){\r\n obj['NetValue'] = this.convertToString(element.discountAmount < 0 ? -element.discountAmount : element.discountAmount);\r\n obj['EffectiveNetValue'] =this.convertToString( element.discountAmount < 0 ? -element.discountAmount : element.discountAmount);\r\n }\r\n\r\n this.rjObject['BasketDiscount'].push(obj);\r\n });\r\n return this;\r\n }\r\n\r\n getModifierItem(data: any, lineNo: any) {\r\n if (data && lineNo) {\r\n let obj: any = {};\r\n obj.XMLSchemaVersion = 1;\r\n obj.LineNumber = this.generateLineNumber();\r\n obj.NetValue = 0;\r\n obj.EffectiveNetValue = 0;\r\n obj.Description = data.percentageDiscountReasonName ? data.percentageDiscountReasonName : data.priceOverrideReasonName;\r\n obj.DeviceID = this.deviceId;\r\n obj.UserID = this.transactionDocument.userName;\r\n obj.DateTimeCreated = this.updatedAt;\r\n obj.AuthorisingUserID = this.transactionDocument.userName;\r\n obj.ReasonCodeID = data.percentageDiscountReasonCode ? data.percentageDiscountReasonCode : data.priceOverrideReasonCode;\r\n obj.ModifiedLineNumber = lineNo;\r\n obj.ModifiedIndex = 1;\r\n\r\n this.rjObject['ModifierItem'].push(obj);\r\n }\r\n }\r\n\r\n getTrailerInfo() {\r\n this.rjObject['Trailer'] = {};\r\n this.rjObject.Trailer.DateTimeCompleted = this.updatedAt;\r\n this.rjObject.Trailer.CompletedBy = {};\r\n this.rjObject.Trailer.CompletedBy.DeviceID = this.deviceId;\r\n this.rjObject.Trailer.CompletedBy.CashierID = this.cashierId;\r\n this.rjObject.Trailer.CompletedBy.StoreID = this.transactionDocument.storeId;\r\n this.rjObject.Trailer.CompletedBy.BranchID = this.branchId;\r\n this.rjObject.Trailer.CompletedBy.TerminalNumber = this.terminalNumber;\r\n this.rjObject.Trailer.CompletedBy.TransactionNumber = this.transactionNumber;\r\n this.rjObject.Trailer.Total = this.convertToString(this.transactionDocument.basketSummary.basketTotal * 100);\r\n this.rjObject.Trailer.ItemCount = this.itemCount; //gives total count for product\r\n this.rjObject.Trailer.ItemQuantity = this.convertToString(this.transactionDocument.basketSummary.totalItems);\r\n this.rjObject.Trailer.NetItemQuantity = this.convertToString(this.transactionDocument.basketSummary.totalItems);\r\n this.rjObject.Trailer.TaxTotal = this.convertToString(this.removeDecimal(this.transactionDocument.basketSummary.VATTotal));\r\n this.rjObject.Trailer.SequenceDeviceID = this.deviceId;\r\n this.rjObject.Trailer.SequenceNumber = 'snsn' //static for now\r\n\r\n this.rjObject['Trailer']['TaxItem'] = [];\r\n this.transactionDocument.basket.taxBreakdown.taxLines.forEach((element: any) => {\r\n let obj: any = {};\r\n\r\n obj['XMLSchemaVersion'] = this.xmlSchemaVersion;\r\n obj['TaxRate'] = this.convertToString(element.VATCode);\r\n obj['TaxableTotal'] = this.convertToString(this.removeDecimal(element.taxableAmount));\r\n obj['TaxTotal'] = this.convertToString(this.removeDecimal(this.removeDecimal(element.taxLineTotal)));\r\n obj['TaxDescription'] = this.convertToString(element.VATCode);\r\n obj['TaxIncluded'] = '1';\r\n obj['TaxPercentage'] = this.addDecimal(element.VAT.toFixed(2)).toFixed(2);\r\n\r\n this.rjObject['Trailer']['TaxItem'].push(obj)\r\n });\r\n if (this.transactionDocument.basket.linePromotion.length > 0 || this.transactionDocument.basket.linePromotion.length > 0) {\r\n this.rjObject['Trailer']['PromotionItem'] = [];\r\n if (this.transactionDocument.basket.linePromotion.length > 0) {\r\n this.transactionDocument.basket.linePromotion.forEach((element: any) => {\r\n let obj: any = {};\r\n\r\n obj['PromotionID'] = element.promotionId;\r\n obj['PromotionSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;\r\n obj['PromotionQuantity'] = \"1\";\r\n obj['PromotionDescription'] = element.displayText;\r\n obj['PromotionHit'] = {}\r\n obj['PromotionHit']['XMLSchemaVersion'] = this.xmlSchemaVersion;\r\n obj['PromotionHit']['HitNumber'] = \"1\";\r\n obj['PromotionHit']['HitQuantity'] = \"1\";\r\n obj['PromotionHit']['HitSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;\r\n obj['PromotionHit']['PromotionTrigger'] = {};\r\n let product = this.transactionDocument.basket.products.find((item: any) => item.itemLineId == element.itemLineId);\r\n obj['PromotionHit']['PromotionTrigger']['XMLSchemaVersion'] = this.xmlSchemaVersion;\r\n obj['PromotionHit']['PromotionTrigger']['ProductID'] = product.SKU;\r\n obj['PromotionHit']['PromotionTrigger']['UnitValue'] = this.convertToString(element.promotionLinePrice / product.quantity);\r\n obj['PromotionHit']['PromotionTrigger']['LineNumber'] = this.getNumber(product.SKU);\r\n obj['PromotionHit']['PromotionTrigger']['Quantity'] = this.convertToString(product.quantity.toFixed(1));\r\n obj['PromotionHit']['PromotionTrigger']['TaxCode'] = this.transactionDocument.basket.taxBreakdown.taxLines.find((item: any) => item.itemLineId == element.itemLineId).VATCode;\r\n this.rjObject['Trailer']['PromotionItem'].push(obj);\r\n });\r\n }\r\n\r\n if (this.transactionDocument.basket.transactionPromotion.length > 0) {\r\n\r\n this.transactionDocument.basket.transactionPromotion.forEach((element: any) => {\r\n let obj: any = {};\r\n obj['PromotionID'] = element.promotionId;\r\n obj['PromotionSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;\r\n obj['PromotionQuantity'] = \"1\";\r\n obj['PromotionDescription'] = element.displayText;\r\n obj['PromotionHit'] = {}\r\n obj['PromotionHit']['XMLSchemaVersion'] = this.xmlSchemaVersion;\r\n obj['PromotionHit']['HitNumber'] = \"1\";\r\n obj['PromotionHit']['HitQuantity'] = \"1\";\r\n obj['PromotionHit']['HitSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;\r\n obj['PromotionHit']['PromotionTrigger'] = [];\r\n this.transactionDocument.basket.products.forEach((product: any) => {\r\n let promotionTrigger = {};\r\n element.itemLineIds.forEach((itemLineId: any) => {\r\n if (JSON.stringify(itemLineId) === product.itemLineId) {\r\n promotionTrigger['XMLSchemaVersion'] = this.xmlSchemaVersion;\r\n promotionTrigger['ProductID'] = product.SKU;\r\n promotionTrigger['UnitValue'] = this.convertToString(element.promotionLinePrice / product.quantity);\r\n promotionTrigger['LineNumber'] = this.getNumber(product.SKU);\r\n promotionTrigger['Quantity'] = this.convertToString(product.quantity);\r\n promotionTrigger['TaxCode'] = this.transactionDocument.basket.taxBreakdown.taxLines.find((item: any) => item.itemLineId == product.itemLineId).VATCode;\r\n obj['PromotionHit']['PromotionTrigger'].push(promotionTrigger);\r\n }\r\n });\r\n });\r\n this.rjObject['Trailer']['PromotionItem'].push(obj);\r\n });\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n getTenderInfo() {\r\n if (this.transactionDocument.paymentDetails && this.transactionDocument.paymentDetails.length > 0) {\r\n this.transactionDocument.paymentDetails.forEach((element: any) => {\r\n if(element.externalTenderKey){\r\n this.rjObject[element.externalTenderKey] = [];\r\n if (element.paymentType.toUpperCase() === 'GIFT CARD') {\r\n let obj = {\r\n XMLSchemaVersion: this.xmlSchemaVersion,\r\n LineNumber: this.generateLineNumber(),\r\n NetValue: this.convertToString(-1 * this.removeDecimal((Math.round(element.amount)))),\r\n EffectiveNetValue: this.convertToString(-1 * this.removeDecimal((Math.round(element.amount)))),\r\n Description: this.getDescription(element),\r\n DeviceID: this.deviceId,\r\n UserID: this.transactionDocument.userName,\r\n DateTimeCreated: this.updatedAt,\r\n TenderType: element.externalTenderType ? element.externalTenderType : '',\r\n TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',\r\n TenderAmount: this.convertToString(-1 * this.removeDecimal((Math.round(element.amount)))),\r\n CurrencyID: this.transactionDocument.baseCurrency,\r\n CurrencyDescription: this.transactionDocument.baseCurrency,\r\n GiftVoucherSalesAllowed: '',//todo\r\n AllowRechargeableVoucherSales: '',//todo\r\n GiftVoucherID: ''\r\n }\r\n this.rjObject[element.externalTenderKey].push(obj)\r\n }\r\n else {\r\n let obj1 = {\r\n XMLSchemaVersion: \"1\",\r\n LineNumber: this.generateLineNumber(),//todo\r\n NetValue: this.convertToString(-1 * this.removeDecimal(Math.round(element.amount))),\r\n EffectiveNetValue: this.convertToString(-1 * this.removeDecimal(Math.round(element.amount))),\r\n Description: this.getDescription(element),\r\n DeviceID: this.deviceId,\r\n UserID: this.transactionDocument.userName,\r\n DateTimeCreated: this.updatedAt,\r\n TenderType: element.externalTenderType ? element.externalTenderType : '',\r\n TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',\r\n TenderAmount: this.convertToString(-1 * this.removeDecimal(Math.round(element.amount))),\r\n CurrencyID: this.transactionDocument.baseCurrency,\r\n CurrencyDescription: this.transactionDocument.baseCurrency,\r\n IncludeInTransactionTotalCheck: \"1\",\r\n AllowRechargeableVoucherSales: \"1\",\r\n OpenDrawerAtEnd: \"1\"\r\n }\r\n this.rjObject[element.externalTenderKey].push(obj1)\r\n }\r\n } else{\r\n this.rjObject['CashTender'] = [];\r\n if (element.paymentType.toUpperCase() === 'GIFT CARD') {\r\n let obj = {\r\n XMLSchemaVersion: this.xmlSchemaVersion,\r\n LineNumber: this.generateLineNumber(),\r\n NetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),\r\n EffectiveNetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),\r\n Description: this.getDescription(element),\r\n DeviceID: this.deviceId,\r\n UserID: this.transactionDocument.userName,\r\n DateTimeCreated: this.updatedAt,\r\n TenderType: element.externalTenderType ? element.externalTenderType : '',\r\n TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',\r\n TenderAmount: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),\r\n CurrencyID: this.transactionDocument.baseCurrency,\r\n CurrencyDescription: this.transactionDocument.baseCurrency,\r\n GiftVoucherSalesAllowed: '',//todo\r\n AllowRechargeableVoucherSales: '',//todo\r\n GiftVoucherID: ''\r\n }\r\n this.rjObject['CashTender'].push(obj)\r\n }\r\n else {\r\n let obj1 = {\r\n XMLSchemaVersion: \"1\",\r\n LineNumber: this.generateLineNumber(),\r\n NetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),\r\n EffectiveNetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),\r\n Description: this.getDescription(element),\r\n DeviceID: this.deviceId,\r\n UserID: this.transactionDocument.userName,\r\n DateTimeCreated: this.updatedAt,\r\n TenderType: element.externalTenderType ? element.externalTenderType : '',\r\n TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',\r\n TenderAmount: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),\r\n CurrencyID: this.transactionDocument.baseCurrency,\r\n CurrencyDescription: this.transactionDocument.baseCurrency,\r\n IncludeInTransactionTotalCheck: \"1\",\r\n AllowRechargeableVoucherSales: \"1\",\r\n OpenDrawerAtEnd: \"1\"\r\n }\r\n this.rjObject['CashTender'].push(obj1)\r\n }\r\n }\r\n });\r\n }\r\n return this;\r\n }\r\n\r\n getNumber(productId) {\r\n let lineNumber; \r\n for (let i = 0; i < this.rjObject['ProductSale'].length; i++) {\r\n const element = this.rjObject['ProductSale'][i];\r\n if(JSON.stringify(productId) === JSON.stringify(element.ProductID)){\r\n lineNumber = element.LineNumber;\r\n break;\r\n }\r\n }\r\n return lineNumber;\r\n }\r\n\r\n setLineNumberForProducts() {\r\n let itemLineIdArray = [];\r\n itemLineIdArray = this.transactionDocument.basket.products.map((product: any) => {\r\n return parseInt(product.itemLineId);\r\n })\r\n this.largestNumber = itemLineIdArray.reduce((a: any, b: any) => Math.max(a, b));\r\n }\r\n\r\n generateLineNumber() {\r\n this.largestNumber += 1;\r\n this.itemCount += 1;\r\n return this.largestNumber;\r\n }\r\n\r\n initilizeItemCount() {\r\n this.itemCount = this.transactionDocument.basket.products.length;\r\n }\r\n\r\n build() {\r\n return this.rjObject;\r\n }\r\n\r\n getDescription(element: any) {\r\n if (element.paymentType.toUpperCase() === 'CARD') {\r\n return element.cardType\r\n }\r\n else {\r\n return element.paymentType;\r\n }\r\n }\r\n\r\n getMMGROUPID(attributes) {\r\n if (attributes && attributes.length > 0) {\r\n let filterValue = attributes.filter((attribute) => attribute.name === \"MMGROUPID\");\r\n if(filterValue && filterValue.length > 0){\r\n return filterValue[0].value;\r\n }\r\n }\r\n }\r\n\r\n setDeviceInfo(id: any) {\r\n this.deviceId = id\r\n return this\r\n }\r\n\r\n removeDecimal(value: number) {\r\n return value * 100;\r\n }\r\n\r\n addDecimal(value: number) {\r\n return value /100;\r\n }\r\n\r\n setTransactionNumber(value: any) {\r\n this.transactionNumber = value;\r\n return this\r\n }\r\n\r\n setManifestVersion(value: any) {\r\n this.manifestVersion = value;\r\n return this\r\n }\r\n\r\n setDatabaseSchemaVersion(value: any) {\r\n this.databaseSchemaVersion = value;\r\n return this\r\n }\r\n\r\n setBasketType(value: any) {\r\n this.basketType = value;\r\n return this\r\n }\r\n\r\n setTradingRegionID(value: any) {\r\n this.tradingRegionId = value\r\n return this\r\n }\r\n\r\n setCompanyID(value: any) {\r\n this.companyId = value\r\n return this\r\n }\r\n\r\n setTaxMethodID(value: any) {\r\n this.taxMethodId = value\r\n return this\r\n }\r\n\r\n setMajorVersion(value: any) {\r\n this.majorVersion = value\r\n return this\r\n }\r\n\r\n setMinorVersion(value: any) {\r\n this.minorVersion = value\r\n return this\r\n }\r\n\r\n setXMLSchemaVersion(value: any) {\r\n this.xmlSchemaVersion = value\r\n return this\r\n }\r\n\r\n setExternalState(value: any) {\r\n this.externalState = value\r\n return this\r\n }\r\n\r\n setCashierID() {\r\n this.cashierId = (this.transactionDocument && this.transactionDocument.userName) ? this.transactionDocument.userName : '';\r\n return this\r\n }\r\n\r\n setTerminalNumber(value: any) {\r\n this.terminalNumber = value;\r\n return this;\r\n }\r\n\r\n setBasketLanguageID(value: any) {\r\n this.basketLanguageId = value;\r\n return this;\r\n }\r\n setBasketCountryID(value: any) {\r\n this.basketCountryId = value;\r\n return this;\r\n }\r\n\r\n setBasketCurrencyID(value: any) {\r\n this.basketCurrencyId = value;\r\n return this;\r\n }\r\n\r\n setBranchID(value: any) {\r\n this.branchId = value;\r\n return this;\r\n }\r\n\r\n setSalesPersonName(value: any) {\r\n this.salesPersonName = value;\r\n return this;\r\n }\r\n\r\n generateId(date: any) {\r\n let newDateTime = date.replace(/[^0-9]/g, '')\r\n let id = (this.deviceId + '|' + newDateTime + '|' + this.transactionNumber).toString();\r\n return id;\r\n } \r\n\r\n generateTimezoneoffset(date: any) {\r\n let x = date ? date : '';\r\n return new Date(x).getTimezoneOffset();\r\n }\r\n\r\n generateKeyword() {\r\n let x = (this.companyId + '|' + this.transactionDocument.storeId + '|' + this.terminalNumber + '|' + this.transactionNumber).toString();\r\n return x;\r\n }\r\n\r\n getState() {\r\n if (this.transactionDocument.operationStatus === 'PAY_SUCCESS') {\r\n return 'Completed';\r\n }\r\n else {\r\n return 'Cancelled';\r\n }\r\n }\r\n\r\n returnProduct(element: any, lineDiscount: LineDiscount , transactionDiscount: TransactionDiscount) {\r\n let obj: any = {};\r\n let taxTotal = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item: any) => item.itemLineId == element['itemLineId']);\r\n obj['XMLSchemaVersion'] = this.xmlSchemaVersion;\r\n obj['LineNumber'] = element['itemLineId'];\r\n obj['NetValue'] = this.removeDecimal(element['refundedTotal']);\r\n obj['EffectiveNetValue'] = this.removeDecimal(element['refundedTotal']);\r\n obj['Description'] = element['description'];\r\n obj['DeviceID'] = this.transactionDocument['terminalId'];\r\n obj['UserID'] = this.transactionDocument.userName;\r\n obj['DateTimeCreated'] = this.createdAt;\r\n obj['ExtendedValue'] = this.removeDecimal(element['totalLinePrice']*-1);\r\n obj['UnitPrice'] = this.removeDecimal(element['price']);\r\n obj['Quantity'] = this.getQuantity(element);\r\n obj['OriginalTaxAmountSet'] = 1;\r\n obj['ProductID'] = element['SKU'];\r\n obj['HandKeyed'] = 1;\r\n obj['LongDescription'] = element['description'];\r\n obj['Return'] = {};\r\n obj['Return']['ReturnReasonID'] = element['refundedReason'];\r\n obj['Return']['ReturnDescription'] = element['refundedReasonDescription'];\r\n obj['Return']['ReturnToStock'] = this.getQuantity(element);\r\n obj['TaxCode'] = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item: any) => item.itemLineId == element['itemLineId']).VATCode;\r\n\r\n obj['DisplayTaxCode'] = ''; // todo\r\n obj['ProductAttributes'] = ''; //todo - not required\r\n obj['Perishable'] = this.getMMGROUPID(element.attributes);\r\n //obj['MMGroupID'] = this.getCaregories(element);\r\n obj['MMGroupID'] = this.getMMGROUPID(element.attributes);\r\n obj['CustomerDetails'] = \"\"; // todo - blank\r\n obj['TotalPromotionSaving'] = element['promotionAmount'] || -1; // TODO\r\n obj['OriginalTaxAmount'] = this.convertToString((this.removeDecimal(this.getOriginalTax(element,taxTotal.VAT) * -1)).toFixed(2));\r\n obj['taxAmount'] = this.removeDecimal(taxTotal.taxLineTotal < 0 ?(taxTotal.taxLineTotal) : (-taxTotal.taxLineTotal));\r\n\r\n if (lineDiscount) {\r\n if (lineDiscount.percentageDiscountReasonName && lineDiscount.percentageDiscountReasonCode) {\r\n // line discount\r\n obj['Discount'] = {};\r\n obj['Discount'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;\r\n obj['Discount'].ModifierDateTime = obj.DateTimeCreated;\r\n obj['Discount'].ModifierReasonID = lineDiscount.percentageDiscountReasonCode;\r\n obj['Discount'].ModifierDescription = lineDiscount.percentageDiscountReasonName;\r\n obj['Discount'].AuthorisingUserID = this.transactionDocument.userName;\r\n obj['Discount'].DiscountType = lineDiscount.discountType;\r\n obj['Discount'].XMLSchemaVersion = 1;\r\n obj['Discount'].OriginalPrice = this.removeDecimal(lineDiscount.discountAmount + (lineDiscount.discountedLinePrice || 0));\r\n obj['Discount'].DiscountedValue = this.removeDecimal(lineDiscount.unitPrice);\r\n obj['Discount'].DiscountPercentage = lineDiscount.percentageDiscountValue;\r\n obj['Discount'].RoundingRule = 2;\r\n }\r\n\r\n if (lineDiscount.priceOverrideReasonCode && lineDiscount.priceOverrideReasonName) {\r\n //price override\r\n obj['PriceOverride'] = {};\r\n obj['PriceOverride'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;\r\n obj['PriceOverride'].ModifierDateTime = obj.DateTimeCreated;\r\n obj['PriceOverride'].ModifierReasonID = lineDiscount.priceOverrideReasonCode;\r\n obj['PriceOverride'].ModifierReasonDescription = lineDiscount.priceOverrideReasonName;\r\n obj['PriceOverride'].AuthorisingUserID = this.transactionDocument.userName;\r\n obj['PriceOverride'].XMLSchemaVersion = 1;\r\n obj['PriceOverride'].NewPrice = this.removeDecimal(lineDiscount.unitPrice);\r\n obj['PriceOverride'].OriginalPrice = this.removeDecimal(lineDiscount.discountedLinePrice || 0 + lineDiscount.discountAmount);\r\n }\r\n\r\n //update the product price\r\n obj.NetValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;\r\n obj.EffectiveNetValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;\r\n obj.ExtendedValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;\r\n obj.UnitPrice = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;\r\n }\r\n\r\n if(transactionDiscount) {\r\n obj['BasketDiscountModifier'] = [];\r\n this.transactionDocument.basket.transactionDiscount.forEach((e: any) => { \r\n let discountObj: any ={}\r\n e.itemLineIds.forEach((x: any) => {\r\n if (x == element.itemLineId) { \r\n var discountAmount = this.convertToString(e.discountAmount * -1); \r\n discountObj.BasketDiscountLineNumber = this.getLineNumber(e,discountAmount);\r\n discountObj.XMLSchemaVersion = this.xmlSchemaVersion;\r\n discountObj.DiscountedValue = this.getDiscountedValue(element.totalLinePrice, e.discountAmount);\r\n obj['BasketDiscountModifier'].push(discountObj);\r\n } \r\n }); \r\n });\r\n var totaltransactionDiscount = 0;\r\n obj['BasketDiscountModifier'].forEach((value:any)=>{\r\n totaltransactionDiscount = totaltransactionDiscount + value.DiscountedValue;\r\n });\r\n //update the product price\r\n obj['EffectiveNetValue'] = obj.EffectiveNetValue + totaltransactionDiscount;\r\n }\r\n\r\n if (this.transactionDocument.basket.transactionPromotion.length > 0) {\r\n obj['PromotionSaving'] = [];\r\n this.transactionDocument.basket.transactionPromotion.forEach((transactionPromo: any) => {\r\n let promotionObj: any = {};\r\n transactionPromo.itemLineIds.forEach((itemLineId: any) => {\r\n if (itemLineId == element.itemLineId) {\r\n promotionObj.ModifierValue = transactionPromo.promotionAmount;\r\n promotionObj.ModifierDateTime = this.transactionDocument.createdAt;\r\n promotionObj.ModifierDescription = transactionPromo.displayText;\r\n promotionObj.XMLSchemaVersion = this.xmlSchemaVersion;\r\n promotionObj.PromotionID = transactionPromo.promotionId;\r\n promotionObj.PromotionDescription = transactionPromo.displayText;\r\n promotionObj.HitNumber = '1';\r\n promotionObj.PromotionHitProductQuantity = this.getQuantity(element);\r\n promotionObj.PromotionHitQuantity = this.getQuantity(element) * -1;\r\n obj['PromotionSaving'].push(promotionObj);\r\n }\r\n });\r\n });\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n addProduct(element: TProduct, lineDiscount: LineDiscount, transactionDiscount: TransactionDiscount) {\r\n let taxTotal = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item: any) => item.itemLineId == element['itemLineId']);\r\n let obj: any = {\r\n XMLSchemaVersion: this.xmlSchemaVersion,\r\n LineNumber: element.itemLineId,\r\n NetValue: this.removeDecimal(element.totalLinePrice),\r\n EffectiveNetValue: this.removeDecimal(element.totalLinePrice),\r\n Description: element.description,\r\n DeviceID: this.deviceId,\r\n UserID: this.transactionDocument.userName,\r\n DateTimeCreated: this.createdAt,\r\n ExtendedValue: this.removeDecimal(element.price),\r\n UnitPrice: this.removeDecimal(element.price),\r\n //MMGroupID: this.getCaregories(element),\r\n Quantity: element.quantity,\r\n SalespersonID: this.transactionDocument.userName,\r\n SalespersonName: this.salesPersonName,\r\n TaxCode: this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item: any) => item.itemLineId == element['itemLineId']).VATCode,\r\n TaxModifiable: \"1\", //todo\r\n OriginalTaxAmount : this.convertToString((this.removeDecimal(this.getOriginalTax(element,taxTotal.VAT)).toFixed(2))),\r\n TaxAmount : this.convertToString(this.removeDecimal(taxTotal.taxLineTotal)),\r\n OriginalTaxAmountSet: \"1\",//todo\r\n ProductID: element.SKU,\r\n HandKeyed: \"1\",//todo\r\n CustomerDetails: \"\",\r\n Perishable: this.getMMGROUPID(element.attributes),\r\n MMGroupID: this.getMMGROUPID(element.attributes)\r\n }\r\n if (lineDiscount) {\r\n if (lineDiscount.percentageDiscountReasonName && lineDiscount.percentageDiscountReasonCode) {\r\n // line discount\r\n obj['Discount'] = {};\r\n obj['Discount'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;\r\n obj['Discount'].ModifierDateTime = obj.DateTimeCreated;\r\n obj['Discount'].ModifierReasonID = lineDiscount.percentageDiscountReasonCode;\r\n obj['Discount'].ModifierDescription = lineDiscount.percentageDiscountReasonName;\r\n obj['Discount'].AuthorisingUserID = this.transactionDocument.userName;\r\n obj['Discount'].DiscountType = lineDiscount.discountType;\r\n obj['Discount'].XMLSchemaVersion = 1;\r\n obj['Discount'].OriginalPrice = this.removeDecimal(lineDiscount.discountAmount + (lineDiscount.discountedLinePrice || 0));\r\n obj['Discount'].DiscountedValue = this.removeDecimal(lineDiscount.unitPrice);\r\n obj['Discount'].DiscountPercentage = lineDiscount.percentageDiscountValue;\r\n obj['Discount'].RoundingRule = 2;\r\n }\r\n\r\n if (lineDiscount.priceOverrideReasonCode && lineDiscount.priceOverrideReasonName) {\r\n //price override\r\n obj['PriceOverride'] = {};\r\n obj['PriceOverride'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;\r\n obj['PriceOverride'].ModifierDateTime = obj.DateTimeCreated;\r\n obj['PriceOverride'].ModifierReasonID = lineDiscount.priceOverrideReasonCode;\r\n obj['PriceOverride'].ModifierReasonDescription = lineDiscount.priceOverrideReasonName;\r\n obj['PriceOverride'].AuthorisingUserID = this.transactionDocument.userName;\r\n obj['PriceOverride'].XMLSchemaVersion = this.xmlSchemaVersion;\r\n obj['PriceOverride'].NewPrice = this.removeDecimal(lineDiscount.unitPrice);\r\n obj['PriceOverride'].OriginalPrice = this.removeDecimal(lineDiscount.discountedLinePrice || 0 + lineDiscount.discountAmount);\r\n }\r\n\r\n //update the product price\r\n obj['NetValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);\r\n obj['EffectiveNetValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);\r\n obj['ExtendedValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);\r\n obj['UnitPrice'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);\r\n }\r\n\r\n if(transactionDiscount) {\r\n obj['BasketDiscountModifier'] = [];\r\n this.transactionDocument.basket.transactionDiscount.forEach((e:any) => { \r\n let discountObj: any ={};\r\n e.itemLineIds.forEach((itemLineId: any) => {\r\n if (itemLineId == element.itemLineId) { \r\n let discountAmount = this.convertToString(e.discountAmount * -1); \r\n discountObj.XMLSchemaVersion = this.xmlSchemaVersion;\r\n discountObj.DiscountedValue = -(this.getDiscountedValue(element.totalLinePrice, e.discountAmount));\r\n discountObj.BasketDiscountLineNumber = this.getLineNumber(e,discountAmount) ;\r\n obj['BasketDiscountModifier'].push(discountObj); \r\n } \r\n }); \r\n });\r\n let totaltransactionDiscount = 0;\r\n obj['BasketDiscountModifier'].forEach((value:any)=>{\r\n totaltransactionDiscount = totaltransactionDiscount + value.DiscountedValue;\r\n });\r\n //update the product price\r\n obj['EffectiveNetValue'] = obj.EffectiveNetValue + totaltransactionDiscount; \r\n }\r\n \r\n if (this.transactionDocument.basket.transactionPromotion.length > 0 || this.transactionDocument.basket.linePromotion.length > 0) {\r\n obj['DistributedPromotionSaving'] = [];\r\n if (this.transactionDocument.basket.transactionPromotion.length > 0) {\r\n this.transactionDocument.basket.transactionPromotion.forEach((e: any) => {\r\n let promotionObj: any = {};\r\n e.itemLineIds.forEach((itemLineId: any) => {\r\n if (itemLineId == element.itemLineId) {\r\n promotionObj.PromotionID = e.promotionId;\r\n promotionObj.Hit = '1';\r\n promotionObj.Saving = this.getSaving(element.totalLinePrice, e.promotionAmount);\r\n promotionObj.ISaving = this.getSaving(element.totalLinePrice, e.promotionAmount);\r\n obj['DistributedPromotionSaving'].push(promotionObj);\r\n }\r\n });\r\n });\r\n }\r\n\r\n if (this.transactionDocument.basket.linePromotion.length > 0) {\r\n this.transactionDocument.basket.linePromotion.forEach((linePromotion: any) => {\r\n let promotionObj: any = {};\r\n if (element.itemLineId == linePromotion.itemLineId) {\r\n promotionObj.PromotionID = linePromotion.promotionId;\r\n promotionObj.Hit = \"1\";\r\n promotionObj.Saving = linePromotion.promotionLinePrice;\r\n promotionObj.ISaving = linePromotion.promotionLinePrice;\r\n obj['DistributedPromotionSaving'].push(promotionObj);\r\n }\r\n });\r\n }\r\n let transactionPromotion = 0;\r\n obj['DistributedPromotionSaving'].forEach((value: any) => {\r\n transactionPromotion = transactionPromotion + value.Saving;\r\n });\r\n obj['EffectiveNetValue'] = obj.EffectiveNetValue + transactionPromotion;\r\n }\r\n return obj;\r\n }\r\n\r\n getSaving(price,promotionAmount): any {\r\n let Saving = (price*promotionAmount)/this.transactionDocument.basketSummary.saleTotal;\r\n return Saving;\r\n }\r\n\r\n getLineNumber(value: any,discountAmount:string ){\r\n let lineNumber;\r\n for (let i = 0; i < this.rjObject['BasketDiscount'].length; i++) {\r\n const element = this.rjObject['BasketDiscount'][i];\r\n if( value.reasonCode === element.ReasonCodeID && discountAmount === element.NetValue){\r\n lineNumber = element.LineNumber;\r\n break; \r\n } \r\n }\r\n return lineNumber; \r\n }\r\n\r\n\r\n getDiscountedValue(price:any ,discountAmount:any ) {\r\n let DiscountedValue =((price * discountAmount)/this.transactionDocument.basketSummary.saleTotal)*100 ;\r\n return DiscountedValue;\r\n }\r\n\r\n getOriginalTax(element: TProduct, VAT) {\r\n let pricebeforetax = (element.price * 100)/(100 + VAT )\r\n let originaltax= element.price - pricebeforetax\r\n return originaltax;\r\n }\r\n\r\n convertToString(value: any) {\r\n try {\r\n value = JSON.stringify(value);\r\n return value;\r\n }\r\n catch (e) {\r\n console.log(value, 'can not be converted in string', e);\r\n }\r\n }\r\n\r\n generateDynamicStockLookUp() {\r\n let x = '0';\r\n this.transactionDocument.basket.products.forEach((element: any) => {\r\n if (element.deliveryMethod === '1' || element.deliveryMethod === '2') {\r\n x = '1';\r\n }\r\n });\r\n return x;\r\n }\r\n\r\n // getAttributes(){\r\n // let name: string | any[] = []\r\n // this.transactionDocument.basket.products.forEach((element: any) => {\r\n // if (element && element.attributes && element.attributes.length > 0) {\r\n // name = element.attributes.filter((x: any) => x.name.toUpperCase() === element.name.toUpperCase());\r\n // }\r\n // });\r\n // if (name.length > 0) {\r\n // return name[0].value\r\n // }\r\n // else{\r\n // return \"\"\r\n // }\r\n // }\r\n\r\n // getCaregories(element) {\r\n // let MMGroupId = \" \";\r\n // if (element.categories && element.categories.length > 0) {\r\n // let categories = element.categories.filter((x) => x.parentId != '');\r\n // let value = categories.filter((x) => x.id != x.parentId);\r\n // MMGroupId = value[0].name;\r\n // }\r\n // return MMGroupId;\r\n // }\r\n\r\n getDate(date:string){\r\n let offset = this.generateTimezoneoffset(date) * -1;\r\n let offsetHours = Math.abs(Math.floor(offset / 60)); \r\n\t let offsetMinutes = Math.abs(offset) - offsetHours * 60;\r\n\r\n let offsetSign = '+';\r\n if (offset < 0) {\r\n offsetSign = '-';\r\n }\r\n\r\n let newdate = date.substring(0,19);\r\n const x = (newdate+ offsetSign +String(offsetHours).padStart(2, '0')+':'+String(offsetMinutes).padStart(2, '0')).toString();\r\n return x; \r\n }\r\n \r\n getTransactionPromotion(transactionPromotion){\r\n if(transactionPromotion && transactionPromotion.length > 0){\r\n this.rjObject['PromoVoucherItem'] = {};\r\n this.rjObject['PromoVoucherItem']['XMLSchemaVersion'] = this.xmlSchemaVersion;\r\n this.rjObject['PromoVoucherItem']['LineNumber'] = this.generateLineNumber();\r\n this.rjObject['PromoVoucherItem']['NetValue'] = this.removeDecimal(transactionPromotion[0].promotionLinePrice) * -1;\r\n this.rjObject['PromoVoucherItem']['EffectiveNetValue'] = this.removeDecimal(transactionPromotion[0].promotionLinePrice) * -1;\r\n this.rjObject['PromoVoucherItem']['Description'] = transactionPromotion[0].promotionInfo;\r\n this.rjObject['PromoVoucherItem']['DeviceID'] = this.deviceId;\r\n this.rjObject['PromoVoucherItem']['UserID'] = this.transactionDocument.userName;\r\n this.rjObject['PromoVoucherItem']['DateTimeCreated'] = this.createdAt;\r\n this.rjObject['PromoVoucherItem']['ProductId'] = \"\"; //todo\r\n this.rjObject['PromoVoucherItem']['SerialNumber'] = \"\" ; //todo\r\n this.rjObject['PromoVoucherItem']['MMGroupId'] = \"\";\r\n }\r\n }\r\n \r\n getQuantity(element: any) {\r\n let quantity\r\n if(this.transactionDocument.unreferencedRefund){\r\n quantity = element['quantity'] < 0 ? element['quantity'] : (-element['quantity']);\r\n }\r\n else{\r\n quantity = element['refundedQuantity'] < 0 ? element['refundedQuantity'] : (-element['refundedQuantity']);\r\n }\r\n return quantity;\r\n }\r\n}\r\n","import { TransactionDocument } from \"./mapper-library.model\";\r\n\r\nexport class WebReturnMapperBuilderClass {\r\n\r\n private document: any;\r\n private webReturnObject: TransactionDocument = {\r\n id: '',\r\n orgCode: \"\",\r\n storeId: \"\",\r\n storeNodeId: \"\",\r\n storeNodeStructure: \"\",\r\n deviceId: \"\",\r\n terminalId: \"\",\r\n initiatingModule: \"\",\r\n export: false,\r\n basket: {},\r\n basketSummary: {},\r\n baseCurrency: \"\",\r\n customer: {\r\n firstName: '',\r\n lastName: '',\r\n email: '',\r\n postCode: '',\r\n id: '',\r\n billingAddress: {},\r\n shippingAddress: {},\r\n\r\n }\r\n }\r\n\r\n constructor(document) {\r\n if (document) {\r\n this.document = document;\r\n }\r\n }\r\n\r\n WebReturnMapper() {\r\n this.webReturnObject['type'] = 'WEB_RETURNS';\r\n this.webReturnObject['datetime'] = this.getUTCDateTime(this.getText(this.document.updated_at));\r\n this.webReturnObject.baseCurrency = this.getText(this.document.base_currency_code);\r\n this.webReturnObject.storeId = this.getText(this.document.store_id);\r\n this.webReturnObject.subsidiaryId = '1';\r\n this.webReturnObject.initiatingModule = 'MAGENTO';\r\n this.webReturnObject.createdAt = this.getUTCDateTime(this.getText(this.document.created_at));\r\n this.webReturnObject.updatedAt = this.getUTCDateTime(this.getText(this.document.updated_at));\r\n this.webReturnObject.export = true;\r\n this.webReturnObject.transCompletedAt = this.getUTCDateTime(this.getText(this.document.updated_at));\r\n this.webReturnObject['externalTransactionId'] = this.getText(this.document.order_id);\r\n\r\n // customer\r\n this.webReturnObject['customer']['firstName'] = this.getText(this.document.customer_firstname) || '';\r\n this.webReturnObject['customer']['lastName'] = this.getText(this.document.customer_lastname) || '';\r\n this.webReturnObject['customer']['email'] = this.getText(this.document.customer_email) || '';\r\n this.webReturnObject['customer']['postCode'] = '';\r\n\r\n // Billing address\r\n this.webReturnObject['customer']['billingAddress']['address1'] = (this.document.billing_address && this.document.billing_address.street) ? this.getText(this.document.billing_address.street) : '';\r\n this.webReturnObject['customer']['billingAddress']['city'] = (this.document.billing_address && this.document.billing_address.city) ? this.getText(this.document.billing_address.city) : '';\r\n this.webReturnObject['customer']['billingAddress']['county'] = (this.document.billing_address && this.document.billing_address.region) ? this.getText(this.document.billing_address.region) : '';\r\n this.webReturnObject['customer']['billingAddress']['postCode'] = (this.document.billing_address && this.document.billing_address.postcode) ? this.getText(this.document.billing_address.postcode) : '';\r\n this.webReturnObject['customer']['billingAddress']['country'] = (this.document.billing_address && this.document.billing_address.country) ? this.getText(this.document.billing_address.country) : '';\r\n\r\n // Shipping address\r\n this.webReturnObject['customer']['shippingAddress']['address1'] = (this.document.shipping_address && this.document.shipping_address.street) ? this.getText(this.document.shipping_address.street) : '';\r\n this.webReturnObject['customer']['shippingAddress']['city'] = (this.document.shipping_address && this.document.shipping_address.city) ? this.getText(this.document.shipping_address.city) : '';\r\n this.webReturnObject['customer']['shippingAddress']['county'] = (this.document.shipping_address && this.document.shipping_address.region) ? this.getText(this.document.shipping_address.region) : '';\r\n this.webReturnObject['customer']['shippingAddress']['postCode'] = (this.document.shipping_address && this.document.shipping_address.postcode) ? this.getText(this.document.shipping_address.postcode) : '';\r\n this.webReturnObject['customer']['shippingAddress']['country'] = (this.document.shipping_address && this.document.shipping_address.country) ? this.getText(this.document.shipping_address.country) : '';\r\n\r\n // basketSummary \r\n this.webReturnObject.basketSummary['discountTotal'] = Number(this.document.discount_amount ? this.getText(this.document.discount_amount) : 0);\r\n this.webReturnObject.basketSummary['VATTotal'] = Number(this.document.base_total_paid ? this.getText(this.document.base_total_paid) : 0);\r\n this.webReturnObject.basketSummary['saleTotal'] = Number(this.document.base_total_invoiced ? this.getText(this.document.base_total_invoiced) : 0);\r\n this.webReturnObject.basketSummary['basketTotal'] = Number(this.document.base_total_paid ? this.getText(this.document.base_total_paid) : 0);\r\n this.webReturnObject.basketSummary['totalItems'] = Number(this.document.total_qty_ordered ? this.getText(this.document.total_qty_ordered) : 0);\r\n this.webReturnObject.basketSummary['refundTotal'] = Number(this.document.base_total_refunded ? this.getText(this.document.base_total_refunded) : 0);\r\n\r\n // basket line discount\r\n this.webReturnObject.basket['lineDiscount'] = [];\r\n\r\n let lineDiscount = {\r\n itemLineId: (this.document.items && this.document.items.item && this.document.items.item.item_id) ? this.getText(this.document.items.item.item_id) : 0,\r\n discountAmount: (this.document.items && this.document.items.item && this.document.items.item.discount_amount) ? Number(this.getText(this.document.items.item.discount_amount)) : 0\r\n }\r\n this.webReturnObject.basket['lineDiscount'].push(lineDiscount);\r\n\r\n // basket transaction discount\r\n this.webReturnObject.basket['transactionDiscount'] = [];\r\n\r\n let transactionDiscount = {\r\n discountAmount: (this.document && this.document.discount_amount) ? Number(this.getText(this.document.discount_amount)) : 0\r\n }\r\n this.webReturnObject.basket['transactionDiscount'].push(transactionDiscount);\r\n\r\n // basket products \r\n this.webReturnObject.basket['products'] = [];\r\n let product : any= {};\r\n if (this.document.items && this.document.items.item && this.document.items.item) {\r\n if (this.document.items.item instanceof Array) {\r\n this.document.items.item.forEach(element => {\r\n product = {\r\n description: (element.name) ? this.getText(element.name) : '',\r\n SKU: (element.sku) ? this.getText(element.sku) : '',\r\n quantity: (element.qty_ordered) ? Number(this.getText(element.qty_ordered)) : 0,\r\n refundedQuantity: (element.qty_refunded) ? Number(this.getText(this.document.items.item.qty_refunded)) : 0,\r\n price: (element.original_price) ? Number(this.getText(element.original_price)) : 0,\r\n itemLineId: (element.item_id) ? Number(this.getText(element.item_id)) : 0,\r\n // totalLinePrice: (element.row_invoiced) ? Number(this.getText(element.row_invoiced)) : 0,\r\n totalLinePrice: ((element.qty_ordered - element.qty_refunded) * element.base_original_price) || 0,\r\n }\r\n if (product && product.price != 0) {\r\n this.webReturnObject.basket['products'].push(product);\r\n }\r\n });\r\n } else {\r\n product = {\r\n description: (this.document.items && this.document.items.item && this.document.items.item.name) ? this.getText(this.document.items.item.name) : '',\r\n SKU: (this.document.items && this.document.items.item && this.document.items.item.sku) ? this.getText(this.document.items.item.sku) : '',\r\n quantity: (this.document.items && this.document.items.item && this.document.items.item.qty_ordered) ? Number(this.getText(this.document.items.item.qty_ordered)) : 0,\r\n refundedQuantity: (this.document.items && this.document.items.item && this.document.items.item.qty_refunded) ? Number(this.getText(this.document.items.item.qty_refunded)) : 0,\r\n price: (this.document.items && this.document.items.item && this.document.items.item.original_price) ? Number(this.getText(this.document.items.item.original_price)) : 0,\r\n itemLineId: (this.document.items && this.document.items.item && this.document.items.item.item_id) ? Number(this.getText(this.document.items.item.item_id)) : 0,\r\n // totalLinePrice: (this.document.items && this.document.items.item && this.document.items.item.row_invoiced) ? Number(this.getText(this.document.items.item.row_invoiced)) : 0,\r\n totalLinePrice: ((this.document.items.item.qty_ordered - this.document.items.item.qty_refunded) * this.document.items.item.base_original_price) || 0,\r\n }\r\n if (product && product.price != 0) {\r\n this.webReturnObject.basket['products'].push(product);\r\n }\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n deviceId(deviceId) {\r\n this.webReturnObject.deviceId = deviceId;\r\n return this;\r\n }\r\n\r\n terminalId(terminalId) {\r\n this.webReturnObject.terminalId = terminalId;\r\n return this;\r\n }\r\n\r\n orgCode(orgCode) {\r\n this.webReturnObject.orgCode = orgCode;\r\n return this;\r\n }\r\n\r\n storeId(storeId) {\r\n this.webReturnObject.storeId = storeId;\r\n return this;\r\n }\r\n\r\n storeNodeId(storeNodeId: string) {\r\n this.webReturnObject.storeNodeId = storeNodeId;\r\n return this;\r\n }\r\n\r\n storeNodeStructure(storeNodeStructure: string) {\r\n this.webReturnObject.storeNodeStructure = storeNodeStructure;\r\n return this;\r\n }\r\n\r\n docId(docId) {\r\n this.webReturnObject.id = docId;\r\n return this;\r\n }\r\n\r\n updateUserID(userID: string) {\r\n this.webReturnObject.userId = userID;\r\n return this;\r\n }\r\n\r\n updateUserName(name) {\r\n this.webReturnObject.userName = name;\r\n return this;\r\n }\r\n\r\n build() {\r\n return this.webReturnObject;\r\n }\r\n\r\n getText(obj) {\r\n if (obj && obj.text) {\r\n return obj.text;\r\n } else {\r\n return obj;\r\n }\r\n }\r\n\r\n getUTCDateTime(date) {\r\n if (date) {\r\n return new Date(date).toISOString();\r\n }\r\n }\r\n}\r\n"]}
|