Commit inicial: fuentes MBS ERP (Genero 6) + .gitignore + docs/SETUP_PC_MBS.md
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user