feat: implementar jornadas y validar aliases
This commit is contained in:
88
apps/toldo-app/src/views/Jornada.vue
Normal file
88
apps/toldo-app/src/views/Jornada.vue
Normal file
@@ -0,0 +1,88 @@
|
||||
<template>
|
||||
<div>
|
||||
<h1 class="text-h4 mb-4">Jornada del Toldo (Apertura/Cierre)</h1>
|
||||
|
||||
<v-alert v-if="jornadaAbierta" type="success" class="mb-4">
|
||||
Jornada ABIERTA desde {{ formatFecha(jornadaAbierta.fechaApertura) }} | Responsables: {{ (jornadaAbierta.responsables||[]).join(', ') }} | Base inicial: ${{ jornadaAbierta.baseInicial }}
|
||||
</v-alert>
|
||||
<v-alert v-else type="info" class="mb-4">No hay jornada abierta</v-alert>
|
||||
|
||||
<v-row>
|
||||
<v-col cols="12" md="6">
|
||||
<v-card>
|
||||
<v-card-title>Apertura de Jornada</v-card-title>
|
||||
<v-card-text>
|
||||
<v-text-field v-model="responsablesStr" label="Responsables (separados por coma)" placeholder="Ana, Luis"></v-text-field>
|
||||
<v-text-field v-model.number="baseInicial" type="number" label="Base inicial (efectivo)" class="mt-2"></v-text-field>
|
||||
<v-btn @click="abrir" color="primary" block class="mt-2" :disabled="!!jornadaAbierta">Abrir Jornada</v-btn>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-col>
|
||||
|
||||
<v-col cols="12" md="6">
|
||||
<v-card>
|
||||
<v-card-title>Cierre de Jornada</v-card-title>
|
||||
<v-card-text>
|
||||
<div v-if="resumen">
|
||||
<div class="mb-2">Ventas: ${{ resumen.totalVentas }}</div>
|
||||
<div class="mb-2">Gastos: ${{ resumen.totalGastos }}</div>
|
||||
<div class="mb-2 font-weight-bold">Saldo esperado: ${{ jornadaAbierta ? jornadaAbierta.baseInicial + resumen.totalVentas - resumen.totalGastos : 0 }}</div>
|
||||
</div>
|
||||
<v-btn @click="cerrar" color="error" block class="mt-2" :disabled="!jornadaAbierta">Cerrar Jornada (generar cuadre)</v-btn>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted } from 'vue';
|
||||
import { JornadaService } from '@toldo/services';
|
||||
|
||||
const service = new JornadaService();
|
||||
const jornadaAbierta = ref<any>(null);
|
||||
const responsablesStr = ref('');
|
||||
const baseInicial = ref(0);
|
||||
const resumen = ref<any>(null);
|
||||
|
||||
function formatFecha(d: any) {
|
||||
try { return new Date(d).toLocaleString(); } catch { return d; }
|
||||
}
|
||||
|
||||
async function cargar() {
|
||||
jornadaAbierta.value = await service.getJornadaAbierta();
|
||||
if (jornadaAbierta.value) {
|
||||
resumen.value = await service.getResumenJornada(jornadaAbierta.value.id);
|
||||
} else {
|
||||
resumen.value = null;
|
||||
}
|
||||
}
|
||||
|
||||
async function abrir() {
|
||||
if (!responsablesStr.value.trim()) return alert('Ingrese responsables');
|
||||
const responsables = responsablesStr.value.split(',').map(r => r.trim()).filter(r => r);
|
||||
try {
|
||||
await service.abrirJornada(responsables, Number(baseInicial.value) || 0);
|
||||
responsablesStr.value = '';
|
||||
baseInicial.value = 0;
|
||||
await cargar();
|
||||
alert('Jornada abierta');
|
||||
} catch (e: any) {
|
||||
alert(e.message);
|
||||
}
|
||||
}
|
||||
|
||||
async function cerrar() {
|
||||
if (!jornadaAbierta.value) return;
|
||||
try {
|
||||
const cid = await service.cerrarJornada(jornadaAbierta.value.id);
|
||||
await cargar();
|
||||
alert(`Jornada cerrada. Cuadre: ${cid}`);
|
||||
} catch (e: any) {
|
||||
alert(e.message);
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(cargar);
|
||||
</script>
|
||||
Reference in New Issue
Block a user