arca.rb 1.1.0 → 1.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dd4d89db0b9d4d77abb2b5e6eb0e03d3169893d511a0e2b066f12e3c1d613e2c
4
- data.tar.gz: 49b8a96793606351fa4a9ca0b137cab1f7efc2459ef5604d9efffe0a20c5b54f
3
+ metadata.gz: 83fb68cdac99771719d984f0140a1ccc3a68efa3c7b31aeb73dddc538514f76d
4
+ data.tar.gz: 543051f05bdade2f33a8dd2bd9ef7c5a3dba1855e213fa8821a44b8c4f7226f0
5
5
  SHA512:
6
- metadata.gz: 4b6060fe8e15d82e5ca2cf8cfa5f7651899ae10661df16a389b6cb43ddcfbed79f6303b17a126b654d40e1b5830ba78263f6a20f7af6d11a1fe36f89eee8c459
7
- data.tar.gz: 02242344d53082a0b5b7f3b6aba1f004184b8aa8ac64e91ac9ed07b7f623a95191fe82582f0acd14256d616d5b2928f59b07471c73351887dcf7fb4b8af7342f
6
+ metadata.gz: 53d5c866b44f162ee646258f6e6aad01a930c21efeb339775d703307b287c1736fbe4e298600d98e22b96eafaa720180942b84b5cd0b15ed9087e18f31e78244
7
+ data.tar.gz: edf788cf929d1dc23d1c22f9309aefa37e6f0a2d92cb3161e920f2a0b71d6ace6fe8d40b7eea74069b12ce7bf1ba9bcfd6789f746e39ba7c6fc4070dd3b64dd0
@@ -1,12 +1,22 @@
1
1
  {
2
- "name": "arca",
3
- "build": {
4
- "dockerfile": "Dockerfile",
5
- "context": "..",
6
- "args": { "RUBY_VERSION": "3.4.7" }
7
- },
8
- "features": {
9
- "ghcr.io/devcontainers/features/github-cli:1": {}
10
- },
11
- "postCreateCommand": "bundle install && rake"
2
+ "name": "arca.rb",
3
+ "runArgs": [
4
+ "--name",
5
+ "arca.rb"
6
+ ],
7
+ "image": "ghcr.io/rails/devcontainer/images/ruby:4.0.0",
8
+ "workspaceFolder": "/workspaces/arca.rb",
9
+ "workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/arca.rb,type=bind,consistency=cached",
10
+ "remoteEnv": {
11
+ "ANTHROPIC_API_KEY": "${localEnv:ANTHROPIC_API_KEY}"
12
+ },
13
+ "postCreateCommand": "bin/devcontainer",
14
+ "customizations": {
15
+ "vscode": {
16
+ "extensions": [
17
+ "Shopify.ruby-lsp",
18
+ "anthropic.claude-code"
19
+ ]
20
+ }
21
+ }
12
22
  }
data/.mise.toml CHANGED
@@ -1,2 +1,5 @@
1
1
  [settings]
2
- idiomatic_version_file_enable_tools = ["ruby"]
2
+ idiomatic_version_file_enable_tools = ["ruby"]
3
+
4
+ [tools]
5
+ ruby = "4.0.0"
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.4.7
1
+ 4.0.0
data/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Arca Changelog
2
2
 
3
+ ## [1.1.2] 2025-03-02
4
+
5
+ - **VEConsumer** — Nuevo servicio: Ventanilla Electrónica - Consumir Comunicaciones (`veconsumerws`). Permite consultar y leer comunicaciones enviadas a un contribuyente vía SOAP 1.2.
6
+ - `consultar_comunicaciones(filter = {})` — consulta paginada con filtros opcionales (estado, fechas, sistema publicador, referencias, etc.).
7
+ - `consumir_comunicacion(id, incluir_adjuntos: false)` — recupera una comunicación y la marca como leída; con `incluir_adjuntos: true` extrae el contenido binario vía MTOM en `adjunto[:content]`.
8
+ - `consultar_sistemas_publicadores(id_sistema_publicador: nil)` — lista sistemas publicadores habilitados.
9
+ - `consultar_estados` — lista los posibles estados (1=No leída, 2=Leída).
10
+ - Los errores SOAP Fault del servicio se traducen a `ResponseError` con soporte para `e.code?`.
11
+
12
+ ## [1.1.1] - 2025-02-20
13
+
14
+ - **WSFE:** Agregado `tipos_condicion_iva_receptor(clase_cmp: nil)` para consultar condiciones de IVA del receptor con filtro opcional por clase de comprobante.
15
+ - **WSFE:** Agregado `actividades` para obtener el listado de actividades económicas.
16
+ - **WSFE:** Agregado `consultar_caea_sin_movimientos(caea, pto_vta)` para consultar CAEA sin movimientos.
17
+
3
18
  ## [1.1.0]
4
19
 
5
20
  - **WSAA:** Store opcional para TA. Podés pasar `store:` con un objeto que implemente `read(cuit:, env:, service:)` y `write(cuit:, env:, service:, ta:, expires_at:)` para guardar el token en tu backend (p. ej. DB por tenant con cifrado). Sin `store`, se sigue usando el archivo JSON en `tmp/`.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- arca.rb (1.1.0)
4
+ arca.rb (1.1.2)
5
5
  activesupport
6
6
  builder
7
7
  httpclient
@@ -89,6 +89,8 @@ GEM
89
89
  nkf (0.2.0)
90
90
  nokogiri (1.19.0-aarch64-linux-gnu)
91
91
  racc (~> 1.4)
92
+ nokogiri (1.19.0-arm64-darwin)
93
+ racc (~> 1.4)
92
94
  nokogiri (1.19.0-x86_64-linux-gnu)
93
95
  racc (~> 1.4)
94
96
  nori (2.7.1)
@@ -165,6 +167,7 @@ GEM
165
167
 
166
168
  PLATFORMS
167
169
  aarch64-linux
170
+ arm64-darwin-24
168
171
  x86_64-linux
169
172
 
170
173
  DEPENDENCIES
data/README.md CHANGED
@@ -13,6 +13,7 @@ Cliente Ruby para integrar webservices SOAP de AFIP y ARCA en Argentina. Soporta
13
13
  - **Autenticación WSAA** - Manejo automático de tokens y certificados
14
14
  - **Producción y homologación** - Ambientes configurables
15
15
  - **Padrón AFIP** - Consulta de contribuyentes (A4, A5, A100)
16
+ - **Ventanilla Electrónica (VEConsumer)** - Consulta y lectura de comunicaciones de AFIP
16
17
 
17
18
  ## Requisitos
18
19
 
