cfdi40 0.0.8 → 0.1.0
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 +4 -4
- data/Gemfile.lock +1 -1
- data/README_es-MX.md +27 -0
- data/lib/cfdi40/comprobante.rb +13 -12
- data/lib/cfdi40/concepto.rb +15 -1
- data/lib/cfdi40/conceptos.rb +5 -0
- data/lib/cfdi40/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf7ce0ac8de4ab678da94ef6a052c68ea8a403c0b9c349b252654d4bf9771cde
|
4
|
+
data.tar.gz: bc02e70bc14b70576f178b3fed467970d36cc6f72693e9bc78415963cab435e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a2b13b7fccfdf28774032f0b7e9b95028d7b96c0d6803d1f04b547f26435a0532f7b43c1644ae1309fe4168409ba34543d3164b99995c62b4b70a1d32f4bfaef
|
7
|
+
data.tar.gz: 37637f8e76f129a3582b963b3ef3e8206fb5a997d527feb6ec507b75f2f5983346fcdcef93d63684265d6846debde1539d04b7c836c50ca390a33934b1d2b688
|
data/Gemfile.lock
CHANGED
data/README_es-MX.md
CHANGED
@@ -108,6 +108,26 @@ Hasta ahora:
|
|
108
108
|
Una vez cargado el xml se pueden leer los atributos
|
109
109
|
y/o hacer modificaciones
|
110
110
|
|
111
|
+
# Editar el n-ésimo concepto
|
112
|
+
|
113
|
+
En el siguiente ejemplo la variable `cfdi` es un CFDi creado o cargado
|
114
|
+
desde un xml y se desea cambiar el tercer
|
115
|
+
cantidad, precio y clave SAT de producto
|
116
|
+
|
117
|
+
concepto = cfdi.concepto_nodes[2]
|
118
|
+
concepto.update(
|
119
|
+
cantidad: 2,
|
120
|
+
precio_neto: 1_640,
|
121
|
+
descripcion: "Tablero de control de proyectos",
|
122
|
+
clave_prod_serv: "44111901"
|
123
|
+
)
|
124
|
+
|
125
|
+
# Eliminar el n-esimo concepto
|
126
|
+
|
127
|
+
Para eliminar el segundo concepto de un `cfdi` dado:
|
128
|
+
|
129
|
+
cfdi.conceptos.delete_at(1)
|
130
|
+
|
111
131
|
# Lo que sigue
|
112
132
|
|
113
133
|
* Nodo de Traslados cuando hay tasa de IEPS
|
@@ -116,6 +136,13 @@ y/o hacer modificaciones
|
|
116
136
|
|
117
137
|
# Cambios
|
118
138
|
|
139
|
+
# 0.1.0
|
140
|
+
* Elimina conceptos
|
141
|
+
* Edición de conceptos
|
142
|
+
|
143
|
+
# 0.0.9
|
144
|
+
* FIX cálculos en un xml cargado
|
145
|
+
|
119
146
|
# 0.0.8
|
120
147
|
* Carga básica de un CFDI desde XML.
|
121
148
|
|
data/lib/cfdi40/comprobante.rb
CHANGED
@@ -229,6 +229,17 @@ module Cfdi40
|
|
229
229
|
impuestos_node.traslado_iva
|
230
230
|
end
|
231
231
|
|
232
|
+
def calculate!
|
233
|
+
@docxml = nil
|
234
|
+
@subtotal = @conceptos.children_nodes.map(&:importe).map(&:to_f).sum
|
235
|
+
@total = @conceptos.children_nodes.map(&:importe_neto).map(&:to_f).sum
|
236
|
+
add_traslados_summary_node
|
237
|
+
end
|
238
|
+
|
239
|
+
def concepto_nodes
|
240
|
+
@conceptos.children_nodes
|
241
|
+
end
|
242
|
+
|
232
243
|
private
|
233
244
|
|
234
245
|
def add_node_concepto_actividad_pago
|
@@ -263,12 +274,6 @@ module Cfdi40
|
|
263
274
|
create_xml_node
|
264
275
|
end
|
265
276
|
|
266
|
-
def calculate!
|
267
|
-
@subtotal = @conceptos.children_nodes.map(&:importe).sum
|
268
|
-
@total = @conceptos.children_nodes.map(&:importe_neto).sum
|
269
|
-
add_traslados_summary_node
|
270
|
-
end
|
271
|
-
|
272
277
|
def add_traslados_summary_node
|
273
278
|
return if traslados_summary.empty?
|
274
279
|
|
@@ -285,10 +290,6 @@ module Cfdi40
|
|
285
290
|
end
|
286
291
|
end
|
287
292
|
|
288
|
-
def concepto_nodes
|
289
|
-
@conceptos.children_nodes
|
290
|
-
end
|
291
|
-
|
292
293
|
# Returns a hash with a summary.
|
293
294
|
# The key is an Array ['impuesto, 'tasa_o_cuota', 'TipoFactor] and the value is
|
294
295
|
# another hash the sum of 'Importe' and 'Base'
|
@@ -297,8 +298,8 @@ module Cfdi40
|
|
297
298
|
concepto_nodes.map(&:traslado_nodes).flatten.each do |traslado|
|
298
299
|
key = [traslado.impuesto, traslado.tasa_o_cuota, traslado.tipo_factor]
|
299
300
|
summary[key] ||= { base: 0, importe: 0 }
|
300
|
-
summary[key][:base] += traslado.base
|
301
|
-
summary[key][:importe] += traslado.importe
|
301
|
+
summary[key][:base] += traslado.base.to_f
|
302
|
+
summary[key][:importe] += traslado.importe.to_f
|
302
303
|
end
|
303
304
|
summary
|
304
305
|
end
|
data/lib/cfdi40/concepto.rb
CHANGED
@@ -30,6 +30,20 @@ module Cfdi40
|
|
30
30
|
super
|
31
31
|
end
|
32
32
|
|
33
|
+
# Ver Comprobante#add_concepto
|
34
|
+
def update(attributes = {})
|
35
|
+
attributes.each do |key, value|
|
36
|
+
method_name = "#{key}=".to_sym
|
37
|
+
raise Error, ":#{key} no se puede asignar al concepto" unless respond_to?(method_name)
|
38
|
+
|
39
|
+
public_send(method_name, value)
|
40
|
+
end
|
41
|
+
|
42
|
+
calculate!
|
43
|
+
parent_node.parent_node.calculate!
|
44
|
+
true
|
45
|
+
end
|
46
|
+
|
33
47
|
# Calculate taxes, amounts from gross price
|
34
48
|
# or net price
|
35
49
|
def calculate!
|
@@ -90,7 +104,7 @@ module Cfdi40
|
|
90
104
|
end
|
91
105
|
|
92
106
|
def calculate_taxes
|
93
|
-
@base_ieps = (@precio_bruto * cantidad).round(2)
|
107
|
+
@base_ieps = (@precio_bruto * cantidad.to_f).round(2)
|
94
108
|
@ieps = (@base_ieps * tasa_ieps.to_f).round(2)
|
95
109
|
@base_iva = (@base_ieps + @ieps).round(2)
|
96
110
|
@iva = (@base_iva * tasa_iva.to_f).round(2)
|
data/lib/cfdi40/conceptos.rb
CHANGED
data/lib/cfdi40/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cfdi40
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Israel Benítez
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-
|
11
|
+
date: 2025-06-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|