siap_exporter 0.0.1

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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/siap_exporter.rb +211 -0
  3. metadata +73 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bc212a11bfb77c9844ea93aac756caa4bfb7e011
4
+ data.tar.gz: 41198c470adc2ce60d460ac8c2fb3aae22475214
5
+ SHA512:
6
+ metadata.gz: c0aecd73b2e2db4a5777acdde0fa86f9eb4c65d2c8f2fc90e6c8a11c3b56f667c3532cbf2e5e2b6aa6d94d1cd49281978cf5a3b9ba83d263edf732485ecba160
7
+ data.tar.gz: df45f8a32e18ff52f1ab804622044faa9a8e1358795d51ff5a09d87a9a509a2829cc1023735fae47b11f6b9f5541c631e4ea3a68871370c8681bcefffc8fbdc1
@@ -0,0 +1,211 @@
1
+ require 'fixed_width_dsl'
2
+ require 'date'
3
+
4
+ module SiapExporter
5
+ TIPO_COMPROBANTE = {
6
+ 'A' => 1,
7
+ 'B' => 6,
8
+ 'NCA' => 3
9
+ }
10
+ TIPO_ALICUOTA = {
11
+ 5 => [:gravado_21, :iva_21],
12
+ 4 => [:gravado_10, :iva_10]
13
+ }
14
+
15
+ class ComprasVentas
16
+
17
+ AlicuotaVenta = FixedWidthDSL.define do
18
+ field :tipo_comprobante, 3, :integer, '0'
19
+ field :punto_de_venta, 5, :integer, '0'
20
+ field :numero_comprobante, 20, :integer, '0'
21
+ field :gravado, 15, :integer, '0'
22
+ field :tipo_alicuota, 4, :integer, '0'
23
+ field :impuesto, 15, :integer, '0'
24
+ end
25
+
26
+ Venta = FixedWidthDSL.define do
27
+ field :fecha, 8, :integer, '0'
28
+ field :tipo_comprobante, 3, :integer, '0'
29
+ field :punto_de_venta, 5, :integer, '0'
30
+ field :numero_comprobante, 20, :integer, '0'
31
+ field :numero_comprobante_hasta, 20, :integer, '0'
32
+ field :codigo_documento_comprador, 2, :integer, '0'
33
+ field :numero_identificacion_comprador, 20, :integer, '0'
34
+ field :denominacion_comprador, 30, :string, '-'
35
+ field :total, 15, :integer, '0'
36
+ field :no_gravado, 15, :integer, '0'
37
+ field :no_categorizados, 15, :integer, '0'
38
+ field :exento, 15, :integer, '0'
39
+ field :impuestos_nacionales, 15, :integer, '0'
40
+ field :ingresos_brutos, 15, :integer, '0'
41
+ field :impuestos_municipales, 15, :integer, '0'
42
+ field :impuestos_internos, 15, :integer, '0'
43
+ field :moneda, 3, :string, '0'
44
+ field :cambio, 10, :integer, '0'
45
+ field :cantidad_de_alicuotas, 1, :integer, '0'
46
+ field :codigo_de_operacion, 1, :integer, '0'
47
+ field :otros_tributos, 15, :integer, '0'
48
+ field :vencimiento_de_pago, 8, :integer, '0'
49
+ end
50
+
51
+ AlicuotaCompra = FixedWidthDSL.define do
52
+ field :tipo_comprobante, 3, :integer, '0'
53
+ field :punto_de_venta, 5, :integer, '0'
54
+ field :numero_comprobante, 20, :integer, '0'
55
+ field :codigo_documento_vendedor, 2, :integer, '0'
56
+ field :numero_identificacion_vendedor, 20, :integer, '0'
57
+ field :gravado, 15, :integer, '0'
58
+ field :tipo_alicuota, 4, :integer, '0'
59
+ field :impuesto, 15, :integer, '0'
60
+ end
61
+
62
+ Compra = FixedWidthDSL.define do
63
+ field :fecha, 8, :string
64
+ field :tipo_comprobante, 3, :integer, '0'
65
+ field :punto_de_venta, 5, :integer, '0'
66
+ field :numero_comprobante, 20, :integer, '0'
67
+ field :despacho_importacion, 16, :string, '-'
68
+ field :codigo_documento_vendedor, 2, :integer, '0'
69
+ field :numero_identificacion_vendedor, 20, :integer, '0'
70
+ field :denominacion_vendedor, 30, :string, '-'
71
+ field :total, 15, :integer, '0'
72
+ field :no_gravado, 15, :integer, '0'
73
+ field :exento, 15, :integer, '0'
74
+ field :a_cuenta_iva, 15, :integer, '0'
75
+ field :impuestos_nacionales, 15, :integer, '0'
76
+ field :ingresos_brutos, 15, :integer, '0'
77
+ field :impuestos_municipales, 15, :integer, '0'
78
+ field :impuestos_internos, 15, :integer, '0'
79
+ field :moneda, 3, :string, '0'
80
+ field :cambio, 10, :integer, '0'
81
+ field :cantidad_de_alicuotas, 1, :integer, '0'
82
+ field :codigo_de_operacion, 1, :integer, '0'
83
+ field :credito_fiscal, 15, :integer, '0'
84
+ field :otros_tributos, 15, :integer, '0'
85
+ field :cuit_emisor_corredor, 11, :integer, '0'
86
+ field :denominacion_emisor_corredor, 30, :string, '-'
87
+ field :iva_comision, 15, :integer, '0'
88
+ end
89
+
90
+ def self.generate comprobantes
91
+ new(comprobantes).generate
92
+ end
93
+
94
+ def initialize comprobantes
95
+ @comprobantes = comprobantes
96
+ @ventas = []
97
+ @alicuotas_ventas = []
98
+ @compras = []
99
+ @alicuotas_compras = []
100
+ end
101
+
102
+ def generate
103
+ @comprobantes.each do |comprobante|
104
+ if comprobante[:numero_identificacion_comprador]
105
+ # las alicuotas se deben generar antes que la venta, porque la
106
+ # cantidad se indica en el registro de venta
107
+ alicuotas_venta(comprobante)
108
+ venta(comprobante)
109
+ else
110
+ alicuotas_compra(comprobante)
111
+ compra(comprobante)
112
+ end
113
+ end
114
+ {
115
+ ventas: @ventas.join("\n"),
116
+ alicuotas_ventas: @alicuotas_ventas.join("\n"),
117
+ compras: @compras.join("\n"),
118
+ alicuotas_compras: @alicuotas_compras.join("\n")
119
+ }
120
+ end
121
+
122
+ private
123
+
124
+ def alicuotas_venta comprobante
125
+ comprobante[:cantidad_de_alicuotas] = 0
126
+ TIPO_ALICUOTA.each do |id, claves|
127
+ gravado = comprobante[claves[0]]
128
+ if gravado
129
+ alicuota = comprobante.merge(
130
+ tipo_comprobante: tipo_comprobante(comprobante[:tipo_comprobante]),
131
+ gravado: gravado,
132
+ tipo_alicuota: id,
133
+ impuesto: comprobante[claves[1]])
134
+ @alicuotas_ventas << AlicuotaVenta.apply(alicuota)
135
+ comprobante[:cantidad_de_alicuotas] += 1
136
+ end
137
+ end
138
+ end
139
+
140
+ def venta comprobante
141
+ comprobante = comprobante.merge(
142
+ fecha: comprobante[:fecha].gsub('-', ''),
143
+ tipo_comprobante: tipo_comprobante(comprobante[:tipo_comprobante]),
144
+ numero_comprobante_hasta: comprobante[:numero_comprobante],
145
+ codigo_documento_comprador: 80,
146
+ total: total(comprobante),
147
+ no_categorizados: 0,
148
+ impuestos_nacionales: 0,
149
+ ingresos_brutos: 0,
150
+ impuestos_municipales: 0,
151
+ impuestos_internos: 0,
152
+ moneda: 'PES',
153
+ cambio: 1000000,
154
+ codigo_de_operacion: 0,
155
+ otros_tributos: 0,
156
+ vencimiento_de_pago: 0)
157
+ @ventas << Venta.apply(comprobante)
158
+ end
159
+
160
+ def alicuotas_compra comprobante
161
+ comprobante[:cantidad_de_alicuotas] = 0
162
+ TIPO_ALICUOTA.each do |id, claves|
163
+ gravado = comprobante[claves[0]]
164
+ if gravado
165
+ alicuota = comprobante.merge(
166
+ codigo_documento_vendedor: 80,
167
+ tipo_comprobante: tipo_comprobante(comprobante[:tipo_comprobante]),
168
+ gravado: gravado,
169
+ tipo_alicuota: id,
170
+ impuesto: comprobante[claves[1]])
171
+ @alicuotas_compras << AlicuotaCompra.apply(alicuota)
172
+ comprobante[:cantidad_de_alicuotas] += 1
173
+ end
174
+ end
175
+ end
176
+
177
+ def compra comprobante
178
+ comprobante = comprobante.merge(
179
+ fecha: Date.parse(comprobante[:fecha]).strftime('%Y%m%d'),
180
+ tipo_comprobante: tipo_comprobante(comprobante[:tipo_comprobante]),
181
+ despacho_importacion: '',
182
+ codigo_documento_vendedor: 80,
183
+ total: total(comprobante),
184
+ a_cuenta_iva: 0,
185
+ impuestos_nacionales: 0,
186
+ ingresos_brutos: 0,
187
+ impuestos_municipales: 0,
188
+ impuestos_internos: 0,
189
+ moneda: 'PES',
190
+ cambio: 1000000,
191
+ codigo_de_operacion: 0,
192
+ credito_fiscal: 0,
193
+ otros_tributos: 0,
194
+ cuit_emisor_corredor: 0,
195
+ denominacion_emisor_corredor: '',
196
+ iva_comision: 0
197
+ )
198
+ @compras << Compra.apply(comprobante)
199
+ end
200
+
201
+
202
+ def tipo_comprobante tipo
203
+ TIPO_COMPROBANTE.fetch(tipo)
204
+ end
205
+
206
+ def total comprobante
207
+ comprobante.values_at(:gravado_21, :iva_21, :gravado_10, :iva_10,
208
+ :no_gravado, :exento).compact.reduce(0, :+)
209
+ end
210
+ end
211
+ end
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: siap_exporter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Eloy Espinaco
8
+ - Lionel Hsu
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2016-10-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: fixed_width_dsl
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - '='
19
+ - !ruby/object:Gem::Version
20
+ version: 0.1.1
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - '='
26
+ - !ruby/object:Gem::Version
27
+ version: 0.1.1
28
+ - !ruby/object:Gem::Dependency
29
+ name: cutest
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.0'
42
+ description: Ayuda a generar archivos para poder ser importados enel siap desde ruby.
43
+ email: eloyesp@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - lib/siap_exporter.rb
49
+ homepage: https://github.com/bluelemons/siap-exporter
50
+ licenses:
51
+ - AGPL-3.0+
52
+ metadata: {}
53
+ post_install_message:
54
+ rdoc_options: []
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ requirements: []
68
+ rubyforge_project:
69
+ rubygems_version: 2.5.1
70
+ signing_key:
71
+ specification_version: 4
72
+ summary: Exporta archivos para el SIAp de AFIP
73
+ test_files: []