iNroComprob
Conserva el número fiscal no nulo desde bT_TResu hasta dE_TResu y evita sustituirlo por el ticket POS.
Fecha: 13/07/2026. Documento autocontenido de alcance, causa, corrección y evidencia reproducible para numeración fiscal, cálculo de IVA, cierre de gaveta, recuperación de pagos QR y totalización/sincronización de cierres FINZD.
Las cinco mejoras protegen puntos donde un dato correcto podía perderse, quedar obsoleto o publicarse como exitoso sin estar sincronizado entre el cálculo, la memoria de trabajo, la persistencia y el servidor. Se entregan como paquetes separados, compatibles con nombres DOS 8.3 y verificados con Borland C++ 3.1/BCC286.
Conserva el número fiscal no nulo desde bT_TResu hasta dE_TResu y evita sustituirlo por el ticket POS.
Incluye el neto negativo de la bonificación mayorista en la estructura enviada a autorizar.
Actualiza el estado físico durante la espera, con frecuencia limitada y validación estricta del byte recibido.
Evita que el retry omita un estado terminal y repita consultas innecesarias.
Calcula el total por ventas de la Y cerrada, realiza el upsert sobre dE_FinZd y distingue fallo local de publicación remota pendiente.
iNroComprob entre memoria y discodE_TResu.iNroComprob podía recibir el número incremental del ticket en lugar del número fiscal ya obtenido.F2Disk_TResu, el fallback a CurrTick no expresaba ni verificaba la procedencia del dato antes de persistir.SAppend: una fuente fiscal no nula debe conservarse sin cambios.mbase/ETres.iNroComprob es no nula, se asigna sin transformación.CurrTick sólo es fallback cuando la fuente es cero, no hay impresora fiscal y CAEA está deshabilitado.SAppend, la postcondición compara fuente y destino cuando la fuente es no nula.La protección de una fuente no nula se aplica de igual manera a comprobantes obtenidos por CAE o CAEA; el guard no decide el método de autorización.
Paquete: nroguard.zip. El harness cubre siete escenarios y la fuente completa fue compilada con la configuración histórica POSTCPNU.CFG: BUILD_RC=0, cero errores y tres warnings históricos en la compilación completa.
ImpTotal no coincide con la suma de componentes) y 10051 (alícuotas IVA inconsistentes).pos_inve.cpp, línea investigada 4646, ImprimirIVAS acumulaba _dNetoIVA105 en vez del neto mayorista devuelto en dMayNeto105.dNetoIVA105 += dMayNeto105.cCAEA ni decisión CAE/CAEA.Paquete: IVA105.ZIP. RED reproduce el neto incorrecto; GREEN confirma 6653,0642 + 1019,3858 = 7672,45. La fuente completa compila con BCC286/POSTCPNU.CFG, BUILD_RC=0.
WaitGavetaClosed podía esperar sobre poscard.drawer sin refrescar el estado físico con la frecuencia necesaria.SERIAL.Idle_Handler(1) evita una consulta genérica duplicada.poscard._drawer antes de RequestStatusTM950.readed && StatusValid(status) permite copiar a poscard.drawer.Paquete: GAVFIX.ZIP. RED demuestra que readed=1/status=0x04 podía producir falso cierre; GREEN confirma rechazo de 0x04, 0x12 abierto, 0x16 cerrado, miss, gates, polaridad y wrap. Harness y fuente completa: BCC286 BUILD_RC=0.
idTrx:1955485, el primer REFUND_DENEGADO no cerró la recuperación: se observaron 37 ciclos y 236.067s.continue; elegir reintentar evitaba ejecutar el cierre terminal.REFUND_DENEGADO es terminal y no aprobado.pagoqr->Op(...), antes de if(x) y del retry; corregir además el formato del mensaje a %s.PAGO_ENVIADO continúa como estado transitorio.PAGO_APROBADO continúa como resultado exitoso.REFUND_DENEGADO en la recuperación.Paquete: QRTERM.ZIP (47BB2413052238849CF9FE1D36764D6AE075EBD33CF32C4F02B7A3F172C2DD3C). Revisar README.TXT, POS_CTOQ.CPP, PATCH.DIF, RED.LOG, GREEN.LOG y FULL.LOG.
Resultado: el cierre manual con iMODOZ_CAEA ya no puede dejar silenciosamente dE_FinZd.iZ_TotalVenta en cero por una escritura dirigida al handle equivocado ni informar éxito cuando la publicación remota falla.
dE_TMdeP, pero la decisión update/append de dE_FinZd consultaba un handle cerrado y los retornos de persistencia se ignoraban.SincronizarZeta incrementaba el contador aun si TCP_Append fallaba; otros callers ignoraban ese retorno y podían reportar un OK falso.SUpdate/SAppend bloquea avance de Z y sincronización. Un commit local exitoso avanza Z antes de intentar publicar.BAD, se registra pendiente y se conserva el registro para retry.POS_MAIN.CPP, GenerarZetaManualEIncrNroZ (zona original 5754-5814) cerraba base, el handle de dE_TMdeP, y luego ejecutaba base->locate(str_iNroZ) en la zona original 5782. La búsqueda correcta corresponde a baz, el handle de dE_FinZd.baz->Update()/baz->Append() no verificaban resultado. El flujo incrementaba GCmos.NroZ y ejecutaba ProcessSavePoint aunque FINZD no se hubiera confirmado.POS_SERV.CPP, SincronizarZeta (zona original 1437-1487) llamaba TCP_Append y aumentaba uHowMany sin comprobar el retorno; ProcessSavePoint no asignaba ese resultado a retPO y TransferAllPedingData retornaba cero.dE_TMdeP por iNroY y suma sólo idVENTA.baz->locate(str_iNroZ).AppendStart, reasigna claves y campos.SUpdate/SAppend; el fallo retorna BAD antes de avanzar Z.ProcessSavePoint.SincronizarZeta es fail-fast y cuenta sólo appends exitosos.zret!=OK, evitando publicar un FINZD viejo.xxret se acumula sólo en la rama FINZD.| Escritura local FINZD | Sync remoto | Avance Z local | Resultado observable | Acción posterior |
|---|---|---|---|---|
| Falla | No se ejecuta | No | BAD; log FINZD WRITE ERR | Corregir almacenamiento local y reintentar el cierre. |
| OK | OK | Sí | OK; contador incluye sólo envíos exitosos | Sin pendiente. |
| OK | Falla total o parcial | Sí; no hay rollback ficticio | BAD; log LOCAL OK SYNC PENDING | El registro queda pendiente y bTStatus no confirmado para retry. |
FINZCORE.H/FINZTEST.CPP: BUILD_RC=0, RUN_RC=0, PASS: FINZDTV fault transitions.POS_MAIN_RC=0 y POS_SERV_RC=0, sin errores BCC286.DdfBase ni con servidor TCP real. El seam puro modela las transiciones de fallo y es usado por producción; los fixtures/checker fijan handle y orden concretos, pero no sustituyen una prueba integrada de almacenamiento y red.Paquete: FINZDTV.ZIP (3CF9412F9F3725E7E39FFE56F5B48BAD028CCDF48C543B89335623CC3833F587). Revisar también README.TXT, RED.LOG, GREEN.LOG y RUN.LOG.
Ruta de revisión recomendada: leer primero el README del paquete, luego RED/GREEN y finalmente la compilación completa.
| Mejora | Paquete y SHA-256 | RED / GREEN | Compilación completa |
|---|---|---|---|
| iNroComprob | nroguard.zip 4A00EA05FB107755C9F2E320DD7CEF4693A2A059C41890D40270883347C62C4F | BUILD.LOG RUN.LOG: 7 escenarios | FULL.LOG: BCC286, BUILD_RC=0 |
| Neto/IVA 10,5% | IVA105.ZIP 3C2119D47F099967F628A16B63D839C82301A1B23A370A3814D8DB7C41E778AE | RED.LOG GREEN.LOG | FULL.LOG: BCC286, BUILD_RC=0 |
| Gaveta | GAVFIX.ZIP A63920723E59374ED194EE14A9B0CA9916C9931ABF534EFA124FFEDB8EDFA76B | RED.LOG GREEN.LOG | FULL.LOG: BCC286, BUILD_RC=0 |
| QR terminal | QRTERM.ZIP 47BB2413052238849CF9FE1D36764D6AE075EBD33CF32C4F02B7A3F172C2DD3C | RED.LOG GREEN.LOG: terminal pre/post-deadline | FULL.LOG: BCC286, BUILD_RC=0 |
| FINZD total/sync | FINZDTV.ZIP 3CF9412F9F3725E7E39FFE56F5B48BAD028CCDF48C543B89335623CC3833F587 | RED.LOG GREEN.LOG: fixtures hash-bound + transiciones | FULL.LOG: POS_MAIN_RC=0, POS_SERV_RC=0 |
RequestStatusTM950 podía modificar poscard._drawer antes de validar el byte. El HIGH fue remediado guardando/restaurando el caché físico y exigiendo iReaded && StatusValid; RED y GREEN enlazados arriba prueban la regresión y su cierre.zret, se bloquean savepoints exteriores en error y el resultado remoto pendiente no se confunde con rollback local.%s, la evidencia RED reproducible y la compilación completa BCC286.Los paquetes de iNroComprob e IVA incluyen harness y logs reproducibles, pero no contienen un archivo separado de revisión independiente. Este informe no atribuye una aprobación externa que no está materializada en los entregables.
POS_MAIN.CPP se entrega solamente como copia/parche aislado dentro de FINZDTV.La gaveta requiere validación HITL con impresora TM950, cable, puerto serie y hardware reales. Los harness verifican política y estado, no reemplazan la prueba física. QRTERM requiere además una prueba integrada contra el backend QR real. FINZDTV requiere validar Btrieve y un fallo TCP parcial en un entorno POS/servidor controlado.