Class: Cfdi40::Pagos

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

Constant Summary collapse

NG_NAMESPACE =
{ "pago20" => "http://www.sat.gob.mx/Pagos20" }

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_pago(attributes = {}) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/cfdi40/pagos.rb', line 14

def add_pago(attributes = {})
  pago = Pago.new
  pago.parent_node = self
  attributes_doc_rel = { imp_pagado: attributes[:monto] }
  doc_rel_keys = [:uuid, :serie, :folio, :num_parcialidad, :importe_saldo_anterior, :objeto_impuestos]
  attributes.each do |key, value|
    if doc_rel_keys.include?(key)
      attributes_doc_rel[key] = value
    else
      method_name = "#{key}=".to_sym
      raise Error, ":#{key} no se puede asignar al nodo Pago" unless pago.respond_to?(method_name)

      pago.public_send(method_name, value)
    end
  end
  pago.monto = pago.monto.round(2)
  pago.add_docto_relacionado(attributes_doc_rel)
  pago.add_impuestos_p
  @children_nodes << pago
  update_totales
  true
end

#add_splitted_pago(attributes = {}) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/cfdi40/pagos.rb', line 37

def add_splitted_pago(attributes = {})
  pago = Pago.new
  pago.parent_node = self
  docs = attributes.delete(:docs)
  attributes.each do |key, value|
    method_name = "#{key}=".to_sym
    raise Error, ":#{key} no se puede asignar al nodo Pago" unless pago.respond_to?(method_name)

    pago.public_send(method_name, value)
  end
  docs.each { |doc_attributes| pago.add_docto_relacionado(doc_attributes) }
  pago.monto = docs.map { |doc_attributes| doc_attributes[:imp_pagado].to_f }.sum.round(2)
  pago.add_impuestos_p
  @children_nodes << pago
  update_totales
end

#load_pago(pago_node) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
# File 'lib/cfdi40/pagos.rb', line 103

def load_pago(pago_node)
  pago = Pago.new
  pago.load_from_ng_node(pago_node)
  add_child_node pago
  pago_node.xpath("//pago20:DoctoRelacionado", { "pago20" => "http://www.sat.gob.mx/Pagos20" }).each do |dr_node|
    pago.load_dr(dr_node)
  end
  imp_p_node = pago_node.xpath("//pago20:ImpuestosP", { "pago20" => "http://www.sat.gob.mx/Pagos20" }).first
  pago.load_impuestos_p(imp_p_node) if imp_p_node
  pago
end

#load_totales(totales_node) ⇒ Object



115
116
117
118
119
120
121
# File 'lib/cfdi40/pagos.rb', line 115

def load_totales(totales_node)
  cp_totales = CpTotales.new
  cp_totales.load_from_ng_node(totales_node)
  cp_totales.parent_node = self
  @children_nodes << cp_totales
  cp_totales
end

#pago_nodesObject



99
100
101
# File 'lib/cfdi40/pagos.rb', line 99

def pago_nodes
  @children_nodes.select { |node| node.instance_of?(::Cfdi40::Pago) }
end

#remove_pago(index) ⇒ Object



54
55
56
57
58
# File 'lib/cfdi40/pagos.rb', line 54

def remove_pago(index)
  @children_nodes.delete(pago_nodes[index])
  update_totales
  true
end

#totales_nodeObject



91
92
93
94
95
96
97
# File 'lib/cfdi40/pagos.rb', line 91

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

  @totales_node = CpTotales.new
  add_child_node @totales_node
  @totales_node
end

#traslados_summaryObject



77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/cfdi40/pagos.rb', line 77

def traslados_summary
  @traslados_summary if defined?(@traslados_summary)

  summary = {}
  pago_nodes.each do |pago|
    pago.traslados_summary.each do |key, data|
      summary[key] ||= { base: 0, importe: 0 }
      summary[key][:base] += data[:base]
      summary[key][:importe] += data[:importe]
    end
  end
  @traslados_summary = summary
end

#update_total_montoObject



73
74
75
# File 'lib/cfdi40/pagos.rb', line 73

def update_total_monto
  totales_node.monto_total = pago_nodes.map(&:monto).sum
end

#update_totalesObject



60
61
62
63
# File 'lib/cfdi40/pagos.rb', line 60

def update_totales
  update_totales_traslado_iva16
  update_total_monto
end

#update_totales_traslado_iva16Object



65
66
67
68
69
70
71
# File 'lib/cfdi40/pagos.rb', line 65

def update_totales_traslado_iva16
  key = ["002", "Tasa", 0.160000]
  return if traslados_summary[key].nil?

  totales_node.base_iva16 = traslados_summary[key][:base]
  totales_node.importe_iva16 = traslados_summary[key][:importe]
end