'
'EJEMPLO - Interfaz Libre PyAfipWs WSFEv1
'
'
' Interfaz PyAfipWs Web Service Factura Electrónica Mercado Interno
' Según RG2904 Artículo 4 Opción B (sin detalle, RG2485 Version 1)
' 2011 (C) Mariano Reingart
' Licencia: GPLv3
' Funcionamiento:
' Solicita Ticket de Acceso (WSAA.LoginCMS)
' Muestra estado de servidores (WSFEv1.Dummy)
' Obtiene último número de factura autorizado (WSFEv1.CompUltimoAutorizado)
' Crea una Factura, agrega IVA, Tributo y Comprobantes Asociados (WSFEv1.CrearFactura et.al.)
' Solicita CAE (WSFEv1.CAESolicitar)
'
'0.0.1.
'.NET Framework 1.1
'
' This program is free software; you can redistribute it and/or modify
' it under the terms of the GNU General Public License as published by the
' Free Software Foundation; either version 3, or (at your option) any later
' version.
'
' This program is distributed in the hope that it will be useful, but
' WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY
' or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
' for more details.
'
Imports Microsoft.VisualBasic
Imports System
Public Class MainClass
Shared Sub Main(ByVal args As String())
Dim WSAA As Object
Dim Path As String
Dim tra as string, cms as string, ta as string
Dim wsdl as string, proxy as string, cache as string
Dim certificado as string, claveprivada as string
Dim ok
Console.WriteLine("DEMO Interfaz PyAfipWs WSFEv1 para vb.net")
' Crear objeto interface Web Service Autenticación y Autorización
WSAA = CreateObject("WSAA")
Console.WriteLine(WSAA.Version)
Try
Console.WriteLine("Generar un Ticket de Requerimiento de Acceso (TRA) para WSFEv1")
tra = WSAA.CreateTRA("wsfe")
Console.WriteLine(tra)
' Especificar la ubicacion de los archivos certificado y clave privada
Path = Environment.CurrentDirectory() + "\"
' Certificado: certificado es el firmado por la AFIP
' ClavePrivada: la clave privada usada para crear el certificado
Certificado = "..\..\reingart.crt" ' certificado de prueba
ClavePrivada = "..\..\reingart.key" ' clave privada de prueba
Console.WriteLine("Generar el mensaje firmado (CMS)")
cms = WSAA.SignTRA(tra, Path + Certificado, Path + ClavePrivada)
Console.WriteLine(cms)
Console.WriteLine("Llamar al web service para autenticar:")
proxy = "" '"usuario:clave@localhost:8000"
wsdl = "https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl"
WSAA.Conectar(cache, wsdl, proxy) ' Homologación
ta = WSAA.LoginCMS(cms)
' Imprimir el ticket de acceso, ToKen y Sign de autorización
MsgBox(WSAA.Token, vbInformation, "WSAA Token")
MsgBox(WSAA.Sign, vbInformation, "WSAA Sign")
' Una vez obtenido, se puede usar el mismo token y sign por 12 horas
' (este período se puede cambiar)
Catch
' Muestro los errores
If WSAA.Excepcion <> "" Then
MsgBox(WSAA.Traceback, vbExclamation, WSAA.Excepcion)
End If
End Try
Dim WSFEv1 As Object
Dim concepto, tipo_doc, nro_doc, tipo_cbte, punto_vta, _
cbt_desde, cbt_hasta, imp_total, imp_tot_conc, imp_neto, _
imp_iva, imp_trib, imp_op_ex, fecha_cbte, fecha_venc_pago, _
fecha_serv_desde, fecha_serv_hasta, _
moneda_id, moneda_ctz
Dim tipo, pto_vta, nro, fecha, cbte_nro
Dim id, Desc, base_imp, alic, importe
Dim cae
Console.WriteLine("Crear objeto interface Web Service de Factura Electrónica de Mercado Interno")
WSFEv1 = CreateObject("WSFEv1")
Try
Console.WriteLine(WSFEv1.Version)
Console.WriteLine(WSFEv1.InstallDir)
' Setear tocken y sing de autorización (pasos previos)
WSFEv1.Token = WSAA.Token
WSFEv1.Sign = WSAA.Sign
' CUIT del emisor (debe estar registrado en la AFIP)
WSFEv1.Cuit = "20267565393"
' Conectar al Servicio Web de Facturación
proxy = "" ' "usuario:clave@localhost:8000"
wsdl = "https://wswhomo.afip.gov.ar/wsfev1/service.asmx?WSDL"
cache = "" 'Path
ok = WSFEv1.Conectar(cache, wsdl, proxy) ' homologación
REM ' mostrar bitácora de depuración:
Console.WriteLine(WSFEv1.DebugLog)
REM ' Llamo a un servicio nulo, para obtener el estado del servidor (opcional)
WSFEv1.Dummy()
Console.WriteLine("appserver status" & WSFEv1.AppServerStatus)
Console.WriteLine("dbserver status" & WSFEv1.DbServerStatus)
Console.WriteLine("authserver status" & WSFEv1.AuthServerStatus)
REM ' Establezco los valores de la factura a autorizar:
tipo_cbte = 1
punto_vta = 4002
cbte_nro = WSFEv1.CompUltimoAutorizado(tipo_cbte, punto_vta)
If cbte_nro = "" Then
cbte_nro = 0 ' no hay comprobantes emitidos
Else
cbte_nro = CLng(cbte_nro) ' convertir a entero largo
End If
fecha = Format(Now, "yyyyMMdd")
concepto = 1
tipo_doc = 80: nro_doc = "33693450239"
cbte_nro = cbte_nro + 1
cbt_desde = cbte_nro: cbt_hasta = cbte_nro
imp_total = "122.00": imp_tot_conc = "0.00": imp_neto = "100.00"
imp_iva = "21.00": imp_trib = "1.00": imp_op_ex = "0.00"
fecha_cbte = fecha: fecha_venc_pago = ""
' Fechas del período del servicio facturado (solo si concepto = 1?)
fecha_serv_desde = "": fecha_serv_hasta = ""
moneda_id = "PES": moneda_ctz = "1.000"
ok = WSFEv1.CrearFactura(concepto, tipo_doc, nro_doc, tipo_cbte, punto_vta, _
cbt_desde, cbt_hasta, imp_total, imp_tot_conc, imp_neto, _
imp_iva, imp_trib, imp_op_ex, fecha_cbte, fecha_venc_pago, _
fecha_serv_desde, fecha_serv_hasta, _
moneda_id, moneda_ctz)
' Agrego los comprobantes asociados:
If False Then ' solo nc/nd
REM tipo = 19
REM pto_vta = 2
REM nro = 1234
REM ok = WSFEv1.AgregarCmpAsoc(tipo, pto_vta, nro)
End If
' Agrego impuestos varios
id = 99
Desc = "Impuesto Municipal Matanza'"
base_imp = "100.00"
alic = "1.00"
importe = "1.00"
ok = WSFEv1.AgregarTributo(id, Desc, base_imp, alic, importe)
' Agrego tasas de IVA
id = 5 ' 21%
base_imp = "100.00"
importe = "21.00"
ok = WSFEv1.AgregarIva(id, base_imp, importe)
' Habilito reprocesamiento automático (predeterminado):
WSFEv1.Reprocesar = True
' Solicito CAE:
CAE = WSFEv1.CAESolicitar()
' Imprimo pedido y respuesta XML para depuración (errores de formato)
Console.WriteLine(WSFEv1.XmlRequest)
Console.WriteLine(WSFEv1.XmlResponse)
Console.WriteLine("Resultado" & WSFEv1.Resultado)
Console.WriteLine("CAE", WSFEv1.CAE)
Console.WriteLine("Numero de comprobante:" & WSFEv1.CbteNro)
Console.WriteLine("Reprocesar:" & WSFEv1.Reprocesar)
Console.WriteLine("Reproceso:" & WSFEv1.Reproceso)
Console.WriteLine("EmisionTipo:" & WSFEv1.EmisionTipo)
MsgBox("Resultado:" & WSFEv1.Resultado & " CAE: " & CAE & " Venc: " & WSFEv1.Vencimiento & " Reproceso: " & WSFEv1.Reproceso, vbInformation + vbOKOnly)
If WSFEv1.ErrMsg <> "" Then
MsgBox(WSFEv1.ErrMsg, vbExclamation, "Errores")
End If
If WSFEv1.Obs <> "" Then
MsgBox(WSFEv1.Obs, vbExclamation, "Observaciones")
End If
Catch
' Muestro los errores
If WSFEv1.Traceback <> "" Then
MsgBox(WSFEv1.Traceback, vbExclamation, "Error")
End If
End Try
End Sub
End Class