Factura Electrónica Colombia - Agradecimiento

User avatar
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Re: Factura Electrónica Colombia - Agradecimiento

Post by leandro »

Buenas noches para todos:

Adjunto la clase que envía de las facturas electrónicas al proveedor tecnológico. Espero les sea de utilidad.

Code: Select all

*************************************
* CLASE PARA EL ENVIO DE LAS FACTURAS 
*************************************
#include "FiveWin.ch"
#include "xbrowse.ch"
#include "report.ch"

CLASS eFactura
    
    /*DATAS CREDENCIALES AUTENTICACION*/
    data user 
    data pass 

    */DATAS DEL DOCUMENTO */
    data documento 
    data encabezado 
    data sucursal 
    data tercero 
    DATA impuestos AS array
    DATA detalle AS array
    data final 
    data respuesta
    data nroItems
    data cdnaJson
    data urlenvio
    data tipoenvio
    
    /*DATAS DE LOS ITEMS O ARTICULOS*/
    data infoItem
    /*DATAS DE LOS IMPUESTOS*/
    data infoImpu

    /*METODOS DEL DOCUMENTO*/
    METHOD New() CONSTRUCTOR
    METHOD DatoEncabezado   ()
    METHOD DatoSucursal()
    METHOD DatoTercero()
    METHOD CreaJson()
    METHOD Enviar()
    METHOD EnviarFactura()
    METHOD EnviarEstado()
    METHOD EnviarPdf()
    METHOD EnviarResumen()
    
    /*METODOS MANEJO DE LOS ITEMS O ARTICULOS*/
    METHOD NuevoItem()
    METHOD DatoItem()
    METHOD AgregaItem() 
    
    /*METODOS MANEJO DE LOS IMPUESTOS*/
    METHOD NuevoImpuesto()
    METHOD DatoImpuesto()
    METHOD AgregaImpuesto()     
    
    /*VISUALIZAR EL JSON*/
    METHOD Resultado()
    
    ERROR HANDLER OnError( uParam1 )

ENDCLASS

********************************************************************************
METHOD New() CLASS eFactura
    ::encabezado := {=>}
    ::sucursal := {=>}
    ::tercero := {=>}
    ::impuestos := {}
    ::detalle := {}
    ::documento := {=>}
    ::final := {=>}
return self

********************************************************************************
METHOD DatoEncabezado(indice,valor) CLASS eFactura
    ::encabezado[indice] = valor
return nil

********************************************************************************
METHOD DatoTercero(indice,valor) CLASS eFactura
    ::tercero[indice] = valor
return nil

********************************************************************************
METHOD DatoSucursal(indice,valor) CLASS eFactura
    ::sucursal[indice] = valor
return nil

********************************************************************************
METHOD NuevoItem() CLASS eFactura
    ::infoItem := {=>}
return nil
********************************************************************************
METHOD DatoItem(indice,valor) CLASS eFactura
    ::infoItem[indice] = valor
return nil
********************************************************************************
METHOD AgregaItem() CLASS eFactura
    AADD(::detalle , ::infoItem)
return nil

********************************************************************************
METHOD NuevoImpuesto() CLASS eFactura
    ::infoImpu := {=>}
return nil
********************************************************************************
METHOD DatoImpuesto(indice,valor) CLASS eFactura
    ::infoImpu[indice] = valor
return nil
********************************************************************************
METHOD AgregaImpuesto() CLASS eFactura
    AADD(::impuestos ,::infoImpu)
return nil

********************************************************************************
METHOD CreaJson() CLASS eFactura
    //agregamos la informacion al json documento
    ::documento["detalle"] = ::detalle
    ::documento["encabezado"] = ::encabezado
    ::documento["sucursal"] = ::sucursal
    ::documento["tercero"] = ::tercero
    ::documento["impuesto"] = ::impuestos

    //creamos la cadena json con el documento final
    ::final["documento"] = ::documento
    ::cdnaJson := hb_jsonEncode( ::final )
return nil

********************************************************************************
METHOD EnviarFactura() CLASS eFactura
    LOCAL aRet
    ::tipoenvio := 0
    ::urlenvio := "https://Factura/factura"
    aRet := ::enviar()
return aRet

********************************************************************************
METHOD EnviarPdf() CLASS eFactura
    LOCAL aRet
    ::tipoenvio := 1
    ::urlenvio := "https://Factura/pdf"
    aRet := ::enviar()
return aRet

********************************************************************************
METHOD EnviarEstado() CLASS eFactura
    LOCAL aRet
    ::tipoenvio := 2
    ::urlenvio := "https://Factura/estado"
    aRet := ::enviar()
