[pricelist][pinia] can load data und modify some data
This commit is contained in:
parent
1316c47706
commit
e2d2a5cf9d
|
@ -3,7 +3,7 @@
|
||||||
v-model:pagination="pagination"
|
v-model:pagination="pagination"
|
||||||
title="Kalkulationstabelle"
|
title="Kalkulationstabelle"
|
||||||
:columns="columns"
|
:columns="columns"
|
||||||
:data="drinks"
|
:rows="drinks"
|
||||||
:visible-columns="visibleColumn"
|
:visible-columns="visibleColumn"
|
||||||
:dense="$q.screen.lt.md"
|
:dense="$q.screen.lt.md"
|
||||||
row-key="id"
|
row-key="id"
|
||||||
|
@ -237,8 +237,8 @@
|
||||||
</q-td>
|
</q-td>
|
||||||
<q-td key="cost_price_pro_volume" :props="drinks_props">
|
<q-td key="cost_price_pro_volume" :props="drinks_props">
|
||||||
{{
|
{{
|
||||||
drinks_props.row.cost_price_pro_volume.value
|
drinks_props.row.cost_price_pro_volume
|
||||||
? `${drinks_props.row.cost_price_pro_volume.value.toFixed(3)}€`
|
? `${drinks_props.row.cost_price_pro_volume.toFixed(3)}€`
|
||||||
: 'o.A.'
|
: 'o.A.'
|
||||||
}}
|
}}
|
||||||
<q-popup-edit
|
<q-popup-edit
|
||||||
|
@ -252,14 +252,14 @@
|
||||||
volume.ingredients.some((ingredient) => ingredient.drink_ingredient)
|
volume.ingredients.some((ingredient) => ingredient.drink_ingredient)
|
||||||
)
|
)
|
||||||
"
|
"
|
||||||
v-model="drinks_props.row.cost_price_pro_volume.value"
|
v-model="drinks_props.row.cost_price_pro_volume"
|
||||||
buttons
|
buttons
|
||||||
label-cancel="Abbrechen"
|
label-cancel="Abbrechen"
|
||||||
label-set="Speichern"
|
label-set="Speichern"
|
||||||
@save="updateDrink(drinks_props.row)"
|
@save="updateDrink(drinks_props.row)"
|
||||||
>
|
>
|
||||||
<q-input
|
<q-input
|
||||||
v-model.number="drinks_props.row.cost_price_pro_volume.value"
|
v-model.number="drinks_props.row.cost_price_pro_volume"
|
||||||
filled
|
filled
|
||||||
dense
|
dense
|
||||||
autofocus
|
autofocus
|
||||||
|
@ -273,7 +273,7 @@
|
||||||
<q-td key="volumes" :props="drinks_props">
|
<q-td key="volumes" :props="drinks_props">
|
||||||
<q-table
|
<q-table
|
||||||
:columns="column_calc"
|
:columns="column_calc"
|
||||||
:data="drinks_props.row.volumes"
|
:rows="drinks_props.row.volumes"
|
||||||
dense
|
dense
|
||||||
:visible-columns="visibleColumn"
|
:visible-columns="visibleColumn"
|
||||||
row-key="id"
|
row-key="id"
|
||||||
|
@ -292,7 +292,7 @@
|
||||||
<q-tr :props="props">
|
<q-tr :props="props">
|
||||||
<q-td auto-width>
|
<q-td auto-width>
|
||||||
<q-btn
|
<q-btn
|
||||||
v-if="!drinks_props.row.cost_price_pro_volume.value"
|
v-if="!drinks_props.row.cost_price_pro_volume"
|
||||||
size="sm"
|
size="sm"
|
||||||
color="accent"
|
color="accent"
|
||||||
round
|
round
|
||||||
|
@ -312,17 +312,17 @@
|
||||||
/>
|
/>
|
||||||
</q-td>
|
</q-td>
|
||||||
<q-td key="volume" :props="props">
|
<q-td key="volume" :props="props">
|
||||||
{{ parseFloat(props.row.volume.value).toFixed(3) }}L
|
{{ parseFloat(props.row.volume).toFixed(3) }}L
|
||||||
<q-popup-edit
|
<q-popup-edit
|
||||||
v-if="drinks_props.row.cost_price_pro_volume"
|
v-if="drinks_props.row.cost_price_pro_volume"
|
||||||
v-model="props.row.volume.value"
|
v-model="props.row.volume"
|
||||||
buttons
|
buttons
|
||||||
label-cancel="Abbrechen"
|
label-cancel="Abbrechen"
|
||||||
label-set="Speichern"
|
label-set="Speichern"
|
||||||
@save="updateVolume(props.row, drinks_props.row)"
|
@save="updateVolume(props.row, drinks_props.row)"
|
||||||
>
|
>
|
||||||
<q-input
|
<q-input
|
||||||
v-model.number="props.row.volume.value"
|
v-model.number="props.row.volume"
|
||||||
dense
|
dense
|
||||||
filled
|
filled
|
||||||
type="number"
|
type="number"
|
||||||
|
@ -340,14 +340,14 @@
|
||||||
<q-badge color="primary">{{ min_price.percentage }}%</q-badge>
|
<q-badge color="primary">{{ min_price.percentage }}%</q-badge>
|
||||||
</div>
|
</div>
|
||||||
<div class="col" style="text-align: end">
|
<div class="col" style="text-align: end">
|
||||||
{{ min_price.price.value.toFixed(3) }}€
|
{{ min_price.price.toFixed(3) }}€
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</q-td>
|
</q-td>
|
||||||
<q-td key="prices" :props="props">
|
<q-td key="prices" :props="props">
|
||||||
<price-table
|
<price-table
|
||||||
:columns="column_prices"
|
:columns="column_prices"
|
||||||
:data="props.row.prices"
|
:rows="props.row.prices"
|
||||||
:row="props.row"
|
:row="props.row"
|
||||||
:visible-columns="visibleColumn"
|
:visible-columns="visibleColumn"
|
||||||
/>
|
/>
|
||||||
|
@ -427,172 +427,6 @@
|
||||||
</q-td>
|
</q-td>
|
||||||
</q-tr>
|
</q-tr>
|
||||||
</template>
|
</template>
|
||||||
<template #body-cell-volumes="volumes">
|
|
||||||
<q-table
|
|
||||||
:columns="column_calc"
|
|
||||||
:data="volumes.value"
|
|
||||||
dense
|
|
||||||
:visible-columns="visibleColumn"
|
|
||||||
row-key="id"
|
|
||||||
flat
|
|
||||||
>
|
|
||||||
<template #header="props">
|
|
||||||
<q-tr :props="props">
|
|
||||||
<q-th auto-width />
|
|
||||||
<q-th v-for="col in props.cols" :key="col.name" :props="props">
|
|
||||||
{{ col.label }}
|
|
||||||
</q-th>
|
|
||||||
</q-tr>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<template #body="props">
|
|
||||||
<q-tr :props="props">
|
|
||||||
<q-td auto-width>
|
|
||||||
<q-btn
|
|
||||||
v-if="volumes.row.cost_price_pro_volume == null"
|
|
||||||
size="sm"
|
|
||||||
color="accent"
|
|
||||||
round
|
|
||||||
dense
|
|
||||||
:icon="props.expand ? 'mdi-chevron-up' : 'mdi-chevron-down'"
|
|
||||||
@click="
|
|
||||||
props.expand = !props.expand;
|
|
||||||
console.log(volumes);
|
|
||||||
"
|
|
||||||
/>
|
|
||||||
<q-btn
|
|
||||||
v-if="props.row.ingredients.length === 0 && props.row.prices.length === 0"
|
|
||||||
size="xs"
|
|
||||||
color="negative"
|
|
||||||
round
|
|
||||||
dense
|
|
||||||
icon="mdi-delete"
|
|
||||||
class="q-mx-sm"
|
|
||||||
@click="deleteVolume(props.row, volumes.row)"
|
|
||||||
/>
|
|
||||||
</q-td>
|
|
||||||
<q-td key="volume" :props="props">
|
|
||||||
{{ parseFloat(props.row.volume.value).toFixed(3) }}L
|
|
||||||
<!--{{ props.row.volume }}-->
|
|
||||||
<q-popup-edit
|
|
||||||
v-if="volumes.row.cost_price_pro_volume"
|
|
||||||
v-model="props.row.volume.value"
|
|
||||||
buttons
|
|
||||||
label-cancel="Abbrechen"
|
|
||||||
label-set="Speichern"
|
|
||||||
@save="updateVolume(props.row, volumes.row)"
|
|
||||||
>
|
|
||||||
<q-input
|
|
||||||
v-model.number="props.row.volume.value"
|
|
||||||
dense
|
|
||||||
filled
|
|
||||||
type="number"
|
|
||||||
suffix="L"
|
|
||||||
/>
|
|
||||||
</q-popup-edit>
|
|
||||||
</q-td>
|
|
||||||
<q-td key="min_prices" :props="props">
|
|
||||||
<div
|
|
||||||
v-for="(min_price, index) in props.row.min_prices"
|
|
||||||
:key="`min_prices` + index"
|
|
||||||
class="row justify-between"
|
|
||||||
>
|
|
||||||
<div class="col">
|
|
||||||
<q-badge color="primary">{{ min_price.percentage }}%</q-badge>
|
|
||||||
</div>
|
|
||||||
<div class="col" style="text-align: end">
|
|
||||||
<!--{{ parseFloat(min_price.price).toFixed(3) }}€-->
|
|
||||||
{{ min_price.price.value.toFixed(3) }}€
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</q-td>
|
|
||||||
<q-td key="prices" :props="props">
|
|
||||||
<price-table
|
|
||||||
:columns="column_prices"
|
|
||||||
:data="props.row.prices"
|
|
||||||
:row="props.row"
|
|
||||||
:visible-columns="visibleColumn"
|
|
||||||
/>
|
|
||||||
</q-td>
|
|
||||||
</q-tr>
|
|
||||||
<q-tr v-show="props.expand" :props="props">
|
|
||||||
<q-td colspan="100%">
|
|
||||||
<ingredients :ingredients="props.row.ingredients" :volume="props.row" />
|
|
||||||
</q-td>
|
|
||||||
</q-tr>
|
|
||||||
</template>
|
|
||||||
<template #bottom>
|
|
||||||
<div class="full-width row justify-end">
|
|
||||||
<q-btn
|
|
||||||
v-if="volumes.row.cost_price_pro_volume"
|
|
||||||
color="positive"
|
|
||||||
icon-right="add"
|
|
||||||
label="Abgabe hinzufügen"
|
|
||||||
size="xs"
|
|
||||||
>
|
|
||||||
<q-menu anchor="center middle" self="center middle">
|
|
||||||
<div class="row justify-around q-pa-sm">
|
|
||||||
<q-input
|
|
||||||
v-model.number="newVolume.volume"
|
|
||||||
filled
|
|
||||||
dense
|
|
||||||
label="Liter"
|
|
||||||
type="number"
|
|
||||||
min="0"
|
|
||||||
step="0.01"
|
|
||||||
suffix="L"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="row justify-between q-pa-sm">
|
|
||||||
<q-btn v-close-popup label="Abbrechen" @click="cancelAddVolume" />
|
|
||||||
<q-btn
|
|
||||||
v-close-popup
|
|
||||||
label="Speichern"
|
|
||||||
color="primary"
|
|
||||||
@click="addVolume(volumes.row)"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</q-menu>
|
|
||||||
</q-btn>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<template #no-data>
|
|
||||||
<div class="full-width row justify-end">
|
|
||||||
<q-btn
|
|
||||||
v-if="volumes.row.cost_price_pro_volume"
|
|
||||||
color="positive"
|
|
||||||
icon-right="add"
|
|
||||||
label="Abgabe hinzufügen"
|
|
||||||
size="xs"
|
|
||||||
>
|
|
||||||
<q-menu anchor="center middle" self="center middle">
|
|
||||||
<div class="row justify-around q-pa-sm">
|
|
||||||
<q-input
|
|
||||||
v-model.number="newVolume.volume"
|
|
||||||
filled
|
|
||||||
dense
|
|
||||||
label="Liter"
|
|
||||||
type="number"
|
|
||||||
min="0"
|
|
||||||
step="0.01"
|
|
||||||
suffix="L"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="row justify-between q-pa-sm">
|
|
||||||
<q-btn v-close-popup label="Abbrechen" @click="cancelAddVolume" />
|
|
||||||
<q-btn
|
|
||||||
v-close-popup
|
|
||||||
label="Speichern"
|
|
||||||
color="primary"
|
|
||||||
@click="addVolume(volumes.row)"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</q-menu>
|
|
||||||
</q-btn>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</q-table>
|
|
||||||
</template>
|
|
||||||
</q-table>
|
</q-table>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -600,8 +434,9 @@
|
||||||
import { defineComponent, onBeforeMount, ref, ComputedRef, computed } from 'vue';
|
import { defineComponent, onBeforeMount, ref, ComputedRef, computed } from 'vue';
|
||||||
import PriceTable from 'src/plugins/pricelist/components/CalculationTable/PriceTable.vue';
|
import PriceTable from 'src/plugins/pricelist/components/CalculationTable/PriceTable.vue';
|
||||||
import Ingredients from 'src/plugins/pricelist/components/CalculationTable/Ingredients.vue';
|
import Ingredients from 'src/plugins/pricelist/components/CalculationTable/Ingredients.vue';
|
||||||
import { StateInterface, useMainStore } from 'src/store';
|
import { useMainStore } from 'src/store';
|
||||||
import { Store } from 'vuex';
|
import { Drink, DrinkPriceVolume, usePricelistStore } from 'src/plugins/pricelist/store';
|
||||||
|
|
||||||
|
|
||||||
function sort(a: string | number, b: string | number) {
|
function sort(a: string | number, b: string | number) {
|
||||||
if (a > b) return 1;
|
if (a > b) return 1;
|
||||||
|
@ -613,9 +448,10 @@ export default defineComponent({
|
||||||
components: { PriceTable, Ingredients },
|
components: { PriceTable, Ingredients },
|
||||||
setup() {
|
setup() {
|
||||||
const mainStore = useMainStore();
|
const mainStore = useMainStore();
|
||||||
|
const store = usePricelistStore();
|
||||||
|
|
||||||
onBeforeMount(() => {
|
onBeforeMount(() => {
|
||||||
//store.actions.getPriceCalcColumn(user);
|
store.getPriceCalcColumn(user);
|
||||||
});
|
});
|
||||||
|
|
||||||
const user = mainStore.currentUser.userid;
|
const user = mainStore.currentUser.userid;
|
||||||
|
@ -684,7 +520,6 @@ export default defineComponent({
|
||||||
name: 'volume',
|
name: 'volume',
|
||||||
label: 'Abgabe in l',
|
label: 'Abgabe in l',
|
||||||
field: 'volume',
|
field: 'volume',
|
||||||
format: (val: number) => `${val} L`,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'min_prices',
|
name: 'min_prices',
|
||||||
|
@ -715,11 +550,10 @@ export default defineComponent({
|
||||||
field: 'public',
|
field: 'public',
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
/*
|
|
||||||
const visibleColumn = computed({
|
const visibleColumn = computed({
|
||||||
get: () => store.state.pricecalc_columns,
|
get: () => store.pricecalc_columns,
|
||||||
set: (val) => {
|
set: (val) => {
|
||||||
store.actions.updatePriceCalcColumn(user, val);
|
store.updatePriceCalcColumn(user, val);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
const emptyVolume: DrinkPriceVolume = {
|
const emptyVolume: DrinkPriceVolume = {
|
||||||
|
@ -736,7 +570,7 @@ export default defineComponent({
|
||||||
};
|
};
|
||||||
const newVolume = ref<DrinkPriceVolume>(emptyVolume);
|
const newVolume = ref<DrinkPriceVolume>(emptyVolume);
|
||||||
function addVolume(drink: Drink) {
|
function addVolume(drink: Drink) {
|
||||||
store.actions.setVolume(>newVolume.value, drink);
|
store.setVolume(<DrinkPriceVolume>newVolume.value, drink);
|
||||||
cancelAddVolume();
|
cancelAddVolume();
|
||||||
}
|
}
|
||||||
function cancelAddVolume() {
|
function cancelAddVolume() {
|
||||||
|
@ -748,14 +582,15 @@ export default defineComponent({
|
||||||
}
|
}
|
||||||
function updateVolume(volume: DrinkPriceVolume, drink: Drink) {
|
function updateVolume(volume: DrinkPriceVolume, drink: Drink) {
|
||||||
console.log(volume);
|
console.log(volume);
|
||||||
store.actions.updateVolume(volume, drink);
|
store.updateVolume(volume, drink);
|
||||||
}
|
}
|
||||||
function deleteVolume(volume: FG.DrinkPriceVolume, drink: FG.Drink) {
|
function deleteVolume(volume: FG.DrinkPriceVolume, drink: FG.Drink) {
|
||||||
store.actions.deleteVolume(volume, drink);
|
store.deleteVolume(volume, drink);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line vue/return-in-computed-property
|
||||||
const pagination = computed(() => {
|
const pagination = computed(() => {
|
||||||
rowsPerPage: store.state.drinks.length;
|
rowsPerPage: store.drinks.length;
|
||||||
});
|
});
|
||||||
|
|
||||||
const emptyDrink: FG.Drink = {
|
const emptyDrink: FG.Drink = {
|
||||||
|
@ -785,6 +620,7 @@ export default defineComponent({
|
||||||
((newDrink.value.cost_price_package_netto || 0) /
|
((newDrink.value.cost_price_package_netto || 0) /
|
||||||
((newDrink.value.volume || 0) * (newDrink.value.package_size || 0))) *
|
((newDrink.value.volume || 0) * (newDrink.value.package_size || 0))) *
|
||||||
1.19;
|
1.19;
|
||||||
|
// eslint-disable-next-line vue/no-side-effects-in-computed-properties
|
||||||
newDrink.value.cost_price_pro_volume = Math.round(retVal * 1000) / 1000;
|
newDrink.value.cost_price_pro_volume = Math.round(retVal * 1000) / 1000;
|
||||||
}
|
}
|
||||||
return newDrink.value.cost_price_pro_volume;
|
return newDrink.value.cost_price_pro_volume;
|
||||||
|
@ -794,24 +630,24 @@ export default defineComponent({
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const drinkTypes = computed(() => store.state.drinkTypes);
|
const drinkTypes = computed(() => store.drinkTypes);
|
||||||
|
|
||||||
function addDrink() {
|
function addDrink() {
|
||||||
store.actions.setDrink(newDrink.value);
|
store.setDrink(newDrink.value);
|
||||||
cancelAddDrink();
|
cancelAddDrink();
|
||||||
}
|
}
|
||||||
function cancelAddDrink() {
|
function cancelAddDrink() {
|
||||||
setTimeout(() => (newDrink.value = emptyDrink), 200);
|
setTimeout(() => (newDrink.value = emptyDrink), 200);
|
||||||
}
|
}
|
||||||
function updateDrink(drink: Drink) {
|
function updateDrink(drink: Drink) {
|
||||||
store.actions.updateDrink(drink);
|
store.updateDrink(drink);
|
||||||
}
|
}
|
||||||
function deleteDrink(drink: Drink) {
|
function deleteDrink(drink: Drink) {
|
||||||
store.actions.deleteDrink(drink);
|
store.deleteDrink(drink);
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
drinks: computed(() => store.state.drinks),
|
drinks: computed(() => store.drinks),
|
||||||
pagination,
|
pagination,
|
||||||
columns,
|
columns,
|
||||||
column_calc,
|
column_calc,
|
||||||
|
@ -831,7 +667,7 @@ export default defineComponent({
|
||||||
updateDrink,
|
updateDrink,
|
||||||
deleteDrink,
|
deleteDrink,
|
||||||
console,
|
console,
|
||||||
};*/
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -146,7 +146,7 @@
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, defineComponent, PropType, ref } from 'vue';
|
import { computed, defineComponent, PropType, ref } from 'vue';
|
||||||
import { usePricelistStore } from '../../store';
|
import { DrinkPriceVolume, usePricelistStore } from '../../store';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'Ingredients',
|
name: 'Ingredients',
|
||||||
|
@ -162,7 +162,7 @@ export default defineComponent({
|
||||||
},
|
},
|
||||||
setup() {
|
setup() {
|
||||||
const store = usePricelistStore();
|
const store = usePricelistStore();
|
||||||
/*
|
|
||||||
const emptyIngredient: FG.Ingredient = {
|
const emptyIngredient: FG.Ingredient = {
|
||||||
id: -1,
|
id: -1,
|
||||||
drink_ingredient: undefined,
|
drink_ingredient: undefined,
|
||||||
|
@ -172,7 +172,7 @@ export default defineComponent({
|
||||||
const newIngredientVolume = ref<number>(0);
|
const newIngredientVolume = ref<number>(0);
|
||||||
function addIngredient(volume: DrinkPriceVolume) {
|
function addIngredient(volume: DrinkPriceVolume) {
|
||||||
if ((<FG.Drink>newIngredient.value)?.volume && newIngredient.value) {
|
if ((<FG.Drink>newIngredient.value)?.volume && newIngredient.value) {
|
||||||
store.actions.setIngredient(
|
store.setIngredient(
|
||||||
{
|
{
|
||||||
id: -1,
|
id: -1,
|
||||||
drink_ingredient: {
|
drink_ingredient: {
|
||||||
|
@ -185,11 +185,11 @@ export default defineComponent({
|
||||||
volume
|
volume
|
||||||
);
|
);
|
||||||
} else if (newIngredient.value) {
|
} else if (newIngredient.value) {
|
||||||
store.actions.setIngredient(
|
store.setIngredient(
|
||||||
{
|
{
|
||||||
id: -1,
|
id: -1,
|
||||||
drink_ingredient: undefined,
|
drink_ingredient: undefined,
|
||||||
extra_ingredient: >newIngredient.value,
|
extra_ingredient: <FG.ExtraIngredient>newIngredient.value,
|
||||||
},
|
},
|
||||||
volume
|
volume
|
||||||
);
|
);
|
||||||
|
@ -202,10 +202,10 @@ export default defineComponent({
|
||||||
}, 200);
|
}, 200);
|
||||||
}
|
}
|
||||||
function updateIngredient(ingredient: FG.Ingredient, volume: DrinkPriceVolume) {
|
function updateIngredient(ingredient: FG.Ingredient, volume: DrinkPriceVolume) {
|
||||||
store.actions.updateIngredient(ingredient, volume);
|
store.updateIngredient(ingredient, volume);
|
||||||
}
|
}
|
||||||
function deleteIngredient(ingredient: FG.Ingredient, volume: DrinkPriceVolume) {
|
function deleteIngredient(ingredient: FG.Ingredient, volume: DrinkPriceVolume) {
|
||||||
store.actions.deleteIngredient(ingredient, volume);
|
store.deleteIngredient(ingredient, volume);
|
||||||
}
|
}
|
||||||
const drinks = computed(() =>
|
const drinks = computed(() =>
|
||||||
store.drinks.filter((drink) => {
|
store.drinks.filter((drink) => {
|
||||||
|
@ -228,7 +228,7 @@ export default defineComponent({
|
||||||
updateIngredient,
|
updateIngredient,
|
||||||
deleteIngredient,
|
deleteIngredient,
|
||||||
get_drink_ingredient_name,
|
get_drink_ingredient_name,
|
||||||
};*/
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -1,160 +0,0 @@
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<q-card>
|
|
||||||
<q-card-section>
|
|
||||||
<div class="text-h4">Neues Getränk</div>
|
|
||||||
</q-card-section>
|
|
||||||
<q-form @submit="save">
|
|
||||||
<q-card-section>
|
|
||||||
<div class="text-h5">Getränkinformationen</div>
|
|
||||||
<div class="row">
|
|
||||||
<q-input
|
|
||||||
v-model="drink.name"
|
|
||||||
class="col-12 col-sm-6 q-px-sm q-py-md"
|
|
||||||
filled
|
|
||||||
label="Name"
|
|
||||||
/>
|
|
||||||
<q-input
|
|
||||||
v-model="drink.volume"
|
|
||||||
class="col-12 col-sm-6 q-px-sm q-py-md"
|
|
||||||
filled
|
|
||||||
label="Inhalt in Liter"
|
|
||||||
type="number"
|
|
||||||
step="0.01"
|
|
||||||
/>
|
|
||||||
<q-input
|
|
||||||
v-model="drink.cost_price"
|
|
||||||
class="col-12 col-sm-6 q-px-sm q-py-md"
|
|
||||||
filled
|
|
||||||
label="Einkaufspreis"
|
|
||||||
type="number"
|
|
||||||
step="0.01"
|
|
||||||
/>
|
|
||||||
<q-input
|
|
||||||
v-model="drink.discount"
|
|
||||||
class="col-12 col-sm-6 q-px-sm q-py-md"
|
|
||||||
filled
|
|
||||||
label="Aufschlag in Prozent"
|
|
||||||
type="number"
|
|
||||||
hint="Wenn nicht gesetzt wird default-wert genommen."
|
|
||||||
step="0.01"
|
|
||||||
/>
|
|
||||||
<q-input
|
|
||||||
v-model="drink.extra_charge"
|
|
||||||
class="col-12 col-sm-6 q-px-sm q-py-md"
|
|
||||||
filled
|
|
||||||
label="Extra Aufschlag in Euro"
|
|
||||||
type="number"
|
|
||||||
step="0.1"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<q-input class="col-12 col-sm-6 q-px-sm q-py-md" filled label="Tags" />
|
|
||||||
</div>
|
|
||||||
</q-card-section>
|
|
||||||
<q-card-section>
|
|
||||||
<div class="row justify-between">
|
|
||||||
<div class="text-h5">Preise</div>
|
|
||||||
<q-btn round icon="mdi-plus" color="primary" @click="addPrice" />
|
|
||||||
</div>
|
|
||||||
<q-card v-for="(price, index) in drink.prices" :key="index" class="q-ma-sm">
|
|
||||||
<div class="row">
|
|
||||||
<q-input
|
|
||||||
v-model="price.volume"
|
|
||||||
class="col-12 col-sm-6 q-px-sm q-py-md"
|
|
||||||
label="Inhalt in Liter"
|
|
||||||
filled
|
|
||||||
type="number"
|
|
||||||
step="0.01"
|
|
||||||
/>
|
|
||||||
<q-input
|
|
||||||
v-model="price.price"
|
|
||||||
class="col-12 col-sm-6 q-px-sm q-py-md"
|
|
||||||
label="Preis in €"
|
|
||||||
filled
|
|
||||||
:disable="price.no_auto"
|
|
||||||
type="number"
|
|
||||||
step="0.1"
|
|
||||||
/>
|
|
||||||
<q-toggle
|
|
||||||
v-model="price.no_auto"
|
|
||||||
class="col-12 col-sm-6 q-px-sm q-py-md"
|
|
||||||
label="Automatische Preiskalkulation"
|
|
||||||
color="primary"
|
|
||||||
/>
|
|
||||||
<q-input
|
|
||||||
v-model="price.round_step"
|
|
||||||
class="col-12 col-sm-6 q-px-sm q-py-md"
|
|
||||||
label="Rundungsschritt"
|
|
||||||
type="number"
|
|
||||||
filled
|
|
||||||
step="0.1"
|
|
||||||
/>
|
|
||||||
<q-toggle
|
|
||||||
v-model="price.public"
|
|
||||||
class="col-12 col-sm-6 q-px-sm q-py-md"
|
|
||||||
label="Öffentlich"
|
|
||||||
color="primary"
|
|
||||||
/>
|
|
||||||
<q-input
|
|
||||||
v-model="price.description"
|
|
||||||
class="col-12 col-sm-6 q-px-sm q-py-md"
|
|
||||||
label="Beschreibung"
|
|
||||||
filled
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</q-card>
|
|
||||||
</q-card-section>
|
|
||||||
<q-card-section>
|
|
||||||
<div class="row justify-between">
|
|
||||||
<div class="text-h5">Zutaten</div>
|
|
||||||
<q-btn round icon="mdi-plus" color="primary" />
|
|
||||||
</div>
|
|
||||||
</q-card-section>
|
|
||||||
<q-card-actions align="right">
|
|
||||||
<q-btn type="submit" label="Speichern" color="primary" />
|
|
||||||
</q-card-actions>
|
|
||||||
</q-form>
|
|
||||||
</q-card>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import { defineComponent, ref } from 'vue';
|
|
||||||
import { usePricelistStore } from '../store';
|
|
||||||
|
|
||||||
export default defineComponent({
|
|
||||||
name: 'Drink',
|
|
||||||
setup() {
|
|
||||||
const store = usePricelistStore();
|
|
||||||
const drink = ref<FG.Drink>({
|
|
||||||
id: -1,
|
|
||||||
name: '',
|
|
||||||
volume: -1,
|
|
||||||
tags: [],
|
|
||||||
volumes: [],
|
|
||||||
});
|
|
||||||
const emptyPrice = {
|
|
||||||
volume: '',
|
|
||||||
price: '',
|
|
||||||
description: '',
|
|
||||||
no_auto: false,
|
|
||||||
round_step: '',
|
|
||||||
public: true,
|
|
||||||
};
|
|
||||||
|
|
||||||
function addPrice() {
|
|
||||||
//drink.value.prices.unshift({ ...emptyPrice });
|
|
||||||
}
|
|
||||||
async function save() {
|
|
||||||
console.log(drink);
|
|
||||||
/*drink.value.prices.forEach((price: FG.DrinkPrice) => {
|
|
||||||
price.no_auto = !price.no_auto;
|
|
||||||
});*/
|
|
||||||
await store.createDrink(drink.value);
|
|
||||||
}
|
|
||||||
return { drink, addPrice, save };
|
|
||||||
},
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped></style>
|
|
|
@ -26,7 +26,7 @@
|
||||||
</q-dialog>
|
</q-dialog>
|
||||||
|
|
||||||
<q-page padding>
|
<q-page padding>
|
||||||
<q-table title="Getränkearten" :data="rows" :row-key="(row) => row.id" :columns="columns">
|
<q-table title="Getränkearten" :rows="rows" :row-key="(row) => row.id" :columns="columns">
|
||||||
<template #top-right>
|
<template #top-right>
|
||||||
<q-input
|
<q-input
|
||||||
v-model="newExtraIngredient.name"
|
v-model="newExtraIngredient.name"
|
||||||
|
@ -62,23 +62,24 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, defineComponent, ref } from 'vue';
|
import {computed, ComputedRef, defineComponent, ref} from 'vue';
|
||||||
|
import {usePricelistStore} from 'src/plugins/pricelist/store';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'DrinkTypes',
|
name: 'DrinkTypes',
|
||||||
setup() {
|
setup() {
|
||||||
/*
|
const store = usePricelistStore()
|
||||||
const emptyExtraIngredient: FG.ExtraIngredient = {
|
const emptyExtraIngredient: FG.ExtraIngredient = {
|
||||||
name: '',
|
name: '',
|
||||||
price: 0,
|
price: 0,
|
||||||
id: -1,
|
id: -1,
|
||||||
};
|
};
|
||||||
const newExtraIngredient = ref(emptyExtraIngredient);
|
const newExtraIngredient = ref<FG.ExtraIngredient>(emptyExtraIngredient);
|
||||||
const newDrinkTypeName = ref('');
|
const newDrinkTypeName = ref<string>('');
|
||||||
const edittype = ref(false);
|
const edittype = ref(false);
|
||||||
const actualExtraIngredient = ref(emptyExtraIngredient);
|
const actualExtraIngredient = ref(emptyExtraIngredient);
|
||||||
|
|
||||||
const rows = computed(() => store.state.extraIngredients);
|
const rows = computed(() => store.extraIngredients);
|
||||||
const columns = [
|
const columns = [
|
||||||
{
|
{
|
||||||
name: 'name',
|
name: 'name',
|
||||||
|
@ -102,8 +103,8 @@ export default defineComponent({
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
function addExtraIngredient() {
|
async function addExtraIngredient() {
|
||||||
store.actions.setExtraIngredient(newExtraIngredient.value);
|
await store.setExtraIngredient((<ComputedRef>newExtraIngredient).value);
|
||||||
newExtraIngredient.value = emptyExtraIngredient;
|
newExtraIngredient.value = emptyExtraIngredient;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,8 +113,8 @@ export default defineComponent({
|
||||||
actualExtraIngredient.value = extraIngredient;
|
actualExtraIngredient.value = extraIngredient;
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveChanges() {
|
async function saveChanges() {
|
||||||
store.actions.updateExtraIngredient(actualExtraIngredient.value);
|
await store.updateExtraIngredient(actualExtraIngredient.value);
|
||||||
setTimeout(() => discardChanges(), 200);
|
setTimeout(() => discardChanges(), 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,7 +125,7 @@ export default defineComponent({
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteType(extraIngredient: FG.ExtraIngredient) {
|
function deleteType(extraIngredient: FG.ExtraIngredient) {
|
||||||
store.actions.deleteExtraIngredient(extraIngredient);
|
void store.deleteExtraIngredient(extraIngredient);
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
@ -138,7 +139,7 @@ export default defineComponent({
|
||||||
actualExtraIngredient,
|
actualExtraIngredient,
|
||||||
discardChanges,
|
discardChanges,
|
||||||
saveChanges,
|
saveChanges,
|
||||||
};*/
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -32,13 +32,13 @@
|
||||||
class="q-ma-none q-pa-none fit row justify-center content-start items-start"
|
class="q-ma-none q-pa-none fit row justify-center content-start items-start"
|
||||||
>
|
>
|
||||||
<q-tab-panel name="pricelist">
|
<q-tab-panel name="pricelist">
|
||||||
<CalculationTable />
|
<calculation-table />
|
||||||
</q-tab-panel>
|
</q-tab-panel>
|
||||||
<q-tab-panel name="extra_ingredients">
|
<q-tab-panel name="extra_ingredients">
|
||||||
<extra-ingredients />
|
<extra-ingredients />
|
||||||
</q-tab-panel>
|
</q-tab-panel>
|
||||||
<q-tab-panel name="drink_types">
|
<q-tab-panel name="drink_types">
|
||||||
<DrinkTypes />
|
<drink-types />
|
||||||
</q-tab-panel>
|
</q-tab-panel>
|
||||||
</q-tab-panels>
|
</q-tab-panels>
|
||||||
</q-page>
|
</q-page>
|
||||||
|
@ -46,19 +46,29 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, defineComponent, ref } from 'vue';
|
import { computed, defineComponent, onBeforeMount, ref } from 'vue';
|
||||||
import { Screen } from 'quasar';
|
import { Screen } from 'quasar';
|
||||||
import DrinkTypes from 'src/plugins/pricelist/components/DrinkTypes.vue';
|
import DrinkTypes from 'src/plugins/pricelist/components/DrinkTypes.vue';
|
||||||
import CalculationTable from 'src/plugins/pricelist/components/CalculationTable.vue';
|
import CalculationTable from 'src/plugins/pricelist/components/CalculationTable.vue';
|
||||||
import ExtraIngredients from 'src/plugins/pricelist/components/ExtraIngredients.vue';
|
import ExtraIngredients from 'src/plugins/pricelist/components/ExtraIngredients.vue';
|
||||||
|
import { usePricelistStore } from 'src/plugins/pricelist/store';
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'Settings',
|
name: 'Settings',
|
||||||
components: { DrinkTypes, ExtraIngredients, CalculationTable },
|
//components: { DrinkTypes, ExtraIngredients, CalculationTable },
|
||||||
|
components: { ExtraIngredients, DrinkTypes, CalculationTable },
|
||||||
setup(_) {
|
setup(_) {
|
||||||
interface Tab {
|
interface Tab {
|
||||||
name: string;
|
name: string;
|
||||||
label: string;
|
label: string;
|
||||||
}
|
}
|
||||||
|
const store = usePricelistStore()
|
||||||
|
onBeforeMount(() => {
|
||||||
|
store.getExtraIngredients().then(() => {
|
||||||
|
console.log(store.extraIngredients)
|
||||||
|
}).catch(err => console.log(err))
|
||||||
|
void store.getDrinkTypes()
|
||||||
|
store.getDrinks()
|
||||||
|
})
|
||||||
|
|
||||||
const drawer = ref<boolean>(false);
|
const drawer = ref<boolean>(false);
|
||||||
|
|
||||||
|
@ -68,19 +78,19 @@ export default defineComponent({
|
||||||
},
|
},
|
||||||
set: (val: boolean) => {
|
set: (val: boolean) => {
|
||||||
drawer.value = val;
|
drawer.value = val;
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const tabs: Tab[] = [
|
const tabs: Tab[] = [
|
||||||
{ name: 'pricelist', label: 'Getränke' },
|
{ name: 'pricelist', label: 'Getränke' },
|
||||||
{ name: 'extra_ingredients', label: 'Zutaten' },
|
{ name: 'extra_ingredients', label: 'Zutaten' },
|
||||||
{ name: 'drink_types', label: 'Getränketypen' },
|
{ name: 'drink_types', label: 'Getränketypen' }
|
||||||
];
|
];
|
||||||
|
|
||||||
const tab = ref<string>('pricelist');
|
const tab = ref<string>('pricelist');
|
||||||
|
|
||||||
return { tabs, tab, showDrawer };
|
return { tabs, tab, showDrawer };
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ const mainRoutes: FG_Plugin.PluginRouteConfig[] = [
|
||||||
route: {
|
route: {
|
||||||
path: 'drinks',
|
path: 'drinks',
|
||||||
name: 'drinks',
|
name: 'drinks',
|
||||||
redirect: { name: 'drinks-pricelist' },
|
redirect: { name: 'drinks-pricelist' }
|
||||||
},
|
},
|
||||||
permissions: ['user'],
|
permissions: ['user'],
|
||||||
children: [
|
children: [
|
||||||
|
@ -18,22 +18,22 @@ const mainRoutes: FG_Plugin.PluginRouteConfig[] = [
|
||||||
route: {
|
route: {
|
||||||
path: 'pricelist',
|
path: 'pricelist',
|
||||||
name: 'drinks-pricelist',
|
name: 'drinks-pricelist',
|
||||||
component: () => import('../pages/PricelistP.vue'),
|
component: () => import('../pages/PricelistP.vue')
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Einstellungen',
|
title: 'Einstellungen',
|
||||||
icon: 'mdi-coffee-to-go',
|
icon: 'mdi-coffee-to-go',
|
||||||
shortcut: false,
|
shortcut: false,
|
||||||
permissions: ['pricelist_settings'],
|
permissions: ['user'],
|
||||||
route: {
|
route: {
|
||||||
path: 'settings',
|
path: 'settings',
|
||||||
name: 'drinks-settings',
|
name: 'drinks-settings',
|
||||||
component: () => import('../pages/Settings.vue'),
|
component: () => import('../pages/Settings.vue')
|
||||||
},
|
}
|
||||||
},
|
}
|
||||||
],
|
]
|
||||||
},
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
export default mainRoutes;
|
export default mainRoutes;
|
||||||
|
|
|
@ -1,12 +1,154 @@
|
||||||
import { api } from 'src/boot/axios';
|
import { api } from 'src/boot/axios';
|
||||||
import { defineStore } from 'pinia';
|
import { defineStore } from 'pinia';
|
||||||
|
import { AxiosResponse } from 'axios';
|
||||||
|
import { computed, WritableComputedRef } from 'vue';
|
||||||
|
|
||||||
|
interface MinPrice extends Omit<FG.MinPrices, 'price'> {
|
||||||
|
price: WritableComputedRef<number> | null;
|
||||||
|
}
|
||||||
|
interface DrinkPriceVolume extends Omit<Omit<FG.DrinkPriceVolume, 'volume'>, 'min_prices'> {
|
||||||
|
_volume: number;
|
||||||
|
volume: WritableComputedRef<number> | null;
|
||||||
|
min_prices: MinPrice[];
|
||||||
|
}
|
||||||
|
interface Drink extends Omit<Omit<FG.Drink, 'cost_price_pro_volume'>, 'volumes'> {
|
||||||
|
volumes: DrinkPriceVolume[];
|
||||||
|
cost_price_pro_volume: WritableComputedRef<number | undefined>;
|
||||||
|
_cost_price_pro_volume?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
class DrinkPriceVolume {
|
||||||
|
constructor({ id, volume, min_prices, prices, ingredients }: FG.DrinkPriceVolume, drink: Drink) {
|
||||||
|
this.id = id;
|
||||||
|
this._volume = volume;
|
||||||
|
this.prices = prices;
|
||||||
|
this.ingredients = ingredients;
|
||||||
|
this.min_prices = [
|
||||||
|
{
|
||||||
|
percentage: 100,
|
||||||
|
price: create_min_prices(drink, this, 100),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
percentage: 250,
|
||||||
|
price: create_min_prices(drink, this, 250),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
percentage: 300,
|
||||||
|
price: create_min_prices(drink, this, 300),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
this.volume = computed<number>({
|
||||||
|
get: () => {
|
||||||
|
if (this.ingredients.some((ingredient) => !!ingredient.drink_ingredient)) {
|
||||||
|
let retVal = 0;
|
||||||
|
this.ingredients.forEach((ingredient) => {
|
||||||
|
if (ingredient.drink_ingredient?.volume) {
|
||||||
|
retVal += ingredient.drink_ingredient.volume;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this._volume = retVal;
|
||||||
|
return retVal;
|
||||||
|
} else {
|
||||||
|
return this._volume;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
set: (val) => (this._volume = val),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Drink {
|
||||||
|
constructor({
|
||||||
|
id,
|
||||||
|
article_id,
|
||||||
|
package_size,
|
||||||
|
name,
|
||||||
|
volume,
|
||||||
|
cost_price_pro_volume,
|
||||||
|
cost_price_package_netto,
|
||||||
|
tags,
|
||||||
|
type,
|
||||||
|
volumes,
|
||||||
|
}: FG.Drink) {
|
||||||
|
this.id = id;
|
||||||
|
this.article_id = article_id;
|
||||||
|
this.package_size = package_size;
|
||||||
|
this.name = name;
|
||||||
|
this.volume = volume;
|
||||||
|
this.cost_price_package_netto = cost_price_package_netto;
|
||||||
|
this._cost_price_pro_volume = cost_price_pro_volume;
|
||||||
|
this.cost_price_pro_volume = computed({
|
||||||
|
get: () => {
|
||||||
|
if (!!this.volume && !!this.package_size && !!this.cost_price_package_netto) {
|
||||||
|
const retVal =
|
||||||
|
((this.cost_price_package_netto || 0) /
|
||||||
|
((this.volume || 0) * (this.package_size || 0))) *
|
||||||
|
1.19;
|
||||||
|
this._cost_price_pro_volume = Math.round(retVal * 1000) / 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this._cost_price_pro_volume;
|
||||||
|
},
|
||||||
|
set: (val) => (this._cost_price_pro_volume = val),
|
||||||
|
});
|
||||||
|
this.tags = tags;
|
||||||
|
this.type = type;
|
||||||
|
this.volumes = [];
|
||||||
|
//volumes.forEach(volume => {
|
||||||
|
// this.volumes.push(new DrinkPriceVolume(volume, this));
|
||||||
|
//});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function create_min_prices(drink: Drink, volume: DrinkPriceVolume, percentage: number) {
|
||||||
|
if (drink.cost_price_pro_volume?.value) {
|
||||||
|
if (volume.ingredients.every((ingredient) => !!ingredient.drink_ingredient)) {
|
||||||
|
return computed<number>(() => {
|
||||||
|
let retVal = (drink.cost_price_pro_volume?.value || 0) * (volume.volume?.value || 0);
|
||||||
|
volume.ingredients.forEach((ingredient) => {
|
||||||
|
if (ingredient.extra_ingredient) {
|
||||||
|
retVal += ingredient.extra_ingredient.price;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
retVal = (retVal * percentage) / 100;
|
||||||
|
return retVal;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return computed<number>(
|
||||||
|
() =>
|
||||||
|
((drink.cost_price_pro_volume?.value || 0) * (volume.volume?.value || 0) * percentage) /
|
||||||
|
100
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return computed<number>(() => {
|
||||||
|
let retVal = 0;
|
||||||
|
volume.ingredients.forEach((ingredient) => {
|
||||||
|
if (ingredient.drink_ingredient) {
|
||||||
|
const _drink = usePricelistStore().drinks.find(
|
||||||
|
(a) => a.id === ingredient.drink_ingredient?.drink_ingredient_id
|
||||||
|
);
|
||||||
|
retVal +=
|
||||||
|
ingredient.drink_ingredient.volume * (_drink?.cost_price_pro_volume?.value || 0);
|
||||||
|
}
|
||||||
|
if (ingredient.extra_ingredient) {
|
||||||
|
retVal += ingredient.extra_ingredient.price;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
console.log(volume);
|
||||||
|
return (retVal * percentage) / 100;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export const usePricelistStore = defineStore({
|
export const usePricelistStore = defineStore({
|
||||||
id: 'pricelist',
|
id: 'pricelist',
|
||||||
|
|
||||||
state: () => ({
|
state: () => ({
|
||||||
drinkTypes: [] as Array<FG.DrinkType>,
|
drinkTypes: [] as Array<FG.DrinkType>,
|
||||||
drinks: [] as Array<FG.Drink>,
|
drinks: [] as Array<Drink>,
|
||||||
|
extraIngredients: [] as Array<FG.ExtraIngredient>,
|
||||||
|
pricecalc_columns: [] as Array<string>,
|
||||||
}),
|
}),
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
|
@ -31,16 +173,212 @@ export const usePricelistStore = defineStore({
|
||||||
const itm = this.drinkTypes.filter((val) => val.id == drinkType.id);
|
const itm = this.drinkTypes.filter((val) => val.id == drinkType.id);
|
||||||
if (itm.length > 0) itm[0].name = drinkType.name;
|
if (itm.length > 0) itm[0].name = drinkType.name;
|
||||||
},
|
},
|
||||||
async getDrinks(force = false) {
|
async getExtraIngredients() {
|
||||||
|
const { data } = await api.get<Array<FG.ExtraIngredient>>(
|
||||||
|
'pricelist/ingredients/extraIngredients'
|
||||||
|
);
|
||||||
|
this.extraIngredients = data;
|
||||||
|
},
|
||||||
|
async setExtraIngredient(ingredient: FG.ExtraIngredient) {
|
||||||
|
const { data } = await api.post<FG.ExtraIngredient>(
|
||||||
|
'pricelist/ingredients/extraIngredients',
|
||||||
|
ingredient
|
||||||
|
);
|
||||||
|
this.extraIngredients.push(data);
|
||||||
|
},
|
||||||
|
async updateExtraIngredient(ingredient: FG.ExtraIngredient) {
|
||||||
|
const { data } = await api.put<FG.ExtraIngredient>(
|
||||||
|
`pricelist/ingredients/extraIngredients/${ingredient.id}`,
|
||||||
|
ingredient
|
||||||
|
);
|
||||||
|
const index = this.extraIngredients.findIndex((a) => a.id === ingredient.id);
|
||||||
|
if (index > -1) {
|
||||||
|
this.extraIngredients[index] = data;
|
||||||
|
} else {
|
||||||
|
this.extraIngredients.push(data);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async deleteExtraIngredient(ingredient: FG.ExtraIngredient) {
|
||||||
|
await api.delete(`pricelist/ingredients/extraIngredients/${ingredient.id}`);
|
||||||
|
const index = this.extraIngredients.findIndex((a) => a.id === ingredient.id);
|
||||||
|
if (index > -1) {
|
||||||
|
this.extraIngredients.splice(index, 1);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/*async getDrinks(force = false) {
|
||||||
if (force || this.drinks.length == 0) {
|
if (force || this.drinks.length == 0) {
|
||||||
const { data } = await api.get<Array<FG.Drink>>('/pricelist/drinks');
|
const { data } = await api.get<Array<FG.Drink>>('/pricelist/drinks');
|
||||||
this.drinks = data;
|
this.drinks = data;
|
||||||
}
|
}
|
||||||
return this.drinks;
|
return this.drinks;
|
||||||
|
},*/
|
||||||
|
getDrinks() {
|
||||||
|
api
|
||||||
|
.get('pricelist/drinks')
|
||||||
|
.then((response: AxiosResponse<FG.Drink[]>) => {
|
||||||
|
this.drinks = [];
|
||||||
|
response.data.forEach((drink) => {
|
||||||
|
this.drinks.push(new Drink(drink));
|
||||||
|
});
|
||||||
|
this.drinks.forEach((drink) => {
|
||||||
|
const _drink = response.data.find((a) => a.id === drink.id);
|
||||||
|
_drink?.volumes.forEach((volume) => {
|
||||||
|
drink.volumes.push(new DrinkPriceVolume(volume, drink));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
console.log(this.drinks);
|
||||||
|
})
|
||||||
|
.catch((err) => console.warn(err));
|
||||||
},
|
},
|
||||||
async createDrink(drink: FG.Drink) {
|
setPrice(price: FG.DrinkPrice, volume: DrinkPriceVolume) {
|
||||||
await api.post('/pricelist/drinks', drink);
|
api
|
||||||
this.drinks.push(drink);
|
.post(`pricelist/volumes/${volume.id}/prices`, price)
|
||||||
|
.then((response: AxiosResponse<FG.DrinkPrice>) => {
|
||||||
|
volume.prices.push(response.data);
|
||||||
|
this.sortPrices(volume);
|
||||||
|
})
|
||||||
|
.catch((err) => console.warn(err));
|
||||||
|
},
|
||||||
|
sortPrices(volume: DrinkPriceVolume) {
|
||||||
|
volume.prices.sort((a, b) => {
|
||||||
|
if (a.price > b.price) return 1;
|
||||||
|
if (b.price > a.price) return -1;
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
deletePrice(price: FG.DrinkPrice, volume: FG.DrinkPriceVolume) {
|
||||||
|
api
|
||||||
|
.delete(`pricelist/prices/${price.id}`)
|
||||||
|
.then(() => {
|
||||||
|
const index = volume.prices.findIndex((a) => a.id == price.id);
|
||||||
|
if (index > -1) {
|
||||||
|
volume.prices.splice(index, 1);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((err) => console.warn(err));
|
||||||
|
},
|
||||||
|
updatePrice(price: FG.DrinkPrice, volume: DrinkPriceVolume) {
|
||||||
|
api
|
||||||
|
.put(`pricelist/prices/${price.id}`, price)
|
||||||
|
.then((response: AxiosResponse<FG.DrinkPrice>) => {
|
||||||
|
const index = volume.prices.findIndex((a) => a.id === price.id);
|
||||||
|
if (index > -1) {
|
||||||
|
this.sortPrices(volume);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((err) => console.log(err));
|
||||||
|
},
|
||||||
|
setVolume(volume: DrinkPriceVolume, drink: Drink) {
|
||||||
|
console.log(volume);
|
||||||
|
api
|
||||||
|
.post(`pricelist/drinks/${drink.id}/volumes`, {
|
||||||
|
...volume,
|
||||||
|
volume: volume.volume,
|
||||||
|
})
|
||||||
|
.then((response: AxiosResponse<FG.DrinkPriceVolume>) => {
|
||||||
|
drink.volumes.push(new DrinkPriceVolume(response.data, drink));
|
||||||
|
})
|
||||||
|
.catch((err) => console.warn(err));
|
||||||
|
},
|
||||||
|
updateVolume(volume: DrinkPriceVolume, drink: Drink) {
|
||||||
|
api
|
||||||
|
.put(`pricelist/volumes/${volume.id}`, {
|
||||||
|
...volume,
|
||||||
|
volume: volume.volume?.value,
|
||||||
|
})
|
||||||
|
.catch((err) => console.warn(err));
|
||||||
|
},
|
||||||
|
deleteVolume(volume: FG.DrinkPriceVolume, drink: FG.Drink) {
|
||||||
|
api
|
||||||
|
.delete(`pricelist/volumes/${volume.id}`)
|
||||||
|
.then(() => {
|
||||||
|
const index = drink.volumes.findIndex((a) => a.id === volume.id);
|
||||||
|
if (index > -1) {
|
||||||
|
drink.volumes.splice(index, 1);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((err) => console.warn(err));
|
||||||
|
},
|
||||||
|
setIngredient(ingredient: FG.Ingredient, volume: DrinkPriceVolume) {
|
||||||
|
api
|
||||||
|
.post(`pricelist/volumes/${volume.id}/ingredients`, ingredient)
|
||||||
|
.then((response: AxiosResponse<FG.Ingredient>) => {
|
||||||
|
volume.ingredients.push(response.data);
|
||||||
|
})
|
||||||
|
.catch((err) => console.warn(err));
|
||||||
|
},
|
||||||
|
updateIngredient(ingredient: FG.Ingredient, volume: DrinkPriceVolume) {
|
||||||
|
api
|
||||||
|
.put(`pricelist/ingredients/${ingredient.id}`, ingredient)
|
||||||
|
.then((response: AxiosResponse<FG.Ingredient>) => {
|
||||||
|
//const index = volume.ingredients.findIndex(a => a.id === response.data.id);
|
||||||
|
//if (index > -1) {
|
||||||
|
// volume.ingredients[index] = response.data;
|
||||||
|
//}
|
||||||
|
})
|
||||||
|
.catch((err) => console.warn(err));
|
||||||
|
},
|
||||||
|
deleteIngredient(ingredient: FG.Ingredient, volume: DrinkPriceVolume) {
|
||||||
|
api
|
||||||
|
.delete(`pricelist/ingredients/${ingredient.id}`)
|
||||||
|
.then(() => {
|
||||||
|
const index = volume.ingredients.findIndex((a) => a.id === ingredient.id);
|
||||||
|
if (index > -1) {
|
||||||
|
volume.ingredients.splice(index, 1);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((err) => console.warn(err));
|
||||||
|
},
|
||||||
|
setDrink(drink: FG.Drink) {
|
||||||
|
api
|
||||||
|
.post('pricelist/drinks', drink)
|
||||||
|
.then((response: AxiosResponse<FG.Drink>) => {
|
||||||
|
this.drinks.push(new Drink(response.data));
|
||||||
|
const drink = this.drinks.find((a) => a.id === response.data.id);
|
||||||
|
response.data.volumes.forEach((volume) => {
|
||||||
|
drink?.volumes.push(new DrinkPriceVolume(volume, drink));
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch((err) => console.warn(err));
|
||||||
|
},
|
||||||
|
updateDrink(drink: Drink) {
|
||||||
|
api
|
||||||
|
.put(`pricelist/drinks/${drink.id}`, {
|
||||||
|
...drink,
|
||||||
|
cost_price_pro_volume: drink.cost_price_pro_volume?.value,
|
||||||
|
})
|
||||||
|
.catch((err) => console.warn(err));
|
||||||
|
},
|
||||||
|
deleteDrink(drink: Drink) {
|
||||||
|
api
|
||||||
|
.delete(`pricelist/drinks/${drink.id}`)
|
||||||
|
.then(() => {
|
||||||
|
const index = this.drinks.findIndex((a) => a.id === drink.id);
|
||||||
|
if (index > -1) {
|
||||||
|
this.drinks.splice(index, 1);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((err) => console.warn(err));
|
||||||
|
},
|
||||||
|
getPriceCalcColumn(userid: string) {
|
||||||
|
api
|
||||||
|
.get(`pricelist/users/${userid}/pricecalc_columns`)
|
||||||
|
.then(({ data }: AxiosResponse<Array<string>>) => {
|
||||||
|
if (data.length > 0) {
|
||||||
|
this.pricecalc_columns = data;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((err) => console.log(err));
|
||||||
|
},
|
||||||
|
updatePriceCalcColumn(userid: string, data: Array<string>) {
|
||||||
|
api
|
||||||
|
.put(`pricelist/users/${userid}/pricecalc_columns`, data)
|
||||||
|
.then(() => {
|
||||||
|
this.pricecalc_columns = data;
|
||||||
|
})
|
||||||
|
.catch((err) => console.log(err));
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export { create_min_prices, DrinkPriceVolume, MinPrice, Drink };
|
||||||
|
|
Loading…
Reference in New Issue