From 47a5abf1e359bd7d9c566ed291f01593e1b20a12 Mon Sep 17 00:00:00 2001 From: wbuezas Date: Tue, 1 Apr 2025 16:43:06 +0200 Subject: [PATCH 1/9] WIP --- src/pages/Ecomerce/CatalogView.vue | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/pages/Ecomerce/CatalogView.vue b/src/pages/Ecomerce/CatalogView.vue index 92a63858..a5fe7c11 100644 --- a/src/pages/Ecomerce/CatalogView.vue +++ b/src/pages/Ecomerce/CatalogView.vue @@ -328,6 +328,7 @@ import useNotify from 'src/composables/useNotify.js'; import debounce from 'src/utils/debouncer.js'; const jApi = inject('jApi'); +const api = inject('api'); const { t } = useI18n(); const appStore = useAppStore(); const userStore = useUserStore(); @@ -621,14 +622,29 @@ const debouncedGetFilters = debounce(getFilters, 400); const getOrder = async () => { try { if (!basketOrderId.value) return; - const [data] = await jApi.query( - `SELECT o.id, o.sent, ad.nickname, o.addressFk, o.agencyModeFk - FROM myOrder o - LEFT JOIN myAddress ad ON ad.id = o.addressFk - WHERE o.id = #orderId`, - { orderId: basketOrderId.value } - ); + order.value = data; + const filter = { + include: [ + { + relation: 'address', + scope: { + fields: ['nickname', 'city', 'street'] + } + } + ], + where: { + id: basketOrderId.value + }, + fields: ['id', 'sent', 'addressFk', 'agencyModeFk', 'nickname'] + }; + + const { data } = await api.get('Orders', { + params: { + filter: JSON.stringify(filter), + orderFk: basketOrderId.value + } + }); } catch (error) { console.error('Error getting order:', error); } -- 2.40.1 From 509a7870a93c023d968e10756e5303cb17715505 Mon Sep 17 00:00:00 2001 From: wbuezas Date: Wed, 2 Apr 2025 15:20:25 +0200 Subject: [PATCH 2/9] WIP --- src/pages/Ecomerce/CatalogCard.vue | 4 +- src/pages/Ecomerce/CatalogView.vue | 150 ++++++++++++++++------------- 2 files changed, 85 insertions(+), 69 deletions(-) diff --git a/src/pages/Ecomerce/CatalogCard.vue b/src/pages/Ecomerce/CatalogCard.vue index 9c93495b..0e795c2f 100644 --- a/src/pages/Ecomerce/CatalogCard.vue +++ b/src/pages/Ecomerce/CatalogCard.vue @@ -37,7 +37,7 @@ const { t } = useI18n(); >
- {{ item.item }} + {{ item.name }}
diff --git a/src/pages/Ecomerce/CatalogView.vue b/src/pages/Ecomerce/CatalogView.vue index a5fe7c11..07a1d12b 100644 --- a/src/pages/Ecomerce/CatalogView.vue +++ b/src/pages/Ecomerce/CatalogView.vue @@ -92,7 +92,7 @@ @click="selectedCategory = cat.id" data-cy="catalogCategoryButton" > - + {{ cat.name }}
@@ -577,38 +577,26 @@ const getItems = async () => { if (!basketOrderId.value || !isSomeFilterSelected.value) return; loading.value = true; - const res = await jApi.execQuery( - `DROP TEMPORARY TABLE IF EXISTS tmp.item; - CREATE TEMPORARY TABLE tmp.item - (INDEX (itemFk)) - ENGINE = MEMORY - SELECT i.id itemFk - FROM vn.item i - JOIN vn.itemType t ON t.id = i.typeFk - WHERE (${queryFilter.value}); - CALL myOrder_calcCatalogFull(#orderId); - SELECT i.id, i.longName item, i.subName, - i.tag5, i.value5, i.tag6, i.value6, - i.tag7, i.value7, i.tag8, i.value8, - i.relevancy, i.size, i.category, b.minQuantity, - k.name ink, p.name producer, o.name origin, - b.available, b.price, b.grouping, - i.image, im.updated - FROM tmp.ticketCalculateItem b - JOIN vn.item i ON i.id = b.itemFk - LEFT JOIN vn.ink k ON k.id = i.inkFk - LEFT JOIN vn.producer p ON p.id = i.producerFk - LEFT JOIN vn.origin o ON o.id = i.originFk - LEFT JOIN image im ON im.collectionFk = 'catalog' - AND im.name = i.image - WHERE b.available > 0 - ORDER BY ${selectedOrderBy.value} - LIMIT 5000; - DROP TEMPORARY TABLE tmp.item; - CALL vn.ticketCalculatePurge();`, - { orderId: basketOrderId.value } - ); - items.value = res.results[3].data; + const { data } = await api.get('Orders/catalogFilter', { + params: { + orderFk: basketOrderId.value, + orderBy: JSON.stringify({ + field: 'relevancy DESC, name', + way: 'ASC', + isTag: false + }), + filter: { + where: { + and: [ + { typeFk: selectedType.value }, + { categoryFk: selectedCategory.value } + ] + } + } + } + }); + + items.value = data; await onItemsFetched(); loading.value = false; } catch (error) { @@ -623,7 +611,6 @@ const getOrder = async () => { try { if (!basketOrderId.value) return; - order.value = data; const filter = { include: [ { @@ -645,6 +632,8 @@ const getOrder = async () => { orderFk: basketOrderId.value } }); + + order.value = data; } catch (error) { console.error('Error getting order:', error); } @@ -652,13 +641,25 @@ const getOrder = async () => { const getCategories = async () => { try { - categories.value = await jApi.query( - `SELECT c.id, l.name, c.color, c.code - FROM vn.itemCategory c - JOIN vn.itemCategoryL10n l ON l.id = c.id - WHERE c.display - ORDER BY display` - ); + const { data } = await api.get('itemCategories', { + params: { + filter: JSON.stringify({ + order: 'display ASC', + include: { + relation: 'itemTypes', + scope: { + fields: ['code', 'name'] + } + } + }) + } + }); + categories.value = data.map(category => { + return { + ...category, + icon: category.icon.split('-')[1] + }; + }); } catch (error) { console.error('Error getting categories:', error); } @@ -667,23 +668,15 @@ const getCategories = async () => { const getItemFamilies = async () => { try { if (!selectedCategory.value || !basketOrderId.value) return; - const res = await jApi.execQuery( - `CALL myOrder_getAvailable(#orderId); - SELECT DISTINCT t.id, l.name - FROM vn.item i - JOIN vn.itemType t ON t.id = i.typeFk - JOIN tmp.itemAvailable a ON a.id = i.id - JOIN vn.itemTypeL10n l ON l.id = t.id - WHERE t.order >= 0 - AND t.categoryFk = #category - ORDER BY t.order, l.name ASC; - DROP TEMPORARY TABLE tmp.itemAvailable`, + + const { data } = await api.get( + `Orders/${basketOrderId.value}/getItemTypeAvailable`, { - category: selectedCategory.value, - orderId: basketOrderId.value + params: { itemCategoryId: selectedCategory.value } } ); - itemFamilies.value = res.results[1].data; + + itemFamilies.value = data; } catch (error) { console.error('Error getting available items:', error); } @@ -706,7 +699,19 @@ const getItemColors = async () => { orderId: basketOrderId.value } ); + + // const { data } = await api.get('Inks', { + // params: { + // filter: JSON.stringify({ + // where: { + // 't.categoryFk': selectedCategory.value + // } + // }) + // } + // }); + // console.log('ink data: ', data); itemColors.value = res.results[1].data; + // console.log('itemColors: ', itemColors.value); } catch (error) { console.error('Error getting available items:', error); } @@ -815,19 +820,30 @@ const onCategoryChange = () => { const getItemTags = async itemFk => { try { - const tags = await jApi.query( - `SELECT l.name, it.value - FROM vn.itemTag it - JOIN vn.tag t ON t.id = it.tagFk - JOIN vn.tagL10n l ON l.id = t.id - WHERE it.itemFk = #itemFk - AND priority >= 0 - ORDER BY it.priority`, - { - itemFk + const { data } = await api.get('ItemTags', { + params: { + filter: JSON.stringify({ + where: { + itemFk + }, + include: [ + { + relation: 'tag', + scope: { + fields: ['name'] + } + } + ] + }) } - ); - return tags; + }); + + return data.map(tag => { + return { + name: tag?.tag?.name, + value: tag.value + }; + }); } catch (error) { console.error('Error getting available items:', error); } -- 2.40.1 From a1b54d50b5ef464acd4cace7d1f98818ad86ef65 Mon Sep 17 00:00:00 2001 From: wbuezas Date: Wed, 2 Apr 2025 15:37:12 +0200 Subject: [PATCH 3/9] Fix order by --- src/pages/Ecomerce/CatalogView.vue | 87 ++++++++++++++++++++++++------ 1 file changed, 71 insertions(+), 16 deletions(-) diff --git a/src/pages/Ecomerce/CatalogView.vue b/src/pages/Ecomerce/CatalogView.vue index 07a1d12b..3e8e959d 100644 --- a/src/pages/Ecomerce/CatalogView.vue +++ b/src/pages/Ecomerce/CatalogView.vue @@ -362,48 +362,99 @@ const producer = ref(null); const origin = ref(null); const subcategory = ref(null); // Order by options -const orderBy = ref('i.relevancy DESC, longName'); +const orderBy = ref({ + field: 'relevancy DESC, name', + way: 'ASC', + isTag: false +}); const orderByOptions = ref([ { label: t('relevancy'), - value: 'i.relevancy DESC, longName' + value: { + field: 'relevancy DESC, name', + way: 'ASC', + isTag: false + } }, { label: t('name'), - value: 'longName ASC' + value: { + field: 'name', + way: 'ASC', + isTag: false + } }, { label: t('lowerSize'), - value: 'size ASC' + value: { + field: 'i.size', + way: 'ASC', + isTag: false + } }, { label: t('higherSize'), - value: 'size DESC' + value: { + field: 'i.size', + way: 'DESC', + isTag: false + } }, { label: t('lowerPrice'), - value: 'price ASC' + value: { + field: 'price', + way: 'ASC', + isTag: false + } }, { label: t('higherPrice'), - value: 'price DESC' + value: { + field: 'price', + way: 'DESC', + isTag: false + } }, { label: t('available'), - value: 'available' + value: { + field: 'available', + way: 'ASC', + isTag: false + } + }, + { + label: t('color'), + value: { + field: 'i.inkFk', + way: 'ASC', + isTag: false + } }, - { label: t('color'), value: 'ink ASC' }, { label: t('producer'), - value: 'producer ASC' + value: { + field: 'producerFk', + way: 'ASC', + isTag: false + } }, { label: t('origin'), - value: 'origin ASC' + value: { + field: 'originFk', + way: 'ASC', + isTag: false + } }, { label: t('category'), - value: 'category ASC' + value: { + field: 'categoryFk', + way: 'ASC', + isTag: false + } } ]); @@ -494,7 +545,11 @@ const selectedOrderBy = computed({ if (value) { orderBy.value = value; } else { - orderBy.value = 'i.relevancy DESC, longName'; + orderBy.value = { + field: 'relevancy DESC, name', + way: 'ASC', + isTag: false + }; } debouncedGetItems(); } @@ -581,9 +636,9 @@ const getItems = async () => { params: { orderFk: basketOrderId.value, orderBy: JSON.stringify({ - field: 'relevancy DESC, name', - way: 'ASC', - isTag: false + field: selectedOrderBy.value.field, + way: selectedOrderBy.value.way, + isTag: selectedOrderBy.value.isTag }), filter: { where: { -- 2.40.1 From ad767ecd2b6cd4c7354968e14f6bc7660e66cc69 Mon Sep 17 00:00:00 2001 From: wbuezas Date: Wed, 9 Apr 2025 10:26:34 +0200 Subject: [PATCH 4/9] catalog view migration --- src/composables/serviceUtils.js | 2 + src/pages/Ecomerce/CatalogView.vue | 183 ++++++++++++----------------- 2 files changed, 78 insertions(+), 107 deletions(-) diff --git a/src/composables/serviceUtils.js b/src/composables/serviceUtils.js index ce124398..d1c27a3c 100644 --- a/src/composables/serviceUtils.js +++ b/src/composables/serviceUtils.js @@ -45,6 +45,8 @@ async function fetch({ }); } + params.filter = params.filter || {}; + if (params.filter?.where || exprFilter) { params.filter.where = { ...params.filter.where, ...exprFilter }; } diff --git a/src/pages/Ecomerce/CatalogView.vue b/src/pages/Ecomerce/CatalogView.vue index 3e8e959d..915c34cf 100644 --- a/src/pages/Ecomerce/CatalogView.vue +++ b/src/pages/Ecomerce/CatalogView.vue @@ -210,7 +210,7 @@ />
- {{ selectedItem.item }} + {{ selectedItem.name }}
{ await Promise.allSettled(promises); }; +const getItemExprBuilder = (param, value) => { + if (param === 'orderFk' || param === 'orderBy') return; + else return { [param]: value }; +}; + const getItems = async () => { try { if (!basketOrderId.value || !isSomeFilterSelected.value) return; loading.value = true; - const { data } = await api.get('Orders/catalogFilter', { - params: { - orderFk: basketOrderId.value, - orderBy: JSON.stringify({ - field: selectedOrderBy.value.field, - way: selectedOrderBy.value.way, - isTag: selectedOrderBy.value.isTag - }), - filter: { - where: { - and: [ - { typeFk: selectedType.value }, - { categoryFk: selectedCategory.value } - ] - } - } - } + const params = { + orderFk: basketOrderId.value, + orderBy: JSON.stringify({ + field: selectedOrderBy.value.field, + way: selectedOrderBy.value.way, + isTag: selectedOrderBy.value.isTag + }), + typeFk: selectedType.value, + categoryFk: selectedCategory.value, + inkFk: selectedColor.value, + producerFk: selectedProducer.value, + originFk: selectedOrigin.value + }; + const { data } = await fetch({ + url: 'Orders/catalogFilter', + params, + exprBuilder: getItemExprBuilder }); items.value = data; @@ -740,35 +746,17 @@ const getItemFamilies = async () => { const getItemColors = async () => { try { if (!selectedCategory.value || !basketOrderId.value) return; - const res = await jApi.execQuery( - `CALL myOrder_getAvailable(#orderId); - SELECT DISTINCT l.id, l.name - FROM vn.item i - JOIN vn.itemType t ON t.id = i.typeFk - JOIN tmp.itemAvailable a ON a.id = i.id - JOIN vn.inkL10n l ON l.id = i.inkFk - WHERE (${queryFilter.value}) - ORDER BY name ASC; - DROP TEMPORARY TABLE tmp.itemAvailable;`, - { - orderId: basketOrderId.value - } - ); - // const { data } = await api.get('Inks', { - // params: { - // filter: JSON.stringify({ - // where: { - // 't.categoryFk': selectedCategory.value - // } - // }) - // } - // }); - // console.log('ink data: ', data); - itemColors.value = res.results[1].data; - // console.log('itemColors: ', itemColors.value); + const { data } = await api.get('Orders/getItemsColorsAvailable', { + params: { + orderId: basketOrderId.value, + whereFilter: queryFilter.value + } + }); + + itemColors.value = data; } catch (error) { - console.error('Error getting available items:', error); + console.error('Error getting items colors:', error); } }; @@ -785,59 +773,45 @@ const onItemsFetched = async () => { const getProducers = async () => { try { - const res = await jApi.execQuery( - `CALL myOrder_getAvailable(#orderId); - SELECT DISTINCT p.id, p.name - FROM vn.item i - JOIN vn.itemType t ON t.id = i.typeFk - JOIN tmp.itemAvailable a ON a.id = i.id - JOIN vn.producer p ON p.id = i.producerFk - WHERE (${queryFilter.value}) - ORDER BY name ASC; - DROP TEMPORARY TABLE tmp.itemAvailable;`, - { orderId: basketOrderId.value } - ); - itemProducers.value = res.results[1].data; + const { data } = await api.get('Orders/getItemsProducersAvailable', { + params: { + orderId: basketOrderId.value, + whereFilter: queryFilter.value + } + }); + itemProducers.value = data; } catch (error) { - console.error('Error getting productors:', error); + console.error('Error getting producers:', error); } }; const getOrigins = async () => { try { - const res = await jApi.execQuery( - `CALL myOrder_getAvailable(#orderId); - SELECT DISTINCT o.id, l.name, o.code - FROM vn.item i - JOIN vn.itemType t ON t.id = i.typeFk - JOIN tmp.itemAvailable a ON a.id = i.id - JOIN vn.origin o ON o.id = i.originFk - JOIN vn.originL10n l ON l.id = o.id - WHERE (${queryFilter.value}) - ORDER BY name ASC; - DROP TEMPORARY TABLE tmp.itemAvailable;`, - { orderId: basketOrderId.value } - ); - itemOrigins.value = res.results[1].data; + const { data } = await api.get('Orders/getItemsOriginsAvailable', { + params: { + orderId: basketOrderId.value, + whereFilter: queryFilter.value + } + }); + itemOrigins.value = data; } catch (error) { - console.error('Error getting productors:', error); + console.error('Error getting origins:', error); } }; const getSubcategories = async () => { try { - const res = await jApi.execQuery( - `CALL myOrder_getAvailable(#orderId); - SELECT DISTINCT i.category - FROM vn.item i - JOIN vn.itemType t ON t.id = i.typeFk - JOIN tmp.itemAvailable a ON a.id = i.id - WHERE (${queryFilter.value}) - ORDER BY category ASC; - DROP TEMPORARY TABLE tmp.itemAvailable;`, - { orderId: basketOrderId.value } + const { data } = await api.get( + 'Orders/getItemsSubcategoriesAvailable', + { + params: { + orderId: basketOrderId.value, + whereFilter: queryFilter.value + } + } ); - const filtered = res.results[1].data.filter(item => item.category); + + const filtered = data.filter(item => item.category); itemSubcategories.value = filtered.map(i => i.category); } catch (error) { console.error('Error getting subcategories:', error); @@ -906,23 +880,13 @@ const getItemTags = async itemFk => { const calcItem = async itemId => { try { - const res = await jApi.execQuery( - `CALL myOrder_calcCatalogFromItem(#orderId, #itemId); - SELECT l.warehouseFk, w.name warehouse, p.grouping, - p.price, p.priceKg, p.rate, l.available - FROM tmp.ticketLot l - JOIN tmp.ticketComponentPrice p ON p.warehouseFk = l.warehouseFk - JOIN vn.warehouse w ON w.id = p.warehouseFk - ORDER BY warehouseFk, grouping; - DROP TEMPORARY TABLE - tmp.ticketCalculateItem, - tmp.ticketComponentPrice, - tmp.ticketComponent, - tmp.ticketLot, - tmp.zoneGetShipped;`, - { orderId: basketOrderId.value, itemId } - ); - return res.results[1].data; + const { data } = await api.get('Orders/getCalcFromItem', { + params: { + orderId: basketOrderId.value, + itemId + } + }); + return data; } catch (error) { console.error('Error getting items:', error); } @@ -962,10 +926,15 @@ const resetAmounts = () => { const addItemToOrder = async params => { try { - await jApi.execQuery( - `CALL myOrder_addItem(#orderId, #warehouse, #item, #amount);`, - params - ); + await api.post('applications/myOrder_addItem/execute-proc', { + schema: 'hedera', + params: [ + params.orderId, + params.warehouse, + params.item, + params.amount + ] + }); } catch (error) { console.error('Error adding item to basket:', error); throw error; @@ -993,7 +962,7 @@ const onConfirmClick = async params => { if (amountSum > 0) { await Promise.all(addItemPromises); notify( - `${t('added')} ${amountSum} ${selectedItem.value.item}`, + `${t('added')} ${amountSum} ${selectedItem.value.name}`, 'positive' ); } -- 2.40.1 From a227bc34fa5352f568ede5975da442b26a8a874f Mon Sep 17 00:00:00 2001 From: wbuezas Date: Sun, 13 Apr 2025 12:39:46 +0200 Subject: [PATCH 5/9] Move template tag --- src/pages/Ecomerce/CatalogView.vue | 610 ++++++++++++++--------------- 1 file changed, 305 insertions(+), 305 deletions(-) diff --git a/src/pages/Ecomerce/CatalogView.vue b/src/pages/Ecomerce/CatalogView.vue index 915c34cf..ac990aed 100644 --- a/src/pages/Ecomerce/CatalogView.vue +++ b/src/pages/Ecomerce/CatalogView.vue @@ -1,308 +1,3 @@ - - + +