Skip to content
This repository has been archived by the owner on Jul 22, 2020. It is now read-only.

Evita hacer cache de total y subtotal. #11

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion examples/data/cfdi_impuestos.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0"?>
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd" version="3.2" folio="1" fecha="2013-10-15T01:33:32" formaDePago="PAGO EN UNA SOLA EXHIBICION" condicionesDePago="Sera marcada como pagada en cuanto el receptor haya cubierto el pago." subTotal="11000.00" Moneda="pesos" subTotal="12068.97" total="11505.34" metodoDePago="Transferencia Bancaria" tipoDeComprobante="ingreso" LugarExpedicion="Nutopia, Nutopia" noCertificado="20001000000200000293" certificado="MIIE2jCCA8KgAwIBAgIUMjAwMDEwMDAwMDAyMDAwMDAyOTMwDQYJKoZIhvcNAQEFBQAwggFcMRowGAYDVQQDDBFBLkMuIDIgZGUgcHJ1ZWJhczEvMC0GA1UECgwmU2VydmljaW8gZGUgQWRtaW5pc3RyYWNpw7NuIFRyaWJ1dGFyaWExODA2BgNVBAsML0FkbWluaXN0cmFjacOzbiBkZSBTZWd1cmlkYWQgZGUgbGEgSW5mb3JtYWNpw7NuMSkwJwYJKoZIhvcNAQkBFhphc2lzbmV0QHBydWViYXMuc2F0LmdvYi5teDEmMCQGA1UECQwdQXYuIEhpZGFsZ28gNzcsIENvbC4gR3VlcnJlcm8xDjAMBgNVBBEMBTA2MzAwMQswCQYDVQQGEwJNWDEZMBcGA1UECAwQRGlzdHJpdG8gRmVkZXJhbDESMBAGA1UEBwwJQ295b2Fjw6FuMTQwMgYJKoZIhvcNAQkCDCVSZXNwb25zYWJsZTogQXJhY2VsaSBHYW5kYXJhIEJhdXRpc3RhMB4XDTEyMTAyNjE5MjI0M1oXDTE2MTAyNjE5MjI0M1owggFTMUkwRwYDVQQDE0BBU09DSUFDSU9OIERFIEFHUklDVUxUT1JFUyBERUwgRElTVFJJVE8gREUgUklFR08gMDA0IERPTiBNQVJUSU4gMWEwXwYDVQQpE1hBU09DSUFDSU9OIERFIEFHUklDVUxUT1JFUyBERUwgRElTVFJJVE8gREUgUklFR08gMDA0IERPTiBNQVJUSU4gQ09BSFVJTEEgWSBOVUVWTyBMRU9OIEFDMUkwRwYDVQQKE0BBU09DSUFDSU9OIERFIEFHUklDVUxUT1JFUyBERUwgRElTVFJJVE8gREUgUklFR08gMDA0IERPTiBNQVJUSU4gMSUwIwYDVQQtExxBQUQ5OTA4MTRCUDcgLyBIRUdUNzYxMDAzNFMyMR4wHAYDVQQFExUgLyBIRUdUNzYxMDAzTURGUk5OMDkxETAPBgNVBAsTCFNlcnZpZG9yMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlrI9loozd+UcW7YHtqJimQjzX9wHIUcc1KZyBBB8/5fZsgZ/smWS4Sd6HnPs9GSTtnTmM4bEgx28N3ulUshaaBEtZo3tsjwkBV/yVQ3SRyMDkqBA2NEjbcum+e/MdCMHiPI1eSGHEpdESt55a0S6N24PW732Xm3ZbGgOp1tht1wIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG9w0BAQUFAAOCAQEAuoPXe+BBIrmJn+IGeI+m97OlP3RC4Ct3amjGmZICbvhI9BTBLCL/PzQjjWBwU0MG8uK6e/gcB9f+klPiXhQTeI1YKzFtWrzctpNEJYo0KXMgvDiputKphQ324dP0nzkKUfXlRIzScJJCSgRw9ZifKWN0D9qTdkNkjk83ToPgwnldg5lzU62woXo4AKbcuabAYOVoC7owM5bfNuWJe566UzD6i5PFY15jYMzi1+ICriDItCv3S+JdqyrBrX3RloZhdyXqs2Htxfw4b1OcYboPCu4+9qM3OV02wyGKlGQMhfrXNwYyj8huxS1pHghEROM2Zs0paZUOy+6ajM+Xh0LX2w==" sello="igFu7Q9Z98n6xFSLMv7a2y8ZlJCO+pgTX3xDAUt5xSpX3dHOKXkTHBAf4P/oHHDm3xkYkaNBfPEzpVFDrRVjL2rvkR5T9rsFqb4cl6DOo4RrRIpSR9vojLp7mFWiON9H6OFPi2b9PVAnyIx1Skb5iGIAmSQIhVYyt2DSauObY2c=">
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd" version="3.2" folio="1" fecha="2013-10-15T01:33:32" formaDePago="PAGO EN UNA SOLA EXHIBICION" condicionesDePago="Sera marcada como pagada en cuanto el receptor haya cubierto el pago." Moneda="pesos" subTotal="12068.98" total="11505.34" metodoDePago="Transferencia Bancaria" tipoDeComprobante="ingreso" LugarExpedicion="Nutopia, Nutopia" noCertificado="20001000000200000293" certificado="MIIE2jCCA8KgAwIBAgIUMjAwMDEwMDAwMDAyMDAwMDAyOTMwDQYJKoZIhvcNAQEFBQAwggFcMRowGAYDVQQDDBFBLkMuIDIgZGUgcHJ1ZWJhczEvMC0GA1UECgwmU2VydmljaW8gZGUgQWRtaW5pc3RyYWNpw7NuIFRyaWJ1dGFyaWExODA2BgNVBAsML0FkbWluaXN0cmFjacOzbiBkZSBTZWd1cmlkYWQgZGUgbGEgSW5mb3JtYWNpw7NuMSkwJwYJKoZIhvcNAQkBFhphc2lzbmV0QHBydWViYXMuc2F0LmdvYi5teDEmMCQGA1UECQwdQXYuIEhpZGFsZ28gNzcsIENvbC4gR3VlcnJlcm8xDjAMBgNVBBEMBTA2MzAwMQswCQYDVQQGEwJNWDEZMBcGA1UECAwQRGlzdHJpdG8gRmVkZXJhbDESMBAGA1UEBwwJQ295b2Fjw6FuMTQwMgYJKoZIhvcNAQkCDCVSZXNwb25zYWJsZTogQXJhY2VsaSBHYW5kYXJhIEJhdXRpc3RhMB4XDTEyMTAyNjE5MjI0M1oXDTE2MTAyNjE5MjI0M1owggFTMUkwRwYDVQQDE0BBU09DSUFDSU9OIERFIEFHUklDVUxUT1JFUyBERUwgRElTVFJJVE8gREUgUklFR08gMDA0IERPTiBNQVJUSU4gMWEwXwYDVQQpE1hBU09DSUFDSU9OIERFIEFHUklDVUxUT1JFUyBERUwgRElTVFJJVE8gREUgUklFR08gMDA0IERPTiBNQVJUSU4gQ09BSFVJTEEgWSBOVUVWTyBMRU9OIEFDMUkwRwYDVQQKE0BBU09DSUFDSU9OIERFIEFHUklDVUxUT1JFUyBERUwgRElTVFJJVE8gREUgUklFR08gMDA0IERPTiBNQVJUSU4gMSUwIwYDVQQtExxBQUQ5OTA4MTRCUDcgLyBIRUdUNzYxMDAzNFMyMR4wHAYDVQQFExUgLyBIRUdUNzYxMDAzTURGUk5OMDkxETAPBgNVBAsTCFNlcnZpZG9yMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlrI9loozd+UcW7YHtqJimQjzX9wHIUcc1KZyBBB8/5fZsgZ/smWS4Sd6HnPs9GSTtnTmM4bEgx28N3ulUshaaBEtZo3tsjwkBV/yVQ3SRyMDkqBA2NEjbcum+e/MdCMHiPI1eSGHEpdESt55a0S6N24PW732Xm3ZbGgOp1tht1wIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG9w0BAQUFAAOCAQEAuoPXe+BBIrmJn+IGeI+m97OlP3RC4Ct3amjGmZICbvhI9BTBLCL/PzQjjWBwU0MG8uK6e/gcB9f+klPiXhQTeI1YKzFtWrzctpNEJYo0KXMgvDiputKphQ324dP0nzkKUfXlRIzScJJCSgRw9ZifKWN0D9qTdkNkjk83ToPgwnldg5lzU62woXo4AKbcuabAYOVoC7owM5bfNuWJe566UzD6i5PFY15jYMzi1+ICriDItCv3S+JdqyrBrX3RloZhdyXqs2Htxfw4b1OcYboPCu4+9qM3OV02wyGKlGQMhfrXNwYyj8huxS1pHghEROM2Zs0paZUOy+6ajM+Xh0LX2w==" sello="igFu7Q9Z98n6xFSLMv7a2y8ZlJCO+pgTX3xDAUt5xSpX3dHOKXkTHBAf4P/oHHDm3xkYkaNBfPEzpVFDrRVjL2rvkR5T9rsFqb4cl6DOo4RrRIpSR9vojLp7mFWiON9H6OFPi2b9PVAnyIx1Skb5iGIAmSQIhVYyt2DSauObY2c=">
<cfdi:Emisor nombre="Me cago en sus est&#xE1;ndares S.A. de C.V." rfc="XAXX010101000">
<cfdi:DomicilioFiscal calle="Calle Feliz" noExterior="42" noInterior="314" colonia="Centro" localidad="No se que sea esto, pero va" referencia="Sin Referencia" municipio="Nutop&#xED;a" estado="Nutop&#xED;a" pais="Nutop&#xED;a" codigoPostal="31415"/>
<cfdi:ExpedidoEn calle="Calle Feliz" noExterior="42" noInterior="314" colonia="Centro" localidad="No se que sea esto, pero va" referencia="Sin Referencia" municipio="Nutop&#xED;a" estado="Nutop&#xED;a" pais="Nutop&#xED;a" codigoPostal="31415"/>
Expand Down
44 changes: 27 additions & 17 deletions lib/comprobante.rb
Original file line number Diff line number Diff line change
Expand Up @@ -79,18 +79,14 @@ def addenda= addenda
#
# @return [Float] El subtotal del comprobante
def subTotal
ret = 0
@conceptos.each do |c|
ret += c.importe
end
ret
@subTotal || calcula_sub_total
end

