snoopy_afip 4.2.0 → 4.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +30 -0
- data/README.md +238 -0
- data/VERSION +1 -1
- data/lib/snoopy_afip/authorize_adapter.rb +4 -4
- data/lib/snoopy_afip/version.rb +1 -1
- data/snoopy_afip.gemspec +4 -9
- data/xds_login.xml +34 -0
- metadata +9 -68
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bef88901a341500a16871413084fb004fe90af6129c63f0dc9ce028d9b165bc1
|
4
|
+
data.tar.gz: e4d231a81e42c58bfad02e4e7bb0863c6ea7b10de2fac1cdb2c2cf7acc7f22eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f871c60664e7d9e726ada5d72e22b94a2a42e913ff94ff80e52e4feb53eefa9b1a71180ce27a7816e0f6ee746c32bc708f5e93eb60809e2c0d3f6e8dfb726b1
|
7
|
+
data.tar.gz: d88ea58d9e9a6357b0585e405c77385198294d63a1151032503afd0c5e83dad8c98f3f550c959d573583d5df0441e706d86f64d65945a1fbe5732f20da2cc483
|
data/.gitignore
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# rcov generated
|
2
|
+
coverage
|
3
|
+
|
4
|
+
# rdoc generated
|
5
|
+
rdoc
|
6
|
+
|
7
|
+
# yard generated
|
8
|
+
doc
|
9
|
+
.yardoc
|
10
|
+
|
11
|
+
# bundler
|
12
|
+
.bundle
|
13
|
+
|
14
|
+
# jeweler generated
|
15
|
+
pkg
|
16
|
+
|
17
|
+
# MacOS
|
18
|
+
.DS_Store
|
19
|
+
|
20
|
+
# TextMate
|
21
|
+
*.tmproj
|
22
|
+
tmtags
|
23
|
+
|
24
|
+
# Other
|
25
|
+
.rspec
|
26
|
+
log/
|
27
|
+
log/*.log
|
28
|
+
fixtures/
|
29
|
+
fixtures/*
|
30
|
+
*.gem
|
data/README.md
ADDED
@@ -0,0 +1,238 @@
|
|
1
|
+
# snoopy_afip
|
2
|
+
conexión con Web Service de Factura Electrónica de AFIP (WSFE)
|
3
|
+
|
4
|
+
## Instalación
|
5
|
+
|
6
|
+
Añadir esta linea en el Gemfile:
|
7
|
+
|
8
|
+
```ruby
|
9
|
+
gem 'snoopy_afip'
|
10
|
+
```
|
11
|
+
|
12
|
+
Luego ejecuta:
|
13
|
+
|
14
|
+
$ bundle
|
15
|
+
|
16
|
+
O instala la gema a mano:
|
17
|
+
|
18
|
+
$ gem install snoopy_afip
|
19
|
+
|
20
|
+
### Versiones
|
21
|
+
|
22
|
+
- `2.1.1`. Usada en producción. (**Stable**)
|
23
|
+
- `3.0.0`. Aun en entorono de testing. (**Beta**)
|
24
|
+
|
25
|
+
## Antes que nada
|
26
|
+
|
27
|
+
* Link con el manual para desarrolladores.
|
28
|
+
|
29
|
+
- [Especificación Técnica WSAA]('http://www.afip.gov.ar/ws/WSAA/Especificacion_Tecnica_WSAA_1.2.0.pdf'): Especificación técnica para la comunicación con el **WSAA** (servicio de autenticación), su propósito es solicitar un _tocken_ y _sign_ para poder emitir facturas con el servicio de **WSFE** (Servicio de autorización de facturas)
|
30
|
+
|
31
|
+
- [Manual desarrollador](http://www.afip.gob.ar/fe/documentos/manual_desarrollador_COMPG_v2_9.pdf): Especificación técnica para la comunicación con **WSFE** (Servicio de autorización de facturas).
|
32
|
+
|
33
|
+
* Es recomendable descargar los **Wsdl** para evitar tener que pedirlo en cada request
|
34
|
+
|
35
|
+
- Wsdl **WSAA** (servicio de autenticación)
|
36
|
+
|
37
|
+
- Testing: [https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl]('https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl')
|
38
|
+
- Producción: [https://wsaa.afip.gov.ar/ws/services/LoginCms?wsdl]('https://wsaa.afip.gov.ar/ws/services/LoginCms?wsdl')
|
39
|
+
|
40
|
+
- **WSFE** (Servicio de autorización de facturas)
|
41
|
+
|
42
|
+
- Testing: [https://wswhomo.afip.gov.ar/wsfev1/service.asmx?wsdl]('https://wswhomo.afip.gov.ar/wsfev1/service.asmx?wsdl')
|
43
|
+
- Producción: [https://servicios1.afip.gov.ar/wsfev1/service.asmx?WSDL]('https://servicios1.afip.gov.ar/wsfev1/service.asmx?WSDL')
|
44
|
+
|
45
|
+
* Explicación detallada de los pasos a seguir para obtener el certificado desde el sitio web AFIP para emitir facturas electrónicas.
|
46
|
+
|
47
|
+
[obtención de certificado](https://www.afip.gob.ar/ws/WSAA/WSAA.ObtenerCertificado.pdf)
|
48
|
+
|
49
|
+
## USO
|
50
|
+
|
51
|
+
### Inicialización de parametros generales
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
Snoopy.default_currency = :peso
|
55
|
+
Snoopy.default_concept = 'Servicios'
|
56
|
+
Snoopy.default_document_type = 'CUIT' || 'DNI' # O alguna key de Snoopy::DOCUMENTS
|
57
|
+
# Para el caso de produccion
|
58
|
+
Snoopy.auth_url = 'https://wsaa.afip.gov.ar/ws/services/LoginCms?wsdl' || PATH_WSAA_PROP_WSDL
|
59
|
+
Snoopy.service_url = 'https://servicios1.afip.gov.ar/wsfev1/service.asmx?WSDL' || PATH_WSFE_PROP_WSDL
|
60
|
+
# Para el caso de desarrollo
|
61
|
+
Snoopy.auth_url = 'https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl' || PATH_WSAA_TEST_WSDL
|
62
|
+
Snoopy.service_url = 'https://wswhomo.afip.gov.ar/wsfev1/service.asmx?wsdl' || PATH_WSFE_TEST_WSDL
|
63
|
+
```
|
64
|
+
|
65
|
+
En caso de trabajar con `Ruby on Rails`, es recomendable crear un archivo con esta conf en `config/initializers/snoopy.rb`.
|
66
|
+
|
67
|
+
### Generar Clave privada
|
68
|
+
|
69
|
+
```ruby
|
70
|
+
Snoopy::AuthenticationAdapter.generate_pkey(2048) # Si no se pasa argumento se generar una de 8192
|
71
|
+
```
|
72
|
+
|
73
|
+
Este metodo retorna el `RAW` de la pkey, la cual debera guardarse en algun archivo o alguna base de datos.
|
74
|
+
|
75
|
+
### Generar solicitud de pedido de certificado
|
76
|
+
|
77
|
+
#### With ruby
|
78
|
+
|
79
|
+
Este metodo aun no ha sido testeado, por lo que agredezco si alguien logra probarlo.
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
Snoopy::AuthenticationAdapter.generate_certificate_request_with_ruby(pkey_path, subj_o, subj_cn, subj_cuit)
|
83
|
+
```
|
84
|
+
|
85
|
+
#### With bash
|
86
|
+
|
87
|
+
Mantiene la generación de versiones pasadas de `Snoopy`
|
88
|
+
|
89
|
+
```bash
|
90
|
+
Snoopy::AuthenticationAdapter.generate_certificate_request_with_bash(pkey_path, subj_o, subj_cn, subj_cuit)
|
91
|
+
```
|
92
|
+
|
93
|
+
- `pkey_path`: Ruta absoluta de la llave privada.
|
94
|
+
- `subj_o`: Nombre de la compañia.
|
95
|
+
- `subj_cn`: Hostname del server que generará las solicitudes. En ruby se obtiene con `%x(hostname).chomp`
|
96
|
+
- `subj_cuit`: Cuit registrado en la AFIP de la compañia que emita facturas.
|
97
|
+
|
98
|
+
Una vez generado este archivo debe hacerse el tramite en el sitio web de la **AFIP** para obtener el certificado que permitirá autorizar facturas al webservice.
|
99
|
+
|
100
|
+
### Solicitar autorización para la emisión de facturas
|
101
|
+
|
102
|
+
Para poder emitir o autorizar facturas en el web service de la **AFIP** es necesario solicitar autorización.
|
103
|
+
|
104
|
+
```ruby
|
105
|
+
# pkey_path: Ruta absoluta de la llave privada.
|
106
|
+
# cert_path: Ruta absoluta del cetificado obtendio del sitio oficial de la **AFIP**.
|
107
|
+
authentication_adapter = Snoopy::AuthenticationAdapter.new(pkey_path, pkey_cert)
|
108
|
+
authentication_adapter.authenticate!
|
109
|
+
```
|
110
|
+
|
111
|
+
`authentication_adapter.authenticate!` deberá retornar un `Hash` con las siguientes keys: `:token`, `:sign` y `:expiration_time`
|
112
|
+
|
113
|
+
La key `:expiration_time` determina hasta cuando se podrá autorizar facturas, el tiempo esta prefijado por **AFIP** y es el de 24 Horas desde el momento de la solicitud del **token sign**, superado este tiempo deberá solicitarse nuevamente un **token sign**.
|
114
|
+
|
115
|
+
```ruby
|
116
|
+
# Response example
|
117
|
+
{ token: "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pgo8c3NvIHZlcnNpb249IjIuMCI+CiAgICA8aWQgdW5pcXVlX2lkPSI5MDIxNDczOTEiIHNyYz0iQ049d3NhYWhvbW8sIE89QUZJUCwgQz1BUiwgU0VSSUFMTlVNQkVSPUNVSVQgMzM2OTM0NTAyMzkiIGdlbl90aW1lPSIxNDk4NDk0NDQ1IiBleHBfdGltZT0iMTQ5ODUzNzcwNSIgZHN0PSJDTj13c2ZlLCBPPUFGSVAsIEM9QVIiLz4KICAgIDxvcGVyYXRpb24gdmFsdWU9ImdyYW50ZWQiIHR5cGU9ImxvZ2luIj4KICAgICAgICA8bG9naW4gdWlkPSJDPWFyLCBPPXNlcXVyZSBzYSwgU0VSSUFMTlVNQkVSPUNVSVQgMjAyNDE2MDgxNjcsIENOPXBjIiBzZXJ2aWNlPSJ3c2ZlIiByZWdtZXRob2Q9IjIyIiBlbnRpdHk9IjMzNjkzNDUwMjM5IiBhdXRobWV0aG9kPSJjbXMiPgogICAgICAgICAgICA8cmVsYXRpb25zPgogICAgICAgICAgICAgICAgPHJlbGF0aW9uIHJlbHR5cGU9IjQiIGtleT0iMjAyNDE2MDgxNjciLz4KICAgICAgICAgICAgPC9yZWxhdGlvbnM+CiAgICAgICAgPC9sb2dpbj4KICAgIDwvb3BlcmF0aW9uPgo8L3Nzbz4KCg==",
|
118
|
+
sign: "iSpp/5qxQntuzOQcqs6GlShFaOKtEagLY17TFDwMTiErquT/fEw5ki9Ff4RYGndc/49UGmUTnVjUqB0mxuJk2IG4t+J4AAyVsY6+xiBGvMXAM/5sAI78NDl7ibMxAcdPi+nBIrdydp5DLy2SB4u/G46kguc6+srBp2fo20f/+wM=",
|
119
|
+
expiration_time: #<DateTime: 2017-06-27T01:28:25-03:00 ((2457932j,16105s,963000000n),-10800s,2299161j)>}}
|
120
|
+
```
|
121
|
+
|
122
|
+
En caso de producirse algun tipo de error este será devuelto a traves de raise exception. El error mas comun puede deberse al que certificado obtenido a treves del pedido de cetificado no sea correcto.
|
123
|
+
|
124
|
+
### Autorizar factura
|
125
|
+
|
126
|
+
#### Crear `Bill`
|
127
|
+
```ruby
|
128
|
+
Snoopy::Bill.new(attrs)
|
129
|
+
|
130
|
+
```
|
131
|
+
Donde `attrs` debe estar conformado de la siguiente manera:
|
132
|
+
* `attrs[:cuit]` CUIT del emisor de la factura.
|
133
|
+
* `attrs[:concept]` Concepto de la factura, por defecto `Snoopy.default_concept`.
|
134
|
+
* `attrs[:imp_iva]` Monto total de impuestos.
|
135
|
+
* `attrs[:currency]` Tipo de moneda a utilizar, por default `Snoopy.default_currency`.
|
136
|
+
* `attrs[:alicivas]` Impuestos asociados a la factura.
|
137
|
+
* `attrs[:total_net]` Monto neto por defecto es 0.
|
138
|
+
* `attrs[:sale_point]` Punto de venta del emisor de la factura.
|
139
|
+
* `attrs[:document_type]` Tipo de documento a utilizar, por default `Snoopy.default_document`. Valores posibles `Snoopy::DOCUMENTS`
|
140
|
+
* `attrs[:document_num]` Numero de documento o cuit, el valor depende de `attrs[:document_type]`.
|
141
|
+
* `attrs[:issuer_iva_cond]` Condición de IVA del emisor de la factura. [`Snoopy::RESPONSABLE_INSCRIPTO` o `Snoopy::RESPONSABLE_MONOTRIBUTO`]
|
142
|
+
* `attrs[:receiver_iva_cond]` valores posibles `Snoopy::BILL_TYPE`
|
143
|
+
* `attrs[:service_date_from]` Inicio de vigencia de la factura.
|
144
|
+
* `attrs[:service_date_to]` Fin de vigencia de la factura.
|
145
|
+
* `attrs[:cbte_asoc_num]` Numero de la factura a la cual se quiere crear una nota de crédito (Solo pasar si se esta creando una nota de crédito).
|
146
|
+
* `attrs[:cbte_asoc_to_sale_point]` Punto de venta de la factura a la cual se quiere crear una nota de crédito (Solo pasar si se esta creando una nota de crédito).
|
147
|
+
|
148
|
+
El `attrs[:alicivas]` discrimina la información de los items. Es posible que en la factura se discriminen diferentes items con diferentes impuestos. Para ello el `attrs[:alicivas]` es un arreglo de `Hash`. Donde cada uno de ellos tiene la información sobre un determinado impuesto.
|
149
|
+
|
150
|
+
```ruby
|
151
|
+
{ id: tax_rate.round_with_precision(2), # Porcentaje. Ej: "0.105", "0.21", "0.27"
|
152
|
+
amount: tax_amount.round_with_precision(2), # Monto total del impuesto del item.
|
153
|
+
taxeable_base: net_amount.round_with_precision(2) } # Monto total del item sin considerar el impuesto.
|
154
|
+
```
|
155
|
+
|
156
|
+
Por ejemplo si se tiene 5 items, donde 3 de ellos tienen un impuesto del 10.5% y los 2 restantes del 21%. Los primeros 3 deben, se debera de crear dos hashes de la siguientes forma.
|
157
|
+
|
158
|
+
```ruby
|
159
|
+
attrs[:alicivas] = [ { id: (10.5 / 100 ).to_s
|
160
|
+
amount: X, # De los 3 items de 10.5
|
161
|
+
taxeable_base: Y }, # De los 3 items de 10.5
|
162
|
+
{ id: (21 / 100 ).to_s
|
163
|
+
amount: X, # De los 2 items de 21
|
164
|
+
taxeable_base: Y } ] # De los 2 items de 21
|
165
|
+
```
|
166
|
+
Donde:
|
167
|
+
|
168
|
+
* `X`: Es la parte del monto que le corresponde al impuesto.
|
169
|
+
* `Y`: Es la partes del monto sin impuesto.
|
170
|
+
|
171
|
+
Los `tax_rates` soportados por AFIP son los siguientes:
|
172
|
+
|
173
|
+
```ruby
|
174
|
+
Snoopy::ALIC_IVA
|
175
|
+
```
|
176
|
+
|
177
|
+
* Tips:
|
178
|
+
|
179
|
+
El `taxeable_base` se calcula de la siguiente manera:
|
180
|
+
|
181
|
+
```ruby
|
182
|
+
total_amount / (1 + tax_percentage)
|
183
|
+
```
|
184
|
+
|
185
|
+
- Metodos de interes
|
186
|
+
- **valid?** valida si la `bill` cumple lo minimo indispensable.
|
187
|
+
- **partial_approved?** si fue _Aprobada parcialmente_ por el webserice.
|
188
|
+
- **rejected?** si fue _Rechazada_ por el webservice.
|
189
|
+
- **approved?** si fue _Aprobada_ por el webservice.
|
190
|
+
- **errors** errores presentados durante la validación `valid?`
|
191
|
+
|
192
|
+
#### Autorizar el `Bill`
|
193
|
+
```ruby
|
194
|
+
authorize_adapter = Snoopy::AuthorizeAdapter.new({ bill: bill, # Obtenido en el paso anterior
|
195
|
+
pkey: pkey, # PATH de la clave privada generada anteriormente.
|
196
|
+
cert: certificate, # PATH del certificado descargado del sitio web de la AFIP.
|
197
|
+
cuit: cuit, # CUIT del emisor de la factura, mismo con el que se hizo el tramite.
|
198
|
+
sign: sign, # SIGN obtenido en la autenticación
|
199
|
+
token: token}) # TOKEN obtenido en la autenticación
|
200
|
+
|
201
|
+
authorize_adapter.set_bill_number!
|
202
|
+
|
203
|
+
authorize_adapter.authorize!
|
204
|
+
```
|
205
|
+
|
206
|
+
- Metodos de interes del `Snoopy::AuthorizeAdapter`
|
207
|
+
|
208
|
+
- **request** Información enviada al webservice de **AFIP**
|
209
|
+
- **response** Respuesta completa obtenida del webservice de **AFIP**
|
210
|
+
- **afip_errors** Errores parseados de la **response**. Pueden presentarse los motivos por los que no se autorizo la `bill`
|
211
|
+
- **afip_events** Eventos parseados de la **response** . Generalmente la **AFIP** los usa para informar de posibles cambios.
|
212
|
+
- **afip_observations** Observaciones parseados de la **response**. Pueden presentarse los motivos por los que no se autorizo la `bill`
|
213
|
+
- **errors** Errores presentados en el proceso de autorización. Explicado en el apartado siguiente.
|
214
|
+
|
215
|
+
### Manejo de excepciones
|
216
|
+
|
217
|
+
#### Explota
|
218
|
+
|
219
|
+
Hay errores que producirán que `Snoopy` generé un `raise`, estos son los casos que se produzcan errores previo o durante la comunicación con la **AFIP**. En estos casos se produce un `raise` debido a que no se logro la comunicación con la **AFIP** por lo que se puede asegurar que no se autorizo la `bill`
|
220
|
+
|
221
|
+
#### No Explota
|
222
|
+
Existe otro caso que se produzca un error posterior a la comunicación con el webservice, en este caso se pudo obtener una respuesta , pero se producierón errores en el parseo de la misma (Por ejemplo **AFIP** cambia el formato de la response), para ellos se puede consultar las exceptiones generadas por los parseadores con `authorize_adapter.errors`.
|
223
|
+
|
224
|
+
Hay 4 nivel de parser:
|
225
|
+
- **Obtención del resultado, cae, fecha de vencimiento del cae y el bill number**: Este es el nivel de parser mas **importante** dado que si este no se pudo realizar, es imposible saber que sucedio durante la autorización. Pero no preocuparse por que esta la response completa en `authorize_adapter.response`
|
226
|
+
- **Parseo de errores**: Parsea los errores retornados por la **AFIP**.
|
227
|
+
- **Parseo de eventos**: Parsea los eventos retornados por la **AFIP**.
|
228
|
+
- **Parseo de observaciones**: Parsea las observaciones retornados por la **AFIP**.
|
229
|
+
|
230
|
+
Implemente esto de esta manera debido a que sucedio que **AFIP** cambio algo en la estructura de los eventos, y al tener todo en un solo parser explotaba todo y no sabia que habia sucedido con la autorización de la factura.
|
231
|
+
|
232
|
+
## TO DO
|
233
|
+
- **Mejor parseo de los errores obtenidos en AFIP**: La idea seria poder identificar cada uno de los errores posibles obtenido, y agregar los errores en la `bill` al atributo que corresponda.
|
234
|
+
- **Batch**: Permitir a `Snoopy::AuthorizeAdapter` autorizar un pool de `Snoopy::Bill` en una sola request.
|
235
|
+
|
236
|
+
## License
|
237
|
+
|
238
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
4.2.1
|
@@ -162,10 +162,10 @@ module Snoopy
|
|
162
162
|
result_get = fe_comp_consultar_result[:result_get]
|
163
163
|
|
164
164
|
unless result_get.nil?
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
165
|
+
bill.result = result_get[:resultado]
|
166
|
+
bill.number = result_get[:cbte_desde]
|
167
|
+
bill.cae = result_get[:cod_autorizacion]
|
168
|
+
bill.due_date_cae = result_get[:fch_vto]
|
169
169
|
# bill.imp_iva = result_get[:imp_iva]
|
170
170
|
# bill.document_num = result_get[:doc_numero]
|
171
171
|
# bill.process_date = result_get[:fch_proceso]
|
data/lib/snoopy_afip/version.rb
CHANGED
data/snoopy_afip.gemspec
CHANGED
@@ -11,19 +11,14 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.authors = ["g.edera"]
|
12
12
|
s.date = "2017-06-29"
|
13
13
|
s.description = "Adaptador para Web Service de Facturación Electrónica Argentina (AFIP)"
|
14
|
-
s.email =
|
15
|
-
s.
|
16
|
-
s.files = [".document", "CHANGELOG", "Gemfile", "Gemfile.lock", "LICENSE.txt", "README.textile", "Rakefile", "VERSION", "autotest/discover.rb", "snoopy_afip.gemspec", "lib/snoopy_afip.rb", "lib/snoopy_afip/authentication_adapter.rb", "lib/snoopy_afip/authorize_adapter.rb", "lib/snoopy_afip/bill.rb", "lib/snoopy_afip/client.rb", "lib/snoopy_afip/constants.rb", "lib/snoopy_afip/core_ext/float.rb", "lib/snoopy_afip/core_ext/hash.rb", "lib/snoopy_afip/core_ext/string.rb", "lib/snoopy_afip/exceptions.rb", "lib/snoopy_afip/version.rb", "spec/snoopy_afip/authorizer_spec.rb", "spec/snoopy_afip/bill_spec.rb", "spec/spec_helper.rb", "wsaa-client.sh"]
|
14
|
+
s.email = "gab.edera@gmail.com"
|
15
|
+
s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
16
|
s.homepage = "https://github.com/gedera/snoopy_afip"
|
18
|
-
s.licenses =
|
17
|
+
s.licenses = "MIT"
|
19
18
|
s.require_paths = ["lib"]
|
20
19
|
# s.rubygems_version = "1.8.25"
|
21
20
|
s.summary = "Adaptador AFIP wsfe."
|
22
21
|
s.test_files = ["spec/snoopy_afip/authorizer_spec.rb", "spec/snoopy_afip/bill_spec.rb", "spec/spec_helper.rb"]
|
23
22
|
|
24
|
-
s.
|
25
|
-
s.add_runtime_dependency('nokogiri', ["~> 1.10.9"])
|
26
|
-
s.add_runtime_dependency('wasabi', ["~> 3.5.0"])
|
27
|
-
s.add_runtime_dependency('akami', ["~> 1.3.1"])
|
28
|
-
s.add_runtime_dependency('nori', ["~> 2.6.0"])
|
23
|
+
s.add_dependency 'savon', '~> 2.12.1'
|
29
24
|
end
|
data/xds_login.xml
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF8"?>
|
2
|
+
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
3
|
+
<xsd:annotation>
|
4
|
+
<xsd:documentation xml:lang="es">
|
5
|
+
Esquema de Ticket de pedido de acceso a un WSN
|
6
|
+
por parte de un CEE.
|
7
|
+
Nro revision SVN: $Rev:1869 $
|
8
|
+
</xsd:documentation>
|
9
|
+
</xsd:annotation>
|
10
|
+
<xsd:element name="loginTicketRequest" type="loginTicketRequest"/>
|
11
|
+
<xsd:complexType name="loginTicketRequest">
|
12
|
+
<xsd:sequence>
|
13
|
+
<xsd:element name="header" type="headerType" minOccurs="1" maxOccurs="1"/>
|
14
|
+
<xsd:element name="service" type="serviceType" minOccurs="1" maxOccurs="1"/>
|
15
|
+
</xsd:sequence>
|
16
|
+
<xsd:attribute name="version" type="xsd:decimal" use="optional" default="1.0"/>
|
17
|
+
</xsd:complexType>
|
18
|
+
<xsd:complexType name="headerType">
|
19
|
+
<xsd:sequence>
|
20
|
+
<xsd:element name="source" type="xsd:string" minOccurs="0" maxOccurs="1"/>
|
21
|
+
<xsd:element name="destination" type="xsd:string" minOccurs="0" maxOccurs="1"/>
|
22
|
+
<xsd:element name="uniqueId" type="xsd:unsignedInt" minOccurs="1" maxOccurs="1"/>
|
23
|
+
<xsd:element name="generationTime" type="xsd:dateTime" minOccurs="1" maxOccurs="1"/>
|
24
|
+
<xsd:element name="expirationTime" type="xsd:dateTime" minOccurs="1" maxOccurs="1"/>
|
25
|
+
</xsd:sequence>
|
26
|
+
</xsd:complexType>
|
27
|
+
<xsd:simpleType name="serviceType">
|
28
|
+
<xsd:restriction base="xsd:string">
|
29
|
+
<xsd:pattern value="[az,AZ][az,AZ,\,_,09]*"/>
|
30
|
+
<xsd:minLength value='3'/>
|
31
|
+
<xsd:maxLength value='32'/>
|
32
|
+
</xsd:restriction>
|
33
|
+
</xsd:simpleType>
|
34
|
+
</xsd:schema>
|
metadata
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: snoopy_afip
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.2.
|
4
|
+
version: 4.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- g.edera
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain: []
|
11
10
|
date: 2017-06-29 00:00:00.000000000 Z
|
@@ -16,84 +15,27 @@ dependencies:
|
|
16
15
|
requirements:
|
17
16
|
- - "~>"
|
18
17
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.12.
|
18
|
+
version: 2.12.1
|
20
19
|
type: :runtime
|
21
20
|
prerelease: false
|
22
21
|
version_requirements: !ruby/object:Gem::Requirement
|
23
22
|
requirements:
|
24
23
|
- - "~>"
|
25
24
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.12.
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: nokogiri
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 1.10.9
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 1.10.9
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: wasabi
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 3.5.0
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 3.5.0
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: akami
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 1.3.1
|
62
|
-
type: :runtime
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: 1.3.1
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: nori
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: 2.6.0
|
76
|
-
type: :runtime
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: 2.6.0
|
25
|
+
version: 2.12.1
|
83
26
|
description: Adaptador para Web Service de Facturación Electrónica Argentina (AFIP)
|
84
|
-
email:
|
85
|
-
- gab.edera@gmail.com
|
27
|
+
email: gab.edera@gmail.com
|
86
28
|
executables: []
|
87
29
|
extensions: []
|
88
|
-
extra_rdoc_files:
|
89
|
-
- LICENSE.txt
|
90
|
-
- README.textile
|
30
|
+
extra_rdoc_files: []
|
91
31
|
files:
|
92
32
|
- ".document"
|
33
|
+
- ".gitignore"
|
93
34
|
- CHANGELOG
|
94
35
|
- Gemfile
|
95
36
|
- Gemfile.lock
|
96
37
|
- LICENSE.txt
|
38
|
+
- README.md
|
97
39
|
- README.textile
|
98
40
|
- Rakefile
|
99
41
|
- VERSION
|
@@ -114,11 +56,11 @@ files:
|
|
114
56
|
- spec/snoopy_afip/bill_spec.rb
|
115
57
|
- spec/spec_helper.rb
|
116
58
|
- wsaa-client.sh
|
59
|
+
- xds_login.xml
|
117
60
|
homepage: https://github.com/gedera/snoopy_afip
|
118
61
|
licenses:
|
119
62
|
- MIT
|
120
63
|
metadata: {}
|
121
|
-
post_install_message:
|
122
64
|
rdoc_options: []
|
123
65
|
require_paths:
|
124
66
|
- lib
|
@@ -133,8 +75,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
133
75
|
- !ruby/object:Gem::Version
|
134
76
|
version: '0'
|
135
77
|
requirements: []
|
136
|
-
rubygems_version: 3.
|
137
|
-
signing_key:
|
78
|
+
rubygems_version: 3.6.8
|
138
79
|
specification_version: 4
|
139
80
|
summary: Adaptador AFIP wsfe.
|
140
81
|
test_files:
|