afipws 1.0.3 → 1.0.4

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.
@@ -1,312 +1,325 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Afipws::WSFE do
4
- let(:auth) { {auth: {token: 't', sign: 's', expiration_time: 12.hours.from_now}} }
5
- let(:ws) { Afipws::WSFE.new cuit: '1', wsaa: Afipws::WSAA.new.tap { |wsaa| wsaa.stubs auth: auth } }
6
-
7
- context "Métodos de negocio" do
8
- it "dummy" do
9
- savon.expects(:fe_dummy).returns(fixture('fe_dummy/success'))
10
- ws.dummy.should == { app_server: "OK", db_server: "OK", auth_server: "OK" }
11
- end
12
-
13
- it "tipos_comprobantes" do
14
- savon.expects(:fe_param_get_tipos_cbte).with(message: auth).returns(fixture('fe_param_get_tipos_cbte/success'))
15
- ws.tipos_comprobantes.should == [
16
- { id: 1, desc: "Factura A", fch_desde: Date.new(2010,9,17), fch_hasta: nil },
17
- { id: 2, desc: "Nota de Débito A", fch_desde: Date.new(2010,9,18), fch_hasta: Date.new(2011,9,18) }]
18
- end
19
-
20
- it "tipos_documentos" do
21
- savon.expects(:fe_param_get_tipos_doc).with(message: auth).returns(fixture('fe_param_get_tipos_doc/success'))
22
- ws.tipos_documentos.should == [{ id: 80, desc: "CUIT", fch_desde: Date.new(2008,7,25), fch_hasta: nil }]
23
- end
3
+ module Afipws
4
+ describe WSFE do
5
+ let(:ta) { {token: 't', sign: 's'} }
6
+ let(:ws) { WSFE.new(cuit: '1').tap { |ws| ws.wsaa.stubs auth: ta } }
7
+ let(:auth) { {auth: ta.merge(cuit: '1')} }
8
+
9
+ context 'métodos de negocio' do
10
+ it 'dummy' do
11
+ savon.expects(:fe_dummy).returns(fixture('fe_dummy/success'))
12
+ ws.dummy.should == { app_server: 'OK', db_server: 'OK', auth_server: 'OK' }
13
+ end
24
14
 
25
- it "tipos_monedas" do
26
- savon.expects(:fe_param_get_tipos_monedas).with(message: auth).returns(fixture('fe_param_get_tipos_monedas/success'))
27
- ws.tipos_monedas.should == [
28
- { id: 'PES', desc: "Pesos Argentinos", fch_desde: Date.new(2009,4,3), fch_hasta: nil },
29
- { id: '002', desc: "Dólar Libre EEUU", fch_desde: Date.new(2009,4,16), fch_hasta: nil }]
30
- end
15
+ it 'tipos_comprobantes' do
16
+ savon.expects(:fe_param_get_tipos_cbte).with(message: auth).returns(fixture('fe_param_get_tipos_cbte/success'))
17
+ ws.tipos_comprobantes.should == [
18
+ { id: 1, desc: 'Factura A', fch_desde: Date.new(2010, 9, 17), fch_hasta: nil },
19
+ { id: 2, desc: 'Nota de Débito A', fch_desde: Date.new(2010, 9, 18), fch_hasta: Date.new(2011, 9, 18) }
20
+ ]
21
+ end
31
22
 
32
- it "tipos_iva" do
33
- savon.expects(:fe_param_get_tipos_iva).with(message: auth).returns(fixture('fe_param_get_tipos_iva/success'))
34
- ws.tipos_iva.should == [{ id: 5, desc: "21%", fch_desde: Date.new(2009,2,20), fch_hasta: nil }]
35
- end
23
+ it 'tipos_documentos' do
24
+ savon.expects(:fe_param_get_tipos_doc).with(message: auth).returns(fixture('fe_param_get_tipos_doc/success'))
25
+ ws.tipos_documentos.should == [{ id: 80, desc: 'CUIT', fch_desde: Date.new(2008, 7, 25), fch_hasta: nil }]
26
+ end
36
27
 
37
- it "tipos_tributos" do
38
- savon.expects(:fe_param_get_tipos_tributos).with(message: auth).returns(fixture('fe_param_get_tipos_tributos/success'))
39
- ws.tipos_tributos.should == [{ id: 2, desc: "Impuestos provinciales", fch_desde: Date.new(2010,9,17), fch_hasta: nil }]
40
- end
28
+ it 'tipos_monedas' do
29
+ savon.expects(:fe_param_get_tipos_monedas).with(message: auth).returns(fixture('fe_param_get_tipos_monedas/success'))
30
+ ws.tipos_monedas.should == [
31
+ { id: 'PES', desc: 'Pesos Argentinos', fch_desde: Date.new(2009, 4, 3), fch_hasta: nil },
32
+ { id: '002', desc: 'Dólar Libre EEUU', fch_desde: Date.new(2009, 4, 16), fch_hasta: nil }
33
+ ]
34
+ end
41
35
 
