diff --git a/_LIMBO/esempio.htm b/_LIMBO/esempio.htm new file mode 100644 index 00000000..c5212398 --- /dev/null +++ b/_LIMBO/esempio.htm @@ -0,0 +1,467 @@ + + + + + + Carrello Prodotti - Design Moderno + + + + +
+
+

+ + Il Tuo Carrello +

+

Gestisci i tuoi prodotti preferiti

+
+ +
+ +

Il tuo carrello è vuoto

+

Aggiungi alcuni prodotti per iniziare!

+
+ +
+ +
+
€0.00
+

0 articoli nel carrello

+ +
+
+ + + + \ No newline at end of file diff --git a/src/common/shared_vuejs.ts b/src/common/shared_vuejs.ts index 518fecc6..84deb110 100755 --- a/src/common/shared_vuejs.ts +++ b/src/common/shared_vuejs.ts @@ -2533,6 +2533,11 @@ export const shared_consts = { WEB: 1, STAMPA: 2, }, - PUNTI_PER_POLLICE: 96 + PUNTI_PER_POLLICE: 96, + + SCONTI_APPLICA: { + NESSUNO: 0, + A_TUTTI: 1, + } } diff --git a/src/components/CCart/CCart.ts b/src/components/CCart/CCart.ts index f8ced47f..01c0b243 100755 --- a/src/components/CCart/CCart.ts +++ b/src/components/CCart/CCart.ts @@ -1,21 +1,21 @@ -import { defineComponent, onMounted, ref, computed, watch } from 'vue' -import { tools } from '@tools' -import { useUserStore } from '@store/UserStore' -import { useRouter } from 'vue-router' -import { useGlobalStore } from '@store/globalStore' -import { useProducts } from '@store/Products' -import { useI18n } from 'vue-i18n' -import { toolsext } from '@store/Modules/toolsext' -import { useQuasar } from 'quasar' -import { costanti } from '@costanti' +import { defineComponent, onMounted, ref, computed, watch } from 'vue'; +import { tools } from '@tools'; +import { useUserStore } from '@store/UserStore'; +import { useRouter } from 'vue-router'; +import { useGlobalStore } from '@store/globalStore'; +import { useProducts } from '@store/Products'; +import { useI18n } from 'vue-i18n'; +import { toolsext } from '@store/Modules/toolsext'; +import { useQuasar } from 'quasar'; +import { costanti } from '@costanti'; import type { ICart, IOrder, IOrderCart, IProduct } from '@src/model/Products'; -import { IShareWithUs } from '@src/model/Products' +import { IShareWithUs } from '@src/model/Products'; -import { shared_consts } from '@src/common/shared_vuejs' +import { shared_consts } from '@src/common/shared_vuejs'; -import { CSingleCart } from '../CSingleCart' -import { CTitleBanner } from '@src/components/CTitleBanner' -import { CSelectUserActive } from '@src/components/CSelectUserActive' +import { CSingleCart } from '../CSingleCart'; +import { CTitleBanner } from '@src/components/CTitleBanner'; +import { CSelectUserActive } from '@src/components/CSelectUserActive'; export default defineComponent({ name: 'CCart', @@ -30,148 +30,160 @@ export default defineComponent({ required: false, default: null, }, - }, components: { CSingleCart, CTitleBanner, CSelectUserActive }, setup(props) { - const userStore = useUserStore() - const globalStore = useGlobalStore() - const productStore = useProducts() - const $router = useRouter() - const $q = useQuasar() + const userStore = useUserStore(); + const globalStore = useGlobalStore(); + const productStore = useProducts(); + const $router = useRouter(); + const $q = useQuasar(); const { t } = useI18n(); - const mycart = ref({}) - const myrec = ref([]) - const oldrec = ref([]) - const note = ref('') - const endload = ref(false) - const recOrderCart = ref({}) + const mycart = ref({}); + const myrec = ref([]); + const oldrec = ref([]); + const note = ref(''); + const codice_sconto = ref(''); + const endload = ref(false); + const caricamentodati = ref(false); + const recOrderCart = ref({}); - const search = ref('') + const search = ref(''); - const isfinishLoading = computed(() => globalStore.finishLoading) + const isfinishLoading = computed(() => globalStore.finishLoading); - watch(() => isfinishLoading.value, (newval: boolean, oldval: boolean) => { - if (isfinishLoading.value) { - load() + watch( + () => isfinishLoading.value, + (newval: boolean, oldval: boolean) => { + if (isfinishLoading.value) { + load(); + } } - }) + ); const statusnow = computed(() => (): number => { if (recOrderCart.value) { - return recOrderCart.value.status + return recOrderCart.value.status; } - return 0 - }) + return 0; + }); function mounted() { // Inizializza - load() + load(); } function getOrdersCart() { if (props.iscash) { - return productStore.getOrdersCartById(props.idOrdersCart) + return productStore.getOrdersCartById(props.idOrdersCart); } else { - return productStore.getCart() + return productStore.getCart(); } - } function getItemsCart() { - const cart = getOrdersCart() - return cart.items || null + const cart = getOrdersCart(); + return cart.items || null; } function getNumItems(): number { - const cart = getOrdersCart() - if (cart.items) - return cart.items.length || 0 - else - return 0 + const cart = getOrdersCart(); + if (cart.items) return cart.items.length || 0; + else return 0; } function getCart(): ICart { - return getOrdersCart() + return getOrdersCart(); } function getNote() { - const cart = getOrdersCart() - return cart.note + const cart = getOrdersCart(); + return cart.note; } function change_field(fieldname: string) { if (myrec.value[fieldname] !== oldrec.value[fieldname]) { - myrec.value[fieldname] = oldrec.value[fieldname] + myrec.value[fieldname] = oldrec.value[fieldname]; const mydata = { - [fieldname]: myrec.value[fieldname] - } + [fieldname]: myrec.value[fieldname], + }; - const aggiorna = fieldname !== 'status' - tools.saveFieldToServer($q, 'carts', mycart.value._id, mydata, aggiorna) - oldrec.value[fieldname] = myrec.value[fieldname] + const aggiorna = fieldname !== 'status'; + tools.saveFieldToServer($q, 'carts', mycart.value._id, mydata, aggiorna); + oldrec.value[fieldname] = myrec.value[fieldname]; } } function myTotalPrice(): string { if (productStore.cart && productStore.cart.totalPrice) { - return productStore.cart.totalPrice.toFixed(2) + return productStore.cart.totalPrice.toFixed(2); } else { - return '0' + return '0'; } } function myTotalQty(): number { if (productStore.cart) { - return productStore.cart.totalQty! + return productStore.cart.totalQty!; } else { - return 0 + return 0; + } + } + async function aggiornaCarrello() { + if (mycart.value) { + recOrderCart.value = await productStore.CreateOrdersCart({ + cart_id: mycart.value._id, + status: 0, + note: note.value, + }); } } async function load() { if (isfinishLoading.value) { - console.log('Load CCART') - mycart.value = getCart() - myrec.value = Object.keys(mycart) - oldrec.value = myrec.value - note.value = mycart.value.note! + console.log('Load CCART'); + mycart.value = getCart(); + myrec.value = Object.keys(mycart); + oldrec.value = myrec.value; + note.value = mycart.value.note!; + // codice_sconto.value = mycart.value.codice_sconto!; const options = {}; - if (mycart.value) { - recOrderCart.value = await productStore.CreateOrdersCart({ cart_id: mycart.value._id, status: 0, note: note.value }) - } + aggiornaCarrello(); // console.log('myrec', myrec.value) - endload.value = true + endload.value = true; } } function CanBeShipped() { - return productStore.cart.items ? productStore.cart.items.filter((rec: any) => rec.order.product.canBeShipped).length : false + return productStore.cart.items + ? productStore.cart.items.filter((rec: any) => rec.order.product.canBeShipped) + .length + : false; } function CanBeBuyOnline() { - return productStore.cart.items ? productStore.cart.items.filter((rec: any) => rec.order.product.canBeBuyOnline).length : false + return productStore.cart.items + ? productStore.cart.items.filter((rec: any) => rec.order.product.canBeBuyOnline) + .length + : false; } function getnumsteps() { - let numsteps = 1 + let numsteps = 1; - if (CanBeShipped()) - numsteps++ - if (CanBeBuyOnline()) - numsteps++ + if (CanBeShipped()) numsteps++; + if (CanBeBuyOnline()) numsteps++; - return numsteps + return numsteps; } function docheckout() { - // Può essere spedito? if (CanBeShipped()) { @@ -188,40 +200,53 @@ export default defineComponent({ message: t('ecomm.conferma_acq', { qty: myTotalQty() }), ok: { label: t('dialog.yes'), - push: true + push: true, }, cancel: { - label: t('dialog.cancel') + label: t('dialog.cancel'), }, - title: t('ecomm.order') + title: t('ecomm.order'), }).onOk(async () => { - const status = shared_consts.OrderStatus.CHECKOUT_SENT + const status = shared_consts.OrderStatus.CHECKOUT_SENT; - recOrderCart.value = await productStore.CreateOrdersCart({ cart_id: mycart.value._id, status, note: note.value }) + try { + caricamentodati.value = true; - // statusnow.value = myordercart ? myordercart.status : 0 + recOrderCart.value = await productStore.CreateOrdersCart({ + cart_id: mycart.value._id, + status, + note: note.value, + codice_sconto: codice_sconto.value, + }); - if (recOrderCart.value.status === status) { - tools.showPositiveNotif($q, t('ecomm.ord_confirmed')) - setTimeout(() => { - $router.push('/orderinfo') - }, 2000) - } else { - tools.showNegativeNotif($q, t('ecomm.ord_not_confirmed')) + // statusnow.value = myordercart ? myordercart.status : 0 + + if (recOrderCart.value.status === status) { + tools.showPositiveNotif($q, t('ecomm.ord_confirmed')); + setTimeout(() => { + $router.push('/orderinfo'); + }, 2000); + } else { + tools.showNegativeNotif($q, t('ecomm.ord_not_confirmed')); + } + } catch (e) { + console.error('Err', e); + } finally { + caricamentodati.value = false; } // change_field('status') // change_field('status') - }) + }); } function getActualIdStorehouse(myprod: IProduct) { // Ottieni il negozio attualmente selezionato: // Se ce n'è solo 1 allora prendi quello ! if (myprod.storehouses.length === 1) { - return myprod.storehouses[0]._id + return myprod.storehouses[0]._id; } else { // Ottieni il negozio attualmente scelto ! - return '' + return ''; } } @@ -229,10 +254,10 @@ export default defineComponent({ // Ottieni il negozio attualmente selezionato: // Se ce n'è solo 1 allora prendi quello ! if (myprod.gasordine) { - return myprod.gasordine._id + return myprod.gasordine._id; } else { // Ottieni il gasordine attualmente scelto ! - return '' + return ''; } } @@ -242,18 +267,111 @@ export default defineComponent({ const myprod = productStore.getProductByCode(lowerSearchText); if (myprod && myprod.active) { const myorder: IOrder = { - quantity: 1, quantitypreordered: 0, - TotalPriceProduct: 0, TotalPriceProductCalc: 0, price: 0, + quantity: 1, + quantitypreordered: 0, + TotalPriceProduct: 0, + TotalPriceProductCalc: 0, + price: 0, idStorehouse: getActualIdStorehouse(myprod), idGasordine: getActualGasordine(myprod), - } - await productStore.addtoCartBase({ $q, t, id: myprod._id, order: myorder, addqty: true }) - search.value = '' - load() + }; + await productStore.addtoCartBase({ + $q, + t, + id: myprod._id, + order: myorder, + addqty: true, + }); + search.value = ''; + load(); } } - onMounted(mounted) + function esportaCsv() { + const csvRows: string[] = []; + const sep = '|'; + const headers = `Num${sep}Codice${sep}Titolo${sep}Quantità${sep}Prezzo${sep}Totale\n`; + csvRows.push(headers); + + let index = 1 + for (const itemorder of getItemsCart()) { + const productCode = itemorder.order.product?.productInfo.code || ''; + const productName = itemorder.order.product?.productInfo.name || ''; + const quantity = itemorder.order.quantity + itemorder.order.quantitypreordered; + const price = Number(itemorder.order.price).toFixed(2); + const totalPrice = (price * quantity).toFixed(2); + + const row = `${index}${sep}${productCode}${sep}${productName}${sep}${quantity}${sep}${price}${sep}${totalPrice}\n`; + csvRows.push(row); + index++; + } + + const totalQuantity = getItemsCart().reduce((sum, itemorder) => sum + itemorder.order.quantity + itemorder.order.quantitypreordered, 0); + const totalAmount = getItemsCart().reduce((sum, itemorder) => sum + parseFloat((itemorder.order.price * (itemorder.order.quantity + itemorder.order.quantitypreordered)).toFixed(2)), 0); + + const totalRow = `${sep}${sep}Totale${sep}${totalQuantity}${sep}${sep}${totalAmount.toFixed(2)}\n`; + csvRows.push(totalRow); + + + console.log('csvRows', csvRows) + + const csvContent = csvRows.join('').trim(); + + const today = new Date(); + tools.createAndDownloadCSVFromData( + csvContent, + `ordine_${today.getFullYear()}-${today.getMonth() + 1}-${today.getDate()}` + ); + } + + async function applicaSconto(codice: string) { + try { + caricamentodati.value = true; + const rissconto = await productStore.ApplicaSconto({ + cart_id: mycart.value._id, + codice_sconto: codice, + }); + + if (rissconto) { + if (rissconto.msg) { + tools.showNeutralNotif($q, `${rissconto.msg}`); + } else if (rissconto.valido && rissconto.mycart) { + tools.showPositiveNotif($q, 'Sconto Applicato!'); + } else { + tools.showNegativeNotif($q, `${rissconto.errmsg}`); + } + codice_sconto.value = ''; + if (rissconto.mycart) recOrderCart.value = rissconto.mycart; + } + } catch (error) { + console.log('error ApplicaSconto', error); + tools.showNegativeNotif($q, `Sconto Non Applicato! ${error.message}`); + codice_sconto.value = ''; + } finally { + caricamentodati.value = false; + } + } + + async function confermaCodiceSconto() { + await applicaSconto(codice_sconto.value); + } + + async function rimuoviCodiceSconto() { + $q.dialog({ + message: `Vuoi rimuovere il codice sconto "${recOrderCart.value.codice_sconto}"?`, + ok: { + label: 'Si', + push: true, + }, + cancel: { + label: 'No', + }, + }).onOk(async () => { + await applicaSconto('RIMUOVI'); + }); + } + + onMounted(mounted); return { userStore, @@ -277,6 +395,11 @@ export default defineComponent({ insertArticolo, globalStore, isfinishLoading, - } - } -}) + esportaCsv, + codice_sconto, + confermaCodiceSconto, + rimuoviCodiceSconto, + caricamentodati, + }; + }, +}); diff --git a/src/components/CCart/CCart.vue b/src/components/CCart/CCart.vue index 7ab56e0c..de4ae8bd 100755 --- a/src/components/CCart/CCart.vue +++ b/src/components/CCart/CCart.vue @@ -1,107 +1,204 @@ - +