"
+
+ LET enviaCorreo = "NO"
+ BEGIN WORK
+
+ # Selecciona el registro del ultimo numero de documento para chequear si
+ # existe para insertarlo en la tabla de secuencia
+ SELECT num_salida INTO datos1.num_doc FROM irtb00014 WHERE cod_mov = datos1.cod_mov
+ IF status = NOTFOUND THEN
+ LET datos1.num_doc = 0
+
+ INSERT INTO irtb00014
+ VALUES(datos1.num_doc,
+ datos1.cod_mov,
+ NULL,
+ SUSER_SNAME(),
+ GETDATE(),
+ NULL,
+ NULL)
+ END IF
+
+ LET datos1.num_doc = datos1.num_doc + 1
+ DISPLAY BY NAME datos1.num_doc ATTRIBUTE(BOLD)
+
+ UPDATE irtb00014
+ SET num_salida = datos1.num_doc,
+ us_mod = usuarios,
+ fech_mod = getdate()
+ WHERE cod_mov = datos1.cod_mov
+ #----------------------------------------------------------------------------
+
+ FOR idx = 1 TO arr_count()
+
+ IF movi8[idx].cod_n IS NOT NULL
+ AND movi8[idx].cod_grupo IS NOT NULL
+ AND movi8[idx].cod_tipo IS NOT NULL
+ AND movi8[idx].cod_sec IS NOT NULL
+ AND (movi8[idx].cantidad_2 IS NOT NULL
+ AND movi8[idx].cantidad_2 > 0) THEN
+
+ IF transacc.status_mov = "2" THEN
+ LET movi8[idx].cantidad_2 =
+ movi8[idx].cantidad_2 * -1
+ END IF
+
+ IF movi8[idx].codigo IS NULL
+ AND transacc.control_maquina = "SI" THEN
+ DISPLAY "AQUI 1"
+
+ ROLLBACK WORK
+ CALL msg(16)
+ NEXT FIELD codigo
+ END IF
+ IF movi8[idx].codigo IS NOT NULL
+ AND transacc.control_maquina = "NO" THEN
+ DISPLAY "AQUI 2"
+
+ ROLLBACK WORK
+ CALL msg(1664)
+ NEXT FIELD codigo
+ END IF
+
+ LET checkapi.checkDept = FALSE
+ LET checkapi.checkMaquina = FALSE
+ LET checkapi.checkRep = FALSE
+
+ --Verificar si el departamento esta en maintainX
+ INITIALIZE answer TO NULL
+ SELECT id_maintainx INTO answer
+ FROM adtb00001 WHERE departamento = datos1.departamento
+
+ IF answer IS NULL THEN
+ #CALL msg(16)
+ DISPLAY "AQUI 3"
+ ELSE
+ LET checkApi.checkDept = TRUE
+ END IF
+
+ --Verificar si la maquina esta en maintainX
+ INITIALIZE answer TO NULL
+ SELECT b.id_maintainX INTO answer FROM irtb00009 a, actb00001 b
+ WHERE a.id_codigo = b.codigo
+ AND a.codigo = movi8[idx].codigo
+
+ IF answer IS NULL THEN
+ #CALL msg(16)
+ DISPLAY "AQUI 4"
+ ELSE
+ LET checkApi.checkMaquina = TRUE
+ END IF
+
+ --Verificar si el repuesto esta en maintainX
+ INITIALIZE answer TO NULL
+ select id_maintainX INTO answer from irtb00002 WHERE
+ cod_n = movi8[idx].cod_n AND cod_grupo = movi8[idx].cod_grupo
+ AND cod_tipo = movi8[idx].cod_tipo AND cod_sec = movi8[idx].cod_sec
+
+ IF answer IS NULL THEN
+ #CALL msg(16)
+ DISPLAY "AQUI 5"
+ ELSE
+ LET checkApi.checkRep = TRUE
+ END IF
+
+ INSERT INTO irtb00006(
+ num_doc,
+ fecha,
+ conduce_no,
+ tipo,
+ orden_compra,
+ cod_sp,
+ cod_sp_sec,
+ cod_mov,
+ maquina,
+ cod_n,
+ cod_grupo,
+ cod_tipo,
+ cod_sec,
+ cantidad_2,
+ sec_a,
+ status_mov,
+ us_crea,
+ fech_crea,
+ bodega,
+ orden_trabajo,
+ num_req)
+ VALUES(datos1.num_doc,
+ datos1.fecha,
+ datos1.conduce_no,
+ datos1.tipo,
+ datos1.orden_compra,
+ datos1.cod_sp,
+ datos1.cod_sp_sec,
+ datos1.cod_mov,
+ movi8[idx].codigo,
+ movi8[idx].cod_n,
+ movi8[idx].cod_grupo,
+ movi8[idx].cod_tipo,
+ movi8[idx].cod_sec,
+ movi8[idx].cantidad_2,
+ datos1.departamento,
+ transacc.status_mov,
+ usuarios,
+ GETDATE(),
+ '1',
+ movi8[idx].orden_trabajo,
+ data.rnumeroDoc)
+
+ IF data.rcodMov IS NOT NULL AND data.rcodMov != 0 THEN
+
+ UPDATE irtb00057 SET estado = 'CERRADA', us_mod = usuarios, fech_mod = getdate()
+ WHERE numero_doc = data.rnumeroDoc AND cod_mov = data.rcodMov AND bodega = data.bodega
+
+ END IF
+
+ IF movi8[idx].num_emp IS NOT NULL THEN
+ LET v_producto_id =
+ movi8[idx].cod_n CLIPPED, "-" CLIPPED,
+ movi8[idx].cod_grupo CLIPPED, "-" CLIPPED,
+ movi8[idx].cod_tipo CLIPPED, "-" CLIPPED,
+ movi8[idx].cod_sec CLIPPED
+
+ INSERT INTO adtb00057(num_emp, fecha, codigo, documento, cantidad)
+ VALUES(movi8[idx].num_emp,
+ datos1.fecha,
+ REPLACE(v_producto_id, ' ',''),
+ datos1.num_doc,
+ ABS(movi8[idx].cantidad_2))
+ END IF
+
+
+ SELECT SUM(cantidad_2) INTO APIexistencia from irtb00006
+ WHERE cod_n = movi8[idx].cod_n and cod_grupo = movi8[idx].cod_grupo
+ and cod_tipo = movi8[idx].cod_tipo and cod_sec = movi8[idx].cod_sec
+ AND status_t IS NULL
+
+ SELECT exist_min INTO m_articulos.exist_min FROM irtb00002
+ WHERE cod_n = movi8[idx].cod_n AND cod_grupo = movi8[idx].cod_grupo
+ AND cod_tipo = movi8[idx].cod_tipo AND cod_sec = movi8[idx].cod_sec
+ AND status_t IS NULL
+
+ select costo_st INTO m_articulos.descrip_ing from irtb00013 where mes_fin = 12 and ano = YEAR(datos1.fecha)
+ and cod_n = movi8[idx].cod_n AND cod_grupo = movi8[idx].cod_grupo
+ AND cod_tipo = movi8[idx].cod_tipo AND cod_sec = movi8[idx].cod_sec
+ AND status_t IS NULL
+
+ # ESTE CONTROL ESTABA AL MOMENTO DE NOSOTROS DESARROLLAR EL API,
+ # POR SUGERENCIA DE CESAR FRANCISCO EN FECHA 08/05/2026 SOLO SE ESTA CONTROLANDO
+ # SI EL REPUESTO ESTA EN MAINTAINX
+ # IF checkapi.checkDept AND checkapi.checkMaquina AND checkapi.checkRep THEN
+
+ IF checkapi.checkRep THEN
+ LET m_articulos.existencia = APIexistencia
+
+ CALL ApiMaintainR('PATCH',answer, m_articulos.*, usuarios) RETURNING answer
+
+ IF answer != 1 THEN
+ DISPLAY "AQUI 6"
+ ROLLBACK WORK
+ END IF
+
+ END IF
+
+ # ---------------------------------------------------------------
+ # MaintainX: adjunta el repuesto de la linea a SU orden de trabajo.
+ # Cada linea del detalle se adjunta a su propia orden de trabajo.
+ # ---------------------------------------------------------------
+ IF movi8[idx].orden_trabajo IS NOT NULL THEN
+
+ # El repuesto debe existir en MaintainX; de lo contrario se aborta.
+ IF NOT checkapi.checkRep THEN
+ CALL fgl_winmessage(
+ "REPUESTO NO ESTA EN MAINTAINX",
+ "El repuesto de una linea con orden de trabajo no se encuentra en MaintainX. No se puede guardar el documento.",
+ "stop")
+ ROLLBACK WORK
+ NEXT FIELD cod_n
+ END IF
+
+ # Obtiene el ID real de la orden de trabajo en MaintainX para ESTA linea.
+ INITIALIZE fakeData.* TO NULL
+ CALL ApiMaintainC('CHECK', movi8[idx].orden_trabajo,
+ fakeData.*, usuarios) RETURNING answer, answer2
+
+ IF answer IS NULL OR answer = 0 THEN
+ CALL fgl_winmessage(
+ "ORDEN DE TRABAJO EN MAINTAINX",
+ "El ID de la orden de trabajo colocada no se encuentra en MaintainX.",
+ "stop")
+ ROLLBACK WORK
+ NEXT FIELD orden_trabajo
+ END IF
+
+ LET answer_workorder = answer
+
+ # Datos del repuesto que se adjuntara a la orden de trabajo.
+ SELECT UNIQUE id_maintainx INTO fakeData.id_maintainx
+ FROM irtb00002
+ WHERE cod_n = movi8[idx].cod_n
+ AND cod_grupo = movi8[idx].cod_grupo
+ AND cod_tipo = movi8[idx].cod_tipo
+ AND cod_sec = movi8[idx].cod_sec
+ AND status_t IS NULL
+
+ LET fakeData.contactID = movi8[idx].cantidad_2
+ LET fakeData.cod_sp_sec = datos1.departamento
+ LET fakeData.term_sp = datos1.cod_mov
+
+ CALL ApiMaintainC('PATCH_WORKORDER', answer_workorder,
+ fakeData.*, usuarios) RETURNING answer, answer2
+
+ IF answer != 1 THEN
+ CALL fgl_winmessage(
+ "ORDEN DE TRABAJO EN MAINTAINX",
+ "No se pudo adjuntar el repuesto a la orden de trabajo en MaintainX.",
+ "stop")
+ ROLLBACK WORK
+ NEXT FIELD orden_trabajo
+ END IF
+
+ END IF
+
+ IF transacc.status_mov = "2" THEN
+
+ CALL existencia(
+ movi8[idx].cod_n,
+ movi8[idx].cod_grupo,
+ movi8[idx].cod_tipo,
+ movi8[idx].cod_sec)
+ RETURNING existen
+
+ IF existen IS NULL THEN
+ LET existen = 0
+ END IF
+
+ IF existen < 0 THEN
+ DISPLAY "AQUI 7"
+
+ ROLLBACK WORK
+ LET numero_msg = 30
+ CALL msg(numero_msg)
+ NEXT FIELD cod_n
+ END IF
+
+ END IF
+
+
+
+ OUTPUT TO REPORT formu4(datos1.*, movi8[idx].*)
+ LET cuerpo_correo = cuerpo_correo CLIPPED, ""
+ # PROCEDIMIENTO ENVIO CORREO PARA LA EXISTENCIA MINIMA
+ LET existenciaact[idx] =
+ (existenciaact[idx] - (movi8[idx].cantidad_2 * -1))
+ IF existminima[idx] > 0 THEN
+ LET porcientocontrol[idx] =
+ (existminima[idx] / existenciaact[idx]) * 100
+
+ END IF
+ LET enviaEmailProd[idx] = "NO"
+ IF porcientocontrol[idx] >= 90
+ AND transacc.status_mov = 2
+ AND existminIma[idx] > 0 THEN
+
+ # INFORMACION PARA ENVIAR EL CORREO A LOS VENDEDORES
+
+ LET enviaCorreo = "SI"
+
+ LET CCEmail = "jsoto@marmotech.com.do"
+
+ LET cuerpo_correo =
+ cuerpo_correo CLIPPED,
+ "| ",
+ movi8[idx].descrip_esp CLIPPED,
+ " | ",
+ "",
+ movi8[idx].cantidad_2 USING "##,###.##",
+ " | ",
+ "",
+ existminima[idx] USING "##,###.##",
+ " | ",
+ "",
+ existenciaact[idx] USING "##,###.##",
+ " | ",
+ "
"
+ LET enviaEmailProd[idx] = "SI"
+ END IF
+ IF porcientocontrol[idx] <= 0
+ AND transacc.status_mov = 2
+ AND existminIma[idx] > 0 THEN
+
+ # INFORMACION PARA ENVIAR EL CORREO A LOS VENDEDORES
+
+ LET enviaCorreo = "SI"
+ # LET TOEmail = "mantenimiento@marmotech.com.do"
+
+ LET CCEmail = "jsoto@marmotech.com.do"
+
+ LET cuerpo_correo =
+ cuerpo_correo CLIPPED,
+ "",
+ movi8[idx].descrip_esp CLIPPED,
+ " | ",
+ "",
+ movi8[idx].cantidad_2 USING "##,###.##",
+ " | ",
+ "",
+ existminima[idx] USING "##,###.##",
+ " | ",
+ "",
+ existenciaact[idx] USING "##,###.##",
+ " | ",
+ ""
+ LET enviaEmailProd[idx] = "SI"
+
+ END IF
+ IF transacc.status_mov = 2
+ AND existenciaact[idx] <= 0
+ AND enviaEmailProd[idx] = "NO" THEN
+
+ # INFORMACION PARA ENVIAR EL CORREO A LOS VENDEDORES
+
+ LET enviaCorreo = "SI"
+
+ # LET TOEmail = "mantenimiento@marmotech.com.do"
+
+ LET CCEmail = "jsoto@marmotech.com.do"
+
+ LET cuerpo_correo =
+ cuerpo_correo CLIPPED,
+ "| EXISTENCIA EN CERO |
",
+ "",
+ movi8[idx].descrip_esp CLIPPED,
+ " | ",
+ "",
+ movi8[idx].cantidad_2 USING "##,###.##",
+ " | ",
+ "",
+ existminima[idx] USING "##,###.##",
+ " | ",
+ "",
+ existenciaact[idx] USING "##,###.##",
+ " | ",
+ ""
+
+ END IF
+
+ END IF
+ # SE DESACTIVO EL ENVIO POR CADA TRANSACCION QUE ESTE POR DEBAJO DEL MINIMO
+ LET enviaCorreo = "NO"
+ END FOR
+ IF enviaCorreo = "SI" THEN
+ LET cuerpo_correo =
+ cuerpo_correo CLIPPED, "