Class: Cfdi40::DoctoRelacionado

Inherits:
Node
  • Object
show all
Defined in:
lib/cfdi40/docto_relacionado.rb

Instance Attribute Summary

Attributes inherited from Node

#children_nodes, #element_name, #parent_node, #readonly, #xml_document, #xml_parent

Instance Method Summary collapse

Methods inherited from Node

#add_attributes_to, #add_child_node, #add_children_to, #add_namespaces_to, #attibute_is_null?, attributes, #clean_cached_xml, #create_xml_node, #current_namespace, default_values, define_attribute, define_element_name, define_namespace, define_reader, define_writer, #delete_child, element_name, #expanded_element_name, formats, #formatted_value, #initialize, #load_from_ng_node, #lock, namespaces, #set_defaults, verify_class_variables

Constructor Details

This class inherits a constructor from Cfdi40::Node

Instance Method Details

#add_impuestosObject

Add nodes for ‘traslado_dr’ and/or ‘retencion_dr’ and intermediate nodes



22
23
24
# File 'lib/cfdi40/docto_relacionado.rb', line 22

def add_impuestos
  add_traslado if objeto_imp_dr == "02"
end

#add_trasladoObject



26
27
28
29
30
31
32
33
34
35
36
# File 'lib/cfdi40/docto_relacionado.rb', line 26

def add_traslado
  return unless objeto_imp_dr == "02"

  # Taxes values for IVA rate 0.16 assumming that all 'conceptos' in the realted document
  # has the same tax rate. This could not be true but the is the most common case.
  traslado_dr = TrasladoDR.new
  traslado_dr.monto_pago = imp_pagado.round(2)
  traslado_dr.calculate!
  traslados_dr.add_child_node(traslado_dr)
  traslado_dr
end

#calculate!Object



16
17
18
19
# File 'lib/cfdi40/docto_relacionado.rb', line 16

def calculate!
  self.imp_saldo_insoluto = (imp_saldo_ant - imp_pagado).round(2)
  add_impuestos
end

#impuestos_drObject



59
60
61
62
63
64
65
66
# File 'lib/cfdi40/docto_relacionado.rb', line 59

def impuestos_dr
  return @impuestos_dr if defined?(@impuestos_dr)

  @impuestos_dr = ImpuestosDR.new
  @impuestos_dr.parent_node = self
  @children_nodes << @impuestos_dr
  @impuestos_dr
end

#load_impuestos_dr(impuestos_dr_node) ⇒ Object



68
69
70
71
72
73
74
75
76
# File 'lib/cfdi40/docto_relacionado.rb', line 68

def load_impuestos_dr(impuestos_dr_node)
  @impuestos_dr = ImpuestosDR.new
  @impuestos_dr.load_from_ng_node(impuestos_dr_node)
  @impuestos_dr.parent_node = self
  @children_nodes << @impuestos_dr
  tr_dr_node = impuestos_dr_node.xpath("//pago20:TrasladosDR", Cfdi40::Pagos::NG_NAMESPACE).first
  @impuestos_dr.load_traslados_dr(tr_dr_node) unless tr_dr_node.nil?
  @impuestos_dr
end

#traslados_drObject



53
54
55
56
57
# File 'lib/cfdi40/docto_relacionado.rb', line 53

def traslados_dr
  return @traslados_dr if defined?(@traslados_dr)

  @traslados_dr = impuestos_dr.traslados_dr
end

#traslados_summaryObject

Return a hash. The key is an array [impuesto, tipo_factor, tasa_o_cuot] and the value is another hash with the keys :base, :importe



40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/cfdi40/docto_relacionado.rb', line 40

def traslados_summary
  return {} unless defined?(@traslados_dr)

  summary = {}
  @traslados_dr.children_nodes.each do |traslado_dr|
    key = [traslado_dr.impuesto_dr, traslado_dr.tipo_factor_dr, traslado_dr.tasa_o_cuota_dr]
    summary[key] ||= { base: 0, importe: 0 }
    summary[key][:base] += traslado_dr.base_dr.to_f
    summary[key][:importe] += traslado_dr.importe_dr.to_f
  end
  summary
end