Files
MBS/PROYECTO/ccdir/ccprrp016.4gl
T

656 lines
23 KiB
Plaintext

{
-------------------------------------------------------------------------------
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