UNPKG

b2w

Version:

A library for the B2W Group (Americanas[dot]com, Submarino & Shoptime) API using Promises

609 lines (477 loc) 16.9 kB
'use strict'; var errorHandler = require('./helper').errorHandler, creditCard = require('credit-card'), orderHelper = { emailRegex: /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/, formatDate(date) { var year = date.getFullYear(), month = (date.getMonth() + 1), day = date.getDate(); if(month < 10) { month = '0' + month; } if(day < 10) { day = '0' + day; } return year + '-' + month + '-' + day; }, parseOrderObj(orderBody, coreAPI) { var finalObj = { orderServiceId: orderBody.partnerId, cart: { orderLines: { orderLine: [] } }, customer: { email: orderBody.user.email, type: orderBody.user.type.toUpperCase(), documentNumber: orderBody.user.documentNumber.replace(/[\.\-\/]/gm, ''), name: orderBody.user.name, nickName: orderBody.user.nickname, phones: {} }, addresses: { shipping: { contactName: orderBody.address.shipping.contactName, address: orderBody.address.shipping.street, number: orderBody.address.shipping.number, complement: orderBody.address.shipping.complement, province: orderBody.address.shipping.neighborhood, city: orderBody.address.shipping.city, state: orderBody.address.shipping.state, zipcode: orderBody.address.shipping.zipcode, addressName: orderBody.address.shipping.addressName } }, payments: {} }, skuList, phoneList, totalPayment, skuTotalPrice, creditCardExpiration; if(orderBody.referer) { finalObj.cart.referer = orderBody.referer; } if(orderBody.cupom) { finalObj.cart.cupom = orderBody.cupom; } finalObj.cart.freight = { time: orderHelper.formatDate(orderBody.tracking.deliveryDate), amount: orderBody.tracking.value, discount: orderBody.tracking.discount, totalAmount: orderBody.tracking.total }; if(orderBody.tracking.type && orderBody.tracking.type === 'delivery') { finalObj.cart.freight.scheduledDeliveryDate = finalObj.cart.freight.time; finalObj.cart.freight.scheduledDeliveryPeriod = orderBody.tracking.deliveryPeriod.toUpperCase(); } skuList = orderBody.sku; if(!Array.isArray(orderBody.sku)) { skuList = [ orderBody.sku ]; } finalObj.cart.orderLines.orderLine = skuList.map((sku) => { var skuObj = {}; skuObj.sku = sku.id; if(sku.similar) { delete skuObj.id; skuObj.similarId = sku.similar; } skuObj.quantity = (sku.quantity)? sku.quantity : 1; skuObj.salePrice = sku.price; return skuObj; }); if(orderBody.user.type.toUpperCase() === 'PF') { finalObj.customer.birthdate = orderHelper.formatDate(orderBody.user.birthdate); finalObj.customer.gender = orderBody.user.gender.toUpperCase(); } if(orderBody.user.type.toUpperCase() === 'PJ') { finalObj.customer.corporateName = orderBody.user.corporateName; finalObj.customer.stateRegistration = orderBody.user.stateRegistration; finalObj.customer.purposePurchasing = orderBody.user.purposePurchasing; finalObj.customer.taxInformation = orderBody.user.taxInformation; } phoneList = orderBody.user.phones; if(!Array.isArray(orderBody.user.phones)) { phoneList = [ orderBody.user.phones ]; } phoneList.forEach((phone) => { var phoneObj = { areaCode: phone.ddd, number: phone.number }; if(phone.ramal) { phoneObj.ramal = phone.ramal; } if(phone.type === 'residential') { finalObj.customer.phones.residentialPhone = phoneObj; } if(phone.type === 'cellphone') { finalObj.customer.phones.cellPhone = phoneObj; } if(phone.type === 'comercial') { finalObj.customer.phones.commercialPhone = phoneObj; } }); if(orderBody.user.optin) { finalObj.customer.optin = true; } if(orderBody.address.billing) { finalObj.addresses.billing = { contactName: orderBody.address.billing.contactName, address: orderBody.address.billing.street, number: orderBody.address.billing.number, complement: orderBody.address.billing.complement, province: orderBody.address.billing.neighborhood, city: orderBody.address.billing.city, state: orderBody.address.billing.state, zipcode: orderBody.address.billing.zipcode, addressName: orderBody.address.billing.addressName }; } skuTotalPrice = skuList[0].price; if(skuList.length !== 1) { skuTotalPrice = skuList.reduce((previousValue, currentValue) => { return previousValue.price + currentValue.price; }); } totalPayment = orderBody.tracking.total + skuTotalPrice; if(orderBody.payment.type.toLowerCase() === 'corporate') { finalObj.payments.corporateSalePayment = { cnpj: orderBody.payment.cnpj.replace(/[\.\-\/]/gm, ''), totalAmount: parseFloat((orderBody.payment.totalAmount || totalPayment)).toFixed(2) }; } if(orderBody.payment.type.toLowerCase() === 'creditcard') { creditCardExpiration = orderBody.payment.cardExpirationDate.split('/'); if(creditCardExpiration[1].length !== 2) { creditCardExpiration[1] = creditCardExpiration[1].substr( (creditCardExpiration[1].length - 2) ); } finalObj.payments.creditCard = { cardBrand: orderBody.payment.cardBrand, cardOwnerName: orderBody.payment.cardOwnerName, cardNumber: orderBody.payment.cardNumber, cardExpirationDate: creditCardExpiration[0] + '/' + creditCardExpiration[1], parcels: (orderBody.payment.parcels || 1), totalAmount: parseFloat((orderBody.payment.total || totalPayment)).toFixed(2) }; } return coreAPI.parseXML(finalObj); }, checkEachParam(params) { var userError, trackingError, paymentError, addressError, skuError; if(!params.partnerId) { return errorHandler('createOrder', 'missingPartnerId'); } if(!params.sku) { return errorHandler('createOrder', 'missingSkuInfo'); } if(!params.user) { return errorHandler('createOrder', 'missingUserInfo'); } if(!params.tracking) { return errorHandler('createOrder', 'missingTrackingInfo'); } if(!params.payment) { return errorHandler('createOrder', 'missingPaymentInfo'); } if(!params.address) { return errorHandler('createOrder', 'missingAddressInfo'); } userError = orderHelper.checkUserParam(params.user); if(userError) { return userError; } skuError = orderHelper.checkSkuParam(params.sku); if(skuError) { return skuError; } trackingError = orderHelper.checkTrackingParam(params.tracking); if(trackingError) { return trackingError; } paymentError = orderHelper.checkPaymentParam(params.payment); if(paymentError) { return paymentError; } addressError = orderHelper.checkAddressParam(params.address); if(addressError) { return addressError; } return Promise.resolve(true); }, checkUserParam(user) { var hasResidential = false, phoneArray; if(!user.email) { return errorHandler('createOrder', 'missingUserEmail'); } if(!orderHelper.emailRegex.test(user.email)) { return errorHandler('createOrder', 'invalidUserEmail'); } if(user.optin && user.optin !== true && user.optin !== false) { return errorHandler('createOrder', 'invalidUserOptin'); } if(!user.type) { return errorHandler('createOrder', 'missingUserType'); } user.type = user.type.toLowerCase(); if(user.type !== 'pf' && user.type !== 'pj') { return errorHandler('createOrder', 'invalidUserType'); } if(!user.nickname) { return errorHandler('createOrder', 'missingUserNickname'); } if(user.nickname.length < 3 || user.nickname.length > 18) { return errorHandler('createOrder', 'invalidUserNickname'); } if(user.type === 'pf') { if(!user.birthdate) { return errorHandler('createOrder', 'missingUserBirthdate'); } if(!(user.birthdate instanceof Date)) { return errorHandler('createOrder', 'invalidUserBirthdate'); } if(!user.gender) { return errorHandler('createOrder', 'missingUserGender'); } user.gender = user.gender.toLowerCase(); if(user.gender !== 'male' && user.gender !== 'female') { return errorHandler('createOrder', 'invalidUserGender'); } } if(user.type === 'pj') { if(!user.corporateName) { return errorHandler('createOrder', 'missingUserCorporateName'); } if(!user.stateRegistration) { return errorHandler('createOrder', 'missingUserStateRegistration'); } if(!user.purposePurchasing) { return errorHandler('createOrder', 'missingUserPurposePurchasing'); } user.purposePurchasing = user.purposePurchasing.toUpperCase().trim().replace(' ', '_'); if(user.purposePurchasing !== 'RESALE' && user.purposePurchasing !== 'OWN_CONSUMPTION' ) { return errorHandler('createOrder', 'invalidUserPurposePurchasing'); } if(!user.taxInformation) { return errorHandler('createOrder', 'missingUserTaxInformation'); } user.taxInformation = user.taxInformation.toUpperCase().trim().replace(' ', '_'); if(user.taxInformation !== 'TAXPAYER_ICMS' && user.purposePurchasing !== 'EXEMPT_TAXPAYER' && user.purposePurchasing !== 'NOT_TAXPAYER') { return errorHandler('createOrder', 'invalidUserTaxInformation'); } } if(!user.documentNumber) { return errorHandler('createOrder', 'missingUserDocumentNumber'); } if(!user.name) { return errorHandler('createOrder', 'missingUserName'); } if(!user.phones) { return errorHandler('createOrder', 'missingUserPhoneObject'); } phoneArray = user.phones; if(!Array.isArray(user.phones)) { phoneArray = [ user.phones ]; } for (var i = phoneArray.length - 1; i >= 0; i--) { if(!phoneArray[i].type) { return errorHandler('createOrder', 'missingUserPhoneType'); } phoneArray[i].type = phoneArray[i].type + ''; if(phoneArray[i].type.toLowerCase() === 'residential' && hasResidential === false) { hasResidential = true; } if(phoneArray[i].type.toLowerCase() !== 'residential' && phoneArray[i].type.toLowerCase() !== 'cellphone' && phoneArray[i].type.toLowerCase() !== 'comercial') { return errorHandler('createOrder', 'invalidUserPhoneType'); } if(!phoneArray[i].ddd) { return errorHandler('createOrder', 'missingUserPhoneDDD'); } if(parseInt(phoneArray[i].ddd, 10) > 99 || parseInt(phoneArray[i].ddd, 10) < 10) { return errorHandler('createOrder', 'invalidUserPhoneDDD'); } if(!phoneArray[i].number) { return errorHandler('createOrder', 'missingUserPhoneNumber'); } if(Number.isNaN(parseInt(phoneArray[i].number, 10))) { return errorHandler('createOrder', 'invalidUserPhoneNumber'); } } if(!hasResidential) { return errorHandler('createOrder', 'missingResidentialPhone'); } return false; }, checkSkuParam(sku) { var skuArray = sku; if(!Array.isArray(sku)) { skuArray = [ sku ]; } for (var i = skuArray.length - 1; i >= 0; i--) { if(!skuArray[i].id && !skuArray[i].similar) { return errorHandler('createOrder', 'missingSkuIdOrSimilar'); } if(!skuArray[i].price) { return errorHandler('createOrder', 'missingSkuPrice'); } if(!parseFloat(skuArray[i].price)) { return errorHandler('createOrder', 'invalidSkuPrice'); } if(skuArray[i].quantity && Number.isNaN(parseInt(skuArray[i].quantity)) ) { return errorHandler('createOrder', 'invalidSkuQuantity'); } } return false; }, checkTrackingParam(tracking) { if(!tracking.deliveryDate) { return errorHandler('createOrder', 'missingTrackingDeliveryDate'); } if(!(tracking.deliveryDate instanceof Date) || tracking.deliveryDate <= Date.now()) { return errorHandler('createOrder', 'invalidTrackingDeliveryDate'); } if(!tracking.value) { return errorHandler('createOrder', 'missingTrackingValue'); } if(tracking.value && Number.isNaN(parseFloat(tracking.value))) { return errorHandler('createOrder', 'invalidTrackingValue'); } if(!tracking.total) { return errorHandler('createOrder', 'missingTrackingTotal'); } if(tracking.total && Number.isNaN(parseFloat(tracking.total))) { return errorHandler('createOrder', 'invalidTrackingTotal'); } if(tracking.discount) { if( (tracking.value - tracking.discount) !== tracking.total) { return errorHandler('createOrder', 'invalidTrackingPricing'); } } if(tracking.type && tracking.type.toLowerCase() === 'delivery') { if(!tracking.deliveryPeriod) { return errorHandler('createOrder', 'missingTrackingDeliveryPeriod'); } tracking.deliveryPeriod = tracking.deliveryPeriod.toLowerCase(); if(tracking.deliveryPeriod !== 'manha' && tracking.deliveryPeriod !== 'tarde' && tracking.deliveryPeriod !== 'noite') { return errorHandler('createOrder', 'invalidTrackingDeliveryPeriod'); } } return false; }, checkPaymentParam(payment) { var creditCardValidation, creditCardExpiration; if(!payment.type) { return errorHandler('createOrder', 'missingPaymentType'); } payment.type = payment.type.toLowerCase(); if(payment.type !== 'corporate' && payment.type !== 'creditcard') { return errorHandler('createOrder', 'invalidPaymentType'); } if(payment.type === 'corporate') { if(!payment.cnpj) { return errorHandler('createOrder', 'missingPaymentCNPJ'); } } if(payment.type === 'creditcard') { if(!payment.cardBrand) { return errorHandler('createOrder', 'missingPaymentCardBrand'); } payment.cardBrand = payment.cardBrand.toLowerCase(); if(payment.cardBrand !== 'mastercard' && payment.cardBrand !== 'visa' && payment.cardBrand !== 'amex' && payment.cardBrand !== 'diners') { return errorHandler('createOrder', 'invalidPaymentCardBrand'); } if(!payment.cardOwnerName) { return errorHandler('createOrder', 'missingPaymentCardOwnerName'); } if(!payment.cardNumber) { return errorHandler('createOrder', 'missingPaymentCardNumber'); } if(!payment.cvv) { return errorHandler('createOrder', 'missingPaymentCardCvv'); } if(!payment.cardExpirationDate) { return errorHandler('createOrder', 'missingPaymentCardCardExpirationDate'); } creditCardExpiration = payment.cardExpirationDate.split('/'); if(creditCardExpiration[1].length !== 4) { creditCardExpiration[1] = '20' + creditCardExpiration[1]; } creditCardValidation = creditCard.validate({ cardType: payment.cardBrand.toUpperCase(), number: payment.cardNumber, expiryMonth: creditCardExpiration[0], expiryYear: creditCardExpiration[1], cvv: payment.cvv }); if(!creditCardValidation.validCardNumber) { return errorHandler('createOrder', 'invalidPaymentCardNumber'); } if(!creditCardValidation.validExpiryMonth) { return errorHandler('createOrder', 'invalidPaymentExpiryMonth'); } if(!creditCardValidation.validExpiryYear) { return errorHandler('createOrder', 'invalidPaymentExpiryYear'); } if(!creditCardValidation.validCvv) { return errorHandler('createOrder', 'invalidPaymentCvv'); } if(creditCardValidation.isExpired) { return errorHandler('createOrder', 'invalidPaymentExpireDate'); } } return false; }, checkAddressParam(address) { if(!address.shipping) { return errorHandler('createOrder', 'missingAddressShipping'); } if(!address.shipping.contactName) { return errorHandler('createOrder', 'missingAddressContactName'); } if(!address.shipping.street) { return errorHandler('createOrder', 'missingAddressStreet'); } if(!address.shipping.number) { return errorHandler('createOrder', 'missingAddressNumber'); } if(!address.shipping.neighborhood) { return errorHandler('createOrder', 'missingAddressNeighborhood'); } if(!address.shipping.city) { return errorHandler('createOrder', 'missingAddressCity'); } if(!address.shipping.state) { return errorHandler('createOrder', 'missingAddressState'); } if(!address.shipping.zipcode) { return errorHandler('createOrder', 'missingAddressZipcode'); } if(!address.shipping.addressName) { return errorHandler('createOrder', 'missingAddressName'); } if(address.billing) { if(!address.billing.contactName) { return errorHandler('createOrder', 'missingBillingAddressContactName'); } if(!address.billing.street) { return errorHandler('createOrder', 'missingBillingAddressStreet'); } if(!address.billing.number) { return errorHandler('createOrder', 'missingBillingAddressNumber'); } if(!address.billing.neighborhood) { return errorHandler('createOrder', 'missingBillingAddressNeighborhood'); } if(!address.billing.city) { return errorHandler('createOrder', 'missingBillingAddressCity'); } if(!address.billing.state) { return errorHandler('createOrder', 'missingBillingAddressState'); } if(!address.billing.zipcode) { return errorHandler('createOrder', 'missingBillingAddressZipcode'); } if(!address.billing.addressName) { return errorHandler('createOrder', 'missingBillingAddressName'); } } return false; } }; module.exports = Object.create(orderHelper);