42
- it "puntos_venta" do
43
- savon.expects(:fe_param_get_ptos_venta).with(message: auth).returns(fixture('fe_param_get_ptos_venta/success'))
44
- ws.puntos_venta.should == [
45
- { nro: 1, emision_tipo: "CAE", bloqueado: false, fch_baja: nil },
46
- { nro: 2, emision_tipo: "CAEA", bloqueado: true, fch_baja: Date.new(2011,1,31) }]
47
- end
36
+ it 'tipos_iva' do
37
+ savon.expects(:fe_param_get_tipos_iva).with(message: auth).returns(fixture('fe_param_get_tipos_iva/success'))
38
+ ws.tipos_iva.should == [{ id: 5, desc: '21%', fch_desde: Date.new(2009, 2, 20), fch_hasta: nil }]
39
+ end
48
40
 
49
- context "cotizacion" do
50
- it "cuando la moneda solicitada existe" do
51
- savon.expects(:fe_param_get_cotizacion).with(message: auth.merge(mon_id: 'DOL')).returns(fixture('fe_param_get_cotizacion/dolar'))
52
- ws.cotizacion('DOL').should == 3.976
41
+ it 'tipos_tributos' do
42
+ savon.expects(:fe_param_get_tipos_tributos).with(message: auth).returns(fixture('fe_param_get_tipos_tributos/success'))
43
+ ws.tipos_tributos.should == [{ id: 2, desc: 'Impuestos provinciales', fch_desde: Date.new(2010, 9, 17), fch_hasta: nil }]
53
44
  end
54
45
 
55
- it "cuando la moneda no existe" do
56
- savon.expects(:fe_param_get_cotizacion).with(message: auth.merge(mon_id: 'PES')).returns(fixture('fe_param_get_cotizacion/inexistente'))
57
- lambda { ws.cotizacion('PES') }.should raise_error Afipws::WSError, /602: Sin Resultados/
46
+ it 'puntos_venta' do
47
+ savon.expects(:fe_param_get_ptos_venta).with(message: auth).returns(fixture('fe_param_get_ptos_venta/success'))
48
+ ws.puntos_venta.should == [
49
+ { nro: 1, emision_tipo: 'CAE', bloqueado: false, fch_baja: nil },
50
+ { nro: 2, emision_tipo: 'CAEA', bloqueado: true, fch_baja: Date.new(2011, 1, 31) }
51
+ ]
58
52
  end
59
- end
60
53
 
61
- it "cant_max_registros_x_lote" do
62
- savon.expects(:fe_comp_tot_x_request).with(message: auth).returns(fixture('fe_comp_tot_x_request/success'))
63
- ws.cant_max_registros_x_lote.should == 250
64
- end
54
+ context 'cotizacion' do
55
+ it 'cuando la moneda solicitada existe' do
56
+ savon.expects(:fe_param_get_cotizacion).with(message: auth.merge(mon_id: 'DOL')).returns(fixture('fe_param_get_cotizacion/dolar'))
57
+ ws.cotizacion('DOL').should == 3.976
58
+ end
65
59
 
66
- context "autorizar_comprobante" do
67
- it "debería devolver un hash con el CAE y su fecha de vencimiento" do
68
- savon.expects(:fecae_solicitar).with(message: has_path(
69
- '//Auth/Token' => 't',
70
- '//FeCAEReq/FeCabReq/CantReg' => 1,
71
- '//FeCAEReq/FeCabReq/PtoVta' => 2,
72
- '//FeCAEReq/FeCabReq/CbteTipo' => 1,
73
- '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/DocTipo' => 80,
74
- '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/DocNro' => 30521189203,
75
- '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/CbteFch' => 20110113,
76
- '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/ImpTotal' => 1270.48,
77
- '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/ImpIVA' => 220.5,
78
- '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Iva/AlicIva[1]/Id' => 5,
79
- '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Iva/AlicIva[1]/Importe' => 220.5,
80
- '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Tributos/Tributo[1]/Id' => 0,
81
- '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Tributos/Tributo[1]/BaseImp' => 150,
82
- '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Tributos/Tributo[1]/Alic' => 5.2,
83
- '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Tributos/Tributo[1]/Importe' => 7.8
84
- )).returns(fixture('fecae_solicitar/autorizacion_1_cbte'))
85
- rta = ws.autorizar_comprobantes(cbte_tipo: 1, pto_vta: 2, comprobantes: [{cbte_nro: 1, concepto: 1,
86
- doc_nro: 30521189203, doc_tipo: 80, cbte_fch: Date.new(2011,01,13),
87
- imp_total: 1270.48, imp_neto: 1049.98, imp_iva: 220.50, mon_id: 'PES', mon_cotiz: 1,
88
- iva: { alic_iva: [{ id: 5, base_imp: 1049.98, importe: 220.50 }]},
89
- tributos: { tributo: [{ id: 0, base_imp: 150, alic: 5.2, importe: 7.8 }] }
90
- }])
91
- rta[0].should have_entries cae: '61023008595705', cae_fch_vto: Date.new(2011,01,23), cbte_nro: 1,
92
- resultado: 'A', observaciones: []
93
- rta.size.should == 1
60
+ it 'cuando la moneda no existe' do
61
+ savon.expects(:fe_param_get_cotizacion).with(message: auth.merge(mon_id: 'PES')).returns(fixture('fe_param_get_cotizacion/inexistente'))
62
+ -> { ws.cotizacion('PES') }.should raise_error WSError, /602: Sin Resultados/
63
+ end
94
64
  end
95
65
 
