MX-SAT 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +20 -0
- data/.rspec +3 -0
- data/.travis.yml +11 -0
- data/.yardopts +9 -0
- data/Gemfile +34 -0
- data/Guardfile +26 -0
- data/LICENSE.txt +22 -0
- data/MX-SAT.gemspec +26 -0
- data/README.md +89 -0
- data/REFERENCIAS.md +30 -0
- data/Rakefile +15 -0
- data/data/MX/SAT/contabilidad/archivos/v1.0/pdf/Anexo24_05012015.pdf +0 -0
- data/data/MX/SAT/contabilidad/archivos/v1.0/pdf/M_1aRMRMF_270215.pdf +0 -0
- data/data/MX/SAT/contabilidad/archivos/v1.0/pdf/RecomendacionesalSAT.pdf +0 -0
- data/data/MX/SAT/contabilidad/archivos/v1.0/pdf/catalogo_bancos.pdf +0 -0
- data/data/MX/SAT/contabilidad/archivos/v1.0/pdf/catalogo_metodos_pago.pdf +0 -0
- data/data/MX/SAT/contabilidad/archivos/v1.0/pdf/catalogo_monedas.pdf +0 -0
- data/data/MX/SAT/contabilidad/archivos/v1.0/pdf/codigo_agrupador.pdf +0 -0
- data/data/MX/SAT/contabilidad/archivos/v1.0/pdf/e_AuxiliarCtas.pdf +0 -0
- data/data/MX/SAT/contabilidad/archivos/v1.0/pdf/e_AuxiliarFolios.pdf +0 -0
- data/data/MX/SAT/contabilidad/archivos/v1.0/pdf/e_BalanzaComprobacion.pdf +0 -0
- data/data/MX/SAT/contabilidad/archivos/v1.0/pdf/e_CatalogoCuentas.pdf +0 -0
- data/data/MX/SAT/contabilidad/archivos/v1.0/pdf/e_PolizasPeriodo.pdf +0 -0
- data/data/MX/SAT/contabilidad/archivos/v1.0/pdf/e_SelloDigitalContElec.pdf +0 -0
- data/data/MX/SAT/contabilidad/archivos/v1.0/pdf/extracto_reglas.pdf +0 -0
- data/data/MX/SAT/contabilidad/archivos/v1.0/plantillas_xls/balanza_comprobacion.xlsx +0 -0
- data/data/MX/SAT/contabilidad/archivos/v1.0/plantillas_xls/catalogo_cuentas.xlsx +0 -0
- data/lib/MX/SAT.rb +8 -0
- data/lib/MX/SAT/Contabilidad/balanza_comprobacion.rb +141 -0
- data/lib/MX/SAT/Contabilidad/catalogo_cuentas.rb +117 -0
- data/lib/MX/SAT/Contabilidad/data/v1.1/xsd/AuxiliarCtas_1_1.xsd +215 -0
- data/lib/MX/SAT/Contabilidad/data/v1.1/xsd/AuxiliarFolios_1_2.xsd +342 -0
- data/lib/MX/SAT/Contabilidad/data/v1.1/xsd/BalanzaComprobacion_1_1.xsd +160 -0
- data/lib/MX/SAT/Contabilidad/data/v1.1/xsd/CatalogoCuentas_1_1.xsd +157 -0
- data/lib/MX/SAT/Contabilidad/data/v1.1/xsd/CatalogosParaEsqContE.xsd +1398 -0
- data/lib/MX/SAT/Contabilidad/data/v1.1/xsd/PolizasPeriodo_1_1.xsd +664 -0
- data/lib/MX/SAT/Contabilidad/data/v1.1/xsd/SelloDigitalContElec.xsd +80 -0
- data/lib/MX/SAT/Contabilidad/data/v1.1/xslt/AuxiliarCtas_1_1.xslt +63 -0
- data/lib/MX/SAT/Contabilidad/data/v1.1/xslt/AuxiliarFolios_1_1.xslt +104 -0
- data/lib/MX/SAT/Contabilidad/data/v1.1/xslt/BalanzaComprobacion_1_1.xslt +53 -0
- data/lib/MX/SAT/Contabilidad/data/v1.1/xslt/CatalogoCuentas_1_1.xslt +47 -0
- data/lib/MX/SAT/Contabilidad/data/v1.1/xslt/PolizasPeriodo_1_1.xslt +176 -0
- data/lib/MX/SAT/Contabilidad/data/v1.1/xslt/utilerias.xslt +22 -0
- data/lib/MX/SAT/certificacion.rb +36 -0
- data/lib/MX/SAT/version.rb +6 -0
- data/spec/MX/SAT/contabilidad/balanza_comprobacion_spec.rb +160 -0
- data/spec/MX/SAT/contabilidad/catalogo_cuentas_spec.rb +101 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/support/archivos/xlsx/balanza_comprobacion_complementaria.xlsx +0 -0
- data/spec/support/archivos/xlsx/balanza_comprobacion_normal.xlsx +0 -0
- data/spec/support/archivos/xlsx/catalogo_cuentas.xlsx +0 -0
- data/spec/support/archivos/xml/MTS110304UT4201501BC.xml +8 -0
- data/spec/support/archivos/xml/MTS110304UT4201501BN.xml +8 -0
- data/spec/support/archivos/xml/MTS110304UT4201501CT.xml +8 -0
- metadata +152 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 98383d377a37962acb6320a75fb0b418dd53828c
|
4
|
+
data.tar.gz: 93fbd15b9c2199fc759b25f16f9bc6e59417df27
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d9272231377b151d3f9bd84b9d760f54bd61f89e5c9c6da28aca45c8b892f0950f277819b3999cb1be62c9fbaf16b6a10c6cd53a40597c99a9b5a31a7bd9a390
|
7
|
+
data.tar.gz: 6e0e44b4a136565434767077df76149e0923a2e18e53922dd2f3577dca890c85f0875feaea04aa2cc012f0fc79c0aea10850321e72893225ac3fb31e8ed87f3c
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/.yardopts
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gemspec
|
4
|
+
|
5
|
+
group :development do
|
6
|
+
gem 'guard'
|
7
|
+
gem 'guard-bundler', require: false
|
8
|
+
gem 'guard-rspec', require: false
|
9
|
+
gem "pry"
|
10
|
+
gem "pry-remote"
|
11
|
+
gem "pry-byebug", platform: [:mri_20, :mri_21, :mri_22]
|
12
|
+
gem 'terminal-notifier'
|
13
|
+
gem 'terminal-notifier-guard'
|
14
|
+
end
|
15
|
+
|
16
|
+
group :development, :test do
|
17
|
+
gem "bundler"
|
18
|
+
gem "rake"
|
19
|
+
gem "rspec", "~> 3.2"
|
20
|
+
end
|
21
|
+
|
22
|
+
group :test do
|
23
|
+
gem "coveralls", require: false
|
24
|
+
gem "codeclimate-test-reporter"
|
25
|
+
gem 'rspec-collection_matchers'
|
26
|
+
gem 'equivalent-xml'
|
27
|
+
gem 'shoulda-matchers', require: false
|
28
|
+
end
|
29
|
+
|
30
|
+
group :doc do
|
31
|
+
gem 'yard'
|
32
|
+
gem 'redcarpet'
|
33
|
+
gem 'github-markup'
|
34
|
+
end
|
data/Guardfile
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
guard :rspec, cmd: "bundle exec rspec", cmd_additional_args: '-f progress', failed_mode: :focus do
|
2
|
+
require "guard/rspec/dsl"
|
3
|
+
dsl = Guard::RSpec::Dsl.new(self)
|
4
|
+
|
5
|
+
# RSpec files
|
6
|
+
rspec = dsl.rspec
|
7
|
+
watch(rspec.spec_helper) { rspec.spec_dir }
|
8
|
+
watch(rspec.spec_support) { rspec.spec_dir }
|
9
|
+
watch(rspec.spec_files)
|
10
|
+
|
11
|
+
# Ruby files
|
12
|
+
ruby = dsl.ruby
|
13
|
+
dsl.watch_spec_files_for(ruby.lib_files)
|
14
|
+
end
|
15
|
+
|
16
|
+
guard :bundler do
|
17
|
+
require 'guard/bundler'
|
18
|
+
require 'guard/bundler/verify'
|
19
|
+
helper = Guard::Bundler::Verify.new
|
20
|
+
|
21
|
+
files = ['Gemfile']
|
22
|
+
files += Dir['*.gemspec'] if files.any? { |f| helper.uses_gemspec?(f) }
|
23
|
+
|
24
|
+
# Assume files are symlinked from somewhere
|
25
|
+
files.each { |file| watch(helper.real_path(file)) }
|
26
|
+
end
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 Pablo Ruiz
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/MX-SAT.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'MX/SAT/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "MX-SAT"
|
8
|
+
spec.version = MX::SAT::VERSION # `git describe --tags --abbrev=0`.strip
|
9
|
+
spec.authors = ["Pablo Ruiz"]
|
10
|
+
spec.email = ["pjruiz@maquech.com.mx"]
|
11
|
+
spec.summary = %q{Mexican taxpayers utilities / Utilerías para lidiar con Sistema de Administración Tributaria (SAT)}
|
12
|
+
spec.description = %q{Mexican taxpayers utilities / Utilerías para lidiar con Sistema de Administración Tributaria (SAT)}
|
13
|
+
spec.homepage = "https://github.com/Maquech/MX-SAT"
|
14
|
+
spec.license = "MIT"
|
15
|
+
spec.post_install_message = "¡Viva México!"
|
16
|
+
|
17
|
+
spec.required_ruby_version = '>= 1.9.3'
|
18
|
+
spec.files = `git ls-files -z`.split("\x0")
|
19
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
20
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
21
|
+
spec.require_paths = ["lib"]
|
22
|
+
|
23
|
+
spec.add_dependency 'nokogiri', '>= 1.6'
|
24
|
+
spec.add_dependency 'simple_xlsx_reader'
|
25
|
+
spec.add_dependency 'rubyzip'
|
26
|
+
end
|
data/README.md
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
# MX::SAT
|
2
|
+
|
3
|
+
Utilites for dealing with Mexico's revenue service
|
4
|
+
|
5
|
+
---
|
6
|
+
|
7
|
+
Utilerías para lidiar con el SAT (SHCP) de México.
|
8
|
+
|
9
|
+
|
10
|
+
## Installation / Instalación
|
11
|
+
|
12
|
+
Add this line to your application's Gemfile:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
gem 'MX-SAT'
|
16
|
+
```
|
17
|
+
|
18
|
+
And then execute:
|
19
|
+
|
20
|
+
$ bundle
|
21
|
+
|
22
|
+
Or install it yourself as:
|
23
|
+
|
24
|
+
$ gem install MX-SAT
|
25
|
+
|
26
|
+
---
|
27
|
+
|
28
|
+
Agrega esta línea al archivo Gemfile de tu aplicación:
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
gem 'MX-SAT'
|
32
|
+
```
|
33
|
+
|
34
|
+
Luego ejecuta:
|
35
|
+
|
36
|
+
$ bundle
|
37
|
+
|
38
|
+
O instálalo tu mismo usando:
|
39
|
+
|
40
|
+
$ gem install MX-SAT
|
41
|
+
|
42
|
+
|
43
|
+
## Usage / Uso
|
44
|
+
|
45
|
+
|
46
|
+
Pendiente...
|
47
|
+
|
48
|
+
|
49
|
+
## Contributing / Contribuir
|
50
|
+
|
51
|
+
1. Fork it ( https://github.com/Maquech/MX-SAT/fork )
|
52
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
53
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
54
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
55
|
+
5. Create a new Pull Request
|
56
|
+
|
57
|
+
You can also submit technical observations on the algorithms here implemented alongside with references to official documentation that supports it.
|
58
|
+
|
59
|
+
---
|
60
|
+
|
61
|
+
Puedes contribuir mandándonos tus observaciones sobre la implementación de los algoritmos aquí implementados o referencias a documentos oficiales que las respalde.
|
62
|
+
|
63
|
+
Ahora, diviérte con esta traducción (si sabes el término correcto en español, háznoslo saber por favor):
|
64
|
+
|
65
|
+
1. Crea tu copia del repositorio ( https://github.com/Maquech/MX-SAT/fork )
|
66
|
+
2. Crea tu rama con la funcionalidad propuesta (`git checkout -b mi-nueva-funcionalidad-shubiduby`)
|
67
|
+
3. Compromete tus cambios (`git commit -am 'Nueva funcionalidad shubiduby'`)
|
68
|
+
4. Empuja la rama a tu repositorio (`git push origin mi-nueva-funcionalidad-shubiduby`)
|
69
|
+
5. Crea una nueva petición de jalada|tirada|extracción|acarreo
|
70
|
+
|
71
|
+
|
72
|
+
## Docs
|
73
|
+
|
74
|
+
Use `bundle exec yard server --port 8828 --reload` para generar la documentación. También revisa las [referencias](REFERENCIAS.md)
|
75
|
+
|
76
|
+
|
77
|
+
## Code status / Estado del código
|
78
|
+
|
79
|
+
[![Build Status][Travis-CI-badge]][Travis-CI-url] [![Code Climate][Code Climate-badge]][Code Climate-url] [![Coverage Status][Coveralls-badge]][Coveralls-url]
|
80
|
+
[![Gem Version][gem-badge]][gem-url]
|
81
|
+
|
82
|
+
[Travis-CI-badge]: https://travis-ci.org/Maquech/MX-SAT.svg?branch=master
|
83
|
+
[Travis-CI-url]: https://travis-ci.org/Maquech/MX-SAT
|
84
|
+
[Code Climate-badge]: https://codeclimate.com/github/Maquech/MX-SAT/badges/gpa.svg
|
85
|
+
[Code Climate-url]: https://codeclimate.com/github/Maquech/MX-SAT
|
86
|
+
[Coveralls-badge]: https://coveralls.io/repos/Maquech/MX-SAT/badge.svg?branch=master
|
87
|
+
[Coveralls-url]: https://coveralls.io/r/Maquech/MX-SAT?branch=master
|
88
|
+
[gem-badge]: https://badge.fury.io/rb/MX-SAT.svg
|
89
|
+
[gem-url]: http://badge.fury.io/rb/MX-SAT
|
data/REFERENCIAS.md
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# Los XSDs del SAT tienen errores (al 28 de Feb de 2015)
|
2
|
+
El `schemaLocation` y el `xmlns:catalogoscuentas` tienen errores en las URLs (falta el `http://`) pero de ponerlo, el validador del SAT marca error. Idiotas. Los namespaces válidos son:
|
3
|
+
|
4
|
+
```
|
5
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
6
|
+
xmlns:catalogocuentas="www.sat.gob.mx/esquemas/ContabilidadE/1_1/CatalogoCuentas"
|
7
|
+
xsi:schemaLocation="www.sat.gob.mx/esquemas/ContabilidadE/1_1/CatalogoCuentas http://www.sat.gob.mx/esquemas/ContabilidadE/1_1/CatalogoCuentas/CatalogoCuentas_1_1.xsd"
|
8
|
+
```
|
9
|
+
|
10
|
+
Mismo caso para las balanzas, los namespaces no concuerdan con la documentación del diario oficial. Doblemente idiotas. Los namespaces válidos son:
|
11
|
+
|
12
|
+
```
|
13
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
14
|
+
xmlns:BCE="www.sat.gob.mx/esquemas/ContabilidadE/1_1/BalanzaComprobacion"
|
15
|
+
xsi:schemaLocation="www.sat.gob.mx/esquemas/ContabilidadE/1_1/BalanzaComprobacion http://www.sat.gob.mx/esquemas/ContabilidadE/1_1/BalanzaComprobacion/BalanzaComprobacion_1_1.xsd"
|
16
|
+
```
|
17
|
+
|
18
|
+
|
19
|
+
## Referencias
|
20
|
+
|
21
|
+
### Oficiales
|
22
|
+
|
23
|
+
* [SAT, contabilidad electrónica](http://www.sat.gob.mx/fichas_tematicas/buzon_tributario/Paginas/contabilidad_electronica.aspx)
|
24
|
+
* [Validador del SAT](https://ceportalvalidacionprod.clouda.sat.gob.mx/)
|
25
|
+
|
26
|
+
|
27
|
+
### No oficiales
|
28
|
+
|
29
|
+
* [ValidaCFD](http://www.validacfd.com/phpbb3/viewtopic.php?f=16&t=4805&start=130)
|
30
|
+
* [Fortiz @ lacorona.com.mx - siempre me saca de dudas con sus publicaciones](http://www.lacorona.com.mx/fortiz/sat/ce/)
|
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/gem_tasks'
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
require 'yard'
|
5
|
+
YARD::Rake::YardocTask.new
|
6
|
+
|
7
|
+
RSpec::Core::RakeTask.new(:spec, :tag) do |t, task_args|
|
8
|
+
t.rspec_opts = ["--tag #{task_args[:tag]}", "--format", "--color"]
|
9
|
+
end
|
10
|
+
|
11
|
+
task default: :spec
|
12
|
+
task test: :spec
|
13
|
+
rescue LoadError
|
14
|
+
end
|
15
|
+
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/lib/MX/SAT.rb
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module MX::SAT::Contabilidad
|
3
|
+
class BalanzaComprobacion
|
4
|
+
VERSION = "1.1"
|
5
|
+
|
6
|
+
XSD_BALANZA_COMPROBACION = File.join(File.dirname(__FILE__), 'data', "v#{VERSION}", 'xsd', 'BalanzaComprobacion_1_1.xsd')
|
7
|
+
XSLT_BALANZA_COMPROBACION = File.join(File.dirname(__FILE__), 'data', "v#{VERSION}", 'xslt', 'BalanzaComprobacion_1_1.xslt')
|
8
|
+
|
9
|
+
TIPO_ENVIO_COMPLEMENTARIA = "C"
|
10
|
+
TIPO_ENVIO_NORMAL = "N"
|
11
|
+
TIPOS_ENVIO = [TIPO_ENVIO_NORMAL, TIPO_ENVIO_COMPLEMENTARIA].freeze
|
12
|
+
|
13
|
+
# OJOOOOOO están mal las URLs, pero el SAT así las tiene en sus XSDs al 28 de Feb de 2015
|
14
|
+
NAMESPACE = { 'xmlns:BCE' => "www.sat.gob.mx/esquemas/ContabilidadE/1_1/BalanzaComprobacion" }.freeze
|
15
|
+
NAMESPACES = {
|
16
|
+
'xsi:schemaLocation' => "www.sat.gob.mx/esquemas/ContabilidadE/1_1/BalanzaComprobacion" +
|
17
|
+
" http://www.sat.gob.mx/esquemas/ContabilidadE/1_1/BalanzaComprobacion/BalanzaComprobacion_1_1.xsd",
|
18
|
+
'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance"
|
19
|
+
}.merge(NAMESPACE).freeze
|
20
|
+
|
21
|
+
|
22
|
+
attr_reader :xml, :xml_certificado, :nombre_archivo
|
23
|
+
attr_accessor :rfc, :año, :mes, :tipo_envio, :fecha_modificacion, :datos, :certificado, :llave_privada, :passwd_llave_privada
|
24
|
+
|
25
|
+
def initialize
|
26
|
+
@xml = nil
|
27
|
+
@xml_certificado = nil
|
28
|
+
@nombre_archivo = nil
|
29
|
+
@rfc = nil
|
30
|
+
@año = nil
|
31
|
+
@mes = nil
|
32
|
+
@tipo_envio = nil
|
33
|
+
@fecha_mod_bal = nil
|
34
|
+
@fecha_modificacion = nil
|
35
|
+
@datos = []
|
36
|
+
@certificado = nil
|
37
|
+
@llave_privada = nil
|
38
|
+
@passwd_llave_privada = nil
|
39
|
+
end
|
40
|
+
|
41
|
+
def cargar_xslx(archivo)
|
42
|
+
doc = ::SimpleXlsxReader.open(archivo)
|
43
|
+
filas = doc.sheets.find{ |s| s.name.downcase == "datos" }.rows[1..-1]
|
44
|
+
obtener_atributos_generales(filas.first)
|
45
|
+
obtener_datos(filas)
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_xml
|
49
|
+
return if @datos.empty?
|
50
|
+
builder = ::Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
|
51
|
+
xml['BCE'].Balanza(atributos_nodo_balanza){ @datos.each{ |dato| xml.Ctas(dato) } }
|
52
|
+
end
|
53
|
+
@xml = builder.to_xml
|
54
|
+
certificar_xml
|
55
|
+
end
|
56
|
+
|
57
|
+
def generar_archivo_xml
|
58
|
+
return unless @nombre_archivo
|
59
|
+
File.open("#{@nombre_archivo}.xml", "w") {|f| f.write(@xml_certifcado || @xml || self.to_xml) }
|
60
|
+
"#{@nombre_archivo}.xml"
|
61
|
+
end
|
62
|
+
|
63
|
+
def generar_archivo_zip
|
64
|
+
return unless @nombre_archivo
|
65
|
+
self.generar_archivo_xml unless File.exist?("#{@nombre_archivo}.xml")
|
66
|
+
::Zip::File.open(File.join("#{@nombre_archivo}.zip"), ::Zip::File::CREATE) do |archivo_zip|
|
67
|
+
archivo_zip.add("#{@nombre_archivo}.xml", "#{@nombre_archivo}.xml")
|
68
|
+
end
|
69
|
+
"#{@nombre_archivo}.zip"
|
70
|
+
end
|
71
|
+
|
72
|
+
def xml_valido?
|
73
|
+
xsd_doc = Nokogiri::XML::Schema(File.open(XSD_BALANZA_COMPROBACION, 'rb'))
|
74
|
+
xml_doc = Nokogiri::XML(@xml_certificado || @xml || self.to_xml, nil, 'UTF-8')
|
75
|
+
errors = ""
|
76
|
+
xsd_doc.validate(xml_doc).each { |error| errors += " #{error.message}" }
|
77
|
+
doc_valido = xsd_doc.valid?(xml_doc)
|
78
|
+
puts "XML validado con #{xsd} es INVÁLIDO!: #{errors}" unless doc_valido
|
79
|
+
return doc_valido
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
private
|
84
|
+
def certificar_xml
|
85
|
+
if !@certificado.nil? and !@llave_privada.nil?
|
86
|
+
@xml_certificado = agregar_certificacion_xml
|
87
|
+
else
|
88
|
+
@xml
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def agregar_certificacion_xml
|
93
|
+
xml_doc_sin_sello = Nokogiri::XML(@xml || to_xml, nil, 'UTF-8')
|
94
|
+
cadena = ::MX::SAT::Certificacion.generar_cadena_original(@xml, XSLT_BALANZA_COMPROBACION)
|
95
|
+
nodo_raiz = xml_doc_sin_sello.at_xpath('/BCE:Balanza', NAMESPACE)
|
96
|
+
nodo_raiz['Sello'] = ::MX::SAT::Certificacion.firma_sha256(cadena, @llave_privada, @passwd_llave_privada)
|
97
|
+
nodo_raiz['noCertificado'] = ::MX::SAT::Certificacion.num_serial_certificado(@certificado)
|
98
|
+
nodo_raiz['Certificado'] = ::MX::SAT::Certificacion.certificado_b64(@certificado)
|
99
|
+
xml_doc_sin_sello.to_xml
|
100
|
+
end
|
101
|
+
|
102
|
+
def atributos_nodo_balanza
|
103
|
+
atributos = { Version: VERSION, RFC: @rfc, Mes: @mes, Anio: @año, TipoEnvio: @tipo_envio }
|
104
|
+
atributos[:FechaModBal] = @fecha_modificacion unless @fecha_modificacion.nil?
|
105
|
+
atributos.merge(NAMESPACES)
|
106
|
+
end
|
107
|
+
|
108
|
+
def establecer_fecha_modificacion
|
109
|
+
begin
|
110
|
+
@fecha_modificacion = Date.parse(@fecha_mod_bal).to_s if @fecha_mod_bal and !@fecha_mod_bal.empty?
|
111
|
+
@fecha_modificacion = 'falta_fecha' if @fecha_mod_bal.nil? and @fecha_mod_bal.empty? and (@tipo_envio == "C")
|
112
|
+
rescue ArgumentError
|
113
|
+
@fecha_modificacion = 'formato_fecha_incorrecta'
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def obtener_atributos_generales(fila)
|
118
|
+
arr = fila[0..4]
|
119
|
+
@rfc, mes, @año, @tipo_envio, @fecha_mod_bal = *arr
|
120
|
+
@mes = fmto_mes(mes)
|
121
|
+
establecer_fecha_modificacion
|
122
|
+
@nombre_archivo = "#{@rfc}#{@año}#{@mes}B#{@tipo_envio}"
|
123
|
+
end
|
124
|
+
|
125
|
+
def obtener_datos(filas)
|
126
|
+
@datos = filas.map do |fila|
|
127
|
+
{ NumCta: fila[5], SaldoIni: fmto_decimal(fila[6]),
|
128
|
+
Debe: fmto_decimal(fila[7]), Haber: fmto_decimal(fila[8]), SaldoFin: fmto_decimal(fila[9]) }
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def fmto_decimal(num)
|
133
|
+
return "0" if num.to_i.zero?
|
134
|
+
"%.2f" % num
|
135
|
+
end
|
136
|
+
|
137
|
+
def fmto_mes(num)
|
138
|
+
"%02d" % num
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|