From fe79f843f6bfc7989b8e72939d64c0fcea6df19c Mon Sep 17 00:00:00 2001 From: Juan Felipe Zapata Moreno Date: Wed, 4 Mar 2026 17:17:08 -0600 Subject: [PATCH] =?UTF-8?q?feat:=20agregar=20soporte=20para=20gesti=C3=B3n?= =?UTF-8?q?=20de=20almac=C3=A9n=20principal=20en=20selecci=C3=B3n=20de=20s?= =?UTF-8?q?eriales?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/POS/BundleSerialSelector.vue | 6 +++++- src/components/POS/SerialSelector.vue | 6 +++++- src/pages/POS/Inventory/Serials.vue | 12 +++++++++++- src/pages/POS/Point.vue | 2 ++ src/pages/POS/Warehouses/Inventory.vue | 9 ++++++++- src/services/serialService.js | 10 +++++++--- 6 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/components/POS/BundleSerialSelector.vue b/src/components/POS/BundleSerialSelector.vue index 0eb3732..55e2c83 100644 --- a/src/components/POS/BundleSerialSelector.vue +++ b/src/components/POS/BundleSerialSelector.vue @@ -17,6 +17,10 @@ const props = defineProps({ excludeSerials: { type: Array, default: () => [] + }, + mainWarehouse: { + type: Boolean, + default: false } }); @@ -67,7 +71,7 @@ const loadComponents = async () => { // Cargar seriales para cada componente await Promise.all(components.value.map(async (comp) => { try { - const response = await serialService.getAvailableSerials(comp.inventory_id); + const response = await serialService.getAvailableSerials(comp.inventory_id, null, { mainWarehouse: props.mainWarehouse }); const serials = (response.serials?.data || []).filter( s => !props.excludeSerials.includes(s.serial_number) ); diff --git a/src/components/POS/SerialSelector.vue b/src/components/POS/SerialSelector.vue index 285265d..93f5d3e 100644 --- a/src/components/POS/SerialSelector.vue +++ b/src/components/POS/SerialSelector.vue @@ -22,6 +22,10 @@ const props = defineProps({ type: Number, default: null }, + mainWarehouse: { + type: Boolean, + default: false + }, preSelectedSerials: { type: Array, default: () => [] @@ -62,7 +66,7 @@ const canConfirm = computed(() => { const loadSerials = async () => { loading.value = true; try { - const response = await serialService.getAvailableSerials(props.product.id, props.warehouseId); + const response = await serialService.getAvailableSerials(props.product.id, props.warehouseId, { mainWarehouse: props.mainWarehouse }); const fetched = (response.serials?.data || []).filter( serial => !props.excludeSerials.includes(serial.serial_number) ); diff --git a/src/pages/POS/Inventory/Serials.vue b/src/pages/POS/Inventory/Serials.vue index 22b09bc..ebcea7c 100644 --- a/src/pages/POS/Inventory/Serials.vue +++ b/src/pages/POS/Inventory/Serials.vue @@ -11,6 +11,8 @@ const router = useRouter(); /** Estado */ const inventoryId = computed(() => route.params.id); +const warehouseId = computed(() => route.query.warehouse_id || null); +const isMainWarehouse = computed(() => !warehouseId.value || route.query.is_main === '1'); const inventory = ref(null); const serials = ref({ data: [], total: 0 }); const activeTab = ref('disponible'); @@ -29,10 +31,17 @@ const searcher = useSearcher({ }); /** Métodos */ +const warehouseFilters = () => { + if (!warehouseId.value) return {}; + if (route.query.is_main === '1') return { main_warehouse: 1 }; + return { warehouse_id: warehouseId.value }; +}; + const loadSerials = (filters = {}) => { searcher.load({ url: apiURL(`inventario/${inventoryId.value}/serials`), filters: { + ...warehouseFilters(), ...filters, status: activeTab.value } @@ -40,7 +49,7 @@ const loadSerials = (filters = {}) => { }; const onSearch = (query) => { - searcher.search(query, { status: activeTab.value }); + searcher.search(query, { ...warehouseFilters(), status: activeTab.value }); }; const switchTab = (tab) => { @@ -138,6 +147,7 @@ onMounted(() => { Disponibles