sunat_books 0.0.4 → 0.1.0

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: 5bc9571ffaf425a6ba23d9ea43d3f1e2eb4e1acf6ba6a05d40d3c974390a9f19
4
- data.tar.gz: 884a5edd838e6b36da06b98c956cacbf045bd80f33e7c3700df38e058f21e46a
3
+ metadata.gz: efd1903840f068f411f75c6c1f8fae4899ffe48fc28a803785a3831203e81ba4
4
+ data.tar.gz: f1365594c65b1a0b1c13858cfdb3b65db727e7b566120619e124fa54f3702841
5
5
  SHA512:
6
- metadata.gz: 2d0df1c773487691fc4bc96b46898a3b186dba0500301e71b0e30e345aee646c3fd10fabcae5c95313264f0207381883591e904544a56f471cf38d55d17139fc
7
- data.tar.gz: 2ab77e2a3986850ab3619015121b964b42d297ef57edcdddf9b44c89e3d4d19cec1f1139f4471b9550a8136393f3d79daaeb6ea9938de59462a0fae6f40bce64
6
+ metadata.gz: f349ce044cc13391c2b67f7aab70edf73952c3a8159b5282697d8c935171bf73f16c0a0b34aaaa5d4912a68f94031d37a0a8cd5e84c463b839341ecfc95b9b83
7
+ data.tar.gz: b8ba1d475126a7ac3e5883df8146bfd9ca01a96149a8e30dbcce37b99c4892eb0f15651370e6256dd1bf2aedf669259818d1e460a44c3c5a532bb331007032ea
data/README.mkd CHANGED
@@ -31,9 +31,14 @@ pdf.render
31
31
  to get the txt file for electronic books
32
32
 
33
33
  ```ruby
34
- ple = SunatBooks::Ple::Buys.new(ruc, tickets, month, year)
34
+ ple = SunatBooks::Ple::Buys.new(ruc, tickets, month, year, options)
35
35
  ```
36
36
 
37
+ Currently allowed options are:
38
+ - `yml`: path location to a custom layout file
39
+ - `layout`: a hash to define method names to replace in layout
40
+ - `book_format`: book format to use
41
+
37
42
  [rubygems-image]: https://badge.fury.io/rb/sunat_books.svg
38
43
  [rubygems-url]: https://badge.fury.io/rb/sunat_books
39
44
  [travis-image]: https://travis-ci.org/ccarruitero/sunat_books.svg?branch=master
@@ -15,9 +15,7 @@ module SunatBooks
15
15
  # options
16
16
  # - layout => Array of strings used to get data for csv
17
17
  # - filename
18
- if options[:layout].nil?
19
- raise SunatBooks::Csv::OptionError, "Layout option is required"
20
- end
18
+ raise SunatBooks::Csv::OptionError, "Layout option is required" if options[:layout].nil?
21
19
 
22
20
  filename = options[:filename] || "#{tmp_path}book.csv"
23
21
  fields = options[:layout]
@@ -2,74 +2,45 @@
2
2
 
3
3
  require "csv"
4
4
  require_relative "../common_utils"
5
+ require_relative "./utils"
5
6
 
6
7
  module SunatBooks
7
8
  module Ple
8
9
  class Base
9
10
  include SunatBooks::CommonUtils
11
+ include Utils
10
12
 
11
13
  attr_accessor :file
