Skip to content

Commit

Permalink
Merge pull request #61 from hotwax/57_virtual_facilities
Browse files Browse the repository at this point in the history
Implemented: Added Parking page UI.
  • Loading branch information
ravilodhi authored Dec 4, 2023
2 parents 3fd31dd + ce49e33 commit 93c8cd6
Show file tree
Hide file tree
Showing 11 changed files with 323 additions and 2 deletions.
7 changes: 7 additions & 0 deletions src/router/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { useAuthStore, DxpLogin, translate } from '@hotwax/dxp-components'
import { loader } from '@/utils/user';
import FacilityManagement from '@/views/FacilityManagement.vue'
import Settings from '@/views/Settings.vue';
import Parking from '@/views/Parking.vue';
import FindFacilities from '@/views/FindFacilities.vue';
import CreateFacility from '@/views/CreateFacility.vue';
import AddFacilityAddress from '@/views/AddFacilityAddress.vue';
Expand Down Expand Up @@ -91,6 +92,12 @@ const routes: Array<RouteRecordRaw> = [
props: true,
beforeEnter: authGuard
},
{
path: '/parking',
name: 'Parking',
component: Parking,
beforeEnter: authGuard
},
{
path: '/settings',
name: 'Settings',
Expand Down
17 changes: 17 additions & 0 deletions src/services/FacilityService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,21 @@ const removeFacilityCalendar = async (payload: any): Promise<any> => {
})
}

const fetchJobs = async(payload: any): Promise <any> => {
return api({
url: "performFind",
method: "post",
data: payload
});
}
const fetchOrderCountsByFacility = async (query: any): Promise<any> => {
return api({
url: "solr-query",
method: "post",
data: query
});
}

