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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ce28369c399d94875c10fa980ead1eb1cd75e0300035ffeb61c7bc310d87b327
4
- data.tar.gz: 8d03b666fb2fac0b592032891fadfec3643f64938eb46b2e301bf4a98e68014a
3
+ metadata.gz: cf7ce0ac8de4ab678da94ef6a052c68ea8a403c0b9c349b252654d4bf9771cde
4
+ data.tar.gz: bc02e70bc14b70576f178b3fed467970d36cc6f72693e9bc78415963cab435e4
5
5
  SHA512:
6
- metadata.gz: 1246bce889af62b67256d2c1278201bfaee2c6ae5693048b7a00b8ec424830192610a8d98df294f5227b47ed3f19a0556f1f07146b057a0b8f65e3c95a8874f0
7
- data.tar.gz: d3142214a86217a324b8539bc3455695a257505265e76dc746fa0999d2a2a1ed3486abd8a0e58ef31f4fdd46d828ae9529adcf7d271ce77499657124c855c395
6
+ metadata.gz: a2b13b7fccfdf28774032f0b7e9b95028d7b96c0d6803d1f04b547f26435a0532f7b43c1644ae1309fe4168409ba34543d3164b99995c62b4b70a1d32f4bfaef
7
+ data.tar.gz: 37637f8e76f129a3582b963b3ef3e8206fb5a997d527feb6ec507b75f2f5983346fcdcef93d63684265d6846debde1539d04b7c836c50ca390a33934b1d2b688
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cfdi40 (0.0.8)
4
+ cfdi40 (0.0.9)
5
5
  nokogiri (>= 1.10.10)
6
6
 
7
7
  GEM
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
 
@@ -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
@@ -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)
@@ -2,5 +2,10 @@
2
2
 
3
3
  module Cfdi40
4
4
  class Conceptos < Node
5
+ def delete_at(index)
6
+ result = @children_nodes.delete_at(index)
7
+ parent_node.calculate!
8
+ result
9
+ end
5
10
  end
6
11
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Cfdi40
4
- VERSION = "0.0.8"
4
+ VERSION = "0.1.0"
5
5
  end
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.8
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-05-15 00:00:00.000000000 Z
11
+ date: 2025-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri