viernes, 11 de agosto de 2017

De Excel a XML

sCta1 is string
xSaldoinicial is numeric(10,2)
xSaldofinal is numeric(10,2)
xDebe is numeric(10,2)
xHaber is numeric(10,2)
sArchivoXML is string
cInformacion is character = "N"
nRenglones is int
nContador is int
nContador2 is int = 0
sDocName is xmlDocument <description = "BalanzaComprobacion_1_2">
nNameSpace1 is xmlNamespace
nNameSpace2 is xmlNamespace
nNode is dynamic xmlNode
nNode = sDocName.Balanza
IF COMBO_Informacion..DisplayedValue = "Normal" THEN
 cInformacion = "N"
ELSE
 cInformacion = "C"
END

sDocName.Balanza:Version = "1.1"
sDocName.Balanza:RFC = COMBO_RFC..DisplayedValue
sDocName.Balanza:Mes = NumToString(COMBO_Mes..Value,"02d")
sDocName.Balanza:Anio = COMBO_Anio..DisplayedValue
sDocName.Balanza:TipoEnvio = cInformacion
nNameSpace1.Name = "xsi"
nNameSpace1.URI = "http://www.w3.org/2001/XMLSchema-instance"

nNameSpace2..Name= "schemaLocation"
nNameSpace2..URI = "www.sat.gob.mx/esquemas/ContabilidadE/1_1/BalanzaComprobacion http://www.sat.gob.mx/esquemas/ContabilidadE/1_1/BalanzaComprobacion/BalanzaComprobacion_1_1.xsd"
sDocName.Balanza..Namespace.Name = "BCE"
Add(nNode..NamespaceDeclared, nNameSpace1)
Add(nNode..NamespaceDeclared, nNameSpace2)
//sDocName..schemaLocation = "http://www.sat.gob.mx/esquemas/ContabilidadE/1_1/BalanzaComprobacion/BalanzaComprobacion_1_1.xsd"
//nNode:schemaLocation..Name = "xsi"
//nNode:schemaLocation..Value = "http://www.sat.gob.mx/esquemas/ContabilidadE/1_1/BalanzaComprobacion/BalanzaComprobacion_1_1.xsd"
MyExcelDoc  is xlsDocument
MyExcelFile is string = EDT_ExcelFile
IF MyExcelFile = "" THEN RETURN
MyExcelDoc = xlsOpen(MyExcelFile,xlsWrite )
IF MyExcelDoc <> -1 THEN

 nRenglones = xlsNbRow(MyExcelDoc)
 FOR nContador = 2 TO nRenglones
  // Retrieve the value of a cell
  sCta1 = xlsData(MyExcelDoc, nContador, 1)
  xSaldoinicial = xlsData(MyExcelDoc, nContador,2)
  xDebe = xlsData(MyExcelDoc, nContador,3)
  xHaber = xlsData(MyExcelDoc, nContador,4)
  xSaldofinal =  xlsData(MyExcelDoc, nContador,5)
  /////////// crea xml
  IF sCta1 <> "" THEN
   nContador2 += 1
   sDocName.Balanza.Ctas[nContador2]:Debe  = xDebe
   sDocName.Balanza.Ctas[nContador2]:Haber = xHaber
   sDocName.Balanza.Ctas[nContador2]:NumCta= sCta1
   sDocName.Balanza.Ctas[nContador2]:SaldoFin = xSaldofinal
   sDocName.Balanza.Ctas[nContador2]:SaldoIni = xSaldoinicial
     END
 END
 

 IF XMLValidDocument(sDocName) = True THEN
        sArchivoXML = COMBO_RFC..DisplayedValue + NumToString(COMBO_Anio..DisplayedValue) + NumToString(COMBO_Mes..Value,"02d") + "B" + cInformacion + ".XML" 
  XMLSave(sDocName, EDT_Destino+ "\" + sArchivoXML)
  IF ErrorOccurred = True THEN
   Error("Unable to save the XML document", ErrorInfo())
  ELSE
   Info("OK")
  END
 ELSE
  Error("The XML document is invalid", ErrorInfo())
 END

END
xlsClose(MyExcelDoc)

Envío de correo

MySession is EmailSMTPSession
MyMessage is Email
myAttach  is EmailAttach
sFile     is string
MySession..ServerAddress = "smtp.miempresa.com.mx"
// The TLS port depends on the provider, don't forget to check it!
MySession..Port = 2525
MySession..Name = "gmero@miempresa.com.mx"
MySession..Password = "secrEto*"

EmailSetTimeOut(10)
IF EmailStartSession(MySession) = False THEN
 Error("no se pudo iniciar la sesión SMTP", ErrorInfo())
 RETURN
END

EmailReset(MyMessage)
MyMessage..Sender = "gmero@miempresa.com.mx"
MyMessage..SenderAddress = "gmero@miempresa.com.mx"
Add(MyMessage..Recipient, "yootro@otraempresa.com.mx")
MyMessage..Subject = "Prueba desde windev"
MyMessage..Message = "Hola Mundo 1"

//adjunto el archivo anexo
// Select the file to attach
sFile = EDT_File
// Build the EmailAttach variable if exist
IF fFileExist(sFile) = True
myAttach..Name = fExtractPath(sFile, fFileName)
myAttach..Content = fLoadText(sFile)
myAttach..ContentType = "application/pdf"
myAttach..ContentDescription = "A PDF document"
// Add the attachment
Add(MyMessage..Attach, myAttach)
END
EmailSendMessage(MySession,MyMessage)
EmailCloseSession(MySession)

Genera XML

miCFDI is xmlDocument <description = "cfdv33">
nNameSpace1 is xmlNamespace
nNameSpace2 is xmlNamespace
nNameSpace3 is xmlNamespace
nNode is dynamic xmlNode
nNode = miCFDI.Comprobante

nNameSpace1.Name = "xsi"
nNameSpace1.URI = "http://www.w3.org/2001/XMLSchema-instance"
 
Add(nNode..NamespaceDeclared, nNameSpace1)
XMLAddAttribute(miCFDI,"xsi:schemaLocation","www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd")

miCFDI.Comprobante:Version =  XML_TextoConEscape("3.3")
miCFDI.Comprobante:Serie   = XML_TextoConEscape("A")
miCFDI.Comprobante:Folio   = XML_TextoConEscape("12345")
miCFDI.Comprobante:Fecha = XML_TextoConEscape("2017-05-11T16:07:07")
miCFDI.Comprobante:Sello = ""
miCFDI.Comprobante:FormaPago = XML_TextoConEscape("01")
miCFDI.Comprobante:NoCertificado = "12345678901234567890"
miCFDI.Comprobante:Certificado = ""
miCFDI.Comprobante:CondicionesDePago = XML_TextoConEscape("UNA SOLA EXHIBICION")
miCFDI.Comprobante:SubTotal = "110.00"
miCFDI.Comprobante:Descuento = "10.00"
miCFDI.Comprobante:Moneda = "MXN"
///miCFDI.Comprobante:TipoCambio = "1"
miCFDI.Comprobante:Total = "116.00"
miCFDI.Comprobante:TipoDeComprobante = "I"
miCFDI.Comprobante:MetodoPago = XML_TextoConEscape("PUE")
miCFDI.Comprobante:LugarExpedicion =  "03920"
//miCFDI.Comprobante:Confirmacion = "ECVH1"
miCFDI.Comprobante.CfdiRelacionados:TipoRelacion = "05"
miCFDI.Comprobante.CfdiRelacionados.CfdiRelacionado[1]:UUID =  "9C1605E0-D05B-456F-9734-10788CC2E07D"  //"5FB2822E-396D-4725-8521-CDC4BDD20CCF"
miCFDI.Comprobante.Emisor:Rfc = "ALI890323KX5"
miCFDI.Comprobante.Emisor:Nombre = "ABARROTES LA IMPERIAL SA DE CV"
miCFDI.Comprobante.Emisor:RegimenFiscal = "601"
miCFDI.Comprobante.Receptor:Rfc = "MAFR570325MH5"
miCFDI.Comprobante.Receptor:Nombre = "MARTINEZ FUENTES RODRIGO"
miCFDI.Comprobante.Receptor:ResidenciaFiscal = "MEX"
//miCFDI.Comprobante.Receptor:NumRegIdTrib = ""
miCFDI.Comprobante.Receptor:UsoCFDI = "P01"
miCFDI.Comprobante.Conceptos.Concepto[1]:ClaveProdServ = "01010101"
miCFDI.Comprobante.Conceptos.Concepto[1]:NoIdentificacion = "CLAVE INTERNA"
miCFDI.Comprobante.Conceptos.Concepto[1]:Cantidad = "1"
miCFDI.Comprobante.Conceptos.Concepto[1]:ClaveUnidad = "SR"
miCFDI.Comprobante.Conceptos.Concepto[1]:Unidad = "STRIP"
miCFDI.Comprobante.Conceptos.Concepto[1]:Descripcion = "REPARACION DE EQUIPO"
miCFDI.Comprobante.Conceptos.Concepto[1]:ValorUnitario = "110.00"
miCFDI.Comprobante.Conceptos.Concepto[1]:Importe = "110.00"
miCFDI.Comprobante.Conceptos.Concepto[1]:Descuento = "10.00"
miCFDI.Comprobante.Conceptos.Concepto[1].Impuestos.Traslados.Traslado[1]:Base = "100.00"
miCFDI.Comprobante.Conceptos.Concepto[1].Impuestos.Traslados.Traslado[1]:Impuesto = "002"
miCFDI.Comprobante.Conceptos.Concepto[1].Impuestos.Traslados.Traslado[1]:TipoFactor = "Tasa"
miCFDI.Comprobante.Conceptos.Concepto[1].Impuestos.Traslados.Traslado[1]:TasaOCuota = "0.160000"
miCFDI.Comprobante.Conceptos.Concepto[1].Impuestos.Traslados.Traslado[1]:Importe = "16.00"
miCFDI.Comprobante.Impuestos:TotalImpuestosTrasladados = "16.00"
miCFDI.Comprobante.Impuestos.Traslados.Traslado[1]:Impuesto = "002"
miCFDI.Comprobante.Impuestos.Traslados.Traslado[1]:TipoFactor = "Tasa"
miCFDI.Comprobante.Impuestos.Traslados.Traslado[1]:TasaOCuota = "0.160000"
miCFDI.Comprobante.Impuestos.Traslados.Traslado[1]:Importe = "16.00"
//nNameSpace1.Name = "cfdi"
//nNameSpace1.URI = "http://www.w3.sat.gob.mx/cfd/3"
//Add(nNode..NamespaceDeclared, nNameSpace3)


IF XMLValidDocument(miCFDI) = True THEN
 sArchivoXML is string = "Cfdi33" + ".XML"
 XMLSave(miCFDI, EDT_Directorio+ "\" + sArchivoXML)
 IF ErrorOccurred = True THEN
  Error("No se pudo grabar el documento", ErrorInfo())
 ELSE
  Info("OK")
 END
ELSE
 Error("El documento XML es inválido", ErrorInfo())
END

Timbrando con Facturador Electrónico

bufMessageXML is Buffer
sFacturaXML is string
ResExecute is boolean
sRespuesta is string
sResultado1 is string
sMiarchivo4 is string = "c:\temp\MiCfdi4.xml" //archivo completo de respuesta del pac
sMiarchivo5 is string = "c:\temp\MiCfdi5.xml" //timbre obtenido del pac

// Create
sFacturaXML = fLoadText(EDT_File,foAnsi)
bufMessageXML = ...
"<?xml version=""1.0"" encoding=""utf-8"" ?>" + ...
"<soap:Envelope xmlns:soap=""http://www.w3.org/2003//05/soap-envelope/""" + ...
" xmlns:tim=""http://facturadorelectronico.com/timbrado"">" + ...
" <soap:Header/>" + ...
" <soap:Body>"  + ...
"<tim:obtenerTimbrado>" + ...
"<tim:CFDIcliente>" + "<![CDATA["+sFacturaXML + "]]> " + "</tim:CFDIcliente>" + ...
"<tim:Usuario>test</tim:Usuario>" + ...
"<tim:password>TEST</tim:password>" + ...
"</tim:obtenerTimbrado></soap:Body></soap:Envelope>"
//
Info(bufMessageXML)
//https://stagetimbrado.facturador.com/timbrado.asmx
//http://facturadorelectronico.com/timbrado/obtenerTimbrado
sURL is string = URLEncode("https://stagetimbrado.facturador.com/timbrado.asmx")
sAccion is a string = URLEncode("http://facturadorelectronico.com/timbrado/obtenerTimbrado")

//HTTPCertificate(
// Run the procedure
//ResExecute = SOAPRunXML(sURL ,bufMessageXML,sAccion)
ResExecute = SOAPRunXML("https://stagetimbrado.facturador.com/timbrado.asmx",bufMessageXML,sAccion)
IF ResExecute = True THEN // Is the communication with the server successful?
 // Is the procedure successfully run?
 sRespuesta = SOAPGetResult(SOAPXMLResult)
 fSaveText(sMiarchivo4,sRespuesta)
 IF sRespuesta <> "" THEN
  //Info(sRespuesta) // Display the result returned by the procedure
 ELSE
  Error("El error es: " + SOAPError(SOAPErrMessage))
  // Display the error returned by the SOAP server
 END
ELSE
 Error("No hay respuesta del servidor", ErrorInfo(errMessage),ResExecute)
END
sResultado1 = XMLExtractString(sRespuesta,"obtenerTimbradoResult",1,XMLExact)
Message(sResultado1)

Timbrado con Solución Factible


TimbradoParametros is timbrar
TimbradoParametros.usuario= "testing@solucionfactible.com"
TimbradoParametros.password = "timbrado.SF.16672"
TimbradoParametros.cfdi = fLoadBuffer(EDT_File)
TimbradoParametros.zip = False

TimbradoResultado is timbrarResponse = Timbrado.timbrar(TimbradoParametros)
sErrorCode is UNICODE string = TimbradoResultado.'return'.status
Info(sErrorCode, TimbradoResultado.'return'.mensaje)
IF sErrorCode = 200 THEN // timbrado exitoso
 Info(TimbradoResultado.'return'.resultados.status, TimbradoResultado.'return'.resultados.mensaje)
 Info(TimbradoResultado.'return'.resultados.uuid)
 Info(TimbradoResultado.'return'.resultados.cfdiTimbrado)
END

Sellar xml con FirmaSat


sMiArchivo1 is string = EDT_XMLFile
sMiArchivo2 is string = EDT_XMLFile + "1"

////
//hInst = LoadDLL("diFirmaSAT2.DLL")
//IF hInst = 0 THEN
// Error("Error al cargar dll")
//ELSE
// nResultado = CallDLL32("diFirmaSAT2", "SAT_GetCertNumber", sPbuf, nLongitud,EDT_CertFile,
// nOpcion)
// EDT_noCertificado = sPbuf
// nResultado = CallDLL32("diFirmaSAT2", "SAT_GetCertAsString", sP2buf, nL2ongitud,EDT_CertFile,
// nOpcion)
// EDT_Certificado = sP2buf
// FreeDLL(hInst)
//END
///*******************************************************************************************
nOpcion is int = 0
nResultado is int
sP2buf is string  = Charact(0)
sPbuf is string = Charact(0)
hInst is int
nLongitud is int = 4096
nL2ongitud is int = 20

hInst = LoadDLL("diFirmaSAT2.DLL")
IF hInst = 0 THEN
 Error("Error al cargar dll para colocar sello en el XML")
ELSE
 //extraigo el numero de certificado

 //nResultado = CallDLL32("diFirmaSAT2","SAT_GetCertAsString",sPbuf,nLongitud,EDT_Certificado,nOpcion)
 //nResultado = CallDLL32("diFirmaSAT2","SAT_GetCertNumber",sPbuf,nL2ongitud,EDT_Certificado,nOpcion)
 nResultado = CallDLL32("diFirmaSAT2","SAT_QueryCert",sPbuf,nL2ongitud,EDT_Certificado,"serialNumber", nOpcion)

 EDT_respuesta = sPbuf

 //Info(Left(sPbuf,20))
 nResultado = CallDLL32("diFirmaSAT2", "SAT_ValidateXml", sMiArchivo1, nOpcion)
 IF nResultado <> 0 THEN
  Info("ERROR", "SAT_ValidateXML regresa el valor: " + nResultado + " fallidamente")
 ELSE
  nResultado = CallDLL32("diFirmaSAT2", "SAT_SignXml", sMiArchivo2, sMiArchivo1, EDT_Llave,EDT_password,EDT_Certificado,nOpcion)
  IF nResultado <> 0 THEN
   Info("ERROR AL SELLAR EL XML","RESULTADO :" + nResultado)
  ELSE
   nResultado = CallDLL32("diFirmaSAT2", "SAT_VerifySignature", sMiArchivo2, sP2buf,nOpcion)
   IF nResultado <> 0 THEN
    Info("Verificación Fallida de Firma" + sMiArchivo2, "returns: " + nResultado)
   END
  END
 END
 FreeDLL(hInst)
END


Consultar saldo de timbres disponibles con el pac Solución Factible

//

DameTimbres is getTimbres
DameTimbres.usuario   = "miUsuario"
DameTimbres.password  = "miContraseña"
DameTimbres.rfcEmisor = "RFC670322HM1"

DameTimbresResultado is getTimbresResponse
DameTimbresResultado  = getTimbres(DameTimbres)
nCantidadTimbres is int = DameTimbresResultado.'return'.usados
nDisponibles is int   = DameTimbresResultado.'return'.disponibles

STC_Usados..Caption   = "Timbres Usados . . . .: " + nCantidadTimbres
STC_Disponibles..Caption = "Timbres Disponibles: " + nDisponibles
STC_Fecha..Caption    = "Fecha de Consulta . .: " + DateToString(Today(),maskSystemDate)
STC_Hora..Caption = "Hora de Consulta: " + TimeToString(TimeSys(),maskSystemTime)

Consultar cfdis timbrados en Solución Factible

//Este código lo uso para consultar los cfdis timbrados con el pac Solución Factible

BuscarTimbres is buscar
BuscarTimbres.usuario= "miUsuario"
BuscarTimbres.password = "miPassword"

//
sMiFecha1 is string = DateToString(EDT_Fecha_Timbrado,"YYYYMMDD")
dFinal is Date = EDT_Fecha_Timbrado
dFinal..Day +=1

sMiFecha2 is string = DateToString(dFinal,"YYYYMMDD")

//
BuscarTimbres.parametros.emisorRFC = "RFC670322HM1"
BuscarTimbres.parametros.fechaTimbradoInicio = sMiFecha1
BuscarTimbres.parametros.fechaTimbradoFin = sMiFecha2
//BuscarTimbres.parametros.limit = 150
//

nContador is int
dtFechaEmision is DateTime
dtFechaTimbrado is DateTime

//
DameTimbresResultado is buscarResponse
DameTimbresResultado = buscar(BuscarTimbres)
IF DameTimbresResultado.'return'.status = "200" THEN
 nCantidad is int = DameTimbresResultado.'return'.cfdis..Occurrence
 Info(nCantidad)
 FOR nContador = 1 TO nCantidad
  dtFechaEmision = DameTimbresResultado.'return'.cfdis[nContador].fechaEmision
  dtFechaTimbrado = DameTimbresResultado.'return'.cfdis[nContador].fechaTimbrado
  dtFechaEmision..Hour -= 5
  dtFechaTimbrado..Hour -=5
 
  //
  TableAdd(TABLE_Facturas, ...
  DameTimbresResultado.'return'.cfdis[nContador].emisorRFC + TAB + ...
  dtFechaEmision  + TAB + ...
  dtFechaTimbrado + TAB + ...
  DameTimbresResultado.'return'.cfdis[nContador].folio + TAB + ...
  DameTimbresResultado.'return'.cfdis[nContador].serie + TAB + ...
  DameTimbresResultado.'return'.cfdis[nContador].uuid + TAB + ...
  DameTimbresResultado.'return'.cfdis[nContador].receptorNombre + TAB + ...
  DameTimbresResultado.'return'.cfdis[nContador].receptorRFC + TAB + ...
  DameTimbresResultado.'return'.cfdis[nContador].total + TAB + ...
  DameTimbresResultado.'return'.cfdis[nContador].cancelado + TAB + ...
  DameTimbresResultado.'return'.cfdis[nContador].fechaCancelacion)
  //DameTimbresResultado.'return'.cfdis[nContador].emisorNombre + TAB + ...
  //DameTimbresResultado.'return'.cfdis[nContador].selloDigital + TAB + ...
  //DameTimbresResultado.'return'.cfdis[nContador].selloSAT + TAB + ...
 END

END 


Try catch end

 // -------------------------------------------------- // Procedure principal que executa uma query com tratamento de exceção // -----------...