diff --git a/PROYECTO/PRDIR/prprmt008.4gl b/PROYECTO/PRDIR/prprmt008.4gl
index 20e7395..8ab0f28 100644
--- a/PROYECTO/PRDIR/prprmt008.4gl
+++ b/PROYECTO/PRDIR/prprmt008.4gl
@@ -64,7 +64,7 @@ GLOBALS "prprgb000.4gl"
nombre_vend,nombres,apellidos CHAR(40),fcalle CHAR(25),
fcasa_num CHAR(5), fbarrio,furbanizacion CHAR(15),
monto_desc,total1,p_costos1,total_i,total_mo DECIMAL(12,2),
- ult_numero,cuenta INTEGER,
+ ult_numero,cuenta,existe_oc INTEGER,
vetb05 RECORD LIKE vetb00005.*,
cuenta_p,ridx SMALLINT,
pbalance1,pbalance2 DEC(12,2),
@@ -798,19 +798,26 @@ FUNCTION prpcad008()
# SE COLOCO QUE EL NUMERO SE GENERARA A PARTIR DEL 01/01/2003 HACIA ATRAS POR MODIFICACION DEL
# SISTEMA Y LA INCLUSION DEL NCF A PARTIR DEL 01/01/2007
# FECHA MODIFICACION: 11/01/2007
- SELECT num_oc INTO ult_numero FROM prtb00020
IF nuevo = "S" THEN
- IF ult_numero IS NULL THEN
- LET ult_numero = 0
- END IF
- LET ult_numero = ult_numero + 1
- LET prtb08.num_oc = ult_numero
- DISPLAY BY NAME prtb08.num_oc
-
- UPDATE prtb00020 set num_oc = ult_numero,
+ # CONSECUTIVO ATOMICO: el UPDATE incrementa y bloquea la fila de prtb00020
+ # hasta el COMMIT, asi dos usuarios no pueden tomar el mismo num_oc
+ # (antes se leia y luego se escribia -> PK_prtb00012 duplicada)
+ BEGIN WORK
+ UPDATE prtb00020 SET num_oc = ISNULL(num_oc, 0) + 1,
us_crea = SUSER_SNAME(),
fech_crea = GETDATE()
-
+ SELECT num_oc INTO ult_numero FROM prtb00020
+ # 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
+ IF existe_oc > 0 THEN
+ SELECT MAX(num_oc) + 1 INTO ult_numero FROM prtb00012
+ UPDATE prtb00020 SET num_oc = ult_numero
+ END IF
+ COMMIT WORK
+ LET prtb08.num_oc = ult_numero
+ DISPLAY BY NAME prtb08.num_oc
+
{ CALL defecto(usuarios,clave,impresor) RETURNING imprime,negrilla_on,negrillas_of,
doble_on,doble_off,comp_on,comp_off,
doce,normal,archivo,copia1
@@ -851,9 +858,8 @@ CALL seleccionarsalida() RETURNING r_output
fech_crea = GETDATE()
WHERE @num_oc = prtb09.num_oc
- UPDATE prtb00020 SET num_oc = ult_numero,
- us_Crea = SUSER_SNAME(),
- fech_crea = GETDATE()
+ # (se elimino la re-escritura de prtb00020 aqui: el consecutivo ya se tomo
+ # arriba de forma atomica y re-escribirlo podia retroceder el contador)
# ACTUALIZA NUMERO TEMPORAL PARA EL DESPIECE
UPDATE prtb00022 SET num_oc = prtb08.num_oc WHERE num_oc = tmpnumero
diff --git a/PROYECTO/ccdir/ccprmt008.4gl b/PROYECTO/ccdir/ccprmt008.4gl
index bac1802..77efb16 100644
--- a/PROYECTO/ccdir/ccprmt008.4gl
+++ b/PROYECTO/ccdir/ccprmt008.4gl
@@ -514,19 +514,28 @@ FUNCTION req_insert()
DEFINE ultimo,numeroOrden INT
# WHENEVER ERROR CONTINUE
- SELECT a.num_req INTO ultimo FROM cctb00019 a
-
+ # 05/10/2026 - consecutivo dentro de la transaccion con bloqueo
+ # (evita num_req duplicado en cctb00025, ver requisiciondespacho.4gl)
+ BEGIN WORK
+ PREPARE p_numreq FROM "SELECT ISNULL(MAX(num_req),0) FROM cctb00019 WITH (UPDLOCK, HOLDLOCK)"
+ EXECUTE p_numreq INTO ultimo
+ PREPARE p_maxreq FROM "SELECT ISNULL(MAX(num_req),0) FROM cctb00025 WITH (UPDLOCK, HOLDLOCK)"
+ EXECUTE p_maxreq INTO numeroOrden
+
IF ultimo IS NULL THEN
LET ultimo = 0
END IF
+ IF numeroOrden > ultimo THEN
+ LET ultimo = numeroOrden
+ END IF
+ LET numeroOrden = NULL
LET ultimo = ultimo + 1
LET requisicion.num_req = ultimo
-
- UPDATE cctb00019 SET num_req = requisicion.num_req,us_crea=usuarios,fech_crea=getdate()
-
+
+ UPDATE cctb00019 SET num_req = requisicion.num_req,us_crea=usuarios,fech_crea=getdate()
+
# GUARDA MASTER TABLE
# PREPARE s FROM "SELECT @@IDENTITY"
- BEGIN WORK
# EXECUTE s INTO requisicion.num_req
DISPLAY BY NAME requisicion.num_req
diff --git a/PROYECTO/ccdir/ccprmt008.4gl.bak20261005 b/PROYECTO/ccdir/ccprmt008.4gl.bak20261005
new file mode 100644
index 0000000..bac1802
--- /dev/null
+++ b/PROYECTO/ccdir/ccprmt008.4gl.bak20261005
@@ -0,0 +1,1362 @@
+{
+-----------------------------------------------------------------------------
+PROGRAMA : CCPRMT008
+OBJETIVO : Mantenimiento Requisiciones Despacho
+REALIZADO POR : JUAN SOTO
+FECHA : Enero 2010
+
+FUNCTIONES : envia_correo() Envia correo a la persona quien autoriza las ordenes
+
+-----------------------------------------------------------------------------
+}
+GLOBALS "ccprgb000.4gl"
+ DEFINE estado BOOLEAN,
+ actualiza CHAR(2),
+
+ accion CHAR(1),
+ idx2 SMALLINT,
+ resultado,total_medida_r DEC(12,5),
+ porc_itbis DYNAMIC ARRAY OF DEC(8,2),
+ rcantidad,numerotemp INT,
+
+
+ listarequisi DYNAMIC ARRAY OF RECORD
+ estado1 CHAR(20),
+ estado2 CHAR(20),
+ estado_produccion VARCHAR(20),
+ num_req1 INT,
+ fecha1 CHAR(10),
+ material CHAR(50),
+ fecha_transporte CHAR(10),
+ fecha_llegada CHAR(10),
+ num_oc1 INT,
+ cliente1 CHAR(40),
+ valor1 DEC(12,2)
+ END RECORD,
+ pcerrada CHAR(1),
+ xmonto DEC(12,2),
+
+ rdespiece DYNAMIC ARRAY OF RECORD
+ etiqueta CHAR(20),
+ cod_n ,
+ cod_grupo ,
+ cod_tipo ,
+ cod_sec SMALLINT,
+ lado_1 ,
+ lado_2 ,
+ lado_3 ,
+ cantidad ,
+ medida,
+ cantidad_r,
+ medida_r DEC(12,5)
+ END RECORD,
+ idx1,cuenta_despiece,pcondpago SMALLINT,
+ pneto DEC(12,2),
+ pcotizacion,xorden,xtipocliente,xseccliente INT,
+ pfecha_req CHAR(10)
+
+
+MAIN
+ DEFER INTERRUPT
+ CALL ARG_VAL(1) RETURNING usuarios
+ CALL ARG_VAL(2) RETURNING clave
+ CALL ARG_VAL(4) RETURNING impresor
+ CALL STARTLOG("ccprmt008.txt")
+ CONNECT to "smarmotech" USER usuarios USING clave
+
+ INITIALIZE requisicion.* TO NULL
+
+ SELECT a.sec_vend,RTRIM(b.nom1_emp)||' '||b.apell1_emp,
+ a.email
+ INTO requisicion.sec_vend,requisicion.nombre_vendedor,
+ vendedorEmail
+ FROM seg0000 a,adtb00003 b
+ WHERE a.usuario = usuarios AND
+ a.sec_vend = b.num_emp
+ CALL ccprmt008()
+END MAIN
+
+FUNCTION ccprmt008()
+ OPTIONS INPUT WRAP
+ OPEN WINDOW w1 AT 10,5 WITH FORM "ccfmmt008"
+
+ CALL carga_lista()
+ LET requisicion.fecha_requisicion = TODAY
+ DISPLAY BY NAME requisicion.nombre_vendedor,
+ requisicion.sec_vend,requisicion.fecha_requisicion
+ MENU
+ ON ACTION nuevo ATTRIBUTE(TEXT="Nuevo",IMAGE="new")
+ LET actualiza = "NO"
+ LET accion = "A"
+ CALL arr_requisicion.clear()
+
+ CALL ccprad008()
+ ON ACTION buscar ATTRIBUTE(TEXT="Buscar",IMAGE="find")
+ LET accion = "M"
+ CALL ccprmf008()
+ ON ACTION refrescar ATTRIBUTE(TEXT="Refrescar",IMAGE="Refresh")
+ CALL carga_lista()
+ ON ACTION salir
+ EXIT MENU
+ END MENU
+
+ CLOSE WINDOW w1
+
+END FUNCTION
+
+FUNCTION ccprad008()
+ DEFINE remanente,unidadRemanente DEC(12,4),
+ total_cotizacion,total_requisicion DEC(12,2)
+
+ LET requisicion.fecha_requisicion = TODAY
+ LET requisicion.estado = 'NO AUTORIZADA'
+ LET requisicion.num_req = 0
+
+ DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM)
+ INPUT BY NAME requisicion.busca_orden ATTRIBUTES(WITHOUT DEFAULTS)
+ {AFTER FIELD sec_vend
+ SELECT UNIQUE RTRIM(b.nom1_emp)||' '||b.apell1_emp,a.email
+ INTO requisicion.nombre_vendedor,vendedoremail
+ FROM adtb00003 b,seg0000 a
+ WHERE b.num_emp = requisicion.sec_vend and
+ b.num_Emp = a.sec_vend
+
+ IF STATUS = NOTFOUND THEN
+ CALL msg(3)
+ NEXT FIELD sec_vend
+ END IF
+ DISPLAY BY NAME requisicion.nombre_vendedor}
+
+ AFTER FIELD busca_orden
+ LET pcerrada = null
+ SELECT a.sec_vend,a.cerrada,a.cond_pago
+ INTO requisicion.sec_vend,pcerrada,pcondpago
+ FROM prtb00012 a
+ WHERE a.num_oc = requisicion.busca_orden AND
+ a.status_t IS NULL
+
+ IF STATUS = NOTFOUND THEN
+ CALL msg(3)
+ END IF
+ IF pcerrada = 'S' THEN
+ CALL fgl_winmessage("INFO","ORDEN ESTA CERRADA","STOP")
+ NEXT FIELD busca_orden
+ END IF
+ SELECT RTRIM(b.nom1_emp)||' '||b.apell1_emp
+ INTO requisicion.nombre_vendedor
+ FROM adtb00003 b
+ WHERE b.num_emp = requisicion.sec_vend
+
+ DISPLAY BY NAME requisicion.sec_vend,requisicion.nombre_vendedor
+ # IF pcondpago = 4 THEN
+ # CALL fgl_winmessage("INFO","ESTA ORDEN ES AL CONTADO, NO PUEDES HACER REQUISICION","INFO")
+ # NEXT FIELD busca_orden
+ # END IF
+ # ESTE CONSTRUCT SE COLOCO EN COMENTARIO PORQUE EL DIRECTOR DE VENTAS
+ # INFORMO QUE EN LA PRIMERA VERSION, EL VENDEDOR DEBE SABER QUE ORDEN
+ # VA A REQUERIR.
+ # CONSTRUCT criterio ON a.num_oc,a.fecha_oc,a.cotizacion_no
+ # FROM busca_orden,busca_fecha,busca_cotizacion
+
+ # BEFORE CONSTRUCT
+ # CALL DIALOG.setactionactive("procesa",0)
+ # CALL arr_requisicion.clear()
+
+ # ON ACTION busca_parametros
+
+ LET selec3 =
+ "SELECT 'N',a.num_oc,CONVERT(CHAR(10),a.fecha_oc,103),a.cotizacion_no,a.tipo_cliente,a.sec_cliente,c.nombre,SUM(b.cantidad),SUM(h.cantidad_1), ",
+ " b.area,b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec,d.descrip_esp,d.unidad_med, ",
+ " SUM(h.cantidad_1),SUM(b.cantidad),'0','0','0','0','0',h.id_kit,g.porc_itbi ",
+ "FROM prtb00012 a,vetb00004 c,prtb00013 b,iptb00002 d, ",
+ " vetb00050 g,prtb00023 h ",
+ "WHERE a.num_oc =",requisicion.busca_orden," AND ",
+ # " a.sec_vend = g.sec_vend AND ",
+ " a.tipo_cliente = c.tipo_cliente AND ",
+ " a.sec_cliente = c.sec_cliente AND ",
+ " a.num_oc = b.num_oc and ",
+ " a.num_oc = h.num_oc AND",
+ " b.cod_n = d.cod_n and ",
+ " b.cod_grupo = d.cod_grupo and ",
+ " b.cod_tipo = d.cod_tipo and ",
+ " b.cod_Sec = d.cod_Sec and ",
+ " b.secuencia = h.secuencia AND ",
+ " b.cod_n = h.cod_n and ",
+ " b.cod_grupo = h.cod_grupo and ",
+ " b.cod_tipo = h.cod_tipo and ",
+ " b.cod_Sec = h.cod_Sec and ",
+ " a.cotizacion_no = g.cotizacion_no AND ",
+ " a.cerrada = 'N' and a.status_t IS NULL ",
+ " GROUP BY a.fecha_oc,a.num_oc,CONVERT(CHAR(10),a.fecha_oc,103),a.cotizacion_no,a.tipo_cliente,a.sec_cliente,c.nombre, ",
+ " b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec,d.descrip_esp,d.unidad_med,g.porc_itbi,b.area,h.id_kit "
+
+ { " UNION ",
+ "SELECT 'N',a.num_oc,CONVERT(CHAR(10),a.fecha_oc,103),a.cotizacion_no,a.tipo_cliente,a.sec_cliente,c.nombre,b.cantidad,b.cantidad, ",
+ " b.area,b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec,d.descrip_esp,d.unidad_med, ",
+ " b.cantidad,b.cantidad,'0','0','0','0','0',b.id_kit,g.porc_itbi ",
+ "FROM prtb00012 a,vetb00004 c,prtb00031 b,iptb00002 d, ",
+ " vetb00050 g ",
+ "WHERE a.num_oc =",requisicion.busca_orden," AND ",
+ " a.sec_vend = g.sec_vend AND ",
+ " a.tipo_cliente = c.tipo_cliente AND ",
+ " a.sec_cliente = c.sec_cliente AND ",
+ " a.num_oc = b.num_oc and ",
+ " b.cod_n = d.cod_n and ",
+ " b.cod_grupo = d.cod_grupo and ",
+ " b.cod_tipo = d.cod_tipo and ",
+ " b.cod_Sec = d.cod_Sec and ",
+ " a.cotizacion_no = g.cotizacion_no AND ",
+ " a.cerrada = 'N' and a.status_t IS NULL "
+
+ }
+ PREPARE comando FROM selec3
+ DECLARE busca_orden CURSOR FOR comando
+ OPEN busca_orden
+
+ LET total_cotizacion = 0
+ LET idx = 1
+ LET pcotizacion = 0
+ FOREACH busca_orden INTO arr_requisicion[idx].*,
+ porc_itbis[idx]
+ LET arr_requisicion[idx].procesa = "NO"
+
+
+ # BUSCA PRECIO
+ LET arr_requisicion[idx].precio = 0
+ IF arr_requisicion[idx].kit IS NULL THEN
+ SELECT AVG(a.precio),AVG(a.porc_Desc)
+ INTO arr_requisicion[idx].precio,arr_requisicion[idx].descuento
+ FROM vetb00051 a
+ WHERE a.cotizacion_no = arr_requisicion[idx].cotizacion_no AND
+ a.area = arr_requisicion[idx].area AND
+ a.cod_n = arr_requisicion[idx].cod_n AND
+ a.cod_grupo = arr_requisicion[idx].cod_grupo AND
+ a.cod_tipo = arr_requisicion[idx].cod_tipo AND
+ a.cod_Sec = arr_requisicion[idx].cod_sec
+ ELSE
+ SELECT AVG(a.precio),AVG(a.porc_Desc)
+ INTO arr_requisicion[idx].precio,arr_requisicion[idx].descuento
+ FROM vetb00031 a
+ WHERE a.cotizacion_no = arr_requisicion[idx].cotizacion_no AND
+ a.area = arr_requisicion[idx].area AND
+ a.cod_n = arr_requisicion[idx].cod_n AND
+ a.cod_grupo = arr_requisicion[idx].cod_grupo AND
+ a.cod_tipo = arr_requisicion[idx].cod_tipo AND
+ a.cod_Sec = arr_requisicion[idx].cod_sec AND
+ a.id_kit = arr_requisicion[idx].kit
+
+ END IF
+ IF arr_requisicion[idx].precio IS NULL THEN
+ LET arr_requisicion[idx].precio = 0
+ END IF
+ LET pcotizacion = arr_requisicion[idx].cotizacion_no
+ LET arr_requisicion[idx].valor = arr_requisicion[idx].cantidad_ord *
+ arr_requisicion[idx].precio
+ LET arr_requisicion[idx].descvalor =
+ (arr_requisicion[idx].cantidad_ord *
+ arr_requisicion[idx].precio) *
+ (arr_requisicion[idx].descuento/100)
+
+ LET arr_requisicion[idx].valor = arr_requisicion[idx].valor -
+ arr_requisicion[idx].descvalor
+
+ LET arr_requisicion[idx].valor = (arr_requisicion[idx].valor *
+ (porc_itbis[idx] /100)) +
+ arr_requisicion[idx].valor
+
+
+ CALL controles(requisicion.num_req,arr_requisicion[idx].area, arr_requisicion[idx].cod_n,
+ arr_requisicion[idx].cod_grupo,arr_requisicion[idx].cod_tipo,
+ arr_requisicion[idx].cod_sec,arr_requisicion[idx].num_oc,0,arr_requisicion[idx].cantidad_ord)
+ RETURNING estado,arr_requisicion[idx].cantidad,arr_requisicion[idx].cantidad_1
+
+ LET total_cotizacion = total_cotizacion + arr_requisicion[idx].valor
+
+ IF arr_requisicion[idx].cantidad IS NULL THEN
+ LET arr_requisicion[idx].cantidad_1 = arr_requisicion[idx].cantidad_ord1
+ LET arr_requisicion[idx].cantidad = arr_requisicion[idx].cantidad_ord
+ LET arr_requisicion[idx].cantidad_pendiente = 0
+ ELSE
+
+ DISPLAY "CALCULO: CODIGO: ", arr_requisicion[idx].cod_sec," ORDEN:",arr_requisicion[idx].cantidad_ord1," CANTIDAD1: ",arr_requisicion[idx].cantidad_1
+ LET arr_requisicion[idx].cantidad_1 = arr_requisicion[idx].cantidad_ord1 -
+ arr_requisicion[idx].cantidad_1
+
+ CALL factor_conv(arr_requisicion[idx].cod_n,
+ arr_requisicion[idx].cod_grupo,
+ arr_requisicion[idx].cod_tipo,
+ arr_requisicion[idx].cod_sec,
+ arr_requisicion[idx].cantidad_1)
+ RETURNING resultado,estado
+
+ LET arr_requisicion[idx].cantidad_pendiente = arr_requisicion[idx].cantidad_1
+ DISPLAY "pendiente: ",arr_requisicion[idx].cantidad_pendiente
+ CALL factor_conv(arr_requisicion[idx].cod_n,
+ arr_requisicion[idx].cod_grupo,arr_requisicion[idx].cod_tipo,
+ arr_requisicion[idx].cod_sec,arr_requisicion[idx].cantidad_1)
+ RETURNING resultado,estado
+ IF resultado > 0 THEN
+ LET arr_requisicion[idx].cantidad = resultado
+ ELSE
+ LET arr_requisicion[idx].cantidad = arr_requisicion[idx].cantidad_1
+ END IF
+
+ IF arr_requisicion[idx].cantidad_1 <=0 THEN
+ DISPLAY "SE DEVUELVE: ",arr_requisicion[idx].cod_sec," cantidad: ",arr_requisicion[idx].cantidad_1
+ CONTINUE FOREACH
+ END IF
+ END IF
+
+
+ LET idx = idx + 1
+ END FOREACH
+ LET estado = FALSE
+ IF idx = 1 THEN
+ CALL fgl_winmessage("ERROR","NO EXISTEN ORDENES CON ESA CONDICION","STOP")
+ CALL arr_requisicion.clear()
+ EXIT DIALOG
+ END IF
+ DISPLAY BY NAME total_cotizacion
+ CALL set_count(idx-1)
+# AFTER CONSTRUCT
+# CALL input_data()
+ AFTER INPUT
+ SELECT UNIQUE RTRIM(b.nom1_emp)||' '||b.apell1_emp,a.email
+ INTO requisicion.nombre_vendedor,vendedoremail
+ FROM adtb00003 b,seg0000 a
+ WHERE b.num_emp = requisicion.sec_vend and
+ b.num_Emp = a.sec_vend
+
+ IF STATUS = NOTFOUND THEN
+ CALL msg(3)
+ NEXT FIELD busca_orden
+ END IF
+ DISPLAY BY NAME requisicion.nombre_vendedor
+
+ END INPUT
+
+
+ INPUT ARRAY arr_requisicion FROM s_requisi.* ATTRIBUTE(WITHOUT DEFAULTS)
+
+ ON ACTION desseleccion
+
+ FOR idx2 = 1 TO idx
+ IF arr_requisicion[idx2].num_oc IS NOT NULL THEN
+ LET arr_requisicion[idx2].procesa = "NO"
+
+ DISPLAY arr_requisicion[idx2].procesa TO s_requisi[scr_l].procesa
+ END IF
+ END FOR
+
+
+ ON ACTION seleccion
+
+ FOR idx2 = 1 TO arr_requisicion.getLength()
+ IF arr_requisicion[idx2].num_oc IS NOT NULL THEN
+ LET arr_requisicion[idx2].procesa = "SI"
+ LET scr_l = scr_line()
+ DISPLAY arr_requisicion[idx2].procesa TO s_requisi[idx2].procesa
+ END IF
+ END FOR
+
+ BEFORE INPUT
+ CALL DIALOG.setactionactive("procesa",1)
+ CALL DIALOG.setactionactive("insert",FALSE)
+ CALL DIALOG.setactionactive("delete",FALSE)
+ CALL DIALOG.setactionactive("append",FALSE)
+ BEFORE ROW
+ LET curr = arr_curr()
+ LET scr_l = scr_line()
+
+ AFTER FIELD cantidad_1
+ LET curr = arr_curr()
+ LET scr_l = scr_line()
+ IF arr_requisicion[curr].cantidad_1 > 0 AND arr_requisicion[curr].procesa = "SI" THEN
+ LET arr_requisicion[curr].valor = 0
+ CALL factor_conv(arr_requisicion[curr].cod_n,
+ arr_requisicion[curr].cod_grupo,arr_requisicion[curr].cod_tipo,
+ arr_requisicion[curr].cod_sec,arr_requisicion[curr].cantidad_1)
+ RETURNING resultado,estado
+
+ IF estado = FALSE THEN
+ CALL fgl_winmessage("ERROR","PROBLEMA EN EL FACTOR DE CONVERSION, CONTACTE ADM INVENTARIO","STOP")
+ NEXT FIELD cantidad_1
+ END IF
+
+ LET arr_requisicion[curr].cantidad = resultado
+ DISPLAY arr_requisicion[curr].cantidad TO s_requisi[scr_l].cantidad
+ IF arr_requisicion[curr].cantidad_1 > arr_requisicion[curr].cantidad_ord1 THEN
+ CALL fgl_Winmessage("ERROR","CANTIDAD EXECEDE CANTIDAD ORDEN","STOP")
+ NEXT FIELD cantidad_1
+ END IF
+ CALL controles(requisicion.num_req,arr_requisicion[curr].area,arr_requisicion[curr].cod_n,
+ arr_requisicion[curr].cod_grupo,arr_requisicion[curr].cod_tipo,
+ arr_requisicion[curr].cod_sec,arr_requisicion[curr].num_oc,arr_requisicion[curr].cantidad,
+ arr_requisicion[curr].cantidad_ord)
+ RETURNING estado,remanente,unidadRemanente
+
+ IF NOT estado THEN
+ CALL fgl_winmessage("ERROR","NO PUEDE HACER MAS REQUISICION A ESTA ORDEN","STOP")
+ NEXT FIELD cantidad_1
+ END IF
+
+ # CALL control_despiece(arr_requisicion[curr].area,arr_requisicion[curr].cod_n,arr_requisicion[curr].cod_grupo,
+ # arr_requisicion[curr].cod_tipo,arr_requisicion[curr].cod_sec,
+ # arr_requisicion[curr].num_oc ,arr_requisicion[curr].cantidad,accion) RETURNING estado
+
+ # IF estado = FALSE THEN
+ # CALL fgl_winmessage("ERROR","NO PUEDE ADICIONAR REQUISICION, EXISTE UN ITEM QUE DEBE DESPIEZAR o LA CANTIDAD DIFIERE DE LA CANTIDAD EN LA REQUISICION","STOP")
+ # NEXT FIELD cantidad_1
+ # END IF
+ # call fgl_winmessage("w",rcantidad||' '||arr_requisicion[idx].num_oc||' '||
+ # arr_requisicion[idx].procesa||' '||
+ # arr_requisicion[idx].cod_sec|| ' '||idx,"stop")
+
+ LET arr_requisicion[curr].descvalor =(arr_requisicion[curr].cantidad *
+ arr_requisicion[curr].precio) *
+ (arr_requisicion[curr].descuento/100)
+
+ LET arr_requisicion[curr].valor = (arr_requisicion[curr].cantidad *
+ arr_requisicion[curr].precio) -
+ arr_requisicion[curr].descvalor
+
+ LET arr_requisicion[curr].valor = arr_requisicion[curr].valor +
+ (arr_requisicion[curr].valor * (porc_itbis[curr]/100))
+ IF arr_requisicion[curr].valor < 0 THEN
+ LET arr_requisicion[curr].valor =arr_requisicion[curr].cantidad *
+ arr_requisicion[curr].precio
+ END IF
+ DISPLAY arr_requisicion[curr].valor TO s_requisi[scr_l].valor
+
+ END IF
+ AFTER INPUT
+ LET total_requisicion = 0
+ FOR idx = 1 TO arr_count()
+ # CALL control_despiece(arr_requisicion[idx].area,arr_requisicion[idx].cod_n,arr_requisicion[idx].cod_grupo,
+ # arr_requisicion[idx].cod_tipo,arr_requisicion[idx].cod_sec,
+ # arr_requisicion[idx].num_oc ,arr_requisicion[idx].cantidad,accion) RETURNING estado
+
+ # IF estado = FALSE THEN
+ # CALL fgl_winmessage("ERROR","NO PUEDE ADICIONAR REQUISICION, EXISTE UN ITEM QUE DEBE DESPIEZAR o LA CANTIDAD DIFIERE DE LA CANTIDAD EN LA REQUISICION","STOP")
+ # NEXT FIELD cantidad_1
+ # END IF
+
+ LET total_Requisicion = total_requisicion + arr_requisicion[curr].valor
+ # call fgl_winmessage("w",rcantidad||' '||arr_requisicion[idx].num_oc||' '||
+ # arr_requisicion[idx].procesa||' '||
+ # arr_requisicion[idx].cod_sec|| ' '||idx,"stop")
+
+ END FOR
+ DISPLAY BY NAME total_requisicion
+ END INPUT
+
+ ON ACTION procesa
+ LET rcantidad = arr_requisicion.getLength()
+ IF rcantidad > 0 THEN
+ CALL req_insert() RETURNING estado
+ IF estado THEN
+
+ DECLARE busca_emails CURSOR FOR
+ SELECT a.correo FROM seg0003 a
+ WHERE a.autorizacionDespacho = 'SI'
+ LET idx = 1
+ FOREACH busca_emails INTO copiacorreo[idx]
+ LET copiaemail = copiaemail CLIPPED,";",copiacorreo[idx] CLIPPED
+ LET idx = idx + 1
+ END FOREACH
+ IF idx=1 THEN
+ LET copiaemail='jsoto@marmotech.com.do'
+ END IF
+ CALL fgl_winmessage("MENSAJE","ADICION EXITOSA","STOP")
+ LET procedimiento = "{ call cc_avisadespacho(?,?,?,?) }" CLIPPED
+ # CALL envia_correo(vendedorEmail,copiaemail,cuerpo_correo,
+ # subject, procedimiento )
+ SELECT a.cond_pago,a.total_neto INTO pcondpago,pneto
+ FROM vetb00050 a
+ WHERE a.cotizacion_no = arr_requisicion[1].cotizacion_no
+
+ CALL evaluaclientes(arr_requisicion[1].tipo_cliente,
+ arr_requisicion[1].sec_cliente,pcondpago,requisicion.num_req,
+ arr_requisicion[1].num_oc,
+ requisicion.sec_vend,'RQ',xmonto) RETURNING estado
+
+ IF estado THEN
+ UPDATE cctb00025 set estado = 'AUTORIZADA',
+ sec_vend_aprobado = requisicion.sec_vend,
+ fecha_autorizacion = GETDATE()
+ where num_req = requisicion.num_req
+ UPDATE cctb00026 set estado = 'AUTORIZADA',
+ us_mod = 'MBS',
+ fech_mod = GETDATE()
+ where num_req = requisicion.num_req
+
+ END IF
+ CALL entraMensaje(requisicion.num_req, pcotizacion,"A",usuarios)
+ CLEAR FORM
+ CALL arr_requisicion.clear()
+ RETURN
+
+ END IF
+ END IF
+ ON ACTION refrescar
+ CALL carga_lista()
+
+ ON ACTION CANCEL
+ CALL arr_requisicion.clear()
+ CALL msg(2)
+ DELETE FROM cctb00027 WHERE Num_req = numerotemp
+ EXIT DIALOG
+
+ END DIALOG
+END FUNCTION
+
+FUNCTION req_insert()
+DEFINE ultimo,numeroOrden INT
+
+ # WHENEVER ERROR CONTINUE
+ SELECT a.num_req INTO ultimo FROM cctb00019 a
+
+ IF ultimo IS NULL THEN
+ LET ultimo = 0
+ END IF
+ LET ultimo = ultimo + 1
+ LET requisicion.num_req = ultimo
+
+ UPDATE cctb00019 SET num_req = requisicion.num_req,us_crea=usuarios,fech_crea=getdate()
+
+ # GUARDA MASTER TABLE
+ # PREPARE s FROM "SELECT @@IDENTITY"
+ BEGIN WORK
+ # EXECUTE s INTO requisicion.num_req
+
+ DISPLAY BY NAME requisicion.num_req
+
+ LET subject = "AVISO REQUISICION DESPACHO NO. ",requisicion.num_req USING "&&&&&&"," VALOR: "
+ LET cuerpo_correo = "VENDEDOR : ",requisicion.nombre_vendedor CLIPPED
+ LET cuerpo_correo = " ",cuerpo_correo CLIPPED," FECHA REQUISICION : ",requisicion.fecha_requisicion USING "DD/MM/YYYY"
+ LET cuerpo_correo = " ",cuerpo_correo CLIPPED," NUMERO DE ORDEN: ",requisicion.busca_orden USING "&&&&&&"
+ LET selec =
+ "INSERT INTO cctb00034 (id_kit,num_req,cod_n,cod_grupo,cod_tipo,cod_sec,cantidad)",
+ "SELECT a.id_kit,'",requisicion.num_req USING "<<<<<<","',a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.cantidad ",
+ "FROM prtb00030 a ",
+ " WHERE a.id_kit = ? AND ",
+ " a.num_oc =?"
+
+ # PREPARE xcctb34 FROM selec
+
+ LET xmonto = 0
+ FOR idx = 1 TO arr_requisicion.getLength()
+ IF arr_requisicion[idx].num_oc is not null THEN
+ IF arr_requisicion[idx].procesa = "SI" THEN
+
+ LET cuerpo_correo = " ",cuerpo_correo CLIPPED," CLIENTE: ",arr_requisicion[idx].nombre CLIPPED," ",
+ " CONTIENE EL PRODUCTO ",
+ arr_requisicion[idx].unidad_med," ",
+ arr_requisicion[idx].cantidad_1," ",
+ arr_requisicion[idx].cantidad USING "<<,<<<.##",
+ arr_requisicion[idx].descripcion CLIPPED
+
+
+ LET numeroOrden = arr_requisicion[idx].num_oc
+
+
+ # IF arr_requisicion[idx].valor = 0 OR arr_requisicion[idx].valor IS NULL THEN
+ IF arr_requisicion[idx].descvalor IS NULL THEN
+ LET arr_requisicion[idx].descvalor = 0
+ END IF
+ IF arr_requisicion[idx].descuento IS NULL THEN
+ LET arr_requisicion[idx].descuento = 0
+ END IF
+
+ LET arr_requisicion[idx].valor = ((arr_requisicion[idx].cantidad * arr_requisicion[idx].precio)-
+ arr_requisicion[idx].descvalor)
+
+ DISPLAY "data1 ",arr_requisicion[idx].cantidad," precio ",arr_requisicion[idx].precio,
+ " valor ",arr_requisicion[idx].valor,"descuento ",arr_requisicion[idx].descvalor
+
+ LET arr_requisicion[idx].valor = arr_requisicion[idx].valor +
+ (arr_requisicion[idx].valor * (porc_itbis[idx]/100))
+
+ DISPLAY "data2 ",arr_requisicion[idx].cantidad," precio ",arr_requisicion[idx].precio,
+ " valor ",arr_requisicion[idx].valor,"descuento ",arr_requisicion[idx].descvalor
+
+
+ # END IF
+ LET xmonto = xmonto + arr_requisicion[idx].valor
+ IF arr_requisicion[idx].cantidad IS NULL THEN
+ ROLLBACK WORK
+ CALL fgl_winmessage("INFO","CANTIDAD EN BLANCO","INFO")
+ RETURN FALSE
+ END IF
+ INSERT INTO cctb00026 (num_req,num_oc,cotizacion_no,id,area,cod_n,cod_grupo,cod_tipo,cod_Sec,
+ cantidad_ord1,cantidad_ord,cantidad_1,cantidad,precio,descuento,descvalor,valor,us_crea,fech_crea,estado,
+ id_kit)
+
+ VALUES (requisicion.num_req,arr_requisicion[idx].num_oc,arr_requisicion[idx].cotizacion_no,
+ idx,arr_requisicion[idx].area,arr_requisicion[idx].cod_n,arr_requisicion[idx].cod_grupo,
+ arr_requisicion[idx].cod_tipo,arr_requisicion[idx].cod_Sec,
+ arr_requisicion[idx].cantidad_ord1,arr_requisicion[idx].cantidad_ord,arr_requisicion[idx].cantidad_1,
+ arr_requisicion[idx].cantidad,
+ arr_requisicion[idx].precio,arr_requisicion[idx].descuento,
+ arr_requisicion[idx].descvalor,
+ arr_requisicion[idx].valor,SUSER_SNAME(),GETDATE(),requisicion.estado,arr_requisicion[idx].kit)
+
+ IF SQLSTATE > 02 THEN
+ LET chmensaje = SQLERRMESSAGE CLIPPED,"NO ES POSIBLE GUARDAR LA TRANSACCION"
+ ROLLBACK WORK
+ CALL fgl_winmessage("ERROR",chmensaje,"STOP")
+ RETURN FALSE
+ EXIT FOR
+ END IF
+
+ END IF
+ END IF
+ END FOR
+
+
+
+ # INSERTA DESPIECE
+ FOR idx1 = 1 TO rdespiece.getLength()
+ IF rdespiece[idx1].medida> 0 THEN
+ INSERT INTO cctb00027
+ (num_req,etiqueta,num_oc,secuencia,area,cod_n,cod_grupo,cod_tipo,cod_sec,
+ Lado_1,lado_2,lado_3,cantidad,medida,cantidad_r,medida_r,us_crea,
+ fech_crea)
+ VALUES
+ (requisicion.num_req,rdespiece[idx1].etiqueta,numeroOrden,idx,arr_requisicion[idx].area,
+ rdespiece[idx1].cod_n,
+ rdespiece[idx1].cod_grupo,rdespiece[idx1].cod_tipo,rdespiece[idx1].cod_sec,
+ rdespiece[idx1].lado_1,rdespiece[idx1].lado_2,rdespiece[idx1].lado_3,
+ rdespiece[idx1].cantidad,rdespiece[idx1].medida,rdespiece[idx1].cantidad_r,
+ rdespiece[idx1].medida_r,usuarios,GETDATE())
+
+ IF STATUS < 0 THEN
+
+ ROLLBACK WORK
+ CLOSE WINDOW w10
+
+ CALL fgl_winmessage("ERROR","OCURRIO UN ERROR ACTUALIZANDO LOS DATOS","STOP")
+ LET estado = FALSE
+ RETURN FALSE
+ ELSE
+
+ LET estado = TRUE
+ END IF
+ END IF
+ END FOR
+
+ INSERT INTO cctb00025 (num_req,fecha,sec_vend,us_crea,fech_crea,estado,estado_despacho,monto_req)
+ VALUES (requisicion.num_req,requisicion.fecha_requisicion,
+ requisicion.sec_vend,SUSER_SNAME(),GETDATE(),requisicion.estado,"NO DESPACHADA",xmonto)
+
+ IF STATUS < 0 THEN
+ LET chmensaje = SQLERRMESSAGE CLIPPED,"NO ES POSIBLE GUARDAR LA TRANSACCION"
+ ROLLBACK WORK
+ CALL fgl_Winmessage("ERROR",chmensaje,"STOP")
+ RETURN FALSE
+ END IF
+ IF estado THEN
+ COMMIT WORK
+ CALL entramensaje(requisicion.num_req,pcotizacion,"A",usuarios)
+ RETURN TRUE
+ ELSE
+ ROLLBACK WORK
+ CALL fgl_winmessage("MENSAJE","NO SE INSERTARON DATOS EN REQUISICION","STOP")
+ RETURN FALSE
+ END IF
+
+END FUNCTION
+FUNCTION controles(pnumreq,parea,pcodn,pcodgrupo,pcodtipo,pcodsec,numero,cantidad_Trx,cantidadORD)
+ DEFINE unidad_ctrl,cantidad_ctrl,cantidad_trx,cantidadORD DEC(12,2),
+ pcodn,pcodgrupo,pcodtipo,pcodsec,parea SMALLINT,
+ numero,pnumreq INT,
+ chmesage CHAR(80)
+
+ SELECT ISNULL(SUM(a.cantidad),0) INTO cantidadord
+FROM prtb00013 a
+WHERE a.num_oc = numero AND
+ a.cod_n = pcodn AND
+ a.cod_grupo = pcodgrupo AND
+ a.cod_tipo = pcodtipo AND
+ a.cod_sec = pcodsec AND
+ a.area = parea AND
+ a.status_t IS NULL
+
+# CONTROL 01 CANTIDAD REQUISICION VS CANTIDAD ORDENADA
+LET cantidad_ctrl=0
+LET unidad_ctrl=0
+SELECT ISNULL(SUM(a.cantidad),0),ISNULL(SUM(a.cantidad_1),0) INTO cantidad_ctrl,unidad_ctrl
+FROM cctb00026 a
+WHERE a.num_oc = numero AND
+ a.cod_n = pcodn AND
+ a.cod_grupo = pcodgrupo AND
+ a.cod_tipo = pcodtipo AND
+ a.cod_sec = pcodsec AND
+ a.num_req <> pnumreq AND
+ a.area = parea AND
+ a.status_t IS NULL
+
+ IF cantidad_ctrl IS NULL THEN
+ LET cantidad_ctrl=0
+ END IF
+ #LET chmesage = " TRX "+cantidad_trx using "&&&&.####"," CTRL ",cantidad_ctrl USING "&&&.####"
+ #LET chmesage = " ORDEN "+numero USING "&&&&&&"
+ #LET chmesage = " codn ",pcodn using "&&&"," codgrupo ",pcodgrupo USING "&&&"," codtipo " ,pcodtipo using "&&&"," codsec ",pcodsec USING "&&&"
+ # CALL FGL_WINMESSAGE("W",cantidad_ctrl,"STOP")
+ # DISPLAY "cantidad ctrl ",cantidad_ctrl, "cantidad_trx,",cantidad_trx,
+ #"cantidadORD ",cantidadord," cod ",pcodsec
+ IF cantidad_trx IS NULL THEN
+ LET cantidad_Trx = 0
+ END IF
+ DISPLAY "control: ",cantidad_ctrl," cantidad trx: ",cantidad_trx," orden: ",cantidadOrd
+ IF cantidad_ctrl +cantidad_Trx > cantidadORD THEN
+ DISPLAY "resultado: ",cantidad_ctrl +cantidad_Trx," orden ",cantidadORD
+ RETURN FALSE,cantidad_ctrl,unidad_ctrl
+ ELSE
+ RETURN TRUE, cantidad_ctrl,unidad_ctrl
+ END IF
+
+END FUNCTION
+FUNCTION busca_info()
+
+ DISPLAY pfecha_req TO fecha_requisicion
+ DISPLAY requisicion.num_req,
+ requisicion.sec_vend_a,requisicion.nombre_a,
+ requisicion.nombre_vendedor,requisicion.sec_vend,
+ requisicion.estado
+ TO num_req,sec_vend_a,nombre_a,nombre_vendedor,sec_vend,estado
+ CALL arr_requisicion.clear()
+ DECLARE busca_req2 CURSOR FOR
+ SELECT a.num_oc,CAST(b.fecha_oc AS CHAR(10)),a.cotizacion_no,
+ a.cantidad_1,a.cantidad,a.cantidad_ord1,a.area,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,
+ b.tipo_cliente,b.sec_cliente,c.nombre,a.cantidad_ord,a.precio,
+ a.descuento,a.descvalor,a.valor,d.descrip_esp,a.estado,a.id_kit
+ FROM cctb00026 a,prtb00012 b,vetb00004 c,iptb00002 d
+ WHERE a.num_req = requisicion.num_req and
+ a.num_oc = b.num_oc AND
+ b.tipo_cliente = c.tipo_cliente AND
+ b.sec_cliente = c.sec_cliente AND
+ a.cod_n = d.cod_n AND
+ a.cod_grupo = d.cod_grupo AND
+ a.cod_tipo = d.cod_tipo AND
+ a.cod_Sec = d.cod_sec
+
+ LET idx = 1
+ FOREACH busca_req2 INTO arr_requisicion[idx].num_oc,arr_requisicion[idx].fecha,
+ arr_requisicion[idx].cotizacion_no,arr_requisicion[idx].cantidad_1,
+ arr_requisicion[idx].cantidad,arr_requisicion[idx].cantidad_ord1,
+ arr_requisicion[idx].area,
+ arr_requisicion[idx].cod_n,
+ arr_requisicion[idx].cod_grupo,arr_requisicion[idx].cod_tipo,
+ arr_requisicion[idx].cod_Sec,arr_requisicion[idx].tipo_cliente,
+ arr_requisicion[idx].sec_cliente,arr_requisicion[idx].nombre,
+ arr_requisicion[idx].cantidad_ord,
+ arr_requisicion[idx].precio,arr_requisicion[idx].descuento,
+ arr_requisicion[idx].descvalor,arr_requisicion[idx].valor,
+ arr_requisicion[idx].descripcion,arr_requisicion[idx].procesa,
+ arr_requisicion[idx].kit
+ LET pcotizacion = arr_requisicion[idx].cotizacion_no
+ LET arr_requisicion[idx].cantidad_pendiente = arr_requisicion[idx].cantidad_ord - arr_requisicion[idx].cantidad
+ LET idx = idx + 1
+ END FOREACH
+ CALL set_count(idx-1)
+ DISPLAY ARRAY arr_requisicion TO s_requisi.*
+
+END FUNCTION
+#FUNCTION envia_correo()
+# IF vendedorEmail IS NULL THEN
+# LET vendedorEmail = 'jsoto@marmotech.com.do'
+# END IF
+# LET vendedorEmail = vendedorEmail CLIPPED,'rantonio@marmotech.com.do'
+
+# PREPARE smt FROM "{ call cc_avisadespacho(?,?,?) }"
+# EXECUTE smt USING cuerpo_correo IN,subject IN,vendedorEmail IN
+
+#END FUNCTION
+
+FUNCTION control_despiece(parea,pcodn,pcodgrupo,pcodtipo,pcodsec,numero_ord,pcantidad,accion)
+ DEFINE pestado BOOLEAN,
+ total_medida DEC(12,5),
+ punidad CHAR(3),accion CHAR(1),
+ pdescripcion CHAR(60),
+ numero_ord,numero_req INT,
+ parea,pcodn,pcodgrupo,pcodtipo,pcodsec SMALLINT,
+ medidactrl,pcantidad DEC(12,5)
+
+ CALL rdespiece.clear()
+ # BUSCA SI EL ARTICULO SE DESPIEZA
+
+ SELECT UNIQUE b.unidad_med,b.descrip_esp
+ INTO punidad,pdescripcion
+ FROM iptb00027 a,iptb00002 b
+ WHERE a.cod_n = pcodn AND
+ a.cod_grupo = pcodgrupo AND
+ a.cod_tipo = pcodtipo AND
+ a.cod_Sec = pcodsec AND
+ a.cod_n = b.cod_n AND
+ a.cod_grupo = b.cod_grupo AND
+ a.cod_tipo = b.cod_tipo AND
+ a.cod_Sec = b.cod_sec
+
+ IF STATUS = NOTFOUND THEN
+ LET estado=TRUE
+ RETURN estado
+ END IF
+
+ IF accion = "A" THEN
+
+ # SELECT a.num_temp_req INTO numero_req FROM cctb00028 a
+ # IF numero_req IS NULL THEN
+ LET numero_req = 1000
+ # INSERT INTO cctb00028 (num_temp_req) VALUES (numero_req) SE COLOCO ESTAS INSTRUCCIONES EN COMENTARIO PORQUE SE CREO UNA TABLA TEMPORAL cctb00030
+ # END IF
+# LET numero_req = numero_req + 1
+ # UPDATE cctb00028 set num_temp_req = numero_req
+
+
+ DECLARE busca_despiece CURSOR FOR
+ SELECT a.etiqueta,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,
+ a.lado_1,a.lado_2,a.lado_3,
+ SUM(a.cantidad),SUM(a.medida),SUM(b.cantidad),SUM(b.medida)
+ FROM prtb00022 a LEFT OUTER JOIN cctb00030 b ON
+ a.num_oc = b.num_oc AND
+ a.area = b.area AND
+ a.cod_n = b.cod_n AND
+ a.cod_grupo = b.cod_grupo AND
+ a.cod_tipo = b.cod_tipo AND
+ a.cod_sec = b.cod_sec AND
+ a.lado_1 = b.lado_1 AND
+ a.lado_2 = b.lado_2 AND
+ a.lado_3 = b.lado_3 AND
+ b.us_crea = usuarios AND
+ a.etiqueta = b.etiqueta
+ WHERE
+ a.num_oc = numero_ord AND
+ a.area = parea AND
+ a.cod_n = pcodn AND
+ a.cod_grupo = pcodgrupo AND
+ a.cod_tipo = pcodtipo AND
+ a.cod_sec = pcodsec
+ GROUP BY a.etiqueta,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,
+ a.lado_1,a.lado_2,a.lado_3
+ LET idx1 = 1
+ FOREACH busca_despiece INTO rdespiece[idx1].*
+ LET rdespiece[idx1].cantidad_r = rdespiece[idx1].cantidad
+ LET rdespiece[idx1].medida_r = rdespiece[idx1].medida
+ LET idx1 = idx1 + 1
+ END FOREACH
+
+ ELSE
+ # call fgl_winmessage("w",numero_Req,"stop")
+ DECLARE busca_despiece1 CURSOR FOR
+ SELECT a.etiqueta,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,
+ a.lado_1,a.lado_2,a.lado_3,
+ SUM(a.cantidad),SUM(a.medida),SUM(a.cantidad),SUM(a.medida)
+ FROM cctb00027 a
+ WHERE
+ a.num_oc = numero_ord AND
+ a.area = parea AND
+ a.cod_n = pcodn AND
+ a.cod_grupo = pcodgrupo AND
+ a.cod_tipo = pcodtipo AND
+ a.cod_sec = pcodsec AND
+ a.num_req = numero_req
+ GROUP BY a.etiqueta,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,
+ a.lado_1,a.lado_2,a.lado_3
+
+ LET idx1 = 1
+ FOREACH busca_despiece1 INTO rdespiece[idx1].*
+ LET idx1 = idx1 + 1
+ END FOREACH
+ END IF
+
+ IF idx1 = 1 THEN
+ LET pestado = FALSE
+ RETURN pestado
+ ELSE
+ LET pestado = TRUE
+ END IF
+
+ OPEN WINDOW w10 AT 5,6 WITH FORM "ccfmwd004"
+ DISPLAY pdescripcion TO descrip_esp
+ DISPLAY punidad TO unidad_med
+
+ CALL set_count(idx1-1)
+ INPUT ARRAY rdespiece WITHOUT DEFAULTS FROM sdespiece.*
+ BEFORE ROW
+ LET curr = arr_curr()
+ LET fila = scr_line()
+
+ AFTER FIELD cantidad_r
+ IF rdespiece[curr].cantidad_r IS NOT NULL THEN
+ LET medidactrl = 0
+ SELECT SUM(a.medida_r) INTO medidaCtrl
+ FROM cctb00027 a
+ WHERE a.area = parea AND
+ a.cod_n = rdespiece[curr].cod_n AND
+ a.cod_grupo =rdespiece[curr].cod_grupo AND
+ a.cod_tipo = rdespiece[curr].cod_tipo AND
+ a.cod_sec = rdespiece[curr].cod_Sec AND
+ a.lado_1 = rdespiece[curr].lado_1 AND
+ a.lado_2 = rdespiece[curr].lado_2 AND
+ a.num_oc = numero_ord AND a.status_t IS NULL AND
+ a.num_req <> numero_req
+
+ IF medidaCtrl IS NULL THEN
+ LET medidactrl = 0
+ END IF
+
+ IF punidad= "M2" THEN
+ LET rdespiece[curr].medida_r =
+ rdespiece[curr].cantidad_r * (rdespiece[curr].lado_1 * rdespiece[curr].lado_2)
+ END IF
+
+ IF punidad= "M3" THEN
+ LET rdespiece[curr].medida_r =
+ rdespiece[curr].cantidad_r * (rdespiece[curr].lado_1 * rdespiece[curr].lado_2 * rdespiece[curr].lado_3)
+ END IF
+
+ IF punidad= "ML" THEN
+ LET rdespiece[curr].medida_r =
+ rdespiece[curr].cantidad_r * rdespiece[curr].lado_1
+ LET rdespiece[curr].lado_2 = 0
+ END IF
+
+ IF punidad= "UD" OR punidad= "GL" THEN
+ LET rdespiece[curr].medida_r = rdespiece[curr].cantidad_r
+ END IF
+ DISPLAY rdespiece[curr].medida_r TO sdespiece[fila].medida_r
+
+ #IF medidaCtrl + rdespiece[curr].medida_r > rdespiece[curr].medida THEN
+ # LET pestado = FALSE
+
+ # EXIT INPUT LOCOLOQUE POR TIENE OTRO AFTER INPUT FECHA:14/10/11
+
+
+ # END IF
+ LET total_medida_r = 0
+ LET cuenta_despiece = arr_count()
+ LET total_medida = 0
+ FOR idx1= 1 TO cuenta_despiece
+ IF rdespiece[idx1].medida_r > 0 THEN
+ LET total_medida_r = total_medida_r + rdespiece[idx1].medida_r
+ END IF
+ IF rdespiece[idx1].medida > 0 THEN
+ LET total_medida = total_medida + rdespiece[idx1].medida
+ END IF
+ END FOR
+ DISPLAY BY NAME total_medida,total_medida_r
+ END IF
+ AFTER INPUT
+ IF Int_flag THEN
+ LET pestado = FALSE
+ EXIT INPUT
+ END IF
+ LET total_medida_r = 0
+ LET cuenta_despiece = arr_count()
+ FOR idx1 = 1 TO cuenta_despiece
+ IF rdespiece[idx1].medida_r > 0 THEN
+ LET total_medida_r = total_medida_r + rdespiece[idx1].medida_r
+ END IF
+ IF rdespiece[idx1].medida > 0 THEN
+ LET total_medida = total_medida + rdespiece[idx1].medida
+ END IF
+ END FOR
+ DISPLAY "T ",total_medida_r," ",pcantidad
+ IF total_medida_r <> pcantidad THEN
+
+ CONTINUE INPUT
+ END IF
+
+ DISPLAY BY NAME total_medida,total_medida_r
+ IF int_flag THEN
+ CLOSE WINDOW w10
+ RETURN FALSE
+ END IF
+ END INPUT
+ IF int_flag THEN
+ LET int_flag = FALSE
+ LET pestado = FALSE
+ END IF
+# WHENEVER ERROR CONTINUE
+ BEGIN WORK
+
+ LET numerotemp = numero_req
+ FOR idx1 = 1 TO cuenta_despiece
+ IF rdespiece[idx1].cantidad_r > 0 THEN
+ DELETE FROM cctb00030 WHERE us_crea = usuarios and num_req = numero_req and
+ area = parea AND
+ cod_n = rdespiece[idx1].cod_n and
+ cod_grupo = rdespiece[idx1].cod_grupo and
+ cod_tipo = rdespiece[idx1].cod_tipo and
+ cod_Sec = rdespiece[idx1].cod_sec
+ LET rdespiece[idx].etiqueta=idx
+ INSERT INTO cctb00030
+ (num_req,etiqueta,num_oc,secuencia,area,cod_n,cod_grupo,cod_tipo,cod_sec,
+ Lado_1,lado_2,lado_3,cantidad,medida,cantidad_r,medida_r,us_crea,
+ fech_crea)
+ VALUES
+ (numero_req,rdespiece[idx1].etiqueta,numero_ord,idx,parea,rdespiece[idx1].cod_n,
+ rdespiece[idx1].cod_grupo,rdespiece[idx1].cod_tipo,rdespiece[idx1].cod_sec,
+ rdespiece[idx1].lado_1,rdespiece[idx1].lado_2,rdespiece[idx1].lado_3,
+ rdespiece[idx1].cantidad,rdespiece[idx1].medida,rdespiece[idx1].cantidad_r,
+ rdespiece[idx1].medida_r,usuarios,GETDATE())
+
+ IF STATUS < 0 THEN
+ ROLLBACK WORK
+ CALL fgl_winmessage("ERROR","OCURRIO UN ERROR ACTUALIZANDO LOS DATOS","STOP")
+ LET pestado = FALSE
+ EXIT FOR
+ CLOSE WINDOW w10
+ ELSE
+
+ LET pestado = TRUE
+ END IF
+ END IF
+ END FOR
+ IF pestado THEN
+ COMMIT WORK
+ ELSE
+ ROLLBACK WORK
+ END IF
+
+ CLOSE WINDOW w10
+
+ RETURN pestado
+END FUNCTION
+
+FUNCTION carga_lista()
+ DEFINE busca_vend SMALLINT,
+ bnombre_vend CHAR(50)
+
+INPUT BY NAME busca_vend
+ AFTER FIELD busca_vend
+ IF busca_vend IS NOT NULL THEN
+
+ SELECT RTRIM(b.nom1_emp)||' '||b.apell1_emp
+ INTO bnombre_vend
+ FROM adtb00003 b
+ WHERE b.num_emp = busca_vend
+
+ IF STATUS = NOTFOUND THEN
+ CALL msg(3)
+ NEXT FIELD busca_vend
+ END IF
+ DISPLAY BY NAME bnombre_vend
+ END IF
+
+ AFTER INPUT
+ IF Int_flag THEN
+ LET int_flag = FALSE
+ RETURN
+ END IF
+ END INPUT
+
+ DISPLAY ARRAY listarequisi TO s_lista.*
+ BEFORE DISPLAY
+
+ CALL busca_lista(busca_vend)
+
+ IF idx = 1 THEN
+ RETURN
+ END IF
+ ON ACTION refrescar
+ CALL busca_lista(busca_vend)
+ AFTER DISPLAY
+ EXIT DISPLAY
+ END DISPLAY
+
+END FUNCTION
+
+FUNCTION busca_lista(xvend)
+ DEFINE xvend SMALLINT
+ DECLARE busca_requi20 CURSOR FOR
+ SELECT a.estado,a.estado_despacho,x.estado_produccion,a.num_req,CAST(a.fecha AS CHAR(10)),
+ e.descrip_Esp||' '||e.unidad_med,CAST(b.fecha_transporte AS CHAR(10)),CAST(b.fecha_llegada AS CHAR(10)),
+ b.num_oc,c.nombre,SUM(b.valor)
+ FROM cctb00025 a,cctb00026 b,vetb00004 c,prtb00012 d,iptb00002 e,prtb00013 x
+ WHERE a.sec_vend = xvend AND
+ a.num_req = b.num_req AND
+ b.num_oc = d.num_oc AND
+ b.num_oc = x.num_oc AND
+ d.tipo_cliente = c.tipo_cliente AND
+ d.sec_cliente = c.sec_cliente AND
+ b.area = x.area AND
+ b.cod_n = e.cod_n AND b.cod_grupo = e.cod_grupo AND
+ b.cod_tipo = e.cod_tipo AND b.cod_Sec = e.cod_sec AND
+ b.cod_n = x.cod_n AND b.cod_grupo = x.cod_grupo AND
+ b.cod_tipo = x.cod_tipo AND b.cod_Sec = x.cod_Sec AND
+ d.cerrada = 'N' AND a.status_t IS NULL AND a.estado_despacho NOT IN ('DESPACHADA')
+ GROUP BY a.estado,a.estado_despacho,a.num_req,b.num_oc,c.nombre,a.fecha, e.descrip_Esp,e.unidad_med,
+ b.fecha_transporte,b.fecha_llegada,x.estado_produccion
+ ORDER BY a.estado DESC
+ LET idx = 1
+ FOREACH busca_requi20 INTO listarequisi[idx].estado1,
+ listarequisi[idx].estado2,
+ listarequisi[idx].estado_produccion,
+ listarequisi[idx].num_req1,
+ listarequisi[idx].fecha1,
+ listarequisi[idx].material,
+ listarequisi[idx].fecha_transporte,
+ listarequisi[idx].fecha_llegada,
+ listarequisi[idx].num_oc1,
+ listarequisi[idx].cliente1,
+ listarequisi[idx].valor1
+ LET idx = idx + 1
+ END FOREACH
+ CALL set_count(idx-1)
+
+END FUNCTION
+
+FUNCTION factor_conv(pcodn,pcodgrupo,pcodtipo,pcodsec,pcantidad)
+ DEFINE pcodn,pcodgrupo,pcodtipo,pcodsec SMALLINT,
+ pcantidad,pfactor,presultado DEC(12,5),
+ pestado BOOLEAN
+
+ LET pfactor = 0
+ SELECT a.factor_conv INTO pfactor
+ FROM iptb00001 a
+ WHERE a.cod_n = pcodn AND
+ a.cod_grupo = pcodgrupo AND
+ a.cod_tipo = pcodtipo AND
+ a.cod_sec = pcodsec AND a.status_t IS NULL
+
+ IF STATUS = NOTFOUND THEN
+ LET pestado = FALSE
+ ELSE
+
+ LET presultado = pcantidad * pfactor
+
+ LET pestado = TRUE
+ END IF
+ RETURN presultado,pestado
+END FUNCTION
+
+FUNCTION input_data()
+ DEFINE remanente,unidadRemanente DEC(12,4)
+ CALL set_count(idx-1)
+
+ INPUT ARRAY arr_requisicion WITHOUT DEFAULTS FROM s_requisi.*
+
+ BEFORE ROW
+ LET curr = arr_curr()
+ LET scr_l = scr_line()
+
+ AFTER FIELD cantidad_1
+ IF arr_requisicion[curr].cantidad_1 > 0 AND arr_requisicion[curr].procesa = "SI" THEN
+ LET arr_requisicion[curr].valor = 0
+ CALL factor_conv(arr_requisicion[curr].cod_n,
+ arr_requisicion[curr].cod_grupo,arr_requisicion[curr].cod_tipo,
+ arr_requisicion[curr].cod_sec,arr_requisicion[curr].cantidad_1)
+ RETURNING resultado,estado
+
+ IF estado = FALSE THEN
+ CALL fgl_winmessage("ERROR","PROBLEMA EN EL FACTOR DE CONVERSION, CONTACTE ADM INVENTARIO","STOP")
+ NEXT FIELD cantidad
+ END IF
+
+ LET arr_requisicion[curr].cantidad = resultado
+ DISPLAY arr_requisicion[curr].cantidad TO s_requisi[scr_l].cantidad
+ IF arr_requisicion[curr].cantidad_1 > arr_requisicion[curr].cantidad_ord1 THEN
+ CALL fgl_Winmessage("ERROR","CANTIDAD EXECEDE CANTIDAD ORDEN","STOP")
+ NEXT FIELD cantidad_1
+ END IF
+ CALL controles(requisicion.num_req,arr_requisicion[curr].area,arr_requisicion[curr].cod_n,
+ arr_requisicion[curr].cod_grupo,arr_requisicion[curr].cod_tipo,
+ arr_requisicion[curr].cod_sec,arr_requisicion[curr].num_oc,arr_requisicion[curr].cantidad,
+ arr_requisicion[curr].cantidad_ord)
+ RETURNING estado,remanente,unidadRemanente
+
+ IF NOT estado THEN
+ CALL fgl_winmessage("ERROR","NO PUEDE HACER MAS REQUISICION A ESTA ORDEN","STOP")
+ NEXT FIELD cantidad_1
+ END IF
+ LET arr_requisicion[curr].descvalor =(arr_requisicion[curr].cantidad *
+ arr_requisicion[curr].precio) *
+ (arr_requisicion[curr].descuento/100)
+ LET arr_requisicion[curr].valor = (arr_requisicion[curr].cantidad *
+ arr_requisicion[curr].precio) -
+ arr_requisicion[curr].descvalor
+
+ LET arr_requisicion[curr].valor = arr_requisicion[curr].valor +
+ (arr_requisicion[curr].valor * (porc_itbis[curr]/100))
+
+ IF arr_requisicion[curr].valor < 0 THEN
+ LET arr_requisicion[curr].valor =arr_requisicion[curr].cantidad *
+ arr_requisicion[curr].precio
+ END IF
+ DISPLAY arr_requisicion[curr].valor TO s_requisi[scr_l].valor
+ END IF
+
+ ON ACTION procesa
+ LET rcantidad = arr_count()
+ CALL req_insert() RETURNING estado
+ IF estado = TRUE THEN
+ # CALL envia_correo()
+ DISPLAY BY NAME requisicion.num_req
+ CALL fgl_winmessage("MENSAJE","ADICION EXITOSA","STOP")
+ CLEAR FORM
+ CALL arr_requisicion.clear()
+ RETURN
+ END IF
+ END INPUT
+
+END FUNCTION
+
+FUNCTION ccprmf008()
+
+ DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM)
+ CONSTRUCT criterio ON a.num_req,c.num_oc,a.fecha FROM num_req,busca_orden,fecha_requisicion
+ ON ACTION refrescar
+ CALL carga_lista()
+ ON ACTION busca_parametros ATTRIBUTE(TEXT="Ejecuta Busqueda",IMAGE="find_all")
+
+ LET selec =
+ "SELECT DISTINCT a.num_req,CONVERT(CHAR(10),a.fecha,103),a.sec_vend_aprobado,",
+ "(SELECT RTRIM(k.nom1_emp)+' '+k.apell1_emp FROM adtb00003 k WHERE ",
+ "k.num_emp = a.sec_vend_aprobado) as nombre_aprobado,",
+ "a.sec_vend,ISNULL(RTRIM(b.nom1_emp),' ') +' '+ISNULL(b.apell1_emp,' '),a.estado ",
+ " FROM cctb00025 a,adtb00003 b,cctb00026 c ",
+ " WHERE ",criterio CLIPPED," AND a.num_req = c.num_req ",
+ " AND a.sec_vend = b.num_emp AND a.status_t is null ",
+ " ORDER BY a.num_req"
+
+ PREPARE comando2 FROM selec
+ DECLARE busca_req SCROLL CURSOR FOR comando2
+ OPEN busca_req
+
+
+ FETCH FIRST busca_req INTO requisicion.num_req,pfecha_req,
+ requisicion.sec_vend_a,requisicion.nombre_a,
+ requisicion.sec_vend,requisicion.nombre_vendedor,
+ requisicion.estado
+
+ IF STATUS = NOTFOUND THEN
+ CALL fgl_winmessage("ERROR","NO EXISTEN ORDENES CON ESTE CRITERIO DE BUSQUEDA","STOP")
+ EXIT DIALOG
+ ELSE
+ CALL busca_info()
+
+ MENU
+ ON ACTION mensaje
+ CALL entraMensaje(requisicion.num_req,pcotizacion,"M",usuarios)
+
+ ON ACTION siguiente
+ FETCH NEXT busca_req INTO requisicion.num_req,requisicion.fecha_requisicion,
+ requisicion.sec_vend_a,requisicion.nombre_a,
+ requisicion.sec_vend,requisicion.nombre_vendedor,
+ requisicion.estado
+
+ CALL busca_info()
+ ON ACTION primero
+ FETCH FIRST busca_req INTO requisicion.num_req,requisicion.fecha_requisicion,
+ requisicion.sec_vend_a,requisicion.nombre_a,
+ requisicion.sec_vend,requisicion.nombre_vendedor,
+ requisicion.estado
+
+ CALL busca_info()
+ ON ACTION ultimo
+ FETCH LAST busca_req INTO requisicion.num_req,requisicion.fecha_requisicion,
+ requisicion.sec_vend_a,requisicion.nombre_a,
+ requisicion.sec_vend,requisicion.nombre_vendedor,
+ requisicion.estado
+
+ CALL busca_info()
+ CALL fgl_winmessage("MENSAJE","ULTIMO REGISTRO","STOP")
+ ON ACTION anterior
+ FETCH PREVIOUS busca_req INTO requisicion.num_req,requisicion.fecha_requisicion,
+ requisicion.sec_vend_a,requisicion.nombre_a,
+ requisicion.sec_vend,requisicion.nombre_vendedor,
+ requisicion.estado
+
+ CALL busca_info()
+ ON ACTION anular
+
+ # CONTROL REQUISICION DESPACHADA
+ SELECT UNIQUE a.num_req FROM iptb00006 a
+ WHERE a.num_req = requisicion.num_req AND a.status_t IS null
+
+ IF STATUS <> NOTFOUND THEN
+ CALL fgl_winmessage("ERR0R","REQUISICION TIENE DESPACHO NO PUEDE ANULAR","INFO")
+ CONTINUE DIALOG
+ END IF
+ LET respuesta= fgl_winquestion("ATENCION","ESTA SEGURO DE ANULAR ESTA REQUISICION?","no","yes|no","question",0)
+ IF respuesta = "yes" THEN
+ LET pcotizacion = NULL
+ LET xorden = NULL
+ LET xtipocliente=NULL
+ LET xseccliente = NULL
+ LET requisicion.estado=NULL
+
+ SELECT DISTINCT a.cotizacion_no,a.num_oc,b.tipo_cliente,b.sec_cliente,c.monto_req,c.estado
+ INTO pcotizacion, xorden,xtipocliente,xseccliente,xmonto,requisicion.estado
+ FROM cctb00026 a,prtb00012 b,cctb00025 c
+ WHERE a.num_req = requisicion.num_req AND a.num_req = c.num_req AND a.cotizacion_no = b.cotizacion_no AND
+ b.status_t IS NULL AND c.status_t IS null
+ BEGIN WORK
+ UPDATE cctb00025 SET status_t = 'E',
+ us_mod = suser_sname(),
+ fech_mod = getdate(),
+ estado = 'ANULADA'
+ WHERE num_req = requisicion.num_req
+ UPDATE cctb00026 SET status_t = 'E',
+ us_mod = suser_sname(),
+ fech_mod = getdate()
+
+ WHERE num_req = requisicion.num_req
+ UPDATE cctb00027 SET status_t = 'E',
+ us_mod = suser_sname(),
+ fech_mod = getdate()
+
+ WHERE num_req = requisicion.num_req
+
+ #INSERTA EN TABLA LOG
+ INSERT INTO cctb00031
+ (fecha,us_crea,sec_vend,nombrevendedor,tipo_cliente,sec_cliente,num_oc,descrip_estado,
+ num_req,tipo_doc_ref,cotizacion_no )
+ VALUES (getdate(),usuarios,requisicion.sec_vend,requisicion.nombre_vendedor,
+ xtipocliente,xseccliente,xorden,
+ 'ESTA REQUISICION FUE ANULADA',requisicion.num_req,'RQ',pcotizacion)
+ COMMIT WORK
+ END IF
+ CLEAR FORM
+{ ON ACTION actualizar
+
+ IF requisicion.sec_vend_a IS NULL THEN
+ CALL input_data()
+ FOR idx = 1 TO arr_count()
+ IF arr_requisicion[idx].cantidad > 0 THEN
+ IF arr_requisicion[idx].procesa = "SI" THEN
+ UPDATE cctb00026 SET cantidad = arr_requisicion[idx].cantidad,
+ us_mod = usuarios,
+ fech_mod = getdate()
+ WHERE cod_n = arr_requisicion[idx].cod_n AND
+ cod_n = arr_requisicion[idx].cod_n AND
+ cod_grupo = arr_requisicion[idx].cod_grupo AND
+ cod_tipo = arr_requisicion[idx].cod_tipo AND
+ cod_sec = arr_requisicion[idx].cod_sec AND
+ num_req = requisicion.num_req
+ END IF
+ END IF
+ END FOR
+ ELSE
+ CALL fgl_winmessage("ERROR","NO PUEDE ACTUALIZAR REQUISICION, YA ESTA APROBADA","STOP")
+ END IF
+ }
+
+
+ ON ACTION sale
+ EXIT DIALOG
+ END MENU
+ END IF
+
+ END CONSTRUCT
+
+ ON ACTION cancel
+ CALL arr_requisicion.clear()
+ CALL msg(2)
+ EXIT DIALOG
+
+ END DIALOG
+END FUNCTION
+
diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw
index adec424..067674a 100644
--- a/PROYECTO/mbsERP.4pw
+++ b/PROYECTO/mbsERP.4pw
@@ -879,10 +879,12 @@
+
+
diff --git a/PROYECTO/otrodir/autorizacioncontado.4gl b/PROYECTO/otrodir/autorizacioncontado.4gl
index 3ec80be..2d38dfe 100644
--- a/PROYECTO/otrodir/autorizacioncontado.4gl
+++ b/PROYECTO/otrodir/autorizacioncontado.4gl
@@ -39,7 +39,7 @@ FUNCTION autorizacioncontado(pcotizacion,valor_cotizado,pagado,usuarios,xmonto_a
xfecha_oc,psecvend,usuarios)
RETURNING xnum_req,valor_requisicion
END IF
- IF xnum_req IS NULL THEN
+ IF xnum_req IS NULL OR xnum_req = 0 THEN
SELECT MAX(a.num_req) INTO xnum_req FROM cctb00026 a WHERE a.cotizacion_no = pcotizacion
AND a.status_t IS NULL
END IF
diff --git a/PROYECTO/otrodir/autorizacioncontado.4gl.bak20261005 b/PROYECTO/otrodir/autorizacioncontado.4gl.bak20261005
new file mode 100644
index 0000000..3ec80be
--- /dev/null
+++ b/PROYECTO/otrodir/autorizacioncontado.4gl.bak20261005
@@ -0,0 +1,90 @@
+FUNCTION autorizacioncontado(pcotizacion,valor_cotizado,pagado,usuarios,xmonto_avance,xnum_doc,xtipo_doc,xnombre_cliente)
+ DEFINE pcotizacion,xnum_oc,pcondpago,ptipocliente,psecliente,xnum_req,psecvend,xnum_doc INT,
+ xfecha_oc,xtipo_Doc CHAR(10),
+ usuarios,xestado VARCHAR(50),
+ valor_cotizado,xmonto_avance,pagado,valor_requisicion DEC(12,2),
+ descripcion_estado,nombre_ven,xnombre_cliente,estado VARCHAR(100)
+
+
+ SELECT a.num_oc,a.tipo_cliente,a.sec_cliente,a.cond_pago,a.sec_vend, CONVERT(CHAR(10),a.fecha_oc,103)
+ INTO xnum_oc,ptipocliente,psecliente,pcondpago,psecvend,xfecha_oc
+ FROM prtb00012 a WHERE a.cotizacion_no = pcotizacion AND a.status_t IS NULL
+
+ IF STATUS = NOTFOUND THEN
+ LET descripcion_estado = 'REQUISICION ',xnum_req USING "<<<<<<<<",
+ ' NO AUTORIZADA POR SISTEMA, LA COTIZACION NO TIENE ORDEN, CONDICION AL CONTADO'
+ LET xestado = 'NO AUTORIZADA'
+ LET estado = descripcion_estado
+ INSERT INTO cctb00031 (fecha,us_crea,sec_vend,tipo_cliente,
+ sec_cliente,nombreCliente,num_req,limite_cr,monto_cotizacion,
+ balance,estado,tipo_doc_ref,monto_req,num_recibo,tipo_doc,
+ monto_avance,valor_cotizacion,descrip_estado,cotizacion_no,nombrevendedor,num_oc)
+
+ VALUES (getdate(),'MBS',psecvend,ptipocliente,psecliente,
+ xnombre_cliente,xnum_req,'0',valor_cotizado,'0',xestado,
+ xtipo_Doc,valor_cotizado,xnum_doc,xtipo_Doc,
+ xmonto_avance,valor_cotizado,descripcion_estado,xnum_oc,nombre_ven,xnum_oc )
+
+ RETURN
+ END IF
+
+ SELECT RTRIM(a.nom1_emp)+ISNULL(a.apell1_Emp,'') INTO nombre_ven
+ FROM adtb00003 a WHERE a.num_emp = psecvend
+
+ SELECT DISTINCT a.cotizacion_no FROM cctb00026 a WHERE a.cotizacion_no = pcotizacion
+ AND a.status_t IS NULL
+## CUANDO NO TIENE LA REQUISICION DE DESPACHOS
+ IF STATUS = NOTFOUND THEN
+ CALL requisiciondespacho(xnum_oc,ptipocliente,psecliente,Pcondpago,valor_cotizado,
+ xfecha_oc,psecvend,usuarios)
+ RETURNING xnum_req,valor_requisicion
+ END IF
+ IF xnum_req IS NULL THEN
+ SELECT MAX(a.num_req) INTO xnum_req FROM cctb00026 a WHERE a.cotizacion_no = pcotizacion
+ AND a.status_t IS NULL
+ END IF
+ LET estado ="LA REQUISICION ",xnum_req USING "<<<<<<<<", " NO AUTORIZADA"
+ UPDATE cctb00001 SET num_req = xnum_req
+ WHERE tipo_doc =xtipo_Doc AND num_doc = xnum_doc AND
+ tipo_cliente =ptipocliente AND
+ sec_cliente = psecliente
+
+
+ IF xmonto_avance +pagado >= valor_cotizado THEN
+ LET xestado = 'AUTORIZADA'
+
+ UPDATE cctb00025 SET estado =xestado,us_mod = 'MBS',fech_mod = getdate()
+ WHERE num_req = xnum_req
+
+
+ LET descripcion_estado = 'REQUISICION ',xnum_req USING "<<<<<<<<",
+ ' AUTORIZADA POR SISTEMA, LA COTIZACION ES AL CONTADO'
+ LET estado = descripcion_estado
+ INSERT INTO cctb00031 (fecha,us_crea,sec_vend,tipo_cliente,
+ sec_cliente,nombreCliente,num_req,limite_cr,monto_cotizacion,
+ balance,estado,tipo_doc_ref,monto_req,num_recibo,tipo_doc,
+ monto_avance,valor_cotizacion,descrip_estado,cotizacion_no,nombrevendedor,num_oc)
+
+ VALUES (getdate(),'MBS',psecvend,ptipocliente,psecliente,
+ xnombre_cliente,xnum_req,'0',valor_cotizado,'0',xestado,
+ xtipo_Doc,valor_cotizado,xnum_doc,xtipo_Doc,
+ xmonto_avance,valor_cotizado,descripcion_estado,xnum_oc,nombre_ven,xnum_oc )
+
+ ELSE
+ LET descripcion_estado = 'REQUISICION ',xnum_req USING "<<<<<<<<",
+ ' NO AUTORIZADA POR SISTEMA, LA COTIZACION ES AL CONTADO'
+ LET xestado = 'NO AUTORIZADA'
+ LET estado = descripcion_estado
+ INSERT INTO cctb00031 (fecha,us_crea,sec_vend,tipo_cliente,
+ sec_cliente,nombreCliente,num_req,limite_cr,monto_cotizacion,
+ balance,estado,tipo_doc_ref,monto_req,num_recibo,tipo_doc,
+ monto_avance,valor_cotizacion,descrip_estado,cotizacion_no,nombrevendedor,num_oc)
+
+ VALUES (getdate(),'MBS',psecvend,ptipocliente,psecliente,
+ xnombre_cliente,xnum_req,'0',valor_cotizado,'0',xestado,
+ xtipo_Doc,valor_cotizado,xnum_doc,xtipo_Doc,
+ xmonto_avance,valor_cotizado,descripcion_estado,xnum_oc,nombre_ven,xnum_oc )
+
+ END IF
+ RETURN estado
+END FUNCTION
\ No newline at end of file
diff --git a/PROYECTO/otrodir/autorizarequisicion.4gl b/PROYECTO/otrodir/autorizarequisicion.4gl
index 003128c..cc9dd56 100644
--- a/PROYECTO/otrodir/autorizarequisicion.4gl
+++ b/PROYECTO/otrodir/autorizarequisicion.4gl
@@ -6,13 +6,24 @@
ACTUALIZA LA REQUISICION DE DESPACHO
}
-FUNCTION autorizarequisicion(balance,monto_actual_req, monto_req_autorizadas, limite_cr,tienefactura,factura)
- DEFINE balance,monto_actual_req, monto_req_autorizadas, limite_cr,valor_total DEC(12,2),
+FUNCTION autorizarequisicion(balance,monto_actual_req, monto_req_autorizadas, limite_cr,tienefactura,factura,ztipocliente)
+ DEFINE balance,monto_actual_req, monto_req_autorizadas, limite_cr,valor_total,tasa,
+ monto_control DEC(12,2),
string_estado STRING,
tienefactura VARCHAR(2),
autoriza BOOLEAN,
- factura INT
+ factura,ztipocliente INT
+
+ # BUSCA TASA
+ SELECT a.ultima_tasa INTO tasa FROM vetb00060 a
+ WHERE a.tipo_cliente = ztipocliente
+ IF tasa > 1 THEN
+ LET monto_control = 1.60 * tasa
+ ELSE
+ LET monto_control = 100
+ END IF
+
LET valor_total = monto_req_autorizadas+monto_actual_req
IF tienefactura = "SI" THEN
LET string_estado = "ESTA REQUISICION NO FUE AUTORIZADA, TIENE FACTURAS VENCIDAS EL CLIENTE, UNA DE LAS FACTURAS ES ",factura USING "<<<<<<<<"
@@ -23,7 +34,7 @@ FUNCTION autorizarequisicion(balance,monto_actual_req, monto_req_autorizadas, li
#CUANDO EL CLIENTE TIENE SALDO A FAVOR
IF balance < 0 THEN
- IF ((balance * -1)) >=valor_total THEN
+ IF ((balance * -1))+monto_control >=valor_total THEN
LET autoriza = TRUE
LET string_estado = "ESTA REQUISICION ESTA AUTORIZADA, PORQUE EL BALANCE DE ",balance USING "##,###,###.##",
diff --git a/PROYECTO/otrodir/evaluaclientes.4gl b/PROYECTO/otrodir/evaluaclientes.4gl
index 8ce17e5..4dd0362 100644
--- a/PROYECTO/otrodir/evaluaclientes.4gl
+++ b/PROYECTO/otrodir/evaluaclientes.4gl
@@ -146,15 +146,15 @@ FUNCTION evaluaclientes
FOREACH busca_vencido INTO xaplicacion,xpendiente
IF xpendiente > 0 THEN
- SELECT MAX( a.tipo_doc),MAX(a.fecha_ven)
- INTO Xtipodoc,Xfechavence
- FROM cctb00001 a
- WHERE a.status_t IS NULL AND a.num_doc = a.aplica_a AND
+ SELECT MAX( a.tipo_doc),MAX(a.fecha_ven)
+ INTO Xtipodoc,Xfechavence
+ FROM cctb00001 a
+ WHERE a.status_t IS NULL AND a.num_doc = a.aplica_a AND
a.num_doc=xaplicacion AND
- a.tipo_doc not in ("PG","NC","PC","OC","DV","AV","AP") and
- a.tipo_cliente=xtipocliente AND
+ a.tipo_doc not in ("PG","NC","PC","OC","DV","AV","AP") and
+ a.tipo_cliente=xtipocliente AND
a.sec_cliente=xseccliente
-
+
LET dias = 0
IF xfechavence IS NULL THEN
CONTINUE FOREACH
@@ -174,8 +174,8 @@ FUNCTION evaluaclientes
EXIT FOREACH
END IF
END IF
- END IF
- # OUTPUT TO REPORT prueba(xaplicacion,xpendiente,xfechavence,dias)
+ END IF
+ # OUTPUT TO REPORT prueba(xaplicacion,xpendiente,xfechavence,dias)
END FOREACH
END IF
@@ -188,7 +188,7 @@ FUNCTION evaluaclientes
LET monto_cotizacion = 0
END IF
#FUNCTION PARAMETROS AUTORIZACIONES DESPACHO
- CALL autorizarequisicion(balance,xmonto,monto_cotizacion,xlimite,tienefactura,facturas) RETURNING autoriza,string_estado
+ CALL autorizarequisicion(balance,xmonto,monto_cotizacion,xlimite,tienefactura,facturas,xtipocliente) RETURNING autoriza,string_estado
SELECT a.correo INTO emailto FROM seg0003 a,seg0000 b
WHERE b.sec_vend = xsec_vend AND
diff --git a/PROYECTO/otrodir/requisiciondespacho.4gl b/PROYECTO/otrodir/requisiciondespacho.4gl
index 37253d9..0106c47 100644
--- a/PROYECTO/otrodir/requisiciondespacho.4gl
+++ b/PROYECTO/otrodir/requisiciondespacho.4gl
@@ -18,37 +18,38 @@
pusuarios CHAR(50),
selec STRING,
txtmensaje VARCHAR(200),
- pubicacion VARCHAR(170)
+ pubicacion VARCHAR(170),
+ idx_max INT
- DEFINE arr_requisicion DYNAMIC ARRAY OF RECORD
- procesa CHAR(3),
- num_oc INT,
- fecha CHAR(10),
- cotizacion_no INT,
- tipo_cliente SMALLINT,
- sec_cliente INT,
- nombre CHAR(30),
- cantidad_1 DEC(12,5),
+ DEFINE arr_requisicion DYNAMIC ARRAY OF RECORD
+ procesa CHAR(3),
+ num_oc INT,
+ fecha CHAR(10),
+ cotizacion_no INT,
+ tipo_cliente SMALLINT,
+ sec_cliente INT,
+ nombre CHAR(30),
+ cantidad_1 DEC(12,5),
cantidad DEC(12,5),
- area SMALLINT,
- cod_n SMALLINT,
- cod_grupo SMALLINT,
- cod_tipo SMALLINT,
- cod_sec SMALLINT,
- descripcion CHAR(30),
- unidad_med CHAR(3),
- cantidad_ord1 DEC(12,5),
- cantidad_ord DEC(12,5),
- cantidad_pendiente DEC(12,5),
- precio DEC(12,2),
- descuento DEC(12,2),
- descvalor DEC(12,2),
- valor DEC(12,2)
+ area SMALLINT,
+ cod_n SMALLINT,
+ cod_grupo SMALLINT,
+ cod_tipo SMALLINT,
+ cod_sec SMALLINT,
+ descripcion CHAR(30),
+ unidad_med CHAR(3),
+ cantidad_ord1 DEC(12,5),
+ cantidad_ord DEC(12,5),
+ cantidad_pendiente DEC(12,5),
+ precio DEC(12,2),
+ descuento DEC(12,2),
+ descvalor DEC(12,2),
+ valor DEC(12,2)
END RECORD,
pitbis,xmonto,monto_cotizacion DEC(12,2),
estado_req varchar(30),
cuenta smallint
-
+
SET CONNECTION "MSSQL"
LET monto_cotizacion = xmonto
@@ -61,16 +62,37 @@
# PREPARE s FROM "SELECT @@IDENTITY"
- SELECT a.num_req INTO xnumreq FROM cctb00019 a
- IF xnumreq IS NULL THEN
- LET xnumreq = 0
- END IF
- LET xnumreq = xnumreq + 1
-
+ # 05/10/2026 - Error -268 PK_cctb00025 duplicada: el consecutivo se leia
+ # fuera de la transaccion y sin bloqueo (con RCSI dos usuarios leen el mismo
+ # num_req). Ahora se lee DENTRO de BEGIN WORK con UPDLOCK,HOLDLOCK y se
+ # compara contra MAX(cctb00025) por si el contador quedo atrasado.
+ WHENEVER ERROR CONTINUE
BEGIN WORK
+ PREPARE p_numreq FROM "SELECT ISNULL(MAX(num_req),0) FROM cctb00019 WITH (UPDLOCK, HOLDLOCK)"
+ EXECUTE p_numreq INTO xnumreq
+ IF STATUS < 0 THEN
+ ROLLBACK WORK
+ CALL fgl_winmessage("ERROR",SQLERRMESSAGE,"STOP")
+ RETURN 0,0
+ END IF
+ PREPARE p_maxreq FROM "SELECT ISNULL(MAX(num_req),0) FROM cctb00025 WITH (UPDLOCK, HOLDLOCK)"
+ EXECUTE p_maxreq INTO idx_max
+ IF xnumreq IS NULL THEN
+ LET xnumreq = 0
+ END IF
+ IF idx_max > xnumreq THEN
+ LET xnumreq = idx_max
+ END IF
+ LET xnumreq = xnumreq + 1
+
UPDATE cctb00019 SET num_req = xnumreq,us_crea=pusuarios,fech_crea=getdate()
# EXECUTE s INTO xnumreq
-
+ IF STATUS < 0 THEN
+ ROLLBACK WORK
+ CALL fgl_winmessage("ERROR",SQLERRMESSAGE,"STOP")
+ RETURN 0,0
+ END IF
+
LET selec =
"INSERT INTO cctb00034 (id_kit,cotizacion_no,num_oc,num_req,secuencia,area,cod_n,cod_grupo,cod_tipo,cod_sec,cantidad)",
"SELECT a.id_kit,a.cotizacion_no,a.num_oc,'",xnumreq USING "<<<<<<","',a.secuencia,a.area,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.cantidad ",
@@ -82,8 +104,8 @@ BEGIN WORK
IF STATUS < 0 THEN
ROLLBACK WORK
- CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO")
- RETURN xnumreq,xmonto
+ CALL fgl_winmessage("ERROR",SQLERRMESSAGE,"STOP")
+ RETURN 0,0
END IF
LET estado_req = 'NO AUTORIZADA'
@@ -169,8 +191,8 @@ BEGIN WORK
IF STATUS < 0 THEN
ROLLBACK WORK
- CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO")
- RETURN xnumreq,xmonto
+ CALL fgl_winmessage("ERROR",SQLERRMESSAGE,"STOP")
+ RETURN 0,0
END IF
@@ -208,8 +230,8 @@ BEGIN WORK
EXECUTE comando
IF STATUS < 0 THEN
ROLLBACK WORK
- CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO")
- RETURN xnumreq,xmonto
+ CALL fgl_winmessage("ERROR",SQLERRMESSAGE,"STOP")
+ RETURN 0,0
END IF
@@ -221,8 +243,8 @@ BEGIN WORK
"NO DESPACHADA",xmonto)
IF STATUS < 0 THEN
ROLLBACK WORK
- CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO")
- RETURN xnumreq,xmonto
+ CALL fgl_winmessage("ERROR",SQLERRMESSAGE,"STOP")
+ RETURN 0,0
END IF
COMMIT WORK
@@ -246,5 +268,6 @@ BEGIN WORK
# subject, procedimiento )
# CALL fgl_Winmessage("INFORMACION",chmensaje,"STOP")
+ WHENEVER ERROR STOP
RETURN xnumreq,xmonto
END FUNCTION
diff --git a/PROYECTO/otrodir/requisiciondespacho.4gl.bak20261005 b/PROYECTO/otrodir/requisiciondespacho.4gl.bak20261005
new file mode 100644
index 0000000..37253d9
--- /dev/null
+++ b/PROYECTO/otrodir/requisiciondespacho.4gl.bak20261005
@@ -0,0 +1,250 @@
+{
+ FUNCION : requisiciondespacho()
+ OBJETIVO : hacer la requisicion de despacho automatica
+ FECHA : 27/08/2011
+ DESARROLLADO POR : Ing. Juan Soto
+ }
+ SCHEMA smarmotech
+ FUNCTION requisiciondespacho(xnum_oc,xtipo_cliente,xsec_cliente,xcondpago,xmonto,xfecha_oc,
+ xsec_vend,pusuarios)
+
+ DEFINE xnum_oc INT,
+ xfecha_oc DATE,
+ xsec_vend,xkit INT,
+ xnumreq,xtipo_cliente,xsec_cliente,pcotizacion INT,
+ idx,xcondpago smallint,
+ chmensaje,procedimiento,cuerpo_correo,subject STRING,
+ vendedorEmail,nombre_vendedor CHAR(60),
+ pusuarios CHAR(50),
+ selec STRING,
+ txtmensaje VARCHAR(200),
+ pubicacion VARCHAR(170)
+
+ DEFINE arr_requisicion DYNAMIC ARRAY OF RECORD
+ procesa CHAR(3),
+ num_oc INT,
+ fecha CHAR(10),
+ cotizacion_no INT,
+ tipo_cliente SMALLINT,
+ sec_cliente INT,
+ nombre CHAR(30),
+ cantidad_1 DEC(12,5),
+ cantidad DEC(12,5),
+ area SMALLINT,
+ cod_n SMALLINT,
+ cod_grupo SMALLINT,
+ cod_tipo SMALLINT,
+ cod_sec SMALLINT,
+ descripcion CHAR(30),
+ unidad_med CHAR(3),
+ cantidad_ord1 DEC(12,5),
+ cantidad_ord DEC(12,5),
+ cantidad_pendiente DEC(12,5),
+ precio DEC(12,2),
+ descuento DEC(12,2),
+ descvalor DEC(12,2),
+ valor DEC(12,2)
+ END RECORD,
+ pitbis,xmonto,monto_cotizacion DEC(12,2),
+ estado_req varchar(30),
+ cuenta smallint
+
+ SET CONNECTION "MSSQL"
+
+ LET monto_cotizacion = xmonto
+
+ SELECT b.nom1_emp || ' '||b.apell1_emp,a.email
+ INTO nombre_vendedor,vendedorEmail
+ FROM seg0000 a,adtb00003 b
+ WHERE a.sec_vend = xsec_vend and
+ a.sec_vend = b.num_emp
+
+# PREPARE s FROM "SELECT @@IDENTITY"
+
+ SELECT a.num_req INTO xnumreq FROM cctb00019 a
+ IF xnumreq IS NULL THEN
+ LET xnumreq = 0
+ END IF
+ LET xnumreq = xnumreq + 1
+
+BEGIN WORK
+ UPDATE cctb00019 SET num_req = xnumreq,us_crea=pusuarios,fech_crea=getdate()
+ # EXECUTE s INTO xnumreq
+
+ LET selec =
+ "INSERT INTO cctb00034 (id_kit,cotizacion_no,num_oc,num_req,secuencia,area,cod_n,cod_grupo,cod_tipo,cod_sec,cantidad)",
+ "SELECT a.id_kit,a.cotizacion_no,a.num_oc,'",xnumreq USING "<<<<<<","',a.secuencia,a.area,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.cantidad ",
+ "FROM prtb00031 a ",
+ " WHERE ",
+ " a.num_oc ='", xnum_oc USING "<<<<<<","'"
+ PREPARE xcctb34 FROM selec
+ EXECUTE xcctb34
+
+ IF STATUS < 0 THEN
+ ROLLBACK WORK
+ CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO")
+ RETURN xnumreq,xmonto
+ END IF
+
+ LET estado_req = 'NO AUTORIZADA'
+ DECLARE insertaReq CURSOR FOR
+ SELECT a.num_oc,a.cotizacion_no,b.secuencia,b.area,b.cod_n,b.cod_grupo,b.cod_tipo,
+ b.cod_Sec,b.cantidad_1,b.cantidad,b.cantidad_1,b.cantidad,c.precio,
+ c.porc_Desc,(c.precio*c.cantidad) * (c.porc_desc/100),a.tipo_cliente,a.sec_cliente,
+ d.nombre_cliente,d.porc_itbi,c.id_kit,a.ubicacion,d.direccion_proyecto
+ FROM prtb00012 a,prtb00023 b,vetb00051 c,vetb00050 d
+ WHERE a.num_oc = b.num_oc and
+ a.cotizacion_no = c.cotizacion_no and
+ a.cotizacion_no = d.cotizacion_no and
+ a.num_oc = xnum_oc and
+ b.cod_n = c.cod_n and
+ b.cod_grupo = c.cod_grupo and
+ b.cod_tipo = c.cod_tipo and
+ b.cod_sec = c.cod_sec AND
+ b.area = c.area
+ UNION
+ SELECT a.num_oc,a.cotizacion_no,b.secuencia,b.area,b.cod_n,b.cod_grupo,b.cod_tipo,
+ b.cod_Sec,b.cantidad_1,b.cantidad,b.cantidad_1,b.cantidad,c.precio,
+ c.porc_Desc,(c.precio*c.cantidad) * (c.porc_desc/100),a.tipo_cliente,a.sec_cliente,
+ d.nombre_cliente,d.porc_itbi,c.id_kit,a.ubicacion,d.direccion_proyecto
+ FROM prtb00012 a,prtb00023 b,vetb00031 c,vetb00050 d
+ WHERE a.num_oc = b.num_oc and
+ a.cotizacion_no = c.cotizacion_no and
+ a.cotizacion_no = d.cotizacion_no and
+ a.num_oc = xnum_oc and
+ b.cod_n = c.cod_n and
+ b.cod_grupo = c.cod_grupo and
+ b.cod_tipo = c.cod_tipo and
+ b.cod_sec = c.cod_sec AND
+ b.area = c.area
+
+
+ LET idx = 1
+ LET pcotizacion = 0
+ LET xmonto = 0
+ # DISPLAY " ESTOY EN ESTO ",xnum_oc
+ FOREACH insertareq INTO arr_requisicion[idx].num_oc,
+ arr_requisicion[idx].cotizacion_no,
+ idx,
+ arr_requisicion[idx].area,
+ arr_requisicion[idx].cod_n,
+ arr_requisicion[idx].cod_grupo,
+ arr_requisicion[idx].cod_tipo,
+ arr_requisicion[idx].cod_Sec,
+ arr_requisicion[idx].cantidad_1,
+ arr_requisicion[idx].cantidad,
+ arr_requisicion[idx].cantidad_ord,
+ arr_requisicion[idx].cantidad_ord1,
+ arr_requisicion[idx].precio,
+ arr_requisicion[idx].descuento,
+ arr_requisicion[idx].descvalor,
+ arr_requisicion[idx].tipo_cliente,
+ arr_requisicion[idx].sec_cliente,
+ arr_requisicion[idx].nombre,
+ pitbis,xkit,
+ pubicacion
+
+ #DISPLAY " VOY PARA LA 26, en el foreach cantidad ",arr_requisicion[idx].cantidad_ord
+ IF arr_requisicion[idx].cantidad_ord IS NOT NULL THEN
+ LET pcotizacion = arr_requisicion[idx].cotizacion_no
+ IF arr_requisicion[idx].descvalor IS NULL THEN
+ LET arr_requisicion[idx].descvalor=0
+ END IF
+ LET arr_requisicion[idx].valor = (arr_requisicion[idx].cantidad *arr_requisicion[idx].precio) -
+ arr_requisicion[idx].descvalor
+ LET arr_requisicion[idx].valor = arr_requisicion[idx].valor + (arr_requisicion[idx].valor * (pitbis/100))
+ LET xmonto = arr_requisicion[idx].valor + xmonto
+ INSERT INTO cctb00026 (num_req,num_oc,cotizacion_no,id,area,cod_n,cod_grupo,cod_tipo,cod_Sec,
+ cantidad_ord1,cantidad_ord,cantidad_1,cantidad,precio,
+ descuento,descvalor,valor,us_crea,fech_crea,estado,id_kit)
+ VALUES (xnumreq,arr_requisicion[idx].num_oc,arr_requisicion[idx].cotizacion_no,
+ idx,arr_requisicion[idx].area,arr_requisicion[idx].cod_n,arr_requisicion[idx].cod_grupo,
+ arr_requisicion[idx].cod_tipo,arr_requisicion[idx].cod_Sec,
+ arr_requisicion[idx].cantidad_ord1,arr_requisicion[idx].cantidad_ord,
+ arr_requisicion[idx].cantidad_1,
+ arr_requisicion[idx].cantidad,
+ arr_requisicion[idx].precio,arr_requisicion[idx].descuento,
+ arr_requisicion[idx].descvalor,
+ arr_requisicion[idx].valor,SUSER_SNAME(),GETDATE(),estado_req,xkit)
+
+ IF STATUS < 0 THEN
+ ROLLBACK WORK
+ CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO")
+ RETURN xnumreq,xmonto
+
+ END IF
+
+ # EXECUTE xcctb34 USING xkit
+ # IF STATUS < 0 THEN
+ # ROLLBACK WORK
+ # RETURN xnumreq,xmonto
+ # END IF
+
+ END IF
+ LET idx = idx +1
+ END FOREACH
+
+ # CONTROL MONTO REQUISION
+ { IF xmonto > monto_cotizacion THEN
+ # ROLLBACK WORK
+
+ LET xnumreq = 0
+ LET xmonto=0
+ RETURN xnumreq,xmonto
+ END IF
+ }
+ IF pcotizacion IS NOT NULL THEN
+ SELECT DISTINCT a.cotizacion_no FROM vetb00022 a WHERE a.cotizacion_no = pcotizacion
+ IF STATUS <> NOTFOUND THEN
+ LET selec =
+ "INSERT INTO cctb00027 (num_req,etiqueta,num_oc,secuencia,area,cod_n,cod_grupo,cod_tipo,cod_sec, ",
+ "Lado_1,lado_2,lado_3,cantidad,medida,cantidad_r,medida_r,us_crea,",
+ "fech_crea)",
+ " SELECT '",xnumreq,"',etiqueta,'",xnum_oc,"',secuencia,area,cod_n,cod_grupo,cod_tipo,cod_sec,lado_1,lado_2,lado_3,",
+ "ISNULL(cantidad,0),medida,ISNULL(cantidad,0),medida,'",pusuarios CLIPPED,"',getdate() FROM vetb00022 WHERE cotizacion_no= ",
+ pcotizacion USING "<<<<<<<<"
+
+ PREPARE comando FROM selec
+ EXECUTE comando
+ IF STATUS < 0 THEN
+ ROLLBACK WORK
+ CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO")
+ RETURN xnumreq,xmonto
+
+ END IF
+
+ END IF
+ END IF
+ INSERT INTO cctb00025 (num_req,fecha,sec_vend,sec_vend_aprobado,us_crea,fech_crea,
+ estado,fecha_autorizacion,estado_despacho,monto_req)
+ VALUES (xnumreq,today,xsec_vend,null,SUSER_NAME(),GETDATE(),estado_req,getdate(),
+ "NO DESPACHADA",xmonto)
+ IF STATUS < 0 THEN
+ ROLLBACK WORK
+ CALL fgl_winmessage("ERROR",SQLCA.SQLCODE,"INFO")
+ RETURN xnumreq,xmonto
+
+ END IF
+ COMMIT WORK
+
+
+ IF xcondpago <> 4 and xcondpago<> 10 THEN
+ CALL entramensaje(xnumreq,pcotizacion,"A",pusuarios)
+ END IF
+ IF xcondpago = 4 OR xcondpago = 10 THEN
+ INSERT INTO cctb00029 (num_req,mensaje,us_crea,fech_crea) VALUES (xnumreq,pubicacion,pusuarios,getdate())
+ END IF
+ LET chmensaje = "NUMERO DE REQUISICION: ",xnumreq USING "<<<<<<"
+ LET subject = "AVISO REQUISICION DESPACHO NO. ",xnumreq USING "&&&&&&"
+ LET procedimiento = "{ call cc_avisadespacho(?,?,?,?) }" CLIPPED
+ LET cuerpo_correo = "VENDEDOR : ",nombre_vendedor CLIPPED
+ LET cuerpo_correo = cuerpo_correo CLIPPED," FECHA REQUISICION : ",xfecha_oc USING "DD/MM/YYYY"
+ LET cuerpo_correo = cuerpo_correo CLIPPED," NUMERO DE ORDEN: ",xnum_oc USING "&&&&&&"
+ LET cuerpo_correo = cuerpo_correo CLIPPED," CLIENTE: ",arr_requisicion[1].nombre
+
+ # CALL envia_correo('rantonio@marmotech.com.do;jsantelises@marmotech.com.do',vendedorEmail,cuerpo_correo,
+ # subject, procedimiento )
+
+ # CALL fgl_Winmessage("INFORMACION",chmensaje,"STOP")
+ RETURN xnumreq,xmonto
+END FUNCTION
diff --git a/PROYECTO/vedir/veconvierteorden.4gl b/PROYECTO/vedir/veconvierteorden.4gl
index ea4753d..3e9a5f4 100644
--- a/PROYECTO/vedir/veconvierteorden.4gl
+++ b/PROYECTO/vedir/veconvierteorden.4gl
@@ -55,6 +55,7 @@ FUNCTION convierteorden(
pprecio, monto_cotizacion DEC(12, 2),
pdesc DEC(8, 2),
pkit INT,
+ existe_oc INT,
pfecha_compromiso DATE
CALL STARTLOG("veconvierte.txt")
@@ -71,11 +72,8 @@ FUNCTION convierteorden(
LET pcantidad = 0
LET pcantidad1 = 0
- SELECT num_oc INTO ult_numero FROM prtb00020
- IF ult_numero IS NULL THEN
- LET ult_numero = 0
- END IF
- LET ult_numero = ult_numero + 1
+ # El consecutivo num_oc se toma DENTRO de la transaccion (ver BEGIN WORK)
+ LET ult_numero = 0
LET xsecvend_a = NULL
SELECT a.tipo_cliente,
@@ -122,8 +120,20 @@ FUNCTION convierteorden(
WHENEVER ANY ERROR STOP
BEGIN WORK
+ # CONSECUTIVO ATOMICO: el UPDATE incrementa y bloquea la fila de prtb00020
+ # hasta el COMMIT/ROLLBACK, asi dos usuarios no pueden tomar el mismo num_oc
+ # (antes se leia fuera de la transaccion -> PK_prtb00012 duplicada)
UPDATE prtb00020
- SET num_oc = ult_numero, us_crea = xusuario, fech_crea = GETDATE()
+ SET num_oc = ISNULL(num_oc, 0) + 1, us_crea = xusuario, fech_crea = GETDATE()
+ SELECT num_oc INTO ult_numero FROM prtb00020
+ # AUTOCORRECCION: si el contador quedo por detras de prtb00012
+ # (otro programa creo ordenes sin avanzarlo), salta al siguiente libre
+ LET existe_oc = 0
+ SELECT COUNT(*) INTO existe_oc FROM prtb00012 WHERE num_oc = ult_numero
+ IF existe_oc > 0 THEN
+ SELECT MAX(num_oc) + 1 INTO ult_numero FROM prtb00012
+ UPDATE prtb00020 SET num_oc = ult_numero
+ END IF
IF xsecvend_a IS NULL OR xsecvend_a = 0 THEN
diff --git a/WEBSERVICES/orden_e.4gl b/WEBSERVICES/orden_e.4gl
index 62376e0..7456328 100644
--- a/WEBSERVICES/orden_e.4gl
+++ b/WEBSERVICES/orden_e.4gl
@@ -43,7 +43,7 @@ FUNCTION orden_e(sorden)
tipo_cliente INT
END RECORD,
s,url, selec,ret,res STRING,
- ult_numero,vendedor,i,ultimo_req INT,
+ ult_numero,vendedor,i,ultimo_req,existe_oc INT,
pprima,pitbis,valor_orden DEC(12,2),
puser,pfecha_crea VARCHAR(50),
cmd,r_cmd t_sync_cmd,
@@ -108,8 +108,15 @@ FUNCTION orden_e(sorden)
SELECT num_oc FROM marmotech.dbo.prtb00020"
PREPARE ordencmd FROM selec
- LET selec = "UPDATE marmotech.dbo.prtb00020 set num_oc = ?,us_crea='ECOMMERCE',fech_crea = getdate()"
+ # Incremento atomico (bloquea la fila hasta el COMMIT); ver BEGIN WORK
+ LET selec = "UPDATE marmotech.dbo.prtb00020 set num_oc = ISNULL(num_oc,0)+1,us_crea='ECOMMERCE',fech_crea = getdate()"
PREPARE updateprtb20 FROM selec
+ LET selec = "SELECT COUNT(*) FROM marmotech.dbo.prtb00012 WHERE num_oc = ?"
+ PREPARE existeprtb12 FROM selec
+ LET selec = "SELECT MAX(num_oc) + 1 FROM marmotech.dbo.prtb00012"
+ PREPARE maxprtb12 FROM selec
+ LET selec = "UPDATE marmotech.dbo.prtb00020 set num_oc = ?"
+ PREPARE fijaprtb20 FROM selec
LET selec = "SELECT cod_n,cod_grupo,cod_tipo,cod_sec FROM marmotech.dbo.iptb00002 WHERE codid = ?"
PREPARE buscaprod FROM selec
@@ -136,7 +143,8 @@ FUNCTION orden_e(sorden)
PREPARE buscacot FROM selec
- LET selec = "UPDATE marmotech.dbo.vetb00053 SET cotizacion_no = ?"
+ # Incremento atomico del consecutivo de cotizacion (bloquea la fila hasta el COMMIT)
+ LET selec = "UPDATE marmotech.dbo.vetb00053 SET cotizacion_no = ISNULL(cotizacion_no,0)+1"
PREPARE actualizacot FROM selec
@@ -179,22 +187,20 @@ FUNCTION orden_e(sorden)
BEGIN WORK
+ # CONSECUTIVOS ATOMICOS: primero se incrementa (UPDATE bloquea la fila hasta
+ # el COMMIT) y despues se lee; antes se leia y luego se escribia -> duplicados
+ EXECUTE actualizacot
EXECUTE buscacot INTO orden.encabezado.cotizacion_no
- IF orden.encabezado.cotizacion_no IS NULL THEN
- LET orden.encabezado.cotizacion_no = 0
- END IF
- LET orden.encabezado.cotizacion_no = orden.encabezado.cotizacion_no + 1
- EXECUTE actualizacot USING orden.encabezado.cotizacion_no
-
+ EXECUTE updateprtb20
EXECUTE ordencmd INTO ult_numero
-
- IF ult_numero IS NULL THEN
- LET ult_numero = 0
- END IF
- LET ult_numero = ult_numero + 1
-
- EXECUTE updateprtb20 USING ult_numero
+ # AUTOCORRECCION: si el contador quedo por detras de prtb00012, salta al siguiente libre
+ LET existe_oc = 0
+ EXECUTE existeprtb12 USING ult_numero INTO existe_oc
+ IF existe_oc > 0 THEN
+ EXECUTE maxprtb12 INTO ult_numero
+ EXECUTE fijaprtb20 USING ult_numero
+ END IF
LET orden.encabezado.num_oc = ult_numero
LET orden.encabezado.fecha_orden = TODAY
diff --git a/WEBSERVICES/tiendaonline/apiorden.4gl b/WEBSERVICES/tiendaonline/apiorden.4gl
index fa1daaa..720c90f 100644
--- a/WEBSERVICES/tiendaonline/apiorden.4gl
+++ b/WEBSERVICES/tiendaonline/apiorden.4gl
@@ -63,14 +63,16 @@ FUNCTION ordenApi(xorden)
CALL crearcliente(cliente.*) RETURNING xtipocliente,xseccliente
- SELECT ISNULL(a.num_oc,0) INTO ult_numero FROM prtb00020
-
- IF ult_numero = 0 THEN
- INSERT INTO prtb00020 (num_oc,us_crea) VALUES (ult_numero,orden.credenciales.usuario)
-
+ # CONSECUTIVO ATOMICO: incrementa prtb00020 (antes nunca lo avanzaba y solo
+ # leia +1 -> el contador quedaba atrasado y se duplicaba PK_prtb00012)
+ BEGIN WORK
+ UPDATE prtb00020 SET num_oc = ISNULL(num_oc,0) + 1, us_crea = orden.credenciales.usuario, fech_crea = GETDATE()
+ IF SQLCA.SQLERRD[3] = 0 THEN
+ INSERT INTO prtb00020 (num_oc,us_crea) VALUES (1,orden.credenciales.usuario)
END IF
- LET ult_numero = ult_numero + 1
-
+ SELECT num_oc INTO ult_numero FROM prtb00020
+ COMMIT WORK
+
INSERT INTO prtb00012 (ventas,tipo_orden,num_oc,fecha,tipo_cliente,sec_cliente,telefono,direccion,ubicacion,
cerrada,cond_pago,itbis, valor_bruto,monto_desc,sub_total,neto,us_crea,fech_crea,num_oc_r)
VALUES ('1','ECOMMERCE',ult_numero,orden.encabezado.fecha_orden,xtipocliente,xseccliente,
diff --git a/WEBSERVICES/veconvierteorden.4gl b/WEBSERVICES/veconvierteorden.4gl
index cd57455..7eff0f2 100644
--- a/WEBSERVICES/veconvierteorden.4gl
+++ b/WEBSERVICES/veconvierteorden.4gl
@@ -37,6 +37,7 @@ END GLOBALS
FUNCTION convierteorden(xcotizacion_no,xorden,xusuario,xclave,ximpresor,xcopia,xtipo_orden,xcomentario,xnosolicitud,archivos)
DEFINE xcotizacion_no,xsecvend_a INT,
+ existe_oc INT,
actualizar STRING,
psolicitud_sql STRING,
sb_sol base.StringBuffer,
@@ -130,16 +131,21 @@ FUNCTION convierteorden(xcotizacion_no,xorden,xusuario,xclave,ximpresor,xcopia,x
xcotizacion_no)
RETURN 0,false
END IF
- SELECT num_oc INTO ult_numero FROM prtb00020
- IF ult_numero IS NULL THEN
- LET ult_numero = 0
- END IF
- LET ult_numero = ult_numero + 1
-
BEGIN WORK
- UPDATE prtb00020 set num_oc = ult_numero,
+ # CONSECUTIVO ATOMICO: el UPDATE incrementa y bloquea la fila de prtb00020
+ # hasta el COMMIT/ROLLBACK, asi dos usuarios no pueden tomar el mismo num_oc
+ # (antes se leia fuera de la transaccion -> PK_prtb00012 duplicada)
+ UPDATE prtb00020 SET num_oc = ISNULL(num_oc, 0) + 1,
us_crea = xusuario,
fech_crea = GETDATE()
+ SELECT num_oc INTO ult_numero FROM prtb00020
+ # 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
+ IF existe_oc > 0 THEN
+ SELECT MAX(num_oc) + 1 INTO ult_numero FROM prtb00012
+ UPDATE prtb00020 SET num_oc = ult_numero
+ END IF
DISPLAY "ACTUALICE ULTIMO NUMERO: ",ult_numero USING "<<<<<<<"," ",CURRENT
LET p_prtb14.observacion = xcomentario CLIPPED