viernes, 14 de febrero de 2020

De excel a texto

nRenglones   is int
nContador   is int = 0
nConsecutivo is int = 0  //número de registro consecutivo
nAnterior   is int

sRenglon01 is string
sRenglon02 is string
sRenglon03 is string
sRenglon04 is string
sArchivo is string
MyExcelDoc   is xlsDocument
MyExcelFile  is string  = EDT_ExcelFile
nRenglonInicial is int   = EDT_RenglonInicial
nRenglonFinal is int   = EDT_RenglonFinal
IF MyExcelFile = "" THEN RETURN
MyExcelDoc = xlsOpen(MyExcelFile,xlsWrite)
IF MyExcelDoc <> -1 THEN
 //nRenglones   = xlsNbRow(MyExcelDoc)
 FOR nContador = nRenglonInicial TO nRenglonFinal
  // Retrieve the value of a cell
  IF nContador = nRenglonInicial  THEN // primer renglon = registro de encabezado
   nConsecutivo += 1
   sRenglon01 = LP_GeneraCabecera(MyExcelDoc, nContador, nConsecutivo) //nContador es el renglon, nconsecutivo es el consecutivo de  registro
   nConsecutivo += 1
   sRenglon02 = LP_GeneraDetalle(MyExcelDoc, nContador, nConsecutivo)
   nAnterior = nConsecutivo  
   nConsecutivo += 1
   sRenglon03 = LP_GeneraDomicilio(MyExcelDoc, nContador, nConsecutivo, nAnterior)   
   sArchivo += sRenglon01 + CR
   sArchivo += sRenglon02 + CR
   sArchivo += sRenglon03 + CR
  ELSE
    nConsecutivo += 1
   sRenglon02 = LP_GeneraDetalle(MyExcelDoc, nContador, nConsecutivo)
   nAnterior = nConsecutivo
   nConsecutivo += 1
   sRenglon03 = LP_GeneraDomicilio(MyExcelDoc,nContador, nConsecutivo, nAnterior)
   sArchivo += sRenglon02 + CR
   sArchivo += sRenglon03 + CR  
  END
 END
 //finalmente agrego ell sumario
 nConsecutivo += 1
 nContador = nRenglonInicial
 sRenglon04 = LP_GeneraSumario(MyExcelDoc,nContador, nConsecutivo) 
 sArchivo += sRenglon04 + CR // el sumario hasta el final

 // Create a directory
 bResCreate is boolean = fMakeDir("C:\Temp")
 IF bResCreate = True
 //Salvo el archivo
 fSaveText ("c:\temp\AAA2019.txt", sArchivo)
 xlsClose(MyExcelDoc)
 Info("Archivo creado","c:\temp\AAA201900.txt")
 END

END

martes, 11 de febrero de 2020

Cadena de conexión

IF InTestMode()=False THEN
 Server = "192.168.0.100"
ELSE
 Server = "192.168.0.101"
END
HDescribeConnection("HFSQL","admin","",Server,"NOM_BASE_DATOS",hAccessHFClientServer)
HOpenConnection("HFSQL")
HChangeConnection("*","HFSQL")

 

 

otro apunte

en mi caso, utilizo HFSQL

conBD is Connection
IF InTestMode() THEN
conBD..Provider = hAccessHFClientServer
conBD..User = "admin"
conBD..Password = "seiya"
conBD..Server = "localhost"
conBD..Database = "RefaccionariaWeb"
conBD..CryptMethod = hCryptNo
ELSE
conBD..Provider = hAccessHFClientServer
conBD..User = "admin"
conBD..Password = "leviatan"
conBD..Server = "18.189.13.14"
conBD..Database = "RefaccionariaWeb"
conBD..CryptMethod = hCryptNo
END
HChangeConnection("*", conBD)
HOpenConnection(conBD)
 

lunes, 27 de enero de 2020

Número a letra


PROCEDURE GF_ConvertAmountToWords(cAmount=0)
//Declaro variables locales
sCurrency       is string
sTempString     is string = ""
sReturnString     is string = ""

IF (IntegerPart(cAmount)) = 1 THEN
    sCurrency = "Peso"
ELSE
    sCurrency = "Pesos"   
END

//Construyo texto - parte entera primero
sTempString = GF_ConvierteEnteroaTexto(IntegerPart(cAmount))
IF  sTempString <> "" THEN
    sTempString =  sTempString +" " + sCurrency + " "
ELSE
    sTempString=""
END
sReturnString = sTempString

//Construyo texto - parte decimal
sTempString = NumToString((DecimalPart(cAmount)*100),"02d")
sTempString += "/100 M.N."
sReturnString += sTempString

//Regreso resultado
RESULT sReturnString



************************************************************************
PROCEDURE GF_ConvierteEnteroaTexto(iInteger)
//The best data type to feed in is a WD Integer
//Declare local variables
sTempString     is string = ""
sNewString     is string = ""
sReturnString     is string = ""
bAgregaY     is boolean

//Cast incoming integer to currency type for higher accuracy on decimals
cIntegerAsCurrency is currency = iInteger

//Reviso para valor 0
IF cIntegerAsCurrency     = 0 THEN
    sReturnString     = "Cero "
    RESULT sReturnString
END

//maximo tamaño
IF cIntegerAsCurrency     > Power(10,15) THEN
    sReturnString         = "***ERROR - Numero muy grande para convertir a letras***"
    RESULT sReturnString
END