# Regresa el total
#
# @return [Float] El subtotal multiplicado por la tasa
def total
@total ||= calcula_total
@total || calcula_total
end


Expand Down Expand Up @@ -369,20 +365,34 @@ def self.rmerge defaults, other_hash

private

def deep_to_h value
if value.is_a? ElementoComprobante
original = value.to_h
value = {}
original.each do |k,v|
value[k] = deep_to_h v
def deep_to_h value
if value.is_a? ElementoComprobante
original = value.to_h
value = {}
original.each do |k,v|
value[k] = deep_to_h v
end
elsif value.is_a?(Array)
value = value.map do |v|
deep_to_h v
end
end
elsif value.is_a?(Array)
value = value.map do |v|
deep_to_h v
value
end

def calcula_sub_total
ret = 0
@conceptos.each do |c|
ret += c.importe
end
ret
end

def calcula_total
iva = 0.0
iva = (self.subTotal*@opciones[:tasa]) if @impuestos.count > 0
self.subTotal+iva
end
value
end

end
end
24 changes: 18 additions & 6 deletions lib/impuestos.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@ def initialize

# Asigna el total de impuestos trasladados
# @param valor [String, Float, #to_f] Cualquier objeto que responda a #to_f
def totalImpuestosTrasladados valor
def totalImpuestosTrasladados=(valor)
@totalImpuestosTrasladados = valor.to_f
end

