JSOTO veconvierteorden/ccprmt003: evita ordenes duplicadas por cotizacion

Dos usuarios convirtiendo la misma cotizacion a la vez creaban dos ordenes
(cot 340001 -> 262237 y 262238, ticket 12234). La validacion "cotizacion
tiene orden" corria antes del BEGIN WORK; el segundo usuario la pasaba,
esperaba el bloqueo de prtb00020 y al liberarse insertaba otra orden.

- vedir/veconvierteorden: re-valida dentro de la transaccion, ya con el
  bloqueo de prtb00020.
- WEBSERVICES/veconvierteorden: misma re-validacion (no tenia ninguna).
- ccdir/ccprmt003 verifica_orden(): COUNT(*) en vez de SELECT num_oc,
  que daba -284 con ordenes duplicadas.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-20 16:04:59 -04:00
co-authored by Claude Opus 5.5
parent 7e166ca852
commit 9eb74bbea7
3 changed files with 28 additions and 5 deletions
+11
View File
@@ -139,6 +139,17 @@ BEGIN WORK
us_crea = xusuario,
fech_crea = GETDATE()
SELECT num_oc INTO ult_numero FROM prtb00020
# RE-VALIDACION YA CON EL BLOQUEO DE prtb00020: evita dos ordenes para la
# misma cotizacion si dos usuarios convierten a la vez (cot 340001, 20/10/2026)
LET existe_oc = 0
SELECT COUNT(*) INTO existe_oc FROM prtb00012
WHERE cotizacion_no = xcotizacion_no AND status_t IS NULL
IF existe_oc > 0 THEN
LET pmensaje_error =
SFMT("La cotizacion %1 ya tiene orden, no puede crear otra.", xcotizacion_no)
ROLLBACK WORK
RETURN 0,FALSE
END IF
# AUTOCORRECCION: si el contador quedo por detras de prtb00012, salta al siguiente libre
LET existe_oc = 0
SELECT COUNT(*) INTO existe_oc FROM prtb00012 WHERE num_oc = ult_numero