diff --git a/src/lang/es.js b/src/lang/es.js index d725e62..7964d4a 100644 --- a/src/lang/es.js +++ b/src/lang/es.js @@ -86,6 +86,9 @@ export default { light: 'Tema claro' } }, + approve: 'Aprobar', + assigned_budget: 'Presupuesto asignado', + available_budget: 'Presupuesto disponible', assistances: { create: { title: 'Generar asistencia', @@ -137,6 +140,7 @@ export default { certification_type: 'Tipo de certificación', clear: 'Limpiar', close:"Cerrar", + company: 'Empresa', confirm:'Confirmar', copyright:'Todos los derechos reservados.', contact:'Contacto', @@ -250,6 +254,18 @@ export default { passwordCurrent:'Contraseña actual', passwordReset:'Restaurar contraseña', paternal:'Apellido paterno', + petty_cash: { + title: 'Caja Chica', + description: 'Gestión de caja chica para gastos menores' + }, + pettyCashes: { + create: { + description: 'Crea una nueva caja chica para gestión de gastos menores' + }, + edit: { + description: 'Modifica los datos de la caja chica seleccionada' + } + }, phone:'Teléfono', photo: { new: 'Seleccionar una nueva foto', diff --git a/src/layouts/AdminLayout.vue b/src/layouts/AdminLayout.vue index e51cecf..c062acd 100644 --- a/src/layouts/AdminLayout.vue +++ b/src/layouts/AdminLayout.vue @@ -97,10 +97,15 @@ onMounted(() => { to="admin.events.index" :collapsed="true" > + +import { ref, computed, onMounted } from 'vue'; +import { useRouter } from 'vue-router'; +import { api, useForm } from '@Services/Api'; +import { apiTo, viewTo } from './Module'; + +import GoogleIcon from '@Shared/GoogleIcon.vue'; +import PageHeader from '@Holos/PageHeader.vue'; +import IconButton from '@Holos/Button/Icon.vue'; +import Input from '@Holos/Form/Input.vue'; +import Selectable from '@Holos/Form/Selectable.vue'; +import PrimaryButton from '@Holos/Button/Primary.vue'; + +/** Definiciones */ +const router = useRouter(); + +/** Propiedades */ +const form = useForm({ + petty_cash_id: '', + budget_items: [ + { + id: 1, + concept: '', + amount: '' + } + ] +}); + +const pettyCashes = ref([]); +let nextId = 2; + +// Computed para calcular el total +const totalBudget = computed(() => { + return form.budget_items.reduce((total, item) => { + return total + (parseFloat(item.amount) || 0); + }, 0); +}); + +// Función para agregar nueva fila +const addBudgetItem = () => { + form.budget_items.push({ + id: nextId++, + concept: '', + amount: 0 + }); +}; + +// Función para eliminar fila +const removeBudgetItem = (id) => { + if (form.budget_items.length > 1) { + form.budget_items = form.budget_items.filter(item => item.id !== id); + } +}; + +// Función para guardar presupuesto +function submit() { + // Filtrar elementos vacíos + const validItems = form.budget_items.filter(item => + item.concept.trim() !== '' && item.amount > 0 + ); + + if (validItems.length === 0) { + Notify.error('Por favor, agrega al menos un elemento al presupuesto'); + return; + } + + form.transform(data => ({ + ...data, + petty_cash_id: form.petty_cash_id?.id, + budget_items: validItems + })).post(apiTo('store-budget', { pettyCash: form.petty_cash_id }), { + onSuccess: () => { + Notify.success('Presupuesto guardado correctamente'); + router.push(viewTo({ name: 'index' })); + } + }); +} + + +/** Ciclos */ +onMounted(() => { + api.catalog({ + 'pettyCash:all': null + }, { + onSuccess: (r) => pettyCashes.value = r['pettyCash:all'] ?? [] + }); +}); + + + diff --git a/src/pages/Admin/Events/PettyCashes/Create.vue b/src/pages/Admin/Events/PettyCashes/Create.vue new file mode 100644 index 0000000..a441dfa --- /dev/null +++ b/src/pages/Admin/Events/PettyCashes/Create.vue @@ -0,0 +1,65 @@ + + + \ No newline at end of file diff --git a/src/pages/Admin/Events/PettyCashes/Edit.vue b/src/pages/Admin/Events/PettyCashes/Edit.vue new file mode 100644 index 0000000..633d2c1 --- /dev/null +++ b/src/pages/Admin/Events/PettyCashes/Edit.vue @@ -0,0 +1,73 @@ + + + diff --git a/src/pages/Admin/Events/PettyCashes/Form.vue b/src/pages/Admin/Events/PettyCashes/Form.vue new file mode 100644 index 0000000..38320d5 --- /dev/null +++ b/src/pages/Admin/Events/PettyCashes/Form.vue @@ -0,0 +1,74 @@ + + +