12
-
13
- def ple_book_name(uid, ruc, month, year, *args)
14
- code = book_code(uid)
15
- code_oportunity = "00" # TODO: case for 'inventarios y balances'
16
- operations_state = args[0] || 1 # 0, 1, 2
17
- content = args[1] || 1 # 1 ,0
18
- currency = args[2] || 1 # 1, 2
19
- name = "LE#{ruc}#{year}#{month}00#{code}#{code_oportunity}"
20
- name << "#{operations_state}#{content}#{currency}1"
14
+ attr_reader :book_format
15
+
16
+ # ruc => company's ruc in string format
17
+ # tickets => an array of objects that respond to a layout's methods
18
+ # month => a number that represent a month
19
+ # year => a number that represent a year
20
+ # options =>
21
+ # :yml => to define a custom layout file
22
+ # :layout => to define a custom name for a specific layout method
23
+ # :book_format => to define ple book format to use
24
+ def initialize(ruc, tickets, month, year, options = {})
25
+ @book_format = options[:book_format]
26
+ yml_path = options[:yml] || default_yml(book_format)
27
+ fields = YAML.load_file(yml_path)
28
+ check_layout(options, fields)
29
+ content = !tickets.empty? ? 1 : 0
30
+
31
+ name = ple_book_name(book_format, ruc, month, year, nil, content)
32
+ filename = "#{path}#{name}.txt"
33
+ get_file(tickets, fields, filename)
21
34
  end
22
35
 
23
- def book_code(uid)
24
- dir = File.dirname(__FILE__)
25
- path = "#{dir}/book_codes.csv"
26
- code = ""
27
- CSV.foreach(path) do |row|
28
- if row[0] == uid
29
- code = row[2]
30
- break
31
- end
32
- end
33
- code
34
- end
36
+ private
35
37
 
36
- def path
38
+ # get default yml file according book format given
39
+ # book_format => ple book format
40
+ def default_yml(book_format)
41
+ book_name = self.class.name.downcase.sub("sunatbooks::ple::", "")
37
42
  dir = File.dirname(__FILE__)
38
- tmp_path = "#{dir}/tmp/"
39
- Dir.mkdir(tmp_path) unless Dir.exist?(tmp_path)
40
- tmp_path
41
- end
42
-
43
- def get_file(tickets, fields, filename)
44
- FileUtils.touch(filename.to_s)
45
-
46
- send("file=", filename)
47
-
48
- tickets.each_with_index do |ticket, i|
49
- ticket_data = get_value(fields, ticket)
50
-
51
- mode = (i.zero? ? "w+" : "a+")
52
- File.open(filename.to_s, mode) do |txt|
53
- txt.puts(ticket_data)
54
- end
55
- end
56
- end
57
-
58
- def get_value(fields, ticket)
59
- data = ""
60
- fields.each do |field|
61
- value = available_value?(ticket, field)
62
- data << "#{value}|"
63
- end
64
- data
65
- end
66
-
67
- def check_layout(options, fields)
68
- options[:layout]&.each do |key, value|
69
- i = fields.index(key.to_s)
70
- fields.delete(key.to_s)
71
- fields.insert(i, value)
72
- end
43
+ "#{dir}/layouts/#{book_name}-#{book_format}.yml"
73
44
  end
74
45
  end
75
46
  end
@@ -6,32 +6,8 @@ module SunatBooks
6
6
  module Ple
7
7
  class Buys < Base
8
8
  def initialize(ruc, tickets, month, year, options = {})
9
- # ruc => company's ruc in string format
10
- # tickets => an array of objects that respond to a layout's methods
11
- # month => a number that represent a month
12
- # year => a number that represent a year
13
- # options =>
14
- # :yml => to define a custom layout file
15
- # :layout => to define a custom name for a specific layout method
16
-
17
- book_name = self.class.name.downcase.sub("sunatbooks::ple::", "")
18
- dir = File.dirname(__FILE__)
19
- yml_path = options[:yml] || "#{dir}/layouts/#{book_name}.yml"
20
- fields = YAML.load_file(yml_path)
21
- check_layout(options, fields)
22
- content = !tickets.empty? ? 1 : 0
23
- name = ple_book_name("8.1", ruc, month, year, nil, content)
24
-
25
- filename = "#{path}#{name}.txt"
26
- get_file(tickets, fields, filename)
27
- end
28
-
29
- def insert_layout_fields(options, fields)
30
- options[:layout].each do |key, value|
31
- i = fields.index(key.to_s)
32
- fields.delete(key.to_s)
33
- fields.insert(i, value)
34
- end
9
+ options[:book_format] = options[:book_format] || "8.1"
10
+ super(ruc, tickets, month, year, options)
35
11
  end
