Class: Arca::WSFE

Inherits:
Object
  • Object
show all
Includes:
TypeConversions
Defined in:
lib/arca/wsfe.rb

Constant Summary collapse

WSDL =
{
  development: "https://wswhomo.afip.gov.ar/wsfev1/service.asmx?WSDL",
  production: "https://servicios1.afip.gov.ar/wsfev1/service.asmx?WSDL",
  test: "#{Root}/test/fixtures/wsfe/wsfe.wsdl"
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from TypeConversions

#r2x, #x2r

Constructor Details

#initialize(options = {}) ⇒ WSFE

Returns a new instance of WSFE.



17
18
19
20
21
22
# File 'lib/arca/wsfe.rb', line 17

def initialize(options = {})
  @cuit = options[:cuit]
  @wsaa = WSAA.new options.merge(service: "wsfe")
  @client = Client.new Hash(options[:savon]).reverse_merge(wsdl: WSDL[@wsaa.env],
                                                           convert_request_keys_to: :camelcase)
end

Instance Attribute Details

#cuitObject (readonly)

Returns the value of attribute cuit.



15
16
17
# File 'lib/arca/wsfe.rb', line 15

def cuit
  @cuit
end

#wsaaObject (readonly)

Returns the value of attribute wsaa.



15
16
17
# File 'lib/arca/wsfe.rb', line 15

def wsaa
  @wsaa
end

Instance Method Details

#actividadesObject



69
70
71
72
# File 'lib/arca/wsfe.rb', line 69

def actividades
  r = request :fe_param_get_actividades, auth
  x2r get_array(r, :actividades_tipo), id: :integer, orden: :integer
end

#authObject



193
194
195
# File 'lib/arca/wsfe.rb', line 193

def auth
  { auth: wsaa.auth.merge(cuit: cuit) }
end

#autorizar_comprobantes(opciones) ⇒ Object



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/arca/wsfe.rb', line 94

def autorizar_comprobantes(opciones)
  comprobantes = opciones[:comprobantes]
  mensaje = {
    "FeCAEReq" => {
      "FeCabReq" => opciones.select_keys(:cbte_tipo, :pto_vta).merge(cant_reg: comprobantes.size),
      "FeDetReq" => {
        "FECAEDetRequest" => comprobantes.map { |comprobante| comprobante_to_request(comprobante, opciones) }
      }
    }
  }
  mensaje = r2x(mensaje, cbte_fch: :date, fch_serv_desde: :date, fch_serv_hasta: :date, fch_vto_pago: :date)
  r = request :fecae_solicitar, auth.merge(mensaje)
  r = Array.wrap(r[:fe_det_resp][:fecae_det_response]).map do |h|
    obs = Array.wrap(h[:observaciones] ? h[:observaciones][:obs] : nil)
    h.select_keys(:cae, :cae_fch_vto, :resultado).merge(cbte_nro: h[:cbte_desde], observaciones: obs)
  end
  x2r r, cae_fch_vto: :date, fch_serv_desde: :date, fch_serv_hasta: :date, fch_vto_pago: :date, cbte_nro: :integer,
         code: :integer
end

#cant_max_registros_x_loteObject



189
190
191
# File 'lib/arca/wsfe.rb', line 189

def cant_max_registros_x_lote
  request(:fe_comp_tot_x_request, auth)[:reg_x_req].to_i
end

#comprobante_to_request(comprobante, opciones) ⇒ Object



114
115
116
117
118
119
120
121
122
# File 'lib/arca/wsfe.rb', line 114

def comprobante_to_request(comprobante, opciones)
  nro = comprobante.delete :cbte_nro
  iva = comprobante.delete :imp_iva
  iva_receptor_id = comprobante.delete :condicion_iva_receptor_id
  comprobante.delete :tributos if comprobante[:imp_trib] == 0
  comprobante.merge! cbte_desde: nro, cbte_hasta: nro, "ImpIVA" => iva, "CondicionIVAReceptorId" => iva_receptor_id
  comprobante.merge! periodo_asoc: opciones[:periodo_asoc] if opciones[:periodo_asoc]
  comprobante
end

#consultar_caea(fecha) ⇒ Object



134
135
136
# File 'lib/arca/wsfe.rb', line 134

def consultar_caea(fecha)
  convertir_rta_caea request(:fecaea_consultar, auth.merge(periodo_para_consulta_caea(fecha)))
end

#consultar_caea_sin_movimientos(caea, pto_vta) ⇒ Object



176
177
178
179
# File 'lib/arca/wsfe.rb', line 176

def consultar_caea_sin_movimientos(caea, pto_vta)
  r = request :fecaea_sin_movimiento_consultar, auth.merge("CAEA" => caea, "PtoVta" => pto_vta)
  x2r get_array(r, :fecaea_sin_mov), pto_vta: :integer
end

#consultar_comprobante(opciones) ⇒ Object



185
186
187
# File 'lib/arca/wsfe.rb', line 185

def consultar_comprobante(opciones)
  request(:fe_comp_consultar, auth.merge(fe_comp_cons_req: opciones))[:result_get]
end

#cotizacion(moneda_id) ⇒ Object



90
91
92
# File 'lib/arca/wsfe.rb', line 90

def cotizacion(moneda_id)
  request(:fe_param_get_cotizacion, auth.merge(mon_id: moneda_id))[:result_get][:mon_cotiz].to_f
end

#dummyObject



24
25
26
# File 'lib/arca/wsfe.rb', line 24

def dummy
  request :fe_dummy
end

#fecha_inicio_quincena_siguienteObject



147
148
149
150
# File 'lib/arca/wsfe.rb', line 147

def fecha_inicio_quincena_siguiente
  hoy = Date.today
  hoy.day <= 15 ? hoy.change(day: 16) : hoy.next_month.change(day: 1)
end

#informar_caea_sin_movimientos(caea, pto_vta) ⇒ Object



172
173
174
# File 'lib/arca/wsfe.rb', line 172

def informar_caea_sin_movimientos(caea, pto_vta)
  request :fecaea_sin_movimiento_informar, auth.merge("CAEA" => caea, "PtoVta" => pto_vta)
end

#informar_comprobantes_caea(opciones) ⇒ Object



152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/arca/wsfe.rb', line 152

def informar_comprobantes_caea(opciones)
  comprobantes = opciones[:comprobantes]
  mensaje = {
    "FeCAEARegInfReq" => {
      "FeCabReq" => opciones.select_keys(:cbte_tipo, :pto_vta).merge(cant_reg: comprobantes.size),
      "FeDetReq" => {
        "FECAEADetRequest" => comprobantes.map do |comprobante|
          comprobante_to_request(comprobante.merge("CAEA" => comprobante.delete(:caea)), opciones)
        end
      }
    }
  }
  r = request :fecaea_reg_informativo, auth.merge(r2x(mensaje, cbte_fch: :date))
  r = Array.wrap(r[:fe_det_resp][:fecaea_det_response]).map do |h|
    obs = Array.wrap(h[:observaciones] ? h[:observaciones][:obs] : nil)
    h.select_keys(:caea, :resultado).merge(cbte_nro: h[:cbte_desde], observaciones: obs)
  end
  x2r r, cbte_nro: :integer, code: :integer
end

#periodo_para_consulta_caea(fecha) ⇒ Object



142
143
144
145
# File 'lib/arca/wsfe.rb', line 142

def periodo_para_consulta_caea(fecha)
  orden = fecha.day <= 15 ? 1 : 2
  { orden: orden, periodo: fecha.strftime("%Y%m") }
end

#periodo_para_solicitud_caeaObject



138
139
140
# File 'lib/arca/wsfe.rb', line 138

def periodo_para_solicitud_caea
  periodo_para_consulta_caea fecha_inicio_quincena_siguiente
end

#puntos_ventaObject



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/arca/wsfe.rb', line 74

def puntos_venta
  r = request :fe_param_get_ptos_venta, auth
  # Extract standard fields: nro, fch_baja, bloqueado
  # Also extract emision_tipo (EmisionTipo), pve_nombre_fantasia (pveNombreFantasia),
  # and pve_dominio (pveDominio) if present in response
  # Note: WSDL only shows Nro, EmisionTipo, Bloqueado, FchBaja, but actual response
  # may include additional fields like pveNombreFantasia and pveDominio
  x2r get_array(r, :pto_venta),
      nro: :integer,
      fch_baja: :date,
      bloqueado: :boolean,
      emision_tipo: nil, # String field, no conversion needed
      pve_nombre_fantasia: nil, # String field, may not be in WSDL but could be in response
      pve_dominio: nil # String field, may not be in WSDL but could be in response
end

#solicitar_caeaObject



124
125
126
127
128
129
130
131
132
# File 'lib/arca/wsfe.rb', line 124

def solicitar_caea
  convertir_rta_caea request(:fecaea_solicitar, auth.merge(periodo_para_solicitud_caea))
rescue Arca::ResponseError => e
  if e.code? 15_008
    consultar_caea fecha_inicio_quincena_siguiente
  else
    raise
  end
end

#tipos_comprobantesObject



28
29
30
31
# File 'lib/arca/wsfe.rb', line 28

def tipos_comprobantes
  r = request :fe_param_get_tipos_cbte, auth
  x2r get_array(r, :cbte_tipo), id: :integer, fch_desde: :date, fch_hasta: :date
end

#tipos_conceptoObject



43
44
45
46
# File 'lib/arca/wsfe.rb', line 43

def tipos_concepto
  r = request :fe_param_get_tipos_concepto, auth
  x2r get_array(r, :concepto_tipo), id: :integer, fch_desde: :date, fch_hasta: :date
end

#tipos_condicion_iva_receptor(clase_cmp: nil) ⇒ Object



63
64
65
66
67
# File 'lib/arca/wsfe.rb', line 63

def tipos_condicion_iva_receptor(clase_cmp: nil)
  params = clase_cmp ? auth.merge("ClaseCmp" => clase_cmp) : auth
  r = request :fe_param_get_condicion_iva_receptor, params
  x2r get_array(r, :condicion_iva_receptor), id: :integer
end

#tipos_documentosObject



38
39
40
41
# File 'lib/arca/wsfe.rb', line 38

def tipos_documentos
  r = request :fe_param_get_tipos_doc, auth
  x2r get_array(r, :doc_tipo), id: :integer, fch_desde: :date, fch_hasta: :date
end

#tipos_ivaObject



53
54
55
56
# File 'lib/arca/wsfe.rb', line 53

def tipos_iva
  r = request :fe_param_get_tipos_iva, auth
  x2r get_array(r, :iva_tipo), id: :integer, fch_desde: :date, fch_hasta: :date
end

#tipos_monedasObject



48
49
50
51
# File 'lib/arca/wsfe.rb', line 48

def tipos_monedas
  r = request :fe_param_get_tipos_monedas, auth
  x2r get_array(r, :moneda), fch_desde: :date, fch_hasta: :date
end

#tipos_opcionalObject



33
34
35
36
# File 'lib/arca/wsfe.rb', line 33

def tipos_opcional
  r = request :fe_param_get_tipos_opcional, auth
  x2r get_array(r, :tipos_opcional), id: :integer, fch_desde: :date, fch_hasta: :date
end

#tipos_tributosObject



58
59
60
61
# File 'lib/arca/wsfe.rb', line 58

def tipos_tributos
  r = request :fe_param_get_tipos_tributos, auth
  x2r get_array(r, :tributo_tipo), id: :integer, fch_desde: :date, fch_hasta: :date
end

#ultimo_comprobante_autorizado(opciones) ⇒ Object



181
182
183
# File 'lib/arca/wsfe.rb', line 181

def ultimo_comprobante_autorizado(opciones)
  request(:fe_comp_ultimo_autorizado, auth.merge(opciones))[:cbte_nro].to_i
end