forked from verdnatura/salix-front
Merge branch 'dev' into 7710-cloneWithTicketPackaging
This commit is contained in:
commit
b82449b174
|
@ -202,7 +202,7 @@ function formatValue(value) {
|
||||||
|
|
||||||
function sanitizer(params) {
|
function sanitizer(params) {
|
||||||
for (const [key, value] of Object.entries(params)) {
|
for (const [key, value] of Object.entries(params)) {
|
||||||
if (typeof value == 'object') {
|
if (value && typeof value === 'object') {
|
||||||
const param = Object.values(value)[0];
|
const param = Object.values(value)[0];
|
||||||
if (typeof param == 'string') params[key] = param.replaceAll('%', '');
|
if (typeof param == 'string') params[key] = param.replaceAll('%', '');
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,10 +103,6 @@ select:-webkit-autofill {
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-width {
|
|
||||||
width: 770px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vn-card-list {
|
.vn-card-list {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 60em;
|
max-width: 60em;
|
||||||
|
@ -268,3 +264,10 @@ input::-webkit-inner-spin-button {
|
||||||
max-width: 400px;
|
max-width: 400px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.edit-photo-btn {
|
||||||
|
position: absolute;
|
||||||
|
right: 12px;
|
||||||
|
bottom: 12px;
|
||||||
|
z-index: 1;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
|
@ -690,6 +690,7 @@ invoiceOut:
|
||||||
chooseValidClient: Choose a valid client
|
chooseValidClient: Choose a valid client
|
||||||
chooseValidCompany: Choose a valid company
|
chooseValidCompany: Choose a valid company
|
||||||
chooseValidPrinter: Choose a valid printer
|
chooseValidPrinter: Choose a valid printer
|
||||||
|
chooseValidSerialType: Choose a serial type
|
||||||
fillDates: Invoice date and the max date should be filled
|
fillDates: Invoice date and the max date should be filled
|
||||||
invoiceDateLessThanMaxDate: Invoice date can not be less than max date
|
invoiceDateLessThanMaxDate: Invoice date can not be less than max date
|
||||||
invoiceWithFutureDate: Exists an invoice with a future date
|
invoiceWithFutureDate: Exists an invoice with a future date
|
||||||
|
|
|
@ -696,6 +696,7 @@ invoiceOut:
|
||||||
chooseValidClient: Selecciona un cliente válido
|
chooseValidClient: Selecciona un cliente válido
|
||||||
chooseValidCompany: Selecciona una empresa válida
|
chooseValidCompany: Selecciona una empresa válida
|
||||||
chooseValidPrinter: Selecciona una impresora válida
|
chooseValidPrinter: Selecciona una impresora válida
|
||||||
|
chooseValidSerialType: Selecciona una tipo de serie válida
|
||||||
fillDates: La fecha de la factura y la fecha máxima deben estar completas
|
fillDates: La fecha de la factura y la fecha máxima deben estar completas
|
||||||
invoiceDateLessThanMaxDate: La fecha de la factura no puede ser menor que la fecha máxima
|
invoiceDateLessThanMaxDate: La fecha de la factura no puede ser menor que la fecha máxima
|
||||||
invoiceWithFutureDate: Existe una factura con una fecha futura
|
invoiceWithFutureDate: Existe una factura con una fecha futura
|
||||||
|
|
|
@ -42,7 +42,7 @@ claim:
|
||||||
pickup: Recoger
|
pickup: Recoger
|
||||||
null: No
|
null: No
|
||||||
agency: Agencia
|
agency: Agencia
|
||||||
delivery: Entrega
|
delivery: Reparto
|
||||||
fileDescription: 'ID de reclamación {claimId} del cliente {clientName} con ID {clientId}'
|
fileDescription: 'ID de reclamación {claimId} del cliente {clientName} con ID {clientId}'
|
||||||
noData: 'No hay imágenes/videos, haz clic aquí o arrastra y suelta el archivo'
|
noData: 'No hay imágenes/videos, haz clic aquí o arrastra y suelta el archivo'
|
||||||
dragDrop: Arrastra y suelta aquí
|
dragDrop: Arrastra y suelta aquí
|
||||||
|
|
|
@ -222,7 +222,7 @@ const showTransferInvoiceForm = async () => {
|
||||||
<QItemSection>{{ t('Generate PDF invoice') }}</QItemSection>
|
<QItemSection>{{ t('Generate PDF invoice') }}</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
<QItem v-ripple clickable>
|
<QItem v-ripple clickable>
|
||||||
<QItemSection>{{ t('Refund...') }}</QItemSection>
|
<QItemSection>{{ t('Refund') }}</QItemSection>
|
||||||
<QItemSection side>
|
<QItemSection side>
|
||||||
<QIcon name="keyboard_arrow_right" />
|
<QIcon name="keyboard_arrow_right" />
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
|
@ -250,7 +250,7 @@ es:
|
||||||
Delete invoice: Eliminar factura
|
Delete invoice: Eliminar factura
|
||||||
Book invoice: Asentar factura
|
Book invoice: Asentar factura
|
||||||
Generate PDF invoice: Generar PDF factura
|
Generate PDF invoice: Generar PDF factura
|
||||||
Refund...: Abono
|
Refund: Abono
|
||||||
As PDF: como PDF
|
As PDF: como PDF
|
||||||
As CSV: como CSV
|
As CSV: como CSV
|
||||||
Send PDF: Enviar PDF
|
Send PDF: Enviar PDF
|
||||||
|
|
|
@ -94,11 +94,13 @@ const selectCustomerId = (id) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const statusText = computed(() => {
|
const statusText = computed(() => {
|
||||||
return status.value === 'invoicing'
|
const baseStatus = t(`status.${status.value}`);
|
||||||
? `${t(`status.${status.value}`)} ${
|
const clientId =
|
||||||
addresses.value[getAddressNumber.value]?.clientId
|
status.value === 'invoicing'
|
||||||
}`
|
? addresses.value[getAddressNumber.value]?.clientId || ''
|
||||||
: t(`status.${status.value}`);
|
: '';
|
||||||
|
|
||||||
|
return clientId ? `${baseStatus} ${clientId}`.trim() : baseStatus;
|
||||||
});
|
});
|
||||||
|
|
||||||
onMounted(() => (stateStore.rightDrawer = true));
|
onMounted(() => (stateStore.rightDrawer = true));
|
||||||
|
|
|
@ -20,21 +20,25 @@ const { initialDataLoading, formInitialData, invoicing, status } =
|
||||||
const { makeInvoice, setStatusValue } = invoiceOutGlobalStore;
|
const { makeInvoice, setStatusValue } = invoiceOutGlobalStore;
|
||||||
|
|
||||||
const clientsToInvoice = ref('all');
|
const clientsToInvoice = ref('all');
|
||||||
|
|
||||||
const companiesOptions = ref([]);
|
const companiesOptions = ref([]);
|
||||||
|
|
||||||
const printersOptions = ref([]);
|
const printersOptions = ref([]);
|
||||||
|
const serialTypesOptions = ref([]);
|
||||||
|
|
||||||
const clientsOptions = ref([]);
|
const handleInvoiceOutSerialsFetch = (data) => {
|
||||||
|
serialTypesOptions.value = Array.from(
|
||||||
|
new Set(data.map((item) => item.type).filter((type) => type))
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
const formData = ref({});
|
const formData = ref({});
|
||||||
|
|
||||||
const optionsInitialData = computed(() => {
|
const optionsInitialData = computed(() => {
|
||||||
return (
|
const optionsArrays = [
|
||||||
companiesOptions.value.length > 0 &&
|
companiesOptions.value,
|
||||||
printersOptions.value.length > 0 &&
|
printersOptions.value,
|
||||||
clientsOptions.value.length > 0
|
serialTypesOptions.value,
|
||||||
);
|
];
|
||||||
|
return optionsArrays.every((arr) => arr.length > 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
const getStatus = computed({
|
const getStatus = computed({
|
||||||
|
@ -59,8 +63,11 @@ onMounted(async () => {
|
||||||
auto-load
|
auto-load
|
||||||
/>
|
/>
|
||||||
<FetchData url="Printers" @on-fetch="(data) => (printersOptions = data)" auto-load />
|
<FetchData url="Printers" @on-fetch="(data) => (printersOptions = data)" auto-load />
|
||||||
<FetchData url="Clients" @on-fetch="(data) => (clientsOptions = data)" auto-load />
|
<FetchData
|
||||||
|
url="invoiceOutSerials"
|
||||||
|
@on-fetch="handleInvoiceOutSerialsFetch"
|
||||||
|
auto-load
|
||||||
|
/>
|
||||||
<QForm
|
<QForm
|
||||||
v-if="!initialDataLoading && optionsInitialData"
|
v-if="!initialDataLoading && optionsInitialData"
|
||||||
@submit="makeInvoice(formData, clientsToInvoice)"
|
@submit="makeInvoice(formData, clientsToInvoice)"
|
||||||
|
@ -87,7 +94,7 @@ onMounted(async () => {
|
||||||
v-if="clientsToInvoice === 'one'"
|
v-if="clientsToInvoice === 'one'"
|
||||||
:label="t('client')"
|
:label="t('client')"
|
||||||
v-model="formData.clientId"
|
v-model="formData.clientId"
|
||||||
:options="clientsOptions"
|
url="Clients"
|
||||||
option-value="id"
|
option-value="id"
|
||||||
option-label="name"
|
option-label="name"
|
||||||
hide-selected
|
hide-selected
|
||||||
|
@ -95,6 +102,17 @@ onMounted(async () => {
|
||||||
outlined
|
outlined
|
||||||
rounded
|
rounded
|
||||||
/>
|
/>
|
||||||
|
<VnSelect
|
||||||
|
:label="t('invoiceOutSerialType')"
|
||||||
|
v-model="formData.serialType"
|
||||||
|
:options="serialTypesOptions"
|
||||||
|
option-value="type"
|
||||||
|
option-label="type"
|
||||||
|
hide-selected
|
||||||
|
dense
|
||||||
|
outlined
|
||||||
|
rounded
|
||||||
|
/>
|
||||||
<VnInputDate
|
<VnInputDate
|
||||||
v-model="formData.invoiceDate"
|
v-model="formData.invoiceDate"
|
||||||
:label="t('invoiceDate')"
|
:label="t('invoiceDate')"
|
||||||
|
@ -168,6 +186,7 @@ en:
|
||||||
printer: Printer
|
printer: Printer
|
||||||
invoiceOut: Invoice out
|
invoiceOut: Invoice out
|
||||||
client: Client
|
client: Client
|
||||||
|
invoiceOutSerialType: Serial Type
|
||||||
stop: Stop
|
stop: Stop
|
||||||
|
|
||||||
es:
|
es:
|
||||||
|
@ -179,5 +198,6 @@ es:
|
||||||
printer: Impresora
|
printer: Impresora
|
||||||
invoiceOut: Facturar
|
invoiceOut: Facturar
|
||||||
client: Cliente
|
client: Cliente
|
||||||
|
invoiceOutSerialType: Tipo de Serie
|
||||||
stop: Parar
|
stop: Parar
|
||||||
</i18n>
|
</i18n>
|
||||||
|
|
|
@ -198,7 +198,7 @@ watchEffect(selectedRows);
|
||||||
:url="`${MODEL}/filter`"
|
:url="`${MODEL}/filter`"
|
||||||
:create="{
|
:create="{
|
||||||
urlCreate: 'InvoiceOuts/createManualInvoice',
|
urlCreate: 'InvoiceOuts/createManualInvoice',
|
||||||
title: t('Create Manual Invoice'),
|
title: t('Create manual invoice'),
|
||||||
onDataSaved: ({ id }) => tableRef.redirect(id),
|
onDataSaved: ({ id }) => tableRef.redirect(id),
|
||||||
formInitialData: {
|
formInitialData: {
|
||||||
active: true,
|
active: true,
|
||||||
|
@ -275,10 +275,12 @@ en:
|
||||||
fileAllowed: Successful download of CSV file
|
fileAllowed: Successful download of CSV file
|
||||||
youCanSearchByInvoiceReference: You can search by invoice reference
|
youCanSearchByInvoiceReference: You can search by invoice reference
|
||||||
createInvoice: Make invoice
|
createInvoice: Make invoice
|
||||||
|
Create manual invoice: Create manual invoice
|
||||||
es:
|
es:
|
||||||
searchInvoice: Buscar factura emitida
|
searchInvoice: Buscar factura emitida
|
||||||
fileDenied: El navegador denegó la descarga de archivos...
|
fileDenied: El navegador denegó la descarga de archivos...
|
||||||
fileAllowed: Descarga exitosa de archivo CSV
|
fileAllowed: Descarga exitosa de archivo CSV
|
||||||
youCanSearchByInvoiceReference: Puedes buscar por referencia de la factura
|
youCanSearchByInvoiceReference: Puedes buscar por referencia de la factura
|
||||||
createInvoice: Crear factura
|
createInvoice: Crear factura
|
||||||
|
Create manual invoice: Crear factura manual
|
||||||
</i18n>
|
</i18n>
|
||||||
|
|
|
@ -138,14 +138,6 @@ en:
|
||||||
</i18n>
|
</i18n>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.edit-photo-btn {
|
|
||||||
position: absolute;
|
|
||||||
right: 12px;
|
|
||||||
bottom: 12px;
|
|
||||||
z-index: 1;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.separation-borders {
|
.separation-borders {
|
||||||
border-left: 1px solid $white;
|
border-left: 1px solid $white;
|
||||||
border-right: 1px solid $white;
|
border-right: 1px solid $white;
|
||||||
|
|
|
@ -252,7 +252,7 @@ const createRefund = async (withWarehouse) => {
|
||||||
</QItem>
|
</QItem>
|
||||||
<QItem clickable v-ripple>
|
<QItem clickable v-ripple>
|
||||||
<QItemSection>
|
<QItemSection>
|
||||||
<QItemLabel>{{ t('Refund...') }}</QItemLabel>
|
<QItemLabel>{{ t('Refund') }}</QItemLabel>
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
<QItemSection side>
|
<QItemSection side>
|
||||||
<QIcon name="keyboard_arrow_right" />
|
<QIcon name="keyboard_arrow_right" />
|
||||||
|
@ -287,7 +287,7 @@ es:
|
||||||
Add claim: Crear reclamación
|
Add claim: Crear reclamación
|
||||||
Mark as reserved: Marcar como reservado
|
Mark as reserved: Marcar como reservado
|
||||||
Unmark as reserved: Desmarcar como reservado
|
Unmark as reserved: Desmarcar como reservado
|
||||||
Refund...: Abono...
|
Refund: Abono
|
||||||
with warehouse: con almacén
|
with warehouse: con almacén
|
||||||
without warehouse: sin almacén
|
without warehouse: sin almacén
|
||||||
Claim out of time: Reclamación fuera de plazo
|
Claim out of time: Reclamación fuera de plazo
|
||||||
|
|
|
@ -448,7 +448,7 @@ const handleCloseProgressDialog = () => {
|
||||||
const handleCancelProgress = () => (cancelProgress.value = true);
|
const handleCancelProgress = () => (cancelProgress.value = true);
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
let today = Date.vnNew();
|
let today = Date.vnNew().toISOString();
|
||||||
const tomorrow = new Date(today);
|
const tomorrow = new Date(today);
|
||||||
tomorrow.setDate(tomorrow.getDate() + 1);
|
tomorrow.setDate(tomorrow.getDate() + 1);
|
||||||
userParams.dateFuture = tomorrow;
|
userParams.dateFuture = tomorrow;
|
||||||
|
|
|
@ -55,7 +55,7 @@ onMounted(async () => await getItemPackingTypes());
|
||||||
:data-key="props.dataKey"
|
:data-key="props.dataKey"
|
||||||
:search-button="true"
|
:search-button="true"
|
||||||
:hidden-tags="['search']"
|
:hidden-tags="['search']"
|
||||||
:unremovable-params="['warehouseFk', 'dateFuture', 'dateToAdvance']"
|
:un-removable-params="['warehouseFk', 'dateFuture', 'dateToAdvance']"
|
||||||
>
|
>
|
||||||
<template #tags="{ tag, formatFn }">
|
<template #tags="{ tag, formatFn }">
|
||||||
<div class="q-gutter-x-xs">
|
<div class="q-gutter-x-xs">
|
||||||
|
@ -70,7 +70,6 @@ onMounted(async () => await getItemPackingTypes());
|
||||||
v-model="params.dateFuture"
|
v-model="params.dateFuture"
|
||||||
:label="t('params.dateFuture')"
|
:label="t('params.dateFuture')"
|
||||||
is-outlined
|
is-outlined
|
||||||
@update:model-value="searchFn()"
|
|
||||||
/>
|
/>
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
|
@ -80,7 +79,6 @@ onMounted(async () => await getItemPackingTypes());
|
||||||
v-model="params.dateToAdvance"
|
v-model="params.dateToAdvance"
|
||||||
:label="t('params.dateToAdvance')"
|
:label="t('params.dateToAdvance')"
|
||||||
is-outlined
|
is-outlined
|
||||||
@update:model-value="searchFn()"
|
|
||||||
/>
|
/>
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
|
|
|
@ -8,6 +8,8 @@ import VnSelect from 'src/components/common/VnSelect.vue';
|
||||||
import TicketDescriptorProxy from 'src/pages/Ticket/Card/TicketDescriptorProxy.vue';
|
import TicketDescriptorProxy from 'src/pages/Ticket/Card/TicketDescriptorProxy.vue';
|
||||||
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
|
||||||
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
|
import VnSearchbar from 'src/components/ui/VnSearchbar.vue';
|
||||||
|
import RightMenu from 'src/components/common/RightMenu.vue';
|
||||||
|
import TicketFutureFilter from './TicketFutureFilter.vue';
|
||||||
|
|
||||||
import { dashIfEmpty, toCurrency } from 'src/filters';
|
import { dashIfEmpty, toCurrency } from 'src/filters';
|
||||||
import { useVnConfirm } from 'composables/useVnConfirm';
|
import { useVnConfirm } from 'composables/useVnConfirm';
|
||||||
|
@ -37,9 +39,9 @@ const exprBuilder = (param, value) => {
|
||||||
return { liters: value };
|
return { liters: value };
|
||||||
case 'lines':
|
case 'lines':
|
||||||
return { lines: value };
|
return { lines: value };
|
||||||
case 'ipt':
|
case 'iptColFilter':
|
||||||
return { ipt: { like: `%${value}%` } };
|
return { ipt: { like: `%${value}%` } };
|
||||||
case 'futureIpt':
|
case 'futureIptColFilter':
|
||||||
return { futureIpt: { like: `%${value}%` } };
|
return { futureIpt: { like: `%${value}%` } };
|
||||||
case 'totalWithVat':
|
case 'totalWithVat':
|
||||||
return { totalWithVat: value };
|
return { totalWithVat: value };
|
||||||
|
@ -47,8 +49,8 @@ const exprBuilder = (param, value) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const userParams = reactive({
|
const userParams = reactive({
|
||||||
futureDated: Date.vnNew(),
|
futureDated: Date.vnNew().toISOString(),
|
||||||
originDated: Date.vnNew(),
|
originDated: Date.vnNew().toISOString(),
|
||||||
warehouseFk: user.value.warehouseFk,
|
warehouseFk: user.value.warehouseFk,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -83,6 +85,8 @@ const getInputEvents = (col) => {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const tickets = computed(() => store.data);
|
||||||
|
|
||||||
const ticketColumns = computed(() => [
|
const ticketColumns = computed(() => [
|
||||||
{
|
{
|
||||||
label: t('futureTickets.problems'),
|
label: t('futureTickets.problems'),
|
||||||
|
@ -121,7 +125,7 @@ const ticketColumns = computed(() => [
|
||||||
sortable: true,
|
sortable: true,
|
||||||
columnFilter: {
|
columnFilter: {
|
||||||
component: VnSelect,
|
component: VnSelect,
|
||||||
filterParamKey: 'ipt',
|
filterParamKey: 'iptColFilter',
|
||||||
type: 'select',
|
type: 'select',
|
||||||
filterValue: null,
|
filterValue: null,
|
||||||
event: getInputEvents,
|
event: getInputEvents,
|
||||||
|
@ -214,7 +218,7 @@ const ticketColumns = computed(() => [
|
||||||
sortable: true,
|
sortable: true,
|
||||||
columnFilter: {
|
columnFilter: {
|
||||||
component: VnSelect,
|
component: VnSelect,
|
||||||
filterParamKey: 'futureIpt',
|
filterParamKey: 'futureIptColFilter',
|
||||||
type: 'select',
|
type: 'select',
|
||||||
filterValue: null,
|
filterValue: null,
|
||||||
event: getInputEvents,
|
event: getInputEvents,
|
||||||
|
@ -305,9 +309,14 @@ onMounted(async () => {
|
||||||
</QBtn>
|
</QBtn>
|
||||||
</template>
|
</template>
|
||||||
</VnSubToolbar>
|
</VnSubToolbar>
|
||||||
|
<RightMenu>
|
||||||
|
<template #right-panel>
|
||||||
|
<TicketFutureFilter data-key="FutureTickets" />
|
||||||
|
</template>
|
||||||
|
</RightMenu>
|
||||||
<QPage class="column items-center q-pa-md">
|
<QPage class="column items-center q-pa-md">
|
||||||
<QTable
|
<QTable
|
||||||
:rows="store.data"
|
:rows="tickets"
|
||||||
:columns="ticketColumns"
|
:columns="ticketColumns"
|
||||||
row-key="id"
|
row-key="id"
|
||||||
selection="multiple"
|
selection="multiple"
|
||||||
|
|
|
@ -0,0 +1,242 @@
|
||||||
|
<script setup>
|
||||||
|
import { ref } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import FetchData from 'components/FetchData.vue';
|
||||||
|
import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue';
|
||||||
|
import VnSelect from 'components/common/VnSelect.vue';
|
||||||
|
import VnInputDate from 'src/components/common/VnInputDate.vue';
|
||||||
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
|
|
||||||
|
import axios from 'axios';
|
||||||
|
import { onMounted } from 'vue';
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
const props = defineProps({
|
||||||
|
dataKey: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const warehousesOptions = ref([]);
|
||||||
|
const itemPackingTypes = ref([]);
|
||||||
|
const stateOptions = ref([]);
|
||||||
|
|
||||||
|
const getItemPackingTypes = async () => {
|
||||||
|
try {
|
||||||
|
const filter = {
|
||||||
|
where: { isActive: true },
|
||||||
|
};
|
||||||
|
const { data } = await axios.get('ItemPackingTypes', {
|
||||||
|
params: { filter: JSON.stringify(filter) },
|
||||||
|
});
|
||||||
|
itemPackingTypes.value = data.map((ipt) => ({
|
||||||
|
description: t(ipt.description),
|
||||||
|
code: ipt.code,
|
||||||
|
}));
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const getGroupedStates = async () => {
|
||||||
|
try {
|
||||||
|
const { data } = await axios.get('AlertLevels');
|
||||||
|
stateOptions.value = data.map((state) => ({
|
||||||
|
id: state.id,
|
||||||
|
name: t(`futureTickets.${state.code}`),
|
||||||
|
code: state.code,
|
||||||
|
}));
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
getItemPackingTypes();
|
||||||
|
getGroupedStates();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<FetchData
|
||||||
|
url="Warehouses"
|
||||||
|
@on-fetch="(data) => (warehousesOptions = data)"
|
||||||
|
auto-load
|
||||||
|
/>
|
||||||
|
<VnFilterPanel
|
||||||
|
:data-key="props.dataKey"
|
||||||
|
:hidden-tags="['search']"
|
||||||
|
:un-removable-params="['warehouseFk', 'originDated', 'futureDated']"
|
||||||
|
>
|
||||||
|
<template #tags="{ tag, formatFn }">
|
||||||
|
<div class="q-gutter-x-xs">
|
||||||
|
<strong>{{ t(`params.${tag.label}`) }}: </strong>
|
||||||
|
<span>{{ formatFn(tag.value) }}</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template #body="{ params, searchFn }">
|
||||||
|
<QItem class="q-my-sm">
|
||||||
|
<QItemSection>
|
||||||
|
<VnInputDate
|
||||||
|
v-model="params.originDated"
|
||||||
|
:label="t('params.originDated')"
|
||||||
|
is-outlined
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
<QItem class="q-my-sm">
|
||||||
|
<QItemSection>
|
||||||
|
<VnInputDate
|
||||||
|
v-model="params.futureDated"
|
||||||
|
:label="t('params.futureDated')"
|
||||||
|
is-outlined
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
<QItem class="q-my-sm">
|
||||||
|
<QItemSection>
|
||||||
|
<VnInput
|
||||||
|
:label="t('params.litersMax')"
|
||||||
|
v-model="params.litersMax"
|
||||||
|
is-outlined
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
<QItem class="q-my-sm">
|
||||||
|
<QItemSection>
|
||||||
|
<VnInput
|
||||||
|
:label="t('params.linesMax')"
|
||||||
|
v-model="params.linesMax"
|
||||||
|
is-outlined
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
<QItem>
|
||||||
|
<QItemSection>
|
||||||
|
<VnSelect
|
||||||
|
:label="t('params.ipt')"
|
||||||
|
v-model="params.ipt"
|
||||||
|
:options="itemPackingTypes"
|
||||||
|
option-value="code"
|
||||||
|
option-label="description"
|
||||||
|
:info="t('iptInfo')"
|
||||||
|
@update:model-value="searchFn()"
|
||||||
|
dense
|
||||||
|
outlined
|
||||||
|
rounded
|
||||||
|
>
|
||||||
|
</VnSelect>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
<QItem>
|
||||||
|
<QItemSection>
|
||||||
|
<VnSelect
|
||||||
|
:label="t('params.futureIpt')"
|
||||||
|
v-model="params.futureIpt"
|
||||||
|
:options="itemPackingTypes"
|
||||||
|
option-value="code"
|
||||||
|
option-label="description"
|
||||||
|
:info="t('iptInfo')"
|
||||||
|
@update:model-value="searchFn()"
|
||||||
|
dense
|
||||||
|
outlined
|
||||||
|
rounded
|
||||||
|
>
|
||||||
|
</VnSelect>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
<QItem>
|
||||||
|
<QItemSection>
|
||||||
|
<VnSelect
|
||||||
|
:label="t('params.state')"
|
||||||
|
v-model="params.state"
|
||||||
|
:options="stateOptions"
|
||||||
|
option-value="code"
|
||||||
|
option-label="name"
|
||||||
|
@update:model-value="searchFn()"
|
||||||
|
dense
|
||||||
|
outlined
|
||||||
|
rounded
|
||||||
|
>
|
||||||
|
</VnSelect>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
<QItem>
|
||||||
|
<QItemSection>
|
||||||
|
<VnSelect
|
||||||
|
:label="t('params.futureState')"
|
||||||
|
v-model="params.futureState"
|
||||||
|
:options="stateOptions"
|
||||||
|
option-value="code"
|
||||||
|
option-label="name"
|
||||||
|
@update:model-value="searchFn()"
|
||||||
|
dense
|
||||||
|
outlined
|
||||||
|
rounded
|
||||||
|
>
|
||||||
|
</VnSelect>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
|
||||||
|
<QItem>
|
||||||
|
<QItemSection>
|
||||||
|
<QCheckbox
|
||||||
|
:label="t('params.problems')"
|
||||||
|
v-model="params.problems"
|
||||||
|
:toggle-indeterminate="false"
|
||||||
|
@update:model-value="searchFn()"
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
<QItem>
|
||||||
|
<QItemSection>
|
||||||
|
<VnSelect
|
||||||
|
:label="t('params.warehouseFk')"
|
||||||
|
v-model="params.warehouseFk"
|
||||||
|
:options="warehousesOptions"
|
||||||
|
option-value="id"
|
||||||
|
option-label="name"
|
||||||
|
@update:model-value="searchFn()"
|
||||||
|
dense
|
||||||
|
outlined
|
||||||
|
rounded
|
||||||
|
>
|
||||||
|
</VnSelect>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
</template>
|
||||||
|
</VnFilterPanel>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<i18n>
|
||||||
|
en:
|
||||||
|
iptInfo: IPT
|
||||||
|
params:
|
||||||
|
originDated: Origin date
|
||||||
|
futureDated: Destination date
|
||||||
|
futureIpt: Destination IPT
|
||||||
|
ipt: Origin IPT
|
||||||
|
warehouseFk: Warehouse
|
||||||
|
litersMax: Max liters
|
||||||
|
linesMax: Max lines
|
||||||
|
state: Origin grouped state
|
||||||
|
futureState: Destination grouped state
|
||||||
|
problems: With problems
|
||||||
|
es:
|
||||||
|
Horizontal: Horizontal
|
||||||
|
Vertical: Vertical
|
||||||
|
iptInfo: Encajado
|
||||||
|
params:
|
||||||
|
originDated: Fecha origen
|
||||||
|
futureDated: Fecha destino
|
||||||
|
futureIpt: IPT destino
|
||||||
|
ipt: IPT Origen
|
||||||
|
warehouseFk: Almacén
|
||||||
|
litersMax: Litros máx.
|
||||||
|
linesMax: Líneas máx.
|
||||||
|
state: Estado agrupado origen
|
||||||
|
futureState: Estado agrupado destino
|
||||||
|
problems: Con problemas
|
||||||
|
</i18n>
|
|
@ -93,6 +93,11 @@ futureTickets:
|
||||||
moveTicketSuccess: Tickets moved successfully!
|
moveTicketSuccess: Tickets moved successfully!
|
||||||
searchInfo: Search future tickets by date
|
searchInfo: Search future tickets by date
|
||||||
futureTicket: Future tickets
|
futureTicket: Future tickets
|
||||||
|
FREE: Free
|
||||||
|
ON_PREVIOUS: ON_PREVIOUS
|
||||||
|
ON_PREPARATION: On preparation
|
||||||
|
PACKED: Packed
|
||||||
|
DELIVERED: Delivered
|
||||||
expedition:
|
expedition:
|
||||||
id: Expedition
|
id: Expedition
|
||||||
item: Item
|
item: Item
|
||||||
|
|
|
@ -140,6 +140,11 @@ futureTickets:
|
||||||
moveTicketSuccess: Tickets movidos correctamente
|
moveTicketSuccess: Tickets movidos correctamente
|
||||||
searchInfo: Buscar tickets por fecha
|
searchInfo: Buscar tickets por fecha
|
||||||
futureTicket: Tickets a futuro
|
futureTicket: Tickets a futuro
|
||||||
|
FREE: Libre
|
||||||
|
ON_PREVIOUS: ON_PREVIOUS
|
||||||
|
ON_PREPARATION: En preparación
|
||||||
|
PACKED: Encajado
|
||||||
|
DELIVERED: Servido
|
||||||
ticketSale:
|
ticketSale:
|
||||||
id: Id
|
id: Id
|
||||||
visible: Visible
|
visible: Visible
|
||||||
|
|
|
@ -10,6 +10,7 @@ import useCardDescription from 'src/composables/useCardDescription';
|
||||||
import { useState } from 'src/composables/useState';
|
import { useState } from 'src/composables/useState';
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import VnImg from 'src/components/ui/VnImg.vue';
|
import VnImg from 'src/components/ui/VnImg.vue';
|
||||||
|
import EditPictureForm from 'components/EditPictureForm.vue';
|
||||||
|
|
||||||
const $props = defineProps({
|
const $props = defineProps({
|
||||||
id: {
|
id: {
|
||||||
|
@ -18,6 +19,7 @@ const $props = defineProps({
|
||||||
default: null,
|
default: null,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
const image = ref(null);
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
@ -25,6 +27,10 @@ const state = useState();
|
||||||
const user = state.getUser();
|
const user = state.getUser();
|
||||||
const changePasswordFormDialog = ref(null);
|
const changePasswordFormDialog = ref(null);
|
||||||
const cardDescriptorRef = ref(null);
|
const cardDescriptorRef = ref(null);
|
||||||
|
const showEditPhotoForm = ref(false);
|
||||||
|
const toggleEditPictureForm = () => {
|
||||||
|
showEditPhotoForm.value = !showEditPhotoForm.value;
|
||||||
|
};
|
||||||
|
|
||||||
const entityId = computed(() => {
|
const entityId = computed(() => {
|
||||||
return $props.id || route.params.id;
|
return $props.id || route.params.id;
|
||||||
|
@ -99,7 +105,9 @@ const handleExcluded = async () => {
|
||||||
|
|
||||||
workerExcluded.value = !workerExcluded.value;
|
workerExcluded.value = !workerExcluded.value;
|
||||||
};
|
};
|
||||||
|
const handlePhotoUpdated = (evt = false) => {
|
||||||
|
image.value.reload(evt);
|
||||||
|
};
|
||||||
const refetch = async () => await cardDescriptorRef.value.getData();
|
const refetch = async () => await cardDescriptorRef.value.getData();
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
|
@ -144,7 +152,9 @@ const refetch = async () => await cardDescriptorRef.value.getData();
|
||||||
</QItem>
|
</QItem>
|
||||||
</template>
|
</template>
|
||||||
<template #before>
|
<template #before>
|
||||||
|
<div class="relative-position">
|
||||||
<VnImg
|
<VnImg
|
||||||
|
ref="image"
|
||||||
:id="parseInt(entityId)"
|
:id="parseInt(entityId)"
|
||||||
collection="user"
|
collection="user"
|
||||||
resolution="520x520"
|
resolution="520x520"
|
||||||
|
@ -155,7 +165,10 @@ const refetch = async () => await cardDescriptorRef.value.getData();
|
||||||
class="absolute-full picture text-center q-pa-md flex flex-center"
|
class="absolute-full picture text-center q-pa-md flex flex-center"
|
||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
<div class="text-grey-5" style="opacity: 0.4; font-size: 5vh">
|
<div
|
||||||
|
class="text-grey-5"
|
||||||
|
style="opacity: 0.4; font-size: 5vh"
|
||||||
|
>
|
||||||
<QIcon name="vn:claims" />
|
<QIcon name="vn:claims" />
|
||||||
</div>
|
</div>
|
||||||
<div class="text-grey-5" style="opacity: 0.4">
|
<div class="text-grey-5" style="opacity: 0.4">
|
||||||
|
@ -163,8 +176,25 @@ const refetch = async () => await cardDescriptorRef.value.getData();
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template> </VnImg
|
||||||
</VnImg>
|
><QBtn
|
||||||
|
color="primary"
|
||||||
|
size="lg"
|
||||||
|
round
|
||||||
|
class="edit-photo-btn"
|
||||||
|
@click="toggleEditPictureForm()"
|
||||||
|
>
|
||||||
|
<QIcon name="edit" size="sm" />
|
||||||
|
<QDialog ref="editPhotoFormDialog" v-model="showEditPhotoForm">
|
||||||
|
<EditPictureForm
|
||||||
|
collection="user"
|
||||||
|
:id="entityId"
|
||||||
|
@close-form="toggleEditPictureForm()"
|
||||||
|
@on-photo-uploaded="handlePhotoUpdated"
|
||||||
|
/>
|
||||||
|
</QDialog>
|
||||||
|
</QBtn>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #body="{ entity }">
|
<template #body="{ entity }">
|
||||||
<VnLv :label="t('worker.card.name')" :value="entity.user?.nickname" />
|
<VnLv :label="t('worker.card.name')" :value="entity.user?.nickname" />
|
||||||
|
|
|
@ -19,6 +19,7 @@ export const useInvoiceOutGlobalStore = defineStore({
|
||||||
maxShipped: null,
|
maxShipped: null,
|
||||||
clientId: null,
|
clientId: null,
|
||||||
printer: null,
|
printer: null,
|
||||||
|
serialType: null,
|
||||||
},
|
},
|
||||||
addresses: [],
|
addresses: [],
|
||||||
minInvoicingDate: null,
|
minInvoicingDate: null,
|
||||||
|
@ -100,6 +101,7 @@ export const useInvoiceOutGlobalStore = defineStore({
|
||||||
maxShipped: new Date(formData.maxShipped),
|
maxShipped: new Date(formData.maxShipped),
|
||||||
clientId: formData.clientId ? formData.clientId : null,
|
clientId: formData.clientId ? formData.clientId : null,
|
||||||
companyFk: formData.companyFk,
|
companyFk: formData.companyFk,
|
||||||
|
serialType: formData.serialType,
|
||||||
};
|
};
|
||||||
|
|
||||||
this.validateMakeInvoceParams(params, clientsToInvoice);
|
this.validateMakeInvoceParams(params, clientsToInvoice);
|
||||||
|
@ -152,7 +154,13 @@ export const useInvoiceOutGlobalStore = defineStore({
|
||||||
);
|
);
|
||||||
throw new Error('Invoice date in the future');
|
throw new Error('Invoice date in the future');
|
||||||
}
|
}
|
||||||
|
if (!params.serialType) {
|
||||||
|
notify(
|
||||||
|
'invoiceOut.globalInvoices.errors.chooseValidSerialType',
|
||||||
|
'negative'
|
||||||
|
);
|
||||||
|
throw new Error('Invalid Serial Type');
|
||||||
|
}
|
||||||
if (!params.companyFk) {
|
if (!params.companyFk) {
|
||||||
notify('invoiceOut.globalInvoices.errors.chooseValidCompany', 'negative');
|
notify('invoiceOut.globalInvoices.errors.chooseValidCompany', 'negative');
|
||||||
throw new Error('Invalid company');
|
throw new Error('Invalid company');
|
||||||
|
@ -180,6 +188,7 @@ export const useInvoiceOutGlobalStore = defineStore({
|
||||||
invoiceDate: new Date(formData.invoiceDate),
|
invoiceDate: new Date(formData.invoiceDate),
|
||||||
maxShipped: new Date(formData.maxShipped),
|
maxShipped: new Date(formData.maxShipped),
|
||||||
companyFk: formData.companyFk,
|
companyFk: formData.companyFk,
|
||||||
|
serialType: formData.serialType,
|
||||||
};
|
};
|
||||||
|
|
||||||
this.status = 'invoicing';
|
this.status = 'invoicing';
|
||||||
|
@ -191,12 +200,7 @@ export const useInvoiceOutGlobalStore = defineStore({
|
||||||
this.addressIndex++;
|
this.addressIndex++;
|
||||||
this.isInvoicing = false;
|
this.isInvoicing = false;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (
|
if (err?.response?.status >= 400 && err?.response?.status < 500) {
|
||||||
err &&
|
|
||||||
err.response &&
|
|
||||||
err.response.status >= 400 &&
|
|
||||||
err.response.status < 500
|
|
||||||
) {
|
|
||||||
this.invoiceClientError(address, err.response?.data?.error?.message);
|
this.invoiceClientError(address, err.response?.data?.error?.message);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
|
@ -243,7 +247,7 @@ export const useInvoiceOutGlobalStore = defineStore({
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (data.data && data.data.error) throw new Error();
|
if (data?.data?.error) throw new Error();
|
||||||
|
|
||||||
const status = exportFile('negativeBases.csv', data, {
|
const status = exportFile('negativeBases.csv', data, {
|
||||||
encoding: 'windows-1252',
|
encoding: 'windows-1252',
|
||||||
|
|
Loading…
Reference in New Issue