96
- it "con varias alicuotas iva" do
97
- savon.expects(:fecae_solicitar).with(message: has_path(
98
- '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Iva/AlicIva[1]/Id' => 5,
99
- '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Iva/AlicIva[1]/Importe' => 21,
100
- '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Iva/AlicIva[2]/Id' => 4,
101
- '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Iva/AlicIva[2]/Importe' => 5.25
102
- )).returns(fixture('fecae_solicitar/autorizacion_1_cbte'))
103
- ws.autorizar_comprobantes(cbte_tipo: 1, pto_vta: 2, comprobantes: [{iva: {alic_iva: [
66
+ it 'cant_max_registros_x_lote' do
67
+ savon.expects(:fe_comp_tot_x_request).with(message: auth).returns(fixture('fe_comp_tot_x_request/success'))
68
+ ws.cant_max_registros_x_lote.should == 250
69
+ end
70
+
71
+ context 'autorizar_comprobante' do
72
+ it 'debería devolver un hash con el CAE y su fecha de vencimiento' do
73
+ savon.expects(:fecae_solicitar).with(message: has_path(
74
+ '//Auth/Token' => 't',
75
+ '//FeCAEReq/FeCabReq/CantReg' => 1,
76
+ '//FeCAEReq/FeCabReq/PtoVta' => 2,
77
+ '//FeCAEReq/FeCabReq/CbteTipo' => 1,
78
+ '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/DocTipo' => 80,
79
+ '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/DocNro' => 30_521_189_203,
80
+ '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/CbteFch' => 20_110_113,
81
+ '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/ImpTotal' => 1270.48,
82
+ '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/ImpIVA' => 220.5,
83
+ '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Iva/AlicIva[1]/Id' => 5,
84
+ '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Iva/AlicIva[1]/Importe' => 220.5,
85
+ '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Tributos/Tributo[1]/Id' => 0,
86
+ '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Tributos/Tributo[1]/BaseImp' => 150,
87
+ '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Tributos/Tributo[1]/Alic' => 5.2,
88
+ '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Tributos/Tributo[1]/Importe' => 7.8
89
+ )).returns(fixture('fecae_solicitar/autorizacion_1_cbte'))
90
+ rta = ws.autorizar_comprobantes(cbte_tipo: 1, pto_vta: 2, comprobantes: [
91
+ {
92
+ cbte_nro: 1, concepto: 1, doc_nro: 30_521_189_203, doc_tipo: 80, cbte_fch: Date.new(2011, 0o1, 13),
93
+ imp_total: 1270.48, imp_neto: 1049.98, imp_iva: 220.50, mon_id: 'PES', mon_cotiz: 1,
94
+ iva: { alic_iva: [{ id: 5, base_imp: 1049.98, importe: 220.50 }]},
95
+ tributos: { tributo: [{ id: 0, base_imp: 150, alic: 5.2, importe: 7.8 }] }
96
+ }
97
+ ])
98
+ rta[0].should have_entries cae: '61023008595705', cae_fch_vto: Date.new(2011, 0o1, 23), cbte_nro: 1,
99
+ resultado: 'A', observaciones: []
100
+ rta.size.should == 1
101
+ end
102
+
103
+ it 'con varias alicuotas iva' do
104
+ savon.expects(:fecae_solicitar).with(message: has_path(
105
+ '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Iva/AlicIva[1]/Id' => 5,
106
+ '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Iva/AlicIva[1]/Importe' => 21,
107
+ '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Iva/AlicIva[2]/Id' => 4,
108
+ '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/Iva/AlicIva[2]/Importe' => 5.25
109
+ )).returns(fixture('fecae_solicitar/autorizacion_1_cbte'))
110
+ ws.autorizar_comprobantes(cbte_tipo: 1, pto_vta: 2, comprobantes: [{iva: {alic_iva: [
104
111
  { id: 5, base_imp: 100, importe: 21 },
105
112
  { id: 4, base_imp: 50, importe: 5.25 }
106
- ]}}])
107
- end
113
+ ]}}])
114
+ end
108
115
 
109
- it "con varios comprobantes aprobados" do
110
- savon.expects(:fecae_solicitar).with(message: has_path(
111
- '//FeCAEReq/FeCabReq/CantReg' => 2,
112
- '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/CbteDesde' => 5,
113
- '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/CbteHasta' => 5,
114
- '//FeCAEReq/FeDetReq/FECAEDetRequest[2]/CbteDesde' => 6,
115
- '//FeCAEReq/FeDetReq/FECAEDetRequest[2]/CbteHasta' => 6,
116
- )).returns(fixture('fecae_solicitar/autorizacion_2_cbtes'))
117
- rta = ws.autorizar_comprobantes(cbte_tipo: 1, pto_vta: 2, comprobantes: [{ cbte_nro: 5 }, { cbte_nro: 6 }])
118
- rta[0].should have_entries cbte_nro: 5, cae: '61033008894096'
119
- rta[1].should have_entries cbte_nro: 6, cae: '61033008894101'
120
- end
116
+ it 'con varios comprobantes aprobados' do
117
+ savon.expects(:fecae_solicitar).with(message: has_path(
118
+ '//FeCAEReq/FeCabReq/CantReg' => 2,
119
+ '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/CbteDesde' => 5,
120
+ '//FeCAEReq/FeDetReq/FECAEDetRequest[1]/CbteHasta' => 5,
121
+ '//FeCAEReq/FeDetReq/FECAEDetRequest[2]/CbteDesde' => 6,
122
+ '//FeCAEReq/FeDetReq/FECAEDetRequest[2]/CbteHasta' => 6
123
+ )).returns(fixture('fecae_solicitar/autorizacion_2_cbtes'))
124
+ rta = ws.autorizar_comprobantes(cbte_tipo: 1, pto_vta: 2, comprobantes: [{ cbte_nro: 5 }, { cbte_nro: 6 }])
125
+ rta[0].should have_entries cbte_nro: 5, cae: '61033008894096'
126
+ rta[1].should have_entries cbte_nro: 6, cae: '61033008894101'
127
+ end
121
128
 
