diff --git a/assets/uploads/info_images/info_69eb7d3890581.webp b/assets/uploads/info_images/info_69eb7d3890581.webp new file mode 100644 index 0000000..1075d79 Binary files /dev/null and b/assets/uploads/info_images/info_69eb7d3890581.webp differ diff --git a/assets/uploads/info_images/info_69eb7d4196d9e.webp b/assets/uploads/info_images/info_69eb7d4196d9e.webp new file mode 100644 index 0000000..1075d79 Binary files /dev/null and b/assets/uploads/info_images/info_69eb7d4196d9e.webp differ diff --git a/assets/uploads/vouchers/69e94364e1686-713.png b/assets/uploads/vouchers/69e94364e1686-713.png deleted file mode 100644 index c29dcf1..0000000 Binary files a/assets/uploads/vouchers/69e94364e1686-713.png and /dev/null differ diff --git a/assets/uploads/vouchers/69e94d9fe310d-WhatsApp Image 2026-04-22 at 5.09.06 PM.jpeg b/assets/uploads/vouchers/69e94d9fe310d-WhatsApp Image 2026-04-22 at 5.09.06 PM.jpeg deleted file mode 100644 index 6fb8d15..0000000 Binary files a/assets/uploads/vouchers/69e94d9fe310d-WhatsApp Image 2026-04-22 at 5.09.06 PM.jpeg and /dev/null differ diff --git a/assets/uploads/vouchers/69e96579c6cc2-Captura.PNG b/assets/uploads/vouchers/69e96579c6cc2-Captura.PNG new file mode 100644 index 0000000..69c2f48 Binary files /dev/null and b/assets/uploads/vouchers/69e96579c6cc2-Captura.PNG differ diff --git a/assets/uploads/vouchers/69e96646a13a4-Captura1.PNG b/assets/uploads/vouchers/69e96646a13a4-Captura1.PNG new file mode 100644 index 0000000..d929a54 Binary files /dev/null and b/assets/uploads/vouchers/69e96646a13a4-Captura1.PNG differ diff --git a/assets/uploads/vouchers/69ea449916f98-Screenshot_24.png b/assets/uploads/vouchers/69ea449916f98-Screenshot_24.png new file mode 100644 index 0000000..4e37037 Binary files /dev/null and b/assets/uploads/vouchers/69ea449916f98-Screenshot_24.png differ diff --git a/assets/uploads/vouchers/69ea4c3a2fe4a-Screenshot_25.png b/assets/uploads/vouchers/69ea4c3a2fe4a-Screenshot_25.png new file mode 100644 index 0000000..faf14d6 Binary files /dev/null and b/assets/uploads/vouchers/69ea4c3a2fe4a-Screenshot_25.png differ diff --git a/assets/uploads/vouchers/69ea4d1452fa1-Screenshot_26.png b/assets/uploads/vouchers/69ea4d1452fa1-Screenshot_26.png new file mode 100644 index 0000000..73e3ddf Binary files /dev/null and b/assets/uploads/vouchers/69ea4d1452fa1-Screenshot_26.png differ diff --git a/assets/uploads/vouchers/69ea76e0be320-Screenshot_251.png b/assets/uploads/vouchers/69ea76e0be320-Screenshot_251.png new file mode 100644 index 0000000..77507b1 Binary files /dev/null and b/assets/uploads/vouchers/69ea76e0be320-Screenshot_251.png differ diff --git a/assets/uploads/vouchers/69ea77c4ac611-347.png b/assets/uploads/vouchers/69ea77c4ac611-347.png new file mode 100644 index 0000000..2da0199 Binary files /dev/null and b/assets/uploads/vouchers/69ea77c4ac611-347.png differ diff --git a/assets/uploads/vouchers/69ea7fa45914d-Screenshot_27.png b/assets/uploads/vouchers/69ea7fa45914d-Screenshot_27.png new file mode 100644 index 0000000..62ec3db Binary files /dev/null and b/assets/uploads/vouchers/69ea7fa45914d-Screenshot_27.png differ diff --git a/assets/uploads/vouchers/69ea8019a49d1-Screenshot_28.png b/assets/uploads/vouchers/69ea8019a49d1-Screenshot_28.png new file mode 100644 index 0000000..b9514c4 Binary files /dev/null and b/assets/uploads/vouchers/69ea8019a49d1-Screenshot_28.png differ diff --git a/assets/uploads/vouchers/69ea807ef30af-Screenshot_29.png b/assets/uploads/vouchers/69ea807ef30af-Screenshot_29.png new file mode 100644 index 0000000..42c6e1c Binary files /dev/null and b/assets/uploads/vouchers/69ea807ef30af-Screenshot_29.png differ diff --git a/assets/uploads/vouchers/69ea930d4bab5-974.png b/assets/uploads/vouchers/69ea930d4bab5-974.png new file mode 100644 index 0000000..7037a4a Binary files /dev/null and b/assets/uploads/vouchers/69ea930d4bab5-974.png differ diff --git a/assets/uploads/vouchers/69ea935c9b083-104.png b/assets/uploads/vouchers/69ea935c9b083-104.png new file mode 100644 index 0000000..a36ea7d Binary files /dev/null and b/assets/uploads/vouchers/69ea935c9b083-104.png differ diff --git a/assets/uploads/vouchers/69ea939cace67-492.png b/assets/uploads/vouchers/69ea939cace67-492.png new file mode 100644 index 0000000..6e3d4ab Binary files /dev/null and b/assets/uploads/vouchers/69ea939cace67-492.png differ diff --git a/assets/uploads/vouchers/69ea93f288cc5-29.png b/assets/uploads/vouchers/69ea93f288cc5-29.png new file mode 100644 index 0000000..2730951 Binary files /dev/null and b/assets/uploads/vouchers/69ea93f288cc5-29.png differ diff --git a/assets/uploads/vouchers/69ea9466ac126-535.png b/assets/uploads/vouchers/69ea9466ac126-535.png new file mode 100644 index 0000000..b38d6a6 Binary files /dev/null and b/assets/uploads/vouchers/69ea9466ac126-535.png differ diff --git a/assets/uploads/vouchers/69ea9771c3997-188.png b/assets/uploads/vouchers/69ea9771c3997-188.png new file mode 100644 index 0000000..8ef3cbc Binary files /dev/null and b/assets/uploads/vouchers/69ea9771c3997-188.png differ diff --git a/assets/uploads/vouchers/69ea97f1128af-18.png b/assets/uploads/vouchers/69ea97f1128af-18.png new file mode 100644 index 0000000..32efbc5 Binary files /dev/null and b/assets/uploads/vouchers/69ea97f1128af-18.png differ diff --git a/assets/uploads/vouchers/69ea9b6ce1a57-Captura 4.PNG b/assets/uploads/vouchers/69ea9b6ce1a57-Captura 4.PNG new file mode 100644 index 0000000..05a5753 Binary files /dev/null and b/assets/uploads/vouchers/69ea9b6ce1a57-Captura 4.PNG differ diff --git a/assets/uploads/vouchers/69ea9cbb80140-Screenshot_252.png b/assets/uploads/vouchers/69ea9cbb80140-Screenshot_252.png new file mode 100644 index 0000000..2c75539 Binary files /dev/null and b/assets/uploads/vouchers/69ea9cbb80140-Screenshot_252.png differ diff --git a/assets/uploads/vouchers/69ea9d16b7ea6-Screenshot_30.png b/assets/uploads/vouchers/69ea9d16b7ea6-Screenshot_30.png new file mode 100644 index 0000000..44aa3a3 Binary files /dev/null and b/assets/uploads/vouchers/69ea9d16b7ea6-Screenshot_30.png differ diff --git a/assets/uploads/vouchers/69ea9d8fbefd2-Screenshot_31.png b/assets/uploads/vouchers/69ea9d8fbefd2-Screenshot_31.png new file mode 100644 index 0000000..531d5a7 Binary files /dev/null and b/assets/uploads/vouchers/69ea9d8fbefd2-Screenshot_31.png differ diff --git a/assets/uploads/vouchers/69ea9fffe1fc0-Screenshot_32.png b/assets/uploads/vouchers/69ea9fffe1fc0-Screenshot_32.png new file mode 100644 index 0000000..142930b Binary files /dev/null and b/assets/uploads/vouchers/69ea9fffe1fc0-Screenshot_32.png differ diff --git a/assets/uploads/vouchers/69eaa0856d529-Screenshot_33.png b/assets/uploads/vouchers/69eaa0856d529-Screenshot_33.png new file mode 100644 index 0000000..de5fab3 Binary files /dev/null and b/assets/uploads/vouchers/69eaa0856d529-Screenshot_33.png differ diff --git a/assets/uploads/vouchers/69eb7abb807d2-Screenshot_253.png b/assets/uploads/vouchers/69eb7abb807d2-Screenshot_253.png new file mode 100644 index 0000000..a22c6f1 Binary files /dev/null and b/assets/uploads/vouchers/69eb7abb807d2-Screenshot_253.png differ diff --git a/assets/uploads/vouchers/69eb7df68cdbf-Screenshot_253.png b/assets/uploads/vouchers/69eb7df68cdbf-Screenshot_253.png new file mode 100644 index 0000000..a22c6f1 Binary files /dev/null and b/assets/uploads/vouchers/69eb7df68cdbf-Screenshot_253.png differ diff --git a/assets/uploads/vouchers/69eba2148ab4d-Screenshot_34.png b/assets/uploads/vouchers/69eba2148ab4d-Screenshot_34.png new file mode 100644 index 0000000..7c7422b Binary files /dev/null and b/assets/uploads/vouchers/69eba2148ab4d-Screenshot_34.png differ diff --git a/assets/uploads/vouchers/69eba51397ecf-Screenshot_36.png b/assets/uploads/vouchers/69eba51397ecf-Screenshot_36.png new file mode 100644 index 0000000..993254a Binary files /dev/null and b/assets/uploads/vouchers/69eba51397ecf-Screenshot_36.png differ diff --git a/assets/uploads/vouchers/69ebaafbd9330-Screenshot_37.png b/assets/uploads/vouchers/69ebaafbd9330-Screenshot_37.png new file mode 100644 index 0000000..4a330bf Binary files /dev/null and b/assets/uploads/vouchers/69ebaafbd9330-Screenshot_37.png differ diff --git a/assets/uploads/vouchers/69ebf74c269f5-Screenshot_38.png b/assets/uploads/vouchers/69ebf74c269f5-Screenshot_38.png new file mode 100644 index 0000000..a01dfe2 Binary files /dev/null and b/assets/uploads/vouchers/69ebf74c269f5-Screenshot_38.png differ diff --git a/assets/uploads/vouchers/69ecd12524bd6-Screenshot_255.png b/assets/uploads/vouchers/69ecd12524bd6-Screenshot_255.png new file mode 100644 index 0000000..ad38d32 Binary files /dev/null and b/assets/uploads/vouchers/69ecd12524bd6-Screenshot_255.png differ diff --git a/assets/uploads/vouchers/69ece50d18860-Screenshot_39.png b/assets/uploads/vouchers/69ece50d18860-Screenshot_39.png new file mode 100644 index 0000000..d34118d Binary files /dev/null and b/assets/uploads/vouchers/69ece50d18860-Screenshot_39.png differ diff --git a/assets/uploads/vouchers/69ece60b5825f-Screenshot_256.png b/assets/uploads/vouchers/69ece60b5825f-Screenshot_256.png new file mode 100644 index 0000000..34cc269 Binary files /dev/null and b/assets/uploads/vouchers/69ece60b5825f-Screenshot_256.png differ diff --git a/assets/uploads/vouchers/69ecf26cbe3d6-Screenshot_257.png b/assets/uploads/vouchers/69ecf26cbe3d6-Screenshot_257.png new file mode 100644 index 0000000..63f24d0 Binary files /dev/null and b/assets/uploads/vouchers/69ecf26cbe3d6-Screenshot_257.png differ diff --git a/assets/uploads/vouchers/69ecf8e29bfa9-Screenshot_258.png b/assets/uploads/vouchers/69ecf8e29bfa9-Screenshot_258.png new file mode 100644 index 0000000..7716e22 Binary files /dev/null and b/assets/uploads/vouchers/69ecf8e29bfa9-Screenshot_258.png differ diff --git a/assets/uploads/vouchers/69ed0c224d8ae-510.png b/assets/uploads/vouchers/69ed0c224d8ae-510.png new file mode 100644 index 0000000..fd060b6 Binary files /dev/null and b/assets/uploads/vouchers/69ed0c224d8ae-510.png differ diff --git a/assets/uploads/vouchers/69ed15537eceb-Screenshot_259.png b/assets/uploads/vouchers/69ed15537eceb-Screenshot_259.png new file mode 100644 index 0000000..52422a8 Binary files /dev/null and b/assets/uploads/vouchers/69ed15537eceb-Screenshot_259.png differ diff --git a/assets/uploads/vouchers/69ed15eb90ad0-Screenshot_260.png b/assets/uploads/vouchers/69ed15eb90ad0-Screenshot_260.png new file mode 100644 index 0000000..754a364 Binary files /dev/null and b/assets/uploads/vouchers/69ed15eb90ad0-Screenshot_260.png differ diff --git a/assets/uploads/vouchers/69ed1800b6931-Screenshot_261.png b/assets/uploads/vouchers/69ed1800b6931-Screenshot_261.png new file mode 100644 index 0000000..1c7e494 Binary files /dev/null and b/assets/uploads/vouchers/69ed1800b6931-Screenshot_261.png differ diff --git a/assets/uploads/vouchers/69ed2d3b1031e-WhatsApp Image 2026-04-25 at 4.07.59 PM.jpeg b/assets/uploads/vouchers/69ed2d3b1031e-WhatsApp Image 2026-04-25 at 4.07.59 PM.jpeg new file mode 100644 index 0000000..a834a3e Binary files /dev/null and b/assets/uploads/vouchers/69ed2d3b1031e-WhatsApp Image 2026-04-25 at 4.07.59 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed2d7c1cdd3-WhatsApp Image 2026-04-25 at 4.09.07 PM.jpeg b/assets/uploads/vouchers/69ed2d7c1cdd3-WhatsApp Image 2026-04-25 at 4.09.07 PM.jpeg new file mode 100644 index 0000000..9a3fd78 Binary files /dev/null and b/assets/uploads/vouchers/69ed2d7c1cdd3-WhatsApp Image 2026-04-25 at 4.09.07 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed2dae2b79c-WhatsApp Image 2026-04-25 at 4.09.57 PM.jpeg b/assets/uploads/vouchers/69ed2dae2b79c-WhatsApp Image 2026-04-25 at 4.09.57 PM.jpeg new file mode 100644 index 0000000..a3ec4b7 Binary files /dev/null and b/assets/uploads/vouchers/69ed2dae2b79c-WhatsApp Image 2026-04-25 at 4.09.57 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed2df1744db-WhatsApp Image 2026-04-25 at 4.11.04 PM.jpeg b/assets/uploads/vouchers/69ed2df1744db-WhatsApp Image 2026-04-25 at 4.11.04 PM.jpeg new file mode 100644 index 0000000..fb4893e Binary files /dev/null and b/assets/uploads/vouchers/69ed2df1744db-WhatsApp Image 2026-04-25 at 4.11.04 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed2e62f3e94-WhatsApp Image 2026-04-25 at 4.12.56 PM.jpeg b/assets/uploads/vouchers/69ed2e62f3e94-WhatsApp Image 2026-04-25 at 4.12.56 PM.jpeg new file mode 100644 index 0000000..13530e3 Binary files /dev/null and b/assets/uploads/vouchers/69ed2e62f3e94-WhatsApp Image 2026-04-25 at 4.12.56 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed2e9be8658-WhatsApp Image 2026-04-25 at 4.13.52 PM.jpeg b/assets/uploads/vouchers/69ed2e9be8658-WhatsApp Image 2026-04-25 at 4.13.52 PM.jpeg new file mode 100644 index 0000000..65dd5fe Binary files /dev/null and b/assets/uploads/vouchers/69ed2e9be8658-WhatsApp Image 2026-04-25 at 4.13.52 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed2ee08df0e-WhatsApp Image 2026-04-25 at 4.15.02 PM.jpeg b/assets/uploads/vouchers/69ed2ee08df0e-WhatsApp Image 2026-04-25 at 4.15.02 PM.jpeg new file mode 100644 index 0000000..60e1864 Binary files /dev/null and b/assets/uploads/vouchers/69ed2ee08df0e-WhatsApp Image 2026-04-25 at 4.15.02 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed2f35dc7cd-WhatsApp Image 2026-04-25 at 4.16.27 PM.jpeg b/assets/uploads/vouchers/69ed2f35dc7cd-WhatsApp Image 2026-04-25 at 4.16.27 PM.jpeg new file mode 100644 index 0000000..be05dd5 Binary files /dev/null and b/assets/uploads/vouchers/69ed2f35dc7cd-WhatsApp Image 2026-04-25 at 4.16.27 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed2f704b614-WhatsApp Image 2026-04-25 at 4.17.26 PM.jpeg b/assets/uploads/vouchers/69ed2f704b614-WhatsApp Image 2026-04-25 at 4.17.26 PM.jpeg new file mode 100644 index 0000000..c0b7ab6 Binary files /dev/null and b/assets/uploads/vouchers/69ed2f704b614-WhatsApp Image 2026-04-25 at 4.17.26 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed2fc35ddce-WhatsApp Image 2026-04-25 at 4.18.45 PM.jpeg b/assets/uploads/vouchers/69ed2fc35ddce-WhatsApp Image 2026-04-25 at 4.18.45 PM.jpeg new file mode 100644 index 0000000..6ae3d43 Binary files /dev/null and b/assets/uploads/vouchers/69ed2fc35ddce-WhatsApp Image 2026-04-25 at 4.18.45 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed30064938b-WhatsApp Image 2026-04-25 at 4.19.45 PM.jpeg b/assets/uploads/vouchers/69ed30064938b-WhatsApp Image 2026-04-25 at 4.19.45 PM.jpeg new file mode 100644 index 0000000..890d27a Binary files /dev/null and b/assets/uploads/vouchers/69ed30064938b-WhatsApp Image 2026-04-25 at 4.19.45 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed3091e510a-WhatsApp Image 2026-04-25 at 4.22.13 PM.jpeg b/assets/uploads/vouchers/69ed3091e510a-WhatsApp Image 2026-04-25 at 4.22.13 PM.jpeg new file mode 100644 index 0000000..53f0611 Binary files /dev/null and b/assets/uploads/vouchers/69ed3091e510a-WhatsApp Image 2026-04-25 at 4.22.13 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed30cfe88f1-WhatsApp Image 2026-04-25 at 4.23.11 PM.jpeg b/assets/uploads/vouchers/69ed30cfe88f1-WhatsApp Image 2026-04-25 at 4.23.11 PM.jpeg new file mode 100644 index 0000000..10fe5ee Binary files /dev/null and b/assets/uploads/vouchers/69ed30cfe88f1-WhatsApp Image 2026-04-25 at 4.23.11 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed315651881-WhatsApp Image 2026-04-25 at 4.25.29 PM.jpeg b/assets/uploads/vouchers/69ed315651881-WhatsApp Image 2026-04-25 at 4.25.29 PM.jpeg new file mode 100644 index 0000000..438ce2a Binary files /dev/null and b/assets/uploads/vouchers/69ed315651881-WhatsApp Image 2026-04-25 at 4.25.29 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed318bb2627-WhatsApp Image 2026-04-25 at 4.26.24 PM.jpeg b/assets/uploads/vouchers/69ed318bb2627-WhatsApp Image 2026-04-25 at 4.26.24 PM.jpeg new file mode 100644 index 0000000..a294837 Binary files /dev/null and b/assets/uploads/vouchers/69ed318bb2627-WhatsApp Image 2026-04-25 at 4.26.24 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed31c51813a-WhatsApp Image 2026-04-25 at 4.27.19 PM.jpeg b/assets/uploads/vouchers/69ed31c51813a-WhatsApp Image 2026-04-25 at 4.27.19 PM.jpeg new file mode 100644 index 0000000..6e7ecb3 Binary files /dev/null and b/assets/uploads/vouchers/69ed31c51813a-WhatsApp Image 2026-04-25 at 4.27.19 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed320112d0d-WhatsApp Image 2026-04-25 at 4.28.20 PM.jpeg b/assets/uploads/vouchers/69ed320112d0d-WhatsApp Image 2026-04-25 at 4.28.20 PM.jpeg new file mode 100644 index 0000000..c5f34d7 Binary files /dev/null and b/assets/uploads/vouchers/69ed320112d0d-WhatsApp Image 2026-04-25 at 4.28.20 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed325336ec3-WhatsApp Image 2026-04-25 at 4.29.45 PM.jpeg b/assets/uploads/vouchers/69ed325336ec3-WhatsApp Image 2026-04-25 at 4.29.45 PM.jpeg new file mode 100644 index 0000000..9f7f8ff Binary files /dev/null and b/assets/uploads/vouchers/69ed325336ec3-WhatsApp Image 2026-04-25 at 4.29.45 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed32e8d5e86-WhatsApp Image 2026-04-25 at 4.32.12 PM.jpeg b/assets/uploads/vouchers/69ed32e8d5e86-WhatsApp Image 2026-04-25 at 4.32.12 PM.jpeg new file mode 100644 index 0000000..1da7aff Binary files /dev/null and b/assets/uploads/vouchers/69ed32e8d5e86-WhatsApp Image 2026-04-25 at 4.32.12 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed333bc3958-WhatsApp Image 2026-04-25 at 4.33.38 PM.jpeg b/assets/uploads/vouchers/69ed333bc3958-WhatsApp Image 2026-04-25 at 4.33.38 PM.jpeg new file mode 100644 index 0000000..6f07f32 Binary files /dev/null and b/assets/uploads/vouchers/69ed333bc3958-WhatsApp Image 2026-04-25 at 4.33.38 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed337dc97ad-WhatsApp Image 2026-04-25 at 4.34.42 PM.jpeg b/assets/uploads/vouchers/69ed337dc97ad-WhatsApp Image 2026-04-25 at 4.34.42 PM.jpeg new file mode 100644 index 0000000..ee4b99b Binary files /dev/null and b/assets/uploads/vouchers/69ed337dc97ad-WhatsApp Image 2026-04-25 at 4.34.42 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed33c3b401b-WhatsApp Image 2026-04-25 at 4.35.48 PM.jpeg b/assets/uploads/vouchers/69ed33c3b401b-WhatsApp Image 2026-04-25 at 4.35.48 PM.jpeg new file mode 100644 index 0000000..4d96678 Binary files /dev/null and b/assets/uploads/vouchers/69ed33c3b401b-WhatsApp Image 2026-04-25 at 4.35.48 PM.jpeg differ diff --git a/assets/uploads/vouchers/69ed41e4f2602-Screenshot_262.png b/assets/uploads/vouchers/69ed41e4f2602-Screenshot_262.png new file mode 100644 index 0000000..935e5fb Binary files /dev/null and b/assets/uploads/vouchers/69ed41e4f2602-Screenshot_262.png differ diff --git a/assets/uploads/vouchers/69ef74ac91c58-158.png b/assets/uploads/vouchers/69ef74ac91c58-158.png new file mode 100644 index 0000000..c781f1f Binary files /dev/null and b/assets/uploads/vouchers/69ef74ac91c58-158.png differ diff --git a/assets/uploads/vouchers/69ef8b17458dc-Screenshot_40.png b/assets/uploads/vouchers/69ef8b17458dc-Screenshot_40.png new file mode 100644 index 0000000..1886f3f Binary files /dev/null and b/assets/uploads/vouchers/69ef8b17458dc-Screenshot_40.png differ diff --git a/assets/uploads/vouchers/69ef8be0cf1b8-Screenshot_41.png b/assets/uploads/vouchers/69ef8be0cf1b8-Screenshot_41.png new file mode 100644 index 0000000..a9ad29b Binary files /dev/null and b/assets/uploads/vouchers/69ef8be0cf1b8-Screenshot_41.png differ diff --git a/assets/uploads/vouchers/69ef8c92b2743-Screenshot_42.png b/assets/uploads/vouchers/69ef8c92b2743-Screenshot_42.png new file mode 100644 index 0000000..844bf3f Binary files /dev/null and b/assets/uploads/vouchers/69ef8c92b2743-Screenshot_42.png differ diff --git a/assets/uploads/vouchers/69ef97515bb08-Screenshot_44.png b/assets/uploads/vouchers/69ef97515bb08-Screenshot_44.png new file mode 100644 index 0000000..2abccb0 Binary files /dev/null and b/assets/uploads/vouchers/69ef97515bb08-Screenshot_44.png differ diff --git a/assets/uploads/vouchers/69ef97b4a7508-Screenshot_45.png b/assets/uploads/vouchers/69ef97b4a7508-Screenshot_45.png new file mode 100644 index 0000000..695d1f3 Binary files /dev/null and b/assets/uploads/vouchers/69ef97b4a7508-Screenshot_45.png differ diff --git a/assets/uploads/vouchers/69efab10216f2-Screenshot_46.png b/assets/uploads/vouchers/69efab10216f2-Screenshot_46.png new file mode 100644 index 0000000..5a49fa5 Binary files /dev/null and b/assets/uploads/vouchers/69efab10216f2-Screenshot_46.png differ diff --git a/assets/uploads/vouchers/69efbacef3107-Screenshot_263.png b/assets/uploads/vouchers/69efbacef3107-Screenshot_263.png new file mode 100644 index 0000000..3e53bb4 Binary files /dev/null and b/assets/uploads/vouchers/69efbacef3107-Screenshot_263.png differ diff --git a/assets/uploads/vouchers/69efbef4dbd24-Screenshot_47.png b/assets/uploads/vouchers/69efbef4dbd24-Screenshot_47.png new file mode 100644 index 0000000..8431857 Binary files /dev/null and b/assets/uploads/vouchers/69efbef4dbd24-Screenshot_47.png differ diff --git a/assets/uploads/vouchers/69efe12e3745f-Screenshot_48.png b/assets/uploads/vouchers/69efe12e3745f-Screenshot_48.png new file mode 100644 index 0000000..cb08e29 Binary files /dev/null and b/assets/uploads/vouchers/69efe12e3745f-Screenshot_48.png differ diff --git a/completados.php b/completados.php index 8c1e2bd..36580d4 100644 --- a/completados.php +++ b/completados.php @@ -151,13 +151,14 @@ include 'layout_header.php'; Fecha Completado Voucher Restante Verificación de Pago + OBSERVACION Acciones - No hay pedidos completados que coincidan con el filtro. + No hay pedidos completados que coincidan con el filtro. @@ -231,6 +232,9 @@ include 'layout_header.php'; + + + Editar @@ -433,7 +437,7 @@ document.addEventListener('DOMContentLoaded', function() { }); } // Cierre de if (cell.classList.contains('editable-recojo')) - if (field === 'clave' || field === 'numero_operacion') { + if (field === 'clave' || field === 'numero_operacion' || field === 'observacion') { if (field === 'numero_operacion' && newValue !== '' && newValue.length < 6) { alert('El número de operación debe tener al menos 6 dígitos.'); cell.innerHTML = originalText === '' ? 'N/A' : originalText; diff --git a/db/migrations/054_add_observacion_to_pedidos.sql b/db/migrations/054_add_observacion_to_pedidos.sql new file mode 100644 index 0000000..f407eee --- /dev/null +++ b/db/migrations/054_add_observacion_to_pedidos.sql @@ -0,0 +1,2 @@ +-- Add observacion column to pedidos table +ALTER TABLE pedidos ADD COLUMN observacion TEXT NULL; diff --git a/db/migrations/055_add_codigo_unico_to_stock_movements.sql b/db/migrations/055_add_codigo_unico_to_stock_movements.sql new file mode 100644 index 0000000..e1b4034 --- /dev/null +++ b/db/migrations/055_add_codigo_unico_to_stock_movements.sql @@ -0,0 +1,4 @@ +-- Migration: Add codigo_unico to stock_movements +-- Description: Adds a column to store the specific barcode/unique code for a movement if applicable. + +ALTER TABLE stock_movements ADD COLUMN codigo_unico VARCHAR(255) DEFAULT NULL AFTER type; diff --git a/db/migrations/064_update_tipo_paquete_enum.sql b/db/migrations/064_update_tipo_paquete_enum.sql new file mode 100644 index 0000000..6d299e0 --- /dev/null +++ b/db/migrations/064_update_tipo_paquete_enum.sql @@ -0,0 +1,2 @@ +-- Migration to add new options to tipo_paquete ENUM in pedidos table +ALTER TABLE pedidos MODIFY COLUMN tipo_paquete ENUM('RUTA', 'CONTRAENTREGA', 'NO CONTESTA', 'VOLVER A LLAMAR', 'PENDIENTE A RETORNO') DEFAULT NULL; diff --git a/db/migrations/065_merge_no_contesta_options.sql b/db/migrations/065_merge_no_contesta_options.sql new file mode 100644 index 0000000..012a99e --- /dev/null +++ b/db/migrations/065_merge_no_contesta_options.sql @@ -0,0 +1,6 @@ +-- Migration to merge 'NO CONTESTA' and 'VOLVER A LLAMAR' into a single option +ALTER TABLE pedidos MODIFY COLUMN tipo_paquete ENUM('RUTA', 'CONTRAENTREGA', 'NO CONTESTA', 'VOLVER A LLAMAR', 'PENDIENTE A RETORNO', 'NO CONTESTA, VOLVER A LLAMAR') DEFAULT NULL; + +UPDATE pedidos SET tipo_paquete = 'NO CONTESTA, VOLVER A LLAMAR' WHERE tipo_paquete IN ('NO CONTESTA', 'VOLVER A LLAMAR'); + +ALTER TABLE pedidos MODIFY COLUMN tipo_paquete ENUM('RUTA', 'CONTRAENTREGA', 'NO CONTESTA, VOLVER A LLAMAR', 'PENDIENTE A RETORNO') DEFAULT NULL; diff --git a/panel_inventario.php b/panel_inventario.php index fc961c1..aa04153 100644 --- a/panel_inventario.php +++ b/panel_inventario.php @@ -99,17 +99,46 @@ try { $producto_chart_labels = json_encode(array_column($stock_por_producto, 'nombre')); $producto_chart_data = json_encode(array_column($stock_por_producto, 'total_stock')); - // 4. Datos para el historial de movimientos (últimos 50) - $movements_stmt = $pdo->query(" - SELECT sm.movement_date, p.nombre as product_name, s.nombre as sede_name, sm.quantity, sm.type, sm.metodo_registro + // 4. Datos para el historial de movimientos + $fecha_filtro = $_GET['fecha'] ?? ''; + $where_clause = ""; + $params = []; + + if (!empty($fecha_filtro)) { + $where_clause = " WHERE DATE(sm.movement_date) = :fecha "; + $params[':fecha'] = $fecha_filtro; + $limit = 500; // Aumentar límite si se filtra por fecha + } else { + $limit = 50; + } + + $query = " + SELECT sm.movement_date, p.nombre as product_name, s.nombre as sede_name, sm.quantity, sm.type, sm.codigo_unico, sm.metodo_registro FROM stock_movements sm JOIN products p ON sm.product_id = p.id JOIN sedes s ON sm.sede_id = s.id + $where_clause ORDER BY sm.created_at DESC - LIMIT 50 - "); + LIMIT $limit + "; + + $movements_stmt = $pdo->prepare($query); + $movements_stmt->execute($params); $movements = $movements_stmt->fetchAll(PDO::FETCH_ASSOC); + // 5. Resumen de salidas de hoy + $hoy = date('Y-m-d'); + $resumen_salidas_stmt = $pdo->prepare(" + SELECT p.nombre, SUM(sm.quantity) as total_salida + FROM stock_movements sm + JOIN products p ON sm.product_id = p.id + WHERE sm.type = 'salida' AND DATE(sm.movement_date) = :hoy + GROUP BY p.nombre + ORDER BY total_salida DESC + "); + $resumen_salidas_stmt->execute([':hoy' => $hoy]); + $resumen_salidas = $resumen_salidas_stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { echo "
Error al conectar o consultar la base de datos: " . $e->getMessage() . "
"; require_once 'layout_footer.php'; @@ -217,9 +246,45 @@ try { + +
+
+
Resumen de Salidas de Hoy ()
+ Productos +
+
+ +

