cfdi40 0.2.1 → 0.3.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: ecf98bb6f090122a8deb1fd4efdcc536452a130971dde09b6edcfb78fe4edc85
4
- data.tar.gz: 940ed9335fd2c541476f287b577a40574d2a07734278b730392533302755ad94
3
+ metadata.gz: 21fd8c605961dbaf39953bb7e3eaf6f2fd056a3e6ac7d57859e405070e0a7d97
4
+ data.tar.gz: 60f0033ca3a4db9b42bc126c0a1dd4a348ca750ffa8bede6346d8febe97e9072
5
5
  SHA512:
6
- metadata.gz: 796605c919c80f6e2de32b7055da870e46b8af0df71b4a5775943948f11be9b73c356a748d21615527a00aa2e4c6ba85ca5599e2105081e946a24d73755381fe
7
- data.tar.gz: f858dcd68742d342fdaa1790beaeafbcc8122f5f54a7f4d2bcbed70b74def6ad3108e3000d35eec221bafb5056d9e7e9347fbc86383b96ea458cfa05dee95b2a
6
+ metadata.gz: 2058d37a2b6b15cb248bf574d02d5252ec06e85f69eeea829e9f0505e62fed055df24598d527a9abb6deda3c03f86528c8538dfb22090b6eda5448f513bb7208
7
+ data.tar.gz: 17a7425ce18abfbe52ff62b79d3700ffcc9035042b2ff212b8142b897545871c8cca8941c757175412f6c995157e311178d3a49116e01e5f603589297a66255c
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cfdi40 (0.2.0)
4
+ cfdi40 (0.3.0)
5
5
  nokogiri (>= 1.10.10)
6
6
 
7
7
  GEM
@@ -16,5 +16,9 @@ module Cfdi40
16
16
  @children_nodes << @pagos
17
17
  @pagos
18
18
  end
19
+
20
+ def timbre
21
+ @children_nodes.select { |children| children.is_a?(Cfdi40::Timbre) }.first
22
+ end
19
23
  end
20
24
  end
@@ -31,7 +31,7 @@ module Cfdi40
31
31
  define_attribute :lugar_expedicion, xml_attribute: "LugarExpedicion"
32
32
  define_attribute :confirmacion, xml_attribute: "Confirmacion"
33
33
 
34
- attr_reader :emisor, :receptor, :conceptos, :private_key, :sat_csd, :errors
34
+ attr_reader :emisor, :receptor, :conceptos, :private_key, :sat_csd, :errors, :cadena_original
35
35
  attr_writer :key_data, :key_pass
36
36
  attr_accessor :loaded_xml
37
37
 
@@ -91,7 +91,8 @@ module Cfdi40
91
91
 
92
92
  raise Error, "Key and certificate not match" unless @sat_csd.valid_pair?
93
93
 
94
- digest = @sat_csd.private_key.sign(OpenSSL::Digest.new("SHA256"), original_content)
94
+ @cadena_original = original_content
95
+ digest = @sat_csd.private_key.sign(OpenSSL::Digest.new("SHA256"), @cadena_original)
95
96
  @sello = Base64.strict_encode64 digest
96
97
  lock
97
98
  @docxml = nil
@@ -220,10 +221,6 @@ module Cfdi40
220
221
  !docxml.root.attributes["Sello"].nil?
221
222
  end
222
223
 
223
- def cadena_original
224
- original_content
225
- end
226
-
227
224
  def original_content
228
225
  xml_string = loaded_xml.nil? ? docxml.to_s : loaded_xml
229
226
 
@@ -264,6 +261,20 @@ module Cfdi40
264
261
  traslados.traslados_iva.map(&:importe).map(&:to_f).sum.round(2)
265
262
  end
266
263
 
264
+ def load_tfd(tfd_node)
265
+ timbre = Cfdi40::Timbre.new
266
+ timbre.load_from_ng_node(tfd_node)
267
+ timbre.parent_node = complemento
268
+ complemento.children_nodes << timbre
269
+ timbre
270
+ end
271
+
272
+ def timbre
273
+ return nil unless defined?(@complemento)
274
+
275
+ complemento.timbre
276
+ end
277
+
267
278
  private
