cfdi40 0.0.9 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 11ad4a2857a7cf7f906cd5c5927448aca089e2f6042ae6f41eddc4e86b9f030f
4
- data.tar.gz: 9425bd12e064e4fe8c7869401cc4b8458fee947baef91ce070114d7528d2cc79
3
+ metadata.gz: d6259abaa6dfa3e4dfb6ae269df819f9b655d9ff41b1adefae1b7aecb4ef4bcb
4
+ data.tar.gz: 22c78d216df7cbeb071d76fc4770226ac9516ecd73537b8d01bfd4ae61d1891a
5
5
  SHA512:
6
- metadata.gz: 988be6599bd5c7a9a651e8522ae2597045e5e0b6dcfcaac1eeef928b88643f0599f98ef9f62dc0c4a22eeb12727cadbe41569d36dfeed053a53c458aafbbbd7e
7
- data.tar.gz: 69e7f3b65b1400caceff02c24b6320d3c17a75d702e59d83e4ffc9fb2580810b69d557d6e2ff9d011383c8c31fc5b6b5f532a56575ae593b84688c9d3c7dc8cd
6
+ metadata.gz: 513278acd109f261b9e848b08d0506c4b2cdae2e16da783a8306f6416226994ffd98bba6764f07f7b56f9620b25c6e97d767936fcadbb9e9503cff710fe7d2a6
7
+ data.tar.gz: f904dbf8c75d7afa4dbe02812d45773b0a60fe5d2eadc171321b02c3baf080fbd5fad1839c05b6a0ccf54adfd779f6a5253ef6aa4bc1c90b7a014fe99658142c
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cfdi40 (0.0.9)
4
+ cfdi40 (0.1.1)
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
 
@@ -152,6 +152,7 @@ module Cfdi40
152
152
  concepto = Concepto.new
153
153
  concepto.parent_node = @conceptos
154
154
  concepto.load_from_ng_node(ng_node)
155
+ concepto.precio_bruto = concepto.valor_unitario.to_f
155
156
  @conceptos.children_nodes << concepto
156
157
  concepto
157
158
  end
@@ -229,6 +230,17 @@ module Cfdi40
229
230
  impuestos_node.traslado_iva
230
231
  end
231
232
 
233
+ def calculate!
234
+ @docxml = nil
235
+ @subtotal = @conceptos.children_nodes.map(&:importe).map(&:to_f).sum
236
+ @total = @conceptos.children_nodes.map(&:importe_neto).map(&:to_f).sum
237
+ add_traslados_summary_node
238
+ end
239
+
240
+ def concepto_nodes
241
+ @conceptos.children_nodes
242
+ end
243
+
232
244
  private
233
245
 
234
246
  def add_node_concepto_actividad_pago
@@ -263,12 +275,6 @@ module Cfdi40
263
275
  create_xml_node
264
276
  end
265
277
 
266
- def calculate!
267
- @subtotal = @conceptos.children_nodes.map(&:importe).map(&:to_f).sum
268
- @total = @conceptos.children_nodes.map(&:importe_neto).map(&:to_f).sum
269
- add_traslados_summary_node
270
- end
271
-
272
278
  def add_traslados_summary_node
273
279
  return if traslados_summary.empty?
274
280
 
@@ -285,10 +291,6 @@ module Cfdi40
285
291
  end
286
292
  end
287
293
 
288
- def concepto_nodes
289
- @conceptos.children_nodes
290
- end
291
-
292
294
  # Returns a hash with a summary.
293
295
  # The key is an Array ['impuesto, 'tasa_o_cuota', 'TipoFactor] and the value is
294
296
  # another hash the sum of 'Importe' and 'Base'
@@ -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!
@@ -68,6 +82,7 @@ module Cfdi40
68
82
 
69
83
  def load_traslado_iva(ng_node)
70
84
  traslado_iva_node.load_from_ng_node(ng_node)
85
+ calculate_from_gross_price
71
86
  end
72
87
 
73
88
  private
@@ -85,15 +100,15 @@ module Cfdi40
85
100
  calculate_taxes
86
101
  # May be can not be rounded with 2 decimals.
87
102
  # Example gross_price = 1.99512
88
- @precio_neto = (@importe_neto / cantidad).round(6)
103
+ @precio_neto = (@importe_neto / cantidad.to_f).round(6)
89
104
  update_xml_attributes
90
105
  end
91
106
 
92
107
  def calculate_taxes
93
- @base_ieps = (@precio_bruto * cantidad).round(2)
94
- @ieps = (@base_ieps * tasa_ieps.to_f).round(2)
95
- @base_iva = (@base_ieps + @ieps).round(2)
96
- @iva = (@base_iva * tasa_iva.to_f).round(2)
108
+ @base_ieps = (@precio_bruto * cantidad.to_f).round(6)
109
+ @ieps = (@base_ieps * tasa_ieps.to_f).round(4)
110
+ @base_iva = (@base_ieps + @ieps).round(6)
111
+ @iva = (@base_iva * tasa_iva.to_f).round(4)
97
112
  @importe_bruto = @base_ieps
98
113
  @importe_neto = (@base_iva + @iva).round(2)
99
114
  end
@@ -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.9"
4
+ VERSION = "0.1.1"
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.9
4
+ version: 0.1.1
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-19 00:00:00.000000000 Z
11
+ date: 2025-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri