{------------------------------------------------------------------------------ PROGRAMA : CCPRMT050 OBJETIVO : Programa para cobros compulsivos CxC PROGRAMADOR : Valentin Rodriguez FECHA REALIZACION : ------------------------------------------------------------------------------} IMPORT JAVA javax.mail.Session GLOBALS "ccprgb000.4gl" #VARIABLES PARA INTERACTUAR CON CAMPO DEL FORMULARIO #DEFINE sec_cliente SMALLINT DEFINE campos RECORD tipo_cliente SMALLINT, f_vencimiento DATE, rangoFecha CHAR(10), f_final DATE, f_inicio DATE END RECORD, att dynamic array of record col1 , col2 , col3 , col4 , col5 , col6 , col7 , col8 , col9 , col10,col11 STRING end RECORD, xcliente,enviainfo,sqlconnect STRING, retorne BOOLEAN, montopendiente DECIMAL(12,2) DEFINE xusername,xsmtphost,xsmtpport,xpassword,respuesta,mensajes STRING # VARIABLES PARA GUARDAR LOS DATOS DEVUELTOS POR EL METODO 'busca_balance' # DEFINE xcorriente,x1a30,x31a60,x61a90,xmas90,xtotalSaldo DECIMAL(12,2) #RECORD DONDE GUARDAREMOS LAS COTIZACIONES, ORDENES Y FACTURAS ENVIADOS #POR EL METODO 'busca_balance' DEFINE tb_acuerdo DYNAMIC ARRAY OF RECORD ACfechaPago DATE, ACobservacion VARCHAR(100), ACmontoPago DEC(12,2), fechCompromiso , fecha_registro CHAR(40), usuario VARCHAR(100), ACidCliente INT END RECORD, arrContactos DYNAMIC ARRAY OF RECORD seleccionar, contacto,puesto,email,celular,telefonoOficina STRING END RECORD, arrConsolidado DYNAMIC ARRAY OF RECORD cCliente,cDocumento,cfechaVen,cTipoDoc,cOrden,cCotizacion STRING, cCorriente,cDe1a30,cDe31a60,cD61a90,cMasde90,cTotal DECIMAL(12,2), cmoneda STRING END RECORD DEFINE notaCliente, cliente VARCHAR(200), fecha_compromiso DATE, monto_pago DECIMAL(12,2), xtipocliente,xseccliente INT MAIN DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CONNECT TO "smarmotech" AS 'MSSQL' USER usuarios USING clave CONNECT TO "marmotech" AS 'IFMX' USER usuarios USING clave CALL buscaInformacion() END MAIN FUNCTION buscaInformacion() DEFINE selec STRING, datatree DYNAMIC ARRAY OF RECORD cliente,factura,orden,cotizacion,telefono STRING, limCredito,corriente,de1a30,de31a60,de61a90,masde90,totalSaldo DEC(12,2), moneda STRING, nodo,hijo,imagen STRING, idregistro,tcliente,scliente,sec_vend INT,tipo_doc VARCHAR(10) END RECORD, idx INT, compromiso RECORD tipo_cliente,sec_cliente INT, fechaActualizaacion DATE, observacion VARCHAR(200), montoPago DEC(12,2), documento VARCHAR(25), tipo_doc VARCHAR(10), fechaCompromiso DATE, envioemail VARCHAR(10) END RECORD # SET CONNECTION 'IFMX' LET sqlconnect = 'marmotech' LET selec = "SELECT a.clientes, a.factura,a.orden,a.cotizacion,a.telefono,a.limcredito,a.corriente,a.d1a30, a.d31a60,a.d31a60,a.mas90,a.totalSaldo,a.moneda, a.nodo,a.hijos,imagen,idregistro,a.tipo_cliente,a.sec_cliente,sec_vend,a.tipo_doc FROM cctb00042 a WHERE a.totalSaldo > 0 ORDER BY a.idregistro,a.nodo,a.hijos " LET idx = 1 PREPARE comando FROM selec DECLARE buscacxc CURSOR FOR comando FOREACH buscacxc INTO datatree[idx].* LET idx = idx + 1 END FOREACH call ui.Interface.loadStyles("formularios") OPEN WINDOW w1 WITH FORM "ccfmmt050" DIALOG ATTRIBUTE(UNBUFFERED) DISPLAY ARRAY datatree TO s_record.* BEFORE DISPLAY LET Xtipocliente = datatree[arr_curr()].tcliente LET xseccliente = datatree[arr_curr()].scliente call dialog.setCellAttributes(att) FOR idx = 1 TO datatree.getLength() LET att[idx].col1 = NULL LET att[idx].col2 = NULL LET att[idx].col3 = NULL LET att[idx].col4 = NULL LET att[idx].col5 = NULL LET att[idx].col6 = NULL LET att[idx].col7 = NULL LET att[idx].col8 = NULL LET att[idx].col9 = NULL LET att[idx].col10 = NULL LET att[idx].col11 = NULL IF datatree[idx].masde90 > 0 THEN LET ATT[idx].col11 = 'red reverse' END IF IF datatree[idx].de61a90 > 0 THEN LET ATT[idx].col10 = 'red reverse' END IF IF datatree[idx].de31a60 > 0 THEN LET att[idx].coL9 = "yellow reverse" END IF IF datatree[idx].de1a30 > 0 THEN LET att[idx].coL8 = "yellow reverse" END IF IF datatree[idx].corriente > 0 THEN LET att[idx].coL7 = "green reverse" END IF END FOR ON SELECTION CHANGE LET montopendiente =datatree[arr_curr()].totalSaldo DISPLAY datatree[arr_curr()].factura TO nfactura DISPLAY montopendiente TO montopendiente CALL compromiso(datatree[arr_curr()].tcliente,datatree[arr_curr()].scliente,datatree[arr_curr()].factura, datatree[arr_curr()].tipo_doc) RETURNING cliente DISPLAY cliente TO ncliente CALL contactos(datatree[arr_curr()].tcliente,datatree[arr_curr()].scliente) AFTER DISPLAY END DISPLAY DISPLAY ARRAY arrContactos TO scontactos.* END DISPLAY INPUT BY NAME fecha_compromiso,monto_pago,notaCliente,enviainfo BEFORE INPUT LET notaCliente = 'Por medio de la presente le estamos notificando los acuerdos que conversamos:' AFTER FIELD monto_pago IF monto_pago IS NOT NULL THEN IF monto_pago > montopendiente THEN CALL msg(168) NEXT FIELD monto_pago END IF END IF AFTER FIELD fecha_compromiso IF fecha_compromiso IS NOT NULL THEN IF fecha_compromiso < TODAY THEN CALL msg(1011) NEXT FIELD fecha_compromiso END IF END IF ON ACTION guardar ATTRIBUTE(TEXT='Salvar', IMAGE="save") LET compromiso.tipo_cliente = datatree[arr_curr()].tcliente LET compromiso.sec_cliente = datatree[arr_curr()].scliente LET compromiso.fechaCompromiso = fecha_compromiso LET compromiso.observacion = notaCliente LET compromiso.montoPago = monto_pago LET compromiso.documento =datatree[arr_curr()].factura LET compromiso.tipo_doc = datatree[arr_curr()].tipo_doc CALL salvacompromiso(compromiso.*) DISPLAY datatree[arr_curr()].factura TO nfactura DISPLAY datatree[arr_curr()].totalSaldo TO montopendiente CALL compromiso(datatree[arr_curr()].tcliente,datatree[arr_curr()].scliente,datatree[arr_curr()].factura, datatree[arr_curr()].tipo_doc) RETURNING cliente DISPLAY cliente TO ncliente IF enviainfo = 'SI' THEN CALL notificar() END IF END INPUT DISPLAY ARRAY tb_acuerdo TO src_acuerdo.* END DISPLAY DISPLAY ARRAY arrConsolidado TO sconsolidado.* END DISPLAY ON ACTION estado ATTRIBUTE(TEXT="Estado",IMAGE="fa-dollar") DISPLAY "sqlconnect ",sqlconnect IF sqlconnect = 'smarmotech' THEN SET CONNECTION "MSSQL" END IF CALL visualiza_estado(datatree[arr_curr()].tcliente,datatree[arr_curr()].scliente,sqlconnect) LET sqlconnect = 'marmotech' SET CONNECTION "IFMX" ON ACTION consolidado ATTRIBUTE(IMAGE='fa-sellsy') LET sqlconnect = 'smarmotech' CALL buscaBalance(xtipocliente,xseccliente,1) ON ACTION CANCEL EXIT PROGRAM END DIALOG CLOSE WINDOW w1 END FUNCTION FUNCTION compromiso(xtipocliente,xseccliente,xfactura,xtipo) DEFINE xtipocliente,xseccliente,i,xfactura INT, xtipo STRING # SELECT a.fechaPago,a.observacion,a.montoPago,a.idCliente,a.fechacompromiso,a.fech_crea, # ISNULL(c.nom1_emp,'NO TIENE')+' '+ISNULL(c.apell1_emp,'NO TIENE') SELECT a.nombre INTO xcliente FROM vetb00004 a WHERE a.tipo_cliente = xtipocliente AND a.sec_cliente = xseccliente DISPLAY "CLIENTE: ",xtipocliente," ",xseccliente," documento ",xfactura," ",xtipo DECLARE busca_acuerdos CURSOR FOR SELECT a.fechaPago,a.observacion,a.montoPago ,a.fechacompromiso ,a.fech_crea # ,ISNULL(c.nom1_emp,'NO TIENE')+' '+ISNULL(c.apell1_emp,'NO TIENE'),a.idCliente FROM cctb00043 a LEFT OUTER JOIN seg0001 b ON a.us_crea = b.usuario # LEFT OUTER JOIN adtb00003 c ON b.num_emp = c.num_emp WHERE a.tipo_cliente = xtipocliente AND a.sec_cliente = xseccliente AND (a.estado = 'ACTIVO' OR a.estado IS NULL) AND a.documento=xfactura AND a.tipo_doc = xtipo ORDER BY a.fechapago LET i =1 FOREACH busca_acuerdos INTO tb_acuerdo[i].* LET i = i +1 END FOREACH RETURN xcliente END FUNCTION FUNCTION salvacompromiso(xcompromiso) DEFINE xcompromiso RECORD tipo_cliente,sec_cliente INT, fechaActualizaacion DATE, observacion VARCHAR(200), montoPago DEC(12,2), documento VARCHAR(25), tipo_doc VARCHAR(10), fechaCompromiso DATE, envioemail VARCHAR(10) END RECORD INSERT INTO cctb00043 (tipo_cliente,sec_cliente,fechaActualizacion,observacion,montoPago,documento, tipo_doc,fechaCompromiso,envioemail,us_crea,fech_crea,estado) VALUES (xcompromiso.*, suser_sname(),getdate(),'ACTIVO') CALL msg(13) END FUNCTION FUNCTION notificar() DEFINE sesion Session, password,s_protocol,respuesta,mensajes STRING LET subject = "NOTIFICACION COMPROMISO PAGOS" LET cuerpo_correo =" Estimado Senores: ",xcliente CLIPPED,"

