diff --git a/assets/uploads/vouchers/6a0cb59413a36-281.png b/assets/uploads/vouchers/6a0cb59413a36-281.png new file mode 100644 index 00000000..3feb1d42 Binary files /dev/null and b/assets/uploads/vouchers/6a0cb59413a36-281.png differ diff --git a/assets/uploads/vouchers/6a0cb61281766-8001.png b/assets/uploads/vouchers/6a0cb61281766-8001.png new file mode 100644 index 00000000..f93e2cb6 Binary files /dev/null and b/assets/uploads/vouchers/6a0cb61281766-8001.png differ diff --git a/assets/uploads/vouchers/6a0cb6efd02ce-1206.png b/assets/uploads/vouchers/6a0cb6efd02ce-1206.png new file mode 100644 index 00000000..31aae4c7 Binary files /dev/null and b/assets/uploads/vouchers/6a0cb6efd02ce-1206.png differ diff --git a/assets/uploads/vouchers/6a0ccd348037f-Captura de pantalla 2026-05-19 155037.png b/assets/uploads/vouchers/6a0ccd348037f-Captura de pantalla 2026-05-19 155037.png new file mode 100644 index 00000000..6d2c573c Binary files /dev/null and b/assets/uploads/vouchers/6a0ccd348037f-Captura de pantalla 2026-05-19 155037.png differ diff --git a/assets/uploads/vouchers/6a0cd1b7ef20a-Captura de pantalla 2026-05-19 160905.png b/assets/uploads/vouchers/6a0cd1b7ef20a-Captura de pantalla 2026-05-19 160905.png new file mode 100644 index 00000000..bf393cc3 Binary files /dev/null and b/assets/uploads/vouchers/6a0cd1b7ef20a-Captura de pantalla 2026-05-19 160905.png differ diff --git a/assets/uploads/vouchers/6a0cd2e4cbbc9-Captura de pantalla 2026-05-19 161325.png b/assets/uploads/vouchers/6a0cd2e4cbbc9-Captura de pantalla 2026-05-19 161325.png new file mode 100644 index 00000000..12322f31 Binary files /dev/null and b/assets/uploads/vouchers/6a0cd2e4cbbc9-Captura de pantalla 2026-05-19 161325.png differ diff --git a/assets/uploads/vouchers/6a0cd343e95c3-Screenshot_351.png b/assets/uploads/vouchers/6a0cd343e95c3-Screenshot_351.png new file mode 100644 index 00000000..a9f0eea8 Binary files /dev/null and b/assets/uploads/vouchers/6a0cd343e95c3-Screenshot_351.png differ diff --git a/assets/uploads/vouchers/6a0cdc850a961-1231.png b/assets/uploads/vouchers/6a0cdc850a961-1231.png new file mode 100644 index 00000000..5e4b6261 Binary files /dev/null and b/assets/uploads/vouchers/6a0cdc850a961-1231.png differ diff --git a/assets/uploads/vouchers/6a0cdd89d472f-143.png b/assets/uploads/vouchers/6a0cdd89d472f-143.png new file mode 100644 index 00000000..314eda5c Binary files /dev/null and b/assets/uploads/vouchers/6a0cdd89d472f-143.png differ diff --git a/assets/uploads/vouchers/6a0cde19499f5-3005.png b/assets/uploads/vouchers/6a0cde19499f5-3005.png new file mode 100644 index 00000000..5fb46723 Binary files /dev/null and b/assets/uploads/vouchers/6a0cde19499f5-3005.png differ diff --git a/assets/uploads/vouchers/6a0ce82126eb1-WhatsApp Image 2026-05-19 at 5.45.39 PM.jpeg b/assets/uploads/vouchers/6a0ce82126eb1-WhatsApp Image 2026-05-19 at 5.45.39 PM.jpeg new file mode 100644 index 00000000..890b8dda Binary files /dev/null and b/assets/uploads/vouchers/6a0ce82126eb1-WhatsApp Image 2026-05-19 at 5.45.39 PM.jpeg differ diff --git a/assets/uploads/vouchers/6a0ce88f3d987-WhatsApp Image 2026-05-19 at 5.47.22 PM.jpeg b/assets/uploads/vouchers/6a0ce88f3d987-WhatsApp Image 2026-05-19 at 5.47.22 PM.jpeg new file mode 100644 index 00000000..1acd5840 Binary files /dev/null and b/assets/uploads/vouchers/6a0ce88f3d987-WhatsApp Image 2026-05-19 at 5.47.22 PM.jpeg differ diff --git a/assets/uploads/vouchers/6a0ce922b7c61-WhatsApp Image 2026-05-19 at 5.49.55 PM.jpeg b/assets/uploads/vouchers/6a0ce922b7c61-WhatsApp Image 2026-05-19 at 5.49.55 PM.jpeg new file mode 100644 index 00000000..fa2f8575 Binary files /dev/null and b/assets/uploads/vouchers/6a0ce922b7c61-WhatsApp Image 2026-05-19 at 5.49.55 PM.jpeg differ diff --git a/assets/uploads/vouchers/6a0ce96592403-WhatsApp Image 2026-05-19 at 5.51.03 PM.jpeg b/assets/uploads/vouchers/6a0ce96592403-WhatsApp Image 2026-05-19 at 5.51.03 PM.jpeg new file mode 100644 index 00000000..22fb13d1 Binary files /dev/null and b/assets/uploads/vouchers/6a0ce96592403-WhatsApp Image 2026-05-19 at 5.51.03 PM.jpeg differ diff --git a/assets/uploads/vouchers/6a0cea06e7d00-WhatsApp Image 2026-05-19 at 5.53.39 PM.jpeg b/assets/uploads/vouchers/6a0cea06e7d00-WhatsApp Image 2026-05-19 at 5.53.39 PM.jpeg new file mode 100644 index 00000000..5720f894 Binary files /dev/null and b/assets/uploads/vouchers/6a0cea06e7d00-WhatsApp Image 2026-05-19 at 5.53.39 PM.jpeg differ diff --git a/assets/uploads/vouchers/6a0cea43a3008-WhatsApp Image 2026-05-19 at 5.54.49 PM.jpeg b/assets/uploads/vouchers/6a0cea43a3008-WhatsApp Image 2026-05-19 at 5.54.49 PM.jpeg new file mode 100644 index 00000000..4a2a6216 Binary files /dev/null and b/assets/uploads/vouchers/6a0cea43a3008-WhatsApp Image 2026-05-19 at 5.54.49 PM.jpeg differ diff --git a/assets/uploads/vouchers/6a0cea8a024a4-WhatsApp Image 2026-05-19 at 5.55.57 PM.jpeg b/assets/uploads/vouchers/6a0cea8a024a4-WhatsApp Image 2026-05-19 at 5.55.57 PM.jpeg new file mode 100644 index 00000000..a854e0b9 Binary files /dev/null and b/assets/uploads/vouchers/6a0cea8a024a4-WhatsApp Image 2026-05-19 at 5.55.57 PM.jpeg differ diff --git a/assets/uploads/vouchers/6a0ceb2e528cb-WhatsApp Image 2026-05-19 at 5.58.41 PM.jpeg b/assets/uploads/vouchers/6a0ceb2e528cb-WhatsApp Image 2026-05-19 at 5.58.41 PM.jpeg new file mode 100644 index 00000000..a6f08adb Binary files /dev/null and b/assets/uploads/vouchers/6a0ceb2e528cb-WhatsApp Image 2026-05-19 at 5.58.41 PM.jpeg differ diff --git a/assets/uploads/vouchers/6a0ceb8a71525-WhatsApp Image 2026-05-19 at 6.00.13 PM.jpeg b/assets/uploads/vouchers/6a0ceb8a71525-WhatsApp Image 2026-05-19 at 6.00.13 PM.jpeg new file mode 100644 index 00000000..f1d0abf9 Binary files /dev/null and b/assets/uploads/vouchers/6a0ceb8a71525-WhatsApp Image 2026-05-19 at 6.00.13 PM.jpeg differ diff --git a/assets/uploads/vouchers/6a0cec2aa6232-WhatsApp Image 2026-05-19 at 6.02.56 PM.jpeg b/assets/uploads/vouchers/6a0cec2aa6232-WhatsApp Image 2026-05-19 at 6.02.56 PM.jpeg new file mode 100644 index 00000000..c57c807c Binary files /dev/null and b/assets/uploads/vouchers/6a0cec2aa6232-WhatsApp Image 2026-05-19 at 6.02.56 PM.jpeg differ diff --git a/assets/uploads/vouchers/6a0cec9666249-WhatsApp Image 2026-05-19 at 6.04.42 PM.jpeg b/assets/uploads/vouchers/6a0cec9666249-WhatsApp Image 2026-05-19 at 6.04.42 PM.jpeg new file mode 100644 index 00000000..26ef610b Binary files /dev/null and b/assets/uploads/vouchers/6a0cec9666249-WhatsApp Image 2026-05-19 at 6.04.42 PM.jpeg differ diff --git a/assets/uploads/vouchers/6a0cecfa8cd55-WhatsApp Image 2026-05-19 at 6.06.24 PM.jpeg b/assets/uploads/vouchers/6a0cecfa8cd55-WhatsApp Image 2026-05-19 at 6.06.24 PM.jpeg new file mode 100644 index 00000000..0869fe02 Binary files /dev/null and b/assets/uploads/vouchers/6a0cecfa8cd55-WhatsApp Image 2026-05-19 at 6.06.24 PM.jpeg differ diff --git a/assets/uploads/vouchers/6a0ced5046d87-WhatsApp Image 2026-05-19 at 6.07.46 PM.jpeg b/assets/uploads/vouchers/6a0ced5046d87-WhatsApp Image 2026-05-19 at 6.07.46 PM.jpeg new file mode 100644 index 00000000..04ec8e84 Binary files /dev/null and b/assets/uploads/vouchers/6a0ced5046d87-WhatsApp Image 2026-05-19 at 6.07.46 PM.jpeg differ diff --git a/assets/uploads/vouchers/6a0ced91ec0c5-WhatsApp Image 2026-05-19 at 6.08.56 PM.jpeg b/assets/uploads/vouchers/6a0ced91ec0c5-WhatsApp Image 2026-05-19 at 6.08.56 PM.jpeg new file mode 100644 index 00000000..f88bbeb2 Binary files /dev/null and b/assets/uploads/vouchers/6a0ced91ec0c5-WhatsApp Image 2026-05-19 at 6.08.56 PM.jpeg differ diff --git a/assets/uploads/vouchers/6a0cedd710512-WhatsApp Image 2026-05-19 at 6.09.46 PM.jpeg b/assets/uploads/vouchers/6a0cedd710512-WhatsApp Image 2026-05-19 at 6.09.46 PM.jpeg new file mode 100644 index 00000000..d3d5bb67 Binary files /dev/null and b/assets/uploads/vouchers/6a0cedd710512-WhatsApp Image 2026-05-19 at 6.09.46 PM.jpeg differ diff --git a/assets/uploads/vouchers/6a0cee8ca04ea-WhatsApp Image 2026-05-19 at 6.13.05 PM.jpeg b/assets/uploads/vouchers/6a0cee8ca04ea-WhatsApp Image 2026-05-19 at 6.13.05 PM.jpeg new file mode 100644 index 00000000..381a23e4 Binary files /dev/null and b/assets/uploads/vouchers/6a0cee8ca04ea-WhatsApp Image 2026-05-19 at 6.13.05 PM.jpeg differ diff --git a/assets/uploads/vouchers/6a0db36b91422-7fb97d2d-5432-47f1-9c31-4e1b30f7a5b6.jpg b/assets/uploads/vouchers/6a0db36b91422-7fb97d2d-5432-47f1-9c31-4e1b30f7a5b6.jpg new file mode 100644 index 00000000..bdf23375 Binary files /dev/null and b/assets/uploads/vouchers/6a0db36b91422-7fb97d2d-5432-47f1-9c31-4e1b30f7a5b6.jpg differ diff --git a/assets/uploads/vouchers/6a0dc01ab6934-Captura de pantalla 2026-05-20 090702.png b/assets/uploads/vouchers/6a0dc01ab6934-Captura de pantalla 2026-05-20 090702.png new file mode 100644 index 00000000..26166819 Binary files /dev/null and b/assets/uploads/vouchers/6a0dc01ab6934-Captura de pantalla 2026-05-20 090702.png differ diff --git a/assets/uploads/vouchers/6a0dc4219a3a8-457.png b/assets/uploads/vouchers/6a0dc4219a3a8-457.png new file mode 100644 index 00000000..2f4a0f36 Binary files /dev/null and b/assets/uploads/vouchers/6a0dc4219a3a8-457.png differ diff --git a/assets/uploads/vouchers/6a0dc8d914bd5-920.png b/assets/uploads/vouchers/6a0dc8d914bd5-920.png new file mode 100644 index 00000000..8b28b84e Binary files /dev/null and b/assets/uploads/vouchers/6a0dc8d914bd5-920.png differ diff --git a/assets/uploads/vouchers/6a0dcadf26392-NUEVO.png b/assets/uploads/vouchers/6a0dcadf26392-NUEVO.png new file mode 100644 index 00000000..285d0657 Binary files /dev/null and b/assets/uploads/vouchers/6a0dcadf26392-NUEVO.png differ diff --git a/assets/uploads/vouchers/6a0dcca6cab8b-Screenshot_5.png b/assets/uploads/vouchers/6a0dcca6cab8b-Screenshot_5.png new file mode 100644 index 00000000..4f6d9052 Binary files /dev/null and b/assets/uploads/vouchers/6a0dcca6cab8b-Screenshot_5.png differ diff --git a/assets/uploads/vouchers/6a0dcd3d0b0b2-464.png b/assets/uploads/vouchers/6a0dcd3d0b0b2-464.png new file mode 100644 index 00000000..4a88f23d Binary files /dev/null and b/assets/uploads/vouchers/6a0dcd3d0b0b2-464.png differ diff --git a/assets/uploads/vouchers/6a0dcf417eed2-Screenshot_6.png b/assets/uploads/vouchers/6a0dcf417eed2-Screenshot_6.png new file mode 100644 index 00000000..b660c9f5 Binary files /dev/null and b/assets/uploads/vouchers/6a0dcf417eed2-Screenshot_6.png differ diff --git a/assets/uploads/vouchers/6a0e0610b0f7d-Screenshot_352.png b/assets/uploads/vouchers/6a0e0610b0f7d-Screenshot_352.png new file mode 100644 index 00000000..73b833a8 Binary files /dev/null and b/assets/uploads/vouchers/6a0e0610b0f7d-Screenshot_352.png differ diff --git a/assets/uploads/vouchers/6a0f12416120f-Screenshot_353.png b/assets/uploads/vouchers/6a0f12416120f-Screenshot_353.png new file mode 100644 index 00000000..fa5f714d Binary files /dev/null and b/assets/uploads/vouchers/6a0f12416120f-Screenshot_353.png differ diff --git a/assets/uploads/vouchers/6a0f129b5035b-Screenshot_353.png b/assets/uploads/vouchers/6a0f129b5035b-Screenshot_353.png new file mode 100644 index 00000000..fa5f714d Binary files /dev/null and b/assets/uploads/vouchers/6a0f129b5035b-Screenshot_353.png differ diff --git a/assets/uploads/vouchers/6a0f1833a9f4e-157.png b/assets/uploads/vouchers/6a0f1833a9f4e-157.png new file mode 100644 index 00000000..e3293694 Binary files /dev/null and b/assets/uploads/vouchers/6a0f1833a9f4e-157.png differ diff --git a/assets/uploads/vouchers/6a0f2e496c0af-Captura de pantalla 2026-05-21 110930.png b/assets/uploads/vouchers/6a0f2e496c0af-Captura de pantalla 2026-05-21 110930.png new file mode 100644 index 00000000..82e98258 Binary files /dev/null and b/assets/uploads/vouchers/6a0f2e496c0af-Captura de pantalla 2026-05-21 110930.png differ diff --git a/db/migrations/015_add_nota_adicional_to_pedidos.sql b/db/migrations/015_add_nota_adicional_to_pedidos.sql new file mode 100644 index 00000000..ff883546 --- /dev/null +++ b/db/migrations/015_add_nota_adicional_to_pedidos.sql @@ -0,0 +1,2 @@ +-- Migration: Add nota_adicional column to pedidos table +ALTER TABLE pedidos ADD COLUMN nota_adicional TEXT NULL AFTER clave; diff --git a/generar_etiquetas.php b/generar_etiquetas.php index 9caac777..4006527e 100644 --- a/generar_etiquetas.php +++ b/generar_etiquetas.php @@ -15,69 +15,82 @@ try { } // Handle form submission -$generated_codes = []; -if ($_SERVER['REQUEST_METHOD'] === 'POST') { - $producto_id = $_POST['producto_id'] ?? null; - $cantidad = isset($_POST['cantidad']) ? (int)$_POST['cantidad'] : 0; +$generated_data = []; // Store both code and product name +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['productos'])) { + $productos_input = $_POST['productos']; + $cantidades_input = $_POST['cantidades']; - if ($producto_id && $cantidad > 0 && $cantidad <= 1000) { - $db = db(); - try { - $db->beginTransaction(); + $db = db(); + try { + $db->beginTransaction(); + + $total_generated = 0; - // 1. Lock the product row and get current counter and code base - $stmt = $db->prepare("SELECT codigo_base, sku, contador_etiquetas FROM products WHERE id = ? FOR UPDATE"); - $stmt->execute([$producto_id]); - $product_data = $stmt->fetch(PDO::FETCH_ASSOC); + foreach ($productos_input as $index => $producto_id) { + $cantidad = isset($cantidades_input[$index]) ? (int)$cantidades_input[$index] : 0; - if (!$product_data) { - throw new Exception("Producto no encontrado."); - } + if ($producto_id && $cantidad > 0 && $cantidad <= 1000) { + // 1. Lock the product row and get current counter and code base + $stmt = $db->prepare("SELECT nombre, codigo_base, sku, contador_etiquetas FROM products WHERE id = ? FOR UPDATE"); + $stmt->execute([$producto_id]); + $product_data = $stmt->fetch(PDO::FETCH_ASSOC); - $codigo_base = $product_data['codigo_base']; - $contador_actual = (int)$product_data['contador_etiquetas']; + if (!$product_data) { + continue; // Skip if product not found + } - // If codigo_base is missing, try to use SKU - if (empty($codigo_base)) { - $codigo_base = $product_data['sku']; - - // If SKU is also missing, abort + $product_name = $product_data['nombre']; + $codigo_base = $product_data['codigo_base']; + $contador_actual = (int)$product_data['contador_etiquetas']; + + // If codigo_base is missing, try to use SKU if (empty($codigo_base)) { - throw new Exception("El producto no tiene un SKU o Código Base definido. Por favor, edite el producto y añada un SKU."); + $codigo_base = $product_data['sku']; + + // If SKU is also missing, skip or throw error + if (empty($codigo_base)) { + throw new Exception("El producto '$product_name' no tiene un SKU o Código Base definido."); + } + + // Persist the SKU as the codigo_base for future use + $update_base_stmt = $db->prepare("UPDATE products SET codigo_base = ? WHERE id = ?"); + $update_base_stmt->execute([$codigo_base, $producto_id]); + } + + // Prepare statement for insertion into unidades_inventario + $insert_stmt = $db->prepare("INSERT INTO unidades_inventario (codigo_unico, producto_id) VALUES (?, ?)"); + + // 2. Generate new codes + for ($i = 1; $i <= $cantidad; $i++) { + $nuevo_contador = $contador_actual + $i; + $numero_formateado = str_pad($nuevo_contador, 4, '0', STR_PAD_LEFT); + $unique_code = $codigo_base . '-' . $numero_formateado; + + $insert_stmt->execute([$unique_code, $producto_id]); + $generated_data[] = [ + 'code' => $unique_code, + 'product_name' => $product_name + ]; + $total_generated++; } - // Persist the SKU as the codigo_base for future use - $update_base_stmt = $db->prepare("UPDATE products SET codigo_base = ? WHERE id = ?"); - $update_base_stmt->execute([$codigo_base, $producto_id]); + // 3. Update the counter in the products table + $nuevo_total_contador = $contador_actual + $cantidad; + $update_stmt = $db->prepare("UPDATE products SET contador_etiquetas = ? WHERE id = ?"); + $update_stmt->execute([$nuevo_total_contador, $producto_id]); } - - // Prepare statement for insertion into unidades_inventario - $insert_stmt = $db->prepare("INSERT INTO unidades_inventario (codigo_unico, producto_id) VALUES (?, ?)"); - - // 2. Generate new codes - for ($i = 1; $i <= $cantidad; $i++) { - $nuevo_contador = $contador_actual + $i; - $numero_formateado = str_pad($nuevo_contador, 4, '0', STR_PAD_LEFT); - $unique_code = $codigo_base . '-' . $numero_formateado; - - $insert_stmt->execute([$unique_code, $producto_id]); - $generated_codes[] = $unique_code; - } - - // 3. Update the counter in the products table - $nuevo_total_contador = $contador_actual + $cantidad; - $update_stmt = $db->prepare("UPDATE products SET contador_etiquetas = ? WHERE id = ?"); - $update_stmt->execute([$nuevo_total_contador, $producto_id]); - - $db->commit(); - $_SESSION['success_message'] = 'Se generaron ' . count($generated_codes) . ' códigos exitosamente.'; - - } catch (Exception $e) { - $db->rollBack(); - $_SESSION['error_message'] = 'Error al generar los códigos: ' . $e->getMessage(); } - } else { - $_SESSION['error_message'] = 'Por favor, seleccione un producto y especifique una cantidad válida (entre 1 y 1000).'; + + $db->commit(); + if ($total_generated > 0) { + $_SESSION['success_message'] = 'Se generaron ' . $total_generated . ' códigos exitosamente.'; + } else { + $_SESSION['error_message'] = 'No se generó ningún código. Verifique los datos ingresados.'; + } + + } catch (Exception $e) { + if ($db->inTransaction()) $db->rollBack(); + $_SESSION['error_message'] = 'Error al generar los códigos: ' . $e->getMessage(); } } @@ -99,51 +112,91 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { unset($_SESSION['error_message']); // Clear the message } ?> -
-
-
- - + +
+
+
+ + +
+
+ + +
+
+ +
-
- - +
+ +
+
+
-
- +
+
+ +

Códigos Generados

- - - - + + +