122
- it "con 2 observaciones" do
123
- savon.expects(:fecae_solicitar).with(message: :any).returns(fixture 'fecae_solicitar/dos_observaciones')
124
- rta = ws.autorizar_comprobantes comprobantes: []
125
- rta[0].should have_entries cbte_nro: 3, cae: nil, resultado: 'R', observaciones: [
126
- {code: 10048, msg: 'Msg 1'}, {code: 10018, msg: 'Msg 2'}]
127
- end
129
+ it 'con 2 observaciones' do
130
+ savon.expects(:fecae_solicitar).with(message: :any).returns(fixture('fecae_solicitar/dos_observaciones'))
131
+ rta = ws.autorizar_comprobantes comprobantes: []
132
+ rta[0].should have_entries cbte_nro: 3, cae: nil, resultado: 'R', observaciones: [
133
+ {code: 10_048, msg: 'Msg 1'}, {code: 10_018, msg: 'Msg 2'}
134
+ ]
135
+ end
128
136
 
129
- it "con 1 observación" do
130
- savon.expects(:fecae_solicitar).with(message: :any).returns(fixture 'fecae_solicitar/una_observacion')
131
- rta = ws.autorizar_comprobantes comprobantes: []
132
- rta[0].should have_entries observaciones: [{code: 10048, msg: 'Msg 1'}]
137
+ it 'con 1 observación' do
138
+ savon.expects(:fecae_solicitar).with(message: :any).returns(fixture('fecae_solicitar/una_observacion'))
139
+ rta = ws.autorizar_comprobantes comprobantes: []
140
+ rta[0].should have_entries observaciones: [{code: 10_048, msg: 'Msg 1'}]
141
+ end
133
142
  end
134
- end
135
143
 
136
- context "solicitar_caea" do
137
- it "debería mandar automáticamente el período y orden" do
138
- Date.stubs today: Date.new(2011,1,27)
139
- savon.expects(:fecaea_solicitar).with(message: has_path('//Periodo' => '201102', '//Orden' => 1)).returns(fixture 'fecaea_solicitar/success')
140
- ws.solicitar_caea.should have_entries caea: '21043476341977', fch_tope_inf: Date.new(2011,03,17),
141
- fch_vig_desde: Date.new(2011,02,01), fch_vig_hasta: Date.new(2011,02,15)
142
- end
144
+ context 'solicitar_caea' do
145
+ it 'debería mandar automáticamente el período y orden' do
146
+ Date.stubs today: Date.new(2011, 1, 27)
147
+ savon.expects(:fecaea_solicitar).with(message: has_path('//Periodo' => '201102', '//Orden' => 1)).returns(fixture('fecaea_solicitar/success'))
148
+ ws.solicitar_caea.should have_entries caea: '21043476341977', fch_tope_inf: Date.new(2011, 0o3, 17),
149
+ fch_vig_desde: Date.new(2011, 0o2, 0o1), fch_vig_hasta: Date.new(2011, 0o2, 15)
150
+ end
143
151
 
144
- context "periodo_para_solicitud_caea" do
145
- it "cuando estoy en la primer quincena" do
146
- Date.stubs today: Date.new(2011,1,12)
147
- ws.periodo_para_solicitud_caea.should == { periodo: '201101', orden: 2 }
148
- Date.stubs today: Date.new(2011,1,15)
149
- ws.periodo_para_solicitud_caea.should == { periodo: '201101', orden: 2 }
152
+ context 'periodo_para_solicitud_caea' do
153
+ it 'cuando estoy en la primer quincena' do
154
+ Date.stubs today: Date.new(2011, 1, 12)
155
+ ws.periodo_para_solicitud_caea.should == { periodo: '201101', orden: 2 }
156
+ Date.stubs today: Date.new(2011, 1, 15)
157
+ ws.periodo_para_solicitud_caea.should == { periodo: '201101', orden: 2 }
158
+ end
159
+
160
+ it 'cuando estoy en la segunda quincena' do
161
+ Date.stubs today: Date.new(2011, 1, 16)
162
+ ws.periodo_para_solicitud_caea.should == { periodo: '201102', orden: 1 }
163
+ Date.stubs today: Date.new(2011, 1, 31)
164
+ ws.periodo_para_solicitud_caea.should == { periodo: '201102', orden: 1 }
165
+ end
150
166
  end
151
167
 