36
12
  end
37
13
  end
@@ -21,14 +21,21 @@
21
21
  - documentn_isc
22
22
  - document_other_tax
23
23
  - document_total
24
- - document_exchange_rate # 1 entero, 3 decimales
24
+ - currency_code
25
+ - exchange_rate # 1 entero, 3 decimales
25
26
  - modified_document_date
26
27
  - modified_document_type # 2
27
28
  - modified_document_serial
28
29
  - modified_document_aduanas_dependency
29
30
  - modified_document_number
30
- - foreign_document_number
31
31
  - detraction_date
32
32
  - detraction_number
33
- - marca_document_retention # retention ? '1' : '0'
34
- - operation_status # current -> '0' '1', -<>?
33
+ - apply_retention? # retention ? '1'
34
+ - clasification_goods_services_adquired
35
+ - contract_or_project
36
+ - inconsistent_exchange
37
+ - inconsistent_provider_inactive
38
+ - inconsistent_provider_igv_exoneration
39
+ - inconsistent_dni_buy_liquidation
40
+ - payment_method
41
+ - anotation_oportunity
@@ -0,0 +1,36 @@
1
+ - period
2
+ - cuo
3
+ - correlative
4
+ - operation_date
5
+ - document_type
6
+ - document_serial
7
+ - document_number
8
+ - document_bi
9
+ - other_concepts
10
+ - document_total
11
+ - document_type_tax_credit
12
+ - document_serial_tax_credit
13
+ - dua_year_emition
14
+ - document_tax_pay
15
+ - retention_amount
16
+ - currency_code
17
+ - exchange_rate
18
+ - not_domiciled_residence_country
19
+ - not_domiciled_name
20
+ - not_domiciled_address
21
+ - not_domiciled_document_number
22
+ - payment_beneficiary_tax_document_number
23
+ - payment_beneficiary_name
24
+ - payment_beneficiary_residence_country
25
+ - economic_link_type
26
+ - gross_income
27
+ - deduction
28
+ - net_income
29
+ - retention_rate
30
+ - retention_tax
31
+ - double_taxation_agreement
32
+ - exoneration
33
+ - income_type
34
+ - service_mode
35
+ - art_76
36
+ - anotation_oportunity
@@ -0,0 +1,31 @@
1
+ - period
2
+ - cuo
3
+ - correlative
4
+ - operation_date
5
+ - pay_date
6
+ - document_type
7
+ - document_serial
8
+ - document_number
9
+ - total_diary_operation_non_credit
10
+ - provider_document_type
11
+ - provider_document_number
12
+ - provider_name
13
+ - document_bi
14
+ - document_igv
15
+ - document_other_concept
16
+ - document_total
17
+ - currency_code
18
+ - exchange_rate
19
+ - modified_document_date
20
+ - modified_document_type # 2
21
+ - modified_document_serial
22
+ - modified_document_number
23
+ - detraction_date
24
+ - detraction_number
25
+ - apply_retention?
26
+ - clasification_goods_services_adquired
27
+ - inconsistent_exchange
28
+ - inconsistent_provider_inactive
29
+ - inconsistent_provider_igv_exoneration
30
+ - payment_method
31
+ - anotation_oportunity
@@ -0,0 +1,33 @@
1
+ - period
2
+ - cuo
3
+ - correlative
4
+ - operation_date
5
+ - pay_date
6
+ - document_type
7
+ - document_serial
8
+ - initial_document_number
9
+ - final_document_number
10
+ - client_document_type
11
+ - client_document_number
12
+ - client_name
13
+ - bi_exported_operation
14
+ - bi_taxable_operation
15
+ - bi_discount
16
+ - igv_tax
17
+ - igv_discount
18
+ - exempt
19
+ - non_taxable
20
+ - isc_tax
21
+ - bi_ivap
22
+ - ivap_tax
23
+ - other_concept
24
+ - total_operation
25
+ - currency_code
26
+ - exchange_rate
27
+ - original_document_date
28
+ - original_document_type
29
+ - original_document_serial
30
+ - original_document_number
31
+ - contract_uid
32
+ - payment_way
33
+ - anotation_oportunity
@@ -6,16 +6,8 @@ module SunatBooks
6
6
  module Ple
