++ Cassa - parte 1
This commit is contained in:
@@ -31,6 +31,27 @@ export const shared_consts = {
|
||||
PEZZI: 4,
|
||||
},
|
||||
|
||||
TYPECASH: {
|
||||
NESSUNO: 0,
|
||||
IN: 1,
|
||||
OUT: 2,
|
||||
},
|
||||
|
||||
TypeCashStr: [
|
||||
{
|
||||
label: '[Nessuno]',
|
||||
value: 0,
|
||||
},
|
||||
{
|
||||
label: 'Ingresso',
|
||||
value: 1,
|
||||
},
|
||||
{
|
||||
label: 'Uscita',
|
||||
value: 2,
|
||||
},
|
||||
],
|
||||
|
||||
Units_Of_Measure_ListBox: [
|
||||
{
|
||||
label: '[Nessuno]',
|
||||
|
||||
@@ -97,3 +97,27 @@
|
||||
max-height: 100%;
|
||||
}
|
||||
|
||||
.titolo_prod{
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.image-section {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.image-container {
|
||||
width: 300px;
|
||||
height: 300px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
@media (max-width: 718px) {
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
}
|
||||
}
|
||||
|
||||
.img-pic {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
}
|
||||
@@ -15,6 +15,7 @@ import { tools } from '@store/Modules/tools'
|
||||
import { useProducts } from '@store/Products'
|
||||
|
||||
import { shared_consts } from '@src/common/shared_vuejs'
|
||||
import { useRouter } from 'vue-router'
|
||||
|
||||
export default defineComponent({
|
||||
name: 'CProductCard',
|
||||
@@ -53,6 +54,8 @@ export default defineComponent({
|
||||
|
||||
const site = ref(globalStore.site)
|
||||
|
||||
const $router = useRouter()
|
||||
|
||||
const fullscreenImage = ref(<any>null)
|
||||
|
||||
let myorder = reactive(<IOrder>{
|
||||
@@ -293,6 +296,7 @@ export default defineComponent({
|
||||
function load() {
|
||||
initproduct()
|
||||
updateproduct()
|
||||
|
||||
// console.log('Load', myproduct.value.name)
|
||||
// console.log('created Cproductcard', code)
|
||||
|
||||
@@ -406,6 +410,10 @@ export default defineComponent({
|
||||
fullscreenImage.value.fullscreenImage.style.transform = 'scale(1)';
|
||||
}
|
||||
|
||||
function naviga(path: string) {
|
||||
$router.push(path)
|
||||
}
|
||||
|
||||
onMounted(mounted)
|
||||
onBeforeUnmount(beforeDestroy)
|
||||
|
||||
@@ -450,7 +458,8 @@ export default defineComponent({
|
||||
onTouchStart,
|
||||
onTouchMove,
|
||||
onTouchEnd,
|
||||
|
||||
$router,
|
||||
naviga,
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
@@ -1,43 +1,28 @@
|
||||
<template>
|
||||
<div class="row items-start q-gutter-md">
|
||||
|
||||
<q-spinner v-if="!endload" color="primary" size="3em" :thickness="2" />
|
||||
|
||||
<q-card
|
||||
:class="{
|
||||
<q-card :class="{
|
||||
'my-card-big': complete,
|
||||
'my-card-prod': !complete,
|
||||
'my-card-selected':
|
||||
myorder && myorder.quantity + myorder.quantitypreordered > 0,
|
||||
}"
|
||||
v-if="!!myproduct && endload && !!myproduct.productInfo"
|
||||
bordered
|
||||
>
|
||||
<q-card-section horizontal>
|
||||
<q-img
|
||||
:src="`` + myproduct.productInfo.img"
|
||||
:alt="myproduct.productInfo.name"
|
||||
class="col-7 cursor-pointer"
|
||||
}" v-if="!!myproduct && endload && !!myproduct.productInfo" bordered>
|
||||
<q-card-section horizontal class="image-section">
|
||||
<div class="image-container">
|
||||
<q-img :src="`` + myproduct.productInfo.img" :alt="myproduct.productInfo.name" class="cursor-pointer img-pic"
|
||||
@click="complete ? toggleFullScreen : naviga(`/product/` + myproduct._id + '/' + cosa)"></q-img>
|
||||
<q-btn color="primary" round icon="fas fa-eye" class="absolute semi-transparent" size="md"
|
||||
@click="toggleFullScreen"
|
||||
></q-img>
|
||||
<q-btn
|
||||
v-if="!complete"
|
||||
fab
|
||||
color="primary"
|
||||
icon="fas fa-info"
|
||||
class="absolute semi-transparent"
|
||||
style="top: 0; right: 12px; transform: translateY(-90%)"
|
||||
:to="`/product/` + myproduct._id + '/' + cosa"
|
||||
/>
|
||||
|
||||
<q-card-section>
|
||||
style="bottom: -10px; right: 0px; transform: translateY(-50%);" />
|
||||
</div>
|
||||
<q-btn v-if="!complete" fab color="primary" icon="fas fa-info" class="absolute semi-transparent"
|
||||
style="top: 0; right: 12px; transform: translateY(-90%)" :to="`/product/` + myproduct._id + '/' + cosa" />
|
||||
<q-list>
|
||||
<q-item>
|
||||
<q-item-section avatar>
|
||||
<q-icon
|
||||
color="moneygreen"
|
||||
name="fas fa-euro-sign"
|
||||
class="icone_prod"
|
||||
/>
|
||||
<q-icon color="moneygreen" name="fas fa-euro-sign" class="icone_prod" />
|
||||
</q-item-section>
|
||||
|
||||
<q-item-section>
|
||||
@@ -49,16 +34,9 @@
|
||||
myproduct.after_price
|
||||
}}</span>
|
||||
</q-item-label>
|
||||
<q-item-label
|
||||
v-if="
|
||||
myproduct.scontisticas && myproduct.scontisticas.length > 0
|
||||
"
|
||||
>
|
||||
<div
|
||||
class="prod_sconti"
|
||||
v-for="(sconti, index) of myproduct.scontisticas"
|
||||
:key="index"
|
||||
>
|
||||
<q-item-label v-if="myproduct.scontisticas && myproduct.scontisticas.length > 0
|
||||
">
|
||||
<div class="prod_sconti" v-for="(sconti, index) of myproduct.scontisticas" :key="index">
|
||||
{{ sconti.description }}
|
||||
</div>
|
||||
</q-item-label>
|
||||
@@ -70,33 +48,24 @@
|
||||
</q-item-section>
|
||||
<q-item-section v-if="myproduct.productInfo.weight">
|
||||
<q-item-label>
|
||||
<span
|
||||
class="text-black q-ml-xs text-h8"
|
||||
v-if="myproduct.productInfo.unit"
|
||||
>
|
||||
<span class="text-black q-ml-xs text-h8" v-if="myproduct.productInfo.unit">
|
||||
{{ myproduct.productInfo.weight }}
|
||||
{{
|
||||
tools.getUnitsMeasure(myproduct.productInfo.unit, true)
|
||||
}}</span
|
||||
>
|
||||
}}</span>
|
||||
</q-item-label>
|
||||
</q-item-section>
|
||||
</q-item>
|
||||
<q-item
|
||||
v-if="
|
||||
cosa === shared_consts.PROD.BOTTEGA ||
|
||||
<q-item v-if="cosa === shared_consts.PROD.BOTTEGA ||
|
||||
(cosa === shared_consts.PROD.GAS &&
|
||||
products.getQtyAvailable(myproduct) > 0)
|
||||
"
|
||||
:clickable="tools.isManager()"
|
||||
@click="
|
||||
" :clickable="tools.isManager()" @click="
|
||||
tools.isManager() &&
|
||||
myproduct.QuantitaOrdinateInAttesa &&
|
||||
myproduct.QuantitaOrdinateInAttesa > 0
|
||||
? visuListDisponibili()
|
||||
: null
|
||||
"
|
||||
>
|
||||
">
|
||||
<q-item-section avatar>
|
||||
<q-icon color="green" name="fas fa-store" class="icone_prod" />
|
||||
</q-item-section>
|
||||
@@ -110,12 +79,9 @@
|
||||
{{ products.getQtyAvailable(myproduct) }}
|
||||
</span>
|
||||
<div class="prod_qtywarn">
|
||||
<div
|
||||
v-if="
|
||||
tools.isManager() &&
|
||||
<div v-if="tools.isManager() &&
|
||||
!!myproduct.QuantitaOrdinateInAttesa
|
||||
"
|
||||
>
|
||||
">
|
||||
{{
|
||||
t('ecomm.qta_in_attesa', {
|
||||
qty: myproduct.QuantitaOrdinateInAttesa,
|
||||
@@ -125,39 +91,30 @@
|
||||
</div>
|
||||
</q-item-label>
|
||||
</q-item-section>
|
||||
<q-item-section
|
||||
v-if="
|
||||
tools.isManager() &&
|
||||
<q-item-section v-if="tools.isManager() &&
|
||||
products.getQtyBloccataAvailable(myproduct) > 0
|
||||
"
|
||||
>
|
||||
">
|
||||
<q-item-section avatar>
|
||||
<q-icon
|
||||
name="fas fa-store"
|
||||
style="padding-right: 16px !important"
|
||||
/>
|
||||
<q-icon name="fas fa-store" style="padding-right: 16px !important" />
|
||||
</q-item-section>
|
||||
<q-item-section
|
||||
v-if="
|
||||
tools.isManager() &&
|
||||
<q-item-section v-if="tools.isManager() &&
|
||||
products.getQtyBloccataAvailable(myproduct) > 0
|
||||
"
|
||||
>
|
||||
">
|
||||
<q-item-label> {{ t('ecomm.bloccati') }}: </q-item-label>
|
||||
<q-item-label>
|
||||
<span class="text-black q-ml-xs text-h8">
|
||||
{{ products.getQtyBloccataAvailable(myproduct) }}</span
|
||||
>
|
||||
{{ products.getQtyBloccataAvailable(myproduct) }}</span>
|
||||
</q-item-label>
|
||||
</q-item-section>
|
||||
</q-item-section>
|
||||
</q-item>
|
||||
</q-list>
|
||||
|
||||
</q-card-section>
|
||||
</q-card-section>
|
||||
|
||||
<q-card-section>
|
||||
<div class="column items-center centeritems">
|
||||
<div class="text-h7 boldhigh">
|
||||
<div class="text-h7 boldhigh titolo_prod">
|
||||
{{ myproduct.productInfo.name }}
|
||||
</div>
|
||||
<div class="product_code">
|
||||
@@ -168,10 +125,29 @@
|
||||
<q-card-section v-if="complete && myproduct.productInfo.description">
|
||||
<div class="row items-center">
|
||||
<div class="text-title text-grey-9">
|
||||
<span
|
||||
class="text-grey-7"
|
||||
v-html="myproduct.productInfo.description"
|
||||
></span>
|
||||
<span class="text-grey-7" v-html="myproduct.productInfo.description"></span>
|
||||
</div>
|
||||
</div>
|
||||
</q-card-section>
|
||||
<q-card-section v-if="complete && myproduct.productInfo.ingredienti">
|
||||
<div class="text-blue text-title row">
|
||||
<q-icon size="sm" name="fas fa-list-ul" class="q-mr-sm" />
|
||||
{{ t('products.ingredienti') }}
|
||||
</div>
|
||||
<div class="row items-center">
|
||||
<div class="text-title text-grey-9">
|
||||
<span class="text-grey-7" v-html="myproduct.productInfo.ingredienti"></span>
|
||||
</div>
|
||||
</div>
|
||||
</q-card-section>
|
||||
<q-card-section v-if="complete && myproduct.productInfo.valori_nutrizionali">
|
||||
<div class="text-blue text-title row">
|
||||
<q-icon size="sm" name="fas fa-info" class="q-mr-sm" />
|
||||
{{ t('products.valori_nutrizionali') }}
|
||||
</div>
|
||||
<div class="row items-center">
|
||||
<div class="text-title text-grey-9">
|
||||
<span class="text-grey-7" v-html="myproduct.productInfo.valori_nutrizionali"></span>
|
||||
</div>
|
||||
</div>
|
||||
</q-card-section>
|
||||
@@ -180,19 +156,10 @@
|
||||
<q-icon size="sm" name="fas fa-people-carry" class="q-mr-sm" />
|
||||
{{ t('products.ritiro_presso') }}:
|
||||
</div>
|
||||
<div
|
||||
class="text-green-6 text-title row items-center q-my-sm centeritems"
|
||||
>
|
||||
<div class="text-green-6 text-title row items-center q-my-sm centeritems">
|
||||
<div v-if="getnumstore() > 1">
|
||||
<q-select
|
||||
:behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'"
|
||||
outlined
|
||||
v-model="storeSelected"
|
||||
:options="getStorehouses()"
|
||||
:label="t('products.magazzino') + `:`"
|
||||
emit-value
|
||||
map-options
|
||||
>
|
||||
<q-select :behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'" outlined v-model="storeSelected"
|
||||
:options="getStorehouses()" :label="t('products.magazzino') + `:`" emit-value map-options>
|
||||
</q-select>
|
||||
</div>
|
||||
<div v-else>
|
||||
@@ -202,9 +169,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</q-card-section>
|
||||
<q-card-section
|
||||
v-if="complete && myproduct.producer && myproduct.producer.city"
|
||||
>
|
||||
<q-card-section v-if="complete && myproduct.producer && myproduct.producer.city">
|
||||
<div>
|
||||
<div class="text-grey text-title row items-center q-mt-sm">
|
||||
<q-icon name="map" class="q-mr-xs" />
|
||||
@@ -212,19 +177,15 @@
|
||||
<span class="text-blue q-ml-xs text-h8">
|
||||
{{ myproduct.producer.city }} ({{
|
||||
myproduct.producer.region
|
||||
}})</span
|
||||
>
|
||||
}})</span>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="complete && myproduct.producer && myproduct.producer.name"
|
||||
class="text-grey text-title row items-center"
|
||||
>
|
||||
<div v-if="complete && myproduct.producer && myproduct.producer.name"
|
||||
class="text-grey text-title row items-center">
|
||||
<q-icon name="place" class="q-mr-xs" />
|
||||
{{ t('products.producer') }}:
|
||||
<span class="text-black q-ml-xs text-h8">
|
||||
{{ myproduct.producer.name }}</span
|
||||
>
|
||||
{{ myproduct.producer.name }}</span>
|
||||
</div>
|
||||
</q-card-section>
|
||||
|
||||
@@ -242,20 +203,15 @@
|
||||
</q-item>
|
||||
</q-card-section>
|
||||
<q-card-section v-if="isOrdGas()">
|
||||
<q-item
|
||||
v-if="
|
||||
products.getQtyBookableAvailable(myproduct) > 0 ||
|
||||
<q-item v-if="products.getQtyBookableAvailable(myproduct) > 0 ||
|
||||
myproduct.maxbookableGASQty > 0
|
||||
"
|
||||
:clickable="tools.isManager()"
|
||||
@click="
|
||||
" :clickable="tools.isManager()" @click="
|
||||
tools.isManager() &&
|
||||
myproduct.QuantitaPrenotateInAttesa &&
|
||||
myproduct.QuantitaPrenotateInAttesa > 0
|
||||
? visuListBookable()
|
||||
: null
|
||||
"
|
||||
>
|
||||
">
|
||||
<q-item-section avatar>
|
||||
<q-icon color="blue" name="fas fa-edit" />
|
||||
</q-item-section>
|
||||
@@ -269,11 +225,8 @@
|
||||
{{ products.getQtyBookableAvailable(myproduct) }}
|
||||
</span>
|
||||
<div class="prod_qtywarn">
|
||||
<div
|
||||
v-if="
|
||||
tools.isManager() && !!myproduct.QuantitaPrenotateInAttesa
|
||||
"
|
||||
>
|
||||
<div v-if="tools.isManager() && !!myproduct.QuantitaPrenotateInAttesa
|
||||
">
|
||||
{{
|
||||
t('ecomm.qta_prenotate_in_attesa', {
|
||||
qty: myproduct.QuantitaPrenotateInAttesa,
|
||||
@@ -283,17 +236,11 @@
|
||||
</div>
|
||||
</q-item-label>
|
||||
</q-item-section>
|
||||
<q-item-section
|
||||
v-if="
|
||||
tools.isManager() &&
|
||||
<q-item-section v-if="tools.isManager() &&
|
||||
products.getQtyBloccataBookableAvailable(myproduct) > 0
|
||||
"
|
||||
>
|
||||
">
|
||||
<q-item-section avatar>
|
||||
<q-icon
|
||||
name="fas fa-store"
|
||||
style="padding-right: 16px !important"
|
||||
/>
|
||||
<q-icon name="fas fa-store" style="padding-right: 16px !important" />
|
||||
</q-item-section>
|
||||
<q-item-section>
|
||||
<q-item-label class="subtit_prod">
|
||||
@@ -303,8 +250,7 @@
|
||||
<span class="text-black q-ml-xs text-h8">
|
||||
{{
|
||||
products.getQtyBloccataBookableAvailable(myproduct)
|
||||
}}</span
|
||||
>
|
||||
}}</span>
|
||||
</q-item-label>
|
||||
</q-item-section>
|
||||
</q-item-section>
|
||||
@@ -318,23 +264,13 @@
|
||||
<q-item-label class="subtit_prod">
|
||||
{{ t('products.gasordine') }}
|
||||
</q-item-label>
|
||||
<q-item-label
|
||||
v-if="
|
||||
tools.isArray(myproduct.gasordines) &&
|
||||
<q-item-label v-if="tools.isArray(myproduct.gasordines) &&
|
||||
myproduct.gasordines.length > 1 &&
|
||||
(!myorder.idGasordine ||
|
||||
myorder.quantity + myorder.quantitypreordered === 0)
|
||||
"
|
||||
>
|
||||
<q-select
|
||||
:behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'"
|
||||
outlined
|
||||
v-model="gasordineSelected"
|
||||
:options="getGasordines()"
|
||||
:label="t('products.select_gasordine') + `:`"
|
||||
emit-value
|
||||
map-options
|
||||
>
|
||||
">
|
||||
<q-select :behavior="$q.platform.is.ios === true ? 'dialog' : 'menu'" outlined v-model="gasordineSelected"
|
||||
:options="getGasordines()" :label="t('products.select_gasordine') + `:`" emit-value map-options>
|
||||
</q-select>
|
||||
</q-item-label>
|
||||
<q-item-label v-else>
|
||||
@@ -345,40 +281,26 @@
|
||||
</q-item-section>
|
||||
</q-item>
|
||||
|
||||
<q-item
|
||||
v-if="
|
||||
tools.isManager() && products.getQtyBloccataAvailable(myproduct) > 0
|
||||
"
|
||||
>
|
||||
<q-item v-if="tools.isManager() && products.getQtyBloccataAvailable(myproduct) > 0
|
||||
">
|
||||
<q-item-section>
|
||||
<q-item-section avatar>
|
||||
<q-icon
|
||||
name="fas fa-store"
|
||||
style="padding-right: 16px !important"
|
||||
/>
|
||||
<q-icon name="fas fa-store" style="padding-right: 16px !important" />
|
||||
</q-item-section>
|
||||
<q-item-section
|
||||
v-if="
|
||||
tools.isManager() &&
|
||||
<q-item-section v-if="tools.isManager() &&
|
||||
products.getQtyBloccataAvailable(myproduct) > 0
|
||||
"
|
||||
>
|
||||
">
|
||||
<q-item-label> {{ t('ecomm.bloccati') }}: </q-item-label>
|
||||
<q-item-label>
|
||||
<span class="text-black q-ml-xs text-h8">
|
||||
{{ products.getQtyBloccataAvailable(myproduct) }}</span
|
||||
>
|
||||
{{ products.getQtyBloccataAvailable(myproduct) }}</span>
|
||||
</q-item-label>
|
||||
</q-item-section>
|
||||
</q-item-section>
|
||||
</q-item>
|
||||
<q-item v-if="isOrdGas() && myproduct.qtyToReachForGas > 0">
|
||||
<q-item-section avatar>
|
||||
<q-icon
|
||||
v-if="getpercqtaraggiunta() < 1"
|
||||
color="orange"
|
||||
name="fas fa-lightbulb"
|
||||
/>
|
||||
<q-icon v-if="getpercqtaraggiunta() < 1" color="orange" name="fas fa-lightbulb" />
|
||||
<q-icon v-else color="green" name="fas fa-check" />
|
||||
</q-item-section>
|
||||
|
||||
@@ -408,11 +330,8 @@
|
||||
<q-linear-progress size="10px" :value="getpercqtaraggiunta()" />
|
||||
</span>
|
||||
<div class="prod_qtywarn">
|
||||
<div
|
||||
v-if="
|
||||
tools.isManager() && !!myproduct.QuantitaOrdinateInAttesa
|
||||
"
|
||||
>
|
||||
<div v-if="tools.isManager() && !!myproduct.QuantitaOrdinateInAttesa
|
||||
">
|
||||
{{
|
||||
t('ecomm.qta_in_attesa', {
|
||||
qty: myproduct.QuantitaOrdinateInAttesa,
|
||||
@@ -422,29 +341,19 @@
|
||||
</div>
|
||||
</q-item-label>
|
||||
</q-item-section>
|
||||
<q-item-section
|
||||
v-if="
|
||||
tools.isManager() &&
|
||||
<q-item-section v-if="tools.isManager() &&
|
||||
products.getQtyBloccataAvailable(myproduct) > 0
|
||||
"
|
||||
>
|
||||
">
|
||||
<q-item-section avatar>
|
||||
<q-icon
|
||||
name="fas fa-store"
|
||||
style="padding-right: 16px !important"
|
||||
/>
|
||||
<q-icon name="fas fa-store" style="padding-right: 16px !important" />
|
||||
</q-item-section>
|
||||
<q-item-section
|
||||
v-if="
|
||||
tools.isManager() &&
|
||||
<q-item-section v-if="tools.isManager() &&
|
||||
products.getQtyBloccataAvailable(myproduct) > 0
|
||||
"
|
||||
>
|
||||
">
|
||||
<q-item-label> {{ t('ecomm.bloccati') }}: </q-item-label>
|
||||
<q-item-label>
|
||||
<span class="text-black q-ml-xs text-h8">
|
||||
{{ products.getQtyBloccataAvailable(myproduct) }}</span
|
||||
>
|
||||
{{ products.getQtyBloccataAvailable(myproduct) }}</span>
|
||||
</q-item-label>
|
||||
</q-item-section>
|
||||
</q-item-section>
|
||||
@@ -497,19 +406,11 @@
|
||||
|
||||
<q-card-section>
|
||||
<div class="row justify-evenly">
|
||||
<q-btn
|
||||
icon="fas fa-cart-arrow-down"
|
||||
:color="products.enableSubQty(myorder) ? 'negative' : 'grey'"
|
||||
:disable="checkifCartDisable() || !products.enableSubQty(myorder)"
|
||||
rounded
|
||||
size="md"
|
||||
:label="
|
||||
t('products.subcart', {
|
||||
<q-btn icon="fas fa-cart-arrow-down" :color="products.enableSubQty(myorder) ? 'negative' : 'grey'"
|
||||
:disable="checkifCartDisable() || !products.enableSubQty(myorder)" rounded size="md" :label="t('products.subcart', {
|
||||
qta: products.qtaNextSub(myorder, myproduct),
|
||||
})
|
||||
"
|
||||
@click="addtoCart(false)"
|
||||
>
|
||||
" @click="addtoCart(false)">
|
||||
</q-btn>
|
||||
|
||||
<q-field outlined dense class="q-mx-xs">
|
||||
@@ -520,31 +421,14 @@
|
||||
</template>
|
||||
</q-field>
|
||||
|
||||
<q-btn
|
||||
icon-right="fas fa-cart-plus"
|
||||
color="positive"
|
||||
:disable="
|
||||
checkifCartDisable() || !products.enableAddQty(myorder, myproduct)
|
||||
"
|
||||
rounded
|
||||
size="md"
|
||||
:label="
|
||||
t('products.addcart', {
|
||||
<q-btn icon-right="fas fa-cart-plus" color="positive" :disable="checkifCartDisable() || !products.enableAddQty(myorder, myproduct)
|
||||
" rounded size="md" :label="t('products.addcart', {
|
||||
qta: products.qtaNextAdd(myorder, myproduct),
|
||||
})
|
||||
"
|
||||
@click="addtoCart(true)"
|
||||
>
|
||||
" @click="addtoCart(true)">
|
||||
</q-btn>
|
||||
<q-btn
|
||||
v-if="myorder.quantity + myorder.quantitypreordered > 0"
|
||||
rounded
|
||||
icon="fas fa-shopping-cart"
|
||||
color="primary"
|
||||
:label="t('ecomm.btn_cassa')"
|
||||
class="q-mb-xs q-mt-md"
|
||||
to="/checkout"
|
||||
></q-btn>
|
||||
<q-btn v-if="myorder.quantity + myorder.quantitypreordered > 0" rounded icon="fas fa-shopping-cart"
|
||||
color="primary" :label="t('ecomm.btn_cassa')" class="q-mb-xs q-mt-md" to="/checkout"></q-btn>
|
||||
</div>
|
||||
</q-card-section>
|
||||
</q-card>
|
||||
@@ -558,12 +442,7 @@
|
||||
<q-btn flat round color="white" icon="close" v-close-popup></q-btn>
|
||||
</q-toolbar>
|
||||
<q-card-section class="q-pa-xs inset-shadow">
|
||||
<q-markup-table
|
||||
wrap-cells
|
||||
bordered
|
||||
separator="horizontal"
|
||||
class="listaev__table"
|
||||
>
|
||||
<q-markup-table wrap-cells bordered separator="horizontal" class="listaev__table">
|
||||
<thead>
|
||||
<th>Data</th>
|
||||
<th>Persona</th>
|
||||
@@ -573,11 +452,7 @@
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<tr
|
||||
v-for="(ordcart, index) of listord"
|
||||
:key="index"
|
||||
class="listaev listaev__table"
|
||||
>
|
||||
<tr v-for="(ordcart, index) of listord" :key="index" class="listaev listaev__table">
|
||||
<td class="text-center">
|
||||
<div>
|
||||
{{ func_tools.getDateTimeShortStr(ordcart.created_at) }}
|
||||
@@ -595,22 +470,14 @@
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<div v-for="(singleord, index) in ordcart.items" :key="index">
|
||||
<span
|
||||
v-if="
|
||||
singleord.order.idProduct === myproduct._id &&
|
||||
<span v-if="singleord.order.idProduct === myproduct._id &&
|
||||
singleord.order.quantity > 0
|
||||
"
|
||||
>
|
||||
{{ singleord.order.quantity }}</span
|
||||
>
|
||||
<span
|
||||
v-if="
|
||||
singleord.order.idProduct === myproduct._id &&
|
||||
">
|
||||
{{ singleord.order.quantity }}</span>
|
||||
<span v-if="singleord.order.idProduct === myproduct._id &&
|
||||
singleord.order.quantitypreordered > 0
|
||||
"
|
||||
>
|
||||
{{ singleord.order.quantitypreordered }}</span
|
||||
>
|
||||
">
|
||||
{{ singleord.order.quantitypreordered }}</span>
|
||||
</div>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
@@ -632,38 +499,14 @@
|
||||
</q-card>
|
||||
</q-dialog>
|
||||
|
||||
<q-dialog
|
||||
v-model="isFullScreen"
|
||||
position="top"
|
||||
:maximized="true"
|
||||
class="q-pt-none"
|
||||
>
|
||||
<div
|
||||
v-if="isFullScreen"
|
||||
class="fullscreen-container"
|
||||
@touchmove.prevent
|
||||
@click="toggleFullScreen"
|
||||
>
|
||||
<img
|
||||
:src="`` + myproduct.productInfo.img"
|
||||
:alt="myproduct.productInfo.name"
|
||||
class="fullscreen-image"
|
||||
@touchstart="onTouchStart"
|
||||
@touchmove="onTouchMove"
|
||||
@touchend="onTouchEnd"
|
||||
ref="fullscreenImage"
|
||||
/>
|
||||
<q-dialog v-model="isFullScreen" position="top" :maximized="true" class="q-pt-none">
|
||||
<div v-if="isFullScreen" class="fullscreen-container" @touchmove.prevent @click="toggleFullScreen">
|
||||
<q-img :src="`` + myproduct.productInfo.img" :alt="myproduct.productInfo.name" :fit="tools.isMobile() ? 'fill' : 'none'"
|
||||
@touchstart="onTouchStart" @touchmove="onTouchMove" @touchend="onTouchEnd" ref="fullscreenImage" />
|
||||
<br />
|
||||
</div>
|
||||
<div class="text-center">
|
||||
<q-btn
|
||||
class="q-ma-md"
|
||||
@click="isFullScreen = false"
|
||||
label="Chiudi"
|
||||
rounded
|
||||
color="primary"
|
||||
icon="close"
|
||||
></q-btn>
|
||||
<q-btn class="q-ma-md" @click="isFullScreen = false" label="Chiudi" rounded color="primary" icon="close"></q-btn>
|
||||
</div>
|
||||
</q-dialog>
|
||||
</div>
|
||||
|
||||
@@ -31,6 +31,7 @@ const msg_website_it = {
|
||||
producer: 'Produttore',
|
||||
orderinfo: 'Ordini Effettuati',
|
||||
products: 'Prodotti',
|
||||
cash: 'Cassa',
|
||||
productInfos: 'Info Prodotti',
|
||||
listinoprodotti: 'Listino Prodotti',
|
||||
productslist: 'Lista Prodotti',
|
||||
|
||||
@@ -17,6 +17,8 @@ export interface IProductInfo {
|
||||
date?: Date,
|
||||
icon?: string,
|
||||
img?: string
|
||||
ingredienti?: string,
|
||||
valori_nutrizionali?: string,
|
||||
}
|
||||
|
||||
export interface IProduct {
|
||||
@@ -133,6 +135,7 @@ export interface IStorehouse {
|
||||
_id?: any
|
||||
idapp?: string
|
||||
name?: string,
|
||||
username?: string,
|
||||
description?: string,
|
||||
referent?: string,
|
||||
address?: string,
|
||||
|
||||
0
src/rootgen/admin/cash/cash.scss
Executable file
0
src/rootgen/admin/cash/cash.scss
Executable file
24
src/rootgen/admin/cash/cash.ts
Executable file
24
src/rootgen/admin/cash/cash.ts
Executable file
@@ -0,0 +1,24 @@
|
||||
import { defineComponent } from 'vue'
|
||||
|
||||
import { CImgText } from '../../../components/CImgText/index'
|
||||
import { CCard } from '@/components/CCard'
|
||||
import { CMyPage } from '@/components/CMyPage'
|
||||
import { CTitleBanner } from '@/components/CTitleBanner'
|
||||
import { CGridTableRec } from '@/components/CGridTableRec'
|
||||
|
||||
import { colTableCash } from '@src/store/Modules/fieldsTable'
|
||||
import MixinMetaTags from '@/mixins/mixin-metatags'
|
||||
|
||||
export default defineComponent({
|
||||
name: 'Cash',
|
||||
components: { CImgText, CCard, CMyPage, CTitleBanner, CGridTableRec },
|
||||
setup() {
|
||||
|
||||
const { setmeta } = MixinMetaTags()
|
||||
|
||||
return {
|
||||
colTableCash,
|
||||
setmeta,
|
||||
}
|
||||
}
|
||||
})
|
||||
32
src/rootgen/admin/cash/cash.vue
Executable file
32
src/rootgen/admin/cash/cash.vue
Executable file
@@ -0,0 +1,32 @@
|
||||
<template>
|
||||
<CMyPage title="Cassa" imgbackground="images/prodotti.jpg" sizes="max-height: 120px">
|
||||
<span>{{
|
||||
setmeta({
|
||||
title: 'Cassa',
|
||||
description: '',
|
||||
keywords: '',
|
||||
})
|
||||
}}
|
||||
</span>
|
||||
|
||||
|
||||
<div class="q-ma-sm q-gutter-sm q-pa-xs">
|
||||
<CTitleBanner title="Cassa"></CTitleBanner>
|
||||
<CGridTableRec
|
||||
prop_mytable="cashs"
|
||||
prop_mytitle="Cassa"
|
||||
:prop_mycolumns="colTableCash"
|
||||
prop_colkey="name"
|
||||
nodataLabel="Nessuna Cassa"
|
||||
noresultLabel="Il filtro selezionato non ha trovato nessun risultato">
|
||||
|
||||
</CGridTableRec>
|
||||
</div>
|
||||
</CMyPage>
|
||||
</template>
|
||||
<script lang="ts" src="./cash.ts">
|
||||
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
@import 'cash.scss';
|
||||
</style>
|
||||
@@ -38,7 +38,7 @@ export const cfgrouter = {
|
||||
tools.addRoute(arrroutes, route)
|
||||
}
|
||||
|
||||
console.log('getmenu', arrroutes)
|
||||
// console.log('getmenu', arrroutes)
|
||||
|
||||
return arrroutes
|
||||
},
|
||||
|
||||
@@ -83,6 +83,20 @@ function getRoutesEcomm(site: ISites) {
|
||||
onlyManager: true,
|
||||
onlyEditor: true
|
||||
},
|
||||
{
|
||||
active: true,
|
||||
order: 30,
|
||||
path: '/admin/ecommerce/cash',
|
||||
materialIcon: 'fas fa-cash-register',
|
||||
name: 'pages.cash',
|
||||
component: () => import('@/rootgen/admin/cash/cash.vue'),
|
||||
inmenu: true,
|
||||
submenu: true,
|
||||
level_parent: 0,
|
||||
level_child: 0.5,
|
||||
onlyManager: true,
|
||||
onlyEditor: true
|
||||
},
|
||||
{
|
||||
active: true,
|
||||
order: 30,
|
||||
@@ -231,6 +245,15 @@ function getRoutesEcomm(site: ISites) {
|
||||
inmenu: false,
|
||||
infooter: false,
|
||||
},
|
||||
{
|
||||
active: true,
|
||||
order: 30,
|
||||
path: '/admin/ecommerce/cash',
|
||||
name: 'pages.cash',
|
||||
component: () => import('@/rootgen/admin/cash/cash.vue'),
|
||||
inmenu: false,
|
||||
infooter: false,
|
||||
},
|
||||
{
|
||||
active: true,
|
||||
order: 31,
|
||||
|
||||
@@ -79,7 +79,7 @@ const msg_it = {
|
||||
addcart: '+{qta}',
|
||||
subcart: '-{qta}',
|
||||
origine: 'Origine',
|
||||
ingredienti: 'ingredienti',
|
||||
ingredienti: 'Ingredienti',
|
||||
valori_nutrizionali: 'Valori Nutrizionali',
|
||||
note: 'Note',
|
||||
codice_EAN: 'EAN',
|
||||
@@ -1715,7 +1715,25 @@ const msg_it = {
|
||||
x_prodotti_gas: '{qta} prodotti',
|
||||
x_prodotti_bottega: '{qta} prodotti',
|
||||
tutti: 'Tutti',
|
||||
}
|
||||
},
|
||||
orderscart: {
|
||||
numorder: 'Ordine',
|
||||
totalQty: 'totalQty',
|
||||
totalQtyPreordered: 'totalQty PreOrd',
|
||||
},
|
||||
cash: {
|
||||
creatorUserId: 'Creatore',
|
||||
date_payment: 'Data Pagamento',
|
||||
type: 'Entrata/Uscita',
|
||||
descr: 'Descrizione',
|
||||
internal: 'Interno',
|
||||
note: 'Note',
|
||||
fromUserId: 'Mittente',
|
||||
toUserId: 'Destinatario',
|
||||
orderscart: 'Ordine',
|
||||
confirmed: 'Confermato',
|
||||
causale: 'Causale',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -1997,17 +1997,28 @@ export const colTableProductInfos = [
|
||||
AddCol({ name: 'size', label_trans: 'products.size' }),
|
||||
AddCol({ name: 'weight', label_trans: 'products.weight', fieldtype: costanti.FieldType.number }),
|
||||
AddCol({ name: 'vegan', label_trans: 'products.vegan', fieldtype: costanti.FieldType.boolean }),
|
||||
AddCol({ name: 'unit', label_trans: 'products.unit',
|
||||
fieldtype: costanti.FieldType.select, jointable: 'units', }),
|
||||
AddCol({
|
||||
name: 'unit', label_trans: 'products.unit',
|
||||
fieldtype: costanti.FieldType.select, jointable: 'units',
|
||||
}),
|
||||
AddCol({ name: 'stars', label_trans: 'products.stars', fieldtype: costanti.FieldType.number }),
|
||||
AddCol({ name: 'date', label_trans: 'products.date', fieldtype: costanti.FieldType.date }),
|
||||
AddCol({ name: 'ingredienti', label_trans: 'products.ingredienti' }),
|
||||
AddCol({ name: 'valori_nutrizionali', label_trans: 'products.valori_nutrizionali' }),
|
||||
AddCol({ name: 'note', label_trans: 'products.note' }),
|
||||
AddCol({ name: 'ingredienti', label_trans: 'products.ingredienti', fieldtype: costanti.FieldType.html }),
|
||||
AddCol({ name: 'valori_nutrizionali', label_trans: 'products.valori_nutrizionali', fieldtype: costanti.FieldType.html }),
|
||||
AddCol({ name: 'note', label_trans: 'products.note', fieldtype: costanti.FieldType.html }),
|
||||
AddCol(DeleteRec),
|
||||
AddCol(DuplicateRec),
|
||||
]
|
||||
|
||||
export const colTableOrdersCart = [
|
||||
AddCol({ name: '_id', label_trans: 'others.value' }),
|
||||
AddCol({ name: 'numorder', label_trans: 'orderscart.numorder', fieldtype: costanti.FieldType.boolean }),
|
||||
AddCol({ name: 'totalQty', label_trans: 'orderscart.totalQty', fieldtype: costanti.FieldType.number }),
|
||||
AddCol({ name: 'totalQtyPreordered', label_trans: 'orderscart.totalQtyPreordered', fieldtype: costanti.FieldType.number }),
|
||||
AddCol({ name: 'totalPrice', label_trans: 'orderscart.totalPrice', fieldtype: costanti.FieldType.number }),
|
||||
AddCol({ name: 'status', label_trans: 'orderscart.status', fieldtype: costanti.FieldType.number }),
|
||||
]
|
||||
|
||||
export const colTableProducts = [
|
||||
AddCol({ name: 'active', label_trans: 'products.active', fieldtype: costanti.FieldType.boolean }),
|
||||
AddCol({
|
||||
@@ -2375,6 +2386,37 @@ const colTableEvents = [
|
||||
AddCol(DuplicateRec),
|
||||
]
|
||||
|
||||
export const colTableCash = [
|
||||
AddCol({ name: '_id', label_trans: 'event._id' }),
|
||||
AddCol({ name: 'creatorUserId', label_trans: 'order.users', fieldtype: costanti.FieldType.select, jointable: 'users' }),
|
||||
AddCol({
|
||||
name: 'idCashCategory',
|
||||
label_trans: 'Category.idCashCategory',
|
||||
fieldtype: costanti.FieldType.select,
|
||||
jointable: 'cashcategory',
|
||||
}),
|
||||
AddCol({ name: 'fromUserId', label_trans: 'cash.fromUserId', fieldtype: costanti.FieldType.select, jointable: 'users' }),
|
||||
AddCol({ name: 'toUserId', label_trans: 'cash.toUserId', fieldtype: costanti.FieldType.select, jointable: 'users' }),
|
||||
AddCol({ name: 'idOrdersCart', label_trans: 'cash.orderscart', fieldtype: costanti.FieldType.select, jointable: 'orderscart' }),
|
||||
AddCol({ name: 'type', label_trans: 'cash.type', fieldtype: costanti.FieldType.select, jointable: toolsext.TABTYPECASH }),
|
||||
AddCol({
|
||||
name: 'date_payment', label_trans: 'cash.date_payment', fieldtype: costanti.FieldType.onlydate,
|
||||
sortable: true,
|
||||
}),
|
||||
AddCol({ name: 'price', label_trans: 'products.price', fieldtype: costanti.FieldType.number }),
|
||||
AddCol({ name: 'causale', label_trans: 'cash.causale' }),
|
||||
AddCol({ name: 'note', label_trans: 'cash.note' }),
|
||||
AddCol({ name: 'internal', label_trans: 'cash.internal', fieldtype: costanti.FieldType.boolean }),
|
||||
AddCol({ name: 'extra', label_trans: 'cash.extra', fieldtype: costanti.FieldType.boolean }),
|
||||
AddCol({ name: 'confirmed', label_trans: 'cash.confirmed', fieldtype: costanti.FieldType.boolean }),
|
||||
AddCol({
|
||||
name: 'date_created', label_trans: 'reg.pub_created', fieldtype: costanti.FieldType.onlydate,
|
||||
sortable: true,
|
||||
}),
|
||||
AddCol(DeleteRec),
|
||||
AddCol(DuplicateRec),
|
||||
]
|
||||
|
||||
export const fields = {
|
||||
colSettings: [
|
||||
AddCol({ name: 'key', label_trans: 'col.label' }),
|
||||
@@ -3120,8 +3162,6 @@ export const colTableExtraList = [
|
||||
AddCol(DuplicateRec),
|
||||
]
|
||||
|
||||
export const colTableCash = []
|
||||
|
||||
export const colTableCashCategory = [
|
||||
AddCol({ name: 'descr', label_trans: 'pages.description' }),
|
||||
AddCol({ name: 'notes', label_trans: 'reg.note' }),
|
||||
@@ -3642,6 +3682,13 @@ export const fieldsTable = {
|
||||
colkey: '_id',
|
||||
collabel: '_id',
|
||||
},
|
||||
{
|
||||
value: 'orderscart',
|
||||
label: 'Ordini',
|
||||
columns: colTableOrdersCart,
|
||||
colkey: '_id',
|
||||
collabel: 'numorder',
|
||||
},
|
||||
{
|
||||
value: 'productinfos',
|
||||
label: 'Info Prodotti',
|
||||
@@ -3656,6 +3703,13 @@ export const fieldsTable = {
|
||||
colkey: '_id',
|
||||
collabel: 'name',
|
||||
},
|
||||
{
|
||||
value: 'cashs',
|
||||
label: 'Cassa',
|
||||
columns: colTableCash,
|
||||
colkey: '_id',
|
||||
collabel: 'causale',
|
||||
},
|
||||
{
|
||||
value: 'departments',
|
||||
label: 'Uffici',
|
||||
@@ -3874,6 +3928,13 @@ export const fieldsTable = {
|
||||
colicon: 'icon',
|
||||
noshow: true,
|
||||
},
|
||||
{
|
||||
value: toolsext.TABTYPECASH,
|
||||
label: 'Ingresso/Uscita',
|
||||
columns: colTableGeneric,
|
||||
colkey: 'value',
|
||||
collabel: 'label',
|
||||
},
|
||||
{
|
||||
value: 'confsite_opt',
|
||||
label: 'Configura Opzioni Sito',
|
||||
|
||||
@@ -98,6 +98,7 @@ export const toolsext = {
|
||||
TABCIRCUITS: 'circuits',
|
||||
TABUNITS: 'units',
|
||||
SERVKEY_VERS: 'vers',
|
||||
TABTYPECASH: 'typecash',
|
||||
|
||||
ERR_GENERICO: -1,
|
||||
ERR_SERVERFETCH: -2,
|
||||
|
||||
@@ -138,7 +138,6 @@ export const useProducts = defineStore('Products', {
|
||||
|
||||
},
|
||||
|
||||
|
||||
getProductById: (state: IProductsState) => (id: string): IProduct => {
|
||||
const prod = state.products.find((prod: IProduct) => prod._id === id)
|
||||
return prod ? prod : getRecordProductEmpty()
|
||||
@@ -692,7 +691,7 @@ export const useProducts = defineStore('Products', {
|
||||
|
||||
let ris = null
|
||||
|
||||
ris = await Api.SendReq('/cart/' + userStore.my._id + '/ordercartstatus', 'POST', { order_id, status })
|
||||
ris = await Api.SendReq('/cart/' + userStore.my._id + '/ordercartstatus', 'POST', { order_id, status, options })
|
||||
.then((res) => {
|
||||
|
||||
this.updateDataProduct(res)
|
||||
|
||||
@@ -315,6 +315,7 @@ export const useGlobalStore = defineStore('GlobalStore', {
|
||||
else if (table === 'storehouses') ris = state.storehouses
|
||||
else if (table === 'providers') ris = state.providers
|
||||
else if (table === 'productinfos') ris = Products.productInfos
|
||||
else if (table === 'product') ris = Products.products
|
||||
else if (table === 'gasordines') ris = state.gasordines
|
||||
else if (table === 'scontisticas') ris = state.scontisticas
|
||||
else if (table === 'groups') ris = state.groups
|
||||
@@ -1542,6 +1543,7 @@ export const useGlobalStore = defineStore('GlobalStore', {
|
||||
this.paymenttypes = (res.data.paymenttypes) ? [...res.data.paymenttypes] : []
|
||||
this.gallery = (res.data.gallery) ? [...res.data.gallery] : []
|
||||
this.calzoom = (res.data.calzoom) ? [...res.data.calzoom] : []
|
||||
Products.products = (res.data.products) ? [...res.data.products] : []
|
||||
Products.productInfos = (res.data.productInfos) ? [...res.data.productInfos] : []
|
||||
this.producers = (res.data.producers) ? [...res.data.producers] : []
|
||||
this.storehouses = (res.data.storehouses) ? [...res.data.storehouses] : []
|
||||
@@ -1849,6 +1851,7 @@ export const useGlobalStore = defineStore('GlobalStore', {
|
||||
else if (table === toolsext.TABLOCACCOM) myarr = shared_consts.LocationAccom
|
||||
else if (table === toolsext.TABPREF) myarr = shared_consts.Preferences
|
||||
else if (table === toolsext.TABUNITS) myarr = shared_consts.Units_Of_Measure_ListBox
|
||||
else if (table === toolsext.TABTYPECASH) myarr = shared_consts.TypeCashStr
|
||||
else if (table === 'usernotifs') myarr = shared_consts.UsersNotif_Adv_List
|
||||
else if (table === 'typenotifs') myarr = shared_consts.TypeNotifs_Arr
|
||||
else myarr = this.getListByTable(table, value2)
|
||||
|
||||
@@ -300,7 +300,11 @@ export default defineComponent({
|
||||
title: 'Ordine'
|
||||
}).onOk(async () => {
|
||||
|
||||
statusnow.value = await productStore.UpdateOrderCartStatus({ order_id: order._id, status })
|
||||
let options = {
|
||||
// userIdStore: order.items ? order.items[0].order.storehouse.username : '',
|
||||
}
|
||||
|
||||
statusnow.value = await productStore.UpdateOrderCartStatus({ order_id: order._id, status, options })
|
||||
|
||||
if (statusnow.value === status) {
|
||||
order.status = statusnow.value
|
||||
|
||||
@@ -39,18 +39,17 @@ export default defineComponent({
|
||||
const getArrProducts = computed(() => {
|
||||
let arrprod = productStore.getProducts(cosa.value)
|
||||
let catstr = cat.value;
|
||||
if ((!search.value || (search.value && search.value.length < 2)) && !catstr) {
|
||||
let lowerSearchText = search.value.toLowerCase().trim();
|
||||
if ((!lowerSearchText || (lowerSearchText && lowerSearchText.length < 2)) && !catstr) {
|
||||
return arrprod
|
||||
}
|
||||
|
||||
let lowerSearchText = search.value.toLowerCase();
|
||||
|
||||
return arrprod.filter((product: IProduct) => {
|
||||
let lowerName = product.productInfo.name!.toLowerCase();
|
||||
let hasCategoria = !catstr || (catstr && product.productInfo.idCatProds?.includes(catstr));
|
||||
|
||||
// Use a regular expression to match whole words
|
||||
let codeMatch = new RegExp(`\\b${search.value}\\b`, 'i');
|
||||
let codeMatch = new RegExp(`\\b${lowerSearchText}\\b`, 'i');
|
||||
let nameMatch = new RegExp(`\\b${lowerSearchText}`, 'i');
|
||||
|
||||
// Check if any word in lowerName starts with lowerSearchText
|
||||
|
||||
Reference in New Issue
Block a user