From d99ad47483278b4edbd844d9b410d23c191a36c9 Mon Sep 17 00:00:00 2001 From: Surya Paolo Date: Wed, 11 Jun 2025 01:05:20 +0200 Subject: [PATCH] - corretto la gestione degli Sconti - Duplicare un Catalogo --- src/components/CCart/CCart.scss | 32 +++- src/components/CCart/CCart.ts | 50 ++++-- src/components/CCart/CCart.vue | 157 +++++++++--------- src/components/CGridTableRec/CGridTableRec.ts | 6 + src/components/CMyCart/CMyCart.vue | 3 +- .../CMyRecCatalog/CMyRecCatalog.vue | 14 +- src/components/CSingleCart/CSingleCart.scss | 32 ++-- src/components/CSingleCart/CSingleCart.ts | 28 +++- src/components/CSingleCart/CSingleCart.vue | 39 ++--- src/css/app.scss | 52 +++++- src/model/GlobalStore.ts | 1 + src/model/Products.ts | 1 + src/statics/lang/it.js | 4 +- src/store/Modules/fieldsTable.ts | 11 ++ src/store/Products.ts | 7 +- src/views/ecommerce/orderInfo/orderInfo.ts | 1 + src/views/ecommerce/orderInfo/orderInfo.vue | 5 + 17 files changed, 296 insertions(+), 147 deletions(-) diff --git a/src/components/CCart/CCart.scss b/src/components/CCart/CCart.scss index 34bd4618..248ef8de 100755 --- a/src/components/CCart/CCart.scss +++ b/src/components/CCart/CCart.scss @@ -22,4 +22,34 @@ $heightBtn: 100%; .strong { color: #d9534f; /* Rosso */ font-weight: bold; /* Testo in grassetto */ -} \ No newline at end of file +} + +.sconto-label{ + font-weight: bold; + margin-left: 5px; +} + +.sconto-text{ + font-weight: bold; + font-size: 1rem; +} + +.table { + margin: auto; + border-collapse: collapse; +} + +.table td { + padding: 8px; + text-align: right; + vertical-align: middle; +} + +.label { + font-weight: bold; +} + +.value { + font-size: 1.2em; + text-align: right; +} diff --git a/src/components/CCart/CCart.ts b/src/components/CCart/CCart.ts index 01c0b243..bff4fe77 100755 --- a/src/components/CCart/CCart.ts +++ b/src/components/CCart/CCart.ts @@ -45,6 +45,7 @@ export default defineComponent({ const oldrec = ref([]); const note = ref(''); const codice_sconto = ref(''); + const descr_sconto = ref(''); const endload = ref(false); const caricamentodati = ref(false); const recOrderCart = ref({}); @@ -82,16 +83,16 @@ export default defineComponent({ } } - function getItemsCart() { + const getItemsCart = computed(() => { const cart = getOrdersCart(); return cart.items || null; - } + }); - function getNumItems(): number { + const getNumItems = computed((): number => { const cart = getOrdersCart(); if (cart.items) return cart.items.length || 0; else return 0; - } + }); function getCart(): ICart { return getOrdersCart(); @@ -116,21 +117,37 @@ export default defineComponent({ } } - function myTotalPrice(): string { + const myTotalPrice = computed((): string => { if (productStore.cart && productStore.cart.totalPrice) { return productStore.cart.totalPrice.toFixed(2); } else { return '0'; } - } + }); - function myTotalQty(): number { + const myTotalPriceCalc = computed((): string => { + if (productStore.cart && productStore.cart.totalPriceCalc) { + return productStore.cart.totalPriceCalc.toFixed(2); + } else { + return '0'; + } + }); + const totalPriceIntero = computed((): string => { + if (productStore.cart && productStore.cart.totalPriceIntero) { + return productStore.cart.totalPriceIntero.toFixed(2); + } else { + return '0'; + } + }); + + const myTotalQty = computed((): number => { if (productStore.cart) { return productStore.cart.totalQty!; } else { return 0; } - } + }); + async function aggiornaCarrello() { if (mycart.value) { recOrderCart.value = await productStore.CreateOrdersCart({ @@ -197,7 +214,7 @@ export default defineComponent({ function completeOrder() { $q.dialog({ - message: t('ecomm.conferma_acq', { qty: myTotalQty() }), + message: t('ecomm.conferma_acq', { qty: myTotalQty }), ok: { label: t('dialog.yes'), push: true, @@ -294,7 +311,7 @@ export default defineComponent({ csvRows.push(headers); let index = 1 - for (const itemorder of getItemsCart()) { + for (const itemorder of getItemsCart.value) { const productCode = itemorder.order.product?.productInfo.code || ''; const productName = itemorder.order.product?.productInfo.name || ''; const quantity = itemorder.order.quantity + itemorder.order.quantitypreordered; @@ -306,8 +323,8 @@ export default defineComponent({ 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 totalQuantity = getItemsCart.value.reduce((sum, itemorder) => sum + itemorder.order.quantity + itemorder.order.quantitypreordered, 0); + const totalAmount = getItemsCart.value.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); @@ -341,12 +358,16 @@ export default defineComponent({ tools.showNegativeNotif($q, `${rissconto.errmsg}`); } codice_sconto.value = ''; - if (rissconto.mycart) recOrderCart.value = rissconto.mycart; + descr_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 = ''; + descr_sconto.value = ''; } finally { caricamentodati.value = false; } @@ -381,6 +402,8 @@ export default defineComponent({ completeOrder, getNumItems, myTotalPrice, + myTotalPriceCalc, + totalPriceIntero, getItemsCart, getNote, change_field, @@ -397,6 +420,7 @@ export default defineComponent({ isfinishLoading, esportaCsv, codice_sconto, + descr_sconto, confermaCodiceSconto, rimuoviCodiceSconto, caricamentodati, diff --git a/src/components/CCart/CCart.vue b/src/components/CCart/CCart.vue index de4ae8bd..ce36c142 100755 --- a/src/components/CCart/CCart.vue +++ b/src/components/CCart/CCart.vue @@ -18,7 +18,7 @@
- {{ $t('ecomm.totale') }}: - € {{ myTotalPrice() }} -
+ + + + + + + + + + - + + + + -
-
-
-
- {{ $t('ecomm.sconto_appl') }} -
- - - Rimuovi {{ recOrderCart.codice_sconto }} - -
-
-
- - -
- +
+ + + + +
{{ $t('ecomm.prezzointero') }}: + € {{ totalPriceIntero }} +
{{ $t('ecomm.sconto_appl') }}: +
+ + {{ recOrderCart.descr_sconto }} + + Rimuovi +
+
{{ $t('ecomm.codice_sconto') }}: + + +
{{ $t('ecomm.totale_scontato') }}:€ {{ myTotalPrice }}
-
+

@@ -152,6 +145,20 @@ {{ globalStore.site.ecomm.NoteExtraOnCart }}
+
+ +
rec._id === id) + if (myarr) { + mycolumns.value.forEach((col: IColGridTable) => { + if (col.dont_clone) + delete myarr[col.name] + }) + } newRecord.value = myarr newRecord.value._id = 0 newRecordBool.value = true diff --git a/src/components/CMyCart/CMyCart.vue b/src/components/CMyCart/CMyCart.vue index 0ace8d44..2bd2eae4 100755 --- a/src/components/CMyCart/CMyCart.vue +++ b/src/components/CMyCart/CMyCart.vue @@ -48,8 +48,9 @@ - + { + order.value = { ...newVal }; + }); + watch(orderQuantity, (newValue: any) => { if (!newValue) order.value.quantity = 0; else order.value.quantity = parseFloat(newValue); @@ -151,15 +155,17 @@ export default defineComponent({ }); } - function isApplicatoSconto() { + const isApplicatoSconto = computed(() => { const totalipotetico = order.value.product!.price * (order.value.quantity + order.value.quantitypreordered); - if (totalipotetico.toFixed(2) > order.value.TotalPriceProduct.toFixed(2)) { + const totalipoteticoNum = parseFloat(totalipotetico.toFixed(2)); + const totalpriceNum = parseFloat(order.value.TotalPriceProduct.toFixed(2)); + if (totalipoteticoNum > totalpriceNum) { return true; } return false; - } + }); function removeFromCard() { $q.dialog({ @@ -197,12 +203,21 @@ export default defineComponent({ mounted(); } - function getRisparmio(): string { + const getRisparmio = computed((): string => { return ( order.value.product!.price * order.value.quantity - order.value.TotalPriceProduct ).toFixed(2); - } + }); + const getRispPerc = computed((): string => { + const risparmioPerc = parseFloat( + ( + (getRisparmio.value / (order.value.product!.price * order.value.quantity)) * + 100 + ).toFixed(2) + ); + return risparmioPerc.toFixed(0); + }); function mounted() { endload.value = false; @@ -248,6 +263,7 @@ export default defineComponent({ orderTotalPriceProduct, endload, qtyInCart, + getRispPerc, }; }, }); diff --git a/src/components/CSingleCart/CSingleCart.vue b/src/components/CSingleCart/CSingleCart.vue index 16e4d4c3..dfb2c290 100755 --- a/src/components/CSingleCart/CSingleCart.vue +++ b/src/components/CSingleCart/CSingleCart.vue @@ -106,9 +106,9 @@ size="sm" class="quantity-btn" data-gradiente="negative" - :icon="qtyInCart() === 1 ? 'fas fa-trash': 'fas fa-minus'" + :icon="qtyInCart() === 1 ? 'fas fa-trash' : 'fas fa-minus'" :color="products.enableSubQty(order) ? undefined : 'grey'" - @click="qtyInCart() === 1 ? removeFromCard(): addsubqty(false, true)" + @click="qtyInCart() === 1 ? removeFromCard() : addsubqty(false, true)" rounded >
@@ -195,27 +195,12 @@ {{ order.quantity + order.quantitypreordered }} x € {{ order.price ? order.price : 0 }} - - = € + = + + € {{ order.TotalPriceProduct ? order.TotalPriceProduct.toFixed(2) : 0 }} - - (Calc: € - {{ - order.TotalPriceProductCalc - ? order.TotalPriceProductCalc.toFixed(2) - : 0 - }}) - - - +  (€ @@ -228,11 +213,17 @@ >)  - {{ $t('ecomm.sconto_applicato', { risparmio: getRisparmio() }) }} +
diff --git a/src/css/app.scss b/src/css/app.scss index b5c5d118..5c6e8b52 100755 --- a/src/css/app.scss +++ b/src/css/app.scss @@ -411,7 +411,7 @@ h3 { .my-card-prod { transition: box-shadow 0.3s ease, transform 0.3s ease; /* Add a transition for a smooth effect */ - box-shadow: 0 10px 20px rgba(0,0,0,0.2) !important; + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2) !important; width: 100%; max-width: 300px; padding: 0.5rem 0.5rem; @@ -1994,8 +1994,10 @@ h3 { position: relative; width: 100%; padding-top: 56.25%; - max-width: 800px; /* Limita la larghezza massima */ - margin: 0 auto; /* Centra il video orizzontalmente */ + max-width: 800px; + /* Limita la larghezza massima */ + margin: 0 auto; + /* Centra il video orizzontalmente */ /* 16:9 Aspect Ratio */ } @@ -2006,7 +2008,8 @@ h3 { left: 0; width: 100%; height: 100%; - border: none; /* Rimuovi eventuali bordi */ + border: none; + /* Rimuovi eventuali bordi */ } .fake-link { @@ -2604,9 +2607,48 @@ body.body--dark { left: 0; width: 100%; height: 100%; - background-color: rgba(255, 255, 255, 0.7); /* Sfondo semi-trasparente */ + background-color: rgba(255, 255, 255, 0.7); + /* Sfondo semi-trasparente */ display: flex; justify-content: center; align-items: center; z-index: 9999; +} + +.text-strike { + text-decoration-line: line-through; +} + +.product-price-discount { + font-weight: 500; + line-height: 1.2; + font-size: 1rem; + color: #f60; + margin-bottom: 5px; +} + +.ordine_scontato_nuovo { + font-size: 1.1rem; + font-weight: bold; + color: green; + background-color: #fff5ee; /* seashell color background */ + padding: 10px; + border-radius: 8px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + text-align: center; +} + +.ordine_scritta_sconto { + font-size: 1.1rem; + color:red; + background-color: #fff5ee; /* seashell color background */ + padding: 4px; + border-radius: 8px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + text-align: center; +} + +.center-button { + display: flex; + justify-content: center; } \ No newline at end of file diff --git a/src/model/GlobalStore.ts b/src/model/GlobalStore.ts index fd00723e..6969c607 100755 --- a/src/model/GlobalStore.ts +++ b/src/model/GlobalStore.ts @@ -1049,6 +1049,7 @@ export interface IColGridTable { tablesel?: string notsave?: boolean isadvanced_field?: boolean + dont_clone?: boolean showWhen?: number maxlength?: number minlength?: number diff --git a/src/model/Products.ts b/src/model/Products.ts index 0657473f..429b7c00 100755 --- a/src/model/Products.ts +++ b/src/model/Products.ts @@ -442,6 +442,7 @@ export interface IOrderCart { created_at?: Date note: string codice_sconto?: string + descr_sconto?: string note_per_gestore: string note_per_admin: string note_ordine_gas: string diff --git a/src/statics/lang/it.js b/src/statics/lang/it.js index 7ab98471..3e7e6859 100755 --- a/src/statics/lang/it.js +++ b/src/statics/lang/it.js @@ -1870,6 +1870,8 @@ const msg_it = { created: 'Sito Installato [IdApp = {idapp}] !', }, ecomm: { + totale_scontato: 'Totale scontato', + prezzointero: 'Prezzo Intero', already_in_cart: 'Questo prodotto è stato già aggiunto al Carrello', area_personale: 'Per poter fare un Ordine occorre essere Registrati ed accedere con le proprie credenziali (username e password)', codice_sconto: 'Aggiungi il Codice Sconto', @@ -1907,7 +1909,7 @@ const msg_it = { carrello_di: 'Carrello di {user}', settings: 'Impostazioni', qta_in_attesa: '(Ordinati In attesa {qty})', - sconto_applicato: 'Risparmi {risparmio} € !', + sconto_applicato: 'Risparmi {risparmio}({perc}%) !', codice: 'Codice', subcat: 'Cat', code_o_text_search: 'Inserisci il codice o il testo da cercare', diff --git a/src/store/Modules/fieldsTable.ts b/src/store/Modules/fieldsTable.ts index def7f7db..c47b85fb 100755 --- a/src/store/Modules/fieldsTable.ts +++ b/src/store/Modules/fieldsTable.ts @@ -106,6 +106,7 @@ function AddCol(params: IColGridTable) { isadvanced_field: (params.isadvanced_field === undefined) ? false : params.isadvanced_field, path: (params.path === undefined) ? '' : params.path, onlyforAdmin: (params.onlyforAdmin === undefined) ? false : params.onlyforAdmin, + dont_clone: (params.dont_clone === undefined) ? false : params.dont_clone, } } @@ -170,6 +171,8 @@ export const colTableRaccoltaCataloghi = [ AddCol(DeleteRec), ] +// exclude field with dont_clone: true in the fieldstable colTableCatalogList + export const colTableCatalogList = [ AddCol({ name: 'active', label_trans: 'myelems.pubblica_online', fieldtype: costanti.FieldType.boolean }), AddCol({ name: 'title', label_trans: 'gallery.title' }), @@ -192,6 +195,7 @@ export const colTableCatalogList = [ label_trans: 'cataloglist.idPageAssigned', fieldtype: costanti.FieldType.select, jointable: 'mypages_id', + dont_clone: true, }), AddCol({ name: 'isCatalogoGenerale', label_trans: 'cataloglist.isCatalogoGenerale', fieldtype: costanti.FieldType.boolean }), AddCol({ @@ -259,11 +263,13 @@ export const colTableCatalogList = [ AddCol({ name: 'pdf_generato', label_trans: 'cataloglist.pdf_generato', + dont_clone: true, }), // AddCol({ name: 'data_generato', label_trans: 'dataloglist.data_generato', fieldtype: costanti.FieldType.date }), AddCol({ name: 'pdf_online', label_trans: 'cataloglist.pdf_online', + dont_clone: true, }), AddCol({ @@ -286,11 +292,13 @@ export const colTableCatalogList = [ AddCol({ name: 'pdf_generato_stampa', label_trans: 'cataloglist.pdf_generato_stampa', + dont_clone: true, }), // AddCol({ name: 'data_generato', label_trans: 'dataloglist.data_generato', fieldtype: costanti.FieldType.date }), AddCol({ name: 'pdf_online_stampa', label_trans: 'cataloglist.pdf_online_stampa', + dont_clone: true, }), // AddCol({ name: 'data_online', label_trans: 'dataloglist.data_online', fieldtype: costanti.FieldType.date }), @@ -697,6 +705,7 @@ export const getcolorderscart = [ AddCol({ name: 'userId', label_trans: 'order.users', fieldtype: costanti.FieldType.select, jointable: 'users' }), AddCol({ name: 'note', label_trans: 'order.note' }), AddCol({ name: 'codice_sconto', label_trans: 'order.codice_sconto' }), + AddCol({ name: 'descr_sconto', label_trans: 'order.descr_sconto' }), AddCol({ name: 'confermato', label_trans: 'order.confermato', fieldtype: costanti.FieldType.boolean }), AddCol({ name: 'date_confermato', label_trans: 'order.date_confermato', fieldtype: costanti.FieldType.date }), AddCol({ name: 'consegnato', label_trans: 'order.consegnato', fieldtype: costanti.FieldType.boolean }), @@ -888,6 +897,7 @@ export const colTableGasordine = [ AddCol(DuplicateRec), ] export const colTableScontistica = [ + AddCol({ name: 'attivo', label_trans: 'scontistica.attivo', fieldtype: costanti.FieldType.boolean }), AddCol({ name: 'code', label_trans: 'scontistica.code' }), AddCol({ name: 'description', label_trans: 'scontistica.description' }), AddCol({ name: 'qta', label_trans: 'scontistica.qta', fieldtype: costanti.FieldType.number }), @@ -2734,6 +2744,7 @@ export const colTableOrdersCart = [ AddCol({ name: 'totalQtyPreordered', label_trans: 'orderscart.totalQtyPreordered', fieldtype: costanti.FieldType.number }), AddCol({ name: 'totalPrice', label_trans: 'orderscart.totalPrice', fieldtype: costanti.FieldType.number }), AddCol({ name: 'totalPriceCalc', label_trans: 'orderscart.totalPriceCalc', fieldtype: costanti.FieldType.number }), + AddCol({ name: 'totalPriceIntero', label_trans: 'orderscart.totalPriceIntero', fieldtype: costanti.FieldType.number }), AddCol({ name: 'status', label_trans: 'orderscart.status', fieldtype: costanti.FieldType.number }), ] diff --git a/src/store/Products.ts b/src/store/Products.ts index 594ffae0..e9e826f4 100755 --- a/src/store/Products.ts +++ b/src/store/Products.ts @@ -62,6 +62,7 @@ function getRecordOrdersCartEmpty(): IOrderCart { note: '', note_per_gestore: '', codice_sconto:'', + descr_sconto: '', note_per_admin: '', note_ordine_gas: '', }; @@ -611,8 +612,10 @@ export const useProducts = defineStore('Products', { state.orders = res.data.orders; } + if (res && res.data.mycart) { + state.cart = res.data.mycart; + } if (res && res.data.cart) { - // console.log('RISULTANTE CATEGORIES DAL SERVER = ', res.data.categories) state.cart = res.data.cart; } }, @@ -1391,6 +1394,8 @@ export const useProducts = defineStore('Products', { let ris = null; + console.log('/cart/' + this.userActive._id + '/createorderscart', cart_id); + ris = await Api.SendReq( '/cart/' + this.userActive._id + '/createorderscart', 'POST', diff --git a/src/views/ecommerce/orderInfo/orderInfo.ts b/src/views/ecommerce/orderInfo/orderInfo.ts index 403ef326..0dc5a7d5 100755 --- a/src/views/ecommerce/orderInfo/orderInfo.ts +++ b/src/views/ecommerce/orderInfo/orderInfo.ts @@ -402,6 +402,7 @@ export default defineComponent({ // Add other properties as needed totalPrice: orderscart.reduce((total: number, rec: any) => total + rec.totalPrice, 0), totalPriceCalc: orderscart.reduce((total: number, rec: any) => total + rec.totalPriceCalc, 0), + totalPriceIntero: orderscart.reduce((total: number, rec: any) => total + rec.totalPriceIntero, 0), }; let rowsWithTotals: any = [...orderscart]; diff --git a/src/views/ecommerce/orderInfo/orderInfo.vue b/src/views/ecommerce/orderInfo/orderInfo.vue index db6e42df..53cfae5f 100755 --- a/src/views/ecommerce/orderInfo/orderInfo.vue +++ b/src/views/ecommerce/orderInfo/orderInfo.vue @@ -233,6 +233,11 @@ caption >{{ props.row.totalPriceCalc }} € + {{ props.row.totalPriceIntero }} €