7
7
  class Sales < Base
8
8
  def initialize(ruc, tickets, month, year, options = {})
9
- book_name = self.class.name.downcase.sub("sunatbooks::ple::", "")
10
- dir = File.dirname(__FILE__)
11
- yml_path = options[:yml] || "#{dir}/layouts/#{book_name}.yml"
12
- fields = YAML.load_file(yml_path)
13
- check_layout(options, fields)
14
- content = !tickets.empty? ? 1 : 0
15
-
16
- name = ple_book_name("14.2", ruc, month, year, nil, content)
17
- @filename = "#{path}#{name}.txt"
18
- get_file(tickets, fields, @filename)
9
+ options[:book_format] = options[:book_format] || "14.2"
10
+ super(ruc, tickets, month, year, options)
19
11
  end
20
12
  end
21
13
  end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: false
2
+
3
+ module SunatBooks
4
+ module Ple
5
+ module Utils
6
+ def ple_book_name(uid, ruc, month, year, *args)
7
+ code = book_code(uid)
8
+ code_oportunity = "00" # TODO: case for 'inventarios y balances'
9
+ operations_state = args[0] || 1 # 0, 1, 2
10
+ content = args[1] || 1 # 1 ,0
11
+ currency = args[2] || 1 # 1, 2
12
+ name = "LE#{ruc}#{year}#{month}00#{code}#{code_oportunity}"
13
+ name << "#{operations_state}#{content}#{currency}1"
14
+ end
15
+
16
+ def book_code(uid)
17
+ dir = File.dirname(__FILE__)
18
+ path = "#{dir}/book_codes.csv"
19
+ code = ""
20
+ CSV.foreach(path) do |row|
21
+ if row[0] == uid
22
+ code = row[2]
23
+ break
24
+ end
25
+ end
26
+ code
27
+ end
28
+
29
+ def path
30
+ dir = File.dirname(__FILE__)
31
+ tmp_path = "#{dir}/tmp/"
32
+ Dir.mkdir(tmp_path) unless Dir.exist?(tmp_path)
33
+ tmp_path
34
+ end
35
+
36
+ def get_file(tickets, fields, filename)
37
+ FileUtils.touch(filename.to_s)
38
+
39
+ send("file=", filename)
40
+
41
+ tickets.each_with_index do |ticket, i|
42
+ ticket_data = get_value(fields, ticket)
43
+
44
+ mode = (i.zero? ? "w+" : "a+")
45
+ File.open(filename.to_s, mode) do |txt|
46
+ txt.puts(ticket_data)
47
+ end
48
+ end
49
+ end
50
+
51
+ def get_value(fields, ticket)
52
+ data = ""
53
+ fields.each do |field|
54
+ value = available_value?(ticket, field)
55
+ data << "#{value}|"
56
+ end
57
+ data
58
+ end
59
+
60
+ def check_layout(options, fields)
61
+ options[:layout]&.each do |key, value|
62
+ i = fields.index(key.to_s)
63
+ fields.delete(key.to_s)
64
+ fields.insert(i, value)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "sunat_books"
5
- s.version = "0.0.4"
5
+ s.version = "0.1.0"
6
6
  s.summary = "A ruby gem to get accounting books for SUNAT"
7
7
  s.description = s.summary
8
8
  s.authors = ["César Carruitero"]
@@ -2,19 +2,19 @@
2
2
 
3
3
  require_relative "../helper"
4
4
 
5
- setup do
5
+ def ple_buys(opts = {})
6
6
  tickets = [{}]
7
7
  ruc = "102392839213"
