arca.rb 1.1.1 → 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: 6517c164fca8807ad8878dc8018fcadeb29f396dda5fce495cc00066fe3b9dc2
4
- data.tar.gz: '00228d35d622da5185625533a70f706137aea38bccb2786afa5bb7f32cc6ba88'
3
+ metadata.gz: 83fb68cdac99771719d984f0140a1ccc3a68efa3c7b31aeb73dddc538514f76d
4
+ data.tar.gz: 543051f05bdade2f33a8dd2bd9ef7c5a3dba1855e213fa8821a44b8c4f7226f0
5
5
  SHA512:
6
- metadata.gz: fbb41496d151b830f7cd16093868867f7dc8e2434579465be1af9b8199defcdd55a6e2095514ca670612bb71acb35d5befc00c5940884208c22550f4c44e3dc4
7
- data.tar.gz: 15b9016ea43562e7de76d24e30799bf4348f31f159ae45881088c0068360c4605691a541b355cfb51d645d78f00c743130cc51dc87f151daf7834b8b376d21cc
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,10 +1,19 @@
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
+
3
12
  ## [1.1.1] - 2025-02-20
4
13
 
5
- - **WSFE:** Added `tipos_condicion_iva_receptor(clase_cmp: nil)` to query IVA receptor conditions with optional invoice class filter.
6
- - **WSFE:** Added `actividades` to retrieve list of economic activities.
7
- - **WSFE:** Added `consultar_caea_sin_movimientos(caea, pto_vta)` to query CAEA without movements.
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.
8
17
 
9
18
  ## [1.1.0]
10
19
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- arca.rb (1.1.1)
4
+ arca.rb (1.1.2)
5
5
  activesupport
6
6
  builder
7
7
  httpclient
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.1"
4
+ VERSION = "1.1.2"
5
5
  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
@@ -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>
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.1
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
@@ -312,7 +322,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
312
322
  - !ruby/object:Gem::Version
313
323
  version: '0'
314
324
  requirements: []
315
- rubygems_version: 3.6.9
325
+ rubygems_version: 4.0.3
316
326
  specification_version: 4
317
327
  summary: 'Cliente Ruby para webservices de AFIP/ARCA: facturación electrónica, comprobantes
318
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"