corte_caja.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. <?php
  2. if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
  3. header("Access-Control-Allow-Origin: *");
  4. header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
  5. header("Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With");
  6. http_response_code(204); // Sin contenido
  7. exit;
  8. }
  9. header("Access-Control-Allow-Origin: *");
  10. header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");
  11. header("Access-Control-Allow-Headers: Content-Type, Authorization");
  12. error_reporting(E_ALL);
  13. ini_set('display_errors', 0);
  14. ini_set('log_errors', 1);
  15. ini_set('error_log', '/logs/error.log');
  16. require __DIR__ . '/../vendor/autoload.php';
  17. use Mike42\Escpos\Printer;
  18. use Mike42\Escpos\PrintConnectors\WindowsPrintConnector;
  19. use Mike42\Escpos\EscposImage;
  20. use Mike42\Escpos\PrintConnectors\FilePrintConnector;
  21. // Helper functions to replace php_printer functionality
  22. function cutString($text, $maxLength) {
  23. return substr($text, 0, $maxLength);
  24. }
  25. function printLine($printer, $text, $width = 48) {
  26. $printer->text(str_pad($text, $width) . "\n");
  27. }
  28. function printAlignedText($printer, $leftText, $rightText, $width = 48) {
  29. $rightLen = strlen($rightText);
  30. $leftLen = $width - $rightLen;
  31. $leftPadded = str_pad($leftText, $leftLen, " ", STR_PAD_RIGHT);
  32. $printer->text($leftPadded . $rightText . "\n");
  33. }
  34. function printSeparatorLine($printer, $char = "-", $width = 48) {
  35. $printer->text(str_repeat($char, $width) . "\n");
  36. }
  37. // Check if this is a POST request with corte data
  38. $dataPrint = null;
  39. if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST["dataPrint"])) {
  40. $dataPrint = json_decode($_POST["dataPrint"], true);
  41. // Log para depuración
  42. error_log("=== DATOS RECIBIDOS EN CORTE_8.PHP ===");
  43. error_log("dataPrint completo: " . print_r($dataPrint, true));
  44. }
  45. // If no POST data, assume variables are already set (for CodeIgniter compatibility)
  46. if ($dataPrint) {
  47. // Extract data from POST
  48. $printCorteFiscal = $dataPrint['printCorteFiscal'] ?? true;
  49. $PRINTER_NAME = $dataPrint['printer'] ?? 'POS-80C';
  50. $numero_corte = $dataPrint['numero_corte'] ?? '';
  51. $nombre_empresa = $dataPrint['nombre_empresa'] ?? '';
  52. $rsocial_empresa = $dataPrint['rsocial_empresa'] ?? '';
  53. $direcion_empresa = $dataPrint['direcion_empresa'] ?? '';
  54. $nrc_empresa = $dataPrint['nrc_empresa'] ?? '';
  55. $nit_empresa = $dataPrint['nit_empresa'] ?? '';
  56. $doc_resolucion = $dataPrint['doc_resolucion'] ?? '';
  57. $doc_desde = $dataPrint['doc_desde'] ?? '';
  58. $doc_hasta = $dataPrint['doc_hasta'] ?? '';
  59. $cajero = $dataPrint['cajero'] ?? '';
  60. $tipo_corte = $dataPrint['tipo_corte'] ?? '';
  61. $fecha = $dataPrint['fecha'] ?? '';
  62. $dotacion = $dataPrint['dotacion'] ?? 0;
  63. $dataCorteFiscal = $dataPrint['dataCorteFiscal'] ?? [];
  64. // Log de dataCorteFiscal y dotacion
  65. error_log("dataCorteFiscal: " . print_r($dataCorteFiscal, true));
  66. error_log("Dotacion recibida en corte.php: " . $dotacion);
  67. error_log("Dotacion en dataCorteFiscal['dotacion']: " . (isset($dataCorteFiscal['dotacion']) ? $dataCorteFiscal['dotacion'] : 'NO EXISTE'));
  68. }
  69. if ($printCorteFiscal && !empty($dataCorteFiscal)) {
  70. try {
  71. $connector = new WindowsPrintConnector($PRINTER_NAME);
  72. $printer = new Printer($connector);
  73. // COMPANY HEADER
  74. $printer->setJustification(Printer::JUSTIFY_CENTER);
  75. $printer->setTextSize(2, 2);
  76. $printer->text(cutString(strtoupper($nombre_empresa), 21) . "\n");
  77. $printer->setTextSize(1, 1);
  78. $printer->text(cutString(strtoupper($rsocial_empresa), 45) . "\n");
  79. $printer->text(cutString(strtoupper($direcion_empresa), 45) . "\n");
  80. $printer->text(cutString(strtoupper("NRC: " . $nrc_empresa), 45) . "\n");
  81. $printer->text(cutString(strtoupper("NIT: " . $nit_empresa), 45) . "\n");
  82. $printer->text(cutString(strtoupper("Vendedor: " . $cajero), 45) . "\n");
  83. $printer->text("\n");
  84. $printer->setEmphasis(true);
  85. $printer->text(cutString(strtoupper("TOTAL " . $tipo_corte), 45) . "\n");
  86. $printer->setEmphasis(false);
  87. $printer->text("\n");
  88. $printer->text(cutString("Reporte No: " . $numero_corte, 45) . "\n");
  89. printSeparatorLine($printer);
  90. // TICKETS SECTION
  91. $printer->setJustification(Printer::JUSTIFY_LEFT);
  92. printAlignedText($printer, "Total Gravadas:", "$" . number_format($dataCorteFiscal['total_ticket_grabado'] ?? 0, 2));
  93. printAlignedText($printer, "Total Exentas:", "$" . number_format($dataCorteFiscal['total_ticket_exento'] ?? 0, 2));
  94. printAlignedText($printer, "Total No Sujeto:", "$" . number_format($dataCorteFiscal['total_ticket_nosujeto'] ?? 0, 2));
  95. $total_tickets = ($dataCorteFiscal['total_ticket_grabado'] ?? 0) + ($dataCorteFiscal['total_ticket_exento'] ?? 0) + ($dataCorteFiscal['total_ticket_nosujeto'] ?? 0);
  96. printAlignedText($printer, "Total Tickets:", "$" . number_format($total_tickets, 2));
  97. printSeparatorLine($printer);
  98. // FACTURA SECTION
  99. $total_factura = ($dataCorteFiscal['total_factura_grabado'] ?? 0) + ($dataCorteFiscal['total_factura_exento'] ?? 0) + ($dataCorteFiscal['total_factura_nosujeto'] ?? 0);
  100. printAlignedText($printer, "Total Facturas:", "$" . number_format($total_factura, 2));
  101. printSeparatorLine($printer);
  102. printAlignedText($printer, "Total Gravadas:", "$" . number_format($dataCorteFiscal['total_factura_grabado'] ?? 0, 2));
  103. printAlignedText($printer, "Total Exentas:", "$" . number_format($dataCorteFiscal['total_factura_exento'] ?? 0, 2));
  104. printAlignedText($printer, "Total No Sujeto:", "$" . number_format($dataCorteFiscal['total_factura_nosujeto'] ?? 0, 2));
  105. printSeparatorLine($printer);
  106. // CCF SECTION
  107. $total_ccf = ($dataCorteFiscal['total_ccf_grabado'] ?? 0) + ($dataCorteFiscal['total_ccf_exento'] ?? 0) + ($dataCorteFiscal['total_ccf_nosujeto'] ?? 0);
  108. printAlignedText($printer, "Total CCF:", "$" . number_format($total_ccf, 2));
  109. printSeparatorLine($printer);
  110. printAlignedText($printer, "Total Gravadas:", "$" . number_format($dataCorteFiscal['total_ccf_grabado'] ?? 0, 2));
  111. printAlignedText($printer, "Total Exentas:", "$" . number_format($dataCorteFiscal['total_ccf_exento'] ?? 0, 2));
  112. printAlignedText($printer, "Total No Sujeto:", "$" . number_format($dataCorteFiscal['total_ccf_nosujeto'] ?? 0, 2));
  113. printSeparatorLine($printer);
  114. // DEVOLUCIONES SECTION
  115. $total_devs = ($dataCorteFiscal['total_devolucion_ticket'] ?? 0) + ($dataCorteFiscal['total_devolucion_factura'] ?? 0) +
  116. ($dataCorteFiscal['total_devolucion_ccf'] ?? 0) + ($dataCorteFiscal['total_devolucion_ncredito'] ?? 0);
  117. printAlignedText($printer, "Total Devoluciones:", "($" . number_format($total_devs, 2) . ")");
  118. printSeparatorLine($printer);
  119. printAlignedText($printer, "Dev. Tickets:", "$" . number_format($dataCorteFiscal['total_devolucion_ticket'] ?? 0, 2));
  120. printAlignedText($printer, "Anulacion Fac.:", "$" . number_format($dataCorteFiscal['total_devolucion_factura'] ?? 0, 2));
  121. printAlignedText($printer, "Anulacion CCF:", "$" . number_format($dataCorteFiscal['total_devolucion_ccf'] ?? 0, 2));
  122. printAlignedText($printer, "Anulacion N de Cred:", "$" . number_format($dataCorteFiscal['total_devolucion_ncredito'] ?? 0, 2));
  123. printSeparatorLine($printer);
  124. // RECIBOS SECTION
  125. if (isset($dataCorteFiscal['total_recibo']) && $dataCorteFiscal['total_recibo'] > 0) {
  126. printAlignedText($printer, "Total Recibos:", "$" . number_format($dataCorteFiscal['total_recibo'], 2));
  127. printSeparatorLine($printer);
  128. if (isset($dataCorteFiscal['total_trans_recibo']) && $dataCorteFiscal['total_trans_recibo'] > 0) {
  129. printAlignedText($printer, "Recibos Emitidos:", (string)$dataCorteFiscal['total_trans_recibo']);
  130. printSeparatorLine($printer);
  131. }
  132. }
  133. // PROPINA TOTAL
  134. $total_propina_general = ($dataCorteFiscal['total_propina'] ?? 0) + ($dataCorteFiscal['total_propina_pos'] ?? 0);
  135. printAlignedText($printer, "Total Propina:", "$" . number_format($total_propina_general, 2));
  136. printSeparatorLine($printer);
  137. // TOTAL EN VENTAS
  138. $total_recibo_val = isset($dataCorteFiscal['total_recibo_sin_propina']) ? $dataCorteFiscal['total_recibo_sin_propina'] : (isset($dataCorteFiscal['total_recibo']) ? $dataCorteFiscal['total_recibo'] : 0);
  139. $total_en_ventas = $total_propina_general + $total_factura + $total_ccf + $total_recibo_val - $total_devs;
  140. $printer->setEmphasis(true);
  141. printAlignedText($printer, "TOTAL EN VENTAS:", "$" . number_format($total_en_ventas, 2));
  142. $printer->setEmphasis(false);
  143. printSeparatorLine($printer);
  144. // CONTADORES DE DOCUMENTOS
  145. printAlignedText($printer, "Facturas Emitidas:", (string)($dataCorteFiscal['total_trans_factura'] ?? 0));
  146. printAlignedText($printer, "CCF Emitidos:", (string)($dataCorteFiscal['total_trans_ccf'] ?? 0));
  147. $trans_realizadas = ($dataCorteFiscal['total_trans_factura'] ?? 0) + ($dataCorteFiscal['total_trans_ccf'] ?? 0) +
  148. ($dataCorteFiscal['total_trans_ncredito'] ?? 0) + ($dataCorteFiscal['total_trans_ticket'] ?? 0) +
  149. ($dataCorteFiscal['total_trans_ticket_dev'] ?? 0);
  150. printAlignedText($printer, "Transacciones realizadas:", (string)$trans_realizadas);
  151. printSeparatorLine($printer);
  152. // TOTAL VENTAS EFECTIVO + PROPINA
  153. printAlignedText($printer, "Total Efectivo + Propina:", "$" . number_format($dataCorteFiscal['total_ventas_efectivo'] ?? 0, 2));
  154. printSeparatorLine($printer);
  155. // TOTAL EN EFECTIVO CC
  156. printAlignedText($printer, "Total Efectivo CC:", "$" . number_format($dataCorteFiscal['total_ventas_efectivo_cc'] ?? 0, 2));
  157. printSeparatorLine($printer);
  158. // TOTAL PROPINA EN EFECTIVO
  159. printAlignedText($printer, "Total Propina Efectivo:", "$" . number_format($dataCorteFiscal['total_propina'] ?? 0, 2));
  160. printSeparatorLine($printer);
  161. // TOTAL VENTAS POS + PROPINA
  162. printAlignedText($printer, "Total POS + Propina:", "$" . number_format($dataCorteFiscal['total_ventas_pos'] ?? 0, 2));
  163. printSeparatorLine($printer);
  164. // TOTAL EN POS CC
  165. printAlignedText($printer, "Total POS CC:", "$" . number_format($dataCorteFiscal['total_ventas_pos_cc'] ?? 0, 2));
  166. printSeparatorLine($printer);
  167. // TOTAL PROPINA POS
  168. printAlignedText($printer, "Total Propina POS:", "$" . number_format($dataCorteFiscal['total_propina_pos'] ?? 0, 2));
  169. printSeparatorLine($printer);
  170. // CAJA CHICA
  171. $total_caja_chica = isset($dataCorteFiscal['total_caja_chica']) ? $dataCorteFiscal['total_caja_chica'] : 0;
  172. $total_ingresos_cc = isset($dataCorteFiscal['total_ingresos_cc']) ? $dataCorteFiscal['total_ingresos_cc'] : 0;
  173. $total_egresos_cc = isset($dataCorteFiscal['total_egresos_cc']) ? $dataCorteFiscal['total_egresos_cc'] : 0;
  174. printAlignedText($printer, "Total en Caja Chica:", "$" . number_format($total_caja_chica, 2));
  175. printSeparatorLine($printer);
  176. printAlignedText($printer, "+ Ingresos / Reposiciones:", "$" . number_format($total_ingresos_cc, 2));
  177. printAlignedText($printer, "- Gastos / Egresos:", "($" . number_format($total_egresos_cc, 2) . ")");
  178. printSeparatorLine($printer);
  179. // DOTACION
  180. printSeparatorLine($printer, "=");
  181. $printer->setEmphasis(true);
  182. $printer->text("CALCULO EFECTIVO EN CAJA:\n");
  183. $printer->setEmphasis(false);
  184. printSeparatorLine($printer);
  185. // TOTAL EFECTIVO CAJA
  186. $total_ventas_efectivo_val = $dataCorteFiscal['total_ventas_efectivo'] ?? 0;
  187. $total_ventas_efectivo_cc_val = $dataCorteFiscal['total_ventas_efectivo_cc'] ?? 0;
  188. printAlignedText($printer, "Dotacion:", "$" . number_format($dotacion, 2));
  189. printAlignedText($printer, "+ Ventas Efectivo:", "$" . number_format($total_ventas_efectivo_val, 2));
  190. if ($total_ventas_efectivo_cc_val > 0) {
  191. printAlignedText($printer, "+ Ventas Efectivo CC:", "$" . number_format($total_ventas_efectivo_cc_val, 2));
  192. }
  193. if ($total_ingresos_cc > 0) {
  194. printAlignedText($printer, "+ Ingresos Caja Chica:", "$" . number_format($total_ingresos_cc, 2));
  195. }
  196. if ($total_egresos_cc > 0) {
  197. printAlignedText($printer, "- Egresos Caja Chica:", "($" . number_format($total_egresos_cc, 2) . ")");
  198. }
  199. printSeparatorLine($printer, "=");
  200. $total_efectivo_caja = $dotacion + $total_ventas_efectivo_val + $total_ventas_efectivo_cc_val - $total_egresos_cc + $total_ingresos_cc;
  201. $printer->setEmphasis(true);
  202. $printer->setTextSize(2, 1);
  203. printAlignedText($printer, "TOTAL CAJA:", "$" . number_format($total_efectivo_caja, 2));
  204. $printer->setTextSize(1, 1);
  205. $printer->setEmphasis(false);
  206. $printer->setJustification(Printer::JUSTIFY_CENTER);
  207. $printer->text("(Efectivo + Dotacion +- Caja Chica)\n");
  208. $printer->setJustification(Printer::JUSTIFY_LEFT);
  209. printSeparatorLine($printer, "=");
  210. // CAJERO Y FECHA
  211. $printer->text("Cajero: " . $cajero . "\n");
  212. $printer->text($fecha . "\n");
  213. $printer->text("\n");
  214. $printer->setJustification(Printer::JUSTIFY_CENTER);
  215. $printer->setEmphasis(true);
  216. $printer->text("***Operacion Finalizada***\n");
  217. $printer->setEmphasis(false);
  218. $printer->setTextSize(1, 1);
  219. $printer->text(cutString(strtoupper($nombre_empresa), 45) . "\n");
  220. // CORTAR PAPEL Y CERRAR IMPRESORA
  221. $printer->feed(2);
  222. $printer->cut();
  223. $printer->close();
  224. echo json_encode([
  225. "status" => "success",
  226. "message" => "Corte impreso correctamente."
  227. ]);
  228. } catch (Exception $e) {
  229. echo json_encode([
  230. "status" => "error",
  231. "message" => "Error al imprimir: " . $e->getMessage()
  232. ]);
  233. }
  234. }
  235. ?>