# Asigna el total de impuestos retenidos
# @param valor [String, Float, #to_f] Cualquier objeto que responda a #to_f
def totalImpuestosRetenidos valor
def totalImpuestosRetenidos=(valor)
@totalImpuestosRetenidos = valor.to_f
end

Expand All @@ -30,7 +30,7 @@ def count
end


class ImpuestoGenerico < ElementoComprobante
class Traslado < ElementoComprobante
# @private
@cadenaOriginal = [:impuesto, :tasa, :importe]
# @private
Expand All @@ -50,10 +50,22 @@ def importe= valor
end


class Traslado < ImpuestoGenerico
end
class Retencion < ElementoComprobante
# @private
@cadenaOriginal = [:impuesto, :tasa, :importe]
# @private
attr_accessor *@cadenaOriginal

# Asigna la tasa del impuesto
# @param valor [String, Float, #to_f] Cualquier objeto que responda a #to_f
def tasa= valor
@tasa = valor.to_f
end

class Retencion < ImpuestoGenerico
# Asigna el importe del impuesto
# @param valor [String, Float, #to_f] Cualquier objeto que responda a #to_f
def importe= valor
@importe = valor.to_f
end
end
end
4 changes: 2 additions & 2 deletions lib/xml.rb
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ def self.from_xml(data)
factura.impuestos.totalImpuestosTrasladados = impuestos_node.attr('totalImpuestosTrasladados')
traslados = []
traslados_node.xpath('//Traslado').each do |traslado_node|
traslado = Impuestos::Traslado.new
traslado = Traslado.new
traslado.impuesto = traslado_node.attr('impuesto') if traslado_node.attr('impuesto')
traslado.tasa = traslado_node.attr('tasa').to_f if traslado_node.attr('tasa')
traslado.importe = traslado_node.attr('importe').to_f if traslado_node.attr('importe')
Expand All @@ -145,7 +145,7 @@ def self.from_xml(data)
factura.impuestos.totalImpuestosRetenidos = impuestos_node.attr('totalImpuestosRetenidos')
retenciones = []
retenciones_node.xpath('//Retencion').each do |retencion_node|
retencion = Impuestos::Retencion.new
retencion = Retencion.new
retencion.impuesto = retencion_node.attr('impuesto') if retencion_node.attr('impuesto')
retencion.tasa = retencion_node.attr('tasa').to_f if retencion_node.attr('tasa')
retencion.importe = retencion_node.attr('importe').to_f if retencion_node.attr('importe')
Expand Down