Merge branch 'develop' of ssh://risosrv:5522/~/repository/newfreeplanet into develop

This commit is contained in:
Surya Paolo
2023-12-21 10:58:02 +01:00
21 changed files with 497 additions and 107 deletions

View File

@@ -18,6 +18,15 @@
font-size: 1.2rem; font-size: 1.2rem;
} }
.prod_preorder{
font-size: 1.2rem;
}
.prod_preorder{
font-size: 1.2rem;
}
.prod_qtywarn { .prod_qtywarn {
padding-left: 10px; padding-left: 10px;
font-size: 1rem; font-size: 1rem;

View File

@@ -10,7 +10,7 @@ import { CCopyBtn } from '../CCopyBtn'
import { func_tools, toolsext } from '@store/Modules/toolsext' import { func_tools, toolsext } from '@store/Modules/toolsext'
import { IOrder, IOrderCart, IProduct } from '@src/model' import { IBaseOrder, IOrder, IOrderCart, IProduct } from '@src/model'
import { tools } from '@store/Modules/tools' import { tools } from '@store/Modules/tools'
import { useProducts } from '@store/Products' import { useProducts } from '@store/Products'
@@ -43,11 +43,15 @@ export default defineComponent({
const globalStore = useGlobalStore() const globalStore = useGlobalStore()
const products = useProducts() const products = useProducts()
const listord = ref(<IOrderCart[]>[])
const sumval = ref(0)
const site = ref(globalStore.site) const site = ref(globalStore.site)
const myorder = reactive(<IOrder>{ const myorder = reactive(<IOrder>{
idapp: process.env.APP_ID, idapp: process.env.APP_ID,
quantity: 0, quantity: 0,
quantitypreordered: 0,
idStorehouse: '', idStorehouse: '',
idProvider: '' idProvider: ''
}) })
@@ -86,8 +90,12 @@ export default defineComponent({
globalStore.rightDrawerOpen = true globalStore.rightDrawerOpen = true
return false return false
} }
await products.addtoCartBase({ $q, t, code: myproduct.value.code!, order: myorder, addqty: add })
const ris = await products.addtoCartBase({ $q, t, code: myproduct.value.code!, order: myorder, addqty: add })
updateproduct()
if (ris && ris.myord) {
}
} }
function getnumstore() { function getnumstore() {
@@ -114,7 +122,7 @@ export default defineComponent({
function updateproduct() { function updateproduct() {
myproduct.value = products.getProductByCode(props.code) myproduct.value = products.getProductByCode(props.code)
products.updateQuantityAvailable(myproduct.value._id) // products.updateQuantityAvailable(myproduct.value._id)
} }
function getStorehouses() { function getStorehouses() {
@@ -148,6 +156,11 @@ export default defineComponent({
return qty return qty
} }
function getQtyBookableAvailable() {
let qty = myproduct.value.bookableAvailableQty!
return qty
}
function getQtyWarn() { function getQtyWarn() {
if (myorder.quantity > 0) { if (myorder.quantity > 0) {
return t('ecomm.di_cui_x_in_carrello', { qty: myorder.quantity }) return t('ecomm.di_cui_x_in_carrello', { qty: myorder.quantity })
@@ -155,6 +168,13 @@ export default defineComponent({
return '' return ''
} }
function getQtyWarnPreOrdered() {
if (myorder.quantitypreordered > 0) {
return t('ecomm.di_cui_x_in_carrello', { qty: myorder.quantitypreordered })
}
return ''
}
watch(() => props.code, (newval, oldval) => { watch(() => props.code, (newval, oldval) => {
console.log('change code') console.log('change code')
load() load()
@@ -179,6 +199,7 @@ export default defineComponent({
const ord = products.getOrderProductInCart(myproduct.value._id) const ord = products.getOrderProductInCart(myproduct.value._id)
if (ord) { if (ord) {
myorder.quantity = ord.quantity myorder.quantity = ord.quantity
myorder.quantitypreordered = ord.quantitypreordered
} }
} }
@@ -195,21 +216,42 @@ export default defineComponent({
} }
function enableSubQty() { function enableSubQty() {
return myorder.quantity ? myorder.quantity > 0 : false let qty = myorder.quantity + myorder.quantitypreordered
return qty ? qty > 0 : false
} }
function enableAddQty() { function enableAddQty() {
if (site.value.ecomm && site.value.ecomm.enablePreOrders) { if (site.value.ecomm && site.value.ecomm.enablePreOrders) {
return true return getQtyBookableAvailable() > 0 || getQtyAvailable() > 0
} else { } else {
return getQtyAvailable() > 0 return getQtyAvailable() > 0
} }
} }
function visuListDisponibili() {
openlistorders.value = true
sumval.value = products.getSumQtyOrderProductInOrdersCart(myproduct.value._id)
listord.value = arrordersCart.value.filter((ordercart: IOrderCart) => ordercart.items!.reduce((accumulator, item) => {
return accumulator + item.order.quantity
}, 0))
}
function visuListBookable() {
openlistorders.value = true
sumval.value = products.getSumQtyPreOrderInOrdersCart(myproduct.value._id)
listord.value = arrordersCart.value.filter((ordercart: IOrderCart) => ordercart.items!.reduce((accumulator, item) => {
return accumulator + item.order.quantitypreordered
}, 0))
}
onMounted(load) onMounted(load)
return { return {
visuListDisponibili,
visuListBookable,
addtoCart, addtoCart,
iconWhishlist, iconWhishlist,
getmycardcl, getmycardcl,
@@ -235,6 +277,10 @@ export default defineComponent({
endload, endload,
shared_consts, shared_consts,
site, site,
getQtyWarnPreOrdered,
getQtyBookableAvailable,
listord,
sumval,
} }
} }
}) })

View File

@@ -54,16 +54,17 @@
myproduct.after_price myproduct.after_price
}}</span> }}</span>
</q-item-label> </q-item-label>
<q-item-label v-if="myproduct.scontisticas && myproduct.scontisticas.length > 0"> <q-item-label
v-if="myproduct.scontisticas && myproduct.scontisticas.length > 0"
>
<div <div
class="prod_sconti" class="prod_sconti"
v-for="(sconti, index) of myproduct.scontisticas" v-for="(sconti, index) of myproduct.scontisticas"
:key="index" :key="index"
> >
{{ sconti.description }} {{ sconti.description }}
</div> </div>
</q-item-label> </q-item-label>
</q-item-section> </q-item-section>
</q-item> </q-item>
</q-list> </q-list>
@@ -108,40 +109,29 @@
<q-list> <q-list>
<q-item <q-item
:clickable="tools.isManager()" :clickable="tools.isManager()"
@click="tools.isManager() ? (openlistorders = true) : null" @click="tools.isManager() ? (visuListDisponibili()) : null"
> >
<q-item-section avatar> <q-item-section avatar>
<q-icon <q-icon
:color="getQtyAvailable() >= 0 ? 'green' : 'blue'" color="green"
:name="getQtyAvailable() >= 0 ? 'fas fa-store' : 'fas fa-edit'" name="fas fa-store"
/> />
</q-item-section> </q-item-section>
<q-item-section> <q-item-section>
<q-item-label> <q-item-label>
<span v-if="getQtyAvailable() < 0"> {{ t('ecomm.available') }}
{{ t('ecomm.preorders') }}
</span>
<span v-else>
{{ t('ecomm.available') }}
</span>
</q-item-label> </q-item-label>
<q-item-label> <q-item-label>
<span class="prod_disp"> <span class="prod_disp">
<span v-if="getQtyAvailable() < 0"> {{ getQtyAvailable() }}
{{ -getQtyAvailable() }}
</span>
<span v-else>
{{ getQtyAvailable() }}
</span>
</span> </span>
<div class="prod_qtywarn"> <div class="prod_qtywarn">
{{ getQtyWarn() }} {{ getQtyWarn() }}
<div <div
v-if=" v-if="
tools.isManager() && tools.isManager() && !!myproduct.QuantitaOrdinateInAttesa
!!myproduct.QuantitaOrdinateInAttesa
" "
> >
{{ {{
@@ -155,6 +145,43 @@
<q-item-label> </q-item-label> <q-item-label> </q-item-label>
</q-item-section> </q-item-section>
</q-item> </q-item>
<q-item
v-if="getQtyBookableAvailable() > 0 || (myproduct.bookableQty > 0)"
:clickable="tools.isManager()"
@click="tools.isManager() ? (visuListBookable()) : null"
>
<q-item-section avatar>
<q-icon color="blue" name="fas fa-edit" />
</q-item-section>
<q-item-section>
<q-item-label>
{{ t('ecomm.preorders') }}
</q-item-label>
<q-item-label>
<span class="prod_preorder">
{{ getQtyBookableAvailable() }}
</span>
<div class="prod_qtywarn">
<span v-if="getQtyWarnPreOrdered()">{{
getQtyWarnPreOrdered()
}}</span>
<div
v-if="
tools.isManager() && !!myproduct.QuantitaPrenotateInAttesa
"
>
{{
$t('ecomm.qta_prenotate_in_attesa', {
qty: myproduct.QuantitaPrenotateInAttesa,
})
}}
</div>
</div>
</q-item-label>
</q-item-section>
</q-item>
</q-list> </q-list>
<div class="row q-mb-sm no-wrap items-center centeritems"> <div class="row q-mb-sm no-wrap items-center centeritems">
<q-btn <q-btn
@@ -178,6 +205,12 @@
<div class="self-center no-outline" tabindex="0"> <div class="self-center no-outline" tabindex="0">
{{ myorder.quantity }} {{ myorder.quantity }}
</div> </div>
<div
v-if="myorder.quantitypreordered"
class="self-center no-outline"
tabindex="0"
>
</div>
</template> </template>
</q-field> </q-field>
@@ -224,7 +257,7 @@
<q-card-actions vertical align="center"> <q-card-actions vertical align="center">
<q-btn <q-btn
v-if="myorder.quantity > 0" v-if="myorder.quantity + myorder.quantitypreordered > 0"
rounded rounded
icon="fas fa-shopping-cart" icon="fas fa-shopping-cart"
color="primary" color="primary"
@@ -264,7 +297,7 @@
<tbody> <tbody>
<tr <tr
v-for="(ordcart, index) of arrordersCart" v-for="(ordcart, index) of listord"
:key="index" :key="index"
class="listaev listaev__table" class="listaev listaev__table"
> >
@@ -285,9 +318,22 @@
</td> </td>
<td class="text-center"> <td class="text-center">
<div v-for="(singleord, index) in ordcart.items" :key="index"> <div v-for="(singleord, index) in ordcart.items" :key="index">
<span v-if="singleord.order.idProduct === myproduct._id">{{ <span
singleord.order.quantity v-if="
}}</span> singleord.order.idProduct === myproduct._id &&
singleord.order.quantity > 0
"
>
{{ singleord.order.quantity }}</span
>
<span
v-if="
singleord.order.idProduct === myproduct._id &&
singleord.order.quantitypreordered > 0
"
>
{{ singleord.order.quantitypreordered }}</span
>
</div> </div>
</td> </td>
<td class="text-center"> <td class="text-center">
@@ -300,7 +346,7 @@
<td class="text-center"> <td class="text-center">
Totali: Totali:
<span class="totali">{{ <span class="totali">{{
products.getSumQtyOrderProductInOrdersCart(myproduct._id) sumval
}}</span> }}</span>
</td> </td>
<td>&nbsp;</td> <td>&nbsp;</td>

View File

@@ -40,14 +40,29 @@ export default defineComponent({
} }
function addsubqty(addqty: boolean, subqty: boolean) { function addsubqty(addqty: boolean, subqty: boolean) {
if (addqty) { if (products.isQtyAvailableByOrder(props.order)) {
if (props.order.quantity >= 10) if (addqty) {
return false if (props.order.quantity >= 20)
} return false
}
if (subqty) { if (subqty) {
if (props.order.quantity === 0) if (props.order.quantity === 0)
return false return false
}
} else {
if (products.isInPreorderByOrder(props.order)) {
if (addqty) {
if (props.order.quantitypreordered >= 20)
return false
}
if (subqty) {
if (props.order.quantitypreordered === 0)
return false
}
}
} }
products.addSubQtyToItem({ products.addSubQtyToItem({
@@ -56,13 +71,14 @@ export default defineComponent({
order: props.order, order: props.order,
}).then((res: any) => { }).then((res: any) => {
if (res.risult) { if (res.risult) {
order.value.quantity = res.qty order.value.quantity = res.myord.quantity
order.value.quantitypreordered = res.myord.quantitypreordered
} }
}) })
} }
function isApplicatoSconto() { function isApplicatoSconto() {
const totalipotetico = order.value.price * order.value.quantity const totalipotetico = order.value.price * (order.value.quantity + order.value.quantitypreordered)
if (totalipotetico > order.value.TotalPriceProduct) { if (totalipotetico > order.value.TotalPriceProduct) {
return true return true
} }

View File

@@ -1,45 +1,89 @@
<template> <template>
<div v-if="order && order.product" class="q-pa-xs q-gutter-xs"> <div v-if="order && order.product" class="q-pa-xs q-gutter-xs">
<div v-if="order.product" class="row items-center justify-evenly no-wrap"> <div v-if="order.product" class="row items-center justify-evenly no-wrap">
<div class="col-2 text-h6 ellipsis"> <div class="col-2 text-h6 ellipsis">
<q-img v-if="order.product && order.product.img" :src="`` + order.product.img" :alt="order.product.name" <q-img
:class="myimgclass"> v-if="order.product && order.product.img"
:src="`` + order.product.img"
:alt="order.product.name"
:class="myimgclass"
>
</q-img> </q-img>
</div> </div>
<div class="col-4 q-ml-xs"> <div class="col-4 q-ml-xs">
{{ order.product.name }} {{ order.product.name }}
<div v-if="showall"> <div v-if="showall">
<br><span class="text-grey">{{ order.product.description }}</span> <br /><span class="text-grey">{{ order.product.description }}</span>
</div> </div>
</div> </div>
<div class="col-3"> <div class="col-3">
<div class="row q-mb-xs no-wrap items-center centeritems"> <div class="row q-mb-xs no-wrap items-center centeritems">
<q-btn v-if="showall && !nomodif" round size="xs" text-color="grey" icon="fas fa-minus" <q-btn
@click="addsubqty(false, true)"></q-btn> v-if="showall && !nomodif"
<!--<q-field outlined dense style="width: 25px; height: 20px; " class="q-mx-xs text-subtitle4"> round
<template v-slot:control> size="xs"
<div class="self-center no-outline" tabindex="0" >{{ order.quantity }}</div> text-color="grey"
</template> icon="fas fa-minus"
</q-field>--> @click="addsubqty(false, true)"
<div :class="`q-mx-sm text-blue-14`">{{ order.quantity }}</div> ></q-btn>
<q-btn v-if="showall && !nomodif" round size="xs" text-color="grey" icon="fas fa-plus" <div v-if="order.quantity > 0" :class="`q-mx-sm text-blue-14`">
@click="addsubqty(true, false)"></q-btn> {{ order.quantity }}
</div>
<div v-if="order.quantity > 0 && order.quantitypreordered > 0">
+ {{ $t('ecomm.preord') }}:
</div>
<div
v-if="order.quantitypreordered > 0"
:class="`q-mx-sm text-blue-14`"
>
{{ order.quantitypreordered }}
</div>
<q-btn
v-if="showall && !nomodif"
round
size="xs"
text-color="grey"
icon="fas fa-plus"
@click="addsubqty(true, false)"
></q-btn>
</div> </div>
</div> </div>
<div class="col-2 no-wrap text-subtitle3_short q-mr-sm"> <div class="col-2 no-wrap text-subtitle3_short q-mr-sm">
<span :class="isApplicatoSconto() ? 'ordine_scontato_nuovo' : ''">&nbsp;{{ order.TotalPriceProduct ? order.TotalPriceProduct.toFixed(2) : 0 }}</span> <span :class="isApplicatoSconto() ? 'ordine_scontato_nuovo' : ''"
>&nbsp;{{
order.TotalPriceProduct ? order.TotalPriceProduct.toFixed(2) : 0
}}</span
>
<span v-if="isApplicatoSconto()"> <span v-if="isApplicatoSconto()">
&nbsp;<span class="ordine_scontato">(<span class="barrato"> {{(order.price * order.quantity).toFixed(2) }}</span>)</span>&nbsp; &nbsp;<span class="ordine_scontato"
>(<span class="barrato"
>
{{
(
order.price * order.quantity +
order.price * order.quantitypreordered
).toFixed(2)
}}</span
>)</span
>&nbsp;
</span> </span>
<span v-if="isApplicatoSconto()" class="ordine_scritta_sconto">{{ $t('ecomm.sconto_applicato', {risparmio: getRisparmio()}) }}</span> <span v-if="isApplicatoSconto()" class="ordine_scritta_sconto">{{
$t('ecomm.sconto_applicato', { risparmio: getRisparmio() })
}}</span>
</div> </div>
<div class="col-1"> <div class="col-1">
<q-btn v-if="!nomodif" icon="fas fa-times" color="negative" round size="xs" @click="removeFromCard"> <q-btn
v-if="!nomodif"
icon="fas fa-times"
color="negative"
round
size="xs"
@click="removeFromCard"
>
</q-btn> </q-btn>
</div> </div>
</div> </div>
</div> </div>
</template> </template>

View File

@@ -36,6 +36,7 @@ const msg_website_it = {
categories: 'Categorie', categories: 'Categorie',
storehouses: 'Magazzino', storehouses: 'Magazzino',
providers: 'Fornitori', providers: 'Fornitori',
gasordine: 'Gas Ordine',
scontisticas: 'Scontistica', scontisticas: 'Scontistica',
departments: 'Uffici', departments: 'Uffici',
orders: 'Ordini Ricevuti', orders: 'Ordini Ricevuti',
@@ -125,6 +126,7 @@ const msg_website_it = {
only_residenti: 'Solo Residenti', only_residenti: 'Solo Residenti',
only_consiglio: 'Solo Consiglieri', only_consiglio: 'Solo Consiglieri',
color: 'Colore', color: 'Colore',
gasordini: 'Gas Ordini',
}, },
msg: { msg: {
myAppName: 'Più che Buono', myAppName: 'Più che Buono',

View File

@@ -50,7 +50,7 @@ export default function () {
const arrcart = products.cart const arrcart = products.cart
if (!!arrcart) { if (!!arrcart) {
if (!!arrcart.items) { if (!!arrcart.items) {
const total = arrcart.items.reduce((sum, item) => sum + item.order.quantity, 0) const total = arrcart.items.reduce((sum, item) => sum + item.order.quantity + item.order.quantitypreordered , 0)
return total return total
} }
} }

View File

@@ -1,7 +1,7 @@
import { IAction } from '@src/model/Projects' import { IAction } from '@src/model/Projects'
import { IFriends, IGroupShort, IMyGroup, IPaymentType } from '@src/model/UserStore' import { IFriends, IGroupShort, IMyGroup, IPaymentType } from '@src/model/UserStore'
import { import {
IDepartment, IProducer, IShareWithUs, IStorehouse, IProvider, IScontistica, ICategory IDepartment, IProducer, IShareWithUs, IStorehouse, IProvider, IScontistica, ICategory, IGasordine
} from '@src/model/Products' } from '@src/model/Products'
import { IUserFields, IUserProfile } from '@src/model/UserStore' import { IUserFields, IUserProfile } from '@src/model/UserStore'
@@ -442,6 +442,7 @@ export interface IGlobalState {
calzoom: ICalZoom[], calzoom: ICalZoom[],
producers: IProducer[], producers: IProducer[],
providers: IProvider[], providers: IProvider[],
gasordines: IGasordine[],
scontisticas: IScontistica[], scontisticas: IScontistica[],
storehouses: IStorehouse[], storehouses: IStorehouse[],
departments: IDepartment[], departments: IDepartment[],

View File

@@ -22,8 +22,11 @@ export interface IProduct {
color?: string, color?: string,
size?: string, size?: string,
quantityAvailable?: number, quantityAvailable?: number,
bookableAvailableQty?: number,
QuantitaOrdinateInAttesa?: number, QuantitaOrdinateInAttesa?: number,
stockQty?: number, QuantitaPrenotateInAttesa?: number,
stockQty: number,
bookableQty: number,
canBeShipped?: boolean, canBeShipped?: boolean,
canBeBuyOnline?: boolean, canBeBuyOnline?: boolean,
weight?: number, weight?: number,
@@ -46,6 +49,7 @@ export interface IOrder {
idProduct?: string idProduct?: string
idProducer?: string idProducer?: string
idProvider?: string idProvider?: string
idGasordine?: string
idStorehouse?: string idStorehouse?: string
idScontisticas?: string[] idScontisticas?: string[]
price: number price: number
@@ -54,6 +58,7 @@ export interface IOrder {
color?: string color?: string
size?: string size?: string
quantity: number quantity: number
quantitypreordered: number
weight?: number weight?: number
stars?: number stars?: number
product?: IProduct product?: IProduct
@@ -61,6 +66,7 @@ export interface IOrder {
storehouse?: IStorehouse storehouse?: IStorehouse
scontisticas?: IScontistica[] scontisticas?: IScontistica[]
provider?: IProvider provider?: IProvider
gasordine?: IGasordine
date_created?: Date date_created?: Date
date_checkout?: Date date_checkout?: Date
date_payment?: Date date_payment?: Date
@@ -126,6 +132,19 @@ export interface IProvider {
website?: string, website?: string,
} }
export interface IGasordine {
_id?: any
idapp?: string
active: boolean
name?: string,
description?: string,
referent?: string,
city?: string,
img?: string,
dataora_chiusura?: Date,
dataora_ritiro?: Date,
}
export interface IScontistica { export interface IScontistica {
_id?: any _id?: any
idapp?: string idapp?: string

View File

View File

@@ -0,0 +1,34 @@
import { colTableGasordine } from '@src/store/Modules/fieldsTable'
import { CImgText } from '../../../components/CImgText/index'
import { defineComponent } from 'vue'
import { CCard } from '../../../components/CCard'
import { CMyPage } from '../../../components/CMyPage'
import { CTitleBanner } from '../../../components/CTitleBanner'
import { CGridTableRec } from '../../../components/CGridTableRec'
import MixinMetaTags from '../../../mixins/mixin-metatags'
export default defineComponent({
name: 'GasOrdini',
components: { CImgText, CCard, CMyPage, CTitleBanner, CGridTableRec },
setup() {
const pagination = {
sortBy: 'name',
descending: false,
page: 2,
rowsPerPage: 5
// rowsNumber: xx if getting data from a server
}
const { setmeta } = MixinMetaTags()
return {
colTableGasordine,
setmeta,
}
}
})

View File

@@ -0,0 +1,31 @@
<template>
<CMyPage title="Gas Ordini" imgbackground="images/fornitori.jpg" sizes="max-height: 120px">
<span>{{
setmeta({
title: 'Gas Ordini',
description: '',
keywords: '',
})
}}
</span>
<div class="q-ma-sm q-gutter-sm q-pa-xs">
<CTitleBanner title="Gas Ordini"></CTitleBanner>
<CGridTableRec
prop_mytable="gasordines"
prop_mytitle="Lista Gas Ordini"
:prop_mycolumns="colTableGasordine"
prop_colkey="name"
nodataLabel="Nessun Gas Ordine"
noresultLabel="Il filtro selezionato non ha trovato nessun risultato">
</CGridTableRec>
</div>
</CMyPage>
</template>
<script lang="ts" src="./gasordini.ts">
</script>
<style lang="scss" scoped>
@import 'gasordini.scss';
</style>

View File

@@ -125,6 +125,20 @@ function getRoutesEcomm(site: ISites) {
onlyManager: true, onlyManager: true,
onlyEditor: true onlyEditor: true
}, },
{
active: true,
order: 30,
path: '/admin/ecommerce/gasordini',
materialIcon: 'fas fa-file-alt',
name: 'pages.gasordini',
component: () => import('@/rootgen/admin/gasordini/gasordini.vue'),
inmenu: true,
submenu: true,
level_parent: 0,
level_child: 0.5,
onlyManager: true,
onlyEditor: true
},
{ {
active: true, active: true,
order: 30, order: 30,

View File

@@ -62,6 +62,8 @@ const msg_it = {
quantity: 'Quantità', quantity: 'Quantità',
quantityAvailable: 'Disponibili', quantityAvailable: 'Disponibili',
stockQty: 'In Magazzino', stockQty: 'In Magazzino',
bookableQty: 'Prenotabili',
bookableAvailableQty: 'Disponib. Prenotabili',
weight: 'Peso', weight: 'Peso',
unit: 'Unità di Misura', unit: 'Unità di Misura',
stars: 'Voto', stars: 'Voto',
@@ -1649,7 +1651,8 @@ const msg_it = {
ord_not_confirmed: 'E\' avvenuto un errore. Ordine non Confermato. Ricaricare la pagina e riprovare.', ord_not_confirmed: 'E\' avvenuto un errore. Ordine non Confermato. Ricaricare la pagina e riprovare.',
btn_cassa: 'Vai alla Cassa', btn_cassa: 'Vai alla Cassa',
available: 'Disponibili', available: 'Disponibili',
preorders: 'In Prenotazione', preorders: 'Pre-Ordinabili',
preord: 'Pre-Ordinate',
di_cui_x_in_carrello: '(nel tuo carrello: {qty})', di_cui_x_in_carrello: '(nel tuo carrello: {qty})',
evaso: 'Ordine Evaso', evaso: 'Ordine Evaso',
consegnato: 'Ordine Consegnato', consegnato: 'Ordine Consegnato',
@@ -1668,6 +1671,7 @@ const msg_it = {
codice: 'Codice', codice: 'Codice',
code_o_text_search: 'Inserisci il codice o il testo', code_o_text_search: 'Inserisci il codice o il testo',
code_add_to_cart: 'Aggiungi un codice al carrello', code_add_to_cart: 'Aggiungi un codice al carrello',
qta_prenotate_in_attesa: '(Preordinate In attesa {qty})',
}, },
}, },

View File

@@ -442,6 +442,18 @@ export const colTableProviders = [
AddCol(DeleteRec), AddCol(DeleteRec),
AddCol(DuplicateRec), AddCol(DuplicateRec),
] ]
export const colTableGasordine = [
AddCol({ name: 'active', label_trans: 'sites.active', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'name', label_trans: 'store.name' }),
AddCol({ name: 'description', label_trans: 'store.description' }),
AddCol({ name: 'referente', label_trans: 'store.referent' }),
AddCol({ name: 'city', label_trans: 'store.city' }),
AddCol({ name: 'img', label_trans: 'store.img' }),
AddCol({ name: 'dataora_chiusura', label_trans: 'gas.dataora_chiusura', fieldtype: costanti.FieldType.date }),
AddCol({ name: 'dataora_ritiro', label_trans: 'gas.dataora_ritiro', fieldtype: costanti.FieldType.date }),
AddCol(DeleteRec),
AddCol(DuplicateRec),
]
export const colTableScontistica = [ export const colTableScontistica = [
AddCol({ name: 'code', label_trans: 'scontistica.code' }), AddCol({ name: 'code', label_trans: 'scontistica.code' }),
AddCol({ name: 'description', label_trans: 'scontistica.description' }), AddCol({ name: 'description', label_trans: 'scontistica.description' }),
@@ -1999,11 +2011,21 @@ export const colTableProducts = [
label_trans: 'products.quantityAvailable', label_trans: 'products.quantityAvailable',
fieldtype: costanti.FieldType.number fieldtype: costanti.FieldType.number
}), }),
AddCol({
name: 'bookableAvailableQty',
label_trans: 'products.bookableAvailableQty',
fieldtype: costanti.FieldType.number
}),
AddCol({ AddCol({
name: 'stockQty', name: 'stockQty',
label_trans: 'products.stockQty', label_trans: 'products.stockQty',
fieldtype: costanti.FieldType.number fieldtype: costanti.FieldType.number
}), }),
AddCol({
name: 'bookableQty',
label_trans: 'products.bookableQty',
fieldtype: costanti.FieldType.number
}),
AddCol({ name: 'canBeShipped', label_trans: 'products.canBeShipped', fieldtype: costanti.FieldType.boolean }), AddCol({ name: 'canBeShipped', label_trans: 'products.canBeShipped', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'canBeBuyOnline', label_trans: 'products.canBeBuyOnline', fieldtype: costanti.FieldType.boolean }), AddCol({ name: 'canBeBuyOnline', label_trans: 'products.canBeBuyOnline', fieldtype: costanti.FieldType.boolean }),
AddCol({ name: 'weight', label_trans: 'products.weight', fieldtype: costanti.FieldType.number }), AddCol({ name: 'weight', label_trans: 'products.weight', fieldtype: costanti.FieldType.number }),
@@ -3563,6 +3585,13 @@ export const fieldsTable = {
colkey: '_id', colkey: '_id',
collabel: 'name', collabel: 'name',
}, },
{
value: 'gasordines',
label: 'Gas Ordini',
columns: colTableGasordine,
colkey: '_id',
collabel: 'name',
},
{ {
value: 'scontisticas', value: 'scontisticas',
label: 'Scontistica', label: 'Scontistica',

View File

@@ -8270,6 +8270,7 @@ export const tools = {
}, },
// FINE ! // FINE !
// getLocale() { // getLocale() {

View File

@@ -30,6 +30,17 @@ export const useProducts = defineStore('Products', {
const indelem = state.products.findIndex((prod: IProduct) => prod._id === res.data.product._id) const indelem = state.products.findIndex((prod: IProduct) => prod._id === res.data.product._id)
if (indelem >= 0) { if (indelem >= 0) {
state.products[indelem] = { ...res.data.product } state.products[indelem] = { ...res.data.product }
/*if (!res.data.orders) {
// aggiorna anche tutti i product negli ordini !
let ordcart: IOrderCart
for (ordcart of state.orders) {
for (const item of ordcart.items!) {
if (item.order.idProduct === res.data.product.idProduct)
item.order.product = res.data.product
}
}
}*/
} }
} }
if (res && res.data.orders) { if (res && res.data.orders) {
@@ -44,12 +55,15 @@ export const useProducts = defineStore('Products', {
getProductById: (state: IProductsState) => (id: string): IProduct => { getProductById: (state: IProductsState) => (id: string): IProduct => {
const prod = state.products.find((prod: IProduct) => prod._id === id) const prod = state.products.find((prod: IProduct) => prod._id === id)
return prod ? prod : { active: false, img: '', code: '', name: '', storehouses: [], scontisticas: [], price: 0 } return prod ? prod : { active: false, img: '', code: '', name: '', storehouses: [], scontisticas: [], price: 0, stockQty: 0, bookableQty: 0 }
}, },
getProductByCode: (state: IProductsState) => (code: string): IProduct => { getProductByCode: (state: IProductsState) => (code: string): IProduct => {
const prod = state.products.find((prod: IProduct) => prod.code === code) const prod = state.products.find((prod: IProduct) => prod.code === code)
return prod ? prod : { active: false, img: '', code: '', name: '', storehouses: [], scontisticas: [], price: 0 } return prod ? prod : {
active: false, img: '', code: '', name: '', storehouses: [], scontisticas: [], price: 0,
stockQty: 0, bookableQty: 0
}
}, },
getCart: (state: IProductsState) => (): ICart => { getCart: (state: IProductsState) => (): ICart => {
@@ -109,6 +123,28 @@ export const useProducts = defineStore('Products', {
return null return null
}, },
getSumQtyPreOrderInOrdersCart: (state: IProductsState) => (idproduct: string): number => {
let totalQuantity = 0;
if (state.orders) {
const orderscart = state.orders
if (orderscart) {
for (const myord of orderscart) {
if (myord.items) {
for (const item of myord.items) {
if (item.order) {
if ((item.order.idProduct === idproduct) && (item.order.status! < shared_consts.OrderStatus.CHECKOUT_SENT)) {
totalQuantity += (item.order.quantitypreordered) || 0;
}
}
}
}
}
}
}
return totalQuantity
},
getSumQtyOrderProductInOrdersCart: (state: IProductsState) => (idproduct: string): number => { getSumQtyOrderProductInOrdersCart: (state: IProductsState) => (idproduct: string): number => {
let totalQuantity = 0; let totalQuantity = 0;
@@ -120,7 +156,7 @@ export const useProducts = defineStore('Products', {
for (const item of myord.items) { for (const item of myord.items) {
if (item.order) { if (item.order) {
if ((item.order.idProduct === idproduct) && (item.order.status! < shared_consts.OrderStatus.CHECKOUT_SENT)) { if ((item.order.idProduct === idproduct) && (item.order.status! < shared_consts.OrderStatus.CHECKOUT_SENT)) {
totalQuantity += item.order.quantity || 0; totalQuantity += (item.order.quantity) || 0;
} }
} }
} }
@@ -169,17 +205,6 @@ export const useProducts = defineStore('Products', {
return [] return []
}, },
updateQuantityAvailable: (state: IProductsState) => (id: string): any => {
const indelem = state.products.findIndex((prod: IProduct) => prod._id === id)
if (indelem >= 0) {
state.products[indelem].quantityAvailable = state.products[indelem].stockQty
if (state.products[indelem].QuantitaOrdinateInAttesa! > 0) {
state.products[indelem].quantityAvailable! -= state.products[indelem].QuantitaOrdinateInAttesa!
}
}
},
getRecordEmpty: (state: IProductsState) => (): IProduct => { getRecordEmpty: (state: IProductsState) => (): IProduct => {
const tomorrow = tools.getDateNow() const tomorrow = tools.getDateNow()
@@ -205,9 +230,12 @@ export const useProducts = defineStore('Products', {
color: '', color: '',
size: '', size: '',
quantityAvailable: 0, quantityAvailable: 0,
bookableAvailableQty: 0,
stockQty: 0, stockQty: 0,
bookableQty: 0,
canBeShipped: false, canBeShipped: false,
QuantitaOrdinateInAttesa: 0, QuantitaOrdinateInAttesa: 0,
QuantitaPrenotateInAttesa: 0,
canBeBuyOnline: false, canBeBuyOnline: false,
weight: 0, weight: 0,
unit: 0, unit: 0,
@@ -241,6 +269,7 @@ export const useProducts = defineStore('Products', {
weight: product.weight, weight: product.weight,
quantity: order.quantity, quantity: order.quantity,
quantitypreordered: order.quantitypreordered,
idStorehouse: order.idStorehouse, idStorehouse: order.idStorehouse,
idScontisticas: product.idScontisticas, idScontisticas: product.idScontisticas,
} }
@@ -411,12 +440,13 @@ export const useProducts = defineStore('Products', {
const ordcart = this.getOrderProductInCart(product._id) const ordcart = this.getOrderProductInCart(product._id)
if (ordcart) { if (ordcart) {
if (!addqty && ordcart.quantity === 1) { if (!addqty && ((ordcart.quantity + ordcart.quantitypreordered) === 1)) {
// sto per rimuovere l'ultimo pezzo, quindi cancello direttamente // sto per rimuovere l'ultimo pezzo, quindi cancello direttamente
const risrem = await this.removeFromCart({ order: ordcart }) const risrem = await this.removeFromCart({ order: ordcart })
if (risrem) { if (risrem) {
order.quantity = 0 order.quantity = 0
order.quantitypreordered = 0
return true return true
} else { } else {
return false return false
@@ -429,14 +459,22 @@ export const useProducts = defineStore('Products', {
order: ordcart, order: ordcart,
}).then((res: any) => { }).then((res: any) => {
if (res && res.risult) { if (res && res.risult) {
order.quantity = res.qty order.quantity = res.myord.quantity
order.quantitypreordered = res.myord.quantitypreordered
} }
return res; return res;
}) })
} }
} else { } else {
if (order.quantity === 0) if (this.isQtyAvailableByProduct(product)) {
order.quantity = 1 order.quantity = 1
order.quantitypreordered = 0
} else {
if (this.isInPreorderByProduct(product)) {
order.quantitypreordered = 1
order.quantity = 0
}
}
if (!order.idStorehouse) { if (!order.idStorehouse) {
if (product.storehouses.length === 1) { if (product.storehouses.length === 1) {
@@ -467,7 +505,7 @@ export const useProducts = defineStore('Products', {
} }
this.updateDataProduct(res) this.updateDataProduct(res)
return { risult: !!res, qty: order.quantity } return { risult: !!res, myord: res.data.myord }
}) })
.catch((error) => { .catch((error) => {
console.log('error addToCart', error) console.log('error addToCart', error)
@@ -496,7 +534,7 @@ export const useProducts = defineStore('Products', {
.then((res) => { .then((res) => {
this.updateDataProduct(res) this.updateDataProduct(res)
return { risult: !!res, qty: res.data.qty } return { risult: !!res, myord: res.data.myord }
}) })
.catch((error) => { .catch((error) => {
console.log('error addSubQtyToItem', error) console.log('error addSubQtyToItem', error)
@@ -598,34 +636,86 @@ export const useProducts = defineStore('Products', {
async addtoCartBase({ $q, t, code, order, addqty }: { $q: any, t: any, code: string, order: IOrder, addqty: boolean }) { async addtoCartBase({ $q, t, code, order, addqty }: { $q: any, t: any, code: string, order: IOrder, addqty: boolean }) {
let product = this.getProductByCode(code) let product = this.getProductByCode(code)
return this.addToCart({ product, order, addqty }).then((ris) => { return await this.addToCart({ product, order, addqty })
let strprod = t('ecomm.prodotto') .then((ris) => {
let strprod = t('ecomm.prodotto')
if (order.quantity > 1 || order.quantity === 0) let msg = ''
strprod = t('ecomm.prodotti') console.log('ris', ris)
if (ris && ris.myord == null) {
let msg = ''
if (ris === null)
msg = t('ecomm.error_cart')
else {
if (order.quantity === 0) {
msg = t('ecomm.prodotto_tolto') msg = t('ecomm.prodotto_tolto')
tools.showNotif($q, msg)
return
}
if (ris === null || ris.myord == null) {
msg = t('ecomm.error_cart')
tools.showNegativeNotif($q, msg)
return
} else { } else {
msg = t('ecomm.prod_sul_carrello', { strprod, qty: order.quantity })
let qta = ris.myord.quantity + ris.myord.quantitypreordered
if (qta > 1 || qta === 0)
strprod = t('ecomm.prodotti')
if (qta > 0) {
msg = t('ecomm.prod_sul_carrello', { strprod, qty: qta })
}
} }
} //updateproduct()
this.updateQuantityAvailable(product._id) if (ris === null || ris.myord.quantity === 0)
tools.showNotif($q, msg)
else
tools.showPositiveNotif($q, msg)
if (ris === null || order.quantity === 0) return ris
tools.showNotif($q, msg) })
else },
tools.showPositiveNotif($q, msg)
}) getQuantityByOrder($t: any, order: IOrder): string {
} let mystr = '';
if (order.quantity > 0) {
mystr += order.quantity
}
if ((order.quantitypreordered > 0) && (order.quantity > 0)) {
mystr += ' ' + $t('ecomm.available')
mystr += ' + '
}
if (order.quantitypreordered > 0) {
mystr += ' ' + order.quantitypreordered + ' ' + $t('ecomm.preord');
}
return mystr
},
isQtyAvailableByProduct(product: IProduct): boolean {
if (product) {
return (product.quantityAvailable! > 0)
}
return false;
},
isInPreorderByProduct(product: IProduct): boolean {
if (product) {
return (product.bookableAvailableQty! > 0)
}
return false;
},
isQtyAvailableByOrder(order: IOrder): boolean {
if (order && order.product) {
return this.isQtyAvailableByProduct(order.product)
}
return false;
},
isInPreorderByOrder(order: IOrder): boolean {
if (order && order.product) {
return this.isInPreorderByProduct(order.product)
}
return false;
},
}, },

View File

@@ -122,6 +122,7 @@ export const useGlobalStore = defineStore('GlobalStore', {
storehouses: [], storehouses: [],
scontisticas: [], scontisticas: [],
providers: [], providers: [],
gasordines: [],
departments: [], departments: [],
categories: [], categories: [],
sharewithus: [], sharewithus: [],
@@ -309,6 +310,7 @@ export const useGlobalStore = defineStore('GlobalStore', {
else if (table === 'producers') ris = state.producers else if (table === 'producers') ris = state.producers
else if (table === 'storehouses') ris = state.storehouses else if (table === 'storehouses') ris = state.storehouses
else if (table === 'providers') ris = state.providers else if (table === 'providers') ris = state.providers
else if (table === 'gasordines') ris = state.gasordines
else if (table === 'scontisticas') ris = state.scontisticas else if (table === 'scontisticas') ris = state.scontisticas
else if (table === 'groups') ris = state.groups else if (table === 'groups') ris = state.groups
else if (table === 'resps') ris = state.resps else if (table === 'resps') ris = state.resps
@@ -1537,6 +1539,7 @@ export const useGlobalStore = defineStore('GlobalStore', {
this.producers = (res.data.producers) ? [...res.data.producers] : [] this.producers = (res.data.producers) ? [...res.data.producers] : []
this.storehouses = (res.data.storehouses) ? [...res.data.storehouses] : [] this.storehouses = (res.data.storehouses) ? [...res.data.storehouses] : []
this.providers = (res.data.providers) ? [...res.data.providers] : [] this.providers = (res.data.providers) ? [...res.data.providers] : []
this.gasordines = (res.data.gasordines) ? [...res.data.gasordines] : []
this.scontisticas = (res.data.scontisticas) ? [...res.data.scontisticas] : [] this.scontisticas = (res.data.scontisticas) ? [...res.data.scontisticas] : []
this.groups = (res.data.groups) ? [...res.data.groups] : [] this.groups = (res.data.groups) ? [...res.data.groups] : []
this.resps = (res.data.resps) ? [...res.data.resps] : [] this.resps = (res.data.resps) ? [...res.data.resps] : []

View File

@@ -183,7 +183,7 @@ export default defineComponent({
const myprod = productStore.getProductByCode(lowerSearchText); const myprod = productStore.getProductByCode(lowerSearchText);
if (myprod && myprod.active) { if (myprod && myprod.active) {
let myorder: IOrder = { quantity: 1, price: 0, TotalPriceProduct: 0 } let myorder: IOrder = { quantity: 1, quantitypreordered: 0, price: 0, TotalPriceProduct: 0 }
await productStore.addtoCartBase({ $q, t, code: myprod.code!, order: myorder, addqty: true }) await productStore.addtoCartBase({ $q, t, code: myprod.code!, order: myorder, addqty: true })
search.value = '' search.value = ''
load() load()

View File

@@ -312,6 +312,7 @@ export default defineComponent({
getCols, getCols,
endload, endload,
getOrdersCartWithTotals, getOrdersCartWithTotals,
productStore,
} }
} }
}) })

View File

@@ -57,7 +57,7 @@
v-if="!!item && item.order && item.order.product" v-if="!!item && item.order && item.order.product"
> >
{{ item.order.product.name }} ({{ {{ item.order.product.name }} ({{
item.order.quantity productStore.getQuantityByOrder($t, item.order)
}})<br /> }})<br />
</div> </div>
</div> </div>
@@ -141,7 +141,7 @@
<div v-for="(item, index) of props.row.items" :key="index"> <div v-for="(item, index) of props.row.items" :key="index">
<div v-if="!!item.order && item.order.product"> <div v-if="!!item.order && item.order.product">
{{ item.order.product.name }} ({{ {{ item.order.product.name }} ({{
item.order.quantity productStore.getQuantityByOrder($t, item.order)
}})<br /> }})<br />
</div> </div>
</div> </div>