From a5ccd3083f465533ed6ed1380c0279a8d0fe9ef2 Mon Sep 17 00:00:00 2001 From: Jhonny Soto Date: Wed, 7 Oct 2026 12:11:28 -0400 Subject: [PATCH] JSOTO Adicion grupos ADMINISTRACION PERSONAL Y NOMINA --- PROYECTO/PRDIR/prprmt008.4gl | 34 +- PROYECTO/ccdir/ccprmt008.4gl | 21 +- PROYECTO/ccdir/ccprmt008.4gl.bak20261005 | 1362 +++++++++++++++++ PROYECTO/mbsERP.4pw | 2 + PROYECTO/otrodir/autorizacioncontado.4gl | 2 +- .../autorizacioncontado.4gl.bak20261005 | 90 ++ PROYECTO/otrodir/autorizarequisicion.4gl | 19 +- PROYECTO/otrodir/evaluaclientes.4gl | 20 +- PROYECTO/otrodir/requisiciondespacho.4gl | 103 +- .../requisiciondespacho.4gl.bak20261005 | 250 +++ PROYECTO/vedir/veconvierteorden.4gl | 22 +- WEBSERVICES/orden_e.4gl | 38 +- WEBSERVICES/tiendaonline/apiorden.4gl | 16 +- WEBSERVICES/veconvierteorden.4gl | 20 +- 14 files changed, 1888 insertions(+), 111 deletions(-) create mode 100644 PROYECTO/ccdir/ccprmt008.4gl.bak20261005 create mode 100644 PROYECTO/otrodir/autorizacioncontado.4gl.bak20261005 create mode 100644 PROYECTO/otrodir/requisiciondespacho.4gl.bak20261005 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