forked from verdnatura/salix-front
Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix-front into 7731-clientViesCode
This commit is contained in:
commit
6d0e99faa3
|
@ -134,6 +134,7 @@ const splittedColumns = ref({ columns: [] });
|
|||
const columnsVisibilitySkipped = ref();
|
||||
const createForm = ref();
|
||||
const tableFilterRef = ref([]);
|
||||
const tableRef = ref();
|
||||
|
||||
const tableModes = [
|
||||
{
|
||||
|
@ -321,6 +322,13 @@ function handleOnDataSaved(_) {
|
|||
if (_.onDataSaved) _.onDataSaved({ CrudModelRef: CrudModelRef.value });
|
||||
else $props.create.onDataSaved(_);
|
||||
}
|
||||
|
||||
function handleScroll() {
|
||||
const tMiddle = tableRef.value.$el.querySelector('.q-table__middle');
|
||||
const { scrollHeight, scrollTop, clientHeight } = tMiddle;
|
||||
const isAtBottom = Math.abs(scrollHeight - scrollTop - clientHeight) <= 40;
|
||||
if (isAtBottom) CrudModelRef.value.vnPaginateRef.paginate();
|
||||
}
|
||||
</script>
|
||||
<template>
|
||||
<QDrawer
|
||||
|
@ -405,6 +413,7 @@ function handleOnDataSaved(_) {
|
|||
</template>
|
||||
<template #body="{ rows }">
|
||||
<QTable
|
||||
ref="tableRef"
|
||||
v-bind="table"
|
||||
class="vnTable"
|
||||
:columns="splittedColumns.columns"
|
||||
|
@ -416,12 +425,7 @@ function handleOnDataSaved(_) {
|
|||
flat
|
||||
:style="isTableMode && `max-height: ${tableHeight}`"
|
||||
:virtual-scroll="isTableMode"
|
||||
@virtual-scroll="
|
||||
(event) =>
|
||||
event.index > rows.length - 2 &&
|
||||
($props.crudModel?.paginate ?? true) &&
|
||||
CrudModelRef.vnPaginateRef.paginate()
|
||||
"
|
||||
@virtual-scroll="handleScroll"
|
||||
@row-click="(_, row) => rowClickFunction && rowClickFunction(row)"
|
||||
@update:selected="emit('update:selected', $event)"
|
||||
>
|
||||
|
|
|
@ -277,6 +277,7 @@ globals:
|
|||
medical: Mutual
|
||||
RouteExtendedList: Router
|
||||
wasteRecalc: Waste recaclulate
|
||||
operator: Operator
|
||||
supplier: Supplier
|
||||
created: Created
|
||||
worker: Worker
|
||||
|
@ -743,6 +744,7 @@ worker:
|
|||
locker: Locker
|
||||
balance: Balance
|
||||
medical: Medical
|
||||
operator: Operator
|
||||
list:
|
||||
name: Name
|
||||
email: Email
|
||||
|
@ -840,6 +842,18 @@ worker:
|
|||
debit: Debt
|
||||
credit: Have
|
||||
concept: Concept
|
||||
operator:
|
||||
numberOfWagons: Number of wagons
|
||||
train: Train
|
||||
itemPackingType: Item packing type
|
||||
warehouse: Warehouse
|
||||
sector: Sector
|
||||
labeler: Printer
|
||||
linesLimit: Lines limit
|
||||
volumeLimit: Volume limit
|
||||
sizeLimit: Size limit
|
||||
isOnReservationMode: Reservation mode
|
||||
machine: Machine
|
||||
wagon:
|
||||
pageTitles:
|
||||
wagons: Wagons
|
||||
|
|
|
@ -281,6 +281,7 @@ globals:
|
|||
serial: Facturas por serie
|
||||
medical: Mutua
|
||||
wasteRecalc: Recalcular mermas
|
||||
operator: Operario
|
||||
supplier: Proveedor
|
||||
created: Fecha creación
|
||||
worker: Trabajador
|
||||
|
@ -750,6 +751,7 @@ worker:
|
|||
balance: Balance
|
||||
formation: Formación
|
||||
medical: Mutua
|
||||
operator: Operario
|
||||
list:
|
||||
name: Nombre
|
||||
email: Email
|
||||
|
@ -838,6 +840,19 @@ worker:
|
|||
debit: Debe
|
||||
credit: Haber
|
||||
concept: Concepto
|
||||
operator:
|
||||
numberOfWagons: Número de vagones
|
||||
train: tren
|
||||
itemPackingType: Tipo de embalaje
|
||||
warehouse: Almacén
|
||||
sector: Sector
|
||||
labeler: Impresora
|
||||
linesLimit: Líneas límite
|
||||
volumeLimit: Volumen límite
|
||||
sizeLimit: Tamaño límite
|
||||
isOnReservationMode: Modo de reserva
|
||||
machine: Máquina
|
||||
|
||||
wagon:
|
||||
pageTitles:
|
||||
wagons: Vagones
|
||||
|
|
|
@ -6,7 +6,7 @@ import { useRoute, useRouter } from 'vue-router';
|
|||
import { date } from 'quasar';
|
||||
import { toDateFormat } from 'src/filters/date.js';
|
||||
|
||||
import { toCurrency } from 'src/filters';
|
||||
import { dashIfEmpty, toCurrency } from 'src/filters';
|
||||
|
||||
import { useSummaryDialog } from 'src/composables/useSummaryDialog';
|
||||
import TicketSummary from 'src/pages/Ticket/Card/TicketSummary.vue';
|
||||
|
@ -32,6 +32,16 @@ const filter = {
|
|||
},
|
||||
{ relation: 'invoiceOut', scope: { fields: ['id'] } },
|
||||
{ relation: 'agencyMode', scope: { fields: ['name'] } },
|
||||
{
|
||||
relation: 'ticketSales',
|
||||
scope: {
|
||||
fields: ['id', 'concept', 'itemFk'],
|
||||
include: { relation: 'item' },
|
||||
scope: {
|
||||
fields: ['id', 'name', 'itemPackingTypeFk'],
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
where: { clientFk: route.params.id },
|
||||
order: ['shipped DESC', 'id'],
|
||||
|
@ -87,7 +97,12 @@ const columns = computed(() => [
|
|||
label: t('Total'),
|
||||
name: 'total',
|
||||
},
|
||||
|
||||
{
|
||||
align: 'left',
|
||||
name: 'itemPackingTypeFk',
|
||||
label: t('ticketSale.packaging'),
|
||||
format: (row) => getItemPackagingType(row),
|
||||
},
|
||||
{
|
||||
align: 'right',
|
||||
label: '',
|
||||
|
@ -135,6 +150,15 @@ const setShippedColor = (date) => {
|
|||
if (difference == 0) return 'warning';
|
||||
if (difference < 0) return 'success';
|
||||
};
|
||||
|
||||
const getItemPackagingType = (row) => {
|
||||
const packagingType = row?.ticketSales
|
||||
.map((sale) => sale.item?.itemPackingTypeFk || '-')
|
||||
.filter((value) => value !== '-')
|
||||
.join(', ');
|
||||
|
||||
return dashIfEmpty(packagingType);
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
|
@ -95,6 +95,7 @@ const columns = computed(() => [
|
|||
columnField: {
|
||||
component: null,
|
||||
},
|
||||
columnClass: 'expand',
|
||||
format: (row, dashIfEmpty) => dashIfEmpty(row.salesPerson),
|
||||
},
|
||||
{
|
||||
|
@ -153,11 +154,6 @@ const columns = computed(() => [
|
|||
},
|
||||
columnClass: 'expand',
|
||||
},
|
||||
{
|
||||
align: 'left',
|
||||
name: 'refFk',
|
||||
label: t('ticketList.ref'),
|
||||
},
|
||||
{
|
||||
align: 'left',
|
||||
name: 'zoneFk',
|
||||
|
@ -191,6 +187,12 @@ const columns = computed(() => [
|
|||
},
|
||||
format: (row) => toCurrency(row.totalWithVat),
|
||||
},
|
||||
{
|
||||
align: 'left',
|
||||
name: 'packing',
|
||||
label: t('ticketSale.packaging'),
|
||||
format: (row, dashIfEmpty) => dashIfEmpty(row.packing),
|
||||
},
|
||||
{
|
||||
align: 'right',
|
||||
name: 'tableActions',
|
||||
|
@ -548,7 +550,7 @@ function setReference(data) {
|
|||
</template>
|
||||
<template #column-salesPersonFk="{ row }">
|
||||
<span class="link" @click.stop>
|
||||
{{ row.salesPerson }}
|
||||
{{ dashIfEmpty(row.salesPerson) }}
|
||||
<CustomerDescriptorProxy :id="row.salesPersonFk" />
|
||||
</span>
|
||||
</template>
|
||||
|
@ -577,16 +579,16 @@ function setReference(data) {
|
|||
{{ row.state }}
|
||||
</QChip>
|
||||
</span>
|
||||
<span v-else-if="row.state === 'Entregado'">
|
||||
<span class="link" @click.stop>
|
||||
{{ row.refFk }}
|
||||
<InvoiceOutDescriptorProxy :id="row.invoiceOutId" />
|
||||
</span>
|
||||
</span>
|
||||
<span v-else>
|
||||
{{ row.state }}
|
||||
</span>
|
||||
</template>
|
||||
<template #column-refFk="{ row }">
|
||||
<span class="link" @click.stop>
|
||||
{{ dashIfEmpty(row.refFk) }}
|
||||
<InvoiceOutDescriptorProxy :id="row.invoiceOutId" />
|
||||
</span>
|
||||
</template>
|
||||
<template #column-zoneFk="{ row }">
|
||||
<span class="link" @click.stop>
|
||||
{{ dashIfEmpty(row.zoneName) }}
|
||||
|
|
|
@ -0,0 +1,204 @@
|
|||
<script setup>
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useRoute } from 'vue-router';
|
||||
import { ref, computed } from 'vue';
|
||||
import FetchData from 'components/FetchData.vue';
|
||||
import VnRow from 'components/ui/VnRow.vue';
|
||||
import VnSelect from 'src/components/common/VnSelect.vue';
|
||||
import VnInput from 'src/components/common/VnInput.vue';
|
||||
import CrudModel from 'components/CrudModel.vue';
|
||||
import axios from 'axios';
|
||||
|
||||
const { t } = useI18n();
|
||||
|
||||
const crudModelRef = ref();
|
||||
const warehousesData = ref([]);
|
||||
const itemPackingTypesData = ref([]);
|
||||
const sectorsData = ref([]);
|
||||
const trainsData = ref([]);
|
||||
const machinesData = ref([]);
|
||||
const route = useRoute();
|
||||
const routeId = computed(() => route.params.id);
|
||||
|
||||
const initialData = computed(() => {
|
||||
return {
|
||||
workerFk: routeId.value,
|
||||
numberOfWagons: 2,
|
||||
trainFk: 1,
|
||||
itemPackingTypeFk: 'H',
|
||||
warehouseFk: 60,
|
||||
sectorFk: null,
|
||||
labelerFk: null,
|
||||
linesLimit: 20,
|
||||
volumenLimit: 0.5,
|
||||
sizeLimit: null,
|
||||
isOnReservationMode: 0,
|
||||
machineFk: null,
|
||||
};
|
||||
});
|
||||
|
||||
async function insert() {
|
||||
await axios.post('Operators', initialData.value);
|
||||
crudModelRef.value.reload();
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<QPage class="column items-center q-pa-md centerCard">
|
||||
<FetchData url="Trains" @on-fetch="(data) => (trainsData = data)" auto-load />
|
||||
<FetchData
|
||||
url="ItemPackingTypes"
|
||||
@on-fetch="(data) => (itemPackingTypesData = data)"
|
||||
auto-load
|
||||
/>
|
||||
<FetchData
|
||||
url="Warehouses"
|
||||
@on-fetch="(data) => (warehousesData = data)"
|
||||
auto-load
|
||||
/>
|
||||
<FetchData url="Printers" @on-fetch="(data) => (PrintersData = data)" auto-load />
|
||||
<FetchData url="Sectors" @on-fetch="(data) => (sectorsData = data)" auto-load />
|
||||
<FetchData url="Machines" @on-fetch="(data) => (machinesData = data)" auto-load />
|
||||
<CrudModel
|
||||
data-key="workerOperator"
|
||||
url="Operators"
|
||||
primary-key="workerFk"
|
||||
:filter="{ where: { workerFk: route.params.id } }"
|
||||
:data-required="{ workerFk: route.params.id }"
|
||||
ref="crudModelRef"
|
||||
search-url="operator"
|
||||
auto-load
|
||||
>
|
||||
<template #body="{ rows }">
|
||||
<div v-if="rows.length">
|
||||
<QCard
|
||||
flat
|
||||
bordered
|
||||
:key="row.$index"
|
||||
v-for="row of rows"
|
||||
class="card q-px-md q-mb-sm container"
|
||||
>
|
||||
<VnRow>
|
||||
<VnInput
|
||||
:label="t('worker.operator.numberOfWagons')"
|
||||
v-model="row.numberOfWagons"
|
||||
/>
|
||||
<VnSelect
|
||||
:label="t('worker.operator.train')"
|
||||
:options="trainsData"
|
||||
hide-selected
|
||||
v-model="row.trainFk"
|
||||
/>
|
||||
</VnRow>
|
||||
<VnRow>
|
||||
<VnSelect
|
||||
:label="t('worker.operator.itemPackingType')"
|
||||
:options="itemPackingTypesData"
|
||||
hide-selected
|
||||
option-label="code"
|
||||
option-value="code"
|
||||
v-model="row.itemPackingTypeFk"
|
||||
/>
|
||||
<VnSelect
|
||||
:label="t('worker.operator.warehouse')"
|
||||
:options="warehousesData"
|
||||
hide-selected
|
||||
v-model="row.warehouseFk"
|
||||
/>
|
||||
</VnRow>
|
||||
<VnRow>
|
||||
<VnSelect
|
||||
:label="t('worker.operator.sector')"
|
||||
:options="sectorsData"
|
||||
hide-selected
|
||||
option-label="description"
|
||||
v-model="row.sectorFk"
|
||||
/>
|
||||
<VnSelect
|
||||
:label="t('worker.operator.labeler')"
|
||||
:options="PrintersData"
|
||||
hide-selected
|
||||
option-label="name"
|
||||
v-model="row.labelerFk"
|
||||
>
|
||||
<template #option="scope">
|
||||
<QItem v-bind="scope.itemProps">
|
||||
<QItemSection>
|
||||
<QItemLabel
|
||||
>ID: {{ scope.opt?.id }}</QItemLabel
|
||||
>
|
||||
<QItemLabel caption>
|
||||
{{ scope.opt?.id }},
|
||||
{{ scope.opt?.name }}
|
||||
</QItemLabel>
|
||||
</QItemSection>
|
||||
</QItem>
|
||||
</template>
|
||||
</VnSelect>
|
||||
</VnRow>
|
||||
<VnRow>
|
||||
<VnInput
|
||||
:label="t('worker.operator.linesLimit')"
|
||||
v-model="row.linesLimit"
|
||||
lazy-rules
|
||||
/>
|
||||
<VnInput
|
||||
:label="t('worker.operator.volumeLimit')"
|
||||
v-model="row.volumeLimit"
|
||||
lazy-rules
|
||||
/>
|
||||
</VnRow>
|
||||
<VnRow>
|
||||
<VnInput
|
||||
:label="t('worker.operator.sizeLimit')"
|
||||
v-model="row.sizeLimit"
|
||||
lazy-rules
|
||||
/>
|
||||
<VnInput
|
||||
:label="t('worker.operator.isOnReservationMode')"
|
||||
v-model="row.isOnReservationMode"
|
||||
lazy-rules
|
||||
/>
|
||||
</VnRow>
|
||||
<VnRow>
|
||||
<VnSelect
|
||||
:label="t('worker.operator.machine')"
|
||||
:options="machinesData"
|
||||
hide-selected
|
||||
option-label="plate"
|
||||
v-model="row.machineFk"
|
||||
/>
|
||||
</VnRow>
|
||||
</QCard>
|
||||
</div>
|
||||
</template>
|
||||
</CrudModel>
|
||||
<QPageSticky position="bottom-right" :offset="[25, 25]">
|
||||
<QBtn
|
||||
fab
|
||||
color="primary"
|
||||
icon="add"
|
||||
@click="insert()"
|
||||
v-if="!crudModelRef?.formData?.length"
|
||||
/>
|
||||
</QPageSticky>
|
||||
</QPage>
|
||||
</template>
|
||||
<style lang="scss" scoped>
|
||||
.btn-delete {
|
||||
max-width: 4%;
|
||||
margin-top: 30px;
|
||||
}
|
||||
</style>
|
||||
<i18n>
|
||||
es:
|
||||
Model: Modelo
|
||||
Serial number: Número de serie
|
||||
Current SIM: SIM actual
|
||||
Add new device: Añadir nuevo dispositivo
|
||||
PDA deallocated: PDA desasignada
|
||||
Remove PDA: Eliminar PDA
|
||||
Do you want to remove this PDA?: ¿Desea eliminar este PDA?
|
||||
You can only have one PDA: Solo puedes tener un PDA si no eres autonomo
|
||||
This PDA is already assigned to another user: Este PDA ya está asignado a otro usuario
|
||||
</i18n>
|
|
@ -27,6 +27,7 @@ export default {
|
|||
'WorkerBalance',
|
||||
'WorkerFormation',
|
||||
'WorkerMedical',
|
||||
'WorkerOperator',
|
||||
],
|
||||
},
|
||||
children: [
|
||||
|
@ -208,6 +209,15 @@ export default {
|
|||
},
|
||||
component: () => import('src/pages/Worker/Card/WorkerMedical.vue'),
|
||||
},
|
||||
{
|
||||
name: 'WorkerOperator',
|
||||
path: 'operator',
|
||||
meta: {
|
||||
title: 'operator',
|
||||
icon: 'person',
|
||||
},
|
||||
component: () => import('src/pages/Worker/Card/WorkerOperator.vue'),
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
|
|
Loading…
Reference in New Issue