From b7154af381b961d146833b1aeb58c051a503bb18 Mon Sep 17 00:00:00 2001
From: Juan Felipe Zapata Moreno
Date: Fri, 6 Mar 2026 10:08:09 -0600
Subject: [PATCH] =?UTF-8?q?feat:=20actualizar=20terminolog=C3=ADa=20de=20c?=
=?UTF-8?q?ategor=C3=ADa=20a=20clasificaci=C3=B3n=20en=20toda=20la=20aplic?=
=?UTF-8?q?aci=C3=B3n?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/POS/ProductCard.vue | 2 +-
...RegimenSelecto.vue => RegimenSelector.vue} | 0
src/lang/es.js | 2 +-
src/pages/POS/Category/CreateModal.vue | 10 +++++-----
src/pages/POS/Category/DeleteModal.vue | 8 ++++----
src/pages/POS/Category/EditModal.vue | 10 +++++-----
src/pages/POS/Category/Index.vue | 12 +++++------
.../Subcategories/CreateBulkModal.vue | 16 +++++++--------
.../Category/Subcategories/CreateModal.vue | 10 +++++-----
.../Category/Subcategories/DeleteModal.vue | 8 ++++----
.../POS/Category/Subcategories/EditModal.vue | 10 +++++-----
.../POS/Category/Subcategories/Index.vue | 20 +++++++++----------
.../POS/Clients/BillingRequestDetailModal.vue | 10 ++++++----
src/pages/POS/Inventory/DeleteModal.vue | 2 +-
src/pages/POS/Inventory/Index.vue | 8 ++++----
src/pages/POS/Inventory/Serials.vue | 2 +-
src/pages/POS/Warehouses/Inventory.vue | 8 ++++----
src/services/whatsappService.js | 14 ++++++-------
18 files changed, 77 insertions(+), 75 deletions(-)
rename src/components/POS/{RegimenSelecto.vue => RegimenSelector.vue} (100%)
diff --git a/src/components/POS/ProductCard.vue b/src/components/POS/ProductCard.vue
index 0c25a98..073ffc1 100644
--- a/src/components/POS/ProductCard.vue
+++ b/src/components/POS/ProductCard.vue
@@ -71,7 +71,7 @@ const handleAddToCart = () => {
- {{ product.category?.name || 'Sin categoría' }}
+ {{ product.category?.name || 'Sin clasificación' }}
diff --git a/src/components/POS/RegimenSelecto.vue b/src/components/POS/RegimenSelector.vue
similarity index 100%
rename from src/components/POS/RegimenSelecto.vue
rename to src/components/POS/RegimenSelector.vue
diff --git a/src/lang/es.js b/src/lang/es.js
index 62503a1..9f262d5 100644
--- a/src/lang/es.js
+++ b/src/lang/es.js
@@ -502,7 +502,7 @@ export default {
},
sku: 'SKU / Código',
product: 'Producto',
- category: 'Categoría',
+ category: 'Clasificación',
stock: 'Stock',
state: 'Estado',
cost: 'Costo',
diff --git a/src/pages/POS/Category/CreateModal.vue b/src/pages/POS/Category/CreateModal.vue
index c33b8c0..d42521b 100644
--- a/src/pages/POS/Category/CreateModal.vue
+++ b/src/pages/POS/Category/CreateModal.vue
@@ -24,12 +24,12 @@ const form = useForm({
const createCategory = () => {
form.post(apiURL('categorias'), {
onSuccess: (data) => {
- Notify.success('Categoría creada exitosamente');
+ Notify.success('Clasificación creada exitosamente');
emit('created', data?.model);
closeModal();
},
onError: () => {
- Notify.error('Error al crear la categoría');
+ Notify.error('Error al crear la clasificación');
}
});
};
@@ -46,7 +46,7 @@ const closeModal = () => {
- Crear Categoría
+ Crear Clasificación
{
@@ -83,7 +83,7 @@ const closeModal = () => {
v-model="form.description"
rows="3"
class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100"
- placeholder="Descripción de la categoría"
+ placeholder="Descripción de la clasificación"
>
diff --git a/src/pages/POS/Category/DeleteModal.vue b/src/pages/POS/Category/DeleteModal.vue
index b0667b5..717e6c4 100644
--- a/src/pages/POS/Category/DeleteModal.vue
+++ b/src/pages/POS/Category/DeleteModal.vue
@@ -37,7 +37,7 @@ const handleClose = () => {
- Eliminar Categoría
+ Eliminar Clasificación
{
- ¿Estás seguro de que deseas eliminar esta categoría?
+ ¿Estás seguro de que deseas eliminar esta clasificación?
@@ -89,7 +89,7 @@ const handleClose = () => {
- Esta acción es permanente y no se puede deshacer. Los productos asociados a esta categoría perderán su categorización.
+ Esta acción es permanente y no se puede deshacer. Los productos asociados a esta clasificación perderán su clasificación.
@@ -109,7 +109,7 @@ const handleClose = () => {
class="flex items-center gap-2 px-5 py-2.5 bg-red-600 hover:bg-red-700 text-white text-sm font-semibold rounded-lg focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-600 shadow-lg shadow-red-600/30 transition-all"
>
- Eliminar Categoría
+ Eliminar Clasificación
diff --git a/src/pages/POS/Category/EditModal.vue b/src/pages/POS/Category/EditModal.vue
index 5dee48b..1f57fee 100644
--- a/src/pages/POS/Category/EditModal.vue
+++ b/src/pages/POS/Category/EditModal.vue
@@ -26,12 +26,12 @@ const form = useForm({
const updateCategory = () => {
form.put(apiURL(`categorias/${props.category.id}`), {
onSuccess: () => {
- Notify.success('Categoría actualizada exitosamente');
+ Notify.success('Clasificación actualizada exitosamente');
emit('updated');
closeModal();
},
onError: () => {
- Notify.error('Error al actualizar la categoría');
+ Notify.error('Error al actualizar la clasificación');
}
});
};
@@ -57,7 +57,7 @@ watch(() => props.category, (newCategory) => {
- Editar Categoría
+ Editar Clasificación
props.category, (newCategory) => {
@@ -94,7 +94,7 @@ watch(() => props.category, (newCategory) => {
v-model="form.description"
rows="3"
class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100"
- placeholder="Descripción de la categoría"
+ placeholder="Descripción de la clasificación"
>
diff --git a/src/pages/POS/Category/Index.vue b/src/pages/POS/Category/Index.vue
index 9c5ea48..e6829d3 100644
--- a/src/pages/POS/Category/Index.vue
+++ b/src/pages/POS/Category/Index.vue
@@ -72,15 +72,15 @@ const confirmDelete = async (id) => {
});
if (response.ok) {
- Notify.success('Categoría eliminada exitosamente');
+ Notify.success('Clasificación eliminada exitosamente');
closeDeleteModal();
searcher.search();
} else {
- Notify.error('Error al eliminar la categoría');
+ Notify.error('Error al eliminar la clasificación');
}
} catch (error) {
console.error('Error:', error);
- Notify.error('Error al eliminar la categoría');
+ Notify.error('Error al eliminar la clasificación');
}
};
@@ -102,7 +102,7 @@ onMounted(() => {
@click="openCreateModal"
>
- Nueva Categoría
+ Nueva Clasificación
@@ -169,7 +169,7 @@ onMounted(() => {
@@ -182,7 +182,7 @@ onMounted(() => {
diff --git a/src/pages/POS/Category/Subcategories/CreateBulkModal.vue b/src/pages/POS/Category/Subcategories/CreateBulkModal.vue
index 3d22d16..51abc0f 100644
--- a/src/pages/POS/Category/Subcategories/CreateBulkModal.vue
+++ b/src/pages/POS/Category/Subcategories/CreateBulkModal.vue
@@ -43,14 +43,14 @@ const createSubcategory = () => {
onSuccess: (data) => {
Notify.success(
entries.value.length === 1
- ? 'Subcategoría creada exitosamente'
- : 'Subcategorías creadas exitosamente'
+ ? 'Subclasificación creada exitosamente'
+ : 'Subclasificaciones creadas exitosamente'
);
emit('created', data?.models ?? data?.model);
closeModal();
},
onError: () => {
- Notify.error('Error al crear la subcategoría');
+ Notify.error('Error al crear la subclasificación');
}
});
};
@@ -68,7 +68,7 @@ const closeModal = () => {
- Crear Subcategoría
+ Crear Subclasificación
{
>
- Subcategoría {{ index + 1 }}
+ Subclasificación {{ index + 1 }}
{
@@ -129,7 +129,7 @@ const closeModal = () => {
v-model="entry.description"
rows="2"
class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100"
- placeholder="Descripción de la subcategoría"
+ placeholder="Descripción de la subclasificación"
>
@@ -159,7 +159,7 @@ const closeModal = () => {
- Agregar otra subcategoría
+ Agregar otra subclasificación
diff --git a/src/pages/POS/Category/Subcategories/CreateModal.vue b/src/pages/POS/Category/Subcategories/CreateModal.vue
index 862f5ca..6b9110c 100644
--- a/src/pages/POS/Category/Subcategories/CreateModal.vue
+++ b/src/pages/POS/Category/Subcategories/CreateModal.vue
@@ -28,13 +28,13 @@ const form = useForm({
const createSubcategory = () => {
form.post(apiURL(`categorias/${props.categoryId}/subcategorias`), {
onSuccess: (data) => {
- Notify.success('Subcategoría creada exitosamente');
+ Notify.success('Subclasificación creada exitosamente');
const created = data?.model ?? (data?.models ? data.models[0] : []);
emit('created', created);
closeModal();
},
onError: () => {
- Notify.error('Error al crear la subcategoría');
+ Notify.error('Error al crear la subclasificación');
}
});
};
@@ -51,7 +51,7 @@ const closeModal = () => {
- Crear Subcategoría
+ Crear Subclasificación
{
@@ -88,7 +88,7 @@ const closeModal = () => {
v-model="form.description"
rows="3"
class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100"
- placeholder="Descripción de la subcategoría"
+ placeholder="Descripción de la subclasificación"
>
diff --git a/src/pages/POS/Category/Subcategories/DeleteModal.vue b/src/pages/POS/Category/Subcategories/DeleteModal.vue
index e4f286b..3380b66 100644
--- a/src/pages/POS/Category/Subcategories/DeleteModal.vue
+++ b/src/pages/POS/Category/Subcategories/DeleteModal.vue
@@ -37,7 +37,7 @@ const handleClose = () => {
- Eliminar Subcategoría
+ Eliminar Subclasificación
{
- ¿Estás seguro de que deseas eliminar esta subcategoría?
+ ¿Estás seguro de que deseas eliminar esta subclasificación?
@@ -89,7 +89,7 @@ const handleClose = () => {
- Los productos que tenían asignada esta subcategoría quedarán sin subcategoría automáticamente.
+ Los productos que tenían asignada esta subclasificación quedarán sin subclasificación automáticamente.
@@ -109,7 +109,7 @@ const handleClose = () => {
class="flex items-center gap-2 px-5 py-2.5 bg-red-600 hover:bg-red-700 text-white text-sm font-semibold rounded-lg focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-600 shadow-lg shadow-red-600/30 transition-all"
>
- Eliminar Subcategoría
+ Eliminar Subclasificación
diff --git a/src/pages/POS/Category/Subcategories/EditModal.vue b/src/pages/POS/Category/Subcategories/EditModal.vue
index 065d107..0cd2dc2 100644
--- a/src/pages/POS/Category/Subcategories/EditModal.vue
+++ b/src/pages/POS/Category/Subcategories/EditModal.vue
@@ -30,12 +30,12 @@ const form = useForm({
const updateSubcategory = () => {
form.put(apiURL(`categorias/${props.categoryId}/subcategorias/${props.subcategory.id}`), {
onSuccess: () => {
- Notify.success('Subcategoría actualizada exitosamente');
+ Notify.success('Subclasificación actualizada exitosamente');
emit('updated');
closeModal();
},
onError: () => {
- Notify.error('Error al actualizar la subcategoría');
+ Notify.error('Error al actualizar la subclasificación');
}
});
};
@@ -61,7 +61,7 @@ watch(() => props.subcategory, (newSubcategory) => {
- Editar Subcategoría
+ Editar Subclasificación
props.subcategory, (newSubcategory) => {
@@ -98,7 +98,7 @@ watch(() => props.subcategory, (newSubcategory) => {
v-model="form.description"
rows="3"
class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100"
- placeholder="Descripción de la subcategoría"
+ placeholder="Descripción de la subclasificación"
>
diff --git a/src/pages/POS/Category/Subcategories/Index.vue b/src/pages/POS/Category/Subcategories/Index.vue
index b70b457..14f9524 100644
--- a/src/pages/POS/Category/Subcategories/Index.vue
+++ b/src/pages/POS/Category/Subcategories/Index.vue
@@ -93,15 +93,15 @@ const confirmDelete = async (id) => {
});
if (response.ok) {
- Notify.success('Subcategoría eliminada exitosamente');
+ Notify.success('Subclasificación eliminada exitosamente');
closeDeleteModal();
searcher.search();
} else {
- Notify.error('Error al eliminar la subcategoría');
+ Notify.error('Error al eliminar la subclasificación');
}
} catch (error) {
console.error('Error:', error);
- Notify.error('Error al eliminar la subcategoría');
+ Notify.error('Error al eliminar la subclasificación');
}
};
@@ -120,14 +120,14 @@ onMounted(() => {
-
Categoría
+
Clasificación
- {{ categoryName || 'Subcategorías' }}
+ {{ categoryName || 'Subclasificaciones' }}
@@ -136,7 +136,7 @@ onMounted(() => {
@click="openCreateModal"
>
- Nueva Subcategoría
+ Nueva Subclasificación
@@ -204,14 +204,14 @@ onMounted(() => {
@@ -226,7 +226,7 @@ onMounted(() => {
name="category"
class="text-6xl mb-2 opacity-50"
/>
- No hay subcategorías registradas
+ No hay subclasificaciones registradas
diff --git a/src/pages/POS/Clients/BillingRequestDetailModal.vue b/src/pages/POS/Clients/BillingRequestDetailModal.vue
index cb553e4..dba6877 100644
--- a/src/pages/POS/Clients/BillingRequestDetailModal.vue
+++ b/src/pages/POS/Clients/BillingRequestDetailModal.vue
@@ -157,10 +157,12 @@ const sendInvoiceByWhatsapp = async () => {
sendingWhatsapp.value = true;
try {
- await whatsappService.sendInvoice({
+ const ticket = request.sale?.invoice_number || `SOL-${request.id}`;
+ await whatsappService.sendDocument({
phone_number: request.client.phone,
- invoice_number: request.sale?.invoice_number || `SOL-${request.id}`,
- pdf_url: request.invoice_pdf_url,
+ document_url: request.invoice_pdf_url,
+ filename: `${ticket}.pdf`,
+ ticket,
customer_name: request.client.name
});
@@ -419,7 +421,7 @@ const sendInvoiceByWhatsapp = async () => {
{{ item.product_name }}
- SKU: {{ item.inventory?.sku || 'N/A' }} • {{ item.inventory?.category?.name || 'Sin categoría' }}
+ SKU: {{ item.inventory?.sku || 'N/A' }} • {{ item.inventory?.category?.name || 'Sin clasificación' }}
diff --git a/src/pages/POS/Inventory/DeleteModal.vue b/src/pages/POS/Inventory/DeleteModal.vue
index eee55f7..40d65f1 100644
--- a/src/pages/POS/Inventory/DeleteModal.vue
+++ b/src/pages/POS/Inventory/DeleteModal.vue
@@ -65,7 +65,7 @@ const handleClose = () => {
SKU: {{ product.sku }}
•
- {{ product.category?.name || 'Sin categoría' }}
+ {{ product.category?.name || 'Sin clasificación' }}
diff --git a/src/pages/POS/Inventory/Index.vue b/src/pages/POS/Inventory/Index.vue
index 91d4abd..ba16821 100644
--- a/src/pages/POS/Inventory/Index.vue
+++ b/src/pages/POS/Inventory/Index.vue
@@ -58,7 +58,7 @@ const loadCategories = async () => {
categories.value = result.data.categories.data;
}
} catch (error) {
- console.error('Error al cargar categorías:', error);
+ console.error('Error al cargar clasificaciones:', error);
}
};
@@ -75,7 +75,7 @@ const loadSubcategories = async () => {
categories.value = result.data.subcategories.data;
}
} catch (error) {
- console.error('Error al cargar subcategorías:', error);
+ console.error('Error al cargar subclasificaciones:', error);
}
};
@@ -266,13 +266,13 @@ onMounted(() => {
-
Filtrar por categoría:
+
Filtrar por clasificación:
- Todas las categorías
+ Todas las clasificaciones
{{ category.name }}
diff --git a/src/pages/POS/Inventory/Serials.vue b/src/pages/POS/Inventory/Serials.vue
index ebcea7c..fdea733 100644
--- a/src/pages/POS/Inventory/Serials.vue
+++ b/src/pages/POS/Inventory/Serials.vue
@@ -103,7 +103,7 @@ onMounted(() => {
SKU: {{ inventory.sku }}
- | Categoría: {{ inventory.category.name }}
+ | Clasificación: {{ inventory.category.name }}
diff --git a/src/pages/POS/Warehouses/Inventory.vue b/src/pages/POS/Warehouses/Inventory.vue
index 6c29e10..e241982 100644
--- a/src/pages/POS/Warehouses/Inventory.vue
+++ b/src/pages/POS/Warehouses/Inventory.vue
@@ -64,7 +64,7 @@ const loadCategories = async () => {
categories.value = result.data.categories.data;
}
} catch (error) {
- console.error('Error al cargar categorías:', error);
+ console.error('Error al cargar clasificaciones:', error);
}
};
@@ -175,13 +175,13 @@ onMounted(async () => {
- Filtrar por categoría:
+ Filtrar por clasificación:
- Todas las categorías
+ Todas las clasificaciones
{{ category.name }}
@@ -207,7 +207,7 @@ onMounted(async () => {
SKU / CÓDIGO
PRODUCTO
- CATEGORÍA
+ CLASIFICACIÓN
PRECIO
STOCK
TOTAL
diff --git a/src/services/whatsappService.js b/src/services/whatsappService.js
index b35e2d6..95c6653 100644
--- a/src/services/whatsappService.js
+++ b/src/services/whatsappService.js
@@ -6,19 +6,19 @@ import axios from 'axios';
*/
const whatsappService = {
/**
- * Enviar factura por WhatsApp
- * @param {Object} data - Datos de la factura
+ * Enviar documento por WhatsApp
+ * @param {Object} data - Datos del documento
* @returns {Promise}
*/
- async sendInvoice({ phone_number, invoice_number, pdf_url, xml_url = null, customer_name }) {
+ async sendDocument({ phone_number, document_url, filename, ticket, customer_name }) {
try {
const { data } = await axios.post(
- apiURL('whatsapp/send-invoice'),
+ apiURL('whatsapp/send-document'),
{
phone_number,
- invoice_number,
- pdf_url,
- xml_url,
+ document_url,
+ filename,
+ ticket,
customer_name
},
{