@@ -72,6 +73,7 @@ Opción del constructor: `env: :development` o `env: :production` (symbol o stri
72
73
  | WS Constancia Inscripción | `Arca::WSConstanciaInscripcion` | Constancia de inscripción |
73
74
  | Padrón A4 / A5 / A100 | `Arca::PersonaServiceA4`, `PersonaServiceA5`, `PersonaServiceA100` | Consulta padrón de contribuyentes |
74
75
  | WConsDeclaracion | `Arca::WConsDeclaracion` | Declaraciones aduaneras |
76
+ | VEConsumer | `Arca::VEConsumer` | Ventanilla Electrónica — comunicaciones del contribuyente |
75
77
 
76
78
  ## Uso
77
79
 
@@ -173,6 +175,33 @@ ws = Arca::WSConstanciaInscripcion.new(env: :development, cuit: '20123456789', k
173
175
  ws.get_persona('20123456789')
174
176
  ```
175
177
 
178
+ ### VEConsumer (Ventanilla Electrónica)
179
+ ```ruby
180
+ ws = Arca::VEConsumer.new(env: :development, cuit: '20123456789', key: key, cert: cert)
181
+
182
+ # Consultar comunicaciones (paginado, con filtros opcionales)
183
+ r = ws.consultar_comunicaciones(estado: 1, pagina: 1)
184
+ r[:items] # Array de ComunicacionSimplificada
185
+ r[:total_paginas] # total de páginas
186
+
187
+ # Leer una comunicación (la marca como leída)
188
+ com = ws.consumir_comunicacion(12_061_068)
189
+ com[:estado] # "2" (leída)
190
+ com[:adjuntos] # [] si no tiene adjuntos
191
+
192
+ # Leer con adjuntos binarios vía MTOM
193
+ com = ws.consumir_comunicacion(12_061_068, incluir_adjuntos: true)
194
+ com[:adjuntos][0][:filename] # "informe.pdf"
195
+ com[:adjuntos][0][:content] # contenido binario (String)
196
+
197
+ # Sistemas publicadores habilitados
198
+ ws.consultar_sistemas_publicadores
199
+ ws.consultar_sistemas_publicadores(id_sistema_publicador: 88)
200
+
201
+ # Estados posibles (1=No leída, 2=Leída)
202
+ ws.consultar_estados
203
+ ```
204
+
176
205
  ### WConsDeclaracion (Declaraciones aduaneras)
177
206
  ```ruby
178
207
  ws = Arca::WConsDeclaracion.new(cuit: '20123456789', key: key, cert: cert, env: :development)
data/bin/devcontainer ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ export DEBIAN_FRONTEND=noninteractive
5
+
6
+ # Add Charm apt repo for gum and gitleaks
7
+ sudo mkdir -p /etc/apt/keyrings
8
+ curl -fsSL https://repo.charm.sh/apt/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/charm.gpg > /dev/null
9
+ echo "deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list > /dev/null
10
+
11
+ sudo apt-get update
12
+ sudo apt-get install -y --no-install-recommends \
13
+ ca-certificates \
14
+ curl \
15
+ gh \
16
+ gum \
17
+ zlib1g-dev
18
+
19
+ sudo rm -rf /var/lib/apt/lists/*
20
+
21
+ if ! command -v mise >/dev/null 2>&1; then
22
+ curl -fsSL https://mise.jdx.dev/install.sh | sh
23
+ ln -sfn "$HOME/.local/bin/mise" /usr/local/bin/mise
24
+ mise trust
25
+ fi
26
+
27
+ # Claude Code CLI
28
+ curl -fsSL https://claude.ai/install.sh | bash
@@ -0,0 +1,131 @@
1
+ # frozen_string_literal: true
2
+
3
+ # VEConsumer: Web Service de Ventanilla Electrónica - Consumir Comunicaciones (AFIP).
4
+ # Permite consultar y leer comunicaciones enviadas a un contribuyente.
5
+ # Documentación: VE-CU-WS-Consumir-Comunicaciones v1.3.0.
6
+ # Id del servicio WSAA: "veconsumerws".
7
+ module Arca
8
+ class VEConsumer
9
+ WSDL = {
10
+ development: "https://stable-middleware-tecno-ext.afip.gob.ar/ve-ws/services/veconsumer?wsdl",
11
+ production: "https://infraestructura.afip.gob.ar/ve-ws/services/veconsumer?wsdl",
12
+ test: "#{Root}/test/fixtures/ve_consumer/ve_consumer.wsdl"
13
+ }.freeze
14
+
15
+ attr_reader :wsaa, :cuit
16
+
17
+ def initialize(options = {})
18
+ @cuit = normalize_cuit(options[:cuit])
19
+ @wsaa = WSAA.new options.merge(service: "veconsumerws")
20
+ @client = Client.new Hash(options[:savon]).reverse_merge(
21
+ wsdl: WSDL[@wsaa.env],
22
+ soap_version: 2,
23
+ convert_request_keys_to: :camelcase
24
+ )
25
+ end
26
+
27
+ # Consulta comunicaciones del contribuyente con filtros opcionales.
28
+ # Claves opcionales del filter: estado, fecha_desde, fecha_hasta,
29
+ # comunicacion_id_desde, comunicacion_id_hasta, tiene_adjunto,
30
+ # sistema_publicador_id, pagina, resultados_por_pagina,
31
+ # referencia1, referencia2.
32
+ # Retorna un hash con :pagina, :total_paginas, :items_por_pagina,
33
+ # :total_items e :items (Array de ComunicacionSimplificada).
34
+ def consultar_comunicaciones(filter = {})
35
+ r = raw_request(:consultar_comunicaciones, auth_request.merge(filter: filter))
36
+ paginada = r[:respuesta_paginada]
37
+ paginada.merge(items: get_array(paginada[:items], :comunicacion_simplificada))
38
+ end
39
+
40
+ # Recupera una comunicación por id y la marca como leída.
41
+ # Con incluir_adjuntos: true se incluyen los adjuntos vía MTOM en la respuesta;
42
+ # el contenido binario de cada adjunto queda en :content como String.
43
+ # Retorna la Comunicacion con :adjuntos como Array.
44
+ def consumir_comunicacion(id_comunicacion, incluir_adjuntos: false)
45
+ response = client_request(:consumir_comunicacion, auth_request.merge(
46
+ id_comunicacion: id_comunicacion,
47
+ incluir_adjuntos: incluir_adjuntos
48
+ ))
49
+ resp = response.to_hash[:consumir_comunicacion_response]
50
+ raise ServerError, "Unexpected response structure" unless resp
51
+
52
+ comunicacion = resp[:comunicacion]
53
+ comunicacion.merge(adjuntos: build_adjuntos(comunicacion[:adjuntos], response.attachments))
54
+ end
55
+
56
+ # Lista los sistemas publicadores habilitados en Ventanilla Electrónica.
57
+ # Con id_sistema_publicador filtra por sistema específico.
58
+ def consultar_sistemas_publicadores(id_sistema_publicador: nil)
59
+ params = auth_request
60
+ params = params.merge(id_sistema_publicador: id_sistema_publicador) if id_sistema_publicador
61
+ r = raw_request(:consultar_sistemas_publicadores, params)
62
+ Array.wrap(r.dig(:sistemas, :sistema))
63
+ end
64
+
65
+ # Lista los posibles estados de una comunicación. 1=No leída, 2=Leída.
66
+ def consultar_estados
67
+ r = raw_request(:consultar_estados, auth_request)
68
+ Array.wrap(r.dig(:estados, :estado))
69
+ end
70
+
71
+ private
72
+
73
+ def auth_request
74
+ { auth_request: @wsaa.auth.merge(cuit_representada: cuit) }
75
+ end
76
+
77
+ def client_request(action, body)
78
+ @client.request(action, body)
79
+ rescue ServerError => e
80
+ raise parse_fault(e)
81
+ end
82
+
83
+ def raw_request(action, body)
84
+ resp = client_request(action, body).to_hash[:"#{action}_response"]
85
+ raise ServerError, "Unexpected response structure" unless resp
86
+
87
+ resp
88
+ end
89
+
90
+ def parse_fault(error)
91
+ match = error.message.match(/Error (\d+): (.+)/)
92
+ return error unless match
93
+
94
+ ResponseError.new([ { code: match[1], msg: match[2].strip } ])
95
+ end
96
+
97
+ def build_adjuntos(adjuntos_element, mtom_parts)
98
+ return [] unless adjuntos_element && adjuntos_element[:adjunto]
99
+
100
+ items = Array.wrap(adjuntos_element[:adjunto])
101
+ return items if mtom_parts.empty?
102
+
103
+ by_cid = mtom_parts.each_with_object({}) do |part, h|
104
+ cid = part.header[:content_id].to_s.tr("<>", "")
105
+ h[cid] = part.body.decoded
106
+ end
107
+
108
+ items.map do |adj|
109
+ href = adj.dig(:content, :include, :"@href").to_s
110
+ next adj unless href.start_with?("cid:")
111
+
112
+ cid = href.delete_prefix("cid:")
113
+ adj.merge(content: by_cid.fetch(cid, adj[:content]))
114
+ end
115
+ end
116
+
117
+ def get_array(container, element)
118
+ return [] unless container && container[element]
119
+
120
+ Array.wrap(container[element])
121
+ end
122
+
123
+ def normalize_cuit(value)
124
+ if value.nil? || value == ""
125
+ 0
126
+ else
127
+ value.to_s.gsub(/\D/, "").to_i
128
+ end
129
+ end
130
+ end
131
+ end
data/lib/arca/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Arca
4
- VERSION = "1.1.0"
4
+ VERSION = "1.1.2"
5
5
  end
data/lib/arca/wsfe.rb CHANGED
@@ -60,11 +60,17 @@ module Arca
60
60
  x2r get_array(r, :tributo_tipo), id: :integer, fch_desde: :date, fch_hasta: :date
61
61
  end
62
62
 
63
- def tipos_condicion_iva_receptor
64
- r = request :fe_param_get_condicion_iva_receptor, auth
63
+ def tipos_condicion_iva_receptor(clase_cmp: nil)
64
+ params = clase_cmp ? auth.merge("ClaseCmp" => clase_cmp) : auth
65
+ r = request :fe_param_get_condicion_iva_receptor, params
65
66
  x2r get_array(r, :condicion_iva_receptor), id: :integer
66
67
  end
67
68
 
69
+ def actividades
70
+ r = request :fe_param_get_actividades, auth
71
+ x2r get_array(r, :actividades_tipo), id: :integer, orden: :integer
72
+ end
73
+
68
74
  def puntos_venta
69
75
  r = request :fe_param_get_ptos_venta, auth
70
76
  # Extract standard fields: nro, fch_baja, bloqueado
@@ -167,6 +173,11 @@ module Arca
167
173
  request :fecaea_sin_movimiento_informar, auth.merge("CAEA" => caea, "PtoVta" => pto_vta)
168
174
  end
169
175
 
176
+ def consultar_caea_sin_movimientos(caea, pto_vta)
177
+ r = request :fecaea_sin_movimiento_consultar, auth.merge("CAEA" => caea, "PtoVta" => pto_vta)
178
+ x2r get_array(r, :fecaea_sin_mov), pto_vta: :integer
179
+ end
180
+
170
181
  def ultimo_comprobante_autorizado(opciones)
171
182
  request(:fe_comp_ultimo_autorizado, auth.merge(opciones))[:cbte_nro].to_i
172
183
  end
data/lib/arca.rb CHANGED
@@ -28,4 +28,5 @@ require "arca/persona_service_a100"
28
28
  require "arca/w_cons_declaracion"
29
29
  require "arca/wsrgiva"
30
30
  require "arca/wscdc"
31
+ require "arca/ve_consumer"
31
32
  require "arca/wsfecred"
@@ -0,0 +1,128 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ module Arca
6
+ class VEConsumerTest < TestCase
7
+ def ta
8
+ @ta ||= { token: "t", sign: "s" }
9
+ end
10
+
11
+ def ws
12
+ @ws ||= VEConsumer.new(cuit: "20111111112").tap { |w| w.wsaa.stubs auth: ta }
13
+ end
14
+
15
+ def test_consultar_comunicaciones
16
+ savon.expects(:consultar_comunicaciones)
17
+ .with(message: { auth_request: ta.merge(cuit_representada: 20_111_111_112), filter: {} })
18
+ .returns(fixture("ve_consumer/consultar_comunicaciones/success"))
19
+ r = ws.consultar_comunicaciones
20
+ assert_equal "1", r[:pagina]
21
+ assert_equal "1", r[:total_paginas]
22
+ assert_equal 1, r[:items].size
23
+ assert_hash_includes r[:items][0], id_comunicacion: "1", estado_desc: "Comunicacion Leida"
24
+ end
25
+
26
+ def test_consultar_comunicaciones_con_filtros
27
+ savon.expects(:consultar_comunicaciones)
28
+ .with(message: {
29
+ auth_request: ta.merge(cuit_representada: 20_111_111_112),
30
+ filter: { estado: 1, fecha_desde: "2012-01-01", pagina: 2 }
31
+ })
32
+ .returns(fixture("ve_consumer/consultar_comunicaciones/success"))
33
+ ws.consultar_comunicaciones(estado: 1, fecha_desde: "2012-01-01", pagina: 2)
34
+ end
35
+
36
+ def test_consumir_comunicacion
37
+ savon.expects(:consumir_comunicacion)
38
+ .with(message: {
39
+ auth_request: ta.merge(cuit_representada: 20_111_111_112),
40
+ id_comunicacion: 12_061_068,
41
+ incluir_adjuntos: false
42
+ })
43
+ .returns(fixture("ve_consumer/consumir_comunicacion/success"))
44
+ r = ws.consumir_comunicacion(12_061_068)
45
+ assert_hash_includes r, id_comunicacion: "12061068", estado: "1"
46
+ assert_equal [], r[:adjuntos]
47
+ end
48
+
49
+ def test_consumir_comunicacion_con_adjuntos
50
+ boundary = "testboundary"
51
+ xml_part = fixture("ve_consumer/consumir_comunicacion/with_adjuntos")
52
+ binary = "PKbinarydata"
53
+ multipart_body = "--#{boundary}\r\nContent-Type: application/xop+xml; charset=UTF-8\r\n\r\n" \
54
+ "#{xml_part}\r\n" \
55
+ "--#{boundary}\r\nContent-Type: application/octet-stream\r\nContent-ID: <testcid@test>\r\n\r\n" \
56
+ "#{binary}\r\n" \
57
+ "--#{boundary}--\r\n"
58
+ savon.expects(:consumir_comunicacion)
59
+ .with(message: {
60
+ auth_request: ta.merge(cuit_representada: 20_111_111_112),
61
+ id_comunicacion: 12_061_068,
62
+ incluir_adjuntos: true
63
+ })
64
+ .returns(code: 200,
65
+ headers: { "Content-Type" => "multipart/related; boundary=\"#{boundary}\"" },
66
+ body: multipart_body)
67
+ r = ws.consumir_comunicacion(12_061_068, incluir_adjuntos: true)
68
+ assert_equal 1, r[:adjuntos].size
69
+ assert_equal "attach.zip", r[:adjuntos][0][:filename]
70
+ assert_equal binary, r[:adjuntos][0][:content]
71
+ end
72
+
73
+ def test_soap_fault_levanta_response_error
74
+ savon.expects(:consultar_comunicaciones)
75
+ .with(message: :any)
76
+ .returns(fixture("ve_consumer/consultar_comunicaciones/soap_fault"))
77
+ error = assert_raises(ResponseError) { ws.consultar_comunicaciones }
78
+ assert error.code?(104)
79
+ assert_equal "104", error.errors[0][:code]
80
+ assert_equal "La Comunicación [1] no existe", error.errors[0][:msg]
81
+ end
82
+
83
+ def test_consultar_sistemas_publicadores
84
+ savon.expects(:consultar_sistemas_publicadores)
85
+ .with(message: { auth_request: ta.merge(cuit_representada: 20_111_111_112) })
86
+ .returns(fixture("ve_consumer/consultar_sistemas_publicadores/success"))
87
+ r = ws.consultar_sistemas_publicadores
88
+ assert_equal 1, r.size
89
+ assert_hash_includes r[0], id: "88", descripcion: "MDQ"
90
+ end
91
+
92
+ def test_consultar_sistemas_publicadores_con_id
93
+ savon.expects(:consultar_sistemas_publicadores)
94
+ .with(message: {
95
+ auth_request: ta.merge(cuit_representada: 20_111_111_112),
96
+ id_sistema_publicador: 88
97
+ })
98
+ .returns(fixture("ve_consumer/consultar_sistemas_publicadores/success"))
99
+ ws.consultar_sistemas_publicadores(id_sistema_publicador: 88)
100
+ end
101
+
102
+ def test_consultar_estados
103
+ savon.expects(:consultar_estados)
104
+ .with(message: { auth_request: ta.merge(cuit_representada: 20_111_111_112) })
105
+ .returns(fixture("ve_consumer/consultar_estados/success"))
106
+ r = ws.consultar_estados
107
+ assert_equal 2, r.size
108
+ assert_hash_includes r[0], id: "1", descripcion: "Comunicacion No Leida"
109
+ assert_equal "2", r[1][:id]
110
+ end
111
+
112
+ def test_entorno_development
113
+ Client.expects(:new).with { |opts| opts[:wsdl] == WSAA::WSDL[:development] }.returns(stub(operations: []))
114
+ Client.expects(:new).with do |opts|
115
+ opts[:wsdl] == VEConsumer::WSDL[:development] && opts[:soap_version] == 2
116
+ end.returns(stub(operations: []))
117
+ VEConsumer.new(cuit: "1", env: :development)
118
+ end
119
+
120
+ def test_entorno_production
121
+ Client.expects(:new).with { |opts| opts[:wsdl] == WSAA::WSDL[:production] }.returns(stub(operations: []))
122
+ Client.expects(:new).with do |opts|
123
+ opts[:wsdl] == VEConsumer::WSDL[:production] && opts[:soap_version] == 2
124
+ end.returns(stub(operations: []))
125
+ VEConsumer.new(cuit: "1", env: :production)
126
+ end
127
+ end
128
+ end
@@ -63,6 +63,28 @@ module Arca
63
63
  ws.tipos_tributos
64
64
  end
65
65
 
66
+ def test_tipos_condicion_iva_receptor
67
+ savon.expects(:fe_param_get_condicion_iva_receptor).with(message: auth)
68
+ .returns(fixture("wsfe/fe_param_get_condicion_iva_receptor/success"))
69
+ result = ws.tipos_condicion_iva_receptor
70
+ assert_equal 1, result.first[:id]
71
+ end
72
+
73
+ def test_tipos_condicion_iva_receptor_con_clase_cmp
74
+ savon.expects(:fe_param_get_condicion_iva_receptor)
75
+ .with(message: has_path("//Auth/Token" => "t", "//ClaseCmp" => "A"))
76
+ .returns(fixture("wsfe/fe_param_get_condicion_iva_receptor/success"))
77
+ ws.tipos_condicion_iva_receptor(clase_cmp: "A")
78
+ end
79
+
80
+ def test_actividades
81
+ savon.expects(:fe_param_get_actividades).with(message: auth).returns(fixture("wsfe/fe_param_get_actividades/success"))
82
+ assert_equal [
83
+ { id: 620000, orden: 1, desc: "Telecomunicaciones alámbricas" },
84
+ { id: 620100, orden: 2, desc: "Telecomunicaciones inalámbricas" }
85
+ ], ws.actividades
86
+ end
87
+
66
88
  def test_puntos_venta
67
89
  savon.expects(:fe_param_get_ptos_venta).with(message: auth).returns(fixture("wsfe/fe_param_get_ptos_venta/success"))
68
90
  assert_equal [
@@ -215,6 +237,14 @@ module Arca
215
237
  assert_hash_includes rta, caea: "21043476341977", resultado: "A"
216
238
  end
217
239
 
240
+ def test_consultar_caea_sin_movimientos
241
+ savon.expects(:fecaea_sin_movimiento_consultar).with(message: has_path(
242
+ "//Auth/Token" => "t", "//CAEA" => "21043476341977", "//PtoVta" => 3
243
+ )).returns(fixture("wsfe/fecaea_sin_movimiento_consultar/success"))
244
+ assert_equal [{ caea: "21043476341977", fch_proceso: "20110202", pto_vta: 3 }],
245
+ ws.consultar_caea_sin_movimientos("21043476341977", 3)
246
+ end
247
+
218
248
  def test_consultar_caea
219
249
  savon.expects(:fecaea_consultar).with(message: has_path("//Periodo" => "201101",
220
250
  "//Orden" => 1)).returns(fixture("wsfe/fecaea_consultar/success"))
@@ -0,0 +1,13 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
3
+ <soap:Body>
4
+ <soap:Fault>
5
+ <soap:Code>
6
+ <soap:Value>soap:Receiver</soap:Value>
7
+ </soap:Code>
8
+ <soap:Reason>
9
+ <soap:Text xml:lang="en">Error 104: La Comunicación [1] no existe</soap:Text>
10
+ </soap:Reason>
11
+ </soap:Fault>
12
+ </soap:Body>
13
+ </soap:Envelope>
@@ -0,0 +1,28 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
3
+ <soap:Body>
4
+ <consultarComunicacionesResponse xmlns="http://ve.tecno.afip.gov.ar/domain/service/ws">
5
+ <RespuestaPaginada>
6
+ <pagina>1</pagina>
7
+ <totalPaginas>1</totalPaginas>
8
+ <itemsPorPagina>10</itemsPorPagina>
9
+ <totalItems>1</totalItems>
10
+ <items>
11
+ <ComunicacionSimplificada>
12
+ <idComunicacion>1</idComunicacion>
13
+ <cuitDestinatario>20111111112</cuitDestinatario>
14
+ <fechaPublicacion>2012-03-01 00:00:00</fechaPublicacion>
15
+ <fechaVencimiento>2012-03-01</fechaVencimiento>
16
+ <sistemaPublicador>19</sistemaPublicador>
17
+ <sistemaPublicadorDesc>Osiris</sistemaPublicadorDesc>
18
+ <estado>2</estado>
19
+ <estadoDesc>Comunicacion Leida</estadoDesc>
20
+ <asunto>Usted tiene un archivo adjunto</asunto>
21
+ <prioridad>3</prioridad>
22
+ <tieneAdjunto>true</tieneAdjunto>
23
+ </ComunicacionSimplificada>
24
+ </items>
25
+ </RespuestaPaginada>
26
+ </consultarComunicacionesResponse>
27
+ </soap:Body>
28
+ </soap:Envelope>
@@ -0,0 +1,17 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
3
+ <soap:Body>
4
+ <consultarEstadosResponse xmlns="http://ve.tecno.afip.gov.ar/domain/service/ws">
5
+ <Estados>
6
+ <Estado>
7
+ <id>1</id>
8
+ <descripcion>Comunicacion No Leida</descripcion>
9
+ </Estado>
10
+ <Estado>
11
+ <id>2</id>
12
+ <descripcion>Comunicacion Leida</descripcion>
13
+ </Estado>
14
+ </Estados>
15
+ </consultarEstadosResponse>
16
+ </soap:Body>
17
+ </soap:Envelope>
@@ -0,0 +1,15 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
3
+ <soap:Body>
4
+ <consultarSistemasPublicadoresResponse xmlns="http://ve.tecno.afip.gov.ar/domain/service/ws">
5
+ <Sistemas>
6
+ <Sistema>
7
+ <id>88</id>
8
+ <descripcion>MDQ</descripcion>
9
+ <certCN>mdqCN</certCN>
10
+ <subservicios/>
11
+ </Sistema>
12
+ </Sistemas>
13
+ </consultarSistemasPublicadoresResponse>
14
+ </soap:Body>
15
+ </soap:Envelope>
@@ -0,0 +1,19 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
3
+ <soap:Body>
4
+ <consumirComunicacionResponse xmlns="http://ve.tecno.afip.gov.ar/domain/service/ws">
5
+ <Comunicacion>
6
+ <idComunicacion>12061068</idComunicacion>
7
+ <cuitDestinatario>20111111112</cuitDestinatario>
8
+ <fechaPublicacion>2011-04-18 13:06:00</fechaPublicacion>
9
+ <sistemaPublicador>1</sistemaPublicador>
10
+ <sistemaPublicadorDesc>Sistema Ventanilla Electronica</sistemaPublicadorDesc>
11
+ <estado>1</estado>
12
+ <estadoDesc>Comunicacion No Leida</estadoDesc>
13
+ <asunto>Actualizacion de Certificado</asunto>
14
+ <prioridad>2</prioridad>
15
+ <adjuntos/>
16
+ </Comunicacion>
17
+ </consumirComunicacionResponse>
18
+ </soap:Body>
19
+ </soap:Envelope>
@@ -0,0 +1,34 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
3
+ <soap:Body>
4
+ <consumirComunicacionResponse xmlns="http://ve.tecno.afip.gov.ar/domain/service/ws">
5
+ <Comunicacion>
6
+ <idComunicacion>12061068</idComunicacion>
7
+ <cuitDestinatario>20111111112</cuitDestinatario>
8
+ <fechaPublicacion>2011-07-12 12:21:39</fechaPublicacion>
9
+ <fechaVencimiento>2011-07-12</fechaVencimiento>
10
+ <sistemaPublicador>88</sistemaPublicador>
11
+ <sistemaPublicadorDesc>MDQ</sistemaPublicadorDesc>
12
+ <estado>1</estado>
13
+ <estadoDesc>Comunicacion No Leida</estadoDesc>
14
+ <asunto>Mensaje generado por VeClient</asunto>
15
+ <prioridad>1</prioridad>
16
+ <adjuntos>
17
+ <adjunto>
18
+ <filename>attach.zip</filename>
19
+ <compressed>false</compressed>
20
+ <signed>false</signed>
21
+ <encrypted>false</encrypted>
22
+ <processed>false</processed>
23
+ <public>false</public>
24
+ <md5>2ea67624b8cc4340a2a6d4821627412d</md5>
25
+ <contentSize>453</contentSize>
26
+ <content>
27
+ <xop:Include href="cid:testcid@test" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
28
+ </content>
29
+ </adjunto>
30
+ </adjuntos>
31
+ </Comunicacion>
32
+ </consumirComunicacionResponse>
33
+ </soap:Body>
34
+ </soap:Envelope>
@@ -0,0 +1,256 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
3
+ xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
4
+ xmlns:tns="http://ve.tecno.afip.gov.ar/domain/service/ws"
5
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
6
+ targetNamespace="http://ve.tecno.afip.gov.ar/domain/service/ws"
7
+ xmlns="http://schemas.xmlsoap.org/wsdl/">
8
+ <wsdl:types>
9
+ <xsd:schema targetNamespace="http://ve.tecno.afip.gov.ar/domain/service/ws">
10
+ <xsd:complexType name="AuthRequestType">
11
+ <xsd:sequence>
12
+ <xsd:element name="token" type="xsd:string"/>
13
+ <xsd:element name="sign" type="xsd:string"/>
14
+ <xsd:element name="cuitRepresentada" type="xsd:long"/>
15
+ </xsd:sequence>
16
+ </xsd:complexType>
17
+ <xsd:complexType name="FilterType">
18
+ <xsd:sequence>
19
+ <xsd:element name="estado" type="xsd:int" minOccurs="0"/>
20
+ <xsd:element name="fechaDesde" type="xsd:string" minOccurs="0"/>
21
+ <xsd:element name="fechaHasta" type="xsd:string" minOccurs="0"/>
22
+ <xsd:element name="comunicacionIdDesde" type="xsd:long" minOccurs="0"/>
23
+ <xsd:element name="comunicacionIdHasta" type="xsd:long" minOccurs="0"/>
24
+ <xsd:element name="tieneAdjunto" type="xsd:boolean" minOccurs="0"/>
25
+ <xsd:element name="sistemaPublicadorId" type="xsd:int" minOccurs="0"/>
26
+ <xsd:element name="pagina" type="xsd:int" minOccurs="0"/>
27
+ <xsd:element name="resultadosPorPagina" type="xsd:int" minOccurs="0"/>
28
+ <xsd:element name="referencia1" type="xsd:string" minOccurs="0"/>
29
+ <xsd:element name="referencia2" type="xsd:string" minOccurs="0"/>
30
+ </xsd:sequence>
31
+ </xsd:complexType>
32
+ <xsd:element name="consultarComunicaciones" type="tns:ConsultarComunicacionesType"/>
33
+ <xsd:complexType name="ConsultarComunicacionesType">
34
+ <xsd:sequence>
35
+ <xsd:element name="authRequest" type="tns:AuthRequestType"/>
36
+ <xsd:element name="filter" type="tns:FilterType" minOccurs="0"/>
37
+ </xsd:sequence>
38
+ </xsd:complexType>
39
+ <xsd:element name="consultarComunicacionesResponse" type="tns:ConsultarComunicacionesResponseType"/>
40
+ <xsd:complexType name="ConsultarComunicacionesResponseType">
41
+ <xsd:sequence>
42
+ <xsd:element name="RespuestaPaginada" type="tns:RespuestaPaginadaType"/>
43
+ </xsd:sequence>
44
+ </xsd:complexType>
45
+ <xsd:complexType name="RespuestaPaginadaType">
46
+ <xsd:sequence>
47
+ <xsd:element name="pagina" type="xsd:int"/>
48
+ <xsd:element name="totalPaginas" type="xsd:int"/>
49
+ <xsd:element name="itemsPorPagina" type="xsd:int"/>
50
+ <xsd:element name="totalItems" type="xsd:int"/>
51
+ <xsd:element name="items" type="tns:ItemsType" minOccurs="0"/>
52
+ </xsd:sequence>
53
+ </xsd:complexType>
54
+ <xsd:complexType name="ItemsType">
55
+ <xsd:sequence>
56
+ <xsd:element name="ComunicacionSimplificada" type="tns:ComunicacionSimplificadaType"
57
+ minOccurs="0" maxOccurs="unbounded"/>
58
+ </xsd:sequence>
59
+ </xsd:complexType>
60
+ <xsd:complexType name="ComunicacionSimplificadaType">
61
+ <xsd:sequence>
62
+ <xsd:element name="idComunicacion" type="xsd:long"/>
63
+ <xsd:element name="cuitDestinatario" type="xsd:long"/>
64
+ <xsd:element name="fechaPublicacion" type="xsd:string"/>
65
+ <xsd:element name="fechaVencimiento" type="xsd:string" minOccurs="0"/>
66
+ <xsd:element name="sistemaPublicador" type="xsd:int"/>
67
+ <xsd:element name="sistemaPublicadorDesc" type="xsd:string"/>
68
+ <xsd:element name="estado" type="xsd:int"/>
69
+ <xsd:element name="estadoDesc" type="xsd:string"/>
70
+ <xsd:element name="asunto" type="xsd:string"/>
71
+ <xsd:element name="prioridad" type="xsd:int"/>
72
+ <xsd:element name="tieneAdjunto" type="xsd:boolean"/>
73
+ </xsd:sequence>
74
+ </xsd:complexType>
75
+ <xsd:element name="consumirComunicacion" type="tns:ConsumirComunicacionType"/>
76
+ <xsd:complexType name="ConsumirComunicacionType">
77
+ <xsd:sequence>
78
+ <xsd:element name="authRequest" type="tns:AuthRequestType"/>
79
+ <xsd:element name="idComunicacion" type="xsd:long"/>
80
+ <xsd:element name="incluirAdjuntos" type="xsd:boolean"/>
81
+ </xsd:sequence>
82
+ </xsd:complexType>
83
+ <xsd:element name="consumirComunicacionResponse" type="tns:ConsumirComunicacionResponseType"/>
84
+ <xsd:complexType name="ConsumirComunicacionResponseType">
85
+ <xsd:sequence>
86
+ <xsd:element name="Comunicacion" type="tns:ComunicacionType"/>
87
+ </xsd:sequence>
88
+ </xsd:complexType>
89
+ <xsd:complexType name="ComunicacionType">
90
+ <xsd:sequence>
91
+ <xsd:element name="idComunicacion" type="xsd:long"/>
92
+ <xsd:element name="cuitDestinatario" type="xsd:long"/>
93
+ <xsd:element name="fechaPublicacion" type="xsd:string"/>
94
+ <xsd:element name="fechaVencimiento" type="xsd:string" minOccurs="0"/>
95
+ <xsd:element name="sistemaPublicador" type="xsd:int"/>
96
+ <xsd:element name="sistemaPublicadorDesc" type="xsd:string"/>
97
+ <xsd:element name="estado" type="xsd:int"/>
98
+ <xsd:element name="estadoDesc" type="xsd:string"/>
99
+ <xsd:element name="asunto" type="xsd:string"/>
100
+ <xsd:element name="prioridad" type="xsd:int"/>
101
+ <xsd:element name="tieneAdjunto" type="xsd:boolean" minOccurs="0"/>
102
+ <xsd:element name="mensaje" type="xsd:string" minOccurs="0"/>
103
+ <xsd:element name="adjuntos" type="tns:AdjuntosType" minOccurs="0"/>
104
+ </xsd:sequence>
105
+ </xsd:complexType>
106
+ <xsd:complexType name="AdjuntosType">
107
+ <xsd:sequence>
108
+ <xsd:element name="adjunto" type="tns:AdjuntoType" minOccurs="0" maxOccurs="unbounded"/>
109
+ </xsd:sequence>
110
+ </xsd:complexType>
111
+ <xsd:complexType name="AdjuntoType">
112
+ <xsd:sequence>
113
+ <xsd:element name="filename" type="xsd:string"/>
114
+ <xsd:element name="compressed" type="xsd:boolean"/>
115
+ <xsd:element name="signed" type="xsd:boolean"/>
116
+ <xsd:element name="encrypted" type="xsd:boolean"/>
117
+ <xsd:element name="processed" type="xsd:boolean"/>
118
+ <xsd:element name="public" type="xsd:boolean"/>
119
+ <xsd:element name="md5" type="xsd:string" minOccurs="0"/>
120
+ <xsd:element name="contentSize" type="xsd:long"/>
121
+ <xsd:element name="content" type="xsd:base64Binary"/>
122
+ </xsd:sequence>
123
+ </xsd:complexType>
124
+ <xsd:element name="consultarSistemasPublicadores" type="tns:ConsultarSistemasPublicadoresType"/>
125
+ <xsd:complexType name="ConsultarSistemasPublicadoresType">
126
+ <xsd:sequence>
127
+ <xsd:element name="authRequest" type="tns:AuthRequestType"/>
128
+ <xsd:element name="idSistemaPublicador" type="xsd:long" minOccurs="0"/>
129
+ </xsd:sequence>
130
+ </xsd:complexType>
131
+ <xsd:element name="consultarSistemasPublicadoresResponse" type="tns:ConsultarSistemasPublicadoresResponseType"/>
132
+ <xsd:complexType name="ConsultarSistemasPublicadoresResponseType">
133
+ <xsd:sequence>
134
+ <xsd:element name="Sistemas" type="tns:SistemasType"/>
135
+ </xsd:sequence>
136
+ </xsd:complexType>
137
+ <xsd:complexType name="SistemasType">
138
+ <xsd:sequence>
139
+ <xsd:element name="Sistema" type="tns:SistemaType" minOccurs="0" maxOccurs="unbounded"/>
140
+ </xsd:sequence>
141
+ </xsd:complexType>
142
+ <xsd:complexType name="SistemaType">
143
+ <xsd:sequence>
144
+ <xsd:element name="id" type="xsd:int"/>
145
+ <xsd:element name="descripcion" type="xsd:string"/>
146
+ <xsd:element name="certCN" type="xsd:string" minOccurs="0"/>
147
+ <xsd:element name="subservicios" type="tns:SubserviciosType" minOccurs="0"/>
148
+ </xsd:sequence>
149
+ </xsd:complexType>
150
+ <xsd:complexType name="SubserviciosType">
151
+ <xsd:sequence>
152
+ <xsd:element name="Subservicio" type="tns:SubservicioType" minOccurs="0" maxOccurs="unbounded"/>
153
+ </xsd:sequence>
154
+ </xsd:complexType>
155
+ <xsd:complexType name="SubservicioType">
156
+ <xsd:sequence>
157
+ <xsd:element name="nombre" type="xsd:string"/>
158
+ <xsd:element name="descripcion" type="xsd:string"/>
159
+ </xsd:sequence>
160
+ </xsd:complexType>
161
+ <xsd:element name="consultarEstados" type="tns:ConsultarEstadosType"/>
162
+ <xsd:complexType name="ConsultarEstadosType">
163
+ <xsd:sequence>
164
+ <xsd:element name="authRequest" type="tns:AuthRequestType"/>
165
+ </xsd:sequence>
166
+ </xsd:complexType>
167
+ <xsd:element name="consultarEstadosResponse" type="tns:ConsultarEstadosResponseType"/>
168
+ <xsd:complexType name="ConsultarEstadosResponseType">
169
+ <xsd:sequence>
170
+ <xsd:element name="Estados" type="tns:EstadosType"/>
171
+ </xsd:sequence>
172
+ </xsd:complexType>
173
+ <xsd:complexType name="EstadosType">
174
+ <xsd:sequence>
175
+ <xsd:element name="Estado" type="tns:EstadoType" minOccurs="0" maxOccurs="unbounded"/>
176
+ </xsd:sequence>
177
+ </xsd:complexType>
178
+ <xsd:complexType name="EstadoType">
179
+ <xsd:sequence>
180
+ <xsd:element name="id" type="xsd:int"/>
181
+ <xsd:element name="descripcion" type="xsd:string"/>
182
+ </xsd:sequence>
183
+ </xsd:complexType>
184
+ </xsd:schema>
185
+ </wsdl:types>
186
+ <wsdl:message name="consultarComunicacionesIn">
187
+ <wsdl:part name="parameters" element="tns:consultarComunicaciones"/>
188
+ </wsdl:message>
189
+ <wsdl:message name="consultarComunicacionesOut">
190
+ <wsdl:part name="parameters" element="tns:consultarComunicacionesResponse"/>
191
+ </wsdl:message>
192
+ <wsdl:message name="consumirComunicacionIn">
193
+ <wsdl:part name="parameters" element="tns:consumirComunicacion"/>
194
+ </wsdl:message>
195
+ <wsdl:message name="consumirComunicacionOut">
196
+ <wsdl:part name="parameters" element="tns:consumirComunicacionResponse"/>
197
+ </wsdl:message>
198
+ <wsdl:message name="consultarSistemasPublicadoresIn">
199
+ <wsdl:part name="parameters" element="tns:consultarSistemasPublicadores"/>
200
+ </wsdl:message>
201
+ <wsdl:message name="consultarSistemasPublicadoresOut">
202
+ <wsdl:part name="parameters" element="tns:consultarSistemasPublicadoresResponse"/>
203
+ </wsdl:message>
204
+ <wsdl:message name="consultarEstadosIn">
205
+ <wsdl:part name="parameters" element="tns:consultarEstados"/>
206
+ </wsdl:message>
207
+ <wsdl:message name="consultarEstadosOut">
208
+ <wsdl:part name="parameters" element="tns:consultarEstadosResponse"/>
209
+ </wsdl:message>
210
+ <wsdl:portType name="VEConsumerPort">
211
+ <wsdl:operation name="consultarComunicaciones">
212
+ <wsdl:input message="tns:consultarComunicacionesIn"/>
213
+ <wsdl:output message="tns:consultarComunicacionesOut"/>
214
+ </wsdl:operation>
215
+ <wsdl:operation name="consumirComunicacion">
216
+ <wsdl:input message="tns:consumirComunicacionIn"/>
217
+ <wsdl:output message="tns:consumirComunicacionOut"/>
218
+ </wsdl:operation>
219
+ <wsdl:operation name="consultarSistemasPublicadores">
220
+ <wsdl:input message="tns:consultarSistemasPublicadoresIn"/>
221
+ <wsdl:output message="tns:consultarSistemasPublicadoresOut"/>
222
+ </wsdl:operation>
223
+ <wsdl:operation name="consultarEstados">
224
+ <wsdl:input message="tns:consultarEstadosIn"/>
225
+ <wsdl:output message="tns:consultarEstadosOut"/>
226
+ </wsdl:operation>
227
+ </wsdl:portType>
228
+ <wsdl:binding name="VEConsumerBinding" type="tns:VEConsumerPort">
229
+ <soap12:binding transport="http://schemas.xmlsoap.org/soap/http"/>
230
+ <wsdl:operation name="consultarComunicaciones">
231
+ <soap12:operation soapAction="consultarComunicaciones" style="document"/>
232
+ <wsdl:input><soap12:body use="literal"/></wsdl:input>
233
+ <wsdl:output><soap12:body use="literal"/></wsdl:output>
234
+ </wsdl:operation>
235
+ <wsdl:operation name="consumirComunicacion">
236
+ <soap12:operation soapAction="consumirComunicacion" style="document"/>
237
+ <wsdl:input><soap12:body use="literal"/></wsdl:input>
238
+ <wsdl:output><soap12:body use="literal"/></wsdl:output>
239
+ </wsdl:operation>
240
+ <wsdl:operation name="consultarSistemasPublicadores">
241
+ <soap12:operation soapAction="consultarSistemasPublicadores" style="document"/>
242
+ <wsdl:input><soap12:body use="literal"/></wsdl:input>
243
+ <wsdl:output><soap12:body use="literal"/></wsdl:output>
244
+ </wsdl:operation>
245
+ <wsdl:operation name="consultarEstados">
246
+ <soap12:operation soapAction="consultarEstados" style="document"/>
247
+ <wsdl:input><soap12:body use="literal"/></wsdl:input>
248
+ <wsdl:output><soap12:body use="literal"/></wsdl:output>
249
+ </wsdl:operation>
250
+ </wsdl:binding>
251
+ <wsdl:service name="VEConsumer">
252
+ <wsdl:port name="VEConsumerPort" binding="tns:VEConsumerBinding">
253
+ <soap12:address location="https://stable-middleware-tecno-ext.afip.gob.ar/ve-ws/services/veconsumer"/>
254
+ </wsdl:port>
255
+ </wsdl:service>
256
+ </wsdl:definitions>
@@ -0,0 +1,20 @@
1
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
2
+ <soap:Body>
3
+ <FEParamGetActividadesResponse xmlns="http://ar.gov.afip.dif.FEV1/">
4
+ <FEParamGetActividadesResult>
5
+ <ResultGet>
6
+ <ActividadesTipo>
7
+ <Id>620000</Id>
8
+ <Orden>1</Orden>
9
+ <Desc>Telecomunicaciones alámbricas</Desc>
10
+ </ActividadesTipo>
11
+ <ActividadesTipo>
12
+ <Id>620100</Id>
13
+ <Orden>2</Orden>
14
+ <Desc>Telecomunicaciones inalámbricas</Desc>
15
+ </ActividadesTipo>
16
+ </ResultGet>
17
+ </FEParamGetActividadesResult>
18
+ </FEParamGetActividadesResponse>
19
+ </soap:Body>
20
+ </soap:Envelope>
@@ -0,0 +1,14 @@
1
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
2
+ <soap:Body>
3
+ <FEParamGetCondicionIvaReceptorResponse xmlns="http://ar.gov.afip.dif.FEV1/">
4
+ <FEParamGetCondicionIvaReceptorResult>
5
+ <ResultGet>
6
+ <CondicionIvaReceptor>
7
+ <Id>1</Id>
8
+ <Desc>IVA Responsable Inscripto</Desc>
9
+ </CondicionIvaReceptor>
10
+ </ResultGet>
11
+ </FEParamGetCondicionIvaReceptorResult>
12
+ </FEParamGetCondicionIvaReceptorResponse>
13
+ </soap:Body>
14
+ </soap:Envelope>
@@ -0,0 +1,15 @@
1
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
2
+ <soap:Body>
3
+ <FECAEASinMovimientoConsultarResponse xmlns="http://ar.gov.afip.dif.FEV1/">
4
+ <FECAEASinMovimientoConsultarResult>
5
+ <ResultGet>
6
+ <FECAEASinMov>
7
+ <CAEA>21043476341977</CAEA>
8
+ <FchProceso>20110202</FchProceso>
9
+ <PtoVta>3</PtoVta>
10
+ </FECAEASinMov>
11
+ </ResultGet>
12
+ </FECAEASinMovimientoConsultarResult>
13
+ </FECAEASinMovimientoConsultarResponse>
14
+ </soap:Body>
15
+ </soap:Envelope>
@@ -629,6 +629,39 @@
629
629
  <s:element minOccurs="0" maxOccurs="1" name="FchHasta" type="s:string" />
630
630
  </s:sequence>
631
631
  </s:complexType>
632
+ <s:element name="FEParamGetCondicionIvaReceptor">
633
+ <s:complexType>
634
+ <s:sequence>
635
+ <s:element minOccurs="0" maxOccurs="1" name="Auth" type="tns:FEAuthRequest" />
636
+ <s:element minOccurs="0" maxOccurs="1" name="ClaseCmp" type="s:string" />
637
+ </s:sequence>
638
+ </s:complexType>
639
+ </s:element>
640
+ <s:element name="FEParamGetCondicionIvaReceptorResponse">
641
+ <s:complexType>
642
+ <s:sequence>
643
+ <s:element minOccurs="0" maxOccurs="1" name="FEParamGetCondicionIvaReceptorResult" type="tns:CondicionIvaReceptorResponse" />
644
+ </s:sequence>
645
+ </s:complexType>
646
+ </s:element>
647
+ <s:complexType name="CondicionIvaReceptorResponse">
648
+ <s:sequence>
649
+ <s:element minOccurs="0" maxOccurs="1" name="ResultGet" type="tns:ArrayOfCondicionIvaReceptor" />
650
+ <s:element minOccurs="0" maxOccurs="1" name="Errors" type="tns:ArrayOfErr" />
651
+ <s:element minOccurs="0" maxOccurs="1" name="Events" type="tns:ArrayOfEvt" />
652
+ </s:sequence>
653
+ </s:complexType>
654
+ <s:complexType name="ArrayOfCondicionIvaReceptor">
655
+ <s:sequence>
656
+ <s:element minOccurs="0" maxOccurs="unbounded" name="CondicionIvaReceptor" nillable="true" type="tns:CondicionIvaReceptor" />
657
+ </s:sequence>
658
+ </s:complexType>
659
+ <s:complexType name="CondicionIvaReceptor">
660
+ <s:sequence>
661
+ <s:element minOccurs="1" maxOccurs="1" name="Id" type="s:int" />
662
+ <s:element minOccurs="0" maxOccurs="1" name="Desc" type="s:string" />
663
+ </s:sequence>
664
+ </s:complexType>
632
665
  <s:element name="FEParamGetTiposOpcional">
633
666
  <s:complexType>
634
667
  <s:sequence>
@@ -799,6 +832,39 @@
799
832
  <s:element minOccurs="0" maxOccurs="1" name="FchHasta" type="s:string" />
800
833
  </s:sequence>
801
834
  </s:complexType>
835
+ <s:element name="FEParamGetActividades">
836
+ <s:complexType>
837
+ <s:sequence>
838
+ <s:element minOccurs="0" maxOccurs="1" name="Auth" type="tns:FEAuthRequest" />
839
+ </s:sequence>
840
+ </s:complexType>
841
+ </s:element>
842
+ <s:element name="FEParamGetActividadesResponse">
843
+ <s:complexType>
844
+ <s:sequence>
845
+ <s:element minOccurs="0" maxOccurs="1" name="FEParamGetActividadesResult" type="tns:ActividadesTipoResponse" />
846
+ </s:sequence>
847
+ </s:complexType>
848
+ </s:element>
849
+ <s:complexType name="ActividadesTipoResponse">
850
+ <s:sequence>
851
+ <s:element minOccurs="0" maxOccurs="1" name="ResultGet" type="tns:ArrayOfActividadesTipo" />
852
+ <s:element minOccurs="0" maxOccurs="1" name="Errors" type="tns:ArrayOfErr" />
853
+ <s:element minOccurs="0" maxOccurs="1" name="Events" type="tns:ArrayOfEvt" />
854
+ </s:sequence>
855
+ </s:complexType>
856
+ <s:complexType name="ArrayOfActividadesTipo">
857
+ <s:sequence>
858
+ <s:element minOccurs="0" maxOccurs="unbounded" name="ActividadesTipo" nillable="true" type="tns:ActividadesTipo" />
859
+ </s:sequence>
860
+ </s:complexType>
861
+ <s:complexType name="ActividadesTipo">
862
+ <s:sequence>
863
+ <s:element minOccurs="1" maxOccurs="1" name="Id" type="s:long" />
864
+ <s:element minOccurs="0" maxOccurs="1" name="Orden" type="s:short" />
865
+ <s:element minOccurs="0" maxOccurs="1" name="Desc" type="s:string" />
866
+ </s:sequence>
867
+ </s:complexType>
802
868
  </s:schema>
803
869
  </wsdl:types>
804
870
  <wsdl:message name="FECAESolicitarSoapIn">
@@ -885,6 +951,12 @@
885
951
  <wsdl:message name="FEParamGetTiposIvaSoapOut">
886
952
  <wsdl:part name="parameters" element="tns:FEParamGetTiposIvaResponse" />
887
953
  </wsdl:message>
954
+ <wsdl:message name="FEParamGetCondicionIvaReceptorSoapIn">
955
+ <wsdl:part name="parameters" element="tns:FEParamGetCondicionIvaReceptor" />
956
+ </wsdl:message>
957
+ <wsdl:message name="FEParamGetCondicionIvaReceptorSoapOut">
958
+ <wsdl:part name="parameters" element="tns:FEParamGetCondicionIvaReceptorResponse" />
959
+ </wsdl:message>
888
960
  <wsdl:message name="FEParamGetTiposOpcionalSoapIn">
889
961
  <wsdl:part name="parameters" element="tns:FEParamGetTiposOpcional" />
890
962
  </wsdl:message>
@@ -915,6 +987,12 @@
915
987
  <wsdl:message name="FEParamGetTiposDocSoapOut">
916
988
  <wsdl:part name="parameters" element="tns:FEParamGetTiposDocResponse" />
917
989
  </wsdl:message>
990
+ <wsdl:message name="FEParamGetActividadesSoapIn">
991
+ <wsdl:part name="parameters" element="tns:FEParamGetActividades" />
992
+ </wsdl:message>
993
+ <wsdl:message name="FEParamGetActividadesSoapOut">
994
+ <wsdl:part name="parameters" element="tns:FEParamGetActividadesResponse" />
995
+ </wsdl:message>
918
996
  <wsdl:portType name="ServiceSoap">
919
997
  <wsdl:operation name="FECAESolicitar">
920
998
  <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Solicitud de Código de Autorización Electrónico (CAE)</wsdl:documentation>
@@ -986,6 +1064,11 @@
986
1064
  <wsdl:input message="tns:FEParamGetTiposIvaSoapIn" />
987
1065
  <wsdl:output message="tns:FEParamGetTiposIvaSoapOut" />
988
1066
  </wsdl:operation>
1067
+ <wsdl:operation name="FEParamGetCondicionIvaReceptor">
1068
+ <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Recupera el listado de condiciones de IVA del receptor.</wsdl:documentation>
1069
+ <wsdl:input message="tns:FEParamGetCondicionIvaReceptorSoapIn" />
1070
+ <wsdl:output message="tns:FEParamGetCondicionIvaReceptorSoapOut" />
1071
+ </wsdl:operation>
989
1072
  <wsdl:operation name="FEParamGetTiposOpcional">
990
1073
  <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Recupera el listado de identificadores para los campos Opcionales</wsdl:documentation>
991
1074
  <wsdl:input message="tns:FEParamGetTiposOpcionalSoapIn" />
@@ -1011,6 +1094,11 @@
1011
1094
  <wsdl:input message="tns:FEParamGetTiposDocSoapIn" />
1012
1095
  <wsdl:output message="tns:FEParamGetTiposDocSoapOut" />
1013
1096
  </wsdl:operation>
1097
+ <wsdl:operation name="FEParamGetActividades">
1098
+ <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Recupera el listado de actividades habilitadas del emisor.</wsdl:documentation>
1099
+ <wsdl:input message="tns:FEParamGetActividadesSoapIn" />
1100
+ <wsdl:output message="tns:FEParamGetActividadesSoapOut" />
1101
+ </wsdl:operation>
1014
1102
  </wsdl:portType>
1015
1103
  <wsdl:binding name="ServiceSoap" type="tns:ServiceSoap">
1016
1104
  <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
@@ -1140,6 +1228,15 @@
1140
1228
  <soap:body use="literal" />
1141
1229
  </wsdl:output>
1142
1230
  </wsdl:operation>
1231
+ <wsdl:operation name="FEParamGetCondicionIvaReceptor">
1232
+ <soap:operation soapAction="http://ar.gov.afip.dif.FEV1/FEParamGetCondicionIvaReceptor" style="document" />
1233
+ <wsdl:input>
1234
+ <soap:body use="literal" />
1235
+ </wsdl:input>
1236
+ <wsdl:output>
1237
+ <soap:body use="literal" />
1238
+ </wsdl:output>
1239
+ </wsdl:operation>
1143
1240
  <wsdl:operation name="FEParamGetTiposOpcional">
1144
1241
  <soap:operation soapAction="http://ar.gov.afip.dif.FEV1/FEParamGetTiposOpcional" style="document" />
1145
1242
  <wsdl:input>
@@ -1185,6 +1282,15 @@
1185
1282
  <soap:body use="literal" />
1186
1283
  </wsdl:output>
1187
1284
  </wsdl:operation>
1285
+ <wsdl:operation name="FEParamGetActividades">
1286
+ <soap:operation soapAction="http://ar.gov.afip.dif.FEV1/FEParamGetActividades" style="document" />
1287
+ <wsdl:input>
1288
+ <soap:body use="literal" />
1289
+ </wsdl:input>
1290
+ <wsdl:output>
1291
+ <soap:body use="literal" />
1292
+ </wsdl:output>
1293
+ </wsdl:operation>
1188
1294
  </wsdl:binding>
1189
1295
  <wsdl:binding name="ServiceSoap12" type="tns:ServiceSoap">
1190
1296
  <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
@@ -1314,6 +1420,15 @@
1314
1420
  <soap12:body use="literal" />
1315
1421
  </wsdl:output>
1316
1422
  </wsdl:operation>
1423
+ <wsdl:operation name="FEParamGetCondicionIvaReceptor">
1424
+ <soap12:operation soapAction="http://ar.gov.afip.dif.FEV1/FEParamGetCondicionIvaReceptor" style="document" />
1425
+ <wsdl:input>
1426
+ <soap12:body use="literal" />
1427
+ </wsdl:input>
1428
+ <wsdl:output>
1429
+ <soap12:body use="literal" />
1430
+ </wsdl:output>
1431
+ </wsdl:operation>
1317
1432
  <wsdl:operation name="FEParamGetTiposOpcional">
1318
1433
  <soap12:operation soapAction="http://ar.gov.afip.dif.FEV1/FEParamGetTiposOpcional" style="document" />
1319
1434
  <wsdl:input>
@@ -1359,6 +1474,15 @@
1359
1474
  <soap12:body use="literal" />
1360
1475
  </wsdl:output>
1361
1476
  </wsdl:operation>
1477
+ <wsdl:operation name="FEParamGetActividades">
1478
+ <soap12:operation soapAction="http://ar.gov.afip.dif.FEV1/FEParamGetActividades" style="document" />
1479
+ <wsdl:input>
1480
+ <soap12:body use="literal" />
1481
+ </wsdl:input>
1482
+ <wsdl:output>
1483
+ <soap12:body use="literal" />
1484
+ </wsdl:output>
1485
+ </wsdl:operation>
1362
1486
  </wsdl:binding>
1363
1487
  <wsdl:service name="Service">
1364
1488
  <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Web Service orientado al servicio de Facturacion electronica RG2485 V1</wsdl:documentation>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arca.rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arca Kit
@@ -154,10 +154,10 @@ email:
154
154
  - hola@arcakit.dev
155
155
  executables:
156
156
  - console
157
+ - devcontainer
157
158
  extensions: []
158
159
  extra_rdoc_files: []
159
160
  files:
160
- - ".devcontainer/Dockerfile"
161
161
  - ".devcontainer/devcontainer.json"
162
162
  - ".github/dependabot.yml"
163
163
  - ".github/workflows/ci.yml"
@@ -176,6 +176,7 @@ files:
176
176
  - SECURITY.md
177
177
  - arca.gemspec
178
178
  - bin/console
179
+ - bin/devcontainer
179
180
  - lib/arca.rb
180
181
  - lib/arca/client.rb
181
182
  - lib/arca/core_ext/hash.rb
@@ -187,6 +188,7 @@ files:
187
188
  - lib/arca/persona_service_a4.rb
188
189
  - lib/arca/persona_service_a5.rb
189
190
  - lib/arca/type_conversions.rb
191
+ - lib/arca/ve_consumer.rb
190
192
  - lib/arca/version.rb
191
193
  - lib/arca/w_cons_declaracion.rb
192
194
  - lib/arca/ws_constancia_inscripcion.rb
@@ -203,6 +205,7 @@ files:
203
205
  - test/arca/test.crt
204
206
  - test/arca/test.key
205
207
  - test/arca/type_conversions_test.rb
208
+ - test/arca/ve_consumer_test.rb
206
209
  - test/arca/w_cons_declaracion_test.rb
207
210
  - test/arca/ws_constancia_inscripcion_test.rb
208
211
  - test/arca/wsaa_test.rb
@@ -210,6 +213,13 @@ files:
210
213
  - test/arca/wsfe_test.rb
211
214
  - test/arca/wsfecred_test.rb
212
215
  - test/arca/wsrgiva_test.rb
216
+ - test/fixtures/ve_consumer/consultar_comunicaciones/soap_fault.xml
217
+ - test/fixtures/ve_consumer/consultar_comunicaciones/success.xml
218
+ - test/fixtures/ve_consumer/consultar_estados/success.xml
219
+ - test/fixtures/ve_consumer/consultar_sistemas_publicadores/success.xml
220
+ - test/fixtures/ve_consumer/consumir_comunicacion/success.xml
221
+ - test/fixtures/ve_consumer/consumir_comunicacion/with_adjuntos.xml
222
+ - test/fixtures/ve_consumer/ve_consumer.wsdl
213
223
  - test/fixtures/wconsdeclaracion/detallada_estado/success.xml
214
224
  - test/fixtures/wconsdeclaracion/detallada_lista_declaraciones/por_fecha_success.xml
215
225
  - test/fixtures/wconsdeclaracion/detallada_lista_declaraciones/por_id_inexistente.xml
@@ -248,6 +258,8 @@ files:
248
258
  - test/fixtures/wsfe/fe_comp_tot_x_request/success.xml
249
259
  - test/fixtures/wsfe/fe_comp_ultimo_autorizado/success.xml
250
260
  - test/fixtures/wsfe/fe_dummy/success.xml
261
+ - test/fixtures/wsfe/fe_param_get_actividades/success.xml
262
+ - test/fixtures/wsfe/fe_param_get_condicion_iva_receptor/success.xml
251
263
  - test/fixtures/wsfe/fe_param_get_cotizacion/dolar.xml
252
264
  - test/fixtures/wsfe/fe_param_get_cotizacion/inexistente.xml
253
265
  - test/fixtures/wsfe/fe_param_get_ptos_venta/success.xml
@@ -266,6 +278,7 @@ files:
266
278
  - test/fixtures/wsfe/fecae_solicitar/una_observacion.xml
267
279
  - test/fixtures/wsfe/fecaea_consultar/success.xml
268
280
  - test/fixtures/wsfe/fecaea_reg_informativo/informe_rtdo_parcial.xml
281
+ - test/fixtures/wsfe/fecaea_sin_movimiento_consultar/success.xml
269
282
  - test/fixtures/wsfe/fecaea_sin_movimiento_informar/success.xml
270
283
  - test/fixtures/wsfe/fecaea_solicitar/caea_ya_otorgado.xml
271
284
  - test/fixtures/wsfe/fecaea_solicitar/error_distinto.xml
@@ -309,7 +322,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
309
322
  - !ruby/object:Gem::Version
310
323
  version: '0'
311
324
  requirements: []
312
- rubygems_version: 3.6.9
325
+ rubygems_version: 4.0.3
313
326
  specification_version: 4
314
327
  summary: 'Cliente Ruby para webservices de AFIP/ARCA: facturación electrónica, comprobantes
315
328
  y servicios tributarios de Argentina'
@@ -1,8 +0,0 @@
1
- # Matches .ruby-version
2
- ARG RUBY_VERSION=3.4.7
3
- FROM ruby:${RUBY_VERSION}
4
-
5
- # postCreateCommand runs "bundle install && rake"
6
- RUN gem install bundler
7
-
8
- ENV BINDING="0.0.0.0"