Files
MBS/PROYECTO/TEST/enviafiledgii/enviafile2.4gl
T

640 lines
21 KiB
Plaintext

IMPORT os
IMPORT com
IMPORT XML
IMPORT UTIL
DEFINE url_semilla,
url_validasemilla,
url_autorizacion,
url_recepcion,
url_consulta,
xambiente
STRING
DEFINE codigo,
tokenxml,
nombreFile,
filexml,
token,
respuesta,
ptipoRecepcion,
xhash
STRING
DEFINE doc xml.DomDocument
DEFINE ruta, accion, addAnswer STRING
MAIN
DEFINE trespuesta STRING
OPEN WINDOW w1 WITH FORM 'enviafileform'
INPUT BY NAME accion ATTRIBUTES(UNBUFFERED)
ON ACTION FileRoute
INITIALIZE ruta TO NULL
CALL UploadDoc() RETURNING ruta
DISPLAY ruta TO ruta
ON ACTION lesgo
IF addAnswer IS NOT NULL THEN
LET trespuesta = addAnswer
END IF
CALL procesoencf(
ruta CLIPPED,
'test',
'normal',
accion CLIPPED,
trespuesta CLIPPED)
ON ACTION CLOSE
END INPUT
CLOSE WINDOW w1
-- LET trespuesta = '{"trackId":"cf224fcc-150d-436f-ba05-9610c4792314","codigo":"2","estado":"Rechazado","rnc":"101521262","encf":"E340000000142","secuenciaUtilizada":false,"fechaRecepcion":"3/20/2024 10:12:57 AM","mensajes":[{"valor":"El formato del XML no es válido.","codigo":1}]}'
-- CALL procesoencf('.\\filesXML\\101521262E310000001480.xml','produccion','normal','adicionar',trespuesta)
END MAIN
FUNCTION procesoEncf(
fileporfirmar, ambiente, tiporecepcion, xoperacion, krespuesta)
DEFINE fileporfirmar,
rtoken,
ambiente,
tiporecepcion,
xoperacion,
krespuesta,
trrespuesta
STRING
LET ptipoRecepcion = tiporecepcion
IF ambiente <> "produccion" THEN
IF ambiente <> "test" THEN
DISPLAY "no llego bien ", ambiente
RETURN
END IF
END IF
LET xambiente = ambiente
CALL urls()
CALL buscatoken() RETURNING codigo, tokenxml
IF codigo <> "200" THEN
DISPLAY "respuesta buscatoken: ", tokenxml, " ", codigo
EXIT PROGRAM
END IF
# Create DomDocument object
LET doc = xml.DomDocument.Create()
# Notice that whitespaces are significant in cryptography,
# therefore it is recommended to remove unnecessary ones
CALL doc.setFeature("whitespace-in-element-content", FALSE)
CALL doc.loadFromString(tokenxml)
CALL doc.save(".\\filesXML\\marmotech\\mtechTokenString.xml")
#FIRMA SEMILLA
IF os.Path.exists(".\\filesXML\\marmotech\\mtechTokenString.xml") THEN
CALL firmasemilla()
ELSE
DISPLAY "NO PUDE CREAR SEMILLA"
RETURN
END IF
IF os.Path.exists(".\\filesXML\\marmotech\\mtechSignature.xml") THEN
CALL validasemilla() RETURNING codigo, respuesta
ELSE
DISPLAY "NO ENCONTRE LA SEMILLA FIRMADA"
RETURN
END IF
IF respuesta IS NOT NULL THEN
LET doc = xml.DomDocument.Create()
CALL doc.loadFromString(respuesta)
CALL doc.save(".\\filesXMl\\marmotech\\RespuestaValida.xml")
CALL gettoken() RETURNING rtoken
LET token = rtoken
ELSE
DISPLAY "NO TENEMOS RESPUESTA DE VALIDA SEMILLA"
RETURN
END IF
#FRIMA CON GENERO
IF xoperacion <> 'consultatrackid' THEN
LET filexml = fileporfirmar
CALL firmadocumento(fileporfirmar)
LET filexml =
'.\\filesXML\\marmotech\\firmados\\', os.Path.baseName(filexml)
CALL enviafiles(token, filexml) RETURNING codigo, respuesta
ELSE
LET token = " Bearer ", token
CALL consultaResultado(token, krespuesta) RETURNING trrespuesta
DISPLAY "consulta: ", trrespuesta
--cambios
INITIALIZE AddAnswer TO NULL
LET AddAnswer = trrespuesta
DISPLAY BY NAME addAnswer
--end cambios
END IF
END FUNCTION
FUNCTION firmadocumento(fileafirmar)
DEFINE doc xml.DomDocument
DEFINE doc2 xml.DomDocument
DEFINE root xml.DomNode
DEFINE node xml.DomNode
DEFINE signNode xml.DomNode
DEFINE sig xml.Signature
DEFINE key xml.CryptoKey
DEFINE cert xml.CryptoX509
DEFINE
index INTEGER,
fileafirmar, filefirmado STRING
# Create DomDocument object
LET doc = xml.DomDocument.Create()
# Notice that whitespaces are significant in cryptography,
# therefore it is recommended to remove unnecessary ones
CALL doc.setFeature("whitespace-in-element-content", FALSE)
#LET fileafirmar = '.\\filesXML\\marmotech\\originales\\',fileafirmar
DISPLAY "file ", fileafirmar
LET filexml = fileafirmar
CALL doc.load(fileafirmar)
TRY
# Create rsa key
LET key =
xml.CryptoKey.Create(
"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256")
CALL key.loadPEM(".\\cert\\marmotech\\onlyRSA.pem")
# Create an X509 certificate with the constructor of the CryptoX509 class.
LET cert = xml.CryptoX509.Create()
CALL cert.setFeature("X509Certificate", TRUE)
# Load the X509 certificate associated to the RSA or DSA private key into the CryptoKey object.
# CALL cert.loadPEM("cert509.crt")
CALL cert.loadPEM(".\\cert\\marmotech\\onlyCert.pem")
# Create signature object with the key to use
LET sig = xml.Signature.Create()
# Assign the CryptoKey object to the Signature object.
CALL sig.setKey(KEY)
# Assign the CryptoX509 object to the Signature object.
CALL sig.setCertificate(cert)
# Set XML node to be signed. In our case, the entire document
# LET index = sig.createReference("",
# "http://www.w3.org/2001/04/xmlenc#sha256")
LET index =
sig.createReference('""', "http://www.w3.org/2001/04/xmlenc#sha256")
# Add enveloped method to not take the XML signature node into account
# when computing the entire document.
CALL sig.appendReferenceTransformation(
index,
"http://www.w3.org/2000/09/xmldsig#enveloped-signature",
doc.getDocumentElement())
# Set canonicalization method on the XML fragment to be signed.
# CALL sig.appendReferenceTransformation(index,
# "http://www.w3.org/2001/10/xml-exc-c14n#")
# Compute enveloped signature
CALL sig.compute(doc)
# Retrieve signature document
LET doc2 = sig.getDocument()
# Append the signature node to the original document to get
# a valid enveloped signature
# Notice that the enveloped signature can be added anywhere in the
# original document
LET signNode = doc2.getDocumentElement() # Get Signature node
# Import it into the original document
LET node = doc.importNode(signNode, TRUE)
# Retrieve the original document root node
LET root = doc.getDocumentElement()
# Append the signature node as last child of the original document
CALL root.appendChild(node)
# Save document with enveloped signature back to disk
CALL doc.setFeature("format-pretty-print", TRUE)
LET filefirmado =
'.\\filesXML\\marmotech\\firmados\\', os.Path.baseName(fileafirmar)
CALL doc.save(filefirmado)
CATCH
DISPLAY "Unable to create an enveloped signature :",
status,
" ",
sqlca.sqlerrm
END TRY
END FUNCTION
FUNCTION firmasemilla()
DEFINE doc xml.DomDocument
DEFINE doc2 xml.DomDocument
DEFINE root xml.DomNode
DEFINE node xml.DomNode
DEFINE signNode xml.DomNode
DEFINE sig xml.Signature
DEFINE key xml.CryptoKey
DEFINE cert xml.CryptoX509
DEFINE index INTEGER
# Create DomDocument object
LET doc = xml.DomDocument.Create()
# Notice that whitespaces are significant in cryptography,
# therefore it is recommended to remove unnecessary ones
CALL doc.setFeature("whitespace-in-element-content", FALSE)
LET filexml = ".\\filesXML\\marmotech\\mtechTokenString.xml"
IF os.Path.exists(filexml) THEN
CALL doc.load(filexml)
ELSE
DISPLAY "NO LO ENCONTRE"
RETURN
END IF
TRY
# Create rsa key
LET key =
xml.CryptoKey.Create(
"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256")
CALL key.loadPEM(".\\cert\\marmotech\\onlyRSA.pem")
# Create an X509 certificate with the constructor of the CryptoX509 class.
LET cert = xml.CryptoX509.Create()
CALL cert.setFeature("X509Certificate", TRUE)
# Load the X509 certificate associated to the RSA or DSA private key into the CryptoKey object.
# CALL cert.loadPEM("cert509.crt")
CALL cert.loadPEM(".\\cert\\marmotech\\onlyCert.pem")
# Create signature object with the key to use
LET sig = xml.Signature.Create()
# Assign the CryptoKey object to the Signature object.
CALL sig.setKey(KEY)
# Assign the CryptoX509 object to the Signature object.
CALL sig.setCertificate(cert)
# Set XML node to be signed. In our case, the entire document
# LET index = sig.createReference("",
# "http://www.w3.org/2001/04/xmlenc#sha256")
LET index =
sig.createReference('""', "http://www.w3.org/2001/04/xmlenc#sha256")
# Add enveloped method to not take the XML signature node into account
# when computing the entire document.
CALL sig.appendReferenceTransformation(
index,
"http://www.w3.org/2000/09/xmldsig#enveloped-signature",
doc.getDocumentElement())
# Set canonicalization method on the XML fragment to be signed.
# CALL sig.appendReferenceTransformation(index,
# "http://www.w3.org/2001/10/xml-exc-c14n#")
# Compute enveloped signature
CALL sig.compute(doc)
# Retrieve signature document
LET doc2 = sig.getDocument()
# Append the signature node to the original document to get
# a valid enveloped signature
# Notice that the enveloped signature can be added anywhere in the
# original document
LET signNode = doc2.getDocumentElement() # Get Signature node
# Import it into the original document
LET node = doc.importNode(signNode, TRUE)
# Retrieve the original document root node
LET root = doc.getDocumentElement()
# Append the signature node as last child of the original document
CALL root.appendChild(node)
# Save document with enveloped signature back to disk
CALL doc.setFeature("format-pretty-print", TRUE)
CALL doc.save(".\\filesXML\\marmotech\\mtechSignature.xml")
CATCH
DISPLAY "Unable to create an enveloped signature :",
status,
" ",
sqlca.sqlerrm
END TRY
END FUNCTION
FUNCTION validasemilla()
DEFINE
respuesta, codigo STRING,
http_req com.HttpRequest,
http_resp com.HTTPResponse
LET http_req = com.HTTPRequest.Create(url_validasemilla)
CALL http_req.setMethod("POST")
CALL http_req.setCharset("UTF-8")
CALL http_req.setHeader("accept", "application/xml")
CALL http_req.setMultipartType("form-data", NULL, NULL)
IF os.Path.exists(".\\filesXML\\marmotech\\mtechSignature.xml") THEN
CALL http_req.setHeader(
"Content-Disposition",
"form-data; name=\"xml\"; filename=\".\\filesXML\\marmotech\\mtechSignature.xml\"")
CALL http_req.doFileRequest(
".\\filesXML\\marmotech\\mtechSignature.xml")
ELSE
DISPLAY "NO LO ENCUENTRO"
RETURN 0, "FILE NO EXISTE"
END IF
# CALL http_req.setHeader("Content-Disposition", "form-data; name=\"xml\"; filename=\"naceSignature.xml\"")
# CALL http_req.doFileRequest("naceSignature.xml")
LET http_resp = http_req.getResponse()
LET codigo = http_resp.getStatusCode()
LET respuesta = http_resp.getTextResponse()
IF http_resp.getStatusCode() != 200 THEN
DISPLAY "error: ", codigo, " ", respuesta
RETURN codigo, respuesta
END IF
DISPLAY "valida semilla: ", codigo, " ", respuesta
RETURN codigo, respuesta
END FUNCTION
FUNCTION enviafiles(btoken, archivo)
DEFINE
respuesta, btoken, codigo, archivo, contenido, consultaResp STRING,
http_req com.HttpRequest,
http_resp com.HTTPResponse
LET btoken = " Bearer ", btoken
DISPLAY "url ", url_recepcion
LET http_req = com.HTTPRequest.Create(url_recepcion)
CALL http_req.setMethod("POST")
CALL http_req.setCharset("UTF-8")
CALL http_req.setHeader("accept", "application/json")
CALL http_req.setHeader("Authorization", btoken)
CALL http_req.setMultipartType("form-data", NULL, NULL)
# "form-data; name=\"xml\"; filename=\"naceSignature.xml\""
# LET archivo = "101521262E310000000001.xml"
IF os.Path.exists(archivo) THEN
DISPLAY "archivo: ", archivo
LET contenido =
"form-data; name=\"xml\"; filename=", os.path.basename(archivo)
#CALL http_req.setHeader("Content-Disposition", "form-data; name=\"xml\"; filename=\"130337391E310000000005.XML\"")
CALL http_req.setHeader("Content-Disposition", contenido)
# CALL http_req.setHeader("Content-Disposition", "form-data; name=\"xml\"; filename=\"130337391E310000000016.xml\"")
CALL http_req.doFileRequest(archivo)
LET http_resp = http_req.getResponse()
LET codigo = http_resp.getStatusCode()
LET respuesta = http_resp.getTextResponse()
IF http_resp.getStatusCode() != 200 THEN
DISPLAY "error: ", codigo, " ", respuesta
RETURN codigo, respuesta
END IF
ELSE
RETURN 0, "FILE NO EXISTE"
END IF
# CALL http_req.setHeader("Content-Disposition", "form-data; name=\"xml\"; filename=\"naceSignature.xml\"")
# CALL http_req.doFileRequest("naceSignature.xml")
DISPLAY "enviafile: ", codigo, " ", respuesta
IF ptipoRecepcion <> "aprobacion" THEN
CALL consultaResultado(btoken, respuesta) RETURNING consultaResp
--cambios
INITIALIZE AddAnswer TO NULL
LET AddAnswer = consultaResp
DISPLAY AddAnswer TO addAnswer
--end cambios
DISPLAY "responde consulta: ", consultaResp
END IF
RETURN codigo, respuesta
END FUNCTION
FUNCTION gettoken()
DEFINE i, l INTEGER
DEFINE r om.XmlReader
DEFINE e, tok STRING
DEFINE a om.SaxAttributes
DISPLAY "filexml: ", filexml
LET r =
om.XmlReader.createFileReader(
".\\filesXML\\marmotech\\RespuestaValida.xml")
LET l = 0
LET e = r.read()
WHILE e IS NOT NULL
CASE e
WHEN "StartDocument"
# DISPLAY "StartDocument:"
WHEN "StartElement"
LET l = l + 1
#DISPLAY l SPACES, "StartElement:", r.getTagName()
LET a = r.getAttributes()
FOR i = 1 TO a.getLength()
IF a.getName(i) = "token" THEN
# DISPLAY l SPACES," ",
# a.getName(i)," = ",
# a.getValueByIndex(i)
END IF
END FOR
WHEN "Characters"
IF r.getTagName() = "token" THEN
LET tok = r.getCharacters()
# DISPLAY "token dentro de gettoken: ",tok
EXIT CASE
END IF
WHEN "SkippedEntity"
# DISPLAY "Entity:'",r.skippedEntity(),"'"
WHEN "EndElement"
# DISPLAY l SPACES, "EndElement:", r.getTagName()
LET l = l - 1
WHEN "EndDocument"
# DISPLAY "EndDocument:"
OTHERWISE
# DISPLAY "Invalid event: ",e
END CASE
LET e = r.read()
END WHILE
RETURN tok
END FUNCTION
FUNCTION buscatoken()
DEFINE
respuesta STRING,
http_req com.HttpRequest,
http_resp com.HTTPResponse
#SELECT a.urltoken INTO url FROM companias a
#"https://ecf.dgii.gov.do/testecf/autenticacion/api/autenticacion/semilla"
#"https://ecf.dgii.gov.do/CerteCF/Autenticacion/api/Autenticacion/Semilla"
LET http_req = com.HTTPRequest.Create(url_semilla)
CALL http_req.setMethod("GET")
CALL http_req.setCharset("UTF-8")
CALL http_req.setHeader("accept", "application/xml")
CALL http_req.doRequest()
#CALL http_req.doTextRequest(url)
LET http_resp = http_req.getResponse()
IF http_resp.getStatusCode() != 200 THEN
RETURN http_resp.getStatusCode(), http_resp.getTextResponse()
END IF
LET respuesta = http_resp.getTextResponse()
RETURN http_resp.getStatusCode(), respuesta
END FUNCTION
FUNCTION urls()
IF xambiente = "produccion" THEN
IF ptipoRecepcion = "normal" THEN
LET url_recepcion =
"https://ecf.dgii.gov.do/ecf/Recepcion/api/FacturasElectronicas"
ELSE
IF ptipoRecepcion = 'consumo' THEN
LET url_recepcion =
"https://fc.dgii.gov.do/ecf/RecepcionFC/api/Recepcion/ecf"
END IF
END IF
IF ptipoRecepcion = 'normal32' THEN
LET url_recepcion =
"https://fc.dgii.gov.do/ecf/RecepcionFC/api/Recepcion/ecf"
END IF
LET url_semilla =
"https://ecf.dgii.gov.do/ecf/autenticacion/api/autenticacion/semilla"
LET url_validasemilla =
"https://ecf.dgii.gov.do/ecf/Autenticacion/api/Autenticacion/ValidarSemilla"
LET url_consulta =
"https://ecf.dgii.gov.do/ecf/ConsultaResultado/api/consultas/estado"
END IF
IF xambiente = "certificacion" THEN
IF ptipoRecepcion = 'aprobacion' THEN
LET url_recepcion =
"https://ecf.dgii.gov.do/CerteCF/aprobacioncomercial/api/aprobacioncomercial"
END IF
IF ptipoRecepcion = "normal" THEN
LET url_recepcion =
"https://ecf.dgii.gov.do/CerteCF/Recepcion/api/FacturasElectronicas"
ELSE
IF ptipoRecepcion = 'consumo' THEN
LET url_recepcion =
"https://fc.dgii.gov.do/CerteCF/RecepcionFC/api/Recepcion/ecf"
END IF
END IF
IF ptipoRecepcion = 'normal32' THEN
LET url_recepcion =
"https://fc.dgii.gov.do/CerteCF/RecepcionFC/api/Recepcion/ecf"
END IF
LET url_semilla =
"https://ecf.dgii.gov.do/CerteCF/autenticacion/api/autenticacion/semilla"
LET url_validasemilla =
"https://ecf.dgii.gov.do/CerteCF/Autenticacion/api/Autenticacion/ValidarSemilla"
LET url_consulta =
"https://ecf.dgii.gov.do/CerteCF/ConsultaResultado/api/consultas/estado"
END IF
IF xambiente = "test" THEN
IF ptipoRecepcion = "normal" THEN
LET url_recepcion =
"https://ecf.dgii.gov.do/TesteCF/Recepcion/api/FacturasElectronicas"
ELSE
IF ptipoRecepcion = 'consumo' THEN
LET url_recepcion =
"https://fc.dgii.gov.do/TesteCF/RecepcionFC/api/Recepcion/ecf"
END IF
END IF
IF ptipoRecepcion = 'normal32' THEN
LET url_recepcion =
"https://fc.dgii.gov.do/TesteCF/RecepcionFC/api/Recepcion/ecf"
END IF
LET url_semilla =
"https://ecf.dgii.gov.do/TesteCF/autenticacion/api/autenticacion/semilla"
LET url_validasemilla =
"https://ecf.dgii.gov.do/TesteCF/Autenticacion/api/Autenticacion/ValidarSemilla"
LET url_consulta =
"https://ecf.dgii.gov.do/TesteCF/ConsultaResultado/api/consultas/estado"
END IF
END FUNCTION
FUNCTION consultaResultado(ctoken, data)
DEFINE data, ctoken STRING
DEFINE
crespuesta STRING,
http_req com.HttpRequest,
http_resp com.HTTPResponse
DEFINE dtrackid RECORD
trackid, ERROR, mensaje STRING
END RECORD
CALL util.JSON.parse(data, dtrackid)
DISPLAY "TRACK: ", dtrackid.trackid
#SELECT a.urltoken INTO url FROM companias a
#"https://ecf.dgii.gov.do/testecf/autenticacion/api/autenticacion/semilla"
#"https://ecf.dgii.gov.do/CerteCF/Autenticacion/api/Autenticacion/Semilla"
LET url_consulta =
url_consulta CLIPPED, "?TrackId=", dtrackid.trackid CLIPPED
LET http_req = com.HTTPRequest.Create(url_consulta)
CALL http_req.setMethod("GET")
CALL http_req.setCharset("UTF-8")
CALL http_req.setHeader("accept", "application/json")
CALL http_req.setHeader("Authorization", ctoken)
CALL http_req.doRequest()
LET http_resp = http_req.getResponse()
LET crespuesta = http_resp.getTextResponse()
IF http_resp.getStatusCode() != 200 THEN
RETURN crespuesta
END IF
RETURN crespuesta
END FUNCTION