import products dinamically

This commit is contained in:
Surya Paolo
2024-02-06 20:13:06 +01:00
parent dbcd2aee63
commit 3c0f040d92
53 changed files with 1847 additions and 325 deletions

View File

@@ -66,7 +66,7 @@ export const shared_consts = {
},
{
label: 'Chili (kg)',
short: 'Kg',
short: 'kg',
value: 2,
},
{
@@ -344,6 +344,7 @@ export const shared_consts = {
CAT_NO_SPAZI: 5,
CAT_GOODS_TXT: 10,
PRODUCTS: 20,
PRODUCTS_V2: 22,
INVENTARIO: 30,
},
@@ -1806,6 +1807,8 @@ export const shared_consts = {
MyBachecas: 1,
},
MAX_QTA_PREORD: 5000,
getStatusStr(status: number) {
const trovatorec = this.OrderStatusStr.find((rec) => rec.value === status)
return (trovatorec) ? trovatorec.label : ''

View File

@@ -7,16 +7,12 @@ import { useGlobalStore } from '@store/globalStore'
import { useI18n } from '@/boot/i18n'
import { useQuasar } from 'quasar'
import { Chart, ChartData, ChartOptions, registerables } from 'chart.js'
import { Chart, ChartItem, ChartConfiguration } from 'chart.js/auto'
import { BarChart, useBarChart } from 'vue-chart-3'
Chart.register(...registerables)
export default defineComponent({
name: 'CBarChart',
components: { BarChart },
name: 'CLineChart',
components: {},
props: {
mydata: { required: false, default: [] },
title: { required: false, default: false },
@@ -25,6 +21,7 @@ export default defineComponent({
bordercolor: { required: false, default: 'red' },
mycolors: { required: false, default: null },
offset: { required: false, default: 0 },
showMedia: { required: false, default: false }
},
setup(props, { emit }) {
@@ -35,48 +32,44 @@ export default defineComponent({
const myarrlabel = ref(<any>[])
const myarrdata = ref(<any>[])
const myarrdataLine = ref(<any>[])
const myarrbg = ref(<any>[])
const myarrsum = ref(<any>[])
// @ts-ignore
const chartData = computed<ChartData<'bar'>>(() => ({
labels: myarrlabel.value,
const chartDataLine = ref({
labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
datasets: [
/*{
label: 'Totali',
data: myarrsum.value,
backgroundColor: tools.colourNameToHex('green'),
},*/
{
label: props.title,
data: myarrdata.value,
borderColor: tools.colourNameToHex('red'),
backgroundColor: myarrbg.value,
fill: true,
},
],
}))
const options = computed<ChartOptions<'bar'>>(() => ({
bar: {
},
interaction: {
intersect: false
},
scales: {
y: {
beginAtZero: true
label: 'Data One',
backgroundColor: '#f87979',
data: [40, 39, 10, 40, 39, 80, 40]
}
}
}))
const { barChartProps, barChartRef } = useBarChart({
chartData,
options,
]
})
const chartOptionsLine = ref({
responsive: true,
maintainAspectRatio: false
})
function calcolaMedia(myarray: any, periodi: number) {
if (myarray.length === 0 || myarray.length < periodi) {
return 0; // Se l'array è vuoto o più corto del numero di periodi, la media è 0.
}
const somma = myarray.slice(-periodi).reduce((accumulator: number, currentValue: number) => accumulator + currentValue, 0);
return somma / periodi;
}
function getRecordByDate(mydata: any, currentDate: Date) {
const targetDate = currentDate.toISOString().split('T')[0];
return mydata.find((record: any) => record._id === targetDate);
}
function mounted() {
myarrdata.value = []
myarrdataLine.value = []
myarrbg.value = []
myarrlabel.value = []
myarrsum.value = []
@@ -91,27 +84,119 @@ export default defineComponent({
let num = 1
for (rec of props.mydata) {
if (props.sum) {
somma += rec.count
} else {
somma = rec.count
let mostraggtutti = true
if (mostraggtutti) {
let num = 1;
let strstartDate: any = props.mydata[0]
let startDate = new Date(strstartDate._id); // Data di inizio da props
let endDate = new Date(); // Data di fine da props
let currentDate = new Date(startDate);
// console.log('startDate', startDate, 'endDate', endDate)
while (currentDate <= endDate) {
let dataPresente = getRecordByDate(props.mydata, currentDate)
let count = dataPresente ? dataPresente.count : 0;
let day = currentDate.toISOString().split('T')[0].split('-');
let mydate = day[2] + '/' + day[1];
myarrlabel.value.push(mydate);
myarrdata.value.push(count);
let media = calcolaMedia(myarrdata.value, 30);
myarrdataLine.value.push(media ? media : undefined);
if (currentDate === endDate) {
myarrbg.value.push(tools.colourNameToHex('green'));
} else {
myarrbg.value.push(tools.colourNameToHex(props.color));
}
myarrsum.value.push(somma);
num++;
currentDate.setDate(currentDate.getDate() + 1); // Passa al giorno successivo
}
let day = rec._id.split('-')
ind = day[2] + '/' + day[1]
//myarrlabel.value.push(rec._id)
myarrlabel.value.push(ind)
myarrdata.value.push(rec.count)
if (num === props.mydata.length) {
myarrbg.value.push(tools.colourNameToHex('green'))
} else {
myarrbg.value.push(tools.colourNameToHex(props.color))
} else {
for (rec of props.mydata) {
if (props.sum) {
somma += rec.count
} else {
somma = rec.count
}
let day = rec._id.split('-')
ind = day[2] + '/' + day[1]
//myarrlabel.value.push(rec._id)
myarrlabel.value.push(ind)
myarrdata.value.push(rec.count)
let media = calcolaMedia(myarrdata.value, 14)
myarrdataLine.value.push(media ? media : undefined)
if (num === props.mydata.length) {
myarrbg.value.push(tools.colourNameToHex('green'))
} else {
myarrbg.value.push(tools.colourNameToHex(props.color))
}
myarrsum.value.push(somma)
num++
// ind++
}
myarrsum.value.push(somma)
num++
// ind++
}
const chartData: any = {
labels: myarrlabel.value,
datasets: [
{
type: 'bar',
label: props.title,
data: myarrdata.value,
borderColor: tools.colourNameToHex('red'),
backgroundColor: myarrbg.value,
fill: true,
},
],
}
const media = {
type: 'line',
label: 'Media',
data: myarrdataLine.value,
borderColor: 'rgb(255, 99, 132)',
backgroundColor: 'rgb(255, 99, 132)',
fill: true,
}
if (props.showMedia)
chartData.datasets.push(media)
const configBar: ChartConfiguration = {
type: 'bar',
data: chartData,
options: {
scales: {
y: {
beginAtZero: true
}
},
interaction: {
intersect: false
},
},
};
const canvasTag = <ChartItem>document.getElementById('myChart')
const myChart = new Chart(
canvasTag,
configBar)
}
function getoffset() {
@@ -124,11 +209,6 @@ export default defineComponent({
tools,
getoffset,
q,
options,
barChartProps,
barChartRef,
myarrdata,
myarrlabel,
}
},
})

View File

@@ -1,13 +1,6 @@
<template>
<div>
<BarChart v-bind="barChartProps" />
<!--<DoughnutChart ref="doughnutRef" :chartData="objdata" :options="options" />-->
<!--<line-chart :width="tools.getwidthscale($q, 350, 400)+`px`" :title="title" :data="getmydata()" :offset="getoffset()"
:round="0" :colors="mycolors"></line-chart>
-->
<canvas id="myChart" width="400" height="400"></canvas>
</div>
</template>

View File

@@ -147,8 +147,9 @@
color="green"
>online</q-badge
>
<q-badge
v-if="!tools.isVerifiedByUser(row)"
v-if="tools.notisVerifiedByUser(row)"
align="bottom"
floating
color="red"

3
src/components/COSM/COSM.scss Executable file
View File

@@ -0,0 +1,3 @@
.map-container {
height: 400px;
}

66
src/components/COSM/COSM.ts Executable file
View File

@@ -0,0 +1,66 @@
import { tools } from '@store/Modules/tools'
import { useQuasar } from 'quasar'
import { PropType, defineComponent, onMounted } from 'vue'
import 'leaflet/dist/leaflet.css'
import { LMap, LTileLayer } from '@vue-leaflet/vue-leaflet'
import { ICoordinates } from '@src/model'
export default defineComponent({
name: 'COpenStreetMap',
components: {
LMap,
LTileLayer,
},
props: {
title: {
type: String,
required: true,
},
coordinates: {
type: Object as PropType<ICoordinates | null>,
required: false,
default: null,
},
coord_big: {
type: String,
required: false,
default: '',
},
urlmap: {
type: String,
required: false,
default: '',
},
imgmap: {
type: String,
required: false,
default: '',
},
zoom: {
type: Number,
required: false,
default: 2,
},
},
setup(props, { emit }) {
const $q = useQuasar()
function mywidth() {
return tools.getwidth($q) - 20
}
function myheight() {
return 450
}
onMounted(() => {
});
return {
mywidth,
myheight,
}
}
})

19
src/components/COSM/COSM.vue Executable file
View File

@@ -0,0 +1,19 @@
<template>
<div>
<div style="height:600px; width:100%">
<l-map ref="map" v-model:zoom="zoom" :center="[47.41322, -1.219482]">
<l-tile-layer
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
layer-type="base"
name="OpenStreetMap"
></l-tile-layer>
</l-map>
</div>
</div>
</template>
<script lang="ts" src="./COSM.ts">
</script>
<style lang="scss" scoped>
@import './COSM.scss';
</style>

1
src/components/COSM/index.ts Executable file
View File

@@ -0,0 +1 @@
export {default as COSM} from './COSM.vue'

View File

@@ -121,7 +121,8 @@
</q-item>
<q-item
v-if="
cosa === shared_consts.PROD.TUTTI || cosa === shared_consts.PROD.BOTTEGA ||
(cosa === shared_consts.PROD.TUTTI && !isOrdGas()) ||
cosa === shared_consts.PROD.BOTTEGA ||
(cosa === shared_consts.PROD.GAS &&
products.getQtyAvailable(myproduct) > 0)
"
@@ -251,6 +252,19 @@
</div>
</div>
</q-card-section>
<q-card-section v-if="complete && myproduct.productInfo.link_scheda">
<div class="text-blue text-title row">
<q-icon size="sm" name="fas fa-list-ul" class="q-mr-sm" />
{{ t('products.link_scheda') }}
</div>
<div class="row items-center">
<div class="text-title text-grey-9">
<a :href="myproduct.productInfo.link_scheda" target="_blank"
>Apri Scheda</a
>
</div>
</div>
</q-card-section>
<q-card-section
v-if="complete && myproduct.productInfo.valori_nutrizionali"
>
@@ -347,8 +361,8 @@
<q-card-section v-if="isOrdGas()">
<q-item
v-if="
myproduct.bookableAvailableQty > 0 ||
myproduct.maxbookableGASQty > 0
(myproduct.bookableAvailableQty > 0 && myproduct.bookableAvailableQty < shared_consts.MAX_QTA_PREORD) ||
(myproduct.maxbookableGASQty > 0 && myproduct.maxbookableGASQty < shared_consts.MAX_QTA_PREORD) || editOn
"
:clickable="tools.isManager()"
@click="
@@ -371,6 +385,19 @@
<span v-if="!editOn" class="prod_preorder">
{{ myproduct.bookableAvailableQty }}
</span>
<CMyValueDb
v-if="editOn"
:editOn="editOn"
:title="t('products.bookableAvailableQty')"
table="products"
:id="myproduct._id"
:rec="myproduct"
mykey="bookableAvailableQty"
debounce="1000"
:save="updateproductmodif()"
:type="costanti.FieldType.number"
>
</CMyValueDb>
<CMyValueDb
v-if="editOn"
:editOn="editOn"
@@ -448,7 +475,13 @@
</q-item-section>
</q-item-section>
</q-item>
<q-item v-if="myproduct.gasordine && myproduct.gasordine.active && myproduct.idGasordine">
<q-item
v-if="
myproduct.gasordine &&
myproduct.gasordine.active &&
myproduct.idGasordine
"
>
<q-item-section avatar>
<q-icon color="blue" name="fas fa-shipping-fast" />
</q-item-section>
@@ -577,7 +610,13 @@
</q-item-section>
</q-item-section>
</q-item>
<q-item v-if="myproduct.gasordine && myproduct.gasordine.active && (myproduct.gasordine.dataora_chiusura_ordini || editOn)">
<q-item
v-if="
myproduct.gasordine &&
myproduct.gasordine.active &&
(myproduct.gasordine.dataora_chiusura_ordini || editOn)
"
>
<q-item-section avatar>
<q-icon color="blue" name="fas fa-hourglass-half" />
</q-item-section>
@@ -604,7 +643,13 @@
</q-item-label>
</q-item-section>
</q-item>
<q-item v-if="myproduct.gasordine && myproduct.gasordine.active && (labelDataArrivoMerce || editOn)">
<q-item
v-if="
myproduct.gasordine &&
myproduct.gasordine.active &&
(labelDataArrivoMerce || editOn)
"
>
<q-item-section avatar>
<q-icon color="red" name="fas fa-shipping-fast" />
</q-item-section>
@@ -627,7 +672,13 @@
</q-item-label>
</q-item-section>
</q-item>
<q-item v-if="myproduct.gasordine && myproduct.gasordine.active && (labelDataRitiro || editOn)">
<q-item
v-if="
myproduct.gasordine &&
myproduct.gasordine.active &&
(labelDataRitiro || editOn)
"
>
<q-item-section avatar>
<q-icon color="green" name="fas fa-people-carry" />
</q-item-section>

View File

@@ -1,10 +1,10 @@
<template>
<div v-if="order && order.product" class="q-pa-xs q-gutter-xs">
<div v-if="order && order.product && order.product.productInfo" class="q-pa-xs q-gutter-xs">
<div v-if="order.product">
<q-item>
<q-item-section top thumbnail class="q-ml-none">
<img
v-if="order.product && order.product.productInfo.img"
v-if="order.product && order.product.productInfo && order.product.productInfo.img"
:src="`` + order.product.productInfo.img"
:alt="order.product.productInfo.name"
:class="myimgclass()"

View File

@@ -372,13 +372,10 @@
color="blue"
bordercolor="blue"
:sum="true"
:showMedia="true"
>
</CLineChart>
<!--<CLineChart :mydata="datastat.reg_weekly" :title="$t('stat.reg_weekly')" color="blue" bordercolor="green" :sum="true">
</CLineChart>-->
<!--<CLineChart :mydata="datastat.reg_daily" :title="$t('stat.reg_total')"
:offset="datastat.numreg_untilday" :sum="true"
:mycolors="['#0b0', '#666']">

View File

@@ -8,6 +8,8 @@ const msg_website_enUs = {
products: {
quantity: 'Quantità',
quantityAvailable: 'Disponibili',
stockQty: 'In Magazzino',
stockBloccatiQty: 'Bloccati In Magazzino',
weight: 'Peso',
stars: 'Voto',
color: 'Colore',
@@ -36,6 +38,7 @@ const msg_website_enUs = {
productslist: 'Lista Prodotti',
collabora: 'Collabora',
storehouses: 'Magazzino',
providers: 'Fornitori',
departments: 'Uffici',
orders: 'Ordini Ricevuti',
orders2: 'Ordini Ricevuti',

View File

@@ -8,6 +8,7 @@ const msg_website_es = {
products: {
quantity: 'Quantità',
quantityAvailable: 'Disponibili',
stockQty: 'In Magazzino',
weight: 'Peso',
stars: 'Voto',
color: 'Colore',

View File

@@ -1,9 +1,9 @@
const msg_website_it = {
ws: {
sitename: 'Riso',
siteshortname: 'RISO',
description: 'Siamo la Rete Italiana di Scambio Orizzontale, abbiamo creato questa piattaforma per metterla al servizio di chi vuole riscoprire il valore della condivisione e della cooperazione. Valori semplici e profondi che ci aiutano a ritrovare il Senso della Vita, perduto in questa società consumista, e riporti quei Sani Pricìpi Naturali ed Umani di Fratellanza che intere popolazioni antiche conoscevano bene.',
keywords: 'riso, piattaforma di scambio, rete italiana scambio orizzontale, riso app, riso piattaforma, scambio e baratto, momenta RIS',
sitename: 'Più che Buono',
siteshortname: 'Più che Buono',
description: '',
keywords: '',
},
hours: {
descr: 'Descrizione',
@@ -16,11 +16,13 @@ const msg_website_it = {
pages: {
home: 'Home',
profile: 'Profilo',
install_site: 'Installa Sito',
profile2: 'ProfiloU',
mypage2: 'mypage2',
myservice2: 'myservice2',
myhosps2: 'myhosps2',
mygood2: 'mygood2',
catalogo: 'Catalogo',
fundraising: 'Sostieni il Progetto',
notifs: 'Configura le Notifiche',
unsubscribe: 'Disiscriviti',
@@ -30,9 +32,18 @@ const msg_website_it = {
producer: 'Produttore',
orderinfo: 'Ordini Effettuati',
products: 'Prodotti',
cash: 'Cassa',
productInfos: 'Info Prodotti',
listinoprodotti: 'Listino Prodotti',
productslist: 'Lista Prodotti',
collabora: 'Collabora',
categories: 'Categorie',
storehouses: 'Magazzino',
providers: 'Fornitori',
catprods: 'Categorie',
subcatprods: 'Sotto-Categorie',
gasordine: 'Gas Ordine',
scontisticas: 'Scontistica',
departments: 'Uffici',
orders: 'Ordini Ricevuti',
orders2: 'Ordini Ricevuti',
@@ -121,9 +132,10 @@ const msg_website_it = {
only_residenti: 'Solo Residenti',
only_consiglio: 'Solo Consiglieri',
color: 'Colore',
gasordini: 'Gas Ordini',
},
msg: {
myAppName: 'Riso',
myAppName: 'Più che Buono',
myAppDescription: 'Il primo Vero Social Libero, Equo e Solidale, dove Vive Consapevolezza e Aiuto Comunitario. Gratuito',
underconstruction: 'App in costruzione...',
myDescriz: '',

View File

@@ -7,30 +7,6 @@ import {
import { func } from '@store/Modules/fieldsTable'
// const SHOW_PROJINTHEMENU = false
//
// let arrlistafavourite = []
// let arrlistaprojtutti = []
// let arrlistaprojmiei = []
// if (SHOW_PROJINTHEMENU) {
// arrlistaprojtutti = Projects.getters.listaprojects(RouteNames.projectsall)
// arrlistaprojmiei = Projects.getters.listaprojects(RouteNames.myprojects)
// arrlistafavourite = Projects.getters.listaprojects(RouteNames.favouriteprojects)
// }
// PROGETTI -> FAVORITI :
// if (arrlistafavourite.length > 0) {
// arrMenu.push({
// icon: 'favorite_border',
// nametranslate: 'pages.' + RouteNames.favouriteprojects,
// urlroute: RouteNames.favouriteprojects,
// level_parent: 0.0,
// level_child: 0.5,
// routes2: arrlistafavourite,
// idelem: ''
// })
// }
const firstPage = {
active: true,
order: 5,
@@ -57,56 +33,57 @@ function getDynamicPages(site: ISites): IListRoutes[] {
inmenu: true,
infooter: true,
},
{
/*{
active: true,
order: 400,
path: '/test',
materialIcon: 'fas fa-test',
name: 'mypages.test',
component: () => import('@/views/testServer/testServer.vue'),
inmenu: false,
infooter: false,
},
order: 20,
path: '/events',
materialIcon: 'fas fa-bullhorn',
name: 'mypages.events',
component: () => import('@/root/eventi/eventi.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},*/
{
active: true,
order: 12,
path: '/goods',
materialIcon: 'fas fa-tshirt',
name: 'mypages.goods',
component: () => import('@/root/goods/goods.vue'),
active: site.confpages && site.confpages.showProfile,
order: 120,
path: '/myprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile',
component: () => import('@/views/user/myprofile/myprofile.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: true,
order: 15,
path: '/services',
materialIcon: 'fas fa-house-user',
name: 'mypages.services',
component: () => import('@/root/services/services.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: true,
order: 15,
path: '/provapao',
materialIcon: 'fas fa-house-user',
name: 'mypages.provapao',
component: () => import('@/root/provapao/provapao.vue'),
order: 120,
path: '/install_site',
materialIcon: 'fas fa-user',
name: 'pages.install_site',
component: () => import('@/views/admin/install_site/install_site.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
},
{
active: true,
order: 15,
path: '/hosps',
materialIcon: 'fas fa-bed',
name: 'mypages.hosp',
component: () => import('@/root/hosp/hosp.vue'),
active: site.confpages && site.confpages.showProfile,
order: 120,
path: '/editprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile3',
component: () => import('@/views/user/editprofile/editprofile.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
},
{
active: site.confpages && site.confpages.showiscrittiMenu,
order: 130,
path: '/friends',
materialIcon: 'fas fa-user-friends',
name: 'mypages.iscritti',
component: () => import('@/views/user/myfriends/myfriends.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
@@ -121,50 +98,8 @@ function getDynamicPages(site: ISites): IListRoutes[] {
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: true,
order: 20,
path: '/events',
materialIcon: 'fas fa-bullhorn',
name: 'mypages.events',
component: () => import('@/root/eventi/eventi.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: true,
order: 120,
path: '/myprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile',
component: () => import('@/views/user/myprofile/myprofile.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
},
{
active: true,
order: 120,
path: '/editprofile',
materialIcon: 'fas fa-user',
name: 'pages.profile3',
component: () => import('@/views/user/editprofile/editprofile.vue'),
meta: { requiresAuth: true },
inmenu: false,
infooter: false,
},
{
active: true,
order: 130,
path: '/friends',
materialIcon: 'fas fa-user-friends',
name: 'mypages.iscritti',
component: () => import('@/views/user/myfriends/myfriends.vue'),
meta: { requiresAuth: true },
inmenu: true,
infooter: true,
onlyAdmin: true,
onlyManager: true,
},
{
active: site.confpages && site.confpages.enableGroups,
@@ -176,6 +111,8 @@ function getDynamicPages(site: ISites): IListRoutes[] {
meta: { requiresAuth: true },
inmenu: true,
infooter: false,
onlyAdmin: true,
onlyManager: true,
},
{
active: true,

View File

@@ -1215,3 +1215,9 @@ export interface IAnim {
cldelay: string,
timingtype: string,
}
export interface ICoordinates {
lat: any
long: any
}

View File

@@ -14,12 +14,15 @@ export interface IProductInfo {
color?: string,
size?: string,
weight?: number,
weight_lordo?: number,
unit: number,
unit_lordo?: number,
stars?: number,
date?: Date,
icon?: string,
img?: string
ingredienti?: string,
link_scheda?: string,
valori_nutrizionali?: string,
}

View File

@@ -32,7 +32,7 @@ export default defineComponent({
const incaricamento = ref(false)
const checkAggiornaQta = ref(false)
const cosafare = ref(shared_consts.Cmd.PRODUCTS)
const cosafare = ref(shared_consts.Cmd.PRODUCTS_V2)
const inputfile = ref('')
const risultato = ref('')
@@ -46,6 +46,10 @@ export default defineComponent({
label: 'Importa Prodotti',
value: shared_consts.Cmd.PRODUCTS
},
{
label: 'Importa Prodotti Versione 2',
value: shared_consts.Cmd.PRODUCTS_V2
},
{
label: 'Importa Inventario',
value: shared_consts.Cmd.INVENTARIO
@@ -375,10 +379,14 @@ export default defineComponent({
let arrCols: any = []
if (skipfirstrow.value) {
arrCols = myarr[0].split(',');
arrCols = myarr[0]
}
console.log('arrCols', arrCols)
if (cmd === shared_consts.Cmd.PRODUCTS_V2) {
skipfirstrow.value = false
}
for (const rec of myarr) {
if (skipfirstrow.value) {
@@ -425,10 +433,12 @@ export default defineComponent({
strris += addfield(col, 'weight', rec, { isnumero: true }); col++;
strris += addfield(col, 'unit', rec, {}); col++;
strris += addfield(col, 'link', rec, {}); col++;
strris += addfield(col, 'perc_iva', rec, {}); col++;
strris += addfield(col, 'price_acquistato', rec, { isnumero: true }); col++;
strris += addfield(col, 'minBuyQty', rec, { isnumero: true }); col++;
strris += addfield(col, 'minStepQty', rec, { isnumero: true }); col++;
strris += addfield(col, 'cat_name', rec, {}); col++;
strris += addfield(col, 'subcat_name', rec, {}); col++;
strris += addfield(col, 'producer_name', rec, {}); col++;
@@ -442,6 +452,20 @@ export default defineComponent({
strris += addfield(col, 'note', rec, {}); col++;
strris += '} '
} else if (cmd === shared_consts.Cmd.PRODUCTS_V2) {
if (!primo) {
strris += ', '
}
strris += '{ '
let col = 0;
strris += addfield(col, 'idapp', rec, { strinput: tools.appid(), primo: true });
for (const mycol of arrCols) {
strris += addfield(col, mycol, rec, {}); col++;
}
strris += '} '
} else if (cmd === shared_consts.Cmd.INVENTARIO) {
if (!primo) {
strris += ', '
@@ -453,7 +477,9 @@ export default defineComponent({
for (const mycol of arrCols) {
strris += addfield(col, mycol, rec, {}); col++;
}
strris += '} '
} else if (cmd === shared_consts.Cmd.CITIES_SERVER) {
strris += '{ \n'
strris += ' _id :' + ind + ',\n'
@@ -474,7 +500,7 @@ export default defineComponent({
if (cmd === shared_consts.Cmd.CITIES_SERVER) {
userStore.importToServerCmd($q, t, cmd, null)
} else if (cmd === shared_consts.Cmd.PRODUCTS) {
} else if ((cmd === shared_consts.Cmd.PRODUCTS) || (cmd === shared_consts.Cmd.PRODUCTS_V2)) {
let options = { aggiornaStockQty: checkAggiornaQta.value }
if (importasulserver.value)
userStore.importToServerCmd($q, t, cmd, { arrdata: strris, options })
@@ -485,19 +511,34 @@ export default defineComponent({
return risultato
}
function reset() {
risultato.value = ''
risraw.value = ''
inputfile.value = ''
}
function loadTextFromFile(ev: any) {
console.log('ev', ev)
const file = ev.target.files[0]
const reader = new FileReader()
try {
console.log('ev', ev)
reset()
if (ev.target && ev.target.files) {
const file = ev.target.files[0]
const reader = new FileReader()
reader.onload = (e: any) => {
reader.onload = (e: any) => {
const testo = e.target.result
const testo = e.target.result
risultato.value = importCmd(cosafare.value, testo)
risultato.value = importCmd(cosafare.value, testo)
}
if (file)
reader.readAsText(file)
}
} catch (e) {
risultato.value = ''
}
reader.readAsText(file)
}
function eseguiCmd() {
@@ -508,11 +549,13 @@ export default defineComponent({
function eseguiCmdProduct() {
let options = { aggiornaStockQty: checkAggiornaQta.value }
userStore.importToServerCmd($q, t, cosafare.value, { arrdata: risultato.value, options })
risultato.value = ''
}
function eseguiCmdInventario() {
let options = { aggiornaStockQty: checkAggiornaQta.value }
userStore.importToServerCmd($q, t, cosafare.value, { arrdata: risultato.value, options })
risultato.value = ''
}
function createProvLink() {

View File

@@ -15,9 +15,9 @@
<br>
<br>
<q-btn v-if="cosafare !== shared_consts.Cmd.PRODUCTS" label="Esegui" @click="eseguiCmd"></q-btn>
<q-btn v-if="(cosafare !== shared_consts.Cmd.PRODUCTS && cosafare !== shared_consts.Cmd.PRODUCTS_V2)" label="Esegui" @click="eseguiCmd"></q-btn>
<q-btn v-else-if="cosafare === shared_consts.Cmd.PRODUCTS" label="Importa Prodotti" @click="eseguiCmdProduct"></q-btn>
<q-btn v-else-if="cosafare === shared_consts.Cmd.PRODUCTS_V2" label="Importa Prodotti Versione 2" @click="eseguiCmdProduct"></q-btn>
<q-btn v-else-if="cosafare === shared_consts.Cmd.INVENTARIO" label="Importa Inventario" @click="eseguiCmdInventario"></q-btn>
<br>

View File

@@ -1,4 +1,5 @@
import { IListRoutes, ISites } from '@src/model'
import { tools } from '@src/store/Modules/tools'
function getRoutesEcomm(site: ISites) {
@@ -40,7 +41,7 @@ function getRoutesEcomm(site: ISites) {
level_child: 0.5,
},
{
active: true,
active: tools.isAdmin(),
order: 30,
path: '/orderinfo',
materialIcon: 'fas fa-file-alt',

View File

@@ -92,6 +92,7 @@ const msg_it = {
gasordine: 'Ordine Gas',
select_gasordine: 'Scegli l\'Ordine del GAS',
productInfo: 'Info Prodotto',
link_scheda: 'Link Scheda',
},
storehouses: {
name: 'Magazzino',
@@ -1172,6 +1173,7 @@ const msg_it = {
iscritti: 'Iscritti',
bacheca: 'Bacheca',
services: 'Servizi',
catalogo: 'Catalogo',
handshake: 'Rapporti di Fiducia',
hosp: 'Ospitalità',
events: 'Eventi',

View File

@@ -2041,13 +2041,19 @@ export const colTableProductInfos = [
AddCol({ name: 'color', label_trans: 'products.color' }),
AddCol({ name: 'size', label_trans: 'products.size' }),
AddCol({ name: 'weight', label_trans: 'products.weight', fieldtype: costanti.FieldType.number }),
AddCol({ name: 'weight_lordo', label_trans: 'products.weight_lordo', 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_lordo', label_trans: 'products.unit_lordo',
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: 'link_scheda', label_trans: 'products.link_scheda' }),
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 }),

View File

@@ -3756,6 +3756,14 @@ export const tools = {
}
},
notisVerifiedByUser(user: IUserFields) {
try {
return user && user.hasOwnProperty('verified_by_aportador') && user.verified_by_aportador === false
} catch (e) {
return false
}
},
addMinutes(mydate: Date, minutes: number) {
return date.addToDate(mydate, { minutes })
},
@@ -8301,6 +8309,7 @@ export const tools = {
return weight
},
getWeightTotalByOrder(order: IOrder) {
return (order.product && order.product.productInfo && order.product.productInfo.weight ? order.product.productInfo.weight : 1) * (order.quantitypreordered | 0 + order.quantity | 0)
},

View File

@@ -985,7 +985,7 @@ export const useProducts = defineStore('Products', {
enableAddQty(myorder: IOrder, myproduct: IProduct): boolean {
const globalStore = useGlobalStore()
if (globalStore.site.ecomm && globalStore.site.ecomm.enablePreOrders) {
return (this.getQtyBookableAvailable(myproduct) > 0
return ((this.getQtyBookableAvailable(myproduct) > 0)
&& (myproduct.maxBookableSinglePersQty === 0
|| (myorder.quantitypreordered + 1 < myproduct.maxBookableSinglePersQty))
)
@@ -1011,6 +1011,10 @@ export const useProducts = defineStore('Products', {
step = myproduct.minBuyQty
}
if (step === 0) {
step = 1
}
return step
},

View File

@@ -626,6 +626,14 @@
></q-btn>
<br />
</div>
<div class="row">
<q-btn
label="removeRegulations"
color="primary"
@click="EseguiFunz('removeRegulations')"
></q-btn>
<br />
</div>
</template>
<script lang="ts" src="./dbop.ts">
</script>

View File

@@ -17,8 +17,8 @@
toggle-color="primary"
:options="[
{ value: shared_consts.PROD.TUTTI, slot: 'tutti' },
{ value: shared_consts.PROD.BOTTEGA, slot: 'bottega' },
{ value: shared_consts.PROD.GAS, slot: 'gas' },
{ value: shared_consts.PROD.BOTTEGA, slot: 'bottega' },
]"
>
<template v-slot:tutti>

View File

@@ -197,6 +197,7 @@ export default defineComponent({
{
$project: {
username: 1,
verified_by_aportador: 1,
name: 1,
surname: 1,
date_reg: 1,
@@ -272,6 +273,7 @@ export default defineComponent({
descr: 1,
photos: 1,
surname: 1,
verified_by_aportador: 1,
admins: 1,
idapp: 1,
'circuit.name': 1, 'circuit._id': 1