import { Cart, Line } from '@inmotion/swift-libs'; import * as _ from 'lodash'; import { NEW_CART, OrderUtils, Product, ProductDisplayFunc, ProductUtils, Validator } from '@whittaker/swift-libs'; import { CartBuilderInput, LineInput } from './models.cart'; export class CartCreateUtils { constructor() { } public transformCommonCartBuilderInputProperties(cart: Cart, addEmptyLineIfNone: boolean = true): CartBuilderInput { if (!cart) return null; let input = new CartBuilderInput(); input.guid = cart.CartId; input.userEmail = cart.User ? cart.User.EmailAddress : null; if (Validator.hasValues(cart.Lines)) { input.lines = this.mapInputLines(cart.Lines); } else { input.lines = []; if (addEmptyLineIfNone) input.lines.push(new LineInput()); } input.shipping = cart.Shipping; input.billing = cart.Billing; input.paymentMethod = OrderUtils.getPaymentMethod(cart); input.paymentVoucher = cart.Payment.Voucher; input.discountSku = cart.Discount && cart.Discount.Sku ? cart.Discount.Sku : null; return input; } public skuOnHandNameProductDisplay(): ProductDisplayFunc { return (p: Product): string => `(${p.Sku}) OnHand: ${p.Inventory.OnHand} \r\n${p.Name}`; } public getCartGuid(cart: Cart): string { return cart ? (cart.CartId || cart.__i ? cart.__i.guid : null) : null; } public isNew(cartGuid: string): boolean { return !cartGuid || cartGuid == NEW_CART; } public isGuest(email: string) { const DEFAULT_CART_EMAIL = 'api@buildinmotion.com'; return !email || email == DEFAULT_CART_EMAIL; } public validateLineInput(lineInput: LineInput): void { Validator.throwIfNil(lineInput, `Missing params to add line.`); Validator.throwIfNil(lineInput.product, `Missing p.product`); Validator.throwIfNil(lineInput.product.Id, `Missing p.product.Id`); Validator.throwIfNil(lineInput.quantity, `Missing p.quantity`); } protected toInputLine(line: Line): LineInput { if (!line) return null; return { //product: ProductUtils.toSimpleInstance(line.Product, this.skuOnHandNameProductDisplay()), product: ProductUtils.toSimpleInstance(line.Product, null), sku: line.Sku, quantity: line.Quantity }; } protected mapInputLines(lines: Line[]): LineInput[] { return _.map(lines, line => this.toInputLine(line)); } }