Commit inicial: fuentes MBS ERP (Genero 6) + .gitignore + docs/SETUP_PC_MBS.md

This commit is contained in:
2026-08-18 20:59:52 -04:00
commit 454973e269
5978 changed files with 2664094 additions and 0 deletions
+532
View File
@@ -0,0 +1,532 @@
{------------------------------------------------------------------------------
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 ="
<!DOCTYPE html>
<html lang='en'>
<head>
<title>Estimado Senores: ",xcliente CLIPPED,"</title>
</head>
<body>
<img src='https://ws.marmotech.com.do/imagenes/principal/logo.png' alt=''>
<div>
<p>Estimados Señores: <b><em>",xcliente CLIPPED, "</em></b>
<p>",notaCliente CLIPPED,
"</div>",
"<div>",
" <p>Acordamos el pago por un monto de ",monto_pago USING"###,###,###.##"," en fecha ",fecha_compromiso USING "dd/mm/yyyy",
"</p></div>
<div><p>Nos reiteramos a sus ordenes</p></div>
<diiv><b>Departamento de cobros MARMOTECH, S. A.</b></div>
",
"
</body>
</html>"
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