No se han registrado salidas el día de hoy.

+ +
+ +
+
+ + + + +
+
+ +
+ +
+
+
-
Historial de Movimientos Recientes
+
+
Historial de Movimientos
+
+ + + + + Limpiar + +
+
@@ -230,12 +295,13 @@ try { + - + @@ -250,6 +316,9 @@ try { Salida + diff --git a/pedido_form.php b/pedido_form.php index a3ddfe1..f5f556c 100644 --- a/pedido_form.php +++ b/pedido_form.php @@ -267,6 +267,11 @@ include 'layout_header.php'; +
+ + +
+ Cancelar diff --git a/registrar_entrada_api.php b/registrar_entrada_api.php index 2957eca..aee87c2 100644 --- a/registrar_entrada_api.php +++ b/registrar_entrada_api.php @@ -56,13 +56,14 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') { // 4. Insertar en el historial de movimientos $history_stmt = $pdo->prepare( - "INSERT INTO stock_movements (product_id, sede_id, quantity, type, movement_date, borrador_id, metodo_registro) - VALUES (:product_id, :sede_id, :quantity, 'entrada', :movement_date, :borrador_id, 'Código de Barras')" + "INSERT INTO stock_movements (product_id, sede_id, quantity, type, codigo_unico, movement_date, borrador_id, metodo_registro) + VALUES (:product_id, :sede_id, :quantity, 'entrada', :codigo_unico, :movement_date, :borrador_id, 'Código de Barras')" ); $history_stmt->execute([ 'product_id' => $product_id, 'sede_id' => $sede_id, 'quantity' => $quantity, + 'codigo_unico' => $codigo_unico, 'movement_date' => $movement_date, 'borrador_id' => $borrador_id ]); diff --git a/registrar_salida_unidad_api.php b/registrar_salida_unidad_api.php index eefa2c1..3e96a1e 100644 --- a/registrar_salida_unidad_api.php +++ b/registrar_salida_unidad_api.php @@ -62,13 +62,14 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") { } $history_stmt = $pdo->prepare( - "INSERT INTO stock_movements (product_id, sede_id, quantity, type, movement_date, metodo_registro) - VALUES (:product_id, :sede_id, :quantity, 'salida', :movement_date, 'Código de Barras')" + "INSERT INTO stock_movements (product_id, sede_id, quantity, type, codigo_unico, movement_date, metodo_registro) + VALUES (:product_id, :sede_id, :quantity, 'salida', :codigo_unico, :movement_date, 'Código de Barras')" ); $history_stmt->execute([ 'product_id' => $product_id, 'sede_id' => $sede_id, 'quantity' => $quantity, + 'codigo_unico' => $codigo_unico, 'movement_date' => $movement_date ]); diff --git a/registro_entrada.php b/registro_entrada.php index 8511498..14d80b5 100644 --- a/registro_entrada.php +++ b/registro_entrada.php @@ -25,6 +25,46 @@ try { $borrador = $stmt_borrador->fetch(PDO::FETCH_ASSOC); } + // --- Lógica para el Historial de Entradas --- + $fecha_filtro = $_GET['fecha'] ?? ''; + $where_clause = " WHERE sm.type = 'entrada' "; + $params = []; + + if (!empty($fecha_filtro)) { + $where_clause .= " AND DATE(sm.movement_date) = :fecha "; + $params[':fecha'] = $fecha_filtro; + $limit = 500; + } else { + $limit = 50; + } + + $query = " + SELECT sm.movement_date, p.nombre as product_name, s.nombre as sede_name, sm.quantity, sm.type, sm.codigo_unico, sm.metodo_registro + FROM stock_movements sm + JOIN products p ON sm.product_id = p.id + JOIN sedes s ON sm.sede_id = s.id + $where_clause + ORDER BY sm.created_at DESC + LIMIT $limit + "; + + $movements_stmt = $pdo->prepare($query); + $movements_stmt->execute($params); + $movements = $movements_stmt->fetchAll(PDO::FETCH_ASSOC); + + // --- Resumen de Entradas de Hoy --- + $hoy = date('Y-m-d'); + $resumen_entradas_stmt = $pdo->prepare(" + SELECT p.nombre, SUM(sm.quantity) as total_entrada + FROM stock_movements sm + JOIN products p ON sm.product_id = p.id + WHERE sm.type = 'entrada' AND DATE(sm.movement_date) = :hoy + GROUP BY p.nombre + ORDER BY total_entrada DESC + "); + $resumen_entradas_stmt->execute([':hoy' => $hoy]); + $resumen_entradas = $resumen_entradas_stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { $error_page_load = "Error al cargar datos iniciales: " . $e->getMessage(); } @@ -147,6 +187,91 @@ try { + + +
+
+
+
+
Resumen de Entradas de Hoy ()
+ Productos +
+
+ +

No se han registrado entradas el día de hoy.

+ +
+ +
+
+ + + + +
+
+ +
+ +
+
+
+
+ + +
+
+
+
+
Historial de Entradas
+
+ + + + + Limpiar + + +
+
+
+
Sede Cantidad TipoCódigo Método
No hay movimientos registrados.
No hay movimientos registrados.
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
FechaProductoSedeCantidadCódigoMétodo
No hay entradas registradas.
+ + + +
+
+
+
+ + @@ -239,6 +364,28 @@ document.addEventListener('DOMContentLoaded', (event) => { document.getElementById(toastId).addEventListener('hidden.bs.toast', e => e.target.remove()); } + // --- ACTUALIZACIÓN EN TIEMPO REAL --- + function refreshHistoryAndSummary() { + const currentUrl = window.location.href; + fetch(currentUrl) + .then(response => response.text()) + .then(html => { + const parser = new DOMParser(); + const doc = parser.parseFromString(html, 'text/html'); + + const newSummary = doc.getElementById('resumen-hoy-container'); + const newHistory = doc.getElementById('historial-container'); + + if (newSummary) { + document.getElementById('resumen-hoy-container').innerHTML = newSummary.innerHTML; + } + if (newHistory) { + document.getElementById('historial-container').innerHTML = newHistory.innerHTML; + } + }) + .catch(error => console.error('Error al actualizar el historial:', error)); + } + // --- PESTAÑA: CÓDIGO DE BARRAS --- // ** Lógica de Cámara ** @@ -313,6 +460,7 @@ document.addEventListener('DOMContentLoaded', (event) => { .then(data => { if (data.success) { showNotification(data.message, true); + refreshHistoryAndSummary(); } else { throw new Error(data.message || 'Error desconocido.'); } @@ -354,6 +502,7 @@ document.addEventListener('DOMContentLoaded', (event) => { showNotification(data.message, true); playBeep(true); manualForm.reset(); + refreshHistoryAndSummary(); } else { throw new Error(data.message || 'Error desconocido al registrar la entrada.'); } diff --git a/registro_salida.php b/registro_salida.php index c4106fd..5039a4e 100644 --- a/registro_salida.php +++ b/registro_salida.php @@ -26,6 +26,46 @@ try { $products_stmt = $pdo->query("SELECT id, nombre, sku FROM products ORDER BY nombre ASC"); $products = $products_stmt->fetchAll(PDO::FETCH_ASSOC); + // --- Lógica para el Historial de Salidas --- + $fecha_filtro = $_GET['fecha'] ?? ''; + $where_clause = " WHERE sm.type = 'salida' "; + $params = []; + + if (!empty($fecha_filtro)) { + $where_clause .= " AND DATE(sm.movement_date) = :fecha "; + $params[':fecha'] = $fecha_filtro; + $limit = 500; + } else { + $limit = 50; + } + + $query = " + SELECT sm.movement_date, p.nombre as product_name, s.nombre as sede_name, sm.quantity, sm.type, sm.codigo_unico, sm.metodo_registro + FROM stock_movements sm + JOIN products p ON sm.product_id = p.id + JOIN sedes s ON sm.sede_id = s.id + $where_clause + ORDER BY sm.created_at DESC + LIMIT $limit + "; + + $movements_stmt = $pdo->prepare($query); + $movements_stmt->execute($params); + $movements = $movements_stmt->fetchAll(PDO::FETCH_ASSOC); + + // --- Resumen de Salidas de Hoy --- + $hoy = date('Y-m-d'); + $resumen_salidas_stmt = $pdo->prepare(" + SELECT p.nombre, SUM(sm.quantity) as total_salida + FROM stock_movements sm + JOIN products p ON sm.product_id = p.id + WHERE sm.type = 'salida' AND DATE(sm.movement_date) = :hoy + GROUP BY p.nombre + ORDER BY total_salida DESC + "); + $resumen_salidas_stmt->execute([':hoy' => $hoy]); + $resumen_salidas = $resumen_salidas_stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { $error_page_load = "Error al cargar datos iniciales: " . $e->getMessage(); } @@ -131,6 +171,91 @@ try { + + +
+
+
+
+
Resumen de Salidas de Hoy ()
+ Productos +
+
+ +

No se han registrado salidas el día de hoy.

+ +
+ +
+
+ + + + +
+
+ +
+ +
+
+
+
+ + +
+
+
+
+
Historial de Salidas
+
+ + + + + Limpiar + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
FechaProductoSedeCantidadCódigoMétodo
No hay salidas registradas.
+ + + +
+
+
+
+
+
@@ -218,6 +343,28 @@ document.addEventListener('DOMContentLoaded', (event) => { document.getElementById(toastId).addEventListener('hidden.bs.toast', e => e.target.remove()); } + // --- ACTUALIZACIÓN EN TIEMPO REAL --- + function refreshHistoryAndSummary() { + const currentUrl = window.location.href; + fetch(currentUrl) + .then(response => response.text()) + .then(html => { + const parser = new DOMParser(); + const doc = parser.parseFromString(html, 'text/html'); + + const newSummary = doc.getElementById('resumen-hoy-container'); + const newHistory = doc.getElementById('historial-container'); + + if (newSummary) { + document.getElementById('resumen-hoy-container').innerHTML = newSummary.innerHTML; + } + if (newHistory) { + document.getElementById('historial-container').innerHTML = newHistory.innerHTML; + } + }) + .catch(error => console.error('Error al actualizar el historial:', error)); + } + // --- LÓGICA PARA MÓVIL (SOLO PESTAÑA CÓDIGO DE BARRAS) --- if (isMobile && almacenPrincipalId) { if(sedeContainer) sedeContainer.style.display = 'none'; @@ -281,6 +428,7 @@ document.addEventListener('DOMContentLoaded', (event) => { .then(data => { if (data.success) { showNotification(data.message, true); + refreshHistoryAndSummary(); } else { throw new Error(data.message || 'Error desconocido.'); } @@ -327,6 +475,7 @@ document.addEventListener('DOMContentLoaded', (event) => { showNotification(data.message, true); playBeep(true); manualExitForm.reset(); + refreshHistoryAndSummary(); } else { throw new Error(data.message || 'Error desconocido.'); } diff --git a/ruta_contraentrega.php b/ruta_contraentrega.php index 2f705e6..09ff45a 100644 --- a/ruta_contraentrega.php +++ b/ruta_contraentrega.php @@ -46,6 +46,8 @@ function getStatusStyle($status) { function getPaqueteStyle($paquete) { if ($paquete === 'RUTA') return 'background-color: #0dcaf0; color: black;'; // Info cyan if ($paquete === 'CONTRAENTREGA') return 'background-color: #ffc107; color: black;'; // Warning yellow + if ($paquete === 'NO CONTESTA, VOLVER A LLAMAR') return 'background-color: #fd7e14; color: white;'; // Orange + if ($paquete === 'PENDIENTE A RETORNO') return 'background-color: #dc3545; color: white;'; // Red return 'background-color: #6c757d; color: white;'; // Secondary grey } @@ -291,6 +293,8 @@ include 'layout_header.php'; function getPaqueteStyleJS(paquete) { if (paquete === 'RUTA') return 'background-color: #0dcaf0; color: black;'; if (paquete === 'CONTRAENTREGA') return 'background-color: #ffc107; color: black;'; + if (paquete === 'NO CONTESTA, VOLVER A LLAMAR') return 'background-color: #fd7e14; color: white;'; + if (paquete === 'PENDIENTE A RETORNO') return 'background-color: #dc3545; color: white;'; return 'background-color: #6c757d; color: white;'; } @@ -329,7 +333,9 @@ document.addEventListener('DOMContentLoaded', function() { const options = [ {val: '', text: 'Seleccionar'}, {val: 'RUTA', text: 'RUTA'}, - {val: 'CONTRAENTREGA', text: 'CONTRAENTREGA'} + {val: 'CONTRAENTREGA', text: 'CONTRAENTREGA'}, + {val: 'NO CONTESTA, VOLVER A LLAMAR', text: 'NO CONTESTA, VOLVER A LLAMAR'}, + {val: 'PENDIENTE A RETORNO', text: 'PENDIENTE A RETORNO'} ]; options.forEach(opt => { diff --git a/save_pedido.php b/save_pedido.php index 1298e7b..e0854b0 100644 --- a/save_pedido.php +++ b/save_pedido.php @@ -81,6 +81,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $banco = trim($_POST['banco'] ?? ''); $estado = $_POST['estado']; $notas = trim($_POST['notas']); + $observacion = trim($_POST['observacion'] ?? ''); if (!empty($productos_detalle)) { $notas .= "\n\n" . $notas_adicionales; @@ -149,6 +150,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { 'monto_debe' => $monto_debe, 'estado' => $estado, 'notas' => $notas, + 'observacion' => $observacion, 'voucher_adelanto_path' => $voucher_adelanto_path, 'voucher_restante_path' => $voucher_restante_path ]; @@ -176,6 +178,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { "monto_debe = :monto_debe", "estado = :estado", "notas = :notas", + "observacion = :observacion", "voucher_adelanto_path = :voucher_adelanto_path", "voucher_restante_path = :voucher_restante_path" ]; @@ -228,8 +231,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { // INSERT: The advisor is the user creating the order. $params['asesor_id'] = $_SESSION['user_id']; - $columns_sql = "dni_cliente, nombre_completo, celular, sede_envio, codigo_rastreo, codigo_tracking, clave, pendientes, producto, cantidad, monto_total, monto_adelantado, numero_operacion, banco, monto_debe, estado, asesor_id, notas, voucher_adelanto_path, voucher_restante_path"; - $values_sql = ":dni_cliente, :nombre_completo, :celular, :sede_envio, :codigo_rastreo, :codigo_tracking, :clave, :pendientes, :producto, :cantidad, :monto_total, :monto_adelantado, :numero_operacion, :banco, :monto_debe, :estado, :asesor_id, :notas, :voucher_adelanto_path, :voucher_restante_path"; + $columns_sql = "dni_cliente, nombre_completo, celular, sede_envio, codigo_rastreo, codigo_tracking, clave, pendientes, producto, cantidad, monto_total, monto_adelantado, numero_operacion, banco, monto_debe, estado, asesor_id, notas, observacion, voucher_adelanto_path, voucher_restante_path"; + $values_sql = ":dni_cliente, :nombre_completo, :celular, :sede_envio, :codigo_rastreo, :codigo_tracking, :clave, :pendientes, :producto, :cantidad, :monto_total, :monto_adelantado, :numero_operacion, :banco, :monto_debe, :estado, :asesor_id, :notas, :observacion, :voucher_adelanto_path, :voucher_restante_path"; $completed_states = ['Completado', 'COMPLETADO ✅']; if (in_array($estado, $completed_states)) { diff --git a/update_paquete.php b/update_paquete.php index 4fb6c17..f1d0d75 100644 --- a/update_paquete.php +++ b/update_paquete.php @@ -26,7 +26,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $stmt = $pdo->prepare("UPDATE pedidos SET tipo_paquete = NULL WHERE id = ?"); $result = $stmt->execute([$pedido_id]); } else { - $valid_types = ['RUTA', 'CONTRAENTREGA']; + $valid_types = ['RUTA', 'CONTRAENTREGA', 'NO CONTESTA, VOLVER A LLAMAR', 'PENDIENTE A RETORNO']; if (!in_array($tipo_paquete, $valid_types)) { echo json_encode(['success' => false, 'message' => 'Tipo inválido']); exit; diff --git a/update_pedido_field.php b/update_pedido_field.php index c6484d2..5d1196e 100644 --- a/update_pedido_field.php +++ b/update_pedido_field.php @@ -21,7 +21,7 @@ $field = $data['field']; $value = $data['value']; // Whitelist allowed fields for security -$allowed_fields = ['numero_operacion', 'banco', 'clave', 'fecha_recojo']; +$allowed_fields = ['numero_operacion', 'banco', 'clave', 'fecha_recojo', 'observacion']; if (!in_array($field, $allowed_fields)) { http_response_code(400); echo json_encode(['error' => 'Campo no permitido.']);