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
@@ -0,0 +1,272 @@
DEFINE usuarios, clave STRING
MAIN
DEFER INTERRUPT
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CONNECT TO "smarmotech" AS "MSSQL" USER usuarios USING clave
CALL Envia_notificacion()
END MAIN
FUNCTION Envia_notificacion()
DEFINE supervisor DYNAMIC ARRAY OF RECORD
num_emp_supervisor INT,
num_emp_empleados DYNAMIC ARRAY OF INTEGER,
empleados_con_email DYNAMIC ARRAY OF INTEGER
END RECORD
DEFINE answer_data DYNAMIC ARRAY OF RECORD
num_emp_supervisor INT,
cantidad_empleados INT,
cantidad_empleados_email INT,
encuestas_enviadas INT,
cantidad_respuestas INT
END RECORD
DEFINE e_emp_query STRING, idx INT, i,x, count_answer, encuestas_enviadas INT , num_emp INT , respuesta STRING
DEFINE checking DYNAMIC ARRAY OF RECORD
num_emp INT,
estado STRING
END RECORD
PREPARE query5 FROM "SELECT num_emp
FROM adtb00003
WHERE num_emp IN (
SELECT DISTINCT num_emp_supervisor
FROM adtb00003
WHERE num_emp_supervisor IS NOT NULL AND num_emp_supervisor != 0 and num_emp_supervisor in (3355)
)
AND status_t IS NULL"
#num_emp_supervisor in (5556, 5565, 5474)
DECLARE buscar CURSOR FOR query5
LET idx = 1
FOREACH buscar INTO supervisor[idx].num_emp_supervisor
LET count_answer = 0
DECLARE buscar2 CURSOR FOR
SELECT a.num_emp FROM adtb00003 a
WHERE a.num_emp_supervisor = supervisor[idx].num_emp_supervisor
AND status_t IS NULL
LET i = 1
FOREACH buscar2 INTO supervisor[idx].num_emp_empleados[i]
LET i = i + 1
END FOREACH
IF i = 1 THEN
CONTINUE FOREACH
END IF
DECLARE buscar3 CURSOR FOR
SELECT a.num_emp FROM adtb00003 a
WHERE a.num_emp_supervisor = supervisor[idx].num_emp_supervisor
AND a.status_t IS NULL AND a.email IS NOT NULL
LET i = 1
FOREACH buscar3 INTO supervisor[idx].empleados_con_email[i]
LET i = i + 1
END FOREACH
IF i = 1 THEN
CONTINUE FOREACH
END IF
IF supervisor[idx].empleados_con_email[1] IS NOT NULL THEN
LET e_emp_query = '(' CLIPPED
LET i = 1
IF supervisor[idx].empleados_con_email.getLength() = 1 THEN
LET e_emp_query = e_emp_query,supervisor[idx].empleados_con_email[1],')'
ELSE
FOR i = 1 TO supervisor[idx].empleados_con_email.getLength() - 1
IF i <> supervisor[idx].empleados_con_email.getLength() - 1 THEN
LET e_emp_query = e_emp_query CLIPPED, supervisor[idx].empleados_con_email[i] CLIPPED, ',' CLIPPED
ELSE
LET e_emp_query = e_emp_query CLIPPED, supervisor[idx].empleados_con_email[i] CLIPPED, ')' CLIPPED
END IF
END FOR
END IF
DISPLAY e_emp_query
PREPARE query FROM
'SELECT a.referencia, a.estado FROM encuestas_log a
WHERE a.fecha between DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1)
AND DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 28)
AND a.idEncuesta = 4 AND a.referencia in '|| e_emp_query
DECLARE buscar4 CURSOR FOR query
LET i = 1
FOREACH buscar4 INTO checking[i].num_emp, checking[i].estado
DISPLAY checking[i].num_emp, checking[i].estado
LET i = i + 1
END FOREACH
INITIALIZE e_emp_query TO NULL
LET e_emp_query = '('
LET i = 1
IF checking.getLength() = 1 THEN
LET e_emp_query = e_emp_query, checking[1].num_emp, ')'
DISPLAY e_emp_query
ELSE
FOR i = 1 TO checking.getLength() - 1
IF i <> checking.getLength() - 1 THEN
IF checking[i].estado = 'VALIDO' THEN
LET e_emp_query = e_emp_query CLIPPED, checking[i].num_emp CLIPPED, ',' CLIPPED
END IF
ELSE
IF checking[i].estado = 'VALIDO' THEN
LET e_emp_query = e_emp_query CLIPPED, checking[i].num_emp CLIPPED, ')' CLIPPED
END IF
END IF
END FOR
END IF
DISPLAY e_emp_query
PREPARE query2 FROM
'SELECT a.num_emp, a.respuesta FROM encuestas.dbo.respuesta_laboral a
WHERE a.fech_crea between DATEFROMPARTS(2024, MONTH(GETDATE()), 1)
AND DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 28)
AND a.num_emp in '|| e_emp_query
DECLARE buscar5 CURSOR FOR query2
FOREACH buscar5 INTO num_emp, respuesta
LET count_answer = count_answer + 1
END FOREACH
END IF
LET answer_data[idx].num_emp_supervisor = supervisor[idx].num_emp_supervisor
LET answer_data[idx].cantidad_empleados = supervisor[idx].num_emp_empleados.getLength() - 1
LET answer_data[idx].cantidad_empleados_email = supervisor[idx].empleados_con_email.getLength() - 1
LET answer_data[idx].encuestas_enviadas = checking.getLength() - 1
LET answer_data[idx].cantidad_respuestas = count_answer
DISPLAY "supervisor: ", answer_Data[idx].num_emp_supervisor
DISPLAY "cantidad_empleados: ", answer_data[idx].cantidad_empleados
DISPLAY "con email: ", answer_data[idx].cantidad_empleados_email
DISPLAY "encuestas enviadas: ", answer_data[idx].encuestas_enviadas
DISPLAY "respuestas: ", answer_data[idx].cantidad_respuestas
DISPLAY ''
IF answer_data[idx].cantidad_empleados_email <> 0 AND answer_data[idx].encuestas_enviadas <> 0 THEN
CALL formatear_correo(answer_data[idx].*)
END IF
LET idx = idx + 1
END FOREACH
END FUNCTION
FUNCTION formatear_correo(data)
DEFINE data RECORD
num_emp_supervisor INT,
cantidad_empleados INT,
cantidad_empleados_email INT,
encuestas_enviadas INT,
cantidad_respuestas INT
END RECORD
DEFINE strcuerpo,strusername,xsmtphost,strpassword,strport,srtsubject STRING,
email_cliente, nombre_cliente, departamento VARCHAR(100)
LET srtsubject = "RESUMEN DE ENCUESTAS A SUPERVISORES"
SELECT a.email, CONCAT(rtrim(a.nom1_emp),' ',rtrim(a.apell1_emp)), b.nom_dpto
INTO email_cliente, nombre_cliente, departamento FROM adtb00003 a INNER JOIN adtb00001 b
ON a.departamento = b.departamento WHERE num_emp =data.num_emp_supervisor
SELECT a.from_address,a.puerto,a.nombre_servidor,a.clave
INTO strusername,strport,xsmtphost,strpassword
FROM tbperfil_mail a WHERE cod_perfil =2
LET strcuerpo ="<!DOCTYPE html>
<html>
<head>
<style>
table {
font-family: Arial, sans-serif;
border-collapse: collapse;
width: 100%;
max-width: 600px;
}
th, td {
border: 1px solid #dddddd;
text-align: center;
padding: 12px;
}
th {
background-color: #4CAF50;
color: white;
}
caption {
caption-side: top;
font-size: 18px;
font-weight: bold;
margin-bottom: 10px;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
</style>
</head>
<body>
<table>
<caption>Resumen de Encuestas - Supervisor " || nombre_cliente || "</caption>
<tr>
<th>Departamento</th>
<th>Total de empleados</th>
<th>Empleados con correo electronico</th>
<th>Encuestas enviadas</th>
<th>Respuestas recibidas</th>
</tr>
<tr>
<td>" || departamento || "</td>
<td>" || data.cantidad_empleados || "</td>
<td>" || data.cantidad_empleados_email || "</td>
<td>" || data.encuestas_enviadas || "</td>
<td>" || data.cantidad_respuestas || "</td>
</tr>
</table>
</body>
</html>"
IF email_cliente IS NOT NULL THEN
CALL enviaemail(email_cliente,srtsubject,strcuerpo,NULL,strusername,xsmtphost,strport,strpassword) #RETURNING retorne
ELSE
DISPLAY "SUPERVISOR NO TIENE EMAIL"
END IF
END FUNCTION
@@ -0,0 +1,114 @@
DEFINE usuarios, clave STRING
MAIN
DEFER INTERRUPT
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CONNECT TO "smarmotech" AS "MSSQL" USER usuarios USING clave
CALL ProcesoEnviarEncuesta()
END MAIN
FUNCTION ProcesoEnviarEncuesta()
DEFINE
Conduces DYNAMIC ARRAY OF RECORD
num_oc INT,
Dias INT,
Cliente STRING,
Correo STRING,
venta INT
END RECORD,
i INT
LET i = 1
INITIALIZE conduces TO NULL
PREPARE query
FROM "WITH CorreosUnicos AS (
SELECT
a.num_doc AS 'DOCUMENTO',
a.num_oc AS 'ORDEN',
DATEDIFF(day, a.fech_crea, GETDATE()) AS 'DIAS',
c.tipo_cliente AS 'CLIENTE',
d.patente AS 'CORREO',
c.ventas AS 'VENTA',
ROW_NUMBER() OVER (PARTITION BY d.patente ORDER BY a.fech_crea DESC) AS rn
FROM prtb00029 a
INNER JOIN iptb00006 b
ON a.num_oc = b.num_oc
AND a.num_doc = b.num_doc
INNER JOIN prtb00012 c
ON a.num_oc = c.num_oc
INNER JOIN vetb00004 d
ON c.tipo_cliente = d.tipo_cliente
AND c.sec_cliente = d.sec_cliente
WHERE
a.tipo_file = 'CO'
AND DATEDIFF(day, a.fech_crea, GETDATE()) >= 5
AND a.enviaEncuesta IS NULL
AND b.status_t IS NULL
AND b.cod_n = 12
AND c.status_t IS NULL
AND d.status_t IS NULL
AND d.patente IS NOT NULL
AND d.patente LIKE '%@%'
)
SELECT
ORDEN,
DIAS,
CLIENTE,
CORREO,
VENTA
FROM
CorreosUnicos
WHERE
rn = 1
ORDER BY
ORDEN DESC;
"
DECLARE buscar CURSOR FOR query
FOREACH buscar INTO Conduces[i].*
LET i = i + 1
END FOREACH
LET i = 1
#PRUEBA QUE LA ENCUESTA SE ENVÍA CORRECTAMENTE
{LET conduces[i].Correo = 'egarcia@marmotech.com.do'
CALL envia_encuesta(conduces[i].Correo,conduces[i].num_oc,
conduces[i].Cliente,conduces[i].venta, 'CONDUCES')}
#Producción
WHILE i <= conduces.getLength() - 1
--cambio de correo para pruebas
#LET conduces[i].Correo = 'egarcia@marmotech.com.do'
CALL envia_encuesta(conduces[i].Correo,conduces[i].num_oc,
conduces[i].Cliente,conduces[i].venta, 'CONDUCES')
TRY
UPDATE prtb00029 SET enviaEncuesta = 'SI'
WHERE num_oc = conduces[i].num_oc
AND tipo_file = 'CO'
CATCH
DISPLAY "Error actualizando la tabla prtb00029: ", sqlca.sqlcode
END TRY
LET i = i + 1
END WHILE
END FUNCTION
@@ -0,0 +1,151 @@
DEFINE usuarios, clave STRING
DEFINE encuesta_details DYNAMIC ARRAY OF RECORD
email STRING,
num_mes INT,
respuesta INT,
cotizacion_no INT,
NPS STRING,
vendedor STRING,
departamento STRING
END RECORD
DEFINE query, container STRING, i INT
DEFINE retractores, promotores, total_respuestas INT, nps DECIMAL(12,2)
MAIN
DEFER INTERRUPT
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CONNECT TO "smarmotech" AS "MSSQL" USER usuarios USING clave
CALL supervisor_nps()
END MAIN
FUNCTION supervisor_nps()
LET query = "SELECT a.numero_mes, a.respuesta, a.cotizacion_no, a.NPS, a.vendedor, a.departamento FROM
encuestas.dbo.vwencuesta_cliente a where a.ano = 2025 order by a.vendedor, a.numero_mes"
DECLARE buscar CURSOR FROM query
LET i = 1
LET retractores = 0,promotores = 0, total_respuestas = 0
LET container = encuesta_details[i].vendedor
FOREACH buscar INTO encuesta_details[i].*
IF container <> encuesta_details[i].vendedor THEN
CALL calcular_nps() RETURNING nps
CALL send_info_mail(nps, total_respuestas,
encuesta_details[i - 1].departamento, encuesta_details[i - 1].vendedor,
encuesta_details[i - 1].email)
LET retractores = 0,promotores = 0, total_respuestas = 0
LET container = encuesta_details[i].vendedor
END IF
IF encuesta_details[i].respuesta <= 6 THEN
LET retractores = retractores + 1
ELSE
IF encuesta_details[i].respuesta >= 9 THEN
LET promotores = promotores + 1
END IF
END IF
LET total_respuestas = total_respuestas + 1
LET i = i + 1
END FOREACH
END FUNCTION
FUNCTION calcular_nps()
DEFINE porc_promotores, porc_retractores DECIMAL (12,2)
LET porc_promotores = promotores / total_respuestas
LET porc_retractores = retractores / total_respuestas
RETURN (porc_promotores - porc_retractores) * 100
END FUNCTION
FUNCTION send_info_mail(mail_nps, mail_totalrespuesta, mail_departamento, mail_vendedor, mail_correo)
DEFINE mail_nps DECIMAL (12,2)
DEFINE mail_totalrespuesta INT
DEFINE mail_departamento, mail_vendedor, mail_correo STRING
DEFINE strcuerpo,strusername,xsmtphost,strpassword,strport,srtsubject STRING
LET srtsubject = "NPS CLIENTES POR VENDEDOR"
SELECT a.from_address,a.puerto,a.nombre_servidor,a.clave
INTO strusername,strport,xsmtphost,strpassword
FROM tbperfil_mail a WHERE cod_perfil =2
LET strcuerpo ="<!DOCTYPE html>
<html>
<head>
<style>
table {
font-family: Arial, sans-serif;
border-collapse: collapse;
width: 100%;
max-width: 600px;
}
th, td {
border: 1px solid #dddddd;
text-align: center;
padding: 12px;
}
th {
background-color: #4CAF50;
color: white;
}
caption {
caption-side: top;
font-size: 18px;
font-weight: bold;
margin-bottom: 10px;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
</style>
</head>
<body>
<table>
<caption>NPS CLIENTES - Vendedor " || mail_vendedor || "</caption>
<tr>
<th>Departamento</th>
<th>Total de respuestas</th>
<th>NPS</th>
</tr>
<tr>
<td>" || mail_departamento || "</td>
<td>" || mail_totalrespuesta || "</td>
<td>" || mail_nps || "</td>
</tr>
</table>
</body>
</html>"
IF mail_correo IS NOT NULL THEN
CALL enviaemail(mail_correo,srtsubject,strcuerpo,NULL,strusername,xsmtphost,strport,strpassword) #RETURNING retorne
ELSE
DISPLAY "NO HAY MAIL"
END IF
END FUNCTION