Class: Afipws::WSFE

Inherits:
Object
  • Object
show all
Includes:
TypeConversions
Defined in:
lib/afipws/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 + '/spec/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.



13
14
15
16
17
# File 'lib/afipws/wsfe.rb', line 13

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.



11
12
13
# File 'lib/afipws/wsfe.rb', line 11

def cuit
  @cuit
end

#wsaaObject (readonly)

Returns the value of attribute wsaa.



11
12
13
# File 'lib/afipws/wsfe.rb', line 11

def wsaa
  @wsaa
end

Instance Method Details

#authObject



157
158
159
# File 'lib/afipws/wsfe.rb', line 157

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

#autorizar_comprobantes(opciones) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/afipws/wsfe.rb', line 67

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 }
      }
    }
  }
  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



139
140
141
# File 'lib/afipws/wsfe.rb', line 139

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

#comprobante_to_request(comprobante) ⇒ Object



86
87
88
89
90
91
# File 'lib/afipws/wsfe.rb', line 86

def comprobante_to_request comprobante
  nro = comprobante.delete :cbte_nro
  iva = comprobante.delete :imp_iva
  comprobante.delete :tributos if comprobante[:imp_trib] == 0
  comprobante.merge cbte_desde: nro, cbte_hasta: nro, 'ImpIVA' => iva
end

#consultar_caea(fecha) ⇒ Object



103
104
105
# File 'lib/afipws/wsfe.rb', line 103

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

#consultar_comprobante(opciones) ⇒ Object



135
136
137
# File 'lib/afipws/wsfe.rb', line 135

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

#cotizacion(moneda_id) ⇒ Object



63
64
65
# File 'lib/afipws/wsfe.rb', line 63

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

#dummyObject



19
20
21
# File 'lib/afipws/wsfe.rb', line 19

def dummy
  request :fe_dummy
end

#fecha_inicio_quincena_siguienteObject



152
153
154
155
# File 'lib/afipws/wsfe.rb', line 152

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



127
128
129
# File 'lib/afipws/wsfe.rb', line 127

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



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/afipws/wsfe.rb', line 107

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))
        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



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

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

#periodo_para_solicitud_caeaObject



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

def periodo_para_solicitud_caea
  periodo_para_consulta_caea fecha_inicio_quincena_siguiente
end

#puntos_ventaObject



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

def puntos_venta
  r = request :fe_param_get_ptos_venta, auth
  x2r get_array(r, :pto_venta), nro: :integer, fch_baja: :date, bloqueado: :boolean
end

#solicitar_caeaObject



93
94
95
96
97
98
99
100
101
# File 'lib/afipws/wsfe.rb', line 93

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

#tipos_comprobantesObject



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

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



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

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_documentosObject



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

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



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

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



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

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



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

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



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

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



131
132
133
# File 'lib/afipws/wsfe.rb', line 131

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