sunat_books 0.0.1 → 0.0.2
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 +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
|