{ PROGRAMA : prprmt020 OBJETIVO : Administrar los documentos de las ordenes PROGRAMADOR : ING. JUAN SOTO FECHA : 10/1/2013 ACTUALIZACION: SE CAMBIO DE SOLO ADMINISTRAR LOS DIBUJOS A MANEJAR TODOS LOS DOCUMENTOS RELACIONADOS A LA ORDEN FECHA ACTUALIZACION: 1/12/2015 } IMPORT os GLOBALS "prprgb000.4gl" DEFINE d_tipos,mensaje,f_tipos,filepath,l_file,tmpdir_file STRING, xusername,xsmtphost,xsmtpport,xpassword VARCHAR(100), nombre_file_orig DYNAMIC ARRAY OF VARCHAR(100), psec_vend INT, container, enviarEncuesta STRING MAIN DEFER INTERRUPT CALL STARTLOG("prmt020.log") CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave # CALL showDir("F:\\MASTER\\DOCUMENTOS_ORDENES") CONNECT to "marmotech" AS "IFMX" USER usuarios USING clave CONNECT to "smarmotech" AS "MSSQL" USER usuarios USING clave CALL prprmt020() END MAIN FUNCTION prprmt020() DEFINE nombre_cliente,email,emailsubject,procedimiento,vendedor,dir_file CHAR(60), url,filedestino VARCHAR(200), emailbody STRING, documentos DYNAMIC ARRAY OF RECORD idx INT, tipo_file CHAR(20), bodega,cod_mov SMALLINT, num_doc INT, nombre_file VARCHAR(100), filedestino BYTE, envio_correo,file_extension CHAR(10) END RECORD, p_res,i SMALLINT, chpath VARCHAR(1), cmd VARCHAR(200), exito BOOLEAN, tipo_file,enviar_email CHAR(20), bodega SMALLINT, num_doc INT LET i = 1 OPEN WINDOW w1 WITH FORM "prfmmt012" DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM) INPUT BY NAME prtb09.num_oc BEFORE INPUT LET d_tipos="PDF" LET f_tipos="*.pdf *.jpg *.png *.dwg *.dkf" LET mensaje=%"Elige Documento" # Busca correo usuario LET copiaemail = NULL LET email = null SELECT ISNULL(a.email,b.email) INTO email FROM seg0000 a,seg0001 b WHERE a.usuario = usuarios AND a.usuario = b.usuario LET copiaemail = email CLIPPED DECLARE buscacorreo CURSOR FOR SELECT a.correo FROM seg0003 a WHERE a.controldibujo = 'SI' LET idx = 1 FOREACH buscacorreo INTO copiacorreo[idx] LET copiaemail = copiaemail CLIPPED,",",copiacorreo[idx] LET idx = idx + 1 END FOREACH AFTER FIELD num_oc SELECT a.cotizacion_no,b.nombre,a.sec_vend,ISNULL(c.nom1_emp,' ')+ISNULL(c.apell1_emp,' '), a.tipo_cliente,a.sec_cliente INTO prtb09.cotizacion_no,nombre_cliente,psec_vend,vendedor, prtb08.tipo_cliente,prtb08.sec_cliente FROM prtb00012 a,vetb00004 b,adtb00003 c WHERE a.num_oc = prtb08.num_oc AND a.tipo_cliente = b.tipo_cliente AND a.sec_cliente = b.sec_cliente AND a.sec_vend = c.num_emp IF STATUS = NOTFOUND THEN CALL msg(3) NEXT FIELD num_oc ELSE CALL documentos.clear() DECLARE busca_dibujo CURSOR FOR SELECT a.id,a.tipo_file,a.bodega,a.cod_mov, a.num_doc,a.nombre_file, a.documento,a.envio_notificacion FROM prtb00029 a WHERE a.num_oc = prtb08.num_oc ORDER BY a.id LET idx = 1 LOCATE documentos[idx].filedestino IN MEMORY FOREACH busca_dibujo INTO documentos[idx].* LET idx = idx + 1 LOCATE documentos[idx].filedestino IN MEMORY END FOREACH END IF SELECT MAX(a.id) INTO i FROM prtb00029 a WHERE a.num_oc = prtb08.num_oc SELECT a.path_documentos_ordenes,a.url_file_destino INTO filedestino,url FROM companias a DISPLAY BY NAME prtb08.cotizacion_no,nombre_cliente,vendedor NEXT FIELD tipo_file AFTER INPUT END INPUT INPUT ARRAY documentos FROM sdibujo.* ATTRIBUTE(WITHOUT DEFAULTS) ON ACTION dibujo CALL ui.Interface.frontCall("standard","openfile", [dir_file,d_tipos,f_tipos,mensaje], [filepath] ) IF filepath IS NOT NULL THEN IF downshift(os.Path.extension(filepath)) = "pdf" OR downshift(os.Path.extension(filepath)) = "jpg" OR downshift(os.Path.extension(filepath)) = "dwg" OR downshift(os.Path.extension(filepath)) = "dxf" OR downshift(os.Path.extension(filepath)) = "png" THEN LET dir_file = os.Path.basename(filepath) DISPLAY filepath TO ruta_file CALL documentos.appendElement() IF idx IS NULL THEN LET idx = 1 END IF LOCATE documentos[idx].filedestino IN MEMORY LET dir_file = "tmp\\",dir_file CLIPPED CALL fgl_getfile(filepath,dir_file) CALL documentos[idx].filedestino.readFile(dir_file) LET documentos[idx].nombre_file=os.Path.basename(filepath) LET nombre_file_orig[idx] = filepath LET idx = idx + 1 ELSE CALL fgl_winmessage("ERROR","EL FILE DEBE SER PDF, JPG, PNG, DWG","INFO") END IF END IF AFTER FIELD num_doc IF num_doc IS NOT NULL AND tipo_file = "CO" THEN CASE WHEN tipo_file = "CO" IF documentos[arr_curr()].bodega IS NULL THEN NEXT FIELD bodega END IF IF documentos[arr_curr()].cod_mov IS NULL THEN NEXT FIELD cod_mov END IF DISPLAY "datos: r ",arr_curr()," b ",documentos[arr_curr()].bodega," n ",documentos[arr_curr()].num_doc," c ",documentos[arr_curr()].cod_mov SELECT DISTINCT a.num_doc FROM iptb00006 a WHERE a.bodega = documentos[arr_curr()].bodega AND a.num_doc = documentos[arr_curr()].num_doc AND a.cod_mov =documentos[arr_curr()].cod_mov AND a.num_oc = prtb08.num_oc AND a.status_t IS NULL IF STATUS = NOTFOUND THEN CALL fgl_Winmessage("ERROR","DOCUMENTO NO EXISTE o NO PERTENECE A ESTA ORDEN","INFO") NEXT FIELD num_doc END IF WHEN tipo_file="DE" SET CONNECTION "IFMX" SELECT DISTINCT a.num_doc FROM cctb00001 a WHERE a.num_doc = documentos[arr_curr()].num_doc AND a.tipo_doc = "NC" AND a.tipo_cliente = prtb08.tipo_cliente AND a.sec_cliente = prtb08.sec_cliente AND a.status_t IS NULL IF STATUS = NOTFOUND THEN CALL fgl_Winmessage("ERROR","DOCUMENTO NO EXISTE","INFO") NEXT FIELD num_doc END IF END CASE END IF AFTER FIELD tipo_file IF tipo_file = "CO" THEN CALL dialog.setFieldActive('cod_mov', TRUE) CALL codmov() END IF BEFORE INPUT CALL bodegas("1") # CALL codmov() CALL dialog.setFieldActive('cod_mov', FALSE ) ON ACTION abrir TRY LET tmpdir_file = "tmp\\",usuarios CLIPPED,documentos[arr_curr()].nombre_file CALL documentos[arr_curr()].filedestino.writeFile(tmpdir_file) CALL ui.Interface.frontCall("standard","getenv", ["TEMP"], [l_file] ) LET l_file = l_file CLIPPED,"\\",documentos[arr_curr()].nombre_file CALL fgl_putfile(tmpdir_file,l_file) CALL ui.Interface.frontCall("standard","shellexec", [l_file],[p_res]) CATCH CALL fgl_winmessage("ERROR",err_get(STATUS),"INFO") END TRY ON ACTION actualiza # WHENEVER ERROR CONTINUE LET enviar_email = 'SI' BEGIN WORK SELECT enviaEncuesta INTO container FROM prtb00029 WHERE num_oc = prtb08.num_oc AND tipo_file = 'CO' DELETE FROM prtb00029 WHERE num_oc = prtb08.num_oc FOR idx = 1 TO documentos.getLength() IF documentos[idx].filedestino IS NOT NULL THEN IF documentos[idx].tipo_file IS NULL THEN ROLLBACK WORK CALL fgl_winmessage("INFO","FAVOR DE COLOCAR EL TIPO DE FILE A ESTE DOCUMENTO","INFO") NEXT FIELD tipo_file END IF IF documentos[idx].nombre_file IS NOT NULL THEN LET documentos[idx].nombre_file= idx USING "&&&","-",prtb08.num_oc USING "&&&&&&&&",'.',os.Path.extension(documentos[idx].nombre_file) LET documentos[idx].file_extension = os.Path.extension(documentos[idx].nombre_file) ELSE LET documentos[idx].nombre_file= idx USING "&&&","-",prtb08.num_oc USING "&&&&&&&&",'.',os.Path.extension(filepath) LET documentos[idx].file_extension = os.Path.extension(documentos[idx].nombre_file) END IF LET tipo_file = documentos[idx].tipo_file IF documentos[idx].tipo_file = 'CO' THEN LET enviarEncuesta = container ELSE LET enviarEncuesta = NULL END IF INSERT INTO prtb00029 (num_oc,documento, tipo_file, nombre_file,num_doc,bodega,id,us_crea,fech_crea, ruta_file_original,file_extension,cod_mov, enviaEncuesta) VALUES (prtb08.num_oc,documentos[idx].filedestino, documentos[idx].tipo_file, documentos[idx].nombre_file, documentos[idx].num_doc,documentos[idx].bodega, idx,usuarios,getdate(),nombre_file_orig[idx], documentos[idx].file_extension,documentos[idx].cod_mov, enviarEncuesta ) IF STATUS < 0 THEN ROLLBACK WORK CALL fgl_winmessage("ERROR","NO INSERTE DOCUMENTO EN LA ORDEN","INFO") EXIT PROGRAM END IF IF tipo_file= 'DI' THEN IF enviar_email = "SI" THEN LET emailsubject = "ACTUALIZACION DIBUJO ORDEN ",prtb08.num_oc USING "&&&&&&" LET emailbody = "El usuario ",usuarios," Adiciono un dibujo a la orden ",prtb08.num_oc USING "&&&&&&" LET procedimiento = "{ call cc_avisadespacho(?,?,?,?) }" CLIPPED LET xusername ='notificacion@marmotech.com.do' LET xsmtphost ='smtp.office365.com' LET xsmtpport = '587' LET xpassword = 'Lmmjvsd2020' # LET copiaemail = 'jsoto@marmotech.com.do,jsoto@marmotech.com.do,jsoto@marmotech.com.do,mpinales@marmotech.com.do,eamador@marmotech.com.do' TRY CALL enviaemail(copiaemail,emailsubject,emailbody,NULL,xusername,xsmtphost,xsmtpport,xpassword) #RETURNING retorne UPDATE prtb00029 SET envio_notificacion = 'SI' WHERE num_oc =prtb08.num_oc AND tipo_file = 'DI' AND id = IDX INSERT INTO envia_email_log (email,estado,fecha,programa_envio,us_crea,display_name) VALUES (copiaemail,'ENVIO',getdate(),'prprmt020',usuarios,prtb08.num_oc) LET enviar_email = "NO" CATCH INSERT INTO envia_email_log (email,estado,fecha,programa_envio,us_crea,display_name) VALUES (copiaemail,'NO ENVIO',getdate(),'prprmt020',usuarios,prtb08.num_oc) END TRY END IF END IF END IF END FOR #Notifica que no tiene un DWG o DXF file COMMIT WORK { IF email IS NOT NULL THEN SELECT ISNULL(COUNT(*),0) INTO cuenta_tipo FROM prtb00029 a WHERE a.num_oc = prtb08.num_oc AND a.tipo_file = 'DI' AND file_extension IN('DWG','DXF') IF cuenta_tipo=0 THEN LET emailsubject = "FALTA DOCUMENTO AUTOCAD DE LA ORDEN ",prtb08.num_oc USING "&&&&&&" LET emailbody = "POR FAVOR ADICIONAR EL FILE DE AUTOCAD(DWG o DFX) CON LA FINALIDAD QUE LA ORDEN NO SE DETENGA EN EL PROCESO" # LET email = 'jsoto@marmotech.com.do' CALL enviaemail(email,emailsubject,emailbody,NULL,xusername,xsmtphost,xsmtpport,xpassword) #RETURNING retorne END IF END IF } CALL fgl_winmessage("ACTUALIZACION","ACTUALIZACION EXITOSA","INFO") NEXT FIELD num_oc END INPUT ON ACTION CANCEL LET INT_FLAG = FALSE CALL msg(2) EXIT DIALOG CLOSE WINDOW w1 END DIALOG END FUNCTION FUNCTION showDir(path) DEFINE path STRING DEFINE child STRING DEFINE h INTEGER, contenido DYNAMIC ARRAY OF STRING, exito BOOLEAN OPEN WINDOW w2 WITH FORM "prtest" IF NOT os.Path.exists(path) THEN CALL fgl_winmessage("NO",path,"info") RETURN END IF IF NOT os.Path.isdirectory(path) THEN DISPLAY " ", os.Path.basename(path) RETURN END IF LET contenido[1]="[",path,"]" LET idx = 1 CALL os.Path.dirsort("name", 1) LET h = os.Path.diropen(path) WHILE h > 0 LET child = os.Path.dirnext(h) IF child IS NULL THEN EXIT WHILE END IF IF child == "." OR child == ".." THEN CONTINUE WHILE END IF LET contenido[idx] = os.Path.join( path, child ) LET idx = idx + 1 END WHILE CALL os.Path.dirclose(h) DISPLAY ARRAY contenido TO scontenido.* ON ACTION borrar CALL os.Path.delete(contenido[arr_curr()]) RETURNING exito IF NOT exito THEN CALL fgl_winmessage("E","NO BORRE EL FILE","INFO") CONTINUE DISPLAY END IF AFTER DISPLAY IF INT_FLAG THEN EXIT PROGRAM END IF EXIT DISPLAY END DISPLAY CLOSE WINDOW w2 END FUNCTION