Re: Factura Electrónica Colombia - Agradecimiento
Posted: Sat Aug 24, 2019 2:40 am
Buenas noches para todos:
Adjunto la clase que envía de las facturas electrónicas al proveedor tecnológico. Espero les sea de utilidad.
Pequeño ejemplo de uso
Adjunto la clase que envía de las facturas electrónicas al proveedor tecnológico. Espero les sea de utilidad.
Code: Select all | Expand
*************************************
* 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 | Expand
*************************************
**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