return aRet

********************************************************************************
METHOD EnviarResumen() CLASS eFactura
    LOCAL aRet
    ::tipoenvio := 3
    ::urlenvio := "https://Factura/estado"
    aRet := ::enviar()
return aRet

********************************************************************************
METHOD Enviar() CLASS eFactura

    local cBas64    
    local exito,response
    local ohttp,doc
    //creamos el json antes de ser enviado
    ::CreaJson()
    
    IF Empty(::user) .or. Empty(::pass)
         ::OnError( "user-pass" , "Variable de usuario o contraseña no definida"  )
    ELSE
        IF !IsInternet()
            exito := {.f.,"No Hay Conexión a Internet - Intente Nuevamente"}
            //msginfo("No Hay Conexión a Internet","Intente Nuevamente")
        ELSE
            cBas64 := hb_base64encode(::user+":"+::pass,len(::user+":"+::pass)) 
            doc := CreateObject( "MSXML2.DOMDocument" )
            ohttp := CreateObject( "MSXML2.XMLHTTP" )
            ohttp:Open( "POST" , ::urlenvio ,.F.)
            oHttp:SetRequestHeader("cache-control", "no-cache")
            ohttp:SetRequestHeader("content-type", "application/json" )
            ohttp:SetRequestHeader("authorization", "Basic "+cBas64 )
            TRY
                ohttp:Send( ::cdnaJson )
            CATCH
                exito := {.f.,"No Se Pudo Enviar Documento JSON - Error URL"}
                return exito
            END
            response := ohttp:responseText
            ::respuesta  := hash()
            hb_jsondecode(response ,@::respuesta ) //Parse JSON to hash*/
            IF valtype(::respuesta)=="U"
                exito := {.f.,"Problemas Con Archivo JSON"}
            ELSE
                IF ::tipoenvio=0 //envio factura
                    IF Empty(::respuesta["error"])
                        exito := {.t.,::respuesta["qrdata"],::respuesta["cufe"]}
                    ELSE 
                        exito := {.f.,::respuesta["error"]}
                    ENDIF           
                ELSEIF ::tipoenvio=1 //envio pdf
                    if "error" IN ::respuesta
                        exito := {.f.,::respuesta["error"]}
                    else 
                        exito := {.t.,::respuesta["result"]}
                    endif
                ELSEIF ::tipoenvio=2 //consulta qr
                    IF Empty(::respuesta["error"])
                        exito := {.t.,hb_base64decode(::respuesta["qrdata"]),::respuesta["cufe"]}
                    ELSE 
                        exito := {.f.,::respuesta["error"]}
                    ENDIF                   
                ELSEIF ::tipoenvio=3 //Consultar la factura completa
                    exito := {.t.,::respuesta}
                ENDIF
            ENDIF           
        ENDIF
    ENDIF
    //xbrowse(exito)
return exito

********************************************************************************
METHOD Resultado() CLASS eFactura //PARA CONSULTAR COMO ESTA EL JSON
    ::CreaJson()
    xBrowse(::final)
return nil

********************************************************************************
METHOD OnError( uParam , vDescripcion  ) CLASS eFactura
    local cMsg := __GetMessage()
    local uRet, oError
    oError := ErrorNew()
    oError:Args := { Self, cMsg, uParam }
    oError:Description := vDescripcion
    oError:CanDefault := .F.
    oError:CanRetry := .F.
    uRet := Eval( ErrorBlock(), oError )
return( uRet )

********************************************************************************
*/FUNCION QUE VERIFICA LA CONEXION CON INTERNET*/
Function IsInternet()
WSAStartup()
RETURN (IIF(GetHostByName("google.com")<>"0.0.0.0",.T.,.F.))
 
Pequeño ejemplo de uso

Code: Select all

*************************************
**CONSULTA ESTADO FACTURA ELECTRONICA
*************************************
function consulta_estado()

    local oFct
    
    oFct:= eFactura():New()
    
    //ENCABEZADO DE LA FACTURA
    oFct:DatoEncabezado("emisor" , "987654321" )
    oFct:DatoEncabezado("idsuc" ,  1 )
    oFct:DatoEncabezado("numero" ,  56 )
    oFct:DatoEncabezado("prefijo" ,  "FTE" )

    //INGRESAMOS EL USUARIO Y LA CLAVE PARA ENVIO
    oFct:user := "tusuario"
    oFct:pass := "tucontraseña"
    
    //ENVIAMOS LA FACTURA PARA SER CONSULTADA
    oFct:EnviarEstado()

return nil
 
Saludos
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
Post Reply