export const FacilityService = {
addFacilityToGroup,
createFacilityGroup,
Expand All @@ -422,6 +437,8 @@ export const FacilityService = {
fetchFacilityMappings,
fetchFacilityOrderCounts,
fetchFacilityPrimaryMember,
fetchJobs,
fetchOrderCountsByFacility,
getFacilityProductStores,
fetchShopifyFacilityMappings,
getFacilityParties,
Expand Down
4 changes: 4 additions & 0 deletions src/store/modules/facility/FacilityState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,9 @@ export default interface FacilityState {
list: Array<object>,
total: number
};
virtualFacilities: {
list: Array<object>,
total: number
};
current: any;
}
107 changes: 107 additions & 0 deletions src/store/modules/facility/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { FacilityService } from '@/services/FacilityService'
import { hasError } from '@/adapter'
import * as types from './mutation-types'
import logger from '@/logger'
import { prepareOrderQuery } from '@/utils/solrHelper';

const actions: ActionTree<FacilityState, RootState> = {
async fetchFacilitiesAdditionalInformation({ commit, state }, payload = { viewIndex: 0 }) {
Expand Down Expand Up @@ -431,6 +432,112 @@ const actions: ActionTree<FacilityState, RootState> = {
logger.error('Failed to fetch shopify facility mappings', err)
}
commit(types.FACILITY_SHOPIFY_MAPPINGS_UPDATED, shopifyFacilityMappings)
},

async fetchVirtualFacilities({ commit, dispatch }) {
let facilities = [], total = 0;

try {
const params = {
inputFields: {
parentTypeId: "VIRTUAL_FACILITY"
},
orderBy: "facilityName ASC",
entityName: "FacilityAndType",
viewSize: 100
}

const resp = await FacilityService.fetchFacilities(params)

if (!hasError(resp) && resp.data.count) {
facilities = resp.data.docs
total = resp.data.count
} else {
throw resp.data
}
} catch(error) {
logger.error(error)
}

commit(types.FACILITY_VIRTUAL_FACILITY_LIST_UPDATED , { facilities, total });
if (facilities.length) {
await dispatch('fetchVirtualFacilitiesAdditionalDetail')
}
},

async fetchVirtualFacilitiesAdditionalDetail({ commit, state }) {
let facilities = state.virtualFacilities.list;

try {
const params = {
inputFields: {
"statusId": "SERVICE_PENDING",
"systemJobEnumId": ["JOB_RLS_ORD_DTE", "JOB_BKR_ORD"],
"systemJobEnumId_op": "in",
},
orderBy: "runTime ASC",
entityName: "JobSandbox",
fieldList: ["jobId", "statusId", "serviceName", "systemJobEnumId", "runTime"],
viewSize: 10
}

let resp = await FacilityService.fetchJobs(params)
if (!hasError(resp) && resp.data.count) {
const jobs = resp.data.docs;
const brokeringJob = jobs.find((job: any) => job.systemJobEnumId === 'JOB_BKR_ORD');
const autoReleaseJob = jobs.find((job: any) => job.systemJobEnumId === 'JOB_RLS_ORD_DTE');

facilities.forEach((facility: any) => {
if (facility.facilityId === '_NA_') {
facility.brokeringJob = brokeringJob;
} else if (facility.facilityTypeId === 'BACKORDER') {
facility.autoReleaseJob = autoReleaseJob;
} else if (facility.facilityTypeId === 'PRE_ORDER') {
facility.autoReleaseJob = autoReleaseJob;
}
});
}

const payload = prepareOrderQuery({
viewSize: "0", // passing viewSize as 0, as we don't want to fetch any data
sort: 'orderDate asc',
defType: "edismax",
docType: "ORDER",
filters: {
'-shipmentMethodTypeId': { value: 'STOREPICKUP' },
orderStatusId: { value: '(ORDER_APPROVED OR ORDER_CREATED)' },
orderTypeId: { value: 'SALES_ORDER' },
},
facet: {
"facilityFacet": {
"field": "facilityId",
"mincount": 1,
"limit": -1,
"sort": "index",
"type": "terms",
"facet": {
"groups": "unique(orderId)",
}
}
}
})
resp = await FacilityService.fetchOrderCountsByFacility(payload);
if (!hasError(resp)) {
const facilityFacets = resp.data.facets.facilityFacet.buckets;
const facilityOrderCounts = facilityFacets.reduce((countObject: any, facet: any) => {
countObject[facet.val] = facet.groups;
return countObject;
}, {});

facilities = facilities.map((facility:any) => ({
...facility,
orderCount: facilityOrderCounts[facility.facilityId] || 0
}));
}
} catch(error) {
logger.error(error)
}
commit(types.FACILITY_VIRTUAL_FACILITY_LIST_UPDATED , { facilities });
}
}

Expand Down
3 changes: 3 additions & 0 deletions src/store/modules/facility/getters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ const getters: GetterTree <FacilityState, RootState> = {
getFacilities(state) {
return JSON.parse(JSON.stringify(state.facilities.list))
},
getVirtualFacilities(state) {
return JSON.parse(JSON.stringify(state.virtualFacilities.list))
},
getFacilityProductStores(state) {
return state.current.productStores
},
Expand Down
4 changes: 4 additions & 0 deletions src/store/modules/facility/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ const facilityModule: Module<FacilityState, RootState> = {
list: [],
total: 0
},
virtualFacilities: {
list: [],
total: 0
},
current: {}
},
getters,
Expand Down
1 change: 1 addition & 0 deletions src/store/modules/facility/mutation-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ export const FACILITY_SHOPIFY_MAPPINGS_UPDATED = SN_FACILITY + '/SHOPIFY_MAPPING
export const FACILITY_CALENDAR_UPDATED = SN_FACILITY + '/CALENDAR_UPDATED'
export const FACILITY_PARTIES_UPDATED = SN_FACILITY + '/PARTIES_UPDATED'
export const FACILITY_PRODUCT_STORES_UPDATED = SN_FACILITY + '/PRODUCT_STORES_UPDATED'
export const FACILITY_VIRTUAL_FACILITY_LIST_UPDATED = SN_FACILITY + '/VIRTUAL_FACILITY_LIST_UPDATED'
4 changes: 4 additions & 0 deletions src/store/modules/facility/mutations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,5 +40,9 @@ const mutations: MutationTree <FacilityState> = {
[types.FACILITY_PRODUCT_STORES_UPDATED](state, payload) {
state.current.productStores = payload
},
[types.FACILITY_VIRTUAL_FACILITY_LIST_UPDATED](state, payload) {
state.virtualFacilities.list = payload.facilities
state.virtualFacilities.total = payload.total
}
}
export default mutations;
59 changes: 59 additions & 0 deletions src/utils/solrHelper.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
const prepareOrderQuery = (params: any) => {
const viewSize = params.viewSize ? params.viewSize : process.env.VUE_APP_VIEW_SIZE;
const viewIndex = params.viewIndex ? params.viewIndex : 0;

const payload = {
"json": {
"params": {
"rows": viewSize,
"sort": params.sort ? params.sort : "reservedDatetime asc",
"group": true,
"group.field": params.groupBy ? params.groupBy : "orderId",
"group.limit": 1000,
"group.ngroups": true,
"q.op": "AND",
"start": viewIndex * viewSize
},
"query":"(*:*)",
"filter": [`docType: ${params.docType ? params.docType : 'OISGIR'}`]
}
} as any

if (params.queryString) {
payload.json.query = `(*${params.queryString}*) OR "${params.queryString}"^100`
payload.json.params['qf'] = params.queryFields ? params.queryFields : "productId productName virtualProductName orderId productSku customerId customerName search_orderIdentifications goodIdentifications"
payload.json.params['defType'] = "edismax"
}

// checking that if the params has filters, and then adding the filter values in the payload filter
// for each key present in the params filters
if (params.filters) {
Object.keys(params.filters).map((key: any) => {
const filterValue = params.filters[key].value;

if (Array.isArray(filterValue)) {
const filterOperator = params.filters[key].op ? params.filters[key].op : 'OR' ;
payload.json.filter += ` AND ${key}: (${filterValue.join(' ' + filterOperator + ' ')})`
} else {
payload.json.filter += ` AND ${key}: ${filterValue}`
}
})
}

if(params.facet) {
payload.json['facet'] = params.facet
}

return payload
}

const escapeSolrSpecialChars = (input: any) => {
const specialChars = ['\\', '+', '-', '&&', '||', '!', '(', ')', '{', '}', '[', ']', '^', '"', '~', '*', '?', ':'];

// Escape each special character in the input
const escapedInput = String(input).replace(new RegExp(`[${specialChars.join('\\')}]`, 'g'), '\\$&');
return escapedInput;
}

export { escapeSolrSpecialChars, prepareOrderQuery }

4 changes: 2 additions & 2 deletions src/views/FacilityManagement.vue
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@
</ion-item>
</ion-card>

<ion-card button @click="router.push('/find-parking')">
<ion-card button @click="router.push('/parking')">
<ion-item lines="none">
<ion-icon slot="start" :icon="golfOutline"/>
<h1>{{ translate("Parking") }}</h1>
</ion-item>
</ion-card>

<ion-card class="ion-hide" button @click="router.push('/find-parking')">
<ion-card class="ion-hide" button @click="router.push('/parking')">
<ion-item lines="none">
<ion-icon slot="start" :icon="golfOutline"/>
<ion-card-title>{{ translate("Parking") }}</ion-card-title>
Expand Down
Loading

0 comments on commit 93c8cd6

Please sign in to comment.