Estimados Seņores: ",xcliente CLIPPED, "

",notaCliente CLIPPED, "

", "
", "

Acordamos el pago por un monto de ",monto_pago USING"###,###,###.##"," en fecha ",fecha_compromiso USING "dd/mm/yyyy", "

Nos reiteramos a sus ordenes

Departamento de cobros MARMOTECH, S. A. ", " " LET xusername ='notificacion@marmotech.com.do' LET xsmtphost ='smtp.office365.com' LET xsmtpport = '587' LET xpassword = 'Lmmjvsd2020' LET vendedorEmail = 'jsoto@marmotech.com.do' CALL enviaemail(vendedorEmail,subject,cuerpo_correo,NULL,xusername,xsmtphost,xsmtpport,xpassword) END FUNCTION FUNCTION contactos(ptipocliente,pseccliente) DEFINE ptipocliente,pseccliente,i INT DECLARE buscaContactos CURSOR FOR SELECT 'NO',a.contacto,a.puesto,a.email,a.celular,a.telefono_of FROM vetb00087 a WHERE a.tipo_cliente = ptipocliente AND a.sec_cliente = pseccliente AND a.contacto IS NOT NULL LET i = 1 FOREACH buscaContactos INTO arrContactos[i].* LET i = i + 1 END FOREACH END FUNCTION FUNCTION buscaBalance(ktipo,ksec,j) DEFINE ktipo,ksec,dias, j INT, zcorriente,z1a30,z31a60,z61a90,zmas90,ztotalSaldo,t_ztotalSaldo, t_zcorriente,t_z1a30,t_z31a60,t_z61a90,t_zmas90,t_t_totalSaldo DEC(12,2), selec1 STRING, zmoneda VARCHAR(50), fechaAV,hoy DATE, factura CHAR(10) DEFINE datos RECORD factura INT, pendiente DECIMAL(12,2), nombre VARCHAR(50), fecha_ven DATE, num_doc INT, cotizacion_no, num_oc INT, tipo_doc CHAR(7), tipo_cliente, sec_cliente, sec_vend INT END RECORD SET CONNECTION "MSSQL" LET hoy = TODAY LET selec1= " SELECT a.tipo_cliente,a.sec_cliente,b.nombre,a.aplica_a,", " SUM(a.valor+a.monto_desc),d.simbolo ", " FROM cctb00001 a,vetb00004 b,vetb00060 e,vetb00061 d ", " WHERE ", " (a.fecha_orig <= '", TODAY USING "mm/dd/yyyy" , "') AND ", " (a.tipo_cliente = ",ktipo," AND ", " a.sec_cliente = ",ksec,") AND ", " (a.tipo_cliente=b.tipo_cliente AND ", " a.sec_cliente=b.sec_cliente) AND ", "a.tipo_cliente = e.tipo_cliente AND d.ventas=e.ventas AND ", # " a.tipo_doc NOT IN ('AV') AND ", " a.status_t IS NULL ", " GROUP BY a.tipo_cliente,a.sec_cliente,b.nombre,a.aplica_a,d.simbolo ", " HAVING SUM(a.valor + a.monto_desc) > 0 ORDER BY a.tipo_cliente,a.sec_cliente,a.aplica_a " PREPARE c_docs FROM selec1 DECLARE b_docs CURSOR FOR c_docs LET t_zcorriente=0 LET t_z1a30=0 LET t_z31a60=0 LET t_z61a90=0 LET t_zmas90=0 LET t_ztotalSaldo=0 LET t_t_totalSaldo = 0 LET j = 1 FOREACH b_docs INTO datos.tipo_cliente, datos.sec_cliente, datos.nombre, datos.factura, datos.pendiente,zmoneda LET zcorriente=0 LET z1a30=0 LET z31a60=0 LET z61a90=0 LET zmas90=0 LET ztotalSaldo=0 #BUSCAMOS EL VENDEDOR LET datos.sec_vend = NULL SELECT UNIQUE a.sec_vend INTO datos.sec_vend FROM vetb00028 a WHERE a.tipo_cliente = datos.tipo_cliente AND a.sec_cliente = datos.sec_cliente AND a.status_t IS NULL IF datos.sec_vend IS NULL THEN LET datos.sec_vend = 0 END IF #BUSCAMOS LA FECHA DE VENCIMIENTO Y TIPO DE DOCUMENTO SELECT MAX( a.tipo_doc),MAX(a.fecha_ven) INTO datos.tipo_doc,datos.fecha_ven FROM cctb00001 a WHERE a.status_t IS NULL AND (a.tipo_doc NOT in ("PG","NC","PC","OC","DV","RC")AND a.num_doc = a.num_doc AND a.num_doc=datos.factura ) and (a.tipo_cliente=datos.tipo_cliente AND a.sec_cliente=datos.sec_cliente) IF datos.tipo_doc = 'AV' THEN CONTINUE FOREACH END IF #BUSCAMOS LA COTIZACION IF datos.tipo_doc = 'FT' OR datos.tipo_doc='FE' THEN LET datos.cotizacion_no=NULL SELECT MAX(a.conduce) INTO datos.cotizacion_no FROM vetb00002 a WHERE (a.factura = datos.factura) AND (a.tipo_cliente = datos.tipo_cliente AND a.sec_cliente=datos.sec_cliente) END IF #DAMOS VALOR A LA FECHA DE FACTURA SI ES NULA IF datos.fecha_ven IS NULL THEN SELECT CONVERT(CHAR(10),MAX(a.fecha_ven),103) INTO datos.fecha_ven FROM cctb00001 a WHERE a.status_t IS NULL AND a.aplica_a=datos.factura AND a.tipo_doc IN ("NC","OC","DV","ND") and (a.tipo_cliente=datos.tipo_cliente AND a.sec_cliente=datos.sec_cliente) END IF #BUSCAMOS EL NUMERO DE ORDEN Y COTIZACION SELECT MAX(a.orden),MAX(a.conduce) INTO datos.num_oc, datos.cotizacion_no FROM vetb00002 a WHERE (a.factura = datos.factura) AND (a.tipo_cliente = datos.tipo_cliente AND a.sec_cliente = datos.sec_cliente) IF datos.fecha_ven IS NULL THEN SELECT CONVERT(CHAR(10),MAX(a.fecha_ven),103) INTO datos.fecha_ven FROM cctb00001 a WHERE a.status_t IS NULL AND a.aplica_a=datos.factura AND a.tipo_doc in ("NC","OC","DV","ND") AND (a.tipo_cliente=datos.tipo_cliente AND a.sec_cliente=datos.sec_cliente) END IF IF datos.pendiente > 0 THEN #### Calcula la diferencia de dias de pago a determinada factura para acu- #### mularlo en la variable correspondiente por tipo de dia. LET dias = hoy - datos.fecha_ven LET factura = datos.tipo_doc,"-",datos.factura DISPLAY "dias ",dias #### Imprime y acumula los valores correspondientes a pago realizados en #### menos de 31 dias. IF dias <= 0 THEN LET zcorriente = datos.pendiente LET t_zcorriente = t_zcorriente + datos.pendiente END IF IF dias > 0 AND dias < 31 THEN LET z1a30 = datos.pendiente LET t_z1a30 = t_z1a30 + datos.pendiente END IF IF dias >=31 AND dias < 61 THEN LET z31a60 = datos.pendiente LET t_z31a60 = t_z31a60+ datos.pendiente END IF IF dias >= 61 AND dias <= 90 THEN LET z61a90 = datos.pendiente LET t_z61a90 = t_z61a90+ datos.pendiente END IF IF dias > 90 THEN LET zmas90 = datos.pendiente LET t_zmas90 = t_zmas90 + datos.pendiente END IF LET ztotalSaldo = zcorriente+ z1a30 + z31a60 + z61a90 + zmas90 LET t_ztotalSaldo = t_ztotalSaldo + ztotalSaldo DISPLAY "datos4 ", zcorriente, z1a30, z31a60, z61a90, zmas90, datos.tipo_doc, datos.factura, fechaAV # LET arrConsolidado[j].tipo_cliente = datos.tipo_cliente # LET nodos_sub_hijos[j].sec_cliente = datos.sec_cliente LET arrConsolidado[j].cCliente = xcliente LET arrConsolidado[j].cDocumento = datos.factura LET arrConsolidado[j].cOrden = datos.num_oc LET arrConsolidado[j].ccotizacion = datos.cotizacion_no LET arrConsolidado[j].cmoneda = zmoneda LET arrConsolidado[j].ccorriente =zcorriente LET arrConsolidado[j].cde1a30= z1a30 LET arrConsolidado[j].cde31a60 = z31a60 LET arrConsolidado[j].cd61a90= z61a90 LET arrConsolidado[j].cMasde90=zmas90 LET arrConsolidado[j].cTotal=ztotalSaldo LET arrConsolidado[j].ctipodoc = datos.tipo_doc LET arrConsolidado[j].cfechaVen = datos.fecha_ven --DISPLAY "data6 ",datos.factura," ",nodos_sub_hijos[j].corriente ,' ',j,' ', zcorriente LET j = j+1 END IF END FOREACH SET CONNECTION "IFMX" # RETURN t_zcorriente, t_z1a30, t_z31a60, t_z61a90, t_zmas90, t_ztotalSaldo, datos.sec_vend END FUNCTION