wholesale-vuex
Version:
Commerce vuex module
748 lines (698 loc) • 28.9 kB
JavaScript
import { snakeCase } from "lodash";
import humps from "lodash-humps";
import createHumps from "lodash-humps/lib/createHumps";
import { getField, updateField } from "vuex-map-fields";
import wholesaleOrderSnapshotService from "./wholesale_order_snapshot.service";
import wholesaleOrderService from "./wholesale_order.service";
const { doPostSalesOrderChanges } = wholesaleOrderService;
const { doWholesaleOrderGetSnapshot } = wholesaleOrderSnapshotService;
import { createVariantsListFromItemsList, checkExistOrNot, returnOriginalSkuQtyBySku, getPaymentTypesInArray, getPaymentTypesInObj, updateTermsList, otherPaymentTermsList } from "./common.service";
const { v4 } = require('uuid')
const snakes = createHumps(snakeCase);
export default {
namespaced: true,
state: {
masterOne: null,
one: null,
otherPaymentTypes: [],
details: null,
shipments: null,
orderSnapshotObj: null,
orderItemList: [],
inProgress: false,
filteredItemsVariantList: [],
originalItems: null,
snapShotResponseItems: [],
currentOriginalVariants:[],
itemOne: null,
currentItemVariantList: [],
oneVariantsObj: null,
masterItemOne: null,
originalVariants: [],
variantsListInProgress:false,
allChangesObject: [],
originalOrderItemList:[],
totalWholesalePrice: 0 // for store variant items total amount
},
getters: {
getField,
},
mutations: {
updateField,
inProgress(state, yesOrNo) {
state.inProgress = yesOrNo;
},
setTotalWholesalePrice(state, price) {
state.totalWholesalePrice = price;
},
variantsListInProgress(state, yesOrNo) {
state.variantsListInProgress = yesOrNo;
},
setOrderItemList(state, list){
state.originalOrderItemList=JSON.parse(JSON.stringify(list));
},
setMasterOne(state, one) {
if (one) state.masterOne = JSON.parse(JSON.stringify(one));
},
setNewVariantsList(state) {
state.variantsList = [];
state.originalVariants = []
},
setOne(state, one) {
try{
if (!one.shippingAddress) {
one.shippingAddress = { line: null, postcode: null, city: null, country: null, countryIso3: null }
}
if (!one.billingAddress) {
one.billingAddress = { line: null, postcode: null, city: null, country: null, countryIso3: null }
}
if (one.paymentTermsObject) {
state.otherPaymentTypes = getPaymentTypesInArray(one.paymentTermsObject)
state.otherPaymentTypes=updateTermsList(state.otherPaymentTypes)
}
if (one.category) {
one.category = one.category.split(',')
}
// if (one.state) {
// state.wholesaleOrderNextState = state.wholesaleOrderStateList.filter((item) => {
// return item.state == one.state
// })
// }
// else {
// state.wholesaleOrderNextState = state.wholesaleOrderStateList.filter((item) => {
// return item.state == 'submitted_processing'
// })
// }
if (one) state.one = JSON.parse(JSON.stringify(one));
}catch(err){
console.log(err)
}
},
setSnapshotObj(state, one) {
state.orderSnapshotObj = one;
},
setDetails(state, details) {
state.details = details;
},
setOrderItems(state, items) {
state.orderItemList = items;
state.originalItems = JSON.parse(JSON.stringify(items));
},
setSnapShotResponseItems(state, { items }) {
state.snapShotResponseItems = items;
},
setShipments(state, shipments) {
state.shipments = shipments;
},
async deleteOne(state, itemId){
let newList = state.orderItemList.filter(item => item.id !== itemId)
state.orderItemList = []
state.orderItemList = newList
const list = await createVariantsListFromItemsList(
state.orderItemList
);
state.filteredItemsVariantList = list;
},
async setSnapShotItems(state) {
if (
state.orderSnapshotObj &&
state.orderSnapshotObj.items &&
state.orderSnapshotObj.items.length
) {
state.filteredItemsVariantList = [];
if (
state.orderSnapshotObj &&
state.orderSnapshotObj.details &&
state.orderSnapshotObj.details.itemsFormat === "variant_size_color" &&
state.orderSnapshotObj.items
) {
const list = await createVariantsListFromItemsList(
state.orderItemList
);
state.filteredItemsVariantList = list;
// state.originalSnapShotItemsVariantsList = list;
} else if (
state.orderSnapshotObj &&
state.orderSnapshotObj.details &&
state.orderSnapshotObj.details.itemsFormat === "sku" &&
state.orderSnapshotObj.items
) {
state.filteredItemsVariantList = state.orderItemList;
// state.originalSnapShotItemsVariantsList = state.orderItemList;
}
}
},
async searchSnapShotItems(state, data) {
if(state.orderItemList && state.orderItemList.length)
state.filteredItemsVariantList = await createVariantsListFromItemsList(
state.orderItemList
);
let searchString = data.searchString;
if (searchString) {
let items = [];
state.filteredItemsVariantList.filter((variant) => {
if (
variant.name &&
variant.name.toLowerCase().search(searchString.toLowerCase()) !== -1
) {
items.push(variant);
} else if (
variant.sku &&
variant.sku.toLowerCase().search(searchString.toLowerCase()) !== -1
) {
items.push(variant);
} else if (
variant.eanCode &&
variant.eanCode.toLowerCase().search(searchString.toLowerCase()) !==
-1
) {
items.push(variant);
} else if (
variant.color &&
variant.color.toLowerCase().search(searchString.toLowerCase()) !==
-1
) {
items.push(variant);
}
});
state.filteredItemsVariantList = items;
state.filteredItemsVariantList = [
...new Set(state.filteredItemsVariantList),
];
}
// // send all items if no filter
// else {
// state.filteredItemsVariantList = [];
// state.filteredItemsVariantList = state.orderItemList;
// }
},
// for order details
setOtherPaymentTypes(state, paymentTypes) {
state.otherPaymentTypes = getPaymentTypesInArray(paymentTypes)
state.otherPaymentTypes=updateTermsList(state.otherPaymentTypes)
},
getOtherPaymentTypesInObj(state, paymentTypes) {
state.otherPaymentTypes = getPaymentTypesInObj(paymentTypes)
state.otherPaymentTypes=updateTermsList(state.otherPaymentTypes)
},
addDefaultPaymentType(state, val) {
try{
if (state.otherPaymentTypes === undefined || state.otherPaymentTypes == null) {
state.otherPaymentTypes = [{ type: 'Payment on order confirmation', paid: 30 },{ type: 'Payment after last delivery', paid: 70,days: 0 }] }
if (val.type == 'new') {
state.otherPaymentTypes = []
state.otherPaymentTypes.splice(0, 0, { type: '', paid: 0, days: 0 })
} else if (val.type == 'default') {
state.otherPaymentTypes = [{ type: 'Payment on order confirmation', paid: 30},{ type: 'Payment after last delivery', paid: 70,days: 0 }]
state.otherPaymentTypes=updateTermsList(state.otherPaymentTypes)
}else if(val.type == 'splitPaymentIn30%Deposit/70%BFDelivery'){
state.otherPaymentTypes = [ { "type": "Payment on order confirmation", "paid": "30", "days": 0 }, { "type": "Payment before first delivery", "paid": "70", "days": 0 } ]
}else if(val.type == 'splitPaymentIn30%Deposit/70%ALDelivery'){
state.otherPaymentTypes = [ { "type": "Payment on order confirmation", "paid": "30", "days": 0 }, { "type": "Payment after last delivery", "paid": "70", "days": 0 } ]
}else if(val.type === 'reset'){
state.otherPaymentTypes = []
}
else {
let termsList= state.otherPaymentTypes.map((item)=> item.type)
let difference = otherPaymentTermsList.filter(x => !termsList.includes(x));
state.otherPaymentTypes.splice(val.index, 0, { type:difference[0], paid: 0, days: 0 })
state.otherPaymentTypes=updateTermsList(state.otherPaymentTypes)
}
}catch(err){
console.log(err)
}
},
updatePaymentTerms(state){
state.otherPaymentTypes=updateTermsList(state.otherPaymentTypes)
},
deletePaymentTypeRow(state, index) {
state.otherPaymentTypes.splice(index, 1);
state.otherPaymentTypes=updateTermsList(state.otherPaymentTypes)
},
async setUpdateVariantsToList(state, data){
try{
state.itemOne = null
state.itemOne = data.item
let newList = state.orderItemList
state.orderItemList.filter((item)=> {
if(item.id === state.itemOne.id)
{
item.variants = data.variants
}
})
state.orderItemList = []
state.filteredItemsVariantList = []
state.orderItemList = newList
state.filteredItemsVariantList = await createVariantsListFromItemsList(
state.orderItemList
);
}catch(err){
console.log(err)
}
},
async addNewVariantsToList(state, data){
try{
state.itemOne = null
state.itemOne = data.item
// let newList = state.orderItemList
state.orderItemList.push(data.item)
state.filteredItemsVariantList = []
//state.orderItemList = newList
state.filteredItemsVariantList = await createVariantsListFromItemsList(
state.orderItemList
);
}catch(err){
console.log(err)
}
},
// for items
setOneVariantsObj(state, oneItem) {
state.oneVariantsObj = oneItem;
},
setItemOne(state, data) {
try{
state.currentItemVariantList = []
state.currentOriginalVariants = []
state.itemOne = null
// setting master item one
state.masterItemOne = null
let itemId = data.itemId
state.itemOne = data
if(itemId)
state.masterItemOne = state.originalItems.filter((item)=> item.id === itemId)[0]
if(state.masterItemOne && state.masterItemOne.shipmentCancelDateOld){
state.masterItemOne.shipmentCancelDate=state.masterItemOne.shipmentCancelDateOld
delete state.masterItemOne.shipmentCancelDateOld
}
if(state.masterItemOne && state.masterItemOne.shipmentStartDateOld){
state.masterItemOne.shipmentStartDate=state.masterItemOne.shipmentStartDateOld
delete state.masterItemOne.shipmentStartDateOld
}
state.masterItemOne = JSON.stringify(state.masterItemOne);
// setting current one item
if(itemId){
state.itemOne = state.orderItemList.filter((item)=> item.id === itemId)[0]
}
if (state.itemOne.variants.length > 0 && state.itemOne.format === 'sku') {
state.oneVariantsObj = Object.assign({}, state.itemOne.variants[0])
let resultColor = state.oneVariantsObj.color
let newColor = resultColor && resultColor.length && typeof resultColor == "object" ? resultColor[0] : resultColor && typeof resultColor == "string" ? resultColor : null;
state.oneVariantsObj.color = newColor
let resultSize = state.oneVariantsObj.size
let newSize = resultSize && resultSize.length && typeof resultSize == "object" ? resultSize[0] : resultSize && typeof resultSize == "string" ? resultSize : null;
state.oneVariantsObj.size = newSize
let resultCategory = state.oneVariantsObj.category
let newCategory = resultCategory && resultCategory.length && Array.isArray(resultCategory) ? resultCategory : typeof resultCategory == "object" ? resultCategory[0] : resultCategory && typeof resultCategory == "string" ? resultCategory : null;
state.oneVariantsObj.category = newCategory
}
if (state.itemOne.variants.length > 0 && state.itemOne.format === "variant_size_color") {
state.oneVariantsObj = Object.assign({}, state.itemOne.variants[0])
state.itemOne.variants.map((a) => {
if (!a.qtyPacked){
a.qtyPacked=a.qty
}
});
let resultSize = []
let resultColor = []
state.itemOne.variants.filter((a) => {
resultSize.push(a.size+'')
resultColor.push(a.color)
});
let newListSize = resultSize
state.oneVariantsObj.size = newListSize && newListSize.length ? [...new Set(newListSize)] : null;
// state.itemOne.variants.filter((a) => {
// resultColor.push(a.color)
// });
let newListColor = resultColor && resultColor.length ? (resultColor.toString()).split(",") : null;
state.oneVariantsObj.color = newListColor && newListColor.length ? [...new Set(newListColor)] : null;
let resultCategory = state.itemOne.variants.map(a => a.category
);
let newListCategory = (resultCategory.toString()).split(",");
state.oneVariantsObj.category = [...new Set(newListCategory)];
state.currentItemVariantList = state.itemOne.variants;
state.currentOriginalVariants = state.itemOne.variants;
}
}catch(err){
console.log(err)
}
},
setEmptyItemVariantsList(state){
state.currentItemVariantList = []
state.currentOriginalVariants = []
},
setItemVariantsList(state) {
try{
// state.currentItemVariantList = []
if(state.oneVariantsObj && state.oneVariantsObj.category && state.currentItemVariantList.length <= 0){
state.oneVariantsObj.category.filter((categoryItem) => {
if (state.oneVariantsObj.color && state.oneVariantsObj.color.length > 0) {
// if variants has color and size
state.oneVariantsObj.color.filter((colorItem) => {
if (state.oneVariantsObj.size && state.oneVariantsObj.size.length > 0) {
state.oneVariantsObj.size.filter((sizeItem) => {
state.currentItemVariantList.push(
{
variantId:v4(),
sku: state.itemOne.variantsRefCode + '-' + categoryItem + '-' + sizeItem + '-' + colorItem,
category: categoryItem ? categoryItem : null,
size: sizeItem ? sizeItem : null,
color: colorItem ? colorItem : null,
qty: 0,
//qty: state.oneVariantsObj.qty,
retailPrice: state.oneVariantsObj.retailPrice,
wholesalePrice: state.oneVariantsObj.wholesalePrice,
eanCode: null,// state.oneVariantsObj.eanCode,
qtyPacked:0
}
)
})
} else {
// if variants has color and no size
state.currentItemVariantList.push(
{
variantId:v4(),
sku: state.itemOne.variantsRefCode + '-' + categoryItem + '-' + colorItem,
category: categoryItem,
size: null,
color: colorItem ? colorItem : null,
qty: 0,
//qty: state.oneVariantsObj.qty,
retailPrice: state.oneVariantsObj.retailPrice,
wholesalePrice: state.oneVariantsObj.wholesalePrice,
eanCode: null, //state.oneVariantsObj.eanCode
qtyPacked:0
}
)
}
})
} else if (state.oneVariantsObj.size && state.oneVariantsObj.size.length > 0) {
// if variants has size and no color
state.oneVariantsObj.size.filter((sizeItem) => {
state.currentItemVariantList.push(
{
variantId:v4(),
sku: state.one.variantsRefCode + '-' + categoryItem + '-' + sizeItem,
category: categoryItem,
size: sizeItem,
color: null,
qty: 0,
//qty: state.oneVariantsObj.qty,
retailPrice: state.oneVariantsObj.retailPrice,
wholesalePrice: state.oneVariantsObj.wholesalePrice,
eanCode: null, //state.oneVariantsObj.eanCode
qtyPacked:0
}
)
})
} else {
// if variants has no size and no color , only has category
state.currentItemVariantList.push(
{
variantId:v4(),
sku: state.itemOne.variantsRefCode + '-' + categoryItem,
category: categoryItem,
size: null,
color: null,
qty: 0,
//qty: state.oneVariantsObj.qty,
retailPrice: state.oneVariantsObj.retailPrice,
wholesalePrice: state.oneVariantsObj.wholesalePrice,
eanCode: null,//state.oneVariantsObj.eanCode
qtyPacked:0
}
)
}
})
} else {
let variantList = state.currentItemVariantList.length > 0 ? state.currentItemVariantList : state.currentOriginalVariants
let newColors = checkExistOrNot({oneVariantsObj: state.oneVariantsObj.color,variantsList: variantList, type: 'color'})
let newCategory = checkExistOrNot({oneVariantsObj: state.oneVariantsObj.category,variantsList: variantList, type: 'category'})
let newSize = checkExistOrNot({oneVariantsObj: state.oneVariantsObj.size,variantsList: variantList, type: 'size'})
let newVariantItems = []
if(state.currentOriginalVariants && state.currentOriginalVariants.length){
state.currentOriginalVariants.filter((item)=>{
let flag = false
if(state.oneVariantsObj && state.oneVariantsObj.category && state.oneVariantsObj.category.includes(item.category)){
if(!state.oneVariantsObj.size.includes(item.size)){
flag = true
}
if(!state.oneVariantsObj.color.includes(item.color)){
flag = true
}
if(!flag) {
newVariantItems.push(item)
}
}
})
}
let totalMixedCategories = []
if(newCategory && newCategory.length)
totalMixedCategories = [...new Set([...newCategory])]
if(state.oneVariantsObj.category)
totalMixedCategories = [...new Set([...totalMixedCategories, ...state.oneVariantsObj.category])]
let totalMixedColors = []
if(newColors && newColors.length)
totalMixedColors = [...new Set([...newColors])]
if(state.oneVariantsObj.color)
totalMixedColors = [...new Set([...totalMixedColors, ...state.oneVariantsObj.color])]
let totalMixedSizes = []
if(newSize && newSize.length)
totalMixedSizes = [...new Set([...newSize])]
if(state.oneVariantsObj.size)
totalMixedSizes = [...new Set([...totalMixedSizes, ...state.oneVariantsObj.size])]
// let totalMixedColors = [...new Set([...newColors, ...state.oneVariantsObj.color])]
// let totalMixedSizes = [...new Set([...newSize, ...state.oneVariantsObj.size])]
// if(newCategory.length){
for(let i=0; i< totalMixedCategories.length; i++){
let category = totalMixedCategories[i];
// if(newColors.length){
for(let j=0; j< totalMixedColors.length; j++){
let color = totalMixedColors[j];
// if(newSize.length){
for(let k=0; k< totalMixedSizes.length; k++){
let size = totalMixedSizes[k];
let obj = {
variantId:v4(),
sku: state.itemOne.variantsRefCode + '-' + category + '-' + size + '-' + color,
category: category ? category : null,
size: size ? size : null,
color: color ? color : null,
qty: returnOriginalSkuQtyBySku(state.currentItemVariantList, 'qty', category , size ,color),
retailPrice: state.oneVariantsObj.retailPrice, // returnOriginalSkuQtyBySku(state.currentItemVariantList, 'retailPrice', category , size ,color),//
wholesalePrice: state.oneVariantsObj.wholesalePrice, // returnOriginalSkuQtyBySku(state.currentItemVariantList, 'wholesalePrice', category , size ,color),
eanCode: returnOriginalSkuQtyBySku(state.currentItemVariantList, 'eanCode', category , size ,color),
qtyPacked: returnOriginalSkuQtyBySku(state.currentItemVariantList, 'qtyPacked', category , size ,color),
}
// avoid duplication
if(!newVariantItems.filter((item => (item.category == obj.category && item.size == obj.size && item.color == obj.color))).length)
newVariantItems.push(obj)
else {
newVariantItems.filter((item,index) => {
if(item.category == obj.category && item.size == obj.size && item.color == obj.color){
let {sku, ...othersProp } = obj
newVariantItems[index] = { sku: item.sku, ...othersProp }
}
})
}
} // totalMixedSizes
//}
} //totalMixedColors
//}
} // totalMixedCategories
//} //newCategory.length
if(newVariantItems && newVariantItems.length)
state.currentItemVariantList = [...new Set([...newVariantItems])]
state.orderItemList.filter((item)=> {
if(item.id === state.itemOne.id)
{
item.variants = state.currentItemVariantList
}
})
}
}catch(err){
console.log(err)
}
},
saveChangeObjectInStore(state, data){
try{
let isFound = false
if(state.allChangesObject && state.allChangesObject.length){
for(let i=0; i<state.allChangesObject.length; i++){
let currentChange = state.allChangesObject[i]
if(currentChange.change.change === data.change.change){
isFound = true
state.allChangesObject[i] = data
if(!(data.change.changeValues.new == null && data.change.changeValues.old == null)){
state.allChangesObject.splice(i, 1)
}
break;
}
}
}
// if(!isFound){
if(!(data.change.changeValues.new == null && data.change.changeValues.old == null)){
state.allChangesObject.push({...data})
state.allChangesObject = [...new Set(state.allChangesObject)]
}
// }
}
catch(err){
console.log(err)
}
}
},
actions: {
new({ commit }, { appId, wholesaleOrderId, purchaserBusinessEntityId, providerBusinessEntityId, brandId,startDate,endDate,itemsFormat }) {
commit('inProgress', false)
commit('setItemOne', {
'appId': appId,
'wholesaleOrderId': wholesaleOrderId,
'brandId': brandId,
'format': itemsFormat,
'lineNumber': 0,
'quantity': 0,
'unitPrice': 0,
'name': null,
'description': null,
'variantsRefCode': null,
'variants': [],
'purchaserBusinessEntityId': purchaserBusinessEntityId,
'providerBusinessEntityId': providerBusinessEntityId,
'shipmentStartDate':startDate,
'shipmentCancelDate':endDate,
'hsCode':null
})
},
fetchProcessingSnapshot: async (
{ commit },
{ wholesaleOrderId, specs }
) => {
commit("inProgress", true);
try {
let snapshot = await doWholesaleOrderGetSnapshot({
wholesaleOrderId,
specs,
});
if (snapshot) {
commit("setSnapshotObj", humps(snapshot));
commit("setOrderItems", humps(snapshot.items));
commit("setOrderItemList", (snapshot.items));
commit("setDetails", humps(snapshot.details));
commit("setMasterOne", humps(snapshot.details));
commit("setOne", humps(snapshot.details));
commit("setShipments", humps(snapshot.shipments));
commit("setSnapShotResponseItems", { items: humps(snapshot.items) });
commit("searchSnapShotItems", { searchString : '' });
return humps(snapshot);
}
} catch (err) {
throw "error"+ err;
} finally {
commit("inProgress", false);
}
},
snapShotOrderItemsForFilter: ({ commit }, {}) => {
commit("setSnapShotItems");
},
searchSnapShotItems: (
{ commit },
{
searchString,
}
) => {
commit("searchSnapShotItems", {
searchString,
});
},
addDefaultPaymentType: async ({ commit }, val) => {
commit('addDefaultPaymentType', val);
},
deletePaymentTypeRow: async ({ commit }, index) => {
commit('deletePaymentTypeRow', index);
},
deleteOrderItem: async ({ commit}, itemId ) => {
try {
commit('deleteOne', itemId);
return ({ changeResp: true })
} catch (err) {
throw 'error'
}
},
updateOtherPaymentTypes: async ({ commit }) => {
commit('inProgress', true);
try {
commit('updatePaymentTerms');
} catch (err) {
throw 'error'
}
finally {
commit('inProgress', false);
}
},
// for items
setCurrentItemOne: ({ commit }, { itemId }) => {
commit("setItemOne", { itemId });
},
setUpdateVariantsToList: ({ commit }, { variants, item }) => {
commit("setUpdateVariantsToList", { variants, item });
},
addNewVariantsToList: ({ commit }, { variants, item }) => {
commit("addNewVariantsToList", { variants, item });
},
// for item edit form
newItemVariantsList: async ({ commit }) => {
try {
commit('setItemVariantsList');
} catch (err) {
console.log(err)
}
},
newItemVariant({ commit }) {
commit('setOneVariantsObj', {
sku: null,
category: null,
size: null,
color: null,
qty: null,
retailPrice: null,
wholesalePrice: null,
eanCode: null,
qtyPacked:null
})
},
newVariantsList: async ({ commit }) => {
commit('variantsListInProgress', true);
try {
commit('setNewVariantsList');
commit('variantsListInProgress', false);
} catch (err) {
commit('variantsListInProgress', false);
}
},
saveChangeObjectInStore({ commit }, { wholesaleOrderChangesetId, change } ) {
commit("saveChangeObjectInStore", { wholesaleOrderChangesetId, change });
},
// to save order details changes
saveOrderChangeObject: async (
{ commit },
{ wholesaleOrderChangesetId, change,itemIcpData }
) => {
commit("inProgress", true);
try {
let data = await doPostSalesOrderChanges({
wholesaleOrderChangesetId,
change: snakes(change),
itemIcpData
});
return { data: humps(data) };
} catch (err) {
throw err;
} finally {
commit("inProgress", false);
}
},
setTotalWholesalePriceOne: ({ commit }, { price }) => {
commit("setTotalWholesalePrice", price)
},
}, // actions
}