//Billón
IF cIntegerAsCurrency >= Power(10,12) THEN
    sNewString = GF_ConvierteEnteroaTexto(IntegerPart(cIntegerAsCurrency / Power(10,12)))
    IF IntegerPart(cIntegerAsCurrency / Power(10,12)) = 1 THEN
        sTempString += sNewString + "Billón "
    ELSE
        sTempString += sNewString + "Billones "   
    END
    cIntegerAsCurrency = cIntegerAsCurrency - (IntegerPart(cIntegerAsCurrency / Power(10,12)) * Power(10,12))
END

//miles de millones
IF cIntegerAsCurrency >= Power(10,9) THEN
    sNewString = GF_ConvierteEnteroaTexto(IntegerPart(cIntegerAsCurrency / Power(10,9)))
    cIntegerAsCurrency = cIntegerAsCurrency -(IntegerPart(cIntegerAsCurrency / Power(10,9)) * Power(10,9))
    sTempString += sNewString + "Mil "
END

//millones
IF cIntegerAsCurrency >= Power(10,6) THEN
    sNewString = GF_ConvierteEnteroaTexto(IntegerPart(cIntegerAsCurrency / Power(10,6)))
    IF IntegerPart(cIntegerAsCurrency / Power(10,6)) = 1 THEN
        sTempString += sNewString + "Millón "
    ELSE
        sTempString += sNewString + "Millones "   
    END
    cIntegerAsCurrency = cIntegerAsCurrency -(IntegerPart(cIntegerAsCurrency / Power(10,6)) * Power(10,6))   
END

//miles
IF cIntegerAsCurrency >= Power(10,3) THEN
    sNewString = GF_ConvierteEnteroaTexto(IntegerPart(cIntegerAsCurrency / Power(10,3)))
    cIntegerAsCurrency = cIntegerAsCurrency - (IntegerPart(cIntegerAsCurrency / Power(10,3)) * Power(10,3))
    sTempString += sNewString + "Mil "
   
END

//cientos
IF cIntegerAsCurrency         >= Power(10,2) THEN
    sNewString                 = GF_ConvierteEnteroaTexto(IntegerPart(cIntegerAsCurrency / Power(10,2)))
   
    
    SWITCH (IntegerPart(cIntegerAsCurrency / Power(10,2)))
        CASE 1: sTempString += "Ciento "
        CASE 2: sTempString += "Doscientos "
        CASE 3: sTempString += "Trecientos "
        CASE 4: sTempString += "Cuatrocientos "
        CASE 5: sTempString += "Quinientos "
        CASE 6: sTempString += "Seiscientos "
        CASE 7: sTempString += "setecientos "
        CASE 8: sTempString += "Ochocientos "
        CASE 9: sTempString += "Novecientos "
                                           
    END       
    cIntegerAsCurrency         = cIntegerAsCurrency -(IntegerPart(cIntegerAsCurrency / Power(10,2)) * Power(10,2))
END

//para 30 a 100
IF cIntegerAsCurrency >= 30 THEN
    SWITCH (IntegerPart(cIntegerAsCurrency / 10))
        CASE 3: sTempString += "Treinta "
        CASE 4: sTempString += "Cuarenta "
        CASE 5: sTempString += "Cincuenta "
        CASE 6: sTempString += "Sesenta "
        CASE 7: sTempString += "Setenta "
        CASE 8: sTempString += "Ochenta "
        CASE 9: sTempString += "Noventa "
    END
    cIntegerAsCurrency = cIntegerAsCurrency - (IntegerPart(cIntegerAsCurrency / 10) * 10)
    bAgregaY = True
ELSE
    bAgregaY = False   
END

//para  1 a 29
IF cIntegerAsCurrency > 0 AND cIntegerAsCurrency <= 29  THEN
    IF bAgregaY = True THEN
        sTempString += "y "
    END
    SWITCH cIntegerAsCurrency
        CASE 1: sTempString  += " Un "
        CASE 2: sTempString  += " Dos "
        CASE 3: sTempString  += "Tres "
        CASE 4: sTempString  += "Cuatro "
        CASE 5: sTempString  += "Cinco "
        CASE 6: sTempString  += "Seis "
        CASE 7: sTempString  += "Siete "
        CASE 8: sTempString  += "Ocho "
        CASE 9: sTempString  += "Nueve "
        CASE 10: sTempString += "Diez "
        CASE 11: sTempString += "Once "
        CASE 12: sTempString += "Doce "
        CASE 13: sTempString += "Trece "
        CASE 14: sTempString += "Catorce "
        CASE 15: sTempString += "Quince "
        CASE 16: sTempString += "Dieciseis "
        CASE 17: sTempString += "Diecisiete "
        CASE 18: sTempString += "Dieciocho "
        CASE 19: sTempString += "Diecinueve "
        CASE 20: sTempString += "Veinte "
        CASE 21: sTempString += "Veintiun "
        CASE 22: sTempString += "Veintidos "
        CASE 23: sTempString += "Veintitres "
        CASE 24: sTempString += "Veinticuatro "
        CASE 25: sTempString += "Veinticinco "
        CASE 26: sTempString += "Veintiseis "
        CASE 27: sTempString += "Veintisiete "
        CASE 28: sTempString += "Veintiocho "
        CASE 29: sTempString += "Veintinueve "
           
    END
    cIntegerAsCurrency = cIntegerAsCurrency - (IntegerPart(cIntegerAsCurrency / 10) * 10)
END

//Paso string con número en letras
sReturnString = sTempString

RESULT sReturnString

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)

Valida RFC

 // Summary: <specify the procedure action> // Syntax: //[ <Result> = ] GP_ValidaRFC (<nTipoPersona>, <sParamRFC>) /...