Adjunto la clase que envía de las facturas electrónicas al proveedor tecnológico. Espero les sea de utilidad.
- Code: Select all Expand view RUN
*************************************
* 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 view RUN
*************************************
**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