268
279
 
269
280
  def add_node_concepto_actividad_pago
data/lib/cfdi40/node.rb CHANGED
@@ -187,7 +187,18 @@ module Cfdi40
187
187
  self.class.attributes.each do |variable_name, attr_name|
188
188
  next if ng_node.attributes[attr_name].nil?
189
189
 
190
- instance_variable_set("@#{variable_name}".to_sym, ng_node.attributes[attr_name].value)
190
+ case self.class.formats[variable_name]
191
+ when :t_FechaH, :t_FechaHora
192
+ begin
193
+ parsed_time = Time.strptime(ng_node.attributes[attr_name].value, "%Y-%m-%dT%H:%M:%S")
194
+ instance_variable_set("@#{variable_name}".to_sym, parsed_time)
195
+ rescue
196
+ puts "Warning: cannot parse '#{value}' as Time"
197
+ next
198
+ end
199
+ else
200
+ instance_variable_set("@#{variable_name}".to_sym, ng_node.attributes[attr_name].value)
201
+ end
191
202
  end
192
203
  end
193
204
 
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+ module Cfdi40
3
+ class Timbre < Node
4
+ define_attribute :version, readonly: true, xml_attribute: "Version"
5
+ define_attribute :rfc_prov_certif, readonly: true, xml_attribute: "RfcProvCertif"
6
+ define_attribute :fecha_timbrado, readonly: true, xml_attribute: "FechaTimbrado", format: :t_FechaH
7
+ define_attribute :uuid, readonly: true, xml_attribute: "UUID"
8
+ define_attribute :sello_cfd, readonly: true, xml_attribute: "SelloCFD"
9
+ define_attribute :sello_sat, readonly: true, xml_attribute: "SelloSAT"
10
+ define_attribute :no_certificado_sat, readonly: true, xml_attribute: "NoCertificadoSAT"
11
+ end
12
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Cfdi40
4
- VERSION = "0.2.1"
4
+ VERSION = "0.3.1"
5
5
  end
@@ -17,6 +17,7 @@ module Cfdi40
17
17
  load_receptor
18
18
  load_conceptos
19
19
  load_impuestos
20
+ load_tfd
20
21
 
21
22
  @cfdi.lock if readonly?
22
23
  @cfdi.loaded_xml = xml_string
@@ -62,5 +63,13 @@ module Cfdi40
62
63
 
63
64
  @cfdi.load_impuestos(impuestos_node)
64
65
  end
66
+
67
+ def load_tfd
68
+ tfd_namespace = { "tfd" => "http://www.sat.gob.mx/TimbreFiscalDigital" }
69
+ tfd_node = xml_doc.xpath("//tfd:TimbreFiscalDigital", tfd_namespace).first
70
+ return if tfd_node.nil?
71
+
72
+ @cfdi.load_tfd(tfd_node)
73
+ end
65
74
  end
66
75
  end
data/lib/cfdi40.rb CHANGED
@@ -32,6 +32,7 @@ require_relative "cfdi40/impuestos_p"
32
32
  require_relative "cfdi40/traslados_p"
33
33
  require_relative "cfdi40/traslado_p"
34
34
  require_relative "cfdi40/cp_totales"
35
+ require_relative "cfdi40/timbre"
35
36
  require_relative "cfdi40/xml_loader"
36
37
 
37
38
  # Leading module and entry point for all features and classes
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.2.1
4
+ version: 0.3.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-08-24 00:00:00.000000000 Z
11
+ date: 2025-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -64,6 +64,7 @@ files:
64
64
  - lib/cfdi40/sat_csd.rb
65
65
  - lib/cfdi40/schema_validator.rb
66
66
  - lib/cfdi40/signature_validator.rb
67
+ - lib/cfdi40/timbre.rb
67
68
  - lib/cfdi40/traslado.rb
68
69
  - lib/cfdi40/traslado_dr.rb
69
70
  - lib/cfdi40/traslado_p.rb