152
- it "cuando estoy en la segunda quincena" do
153
- Date.stubs today: Date.new(2011,1,16)
154
- ws.periodo_para_solicitud_caea.should == { periodo: '201102', orden: 1 }
155
- Date.stubs today: Date.new(2011,1,31)
156
- ws.periodo_para_solicitud_caea.should == { periodo: '201102', orden: 1 }
168
+ it 'cuando el caea ya fue otorgado debería consultarlo y devolverlo' do
169
+ Date.stubs today: Date.new(2011, 1, 27)
170
+ savon.expects(:fecaea_solicitar)
171
+ .with(message: has_path('//Periodo' => '201102', '//Orden' => 1))
172
+ .returns(fixture('fecaea_solicitar/caea_ya_otorgado'))
173
+ savon.expects(:fecaea_consultar)
174
+ .with(message: has_path('//Periodo' => '201102', '//Orden' => 1))
175
+ .returns(fixture('fecaea_consultar/success'))
176
+ ws.solicitar_caea.should have_entries caea: '21043476341977', fch_vig_desde: Date.new(2011, 0o2, 0o1)
157
177
  end
158
- end
159
178
 
160
- it "cuando el caea ya fue otorgado debería consultarlo y devolverlo" do
161
- Date.stubs today: Date.new(2011,1,27)
162
- savon.expects(:fecaea_solicitar).with(message: has_path('//Periodo' => '201102', '//Orden' => 1)).returns(fixture 'fecaea_solicitar/caea_ya_otorgado')
163
- savon.expects(:fecaea_consultar).with(message: has_path('//Periodo' => '201102', '//Orden' => 1)).returns(fixture 'fecaea_consultar/success')
164
- ws.solicitar_caea.should have_entries caea: '21043476341977', fch_vig_desde: Date.new(2011,02,01)
179
+ it 'cuando hay otro error debería burbujearlo' do
180
+ savon.expects(:fecaea_solicitar).with(message: :any).returns(fixture('fecaea_solicitar/error_distinto'))
181
+ -> { ws.solicitar_caea }.should raise_error WSError, /15007/
182
+ end
165
183
  end
166
184
 
167
- it "cuando hay otro error debería burbujearlo" do
168
- savon.expects(:fecaea_solicitar).with(message: :any).returns(fixture 'fecaea_solicitar/error_distinto')
169
- lambda { ws.solicitar_caea }.should raise_error Afipws::WSError, /15007/
185
+ it 'informar_comprobantes_caea' do
186
+ savon.expects(:fecaea_reg_informativo).with(message: has_path(
187
+ '//Auth/Token' => 't',
188
+ '//FeCAEARegInfReq/FeCabReq/CantReg' => 2,
189
+ '//FeCAEARegInfReq/FeCabReq/PtoVta' => 3,
190
+ '//FeCAEARegInfReq/FeCabReq/CbteTipo' => 1,
191
+ '//FeCAEARegInfReq/FeDetReq/FECAEADetRequest[1]/CbteDesde' => 1,
192
+ '//FeCAEARegInfReq/FeDetReq/FECAEADetRequest[1]/CbteHasta' => 1,
193
+ '//FeCAEARegInfReq/FeDetReq/FECAEADetRequest[1]/CAEA' => '21043476341977',
194
+ '//FeCAEARegInfReq/FeDetReq/FECAEADetRequest[2]/CbteDesde' => 2,
195
+ '//FeCAEARegInfReq/FeDetReq/FECAEADetRequest[2]/CbteHasta' => 2,
196
+ '//FeCAEARegInfReq/FeDetReq/FECAEADetRequest[2]/CAEA' => '21043476341977'
197
+ )).returns(fixture('fecaea_reg_informativo/informe_rtdo_parcial'))
198
+ rta = ws.informar_comprobantes_caea(cbte_tipo: 1, pto_vta: 3, comprobantes: [
199
+ { cbte_nro: 1, caea: '21043476341977' }, { cbte_nro: 2, caea: '21043476341977' }
200
+ ])
201
+ rta[0].should have_entries cbte_nro: 1, caea: '21043476341977', resultado: 'A', observaciones: []
202
+ rta[1].should have_entries cbte_nro: 2, caea: '21043476341977', resultado: 'R', observaciones: [{code: 724, msg: 'Msg'}]
170
203
  end
171
- end
172
-
173
- it "informar_comprobantes_caea" do
174
- savon.expects(:fecaea_reg_informativo).with(message: has_path(
175
- '//Auth/Token' => 't',
176
- '//FeCAEARegInfReq/FeCabReq/CantReg' => 2,
177
- '//FeCAEARegInfReq/FeCabReq/PtoVta' => 3,
178
- '//FeCAEARegInfReq/FeCabReq/CbteTipo' => 1,
179
- '//FeCAEARegInfReq/FeDetReq/FECAEADetRequest[1]/CbteDesde' => 1,
180
- '//FeCAEARegInfReq/FeDetReq/FECAEADetRequest[1]/CbteHasta' => 1,
181
- '//FeCAEARegInfReq/FeDetReq/FECAEADetRequest[1]/CAEA' => '21043476341977',
182
- '//FeCAEARegInfReq/FeDetReq/FECAEADetRequest[2]/CbteDesde' => 2,
183
- '//FeCAEARegInfReq/FeDetReq/FECAEADetRequest[2]/CbteHasta' => 2,
184
- '//FeCAEARegInfReq/FeDetReq/FECAEADetRequest[2]/CAEA' => '21043476341977',
185
- )).returns(fixture 'fecaea_reg_informativo/informe_rtdo_parcial')
186
- rta = ws.informar_comprobantes_caea(cbte_tipo: 1, pto_vta: 3, comprobantes: [
187
- { cbte_nro: 1, caea: '21043476341977' }, { cbte_nro: 2, caea: '21043476341977' },
188
- ])
189
- rta[0].should have_entries cbte_nro: 1, caea: '21043476341977', resultado: 'A', observaciones: []
190
- rta[1].should have_entries cbte_nro: 2, caea: '21043476341977', resultado: 'R', observaciones: [{code: 724, msg: 'Msg'}]
191
- end
192
204
 
