sunat_books 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.rubocop.yml +15 -0
- data/.travis.yml +9 -0
- data/Gemfile +2 -4
- data/Gemfile.lock +51 -16
- data/Makefile +2 -1
- data/README.mkd +8 -6
- data/lib/books/base.rb +70 -150
- data/lib/books/buys.rb +34 -82
- data/lib/books/count_sum.rb +4 -2
- data/lib/books/diary_entries.rb +112 -0
- data/lib/books/layouts/sales.yml +2 -2
- data/lib/books/locale.rb +6 -0
- data/lib/books/locales/es.yml +65 -0
- data/lib/books/page.rb +44 -0
- data/lib/books/pages_utils.rb +85 -0
- data/lib/books/sales.rb +40 -81
- data/lib/books/simplified_diary.rb +65 -117
- data/lib/books/utils.rb +105 -0
- data/lib/csv_books/base.rb +67 -0
- data/lib/csv_books/option_error.rb +6 -0
- data/lib/ple_books/base.rb +37 -22
- data/lib/ple_books/buys.rb +16 -13
- data/lib/ple_books/layouts/buys.yml +3 -3
- data/lib/ple_books/layouts/sales.yml +1 -1
- data/lib/ple_books/sales.rb +10 -4
- data/lib/sunat_books.rb +8 -4
- data/sunat_books.gemspec +13 -6
- data/test/books/base_test.rb +6 -0
- data/test/books/buys_test.rb +57 -0
- data/test/books/page_test.rb +24 -0
- data/test/books/pages_utils_test.rb +78 -0
- data/test/books/utils_test.rb +42 -0
- data/test/csv_books/base_test.rb +43 -0
- data/test/fixtures/base.rb +11 -0
- data/test/fixtures/company.rb +5 -0
- data/test/fixtures/ticket.rb +4 -9
- data/test/helper.rb +11 -13
- data/test/ple_books/buys_test.rb +49 -0
- data/test/ple_books_test.rb +34 -83
- metadata +109 -20
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../helper"
|
4
|
+
require_relative "../../lib/books/pages_utils"
|
5
|
+
|
6
|
+
include PagesUtils
|
7
|
+
|
8
|
+
setup do
|
9
|
+
@company = Company.new(ruc: Faker::Number.number(11), name: Faker::Name.name)
|
10
|
+
end
|
11
|
+
|
12
|
+
test "render pdf, have a parseable pdf" do
|
13
|
+
tickets = []
|
14
|
+
view = Object.new.tap { |o| o.extend(Prawn::View) }
|
15
|
+
pdf = Books::Buys.new(@company, tickets, view, 2, 3015)
|
16
|
+
page_counter = PDF::Inspector::Page.analyze(pdf.render)
|
17
|
+
assert pdf.page_count == 1
|
18
|
+
assert page_counter.pages.size == 1
|
19
|
+
end
|
20
|
+
|
21
|
+
test "have correct text in header" do
|
22
|
+
tickets = []
|
23
|
+
view = Object.new.tap { |o| o.extend(Prawn::View) }
|
24
|
+
pdf = Books::Buys.new(@company, tickets, view, 2, 3015)
|
25
|
+
reader = PDF::Reader.new(StringIO.new(pdf.render))
|
26
|
+
assert reader.pages.first.text.include?("REGISTRO DE COMPRAS")
|
27
|
+
end
|
28
|
+
|
29
|
+
test "#page_not_full return a page" do
|
30
|
+
pages = []
|
31
|
+
setup_pages(pages, 20, 5)
|
32
|
+
first = pages.at(1)
|
33
|
+
page = page_not_full(first, pages, 20)
|
34
|
+
assert_equal page.class, Books::Page
|
35
|
+
end
|
36
|
+
|
37
|
+
test "#page_not_full return last page when length is less than page_max" do
|
38
|
+
pages = []
|
39
|
+
setup_pages(pages, 20, 5)
|
40
|
+
first_page = pages.at(1)
|
41
|
+
page = page_not_full(first_page, pages, 5)
|
42
|
+
assert_equal page, first_page
|
43
|
+
end
|
44
|
+
|
45
|
+
test "#page_not_full return new page when last page is full" do
|
46
|
+
pages = []
|
47
|
+
setup_pages(pages, 20, 5)
|
48
|
+
first_page = pages.at(1)
|
49
|
+
first_page.length += 5
|
50
|
+
current_page = pages.at(2)
|
51
|
+
page = page_not_full(first_page, pages, 5)
|
52
|
+
assert_equal page, current_page
|
53
|
+
assert_equal page.page_number, 2
|
54
|
+
end
|
55
|
+
|
56
|
+
test "#row_data prepare data that will be include in table's rows" do
|
57
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../helper"
|
4
|
+
require_relative "../../lib/books/page"
|
5
|
+
|
6
|
+
setup do
|
7
|
+
@page = Books::Page.new(1, 1)
|
8
|
+
end
|
9
|
+
|
10
|
+
test "#update_data" do
|
11
|
+
end
|
12
|
+
|
13
|
+
test "#update_fields should return nil if not source is provided" do
|
14
|
+
assert_equal @page.update_fields([]), nil
|
15
|
+
end
|
16
|
+
|
17
|
+
test "#update_fields should handle if undefined method" do
|
18
|
+
other_page = Books::Page.new(2, 1)
|
19
|
+
assert_equal @page.update_fields([:foo], other_page), nil
|
20
|
+
|
21
|
+
other_page.bi_sum += BigDecimal(10)
|
22
|
+
@page.update_fields([:bi_sum], other_page)
|
23
|
+
assert_equal @page.bi_sum, other_page.bi_sum
|
24
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../helper"
|
4
|
+
require_relative "../../lib/books/pages_utils"
|
5
|
+
require_relative "../../lib/books/page"
|
6
|
+
|
7
|
+
include PagesUtils
|
8
|
+
|
9
|
+
test "#setup_pages generate new pages to fill all elements" do
|
10
|
+
pages = []
|
11
|
+
setup_pages(pages, 20, 10)
|
12
|
+
# since array index is used to match page position for buys, and is same as
|
13
|
+
# page_number, we have an extra index
|
14
|
+
assert_equal pages.count, 3
|
15
|
+
|
16
|
+
page = pages.last
|
17
|
+
assert_equal page.page_number, 2
|
18
|
+
assert_equal page.bi_sum, BigDecimal(0)
|
19
|
+
|
20
|
+
other = []
|
21
|
+
setup_pages(other, 29, 27)
|
22
|
+
assert_equal other.count, 3
|
23
|
+
end
|
24
|
+
|
25
|
+
test "#setup_pages generate new pages without extra page" do
|
26
|
+
pages = []
|
27
|
+
setup_pages(pages, 20, 10, 0)
|
28
|
+
assert_equal pages.count, 2
|
29
|
+
end
|
30
|
+
|
31
|
+
test "#setup_new_page copy page sums into current page" do
|
32
|
+
pages = []
|
33
|
+
setup_pages(pages, 52, 27)
|
34
|
+
page = pages[1]
|
35
|
+
page.bi_sum += BigDecimal(20)
|
36
|
+
new_page = setup_new_page(pages, page, 1)
|
37
|
+
assert_equal new_page.bi_sum, page.bi_sum
|
38
|
+
end
|
39
|
+
|
40
|
+
test "#page_index should get a page index according index and page_max" do
|
41
|
+
assert_equal page_index(20, 20), 1
|
42
|
+
assert_equal page_index(30, 20), 2
|
43
|
+
assert_equal page_index(20, 7), 3
|
44
|
+
assert_equal page_index(0, 7), 1
|
45
|
+
end
|
46
|
+
|
47
|
+
test "#split_data, separates data in groups according max_column desired" do
|
48
|
+
row = []
|
49
|
+
(1..29).map { row << "foo" }
|
50
|
+
pages = split_data([row], 20)
|
51
|
+
assert_equal pages.class, Array
|
52
|
+
assert_equal pages.count, 2
|
53
|
+
assert_equal pages[0].data.first.count, 19
|
54
|
+
assert_equal pages[1].data.first.count, 11
|
55
|
+
end
|
56
|
+
|
57
|
+
test "#split_data, split data for more than one array" do
|
58
|
+
data = []
|
59
|
+
(1..3).map do
|
60
|
+
row = []
|
61
|
+
(1..29).map { row << "foo" }
|
62
|
+
data << row
|
63
|
+
end
|
64
|
+
pages = split_data(data, 20)
|
65
|
+
assert_equal pages.count, 2
|
66
|
+
assert_equal pages[0].data.last.count, 19
|
67
|
+
assert_equal pages[1].data.last.count, 11
|
68
|
+
assert_equal pages[0].data.first.count, 20
|
69
|
+
assert_equal pages[1].data.first.count, 11
|
70
|
+
end
|
71
|
+
|
72
|
+
test "#split_data, split in more than 2 arrays" do
|
73
|
+
row = []
|
74
|
+
(1..49).map { row << "foo" }
|
75
|
+
pages = split_data([row], 20)
|
76
|
+
assert_equal pages.count, 3
|
77
|
+
assert pages[2].data.count.positive?
|
78
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../helper"
|
4
|
+
require_relative "../../lib/books/utils"
|
5
|
+
|
6
|
+
include Utils
|
7
|
+
|
8
|
+
setup do
|
9
|
+
@widths = [{ xyz: [20, 23], abc: [41] }]
|
10
|
+
@column_widths = get_column_widths(@widths, :xyz)
|
11
|
+
end
|
12
|
+
|
13
|
+
test "#get_column_widths return an empty obj when dont match key" do
|
14
|
+
column_widths = get_column_widths(@widths, :xyc)
|
15
|
+
assert column_widths.is_a?(Hash)
|
16
|
+
end
|
17
|
+
|
18
|
+
test "#get_column_widths return an array with widths when match key" do
|
19
|
+
assert @column_widths.is_a?(Array)
|
20
|
+
end
|
21
|
+
|
22
|
+
test "#add_widths set column width in options" do
|
23
|
+
opt = { cell_style: {} }
|
24
|
+
add_widths(@column_widths, opt, 15)
|
25
|
+
assert opt[:cell_style].empty?
|
26
|
+
assert opt[:column_widths]
|
27
|
+
end
|
28
|
+
|
29
|
+
test "#add_widths set cell width in options" do
|
30
|
+
opt = { cell_style: {} }
|
31
|
+
add_widths({}, opt, 15)
|
32
|
+
assert opt[:cell_style][:width] == 15
|
33
|
+
end
|
34
|
+
|
35
|
+
test "#sum_count" do
|
36
|
+
end
|
37
|
+
|
38
|
+
test "#order_data_row" do
|
39
|
+
end
|
40
|
+
|
41
|
+
test "#get_row_sums" do
|
42
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../helper"
|
4
|
+
require_relative "../../lib/csv_books/option_error"
|
5
|
+
|
6
|
+
setup do
|
7
|
+
@tickets = []
|
8
|
+
5.times do
|
9
|
+
@tickets << Ticket.new(field: SecureRandom.hex(10))
|
10
|
+
end
|
11
|
+
@base = CsvBooks::Base.new(@tickets, layout: ["field"])
|
12
|
+
end
|
13
|
+
|
14
|
+
test "require a layout array" do
|
15
|
+
assert_raise(CsvBooks::OptionError) { CsvBooks::Base.new(@tickets) }
|
16
|
+
end
|
17
|
+
|
18
|
+
test "should generate csv" do
|
19
|
+
assert File.exist?(@base.file)
|
20
|
+
end
|
21
|
+
|
22
|
+
test "should allow set custom filename" do
|
23
|
+
custom_file = CsvBooks::Base.new(@tickets, layout: [], filename: "name.csv")
|
24
|
+
assert custom_file.file.include?("name.csv")
|
25
|
+
assert File.exist?(custom_file.file)
|
26
|
+
end
|
27
|
+
|
28
|
+
test "should handle undefined layout method" do
|
29
|
+
undefined_method = CsvBooks::Base.new(@tickets, layout: %w[field bar])
|
30
|
+
assert File.exist?(undefined_method.file)
|
31
|
+
end
|
32
|
+
|
33
|
+
test "csv should have the correct row's count" do
|
34
|
+
csv = CSV.open(@base.file, "r+")
|
35
|
+
csv_rows = csv.readlines
|
36
|
+
assert_equal csv_rows.count, 6
|
37
|
+
end
|
38
|
+
|
39
|
+
test "csv should contain headers in first row" do
|
40
|
+
csv = CSV.open(@base.file, "r+")
|
41
|
+
csv_rows = csv.readlines
|
42
|
+
assert_equal csv_rows.first, ["field"]
|
43
|
+
end
|
data/test/fixtures/ticket.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -1,24 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "cutest"
|
2
4
|
require "pry"
|
5
|
+
require "faker"
|
3
6
|
require_relative "../lib/sunat_books"
|
4
7
|
require_relative "fixtures/ticket"
|
8
|
+
require_relative "fixtures/company"
|
9
|
+
|
10
|
+
Prawn.debug = true
|
5
11
|
|
6
|
-
|
12
|
+
require "pdf/inspector"
|
13
|
+
|
14
|
+
def get_line(array, object)
|
7
15
|
str = ""
|
8
|
-
array.each {|f| str += object.send(
|
16
|
+
array.each { |f| str += object.send(f.to_s) + "|" }
|
9
17
|
str
|
10
18
|
end
|
11
19
|
|
12
|
-
def random_string
|
20
|
+
def random_string(array)
|
13
21
|
array.slice(SecureRandom.random_number(array.count - 1))
|
14
22
|
end
|
15
|
-
|
16
|
-
# to search
|
17
|
-
# Array
|
18
|
-
# tap
|
19
|
-
# chunk
|
20
|
-
# transpose
|
21
|
-
# trust
|
22
|
-
# untaint
|
23
|
-
# Hash
|
24
|
-
# dup
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../helper"
|
4
|
+
|
5
|
+
setup do
|
6
|
+
tickets = [{}]
|
7
|
+
ruc = "102392839213"
|
8
|
+
@ple_buys = PleBooks::Buys.new(ruc, tickets, 10, 2013)
|
9
|
+
end
|
10
|
+
|
11
|
+
test "generate txt file" do
|
12
|
+
assert File.exist?(@ple_buys.file)
|
13
|
+
end
|
14
|
+
|
15
|
+
test "tickets empty" do
|
16
|
+
ple_buys = PleBooks::Buys.new("10293827481", {}, 10, 2011)
|
17
|
+
assert File.exist?(ple_buys.file)
|
18
|
+
end
|
19
|
+
|
20
|
+
scope "custom layout" do
|
21
|
+
test "allow custom file for layout" do
|
22
|
+
dir = File.dirname(__FILE__)
|
23
|
+
yml = "#{dir}/../fixtures/custom_layout.yml"
|
24
|
+
tickets = []
|
25
|
+
field_value = SecureRandom.hex(10)
|
26
|
+
tickets << Ticket.new(custom_field: field_value)
|
27
|
+
ple_buys = PleBooks::Buys.new("10293827481", tickets, 10, 2011,
|
28
|
+
yml: yml)
|
29
|
+
file = ple_buys.file
|
30
|
+
assert File.exist?(file)
|
31
|
+
|
32
|
+
txt = File.read(file)
|
33
|
+
assert txt.include?(field_value)
|
34
|
+
end
|
35
|
+
|
36
|
+
test "allow change individual field" do
|
37
|
+
tickets = []
|
38
|
+
tickets << Ticket.new(period: "20151000", operation_day: "20/10/2015")
|
39
|
+
ple_buys = PleBooks::Buys.new("10293827481", tickets, 10, 2015,
|
40
|
+
layout: {
|
41
|
+
operation_date: "operation_day"
|
42
|
+
})
|
43
|
+
file = ple_buys.file
|
44
|
+
assert File.exist?(file)
|
45
|
+
|
46
|
+
txt = File.read(file)
|
47
|
+
assert txt.include?("20/10/2015")
|
48
|
+
end
|
49
|
+
end
|
data/test/ple_books_test.rb
CHANGED
@@ -1,96 +1,47 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
setup do
|
5
|
-
@base = PleBooks::Base.new
|
6
|
-
end
|
7
|
-
|
8
|
-
test 'book_code' do
|
9
|
-
assert @base.book_code('8.1') == '080100'
|
10
|
-
assert @base.book_code('3.1') == '030100'
|
11
|
-
end
|
12
|
-
|
13
|
-
test 'ple_book_name' do
|
14
|
-
name = @base.ple_book_name('8.1', '10201902912', 2015, 11)
|
15
|
-
assert name.length == 33
|
3
|
+
require_relative "helper"
|
16
4
|
|
17
|
-
|
18
|
-
|
19
|
-
|
5
|
+
setup do
|
6
|
+
@base = PleBooks::Base.new
|
7
|
+
end
|
20
8
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
9
|
+
test "book_code" do
|
10
|
+
assert @base.book_code("8.1") == "080100"
|
11
|
+
assert @base.book_code("3.1") == "030100"
|
12
|
+
end
|
25
13
|
|
26
|
-
|
27
|
-
|
28
|
-
|
14
|
+
test "ple_book_name" do
|
15
|
+
name = @base.ple_book_name("8.1", "10201902912", 2015, 11)
|
16
|
+
assert name.length == 33
|
29
17
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
fields.each { |field| hash.merge!("#{field}": SecureRandom.hex(2)) }
|
34
|
-
tickets << Ticket.new(hash)
|
35
|
-
end
|
18
|
+
name = @base.ple_book_name("8.1", "10201902912", 2015, 11, nil, 0)
|
19
|
+
assert name.length == 33
|
20
|
+
assert name[30] == "0"
|
36
21
|
|
37
|
-
|
38
|
-
|
22
|
+
name = @base.ple_book_name("8.1", "10201902912", 2015, 11, nil, nil, 2)
|
23
|
+
assert name.length == 33
|
24
|
+
assert name[31] == "2"
|
25
|
+
end
|
39
26
|
|
40
|
-
|
27
|
+
test "get_file" do
|
28
|
+
fields = []
|
29
|
+
3.times { fields << random_string(String.public_methods) }
|
41
30
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
31
|
+
tickets = []
|
32
|
+
3.times do
|
33
|
+
hash = {}
|
34
|
+
fields.each { |field| hash.merge!("#{field}": SecureRandom.hex(2)) }
|
35
|
+
tickets << Ticket.new(hash)
|
46
36
|
end
|
47
37
|
|
48
|
-
|
49
|
-
|
50
|
-
setup do
|
51
|
-
tickets = [{}]
|
52
|
-
ruc = '102392839213'
|
53
|
-
@ple_buys = PleBooks::Buys.new(ruc, tickets, 10, 2013)
|
54
|
-
end
|
55
|
-
|
56
|
-
test 'generate txt file' do
|
57
|
-
assert File.exists?(@ple_buys.file)
|
58
|
-
end
|
59
|
-
|
60
|
-
test 'tickets empty' do
|
61
|
-
ple_buys = PleBooks::Buys.new('10293827481', {}, 10, 2011)
|
62
|
-
assert File.exists?(ple_buys.file)
|
63
|
-
end
|
38
|
+
filename = "#{@base.path}/some_file.txt"
|
39
|
+
@base.get_file(tickets, fields, filename)
|
64
40
|
|
65
|
-
|
66
|
-
test 'allow custom file for layout' do
|
67
|
-
dir = File.dirname(__FILE__)
|
68
|
-
yml = "#{dir}/fixtures/custom_layout.yml"
|
69
|
-
tickets = []
|
70
|
-
field_value = SecureRandom.hex(10)
|
71
|
-
tickets << Ticket.new(custom_field: field_value)
|
72
|
-
ple_buys = PleBooks::Buys.new('10293827481', tickets, 10, 2011,
|
73
|
-
{yml: yml})
|
74
|
-
file = ple_buys.file
|
75
|
-
assert File.exists?(file)
|
41
|
+
assert File.exist?(filename)
|
76
42
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
test 'allow change individual field' do
|
82
|
-
tickets = []
|
83
|
-
tickets << Ticket.new(period: '20151000', operation_day: '20/10/2015')
|
84
|
-
ple_buys = PleBooks::Buys.new('10293827481', tickets, 10, 2015,
|
85
|
-
{ layout: {
|
86
|
-
operation_date: 'operation_day'
|
87
|
-
}})
|
88
|
-
file = ple_buys.file
|
89
|
-
assert File.exists?(file)
|
90
|
-
|
91
|
-
txt = File.read(file)
|
92
|
-
assert txt.include?('20/10/2015')
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
43
|
+
file_str = File.read(filename)
|
44
|
+
assert file_str.count("\n") == 3
|
45
|
+
assert file_str.split("\n").first == get_line(fields, tickets.first)
|
46
|
+
assert file_str.split("\n").last == get_line(fields, tickets.last)
|
96
47
|
end
|