diff --git a/src/lang/es.js b/src/lang/es.js
index 564e75b..2452096 100644
--- a/src/lang/es.js
+++ b/src/lang/es.js
@@ -460,6 +460,7 @@ export default {
sales: 'Ventas',
returns: 'Devoluciones',
clients: 'Clientes',
+ suppliers: 'Proveedores',
clientTiers: 'Niveles de Clientes',
billingRequests: 'Solicitudes de Facturación',
warehouses: 'Almacenes',
@@ -581,5 +582,9 @@ export default {
movements: {
title: 'Movimientos de Inventario',
description: 'Historial de entradas, salidas y traspasos de productos',
- }
+ },
+ suppliers: {
+ title: 'Proveedores',
+ description: 'Gestión de proveedores',
+ },
}
\ No newline at end of file
diff --git a/src/layouts/AppLayout.vue b/src/layouts/AppLayout.vue
index 7cd412d..c616458 100644
--- a/src/layouts/AppLayout.vue
+++ b/src/layouts/AppLayout.vue
@@ -58,6 +58,11 @@ onMounted(() => {
name="pos.clients"
to="pos.clients.index"
/>
+
form.track_serials, () => {
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/POS/Movements/EntryModal.vue b/src/pages/POS/Movements/EntryModal.vue
index aec1833..0c2a260 100644
--- a/src/pages/POS/Movements/EntryModal.vue
+++ b/src/pages/POS/Movements/EntryModal.vue
@@ -19,6 +19,7 @@ const props = defineProps({
/** Estado */
const products = ref([]);
const warehouses = ref([]);
+const suppliers = ref([]);
const loading = ref(false);
const selectedProducts = ref([]);
@@ -36,6 +37,7 @@ const api = useApi();
/** Formulario */
const form = useForm({
warehouse_id: '',
+ supplier_id: null,
invoice_reference: '',
notes: '',
products: []
@@ -74,6 +76,11 @@ const loadData = () => {
}
}
}),
+ api.get(apiURL('proveedores'), {
+ onSuccess: (data) => {
+ suppliers.value = data.suppliers?.data || data.data || [];
+ }
+ }),
api.get(apiURL('inventario'), {
onSuccess: (data) => {
products.value = data.products?.data || data.data || [];
@@ -331,6 +338,22 @@ watch(() => form.warehouse_id, (newWarehouseId, oldWarehouseId) => {
+
diff --git a/src/pages/POS/Movements/Index.vue b/src/pages/POS/Movements/Index.vue
index ec4f58e..edaf6d9 100644
--- a/src/pages/POS/Movements/Index.vue
+++ b/src/pages/POS/Movements/Index.vue
@@ -100,13 +100,11 @@ const movementTypes = [
const getTypeBadge = (type) => {
const badges = {
- entry: { label: 'Entrada', class: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300' },
- exit: { label: 'Salida', class: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300' },
- transfer: { label: 'Traspaso', class: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300' },
-/* sale: { label: 'Venta', class: 'bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300' },
- return: { label: 'Devolución', class: 'bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-300' }, */
+ entry: { label: 'Entrada', icon: 'add_circle', class: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300' },
+ exit: { label: 'Salida', icon: 'remove_circle', class: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300' },
+ transfer: { label: 'Traspaso', icon: 'swap_horiz', class: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300' },
};
- return badges[type] || { label: type, class: 'bg-gray-100 text-gray-800' };
+ return badges[type] || { label: type, icon: 'help_outline', class: 'bg-gray-100 text-gray-800' };
};
/** Searcher */
@@ -295,6 +293,7 @@ onMounted(() => {
| PRODUCTO |
TIPO |
+ PROVEEDOR |
CANTIDAD |
ORIGEN |
DESTINO |
@@ -328,10 +327,22 @@ onMounted(() => {
-
+
+
{{ getTypeBadge(movement.movement_type).label }}
|
+
+
+ {{ movement.supplier.business_name }}
+
+ —
+ |
@@ -357,7 +368,7 @@ onMounted(() => {
- |
+ |
+import { useForm, apiURL } from '@Services/Api';
+
+import Modal from '@Holos/Modal.vue';
+import FormInput from '@Holos/Form/Input.vue';
+import FormError from '@Holos/Form/Elements/Error.vue';
+
+/** Eventos */
+const emit = defineEmits(['close', 'created']);
+
+/** Propiedades */
+const props = defineProps({
+ show: Boolean
+});
+
+/** Formulario */
+const form = useForm({
+ business_name: '',
+ rfc: '',
+ email: '',
+ phone: '',
+ address: '',
+ postal_code: '',
+ notes: ''
+});
+
+/** Métodos */
+const createSupplier = () => {
+ form.post(apiURL('proveedores'), {
+ onSuccess: () => {
+ window.Notify.success('Proveedor creado exitosamente');
+ emit('created');
+ closeModal();
+ },
+ onError: () => {
+ window.Notify.error('Error al crear el proveedor');
+ }
+ });
+};
+
+const closeModal = () => {
+ form.reset();
+ emit('close');
+};
+
+
+
+
+
+
+
+
+
+ Crear Proveedor
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/POS/Suppliers/Delete.vue b/src/pages/POS/Suppliers/Delete.vue
new file mode 100644
index 0000000..205f542
--- /dev/null
+++ b/src/pages/POS/Suppliers/Delete.vue
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Eliminar Cliente
+
+
+
+
+
+
+
+
+ ¿Estás seguro de que deseas eliminar este cliente?
+
+
+
+
+
+
+ {{ client.name }}
+
+
+
+
+
+
+
+
+ Esta acción es permanente y no se puede deshacer.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/POS/Suppliers/Edit.vue b/src/pages/POS/Suppliers/Edit.vue
new file mode 100644
index 0000000..f4573b2
--- /dev/null
+++ b/src/pages/POS/Suppliers/Edit.vue
@@ -0,0 +1,201 @@
+
+
+
+
+
+
+
+
+ Editar Proveedor
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/POS/Suppliers/Index.vue b/src/pages/POS/Suppliers/Index.vue
new file mode 100644
index 0000000..cc16e89
--- /dev/null
+++ b/src/pages/POS/Suppliers/Index.vue
@@ -0,0 +1,215 @@
+
+
+
+
+ searcher.search(x)"
+ >
+
+
+
+
+ searcher.pagination(page)"
+ >
+
+ | NOMBRE |
+ RFC |
+ EMAIL |
+ TELÉFONO |
+ DIRECCIÓN |
+ CÓDIGO POSTAL |
+ NOTAS |
+ ACCIONES |
+
+
+
+ |
+ {{ supplier.business_name }}
+ |
+
+ {{ supplier.rfc }}
+ |
+
+ {{ supplier.email }}
+ |
+
+ {{ supplier.phone }}
+ |
+
+ {{ supplier.address }}
+ |
+
+ {{ supplier.postal_code }}
+ |
+
+ {{ supplier.notes }}
+ |
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+ {{ $t('registers.empty') }}
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/POS/Suppliers/Module.js b/src/pages/POS/Suppliers/Module.js
new file mode 100644
index 0000000..0696223
--- /dev/null
+++ b/src/pages/POS/Suppliers/Module.js
@@ -0,0 +1,16 @@
+import { hasPermission } from '@Plugins/RolePermission.js';
+
+// Ruta API
+const apiTo = (name, params = {}) => route(`suppliers.${name}`, params)
+
+// Ruta visual
+const viewTo = ({ name = '', params = {}, query = {} }) => ({ name: `pos.suppliers.${name}`, params, query })
+
+// Determina si un usuario puede hacer algo en base a los permisos
+const can = (permission) => hasPermission(`suppliers.${permission}`)
+
+export {
+ can,
+ viewTo,
+ apiTo
+}
diff --git a/src/router/Index.js b/src/router/Index.js
index 0d57fb0..1bf309c 100644
--- a/src/router/Index.js
+++ b/src/router/Index.js
@@ -118,6 +118,12 @@ const router = createRouter({
name: 'pos.billingRequests.index',
beforeEnter: (to, from, next) => can(next, 'invoice-requests.index'),
component: () => import('@Pages/POS/Clients/BillingRequests.vue')
+ },
+ {
+ path: 'suppliers',
+ name: 'pos.suppliers.index',
+ beforeEnter: (to, from, next) => can(next, 'suppliers.index'),
+ component: () => import('@Pages/POS/Suppliers/Index.vue')
}
]
},
| |