193
- it "informar_caea_sin_movimientos" do
194
- savon.expects(:fecaea_sin_movimiento_informar).with(message: has_path(
195
- '//Auth/Token' => 't',
196
- '//PtoVta' => 4,
197
- '//CAEA' => '21043476341977'
198
- )).returns(fixture 'fecaea_sin_movimiento_informar/success')
199
- rta = ws.informar_caea_sin_movimientos('21043476341977', 4)
200
- rta.should have_entries caea: '21043476341977', resultado: 'A'
201
- end
205
+ it 'informar_caea_sin_movimientos' do
206
+ savon.expects(:fecaea_sin_movimiento_informar).with(message: has_path(
207
+ '//Auth/Token' => 't',
208
+ '//PtoVta' => 4,
209
+ '//CAEA' => '21043476341977'
210
+ )).returns(fixture('fecaea_sin_movimiento_informar/success'))
211
+ rta = ws.informar_caea_sin_movimientos('21043476341977', 4)
212
+ rta.should have_entries caea: '21043476341977', resultado: 'A'
213
+ end
202
214
 
203
- context "consultar_caea" do
204
- it "consultar_caea" do
205
- savon.expects(:fecaea_consultar).with(message: has_path('//Periodo' => '201101', '//Orden' => 1)).returns(fixture 'fecaea_consultar/success')
206
- ws.consultar_caea(Date.new(2011,1,1)).should have_entries caea: '21043476341977', fch_tope_inf: Date.new(2011,03,17)
215
+ context 'consultar_caea' do
216
+ it 'consultar_caea' do
217
+ savon.expects(:fecaea_consultar).with(message: has_path('//Periodo' => '201101', '//Orden' => 1)).returns(fixture('fecaea_consultar/success'))
218
+ ws.consultar_caea(Date.new(2011, 1, 1)).should have_entries caea: '21043476341977', fch_tope_inf: Date.new(2011, 0o3, 17)
219
+ end
207
220
  end
208
- end
209
221
 
210
- it "ultimo_comprobante_autorizado" do
211
- savon.expects(:fe_comp_ultimo_autorizado).with(message: has_path('//PtoVta' => 1, '//CbteTipo' => 1)).returns(fixture 'fe_comp_ultimo_autorizado/success')
212
- ws.ultimo_comprobante_autorizado(pto_vta: 1, cbte_tipo: 1).should == 20
213
- end
222
+ it 'ultimo_comprobante_autorizado' do
223
+ savon.expects(:fe_comp_ultimo_autorizado).with(message: has_path('//PtoVta' => 1, '//CbteTipo' => 1)).returns(fixture('fe_comp_ultimo_autorizado/success'))
224
+ ws.ultimo_comprobante_autorizado(pto_vta: 1, cbte_tipo: 1).should == 20
225
+ end
214
226
 
215
- it "consultar_comprobante" do
216
- savon.expects(:fe_comp_consultar).with(message: has_path(
217
- '//Auth/Token' => 't', '//FeCompConsReq/PtoVta' => 1, '//FeCompConsReq/CbteTipo' => 2, '//FeCompConsReq/CbteNro' => 3
218
- )).returns(fixture 'fe_comp_consultar/success')
219
- rta = ws.consultar_comprobante(pto_vta: 1, cbte_tipo: 2, cbte_nro: 3)
220
- rta[:cod_autorizacion].should == '61023008595705'
221
- rta[:emision_tipo].should == 'CAE'
227
+ it 'consultar_comprobante' do
228
+ savon.expects(:fe_comp_consultar).with(message: has_path(
229
+ '//Auth/Token' => 't', '//FeCompConsReq/PtoVta' => 1, '//FeCompConsReq/CbteTipo' => 2, '//FeCompConsReq/CbteNro' => 3
230
+ )).returns(fixture('fe_comp_consultar/success'))
231
+ rta = ws.consultar_comprobante(pto_vta: 1, cbte_tipo: 2, cbte_nro: 3)
232
+ rta[:cod_autorizacion].should == '61023008595705'
233
+ rta[:emision_tipo].should == 'CAE'
234
+ end
222
235
  end
223
- end
224
236
 