8
- @ple_buys = SunatBooks::Ple::Buys.new(ruc, tickets, 10, 2013)
8
+ SunatBooks::Ple::Buys.new(ruc, tickets, 10, 2013, opts)
9
9
  end
10
10
 
11
11
  test "generate txt file" do
12
- assert File.exist?(@ple_buys.file)
12
+ assert File.exist?(ple_buys.file)
13
13
  end
14
14
 
15
15
  test "tickets empty" do
16
- ple_buys = SunatBooks::Ple::Buys.new("10293827481", {}, 10, 2011)
17
- assert File.exist?(ple_buys.file)
16
+ ple = SunatBooks::Ple::Buys.new("10293827481", {}, 10, 2011)
17
+ assert File.exist?(ple.file)
18
18
  end
19
19
 
20
20
  scope "custom layout" do
@@ -47,3 +47,13 @@ scope "custom layout" do
47
47
  assert txt.include?("20/10/2015")
48
48
  end
49
49
  end
50
+
51
+ scope "book_format" do
52
+ test "without book_format option" do
53
+ assert_equal ple_buys.book_format, "8.1"
54
+ end
55
+
56
+ test "with book_format option" do
57
+ assert_equal ple_buys(book_format: "8.2").book_format, "8.2"
58
+ end
59
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../helper"
4
+
5
+ setup do
6
+ @tickets = [{}]
7
+ @ruc = "102392839213"
8
+ end
9
+
10
+ test "generate txt file" do
11
+ ple = SunatBooks::Ple::Sales.new(@ruc, @tickets, 10, 2013)
12
+ assert File.exist?(ple.file)
13
+ end
14
+
15
+ test "allow define book format" do
16
+ options = { book_format: "14.1" }
17
+ ple = SunatBooks::Ple::Sales.new(@ruc, @tickets, 10, 2013, options)
18
+ assert File.exist?(ple.file)
19
+ assert ple.book_format, "14.1"
20
+ end
@@ -2,8 +2,15 @@
2
2
 
3
3
  require_relative "../helper"
4
4
 
5
+ class TestPle
6
+ include SunatBooks::Ple::Utils
7
+ include SunatBooks::CommonUtils
8
+
9
+ attr_accessor :file
10
+ end
11
+
5
12
  setup do
6
- @base = SunatBooks::Ple::Base.new
13
+ @base = TestPle.new
7
14
  end
8
15
 
9
16
  test "book_code" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sunat_books
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - César Carruitero
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-25 00:00:00.000000000 Z
11
+ date: 2020-07-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -171,9 +171,13 @@ files:
171
171
  - lib/sunat_books/ple/base.rb
172
172
  - lib/sunat_books/ple/book_codes.csv
173
173
  - lib/sunat_books/ple/buys.rb
174
- - lib/sunat_books/ple/layouts/buys.yml
175
- - lib/sunat_books/ple/layouts/sales.yml
174
+ - lib/sunat_books/ple/layouts/buys-8.1.yml
175
+ - lib/sunat_books/ple/layouts/buys-8.2.yml
176
+ - lib/sunat_books/ple/layouts/buys-8.3.yml
177
+ - lib/sunat_books/ple/layouts/sales-14.1.yml
178
+ - lib/sunat_books/ple/layouts/sales-14.2.yml
176
179
  - lib/sunat_books/ple/sales.rb
180
+ - lib/sunat_books/ple/utils.rb
177
181
  - sunat_books.gemspec
178
182
  - test/csv/base_test.rb
179
183
  - test/fixtures/base.rb
@@ -187,8 +191,9 @@ files:
187
191
  - test/pdf/pages_utils_test.rb
188
192
  - test/pdf/sales_test.rb
189
193
  - test/pdf/utils_test.rb
190
- - test/ple/base_test.rb
191
194
  - test/ple/buys_test.rb
195
+ - test/ple/sales_test.rb
196
+ - test/ple/utils_test.rb
192
197
  homepage: https://github.com/ccarruitero/sunat_books
193
198
  licenses:
194
199
  - MPL