forked from verdnatura/salix-front
Latest buys WIP
This commit is contained in:
parent
21050362c8
commit
7d9b34d4c5
|
@ -41,7 +41,7 @@ const setUserConfigViewData = (data) => {
|
||||||
// Importante: El name de las columnas de la tabla debe conincidir con el name de las variables que devuelve la view config
|
// Importante: El name de las columnas de la tabla debe conincidir con el name de las variables que devuelve la view config
|
||||||
formattedCols.value = $props.allColumns.map((col) => ({
|
formattedCols.value = $props.allColumns.map((col) => ({
|
||||||
name: col,
|
name: col,
|
||||||
active: data[col],
|
active: data[col] == undefined ? true : data[col],
|
||||||
}));
|
}));
|
||||||
emitSavedConfig();
|
emitSavedConfig();
|
||||||
};
|
};
|
||||||
|
|
|
@ -267,6 +267,7 @@ export default {
|
||||||
notes: 'Notes',
|
notes: 'Notes',
|
||||||
log: 'Log',
|
log: 'Log',
|
||||||
create: 'Create',
|
create: 'Create',
|
||||||
|
latestBuys: 'Latest buys',
|
||||||
},
|
},
|
||||||
list: {
|
list: {
|
||||||
newEntry: 'New entry',
|
newEntry: 'New entry',
|
||||||
|
@ -352,6 +353,36 @@ export default {
|
||||||
landed: 'Landed',
|
landed: 'Landed',
|
||||||
warehouseOut: 'Warehouse Out',
|
warehouseOut: 'Warehouse Out',
|
||||||
},
|
},
|
||||||
|
latestBuys: {
|
||||||
|
picture: 'Picture',
|
||||||
|
itemFk: 'Item ID',
|
||||||
|
packing: 'Packing',
|
||||||
|
grouping: 'Grouping',
|
||||||
|
quantity: 'Quantity',
|
||||||
|
description: 'Description',
|
||||||
|
size: 'Size',
|
||||||
|
tags: 'Tags',
|
||||||
|
type: 'Type',
|
||||||
|
intrastat: 'Intrastat',
|
||||||
|
origin: 'Origin',
|
||||||
|
weightByPiece: 'Weight/Piece',
|
||||||
|
isActive: 'Active',
|
||||||
|
family: 'Family',
|
||||||
|
entryFk: 'Entry',
|
||||||
|
buyingValue: 'Buying value',
|
||||||
|
freightValue: 'Freight value',
|
||||||
|
comissionValue: 'Commission value',
|
||||||
|
packageValue: 'Package value',
|
||||||
|
isIgnored: 'Is ignored',
|
||||||
|
price2: 'Grouping',
|
||||||
|
price3: 'Packing',
|
||||||
|
minPrice: 'Min',
|
||||||
|
ektFk: 'Ekt',
|
||||||
|
weight: 'Weight',
|
||||||
|
packagingFk: 'Package',
|
||||||
|
packingOut: 'Package out',
|
||||||
|
landing: 'Landing',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
ticket: {
|
ticket: {
|
||||||
pageTitles: {
|
pageTitles: {
|
||||||
|
|
|
@ -266,6 +266,7 @@ export default {
|
||||||
notes: 'Notas',
|
notes: 'Notas',
|
||||||
log: 'Historial',
|
log: 'Historial',
|
||||||
create: 'Crear',
|
create: 'Crear',
|
||||||
|
latestBuys: 'Últimas compras',
|
||||||
},
|
},
|
||||||
list: {
|
list: {
|
||||||
newEntry: 'Nueva entrada',
|
newEntry: 'Nueva entrada',
|
||||||
|
@ -351,6 +352,36 @@ export default {
|
||||||
landed: 'F. entrega',
|
landed: 'F. entrega',
|
||||||
warehouseOut: 'Alm. salida',
|
warehouseOut: 'Alm. salida',
|
||||||
},
|
},
|
||||||
|
latestBuys: {
|
||||||
|
picture: 'Foto',
|
||||||
|
itemFk: 'ID Artículo',
|
||||||
|
packing: 'Packing',
|
||||||
|
grouping: 'Grouping',
|
||||||
|
quantity: 'Cantidad',
|
||||||
|
description: 'Descripción',
|
||||||
|
size: 'Medida',
|
||||||
|
tags: 'Etiquetas',
|
||||||
|
type: 'Tipo',
|
||||||
|
intrastat: 'Intrastat',
|
||||||
|
origin: 'Origen',
|
||||||
|
weightByPiece: 'Peso (gramos)/tallo',
|
||||||
|
isActive: 'Activo',
|
||||||
|
family: 'Familia',
|
||||||
|
entryFk: 'Entrada',
|
||||||
|
buyingValue: 'Coste',
|
||||||
|
freightValue: 'Porte',
|
||||||
|
comissionValue: 'Comisión',
|
||||||
|
packageValue: 'Embalaje',
|
||||||
|
isIgnored: 'Ignorado',
|
||||||
|
price2: 'Grouping',
|
||||||
|
price3: 'Packing',
|
||||||
|
minPrice: 'Min',
|
||||||
|
ektFk: 'Ekt',
|
||||||
|
weight: 'Peso',
|
||||||
|
packagingFk: 'Embalaje',
|
||||||
|
packingOut: 'Embalaje envíos',
|
||||||
|
landing: 'Llegada',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
ticket: {
|
ticket: {
|
||||||
pageTitles: {
|
pageTitles: {
|
||||||
|
|
|
@ -0,0 +1,303 @@
|
||||||
|
<script setup>
|
||||||
|
import { onMounted, ref, computed } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import FetchData from 'components/FetchData.vue';
|
||||||
|
import FetchedTags from 'components/ui/FetchedTags.vue';
|
||||||
|
import EntryDescriptorProxy from './Card/EntryDescriptorProxy.vue';
|
||||||
|
import TableVisibleColumns from 'src/components/common/TableVisibleColumns.vue';
|
||||||
|
|
||||||
|
import { useStateStore } from 'stores/useStateStore';
|
||||||
|
import { toDate, toCurrency } from 'src/filters';
|
||||||
|
import { useSession } from 'composables/useSession';
|
||||||
|
import { dashIfEmpty } from 'src/filters';
|
||||||
|
|
||||||
|
const session = useSession();
|
||||||
|
const token = session.getToken();
|
||||||
|
const stateStore = useStateStore();
|
||||||
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
const visibleColumns = ref([]);
|
||||||
|
const allColumnNames = ref([]);
|
||||||
|
const rows = ref([]);
|
||||||
|
const columns = computed(() => [
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.picture'),
|
||||||
|
name: 'picture',
|
||||||
|
align: 'left',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.itemFk'),
|
||||||
|
name: 'itemFk',
|
||||||
|
field: 'itemFk',
|
||||||
|
align: 'left',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.packing'),
|
||||||
|
field: 'packing',
|
||||||
|
name: 'packing',
|
||||||
|
align: 'left',
|
||||||
|
format: (val) => dashIfEmpty(val),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.grouping'),
|
||||||
|
field: 'grouping',
|
||||||
|
name: 'grouping',
|
||||||
|
align: 'left',
|
||||||
|
format: (val) => dashIfEmpty(val),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.quantity'),
|
||||||
|
field: 'quantity',
|
||||||
|
name: 'quantity',
|
||||||
|
align: 'left',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.description'),
|
||||||
|
field: 'description',
|
||||||
|
name: 'description',
|
||||||
|
align: 'left',
|
||||||
|
format: (val) => dashIfEmpty(val),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.size'),
|
||||||
|
field: 'size',
|
||||||
|
name: 'size',
|
||||||
|
align: 'left',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.tags'),
|
||||||
|
name: 'tags',
|
||||||
|
align: 'left',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.type'),
|
||||||
|
field: 'code',
|
||||||
|
name: 'type',
|
||||||
|
align: 'left',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.intrastat'),
|
||||||
|
field: 'intrastat',
|
||||||
|
name: 'intrastat',
|
||||||
|
align: 'left',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.origin'),
|
||||||
|
field: 'origin',
|
||||||
|
name: 'origin',
|
||||||
|
align: 'left',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.weightByPiece'),
|
||||||
|
field: 'weightByPiece',
|
||||||
|
name: 'weightByPiece',
|
||||||
|
align: 'left',
|
||||||
|
format: (val) => dashIfEmpty(val),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.isActive'),
|
||||||
|
field: 'isActive',
|
||||||
|
name: 'isActive',
|
||||||
|
align: 'left',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.family'),
|
||||||
|
field: 'family',
|
||||||
|
name: 'family',
|
||||||
|
align: 'left',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.entryFk'),
|
||||||
|
field: 'entryFk',
|
||||||
|
name: 'entryFk',
|
||||||
|
align: 'left',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.buyingValue'),
|
||||||
|
field: 'buyingValue',
|
||||||
|
name: 'buyingValue',
|
||||||
|
align: 'left',
|
||||||
|
format: (val) => toCurrency(val),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.freightValue'),
|
||||||
|
field: 'freightValue',
|
||||||
|
name: 'freightValue',
|
||||||
|
align: 'left',
|
||||||
|
format: (val) => toCurrency(val),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.comissionValue'),
|
||||||
|
field: 'comissionValue',
|
||||||
|
name: 'comissionValue',
|
||||||
|
align: 'left',
|
||||||
|
format: (val) => toCurrency(val),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.packageValue'),
|
||||||
|
field: 'packageValue',
|
||||||
|
name: 'packageValue',
|
||||||
|
align: 'left',
|
||||||
|
format: (val) => toCurrency(val),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.isIgnored'),
|
||||||
|
field: 'isIgnored',
|
||||||
|
name: 'isIgnored',
|
||||||
|
align: 'left',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.price2'),
|
||||||
|
field: 'price2',
|
||||||
|
name: 'price2',
|
||||||
|
align: 'left',
|
||||||
|
format: (val) => toCurrency(val),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.price3'),
|
||||||
|
field: 'price3',
|
||||||
|
name: 'price3',
|
||||||
|
align: 'left',
|
||||||
|
format: (val) => toCurrency(val),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.minPrice'),
|
||||||
|
field: 'minPrice',
|
||||||
|
name: 'minPrice',
|
||||||
|
align: 'left',
|
||||||
|
format: (val) => toCurrency(val),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.ektFk'),
|
||||||
|
field: 'ektFk',
|
||||||
|
name: 'ektFk',
|
||||||
|
align: 'left',
|
||||||
|
format: (val) => dashIfEmpty(val),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.weight'),
|
||||||
|
field: 'weight',
|
||||||
|
name: 'weight',
|
||||||
|
align: 'left',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.packagingFk'),
|
||||||
|
field: 'packagingFk',
|
||||||
|
name: 'packagingFk',
|
||||||
|
align: 'left',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.packingOut'),
|
||||||
|
field: 'packingOut',
|
||||||
|
name: 'packingOut',
|
||||||
|
align: 'left',
|
||||||
|
format: (val) => dashIfEmpty(val),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t('entry.latestBuys.landing'),
|
||||||
|
field: 'landing',
|
||||||
|
name: 'landing',
|
||||||
|
align: 'left',
|
||||||
|
format: (val) => toDate(val),
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
stateStore.rightDrawer = true;
|
||||||
|
const filteredColumns = columns.value.filter((col) => col.name !== 'picture');
|
||||||
|
allColumnNames.value = filteredColumns.map((col) => col.name);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<FetchData
|
||||||
|
url="Buys/latestBuysFilter"
|
||||||
|
:filter="{ order: 'itemFk DESC', limit: 20 }"
|
||||||
|
@on-fetch="(data) => (rows = data)"
|
||||||
|
auto-load
|
||||||
|
/>
|
||||||
|
<QToolbar class="bg-vn-dark justify-end">
|
||||||
|
<div id="st-data">
|
||||||
|
<TableVisibleColumns
|
||||||
|
:all-columns="allColumnNames"
|
||||||
|
table-code="latestBuys"
|
||||||
|
labels-traductions-path="entry.latestBuys"
|
||||||
|
@on-config-saved="visibleColumns = ['picture', ...$event]"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<QSpace />
|
||||||
|
<div id="st-actions"></div>
|
||||||
|
</QToolbar>
|
||||||
|
<!-- <QDrawer v-model="stateStore.rightDrawer" side="right" :width="256" show-if-above>
|
||||||
|
<QScrollArea class="fit text-grey-8">
|
||||||
|
<ExtraCommunityFilter data-key="ExtraCommunity" />
|
||||||
|
</QScrollArea>
|
||||||
|
</QDrawer> -->
|
||||||
|
<QPage class="column items-center q-pa-md">
|
||||||
|
<QTable
|
||||||
|
:rows="rows"
|
||||||
|
:columns="columns"
|
||||||
|
hide-bottom
|
||||||
|
row-key="id"
|
||||||
|
:pagination="{ rowsPerPage: 0 }"
|
||||||
|
class="full-width q-mt-md"
|
||||||
|
:visible-columns="visibleColumns"
|
||||||
|
>
|
||||||
|
<template #body-cell-picture="{ row }">
|
||||||
|
<QTd>
|
||||||
|
<QImg
|
||||||
|
:src="`/api/Images/catalog/50x50/${row.itemFk}/download?access_token=${token}`"
|
||||||
|
spinner-color="primary"
|
||||||
|
:ratio="1"
|
||||||
|
height="192"
|
||||||
|
width="192"
|
||||||
|
class="image"
|
||||||
|
/>
|
||||||
|
</QTd>
|
||||||
|
</template>
|
||||||
|
<template #body-cell-itemFk="{ row }">
|
||||||
|
<QTd>
|
||||||
|
<QBtn flat color="blue">
|
||||||
|
{{ row.itemFk }}
|
||||||
|
</QBtn>
|
||||||
|
</QTd>
|
||||||
|
</template>
|
||||||
|
<template #body-cell-tags="{ row }">
|
||||||
|
<QTd>
|
||||||
|
<fetched-tags :item="row" :max-length="6" />
|
||||||
|
</QTd>
|
||||||
|
</template>
|
||||||
|
<template #body-cell-entryFk="{ row }">
|
||||||
|
<QTd>
|
||||||
|
<QBtn flat color="blue">
|
||||||
|
<EntryDescriptorProxy :id="row.entryFk" />
|
||||||
|
{{ row.entryFk }}
|
||||||
|
</QBtn>
|
||||||
|
</QTd>
|
||||||
|
</template>
|
||||||
|
<template #body-cell-isIgnored="{ row }">
|
||||||
|
<QTd>
|
||||||
|
<QIcon
|
||||||
|
:name="row.isIgnored ? `check` : `close`"
|
||||||
|
:color="row.isIgnored ? `positive` : `negative`"
|
||||||
|
size="sm"
|
||||||
|
/>
|
||||||
|
</QTd>
|
||||||
|
</template>
|
||||||
|
<template #body-cell-isActive="{ row }">
|
||||||
|
<QTd>
|
||||||
|
<QIcon
|
||||||
|
:name="row.isActive ? `check` : `close`"
|
||||||
|
:color="row.isActive ? `positive` : `negative`"
|
||||||
|
size="sm"
|
||||||
|
/>
|
||||||
|
</QTd>
|
||||||
|
</template>
|
||||||
|
</QTable>
|
||||||
|
</QPage>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<i18n>
|
||||||
|
es:
|
||||||
|
</i18n>
|
|
@ -9,6 +9,7 @@ import VnLv from 'src/components/ui/VnLv.vue';
|
||||||
import CardList from 'src/components/ui/CardList.vue';
|
import CardList from 'src/components/ui/CardList.vue';
|
||||||
import EntrySummaryDialog from './Card/EntrySummaryDialog.vue';
|
import EntrySummaryDialog from './Card/EntrySummaryDialog.vue';
|
||||||
import EntryFilter from './EntryFilter.vue';
|
import EntryFilter from './EntryFilter.vue';
|
||||||
|
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
|
||||||
|
|
||||||
import { useStateStore } from 'stores/useStateStore';
|
import { useStateStore } from 'stores/useStateStore';
|
||||||
import { toDate } from 'src/filters/index';
|
import { toDate } from 'src/filters/index';
|
||||||
|
@ -41,6 +42,16 @@ onMounted(async () => {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
<template v-if="stateStore.isHeaderMounted()">
|
||||||
|
<Teleport to="#searchbar">
|
||||||
|
<VnSearchbar
|
||||||
|
data-key="EntryList"
|
||||||
|
url="Entries/filter"
|
||||||
|
:label="t('Search entries')"
|
||||||
|
:info="t('You can search by entry reference')"
|
||||||
|
/>
|
||||||
|
</Teleport>
|
||||||
|
</template>
|
||||||
<QDrawer v-model="stateStore.rightDrawer" side="right" :width="256" show-if-above>
|
<QDrawer v-model="stateStore.rightDrawer" side="right" :width="256" show-if-above>
|
||||||
<QScrollArea class="fit text-grey-8">
|
<QScrollArea class="fit text-grey-8">
|
||||||
<EntryFilter data-key="EntryList" />
|
<EntryFilter data-key="EntryList" />
|
||||||
|
|
|
@ -1,25 +1,12 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { useI18n } from 'vue-i18n';
|
|
||||||
import LeftMenu from 'src/components/LeftMenu.vue';
|
import LeftMenu from 'src/components/LeftMenu.vue';
|
||||||
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
|
|
||||||
|
|
||||||
import { useStateStore } from 'stores/useStateStore';
|
import { useStateStore } from 'stores/useStateStore';
|
||||||
|
|
||||||
const { t } = useI18n();
|
|
||||||
const stateStore = useStateStore();
|
const stateStore = useStateStore();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<template v-if="stateStore.isHeaderMounted()">
|
|
||||||
<Teleport to="#searchbar">
|
|
||||||
<VnSearchbar
|
|
||||||
data-key="EntryList"
|
|
||||||
url="Entries/filter"
|
|
||||||
:label="t('Search entries')"
|
|
||||||
:info="t('You can search by entry reference')"
|
|
||||||
/>
|
|
||||||
</Teleport>
|
|
||||||
</template>
|
|
||||||
<QDrawer v-model="stateStore.leftDrawer" show-if-above :width="256">
|
<QDrawer v-model="stateStore.leftDrawer" show-if-above :width="256">
|
||||||
<QScrollArea class="fit text-grey-8">
|
<QScrollArea class="fit text-grey-8">
|
||||||
<LeftMenu />
|
<LeftMenu />
|
||||||
|
|
|
@ -10,7 +10,7 @@ export default {
|
||||||
component: RouterView,
|
component: RouterView,
|
||||||
redirect: { name: 'EntryMain' },
|
redirect: { name: 'EntryMain' },
|
||||||
menus: {
|
menus: {
|
||||||
main: ['EntryList'],
|
main: ['EntryList', 'EntryLatestBuys'],
|
||||||
card: ['EntryBasicData', 'EntryBuys', 'EntryNotes', 'EntryLog'],
|
card: ['EntryBasicData', 'EntryBuys', 'EntryNotes', 'EntryLog'],
|
||||||
},
|
},
|
||||||
children: [
|
children: [
|
||||||
|
@ -37,6 +37,15 @@ export default {
|
||||||
},
|
},
|
||||||
component: () => import('src/pages/Entry/EntryCreate.vue'),
|
component: () => import('src/pages/Entry/EntryCreate.vue'),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: 'latest-buys',
|
||||||
|
name: 'EntryLatestBuys',
|
||||||
|
meta: {
|
||||||
|
title: 'latestBuys',
|
||||||
|
icon: 'contact_support',
|
||||||
|
},
|
||||||
|
component: () => import('src/pages/Entry/EntryLatestBuys.vue'),
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue