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 +4 -4
- data/Gemfile.lock +1 -1
- data/README_es-MX.md +27 -0
- data/lib/cfdi40/comprobante.rb +12 -10
- data/lib/cfdi40/concepto.rb +20 -5
- 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: d6259abaa6dfa3e4dfb6ae269df819f9b655d9ff41b1adefae1b7aecb4ef4bcb
|
4
|
+
data.tar.gz: 22c78d216df7cbeb071d76fc4770226ac9516ecd73537b8d01bfd4ae61d1891a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 513278acd109f261b9e848b08d0506c4b2cdae2e16da783a8306f6416226994ffd98bba6764f07f7b56f9620b25c6e97d767936fcadbb9e9503cff710fe7d2a6
|
7
|
+
data.tar.gz: f904dbf8c75d7afa4dbe02812d45773b0a60fe5d2eadc171321b02c3baf080fbd5fad1839c05b6a0ccf54adfd779f6a5253ef6aa4bc1c90b7a014fe99658142c
|
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
@@ -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'
|
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!
|
@@ -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(
|
94
|
-
@ieps = (@base_ieps * tasa_ieps.to_f).round(
|
95
|
-
@base_iva = (@base_ieps + @ieps).round(
|
96
|
-
@iva = (@base_iva * tasa_iva.to_f).round(
|
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
|
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.
|
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-
|
11
|
+
date: 2025-06-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|