{ ------------------------------------------------------------------------------- PROGRAMA : CCPRRP016 OBJETIVO : Cuentas por Cobrar a mas de x dias X Vendedor PROGRAMADOR : Tadeo A. Ferreras FECHA REALIZACION : Abril 6, 1993 ------------------------------------------------------------------------------- } GLOBALS "ccprgb000.4gl" DEFINE fechaAV,fecha_corte DATE DEFINE ck_dev INTEGER DEFINE handler om.SaxDocumentHandler, -- return value from fgl_report_commitCurrentSettings() r_filename STRING, -- filename of Report Design Document including .4rp extension r_output STRING, -- output format option preview INTEGER -- TRUE/FALSE, to set preview option DEFINE cheque_dv CHAR(11), sbalance1,sbalance DECIMAL(12,2) DEFINE doccli16 RECORD tipo_cliente SMALLINT, sec_cliente SMALLINT, nombre CHAR(30), aplica_a INTEGER, pendiente DECIMAL(12,2), fecha_factura DATE, tipo_doc CHAR(2), sec_vend SMALLINT, cotizacion_no INT END RECORD DEFINE tot_gen2 RECORD total0 DECIMAL(10,2), total1 DECIMAL(10,2), total2 DECIMAL(10,2), total3 DECIMAL(10,2), total4 DECIMAL(10,2), total5 DECIMAL(10,2) END RECORD MAIN DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CALL ARG_VAL(3) RETURNING impresor CALL ARG_VAL(7) RETURNING strconect CALL STARTLOG("CCRP16.TXT") IF strconect = 'marmotech' THEN CONNECT to strconect USER 'conecta' USING 'conecta' ELSE CONNECT to strconect USER usuarios USING clave END IF SELECT a.* INTO p_companias.* FROM companias a CALL defecto(usuarios,clave,impresor) RETURNING imprime,negrilla_on,negrillas_of, doble_on,doble_off,comp_on,comp_off, doce,normal,archivo,copia CALL ccprrp016() END MAIN FUNCTION ccprrp016() DEFINE salir16 CHAR(1) #WHENEVER ERROR CONTINUE OPTIONS FORM LINE 8, ERROR LINE 23, COMMENT LINE 21 OPEN WINDOW ccfmrp016 WITH FORM "ccfmrp016" ###### Captura de los valores que intervendran en la condicion de busqueda. LET pflag="N" INPUT BY NAME tipo_venta,fecha_corte AFTER FIELD tipo_venta IF tipo_venta is null THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD tipo_venta END IF IF tipo_venta = "1" OR tipo_venta = "2" THEN DISPLAY BY NAME tipo_venta ELSE LET numero_msg = 7 CALL msg(numero_msg) NEXT FIELD tipo_venta END IF BEFORE FIELD fecha_corte LET fecha_corte = today AFTER FIELD fecha_corte IF fecha_corte is null THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha_corte END IF AFTER INPUT ##### Creando la facilidad para poder cancelar el proceso mediante la tecla ##### DELETE o SUPR. IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF IF tipo_venta is null THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD tipo_venta END IF IF tipo_venta = "1" OR tipo_venta = "2" THEN DISPLAY BY NAME tipo_venta ELSE LET numero_msg = 7 CALL msg(numero_msg) NEXT FIELD tipo_venta END IF IF fecha_corte is null THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha_corte END IF EXIT INPUT END INPUT ##### Crea criterio de busqueda ##### Variables que intervienen en la condicion de busqueda, teniendo estas ##### la ventaja de que se pueden dejar en blanco en caso de que desee todos ##### los registro con ese campo. CONSTRUCT BY NAME criterio ON c.sec_vend,a.tipo_cliente,a.sec_cliente AFTER CONSTRUCT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF END CONSTRUCT DISPLAY BY NAME pflag # Busca pendiente de las facturas cuyas fechas de vencimiento son menores # a la fecha de corte LET selec3 = "SELECT a.tipo_cliente,a.sec_cliente,b.nombre,a.aplica_a, ", " SUM(a.valor+a.monto_desc) ", "FROM cctb00001 a,vetb00004 b,vetb00028 c ", "WHERE a.fecha_orig <= ? AND ",criterio CLIPPED, " AND a.tipo_cliente=b.tipo_cliente AND a.sec_cliente=b.sec_cliente AND ", " a.tipo_cliente = c.tipo_cliente AND ", " a.sec_cliente = c.sec_cliente AND ", " a.sec_cliente=a.sec_cliente AND a.num_doc IS NOT NULL ", " AND a.status_t IS NULL ", "GROUP BY a.tipo_cliente,a.sec_cliente,b.nombre,a.aplica_a HAVING SUM(a.valor + a.monto_desc) <> 0 ORDER BY a.tipo_cliente,a.sec_cliente,a.aplica_a" DISPLAY "<< Buscando Informacion ... Espere Por Favor. >>" AT 19,14 ATTRIBUTE (REVERSE,BOLD) #START REPORT reporte016 TO screen LET r_filename ="ccprrp016.4rp" LET progreso = 20 DISPLAY progreso TO progreso CALL ui.Interface.refresh() PREPARE busca_pendiente FROM selec3 DECLARE ft_pendiente CURSOR FOR busca_pendiente OPEN ft_pendiente USING fecha_corte LET idx = 1 FOREACH ft_pendiente INTO doccli16.* # BUSCA BALANCE DEL CLIENTE PARA IMPRIMIRLO SELECT SUM(a.valor+a.monto_desc) INTO sbalance FROM cctb00001 a WHERE (a.tipo_cliente = doccli16.tipo_cliente AND a.sec_cliente = doccli16.sec_cliente) AND (a.fecha_orig <= fecha_corte) AND (a.tipo_doc NOT IN ("AV",'AP') AND a.num_doc = a.num_doc) AND a.status_t IS NULL SELECT SUM(a.valor+a.monto_desc) INTO sbalance1 FROM cctb00001 a WHERE (a.tipo_cliente = doccli16.tipo_cliente AND a.sec_cliente = doccli16.sec_cliente) AND (a.fecha_orig <= fecha_corte) AND (a.tipo_doc IN ("AV") AND a.num_doc = a.aplica_a) AND a.status_t IS NULL IF sbalance IS NULL THEN LET sbalance = 0 END IF IF sbalance1 IS NULL THEN LET sbalance1 = 0 END IF LET sbalance = sbalance - sbalance1 IF sbalance = 0 THEN CONTINUE FOREACH END IF IF idx = 1 THEN IF fgl_report_loadCurrentSettings(r_filename) THEN LET preview=1 CALL seleccionarsalida() RETURNING r_output -- load the .4rp file CALL fgl_report_selectDevice(r_output) -- changing default CALL fgl_report_selectPreview(preview) -- changing default LET handler = fgl_report_commitCurrentSettings() -- commit changes END IF LET idx = 2 START REPORT reporte016 TO XML HANDLER HANDLER END IF LET doccli16.sec_vend = NULL SELECT UNIQUE a.sec_vend INTO doccli16.sec_vend FROM vetb00028 a WHERE a.tipo_cliente = doccli16.tipo_cliente and a.sec_cliente = doccli16.sec_cliente AND a.status_t IS NULL IF doccli16.sec_vend IS NULL THEN LET doccli16.sec_vend = 0 END IF IF strconect = 'smarmotech' THEN SELECT MAX( a.tipo_doc),CONVERT(CHAR(10),MAX(a.fecha_ven),103) INTO doccli16.tipo_doc,doccli16.fecha_factura FROM cctb00001 a WHERE a.status_t IS NULL AND a.num_doc = a.num_doc AND a.num_doc=doccli16.aplica_a AND a.tipo_doc not in ("PG","NC","PC","OC","DV","PC") and a.tipo_cliente=doccli16.tipo_cliente AND a.sec_cliente=doccli16.sec_cliente ELSE SELECT MAX( a.tipo_doc),CONVERT(CHAR(10),MAX(a.fecha_ven),103) INTO doccli16.tipo_doc,doccli16.fecha_factura FROM cctb00001 a WHERE a.status_t IS NULL AND (a.tipo_doc not in ("RC","NC","PC","OC","DV","PG","PC")AND a.num_doc = a.num_doc AND a.num_doc=doccli16.aplica_a ) and a.tipo_cliente=doccli16.tipo_cliente AND a.sec_cliente=doccli16.sec_cliente END IF IF doccli16.tipo_doc = 'FT' OR doccli16.tipo_doc='FE' THEN LET doccli16.cotizacion_no=NULL IF strconect = 'marmotech' THEN SELECT a.conduce INTO doccli16.cotizacion_no FROM vetb00002 a WHERE (a.factura = doccli16.aplica_a) AND (a.tipo_cliente = doccli16.tipo_cliente AND a.sec_cliente=doccli16.sec_cliente) ELSE SELECT a.cotizacion_no INTO doccli16.cotizacion_no FROM vetb00002 a WHERE a.factura = doccli16.aplica_a AND (a.tipo_cliente = doccli16.tipo_cliente AND a.sec_cliente=doccli16.sec_cliente) END IF END IF IF doccli16.fecha_factura IS NULL THEN SELECT CONVERT(CHAR(10),MAX(a.fecha_ven),103) INTO doccli16.fecha_factura FROM cctb00001 a WHERE a.status_t IS NULL AND a.aplica_a=doccli16.aplica_a AND a.tipo_doc in ("NC","PC","OC","DV","ND") and a.tipo_cliente=doccli16.tipo_cliente AND a.sec_cliente=doccli16.sec_cliente END IF IF doccli16.tipo_doc = "AV" THEN LET doccli16.cotizacion_no=null SELECT MAX(CONVERT(CHAR(10),a.fecha_ven,103)),MAX(a.documento_ref) INTO fechaAV,doccli16.cotizacion_no FROM cctb00001 a WHERE a.num_doc = doccli16.aplica_a AND a.tipo_cliente=doccli16.tipo_cliente AND a.sec_cliente=doccli16.sec_cliente AND a.num_doc = a.aplica_a AND a.tipo_Doc = 'AV' AND a.status_t IS NULL IF fechaav IS NULL THEN LET fechaav = '01/01/2008' END IF LET doccli16.fecha_factura = fechaav SELECT SUM(a.valor+a.monto_desc)*-1 INTO doccli16.pendiente FROM cctb00001 a WHERE a.fecha_orig<=fecha_corte AND a.tipo_cliente=doccli16.tipo_cliente AND a.sec_cliente=doccli16.sec_cliente AND a.status_t IS NULL AND a.num_doc = doccli16.aplica_a AND a.fecha_orig >= fechaav AND a.tipo_Doc IN ("AV","AP") LET doccli16.fecha_factura=fechaAV END IF IF doccli16.pendiente <> 0 THEN LET progreso = progreso + 2 IF progreso > 95 THEN LET progreso = 95 END IF CURRENT WINDOW IS ccfmrp016 DISPLAY progreso TO progreso CALL ui.Interface.refresh() OUTPUT TO REPORT reporte016(doccli16.*) END IF END FOREACH IF idx > 1 THEN FINISH REPORT reporte016 ELSE CALL fgl_winmessage("INFO","EL CLIENTE NO TIENE PARTIDAS PENDIENTES A LA FECHA ESPECIFICADA","INFO") END IF LET progreso = 100 DISPLAY progreso TO progreso CALL ui.Interface.refresh() CLOSE WINDOW ccfmrp016 END FUNCTION ###### Funcion que genera el reporte REPORT reporte016(x) DEFINE x RECORD tipo_cliente SMALLINT, sec_cliente SMALLINT, nombre CHAR(30), aplica_a INTEGER, pendiente DECIMAL(12,2), fecha_factura DATE, tipo_doc CHAR(2), sec_vend SMALLINT, cotizacion_no INT END RECORD DEFINE nom1,apell1 CHAR(25) DEFINE fecha_actual, factura CHAR(10) DEFINE hora CHAR(5) DEFINE moneda_pago, vendedor CHAR(15) DEFINE cod_cliente, tit_secundario CHAR(50) DEFINE corriente, de1a30, de31a60, de61a90, masde90 DECIMAL(12,2) DEFINE tcte,t30, t45, t60, tm60, tsaldo DECIMAL(12,2) DEFINE ttcte,tt30, tt45, tt60, ttm60, ttsaldo DECIMAL(12,2) DEFINE tttcte,ttt30, ttt45, ttt60, tttm60, tttsaldo DECIMAL(12,2) DEFINE dias INTEGER ORDER BY x.sec_vend,x.sec_cliente,x.fecha_factura FORMAT PAGE HEADER LET hora = TIME LET fecha_actual = today using "dd/mm/yyyy" { PRINTX pcompanias.nombre CLIPPED, fecha_corte using "dd/mm/yyyy", hora, fecha_actual} ### Dependiendo del tipo de venta imprimira el simbolo ### de la moneda de pago IF tipo_venta = "1" THEN LET moneda_pago = "Valores en RD$" ELSE LET moneda_pago = "Valores en US$" END IF BEFORE GROUP OF x.sec_vend ##### Variables que acumulan totales por condicion de pago LET ttcte = 0 LET tt30 = 0 LET tt45 = 0 LET tt60 = 0 LET ttm60 = 0 LET ttsaldo = 0 LET tit_secundario = "Partidas Pendientes de Cobros por Vendedor ",'',fecha_actual USING "<<<<<<<<<" ##### Seleciona datos referentes al vendedor en la maestra de empleado SELECT UNIQUE nom1_emp,apell1_emp INTO nom1,apell1 FROM adtb00003 WHERE num_emp = x.sec_vend IF status = notfound THEN LET status = 0 LET vendedor = "Vendedor no Existe" ELSE LET vendedor = nom1 clipped," ",apell1 END IF PRINTX x.sec_vend USING "&&&&"," ", vendedor, fecha_corte using "dd/mm/yyyy", hora, tit_secundario, moneda_pago BEFORE GROUP OF x.sec_cliente LET existe = "N" LET descrip1 = NULL LET tcte = 0 LET t30 = 0 LET t45 = 0 LET t60 = 0 LET tm60 = 0 LET tsaldo = 0 LET idx = 0 LET cod_cliente = x.tipo_cliente using "&&", "-", x.sec_cliente using "&&&&&&" PRINTX cod_cliente, x.nombre ON EVERY ROW IF ttt30 IS NULL THEN LET ttt30 = 0 END IF IF ttt45 IS NULL THEN LET ttt45 = 0 END IF IF tttcte IS NULL THEN LET tttcte = 0 END IF IF ttt60 IS NULL THEN LET ttt60 = 0 END IF IF tttm60 IS NULL THEN LET tttm60 = 0 END IF IF tttsaldo IS NULL THEN LET tttsaldo = 0 END IF LET ck_dev = NULL LET factura = NULL LET corriente = 0 LET de1a30 = 0 LET de31a60 = 0 LET de61a90 = 0 LET masde90 = 0 SELECT MAX(a.valor_cheque) INTO ck_dev FROM cctb00001 a WHERE a.tipo_cliente=x.tipo_cliente AND a.sec_cliente=x.sec_cliente AND a.aplica_a = x.aplica_a AND a.tipo_doc = "ND" IF ck_dev IS NOT NULL OR ck_dev <> 0 THEN LET cheque_dv = "CD-",ck_dev USING "<<<<<<<" ELSE LET cheque_dv = NULL END IF IF x.fecha_factura IS NULL THEN LET x.fecha_factura = 0 END IF #### Calcula la diferencia de dias de pago a determinada factura para acu- #### mularlo en la variable correspondiente por tipo de dia. LET dias = fecha_corte - x.fecha_factura LET factura = x.tipo_doc,"-",x.aplica_a #### Imprime y acumula los valores correspondientes a pago realizados en #### menos de 31 dias. -- PRINTX cheque_dv CLIPPED, x.fecha_factura using "dd/mm/yyyy"; # DISPLAY "datos ",x.aplica_a," ",x.tipo_doc,"" ,x.pendiente IF dias <= 0 THEN DISPLAY "datos ",x.aplica_a,"|",x.tipo_doc,"|" ,x.pendiente,"|",x.fecha_factura LET tcte = tcte + x.pendiente LET corriente = x.pendiente PRINTX x.pendiente # UPDATE cctb00001 SET valorpendiente = x.pendiente,us_mod = 'JUSOTO',fech_mod = getdate(),corriente = dias # WHERE tipo_doc = x.tipo_doc AND num_doc = x.aplica_a AND # tipo_cliente = x.tipo_cliente AND sec_cliente = x.sec_cliente END IF IF dias > 0 AND dias < 31 THEN LET t30 = t30 + x.pendiente LET de1a30 = x.pendiente -- DISPLAY "datos 31 ",x.aplica_a," ",x.tipo_doc,"" ,x.pendiente -- PRINT COLUMN 72, x.pendiente using "(((,(((,(((.&&)", -- COLUMN 135, x.pendiente using "(((,(((,(((.&&)" # UPDATE cctb00001 SET valorpendiente = x.pendiente,us_mod = 'JUSOTO',fech_mod = getdate(),de1a30dias = dias # WHERE tipo_doc = x.tipo_doc AND num_doc = x.aplica_a AND # tipo_cliente = x.tipo_cliente AND sec_cliente = x.sec_cliente END IF #### Imprime y acumula los valores correspondientes a pago realizados en #### mas de 30 y menos de 45 dias. IF dias >= 31 AND dias < 61 THEN LET t45 = t45 + x.pendiente LET de31a60 = x.pendiente --PRINT COLUMN 88, x.pendiente using "(((,(((,(((.&&)", --COLUMN 135, x.pendiente using "(((,(((,(((.&&)" # UPDATE cctb00001 SET valorpendiente = x.pendiente,us_mod = 'JUSOTO',fech_mod = getdate(),de31a60dias = dias # WHERE tipo_doc = x.tipo_doc AND num_doc = x.aplica_a AND # tipo_cliente = x.tipo_cliente AND sec_cliente = x.sec_cliente END IF #### Imprime y acumula los valores correspondientes a pago realizados en #### mas de 46 y menos de 60 dias. IF dias >= 61 AND dias < 91 THEN LET t60 = t60 + x.pendiente LET de61a90 = x.pendiente -- DISPLAY "datos 91 ",x.aplica_a," ",x.tipo_doc,"" ,x.pendiente --PRINT COLUMN 103, x.pendiente using "(((,(((,(((.&&)", --COLUMN 135, x.pendiente using "(((,(((,(((.&&)" # UPDATE cctb00001 SET valorpendiente = x.pendiente,us_mod = 'JUSOTO',fech_mod = getdate(),de61a90dias = dias # WHERE tipo_doc = x.tipo_doc AND num_doc = x.aplica_a AND # tipo_cliente = x.tipo_cliente AND sec_cliente = x.sec_cliente END IF #### Imprime y acumula los valores correspondientes a pago realizados en #### mas de 60 dias. IF dias >= 91 THEN LET tm60 = tm60 + x.pendiente LET masde90 = x.pendiente DISPLAY "datos 91 ",x.aplica_a," ",x.tipo_doc,"" ,x.pendiente -- PRINT COLUMN 119, x.pendiente using "(((,(((,(((.&&)", -- COLUMN 135, x.pendiente using "(((,(((,(((.&&)" # UPDATE cctb00001 SET valorpendiente = x.pendiente,us_mod = 'JUSOTO',fech_mod = getdate(),masde90dias = dias # WHERE tipo_doc = x.tipo_doc AND num_doc = x.aplica_a AND # tipo_cliente = x.tipo_cliente AND sec_cliente = x.sec_cliente END IF PRINTX x.pendiente,factura,p_companias.nombre, cheque_dv, x.fecha_factura using "dd/mm/yyyy", corriente, de1a30, de31a60, de61a90, masde90,x.cotizacion_no AFTER GROUP OF x.sec_cliente ######## IMPRIME totales acumulado por cliente. LET tsaldo = 0 LET tsaldo = tcte + t30 + t45 +t60 + tm60 --"Total Cliente :" PRINTX tcte USING "(((,(((,(((.&&)", t30 USING "(((,(((,(((.&&)", t45 USING "(((,(((,(((.&&)", t60 USING "(((,(((,(((.&&)", tm60 USING "(((,(((,(((.&&)", tsaldo USING "(((,(((,(((.&&)" LET ttcte = ttcte + tcte LET tt30 = tt30 + t30 LET tt45 = tt45 + t45 LET tt60 = tt60 + t60 LET ttm60 = ttm60 + tm60 LET ttsaldo = ttsaldo + tsaldo LET tttcte = tttcte + ttcte LET ttt30 = ttt30 + t30 LET ttt45 = ttt45 + t45 LET ttt60 = ttt60 + t60 LET tttm60 = tttm60 + tm60 LET tttsaldo = tttsaldo + tsaldo LET tcte = 0 LET t30 = 0 LET t45 = 0 LET t60 = 0 LET tm60 = 0 LET tsaldo = 0 AFTER GROUP OF x.sec_vend ######## IMPRIME totales acumulado por vendedor. --PRINT COLUMN 1, negrillas_on --"Total Vendedor-->" PRINTX ttcte USING "((,(((,(((.&&)", tt30 USING "((,(((,(((.&&)", tt45 USING "((,(((,(((.&&)", tt60 USING "((,(((,(((.&&)", ttm60 USING "((,(((,(((.&&)", ttsaldo USING "(((,(((,(((.&&)" LET tt30 = 0 LET tt45 = 0 LET tt60 = 0 LET ttm60 = 0 LET ttsaldo = 0 ON LAST ROW ######## IMPRIME totales acumulado en general. --PRINT COLUMN 1, negrillas_on #"Total General -->" PRINT tttcte USING "(((,(((,(((.&&)", ttt30 USING "(((,(((,(((.&&)", ttt45 USING "(((,(((,(((.&&)", ttt60 USING "(((,(((,(((.&&)", tttm60 USING "(((,(((,(((.&&)", tttsaldo USING "((((,(((,(((.&&)" LET tot_gen2.total0 = tttcte LET tot_gen2.total1 = ttt30 LET tot_gen2.total2 = ttt45 LET tot_gen2.total3 = ttt60 LET tot_gen2.total4 = tttm60 LET tot_gen2.total5 = tttsaldo LET tttcte = 0 LET ttt30 = 0 LET ttt45 = 0 LET ttt60 = 0 LET tttm60 = 0 LET tttsaldo = 0 LET tt30 = 0 LET tt45 = 0 LET tt60 = 0 LET ttm60 = 0 LET ttsaldo = 0 LET t30 = 0 LET t45 = 0 LET t60 = 0 LET tm60 = 0 LET tsaldo = 0 END REPORT