225
- context "autenticacion" do
226
- before { FileUtils.rm_rf Dir.glob('tmp/*ta.dump') }
227
-
228
- it "debería autenticarse usando el WSAA" do
229
- wsfe = Afipws::WSFE.new cuit: '1', cert: 'cert', key: 'key'
230
- wsfe.wsaa.cert.should == 'cert'
231
- wsfe.wsaa.key.should == 'key'
232
- wsfe.wsaa.service.should == 'wsfe'
233
- wsfe.wsaa.expects(:login).returns({token: 't', sign: 's'})
234
- savon.expects(:fe_param_get_tipos_cbte).with(message: has_path(
235
- '//Auth/Token' => 't', '//Auth/Sign' => 's', '//Auth/Cuit' => '1'
236
- )).returns(fixture 'fe_param_get_tipos_cbte/success')
237
- wsfe.tipos_comprobantes
237
+ context 'autenticacion' do
238
+ before { FileUtils.rm_rf Dir.glob('tmp/*ta.dump') }
239
+
240
+ it 'debería autenticarse usando el WSAA' do
241
+ wsfe = WSFE.new cuit: '1', cert: 'cert', key: 'key'
242
+ wsfe.wsaa.cert.should == 'cert'
243
+ wsfe.wsaa.key.should == 'key'
244
+ wsfe.wsaa.service.should == 'wsfe'
245
+ wsfe.wsaa.expects(:login).returns(token: 't', sign: 's')
246
+ savon.expects(:fe_param_get_tipos_cbte).with(message: has_path(
247
+ '//Auth/Token' => 't', '//Auth/Sign' => 's', '//Auth/Cuit' => '1'
248
+ )).returns(fixture('fe_param_get_tipos_cbte/success'))
249
+ wsfe.tipos_comprobantes
250
+ end
238
251
  end
239
- end
240
252
 
241
- context "entorno" do
242
- it "debería usar las url para development cuando el env es development" do
243
- Afipws::Client.expects(:new).with(wsdl: 'https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl')
244
- Afipws::Client.expects(:new).with(wsdl: 'https://wswhomo.afip.gov.ar/wsfev1/service.asmx?WSDL', ssl_version: :TLSv1, convert_request_keys_to: :camelcase)
245
- wsfe = Afipws::WSFE.new env: :development
246
- wsfe.env.should == :development
247
- end
253
+ context 'entorno' do
254
+ it 'debería usar las url para development cuando el env es development' do
255
+ Client.expects(:new).with(wsdl: 'https://wsaahomo.afip.gov.ar/ws/services/LoginCms?wsdl')
256
+ Client.expects(:new).with(wsdl: 'https://wswhomo.afip.gov.ar/wsfev1/service.asmx?WSDL', convert_request_keys_to: :camelcase)
257
+ wsfe = WSFE.new env: :development
258
+ wsfe.env.should == :development
259
+ end
248
260
 
249
- it "debería usar las url para production cuando el env es production" do
250
- Afipws::Client.expects(:new).with(wsdl: 'https://wsaa.afip.gov.ar/ws/services/LoginCms?wsdl')
251
- Afipws::Client.expects(:new).with(has_entries wsdl: File.expand_path(File.dirname(__FILE__) + '/../../') + "/lib/afipws/wsfev1.wsdl")
252
- wsfe = Afipws::WSFE.new env: 'production'
253
- wsfe.env.should == :production
261
+ it 'debería usar las url para production cuando el env es production' do
262
+ Client.expects(:new).with(wsdl: 'https://wsaa.afip.gov.ar/ws/services/LoginCms?wsdl')
263
+ Client.expects(:new).with(has_entries(wsdl: File.expand_path(__dir__ + '/../../') + '/lib/afipws/wsdl/wsfev1.wsdl'))
264
+ wsfe = WSFE.new env: 'production'
265
+ wsfe.env.should == :production
266
+ end
254
267
  end
255
- end
256
268
 
257
- context "manejo de errores" do
258
- it "cuando hay un error" do
259
- savon.expects(:fe_param_get_tipos_cbte).with(message: :any).returns(fixture 'fe_param_get_tipos_cbte/failure_1_error')
260
- lambda { ws.tipos_comprobantes }.should raise_error { |e|
261
- e.should be_a Afipws::WSError
262
- e.errors.should == [{ code: "600", msg: "No se corresponden token con firma" }]
263
- e.message.should == "600: No se corresponden token con firma"
264
- }
265
- end
269
+ context 'manejo de errores' do
270
+ it 'cuando hay un error' do
271
+ savon.expects(:fe_param_get_tipos_cbte).with(message: :any).returns(fixture('fe_param_get_tipos_cbte/failure_1_error'))
272
+ -> { ws.tipos_comprobantes }.should raise_error { |e|
273
+ e.should be_a WSError
274
+ e.errors.should == [{ code: '600', msg: 'No se corresponden token con firma' }]
275
+ e.message.should == '600: No se corresponden token con firma'
276
+ }
277
+ end
266
278
 
