sunat_books 0.0.2 → 0.0.3
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 +1 -0
- data/.rvmrc +1 -0
- data/.travis.yml +2 -5
- data/README.mkd +9 -3
- data/lib/sunat_books.rb +6 -6
- data/lib/sunat_books/common_utils.rb +9 -0
- data/lib/sunat_books/csv/base.rb +63 -0
- data/lib/sunat_books/csv/option_error.rb +8 -0
- data/lib/sunat_books/pdf/base.rb +134 -0
- data/lib/sunat_books/pdf/buys.rb +36 -0
- data/lib/sunat_books/pdf/count_sum.rb +24 -0
- data/lib/{books → sunat_books/pdf}/diary_entries.rb +1 -3
- data/lib/{books → sunat_books/pdf}/layouts/buys.yml +0 -0
- data/lib/{books → sunat_books/pdf}/layouts/sales.yml +0 -0
- data/lib/{books → sunat_books/pdf}/locale.rb +0 -0
- data/lib/{books → sunat_books/pdf}/locales/es.yml +0 -0
- data/lib/sunat_books/pdf/page.rb +48 -0
- data/lib/{books → sunat_books/pdf}/pages_utils.rb +1 -1
- data/lib/sunat_books/pdf/sales.rb +35 -0
- data/lib/sunat_books/pdf/simplified_diary.rb +94 -0
- data/lib/sunat_books/pdf/trading_book.rb +50 -0
- data/lib/{books → sunat_books/pdf}/utils.rb +4 -6
- data/lib/sunat_books/ple/base.rb +76 -0
- data/lib/sunat_books/ple/buys.rb +38 -0
- data/lib/{ple_books → sunat_books/ple}/layouts/buys.yml +0 -0
- data/lib/{ple_books → sunat_books/ple}/layouts/sales.yml +0 -0
- data/lib/sunat_books/ple/sales.rb +22 -0
- data/sunat_books.gemspec +2 -2
- data/test/{csv_books → csv}/base_test.rb +8 -5
- data/test/{books → pdf}/base_test.rb +0 -0
- data/test/pdf/buys_test.rb +27 -0
- data/test/{books → pdf}/page_test.rb +4 -4
- data/test/{books → pdf}/pages_utils_test.rb +32 -2
- data/test/pdf/sales_test.rb +15 -0
- data/test/{books → pdf}/utils_test.rb +7 -1
- data/test/{ple_books_test.rb → ple/base_test.rb} +2 -2
- data/test/{ple_books → ple}/buys_test.rb +8 -8
- metadata +38 -35
- data/Gemfile.lock +0 -83
- data/lib/books/base.rb +0 -132
- data/lib/books/buys.rb +0 -72
- data/lib/books/count_sum.rb +0 -22
- data/lib/books/page.rb +0 -44
- data/lib/books/sales.rb +0 -73
- data/lib/books/simplified_diary.rb +0 -97
- data/lib/csv_books/base.rb +0 -67
- data/lib/csv_books/option_error.rb +0 -6
- data/lib/ple_books/base.rb +0 -75
- data/lib/ple_books/buys.rb +0 -36
- data/lib/ple_books/sales.rb +0 -20
- data/test/books/buys_test.rb +0 -57
data/lib/books/buys.rb
DELETED
@@ -1,72 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "base"
|
4
|
-
require_relative "pages_utils"
|
5
|
-
|
6
|
-
module Books
|
7
|
-
class Buys < Base
|
8
|
-
include PagesUtils
|
9
|
-
|
10
|
-
def initialize(company, tickets, view, month, year)
|
11
|
-
# company => an object that respond to ruc and name methods
|
12
|
-
# tickets => an array of objects that respond to a layout's methods
|
13
|
-
# view => a view context
|
14
|
-
# month => a number that represent a month
|
15
|
-
# year => a number that represent a year
|
16
|
-
super(page_layout: :landscape, margin: [5], page_size: "A4")
|
17
|
-
@view = view
|
18
|
-
@company = company
|
19
|
-
@period = get_period(month, year)
|
20
|
-
@tickets = tickets
|
21
|
-
@book_name = self.class.name.downcase.sub("books::", "")
|
22
|
-
dir = File.dirname(__FILE__)
|
23
|
-
@blayout = YAML.load_file("#{dir}/layouts/#{@book_name}.yml")
|
24
|
-
@page_max = 27
|
25
|
-
|
26
|
-
prawn_book
|
27
|
-
end
|
28
|
-
|
29
|
-
def prawn_book
|
30
|
-
prawn_header "REGISTRO DE COMPRAS", @period, @company
|
31
|
-
@pages = []
|
32
|
-
|
33
|
-
bounding_box([bounds.left + 3, bounds.top - 45], width: 800,
|
34
|
-
height: 530) do
|
35
|
-
setup_pages(@pages, @tickets.length, @page_max)
|
36
|
-
book_body
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def final_row(foot_line_text, page)
|
41
|
-
[{ content: foot_line_text, colspan: 5 },
|
42
|
-
make_sub_table([page.bi_sum, page.igv_sum], 32),
|
43
|
-
make_sub_table([zero, zero], 25),
|
44
|
-
make_sub_table([zero, zero], 25),
|
45
|
-
formated_number(page.non_taxable),
|
46
|
-
zero, zero,
|
47
|
-
formated_number(page.total_sum)]
|
48
|
-
end
|
49
|
-
|
50
|
-
def book_body
|
51
|
-
move_down 5
|
52
|
-
data = []
|
53
|
-
fields = @blayout["headers"]
|
54
|
-
data << table_head(fields, @book_name, @blayout)
|
55
|
-
if @tickets.length.positive?
|
56
|
-
row_data(data, @blayout["widths"], @blayout["align"], fields, "buys")
|
57
|
-
else
|
58
|
-
not_moviment_page(data)
|
59
|
-
end
|
60
|
-
render_prawn_table(data)
|
61
|
-
end
|
62
|
-
|
63
|
-
def render_prawn_table(data)
|
64
|
-
table(data, header: true, cell_style: { borders: [], size: 5,
|
65
|
-
align: :right },
|
66
|
-
column_widths: { 0 => 22, 1 => 35, 2 => 30, 8 => 30,
|
67
|
-
10 => 30, 9 => 22, 11 => 33, 12 => 33 }) do
|
68
|
-
row(0).borders = %i[bottom top]
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
data/lib/books/count_sum.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Books
|
4
|
-
class CountSum
|
5
|
-
def initialize(count_number, initial_value = BigDecimal(0))
|
6
|
-
@sum = initial_value
|
7
|
-
@count_number = count_number
|
8
|
-
end
|
9
|
-
|
10
|
-
def add(value)
|
11
|
-
@sum += value
|
12
|
-
end
|
13
|
-
|
14
|
-
def count
|
15
|
-
@count_number
|
16
|
-
end
|
17
|
-
|
18
|
-
def total
|
19
|
-
@sum
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
data/lib/books/page.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "base"
|
4
|
-
|
5
|
-
module Books
|
6
|
-
class Page < Base
|
7
|
-
attr_accessor :length, :bi_sum, :igv_sum, :total_sum, :non_taxable, :data
|
8
|
-
|
9
|
-
def initialize(page_number, length)
|
10
|
-
@page_number = page_number
|
11
|
-
@length = length
|
12
|
-
@bi_sum = BigDecimal(0)
|
13
|
-
@igv_sum = BigDecimal(0)
|
14
|
-
@total_sum = BigDecimal(0)
|
15
|
-
@non_taxable = BigDecimal(0)
|
16
|
-
@data = []
|
17
|
-
end
|
18
|
-
|
19
|
-
def update_data_buys(ticket)
|
20
|
-
@bi_sum += ticket.taxable_to_taxable_export_bi.round(2)
|
21
|
-
@igv_sum += ticket.taxable_to_taxable_export_igv.round(2)
|
22
|
-
@total_sum += ticket.total_operation_buys.round(2)
|
23
|
-
@non_taxable += ticket.non_taxable unless ticket.non_taxable.nil?
|
24
|
-
end
|
25
|
-
|
26
|
-
def update_data_sales(ticket)
|
27
|
-
@bi_sum += ticket.taxable_bi.round(2)
|
28
|
-
@igv_sum += ticket.igv.round(2)
|
29
|
-
@total_sum += ticket.total_operation_sales.round(2)
|
30
|
-
end
|
31
|
-
|
32
|
-
def update_fields(fields = nil, source = nil)
|
33
|
-
# update fields from a given source
|
34
|
-
return if source.nil?
|
35
|
-
fields&.each do |field|
|
36
|
-
begin
|
37
|
-
send("#{field}=", source.send(field))
|
38
|
-
rescue
|
39
|
-
return nil
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
data/lib/books/sales.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "base"
|
4
|
-
require_relative "pages_utils"
|
5
|
-
|
6
|
-
module Books
|
7
|
-
class Sales < Base
|
8
|
-
include PagesUtils
|
9
|
-
|
10
|
-
def initialize(company, tickets, view, month, year)
|
11
|
-
# company => an object that respond to ruc and name methods
|
12
|
-
# tickets => an array of objects that respond to a layout's methods
|
13
|
-
# view => a view context
|
14
|
-
# month => a number that represent a month
|
15
|
-
# year => a number that represent a year
|
16
|
-
super(page_layout: :landscape, margin: [5], page_size: "A4")
|
17
|
-
@view = view
|
18
|
-
@company = company
|
19
|
-
@period = get_period(month, year)
|
20
|
-
@tickets = tickets
|
21
|
-
@book_name = self.class.name.downcase.sub("books::", "")
|
22
|
-
dir = File.dirname(__FILE__)
|
23
|
-
@blayout = YAML.load_file("#{dir}/layouts/#{@book_name}.yml")
|
24
|
-
@page_max = 29
|
25
|
-
|
26
|
-
prawn_book
|
27
|
-
end
|
28
|
-
|
29
|
-
def prawn_book
|
30
|
-
prawn_header "REGISTRO DE VENTAS", @period, @company
|
31
|
-
@pages = []
|
32
|
-
|
33
|
-
bounding_box([bounds.left + 3, bounds.top - 45], width: 800,
|
34
|
-
height: 530) do
|
35
|
-
setup_pages(@pages, @tickets.length, @page_max)
|
36
|
-
book_body
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def book_body
|
41
|
-
move_down 5
|
42
|
-
data = []
|
43
|
-
fields = @blayout["headers"]
|
44
|
-
data << table_head(fields, @book_name, @blayout)
|
45
|
-
|
46
|
-
if @tickets.length.positive?
|
47
|
-
row_data(data, @blayout["widths"], @blayout["align"], fields, "sales")
|
48
|
-
else
|
49
|
-
not_moviment_page(data)
|
50
|
-
end
|
51
|
-
|
52
|
-
render_prawn_table(data)
|
53
|
-
end
|
54
|
-
|
55
|
-
def render_prawn_table(data)
|
56
|
-
widths_columns = { 0 => 22, 1 => 35, 2 => 30, 5 => 27, 6 => 37, 8 => 20,
|
57
|
-
9 => 33, 10 => 27, 11 => 35, 12 => 29 }
|
58
|
-
|
59
|
-
table(data, header: true,
|
60
|
-
cell_style: { borders: [], size: 5, align: :right },
|
61
|
-
column_widths: widths_columns) do
|
62
|
-
row(0).borders = %i[bottom top]
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def final_row(foot_line_text, page)
|
67
|
-
[{ content: foot_line_text, colspan: 5 }, zero,
|
68
|
-
formated_number(page.bi_sum), make_sub_table([zero, zero], 22), zero,
|
69
|
-
formated_number(page.igv_sum), zero,
|
70
|
-
formated_number(page.total_sum)]
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,97 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "base"
|
4
|
-
require_relative "count_sum"
|
5
|
-
require_relative "diary_entries"
|
6
|
-
require_relative "pages_utils"
|
7
|
-
|
8
|
-
module Books
|
9
|
-
class SimplifiedDiary < Base
|
10
|
-
include DiaryEntries
|
11
|
-
include PagesUtils
|
12
|
-
def initialize(company, tickets, view, month, year)
|
13
|
-
super(page_layout: :landscape, margin: [5], page_size: "A4")
|
14
|
-
@view = view
|
15
|
-
@company = company
|
16
|
-
@tickets = tickets
|
17
|
-
# @book_name = self.class.name.downcase.sub("books::", "")
|
18
|
-
# dir = File.dirname(__FILE__)
|
19
|
-
# @blayout = YAML.load_file("#{dir}/layouts/#{@book_name}.yml")
|
20
|
-
@main_title = "LIBRO DIARIO - FORMATO SIMPLIFICADO"
|
21
|
-
@counts = get_mother_counts @tickets
|
22
|
-
@total_sums = @counts.map { |count| CountSum.new(count) }
|
23
|
-
|
24
|
-
prawn_book(month, year)
|
25
|
-
end
|
26
|
-
|
27
|
-
def prawn_book(month, year)
|
28
|
-
(month.to_i..12).each do |m|
|
29
|
-
start_new_page unless m == month.to_i
|
30
|
-
period = get_period(m, year)
|
31
|
-
|
32
|
-
x = bounds.left + 3
|
33
|
-
y = bounds.top - 10
|
34
|
-
bounding_box([x, y], width: 815, height: 510) do
|
35
|
-
book_body m, year, 20, period
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def book_body(month, year, max_column = nil, period = nil)
|
41
|
-
tickets = @tickets.where(period_month: month, period_year: year)
|
42
|
-
|
43
|
-
# header
|
44
|
-
data = []
|
45
|
-
initial_day = get_date(year.to_i, month.to_i, 1)
|
46
|
-
draw_table_header(tickets, @counts, @total_sums, data, initial_day)
|
47
|
-
|
48
|
-
period_date = get_date(year, month, -1)
|
49
|
-
entries_data(tickets, @counts, @total_sums, data, period_date)
|
50
|
-
|
51
|
-
book_header period, @company.ruc, @company.name, @main_title
|
52
|
-
draw_table_body(data, max_column, period)
|
53
|
-
end
|
54
|
-
|
55
|
-
def not_moviment_data(data)
|
56
|
-
data << [{ content: "SIN MOVIMIENTO EN EL PERIODO", colspan: 5 }]
|
57
|
-
end
|
58
|
-
|
59
|
-
def entries_data(tickets, counts, total_sums, data, period_date)
|
60
|
-
return not_moviment_data(data) if tickets.empty?
|
61
|
-
sales_entry(tickets, counts, total_sums, data, period_date)
|
62
|
-
buys_entry(tickets, counts, total_sums, data, period_date)
|
63
|
-
other_entry(tickets, counts, total_sums, data)
|
64
|
-
close_entry(tickets, counts, total_sums, data)
|
65
|
-
total_entry(total_sums, data)
|
66
|
-
end
|
67
|
-
|
68
|
-
def draw_table_header(tickets, counts, total_sums, data, date)
|
69
|
-
data << ["FECHA", "OPERACIÓN", counts].flatten
|
70
|
-
|
71
|
-
# body
|
72
|
-
initial_data = initial_entry(tickets, counts, total_sums)
|
73
|
-
data << [date, "ASIENTO INICIAL DEL PERIODO", initial_data].flatten
|
74
|
-
end
|
75
|
-
|
76
|
-
def draw_table_body(data, max_column, period)
|
77
|
-
return render_prawn_table(data) unless data.first.count > max_column
|
78
|
-
|
79
|
-
pages = split_data(data, max_column)
|
80
|
-
|
81
|
-
pages.each do |page|
|
82
|
-
prawn_new_page(period) unless page.page_number.zero?
|
83
|
-
render_prawn_table(page.data)
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def prawn_new_page(period)
|
88
|
-
start_new_page
|
89
|
-
book_header period, @company.ruc, @company.name, @main_title
|
90
|
-
end
|
91
|
-
|
92
|
-
def render_prawn_table(data)
|
93
|
-
table(data, header: true, cell_style: { borders: [], size: 6 },
|
94
|
-
column_widths: { 1 => 73 })
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
data/lib/csv_books/base.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "csv"
|
4
|
-
require_relative "option_error"
|
5
|
-
|
6
|
-
module CsvBooks
|
7
|
-
class Base
|
8
|
-
attr_accessor :file
|
9
|
-
|
10
|
-
def initialize(tickets, options = {})
|
11
|
-
# options
|
12
|
-
# - layout => Array of strings used to get data for csv
|
13
|
-
# - filename
|
14
|
-
if options[:layout].nil?
|
15
|
-
raise CsvBooks::OptionError.new(msg: "Layout option is required")
|
16
|
-
end
|
17
|
-
filename = options[:filename] || "#{tmp_path}book.csv"
|
18
|
-
fields = options[:layout]
|
19
|
-
get_file(filename, fields, tickets)
|
20
|
-
end
|
21
|
-
|
22
|
-
def get_file(filename, fields, tickets)
|
23
|
-
send("file=", filename)
|
24
|
-
File.exist?(filename) ? File.delete(filename) : nil
|
25
|
-
FileUtils.touch(filename)
|
26
|
-
append_headers(filename, fields)
|
27
|
-
append_data(tickets, filename, fields)
|
28
|
-
end
|
29
|
-
|
30
|
-
def tmp_path
|
31
|
-
dir = File.dirname(__FILE__)
|
32
|
-
tmp_path = "#{dir}/tmp/"
|
33
|
-
Dir.mkdir(tmp_path) unless Dir.exist?(tmp_path)
|
34
|
-
tmp_path
|
35
|
-
end
|
36
|
-
|
37
|
-
def append_headers(filename, fields)
|
38
|
-
append_to_csv(filename, fields, "w+")
|
39
|
-
end
|
40
|
-
|
41
|
-
def append_data(tickets, filename, fields)
|
42
|
-
tickets&.each do |ticket|
|
43
|
-
data = []
|
44
|
-
fields&.each do |field|
|
45
|
-
data << field_value(ticket, field)
|
46
|
-
end
|
47
|
-
append_to_csv(filename, data, "a+")
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def field_value(ticket, field)
|
52
|
-
begin
|
53
|
-
value = ticket.send(field)
|
54
|
-
rescue
|
55
|
-
value = ""
|
56
|
-
end
|
57
|
-
value
|
58
|
-
end
|
59
|
-
|
60
|
-
def append_to_csv(filename, data, mode)
|
61
|
-
return if data.nil?
|
62
|
-
CSV.open(filename, mode) do |csv|
|
63
|
-
csv << data
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
data/lib/ple_books/base.rb
DELETED
@@ -1,75 +0,0 @@
|
|
1
|
-
# frozen_string_literal: false
|
2
|
-
|
3
|
-
require "csv"
|
4
|
-
|
5
|
-
module PleBooks
|
6
|
-
class Base
|
7
|
-
attr_accessor :file
|
8
|
-
|
9
|
-
def ple_book_name(uid, ruc, month, year, *args)
|
10
|
-
code = book_code(uid)
|
11
|
-
code_oportunity = "00" # TODO: case for 'inventarios y balances'
|
12
|
-
operations_state = args[0] || 1 # 0, 1, 2
|
13
|
-
content = args[1] || 1 # 1 ,0
|
14
|
-
currency = args[2] || 1 # 1, 2
|
15
|
-
name = "LE#{ruc}#{year}#{month}00#{code}#{code_oportunity}"
|
16
|
-
name << "#{operations_state}#{content}#{currency}1"
|
17
|
-
end
|
18
|
-
|
19
|
-
def book_code(uid)
|
20
|
-
dir = File.dirname(__FILE__)
|
21
|
-
path = "#{dir}/book_codes.csv"
|
22
|
-
code = ""
|
23
|
-
CSV.foreach(path) do |row|
|
24
|
-
if row[0] == uid
|
25
|
-
code = row[2]
|
26
|
-
break
|
27
|
-
end
|
28
|
-
end
|
29
|
-
code
|
30
|
-
end
|
31
|
-
|
32
|
-
def path
|
33
|
-
dir = File.dirname(__FILE__)
|
34
|
-
tmp_path = "#{dir}/tmp/"
|
35
|
-
Dir.mkdir(tmp_path) unless Dir.exist?(tmp_path)
|
36
|
-
tmp_path
|
37
|
-
end
|
38
|
-
|
39
|
-
def get_file(tickets, fields, filename)
|
40
|
-
FileUtils.touch(filename.to_s)
|
41
|
-
|
42
|
-
send("file=", filename)
|
43
|
-
|
44
|
-
tickets.each_with_index do |ticket, i|
|
45
|
-
ticket_data = get_value(fields, ticket)
|
46
|
-
|
47
|
-
mode = (i.zero? ? "w+" : "a+")
|
48
|
-
File.open(filename.to_s, mode) do |txt|
|
49
|
-
txt.puts(ticket_data)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def get_value(fields, ticket)
|
55
|
-
data = ""
|
56
|
-
fields.each do |field|
|
57
|
-
begin
|
58
|
-
value = ticket.send(field)
|
59
|
-
rescue
|
60
|
-
value = ""
|
61
|
-
end
|
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
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|