267
- it "cuando hay varios errores" do
268
- savon.expects(:fe_param_get_tipos_cbte).with(message: :any).returns(fixture 'fe_param_get_tipos_cbte/failure_2_errors')
269
- lambda { ws.tipos_comprobantes }.should raise_error { |e|
270
- e.should be_a Afipws::WSError
271
- e.errors.should == [{ code: "600", msg: "No se corresponden token con firma" }, { code: "601", msg: "CUIT representada no incluida en token" }]
272
- e.message.should == "600: No se corresponden token con firma; 601: CUIT representada no incluida en token"
273
- }
279
+ it 'cuando hay varios errores' do
280
+ savon.expects(:fe_param_get_tipos_cbte).with(message: :any).returns(fixture('fe_param_get_tipos_cbte/failure_2_errors'))
281
+ -> { ws.tipos_comprobantes }.should raise_error { |e|
282
+ e.should be_a WSError
283
+ e.errors.should == [{ code: '600', msg: 'No se corresponden token con firma' }, { code: '601', msg: 'CUIT representada no incluida en token' }]
284
+ e.message.should == '600: No se corresponden token con firma; 601: CUIT representada no incluida en token'
285
+ }
286
+ end
274
287
  end
275
- end
276
288
 
277
- context "cálculo de fechas y períodos" do
278
- it "periodo_para_consulta_caea" do
279
- ws.periodo_para_consulta_caea(Date.new(2011,1,1)).should == { periodo: '201101', orden: 1 }
280
- ws.periodo_para_consulta_caea(Date.new(2011,1,15)).should == { periodo: '201101', orden: 1 }
281
- ws.periodo_para_consulta_caea(Date.new(2011,1,16)).should == { periodo: '201101', orden: 2 }
282
- ws.periodo_para_consulta_caea(Date.new(2011,1,31)).should == { periodo: '201101', orden: 2 }
283
- ws.periodo_para_consulta_caea(Date.new(2011,2,2)).should == { periodo: '201102', orden: 1 }
284
- end
289
+ context 'cálculo de fechas y períodos' do
290
+ it 'periodo_para_consulta_caea' do
291
+ ws.periodo_para_consulta_caea(Date.new(2011, 1, 1)).should == { periodo: '201101', orden: 1 }
292
+ ws.periodo_para_consulta_caea(Date.new(2011, 1, 15)).should == { periodo: '201101', orden: 1 }
293
+ ws.periodo_para_consulta_caea(Date.new(2011, 1, 16)).should == { periodo: '201101', orden: 2 }
294
+ ws.periodo_para_consulta_caea(Date.new(2011, 1, 31)).should == { periodo: '201101', orden: 2 }
295
+ ws.periodo_para_consulta_caea(Date.new(2011, 2, 2)).should == { periodo: '201102', orden: 1 }
296
+ end
285
297
 
286
- it "fecha_inicio_quincena_siguiente" do
287
- fecha_inicio_quincena_siguiente(Date.new(2010,1,1)).should == Date.new(2010,1,16)
288
- fecha_inicio_quincena_siguiente(Date.new(2010,1,10)).should == Date.new(2010,1,16)
289
- fecha_inicio_quincena_siguiente(Date.new(2010,1,15)).should == Date.new(2010,1,16)
298
+ it 'fecha_inicio_quincena_siguiente' do
299
+ fecha_inicio_quincena_siguiente(Date.new(2010, 1, 1)).should == Date.new(2010, 1, 16)
300
+ fecha_inicio_quincena_siguiente(Date.new(2010, 1, 10)).should == Date.new(2010, 1, 16)
301
+ fecha_inicio_quincena_siguiente(Date.new(2010, 1, 15)).should == Date.new(2010, 1, 16)
290
302
 
291
- fecha_inicio_quincena_siguiente(Date.new(2010,1,16)).should == Date.new(2010,2,1)
292
- fecha_inicio_quincena_siguiente(Date.new(2010,1,20)).should == Date.new(2010,2,1)
293
- fecha_inicio_quincena_siguiente(Date.new(2010,1,31)).should == Date.new(2010,2,1)
294
- fecha_inicio_quincena_siguiente(Date.new(2010,12,31)).should == Date.new(2011,1,1)
295
- end
303
+ fecha_inicio_quincena_siguiente(Date.new(2010, 1, 16)).should == Date.new(2010, 2, 1)
304
+ fecha_inicio_quincena_siguiente(Date.new(2010, 1, 20)).should == Date.new(2010, 2, 1)
305
+ fecha_inicio_quincena_siguiente(Date.new(2010, 1, 31)).should == Date.new(2010, 2, 1)
306
+ fecha_inicio_quincena_siguiente(Date.new(2010, 12, 31)).should == Date.new(2011, 1, 1)
307
+ end
296
308
 
297
- def fecha_inicio_quincena_siguiente fecha
298
- Date.stubs(today: fecha)
299
- subject.fecha_inicio_quincena_siguiente
309
+ def fecha_inicio_quincena_siguiente fecha
310
+ Date.stubs(today: fecha)
311
+ subject.fecha_inicio_quincena_siguiente
312
+ end
300
313
  end
301
- end
302
314
 
303
- context "comprobante_to_request" do
304
- def c2r comprobante
305
- subject.comprobante_to_request comprobante
306
- end
315
+ context 'comprobante_to_request' do
316
+ def c2r comprobante
317
+ subject.comprobante_to_request comprobante
318
+ end
307
319
 
308
- it "no debería enviar tag tributos si el impTrib es 0" do
309
- c2r(imp_trib: 0.0, tributos: { tributo: [] }).should_not have_key :tributos
320
+ it 'no debería enviar tag tributos si el impTrib es 0' do
321
+ c2r(imp_trib: 0.0, tributos: { tributo: [] }).should_not have_key :tributos
322
+ end
310
323
  end
311
324
  end
312
325
  end