aub-payroll 0.1.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +39 -0
- data/.eslintignore +8 -0
- data/.eslintrc +128 -0
- data/.rubocop.hound.yml +243 -0
- data/.rubocop.yml +55 -0
- data/.scss-lint.yml +25 -0
- data/.travis.yml +15 -0
- data/DEPLOYING.md +25 -0
- data/README.md +61 -12
- data/aub-payroll.gemspec +24 -14
- data/lib/aub/payroll.rb +16 -1
- data/lib/aub/payroll/{file.rb → epf_file.rb} +1 -1
- data/lib/aub/payroll/{file → epf_file}/footer.rb +6 -7
- data/lib/aub/payroll/{file → epf_file}/header.rb +4 -5
- data/lib/aub/payroll/{file → epf_file}/row.rb +5 -6
- data/lib/aub/payroll/summary_file.rb +19 -0
- data/lib/aub/payroll/summary_file/company_info.rb +23 -0
- data/lib/aub/payroll/summary_file/custom_pdf_kit.rb +14 -0
- data/lib/aub/payroll/summary_file/generator.rb +36 -0
- data/lib/aub/payroll/summary_file/html_generator.rb +75 -0
- data/lib/aub/payroll/summary_file/payroll_info.rb +18 -0
- data/lib/aub/payroll/summary_file/templates/body.slim +75 -0
- data/lib/aub/payroll/summary_file/templates/clear.css +74 -0
- data/lib/aub/payroll/summary_file/templates/footer.js +23 -0
- data/lib/aub/payroll/summary_file/templates/footer.slim +10 -0
- data/lib/aub/payroll/summary_file/templates/header.slim +15 -0
- data/lib/aub/payroll/summary_file/templates/style.scss +178 -0
- data/lib/aub/payroll/summary_file/transaction.rb +16 -0
- data/lib/aub/payroll/version.rb +1 -1
- data/vendor/underscore-min.js +6 -0
- metadata +168 -8
data/.scss-lint.yml
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
exclude:
|
2
|
+
- '*.min.css'
|
3
|
+
- 'vendor/assets/**/*'
|
4
|
+
- 'node_modules/**/*'
|
5
|
+
- 'coverage/**/*'
|
6
|
+
|
7
|
+
linters:
|
8
|
+
ColorKeyword:
|
9
|
+
enabled: false
|
10
|
+
Indentation:
|
11
|
+
width: 2
|
12
|
+
character: "space"
|
13
|
+
LeadingZero:
|
14
|
+
style: "include_zero"
|
15
|
+
ColorVariable:
|
16
|
+
enabled: false
|
17
|
+
Comment:
|
18
|
+
enabled: false
|
19
|
+
SelectorDepth:
|
20
|
+
max_depth: 5
|
21
|
+
NestingDepth:
|
22
|
+
max_depth: 5
|
23
|
+
QualifyingElement:
|
24
|
+
allow_element_with_attribute: true
|
25
|
+
allow_element_with_class: true
|
data/.travis.yml
CHANGED
@@ -1,3 +1,18 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
3
|
- 2.1.6
|
4
|
+
|
5
|
+
env:
|
6
|
+
- CI=true
|
7
|
+
|
8
|
+
before_install:
|
9
|
+
- PWD=`pwd`
|
10
|
+
- "echo '## Installing dependencies'"
|
11
|
+
- "sudo apt-get update"
|
12
|
+
- "sudo apt-get install -y openssl build-essential xorg libssl-dev xfonts-75dpi"
|
13
|
+
- "echo '## Downloading wkhtmltopdf'"
|
14
|
+
- "wget http://download.gna.org/wkhtmltopdf/0.12/0.12.2.1/wkhtmltox-0.12.2.1_linux-wheezy-amd64.deb"
|
15
|
+
- "echo '## Installing wkhtmltox'"
|
16
|
+
- "sudo dpkg -i wkhtmltox-0.12.2.1_linux-wheezy-amd64.deb"
|
17
|
+
- WHICH_WK=`which wkhtmltopdf`
|
18
|
+
- "export WKHTMLTOPDF_CMD=$WHICH_WK"
|
data/DEPLOYING.md
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
## Setup
|
2
|
+
|
3
|
+
In order to deploy a new version of the gem into the wild ...
|
4
|
+
|
5
|
+
You will need to configure your github api token for the changelog.
|
6
|
+
|
7
|
+
Generate a new token for changelogs [here](https://github.com/settings/tokens/new).
|
8
|
+
|
9
|
+
add:
|
10
|
+
|
11
|
+
```bash
|
12
|
+
export CHANGELOG_GITHUB_TOKEN=YOUR_CHANGELOG_API_TOKEN
|
13
|
+
```
|
14
|
+
|
15
|
+
somewhere in your shell init. (ie .zshrc or simillar)
|
16
|
+
|
17
|
+
## Deploying
|
18
|
+
|
19
|
+
1. Update `lib/aub-payroll/version.rb`
|
20
|
+
2. Commit the changed files with the version number eg: `1.8.0`
|
21
|
+
3. Push this to git
|
22
|
+
4. Run `rake release`
|
23
|
+
5. Run `rake changelog` (has to be ran after release since its based on github tagging)
|
24
|
+
6. Commit the changed changelog named something like `changelog for 1.8.0`
|
25
|
+
7. Push this to git
|
data/README.md
CHANGED
@@ -24,23 +24,72 @@ Or install it yourself as:
|
|
24
24
|
|
25
25
|
## Usage
|
26
26
|
|
27
|
+
### Configuration
|
28
|
+
|
29
|
+
This gem uses wkhtmltopdf, it has been tested against version 0.12.3
|
30
|
+
|
31
|
+
If you'r wkhtmltopdf binary is different from the default, you can set it in the gem confuguration as follows:
|
32
|
+
|
27
33
|
```ruby
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
{ account_number: "001120001146", amount: 500.00 },
|
35
|
-
{ account_number: "001120001146", amount: 882.50 },
|
36
|
-
{ account_number: "001120001146", amount: 857.50 },
|
37
|
-
{ account_number: "001120001146", amount: 1_044.00 },
|
38
|
-
{ account_number: "001120001146", amount: 1_612.50 }
|
39
|
-
]
|
34
|
+
AUB::Payroll.configure do |c|
|
35
|
+
c.wkhtmltopdf_bin = 'wkhtmltopdf-0.12.3'
|
36
|
+
end
|
37
|
+
```
|
38
|
+
|
39
|
+
### EPF Bank File
|
40
40
|
|
41
|
+
```ruby
|
42
|
+
file = AUB::Payroll::EPFFile.new company_name: "StyroPrints",
|
43
|
+
date: Date.new(2000, 6, 2),
|
44
|
+
transactions: [
|
45
|
+
{ account_number: "001120001146", amount: 540.00 },
|
46
|
+
{ account_number: "001120001146", amount: 921.00 },
|
47
|
+
{ account_number: "001120001146", amount: 816.25 },
|
48
|
+
{ account_number: "001120001146", amount: 500.00 },
|
49
|
+
{ account_number: "001120001146", amount: 882.50 },
|
50
|
+
{ account_number: "001120001146", amount: 857.50 },
|
51
|
+
{ account_number: "001120001146", amount: 1_044.00 },
|
52
|
+
{ account_number: "001120001146", amount: 1_612.50 }
|
53
|
+
]
|
54
|
+
|
41
55
|
File.write "payroll.epf", file.content
|
42
56
|
```
|
43
57
|
|
58
|
+
### Summary PDF File
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
company_info = {
|
62
|
+
name: 'SomeCorp',
|
63
|
+
account_number: '12345678',
|
64
|
+
bank_branch: 'SomeBranch',
|
65
|
+
address1: '123 some address',
|
66
|
+
address2: '543 some more addresss',
|
67
|
+
prepared_by_name_1: 'William Samson',
|
68
|
+
prepared_by_name_2: 'Junior P. Santos',
|
69
|
+
checked_by_name_1: 'Winnie Po',
|
70
|
+
checked_by_name_2: 'Paul Sen',
|
71
|
+
}
|
72
|
+
|
73
|
+
transactions = [
|
74
|
+
{
|
75
|
+
employee_name: 'John Doe',
|
76
|
+
account_number: '12345678',
|
77
|
+
amount: 1235.45,
|
78
|
+
}
|
79
|
+
] * 47 # ok fine, this is a repeating example, but you'd have real data here :)
|
80
|
+
|
81
|
+
payroll_info = {
|
82
|
+
period_start: Date.new(2010, 1, 1),
|
83
|
+
period_end: Date.new(2010, 1, 31),
|
84
|
+
pay_date: Date.new(2010, 2, 5),
|
85
|
+
total: transactions.sum { |t| t[:amount] },
|
86
|
+
}
|
87
|
+
|
88
|
+
pdf = AUB::Payroll::SummaryFile.generate(company_info: company_info, payroll_info: payroll_info, transactions: transactions)
|
89
|
+
|
90
|
+
File.write "summary.pdf", pdf
|
91
|
+
```
|
92
|
+
|
44
93
|
## Development
|
45
94
|
|
46
95
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/aub-payroll.gemspec
CHANGED
@@ -4,25 +4,35 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'aub/payroll/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'aub-payroll'
|
8
8
|
spec.version = AUB::Payroll::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Ronald Maravilla']
|
10
|
+
spec.email = ['rmaravilla@payrollhero.com']
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
12
|
+
spec.summary = 'An AUB Payroll File Generator.'
|
13
|
+
spec.description = 'An AUB Payroll File Generator.'
|
14
|
+
spec.homepage = 'https://github.com/payrollhero/aub-payroll'
|
15
|
+
spec.license = 'BSD-3-Clause'
|
16
16
|
|
17
17
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
-
spec.bindir =
|
18
|
+
spec.bindir = 'exe'
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
-
spec.require_paths = [
|
20
|
+
spec.require_paths = ['lib']
|
21
21
|
|
22
|
-
spec.add_development_dependency
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency
|
22
|
+
spec.add_development_dependency 'bundler', '~> 1.9'
|
23
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
24
|
+
spec.add_development_dependency 'rspec'
|
25
|
+
spec.add_development_dependency 'pry'
|
26
|
+
spec.add_development_dependency 'shotgun'
|
27
|
+
spec.add_development_dependency 'pdf_spec'
|
28
|
+
spec.add_development_dependency 'github_changelog_generator'
|
25
29
|
|
26
|
-
spec.add_dependency
|
27
|
-
spec.add_dependency
|
30
|
+
spec.add_dependency 'activesupport'
|
31
|
+
spec.add_dependency 'activemodel'
|
32
|
+
spec.add_dependency 'pdfkit'
|
33
|
+
spec.add_dependency 'ph_model'
|
34
|
+
spec.add_dependency 'tilt'
|
35
|
+
spec.add_dependency 'slim'
|
36
|
+
spec.add_dependency 'sass'
|
37
|
+
spec.add_dependency 'configurations', '~> 2.2.0'
|
28
38
|
end
|
data/lib/aub/payroll.rb
CHANGED
@@ -3,11 +3,26 @@ require "active_support"
|
|
3
3
|
require "active_support/dependencies/autoload"
|
4
4
|
require "active_support/core_ext/enumerable"
|
5
5
|
|
6
|
+
require 'pdfkit'
|
7
|
+
require 'ph_model'
|
8
|
+
require 'tilt'
|
9
|
+
require 'configurations'
|
10
|
+
|
6
11
|
module AUB
|
7
12
|
module Payroll
|
8
13
|
extend ActiveSupport::Autoload
|
14
|
+
include Configurations
|
15
|
+
|
16
|
+
configurable :wkhtmltopdf_bin
|
17
|
+
|
18
|
+
configuration_defaults do |c|
|
19
|
+
c.wkhtmltopdf_bin = 'wkhtmltopdf'
|
20
|
+
end
|
9
21
|
|
10
22
|
autoload :Errors
|
11
|
-
autoload :
|
23
|
+
autoload :EPFFile
|
24
|
+
autoload :SummaryFile
|
25
|
+
|
26
|
+
GEM_ROOT = File.expand_path(File.dirname(__FILE__) + '/../..')
|
12
27
|
end
|
13
28
|
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require
|
1
|
+
require 'active_model'
|
2
2
|
|
3
3
|
module AUB
|
4
4
|
module Payroll
|
5
|
-
class
|
5
|
+
class EPFFile::Footer
|
6
6
|
include ActiveModel::Model
|
7
7
|
|
8
8
|
attr_accessor :number_of_records, :total_amount
|
@@ -17,24 +17,23 @@ module AUB
|
|
17
17
|
raise Errors::Invalid, errors.full_messages.to_sentence unless valid?
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
20
|
def to_s
|
22
21
|
[
|
23
|
-
|
22
|
+
'EF', # marks the end of file
|
24
23
|
formatted_number_of_records,
|
25
24
|
formatted_total_amount,
|
26
|
-
|
25
|
+
'0' * 27,
|
27
26
|
].join
|
28
27
|
end
|
29
28
|
|
30
29
|
private
|
31
30
|
|
32
31
|
def formatted_number_of_records
|
33
|
-
|
32
|
+
format '%06d', number_of_records
|
34
33
|
end
|
35
34
|
|
36
35
|
def formatted_total_amount
|
37
|
-
|
36
|
+
format '%015.2f', total_amount
|
38
37
|
end
|
39
38
|
end
|
40
39
|
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require
|
1
|
+
require 'active_model'
|
2
2
|
|
3
3
|
module AUB
|
4
4
|
module Payroll
|
5
|
-
class
|
5
|
+
class EPFFile::Header
|
6
6
|
include ActiveModel::Model
|
7
7
|
|
8
8
|
attr_accessor :company_name, :date
|
@@ -17,10 +17,9 @@ module AUB
|
|
17
17
|
raise Errors::Invalid, errors.full_messages.to_sentence unless valid?
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
20
|
def to_s
|
22
21
|
[
|
23
|
-
|
22
|
+
'BF', # marks the beginning of file
|
24
23
|
formatted_company_name,
|
25
24
|
formatted_date,
|
26
25
|
].join
|
@@ -33,7 +32,7 @@ module AUB
|
|
33
32
|
end
|
34
33
|
|
35
34
|
def formatted_date
|
36
|
-
date.strftime
|
35
|
+
date.strftime '%Y%m%d'
|
37
36
|
end
|
38
37
|
end
|
39
38
|
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require
|
1
|
+
require 'active_model'
|
2
2
|
|
3
3
|
module AUB
|
4
4
|
module Payroll
|
5
|
-
class
|
5
|
+
class EPFFile::Row
|
6
6
|
include ActiveModel::Model
|
7
7
|
|
8
8
|
attr_accessor :account_number, :amount
|
@@ -17,20 +17,19 @@ module AUB
|
|
17
17
|
raise Errors::Invalid, errors.full_messages.to_sentence unless valid?
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
20
|
def to_s
|
22
21
|
[
|
23
|
-
|
22
|
+
'01',
|
24
23
|
account_number,
|
25
24
|
formatted_amount,
|
26
|
-
|
25
|
+
'0' * 22
|
27
26
|
].join
|
28
27
|
end
|
29
28
|
|
30
29
|
private
|
31
30
|
|
32
31
|
def formatted_amount
|
33
|
-
|
32
|
+
format '%014.2f', amount
|
34
33
|
end
|
35
34
|
end
|
36
35
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module AUB
|
2
|
+
module Payroll
|
3
|
+
module SummaryFile
|
4
|
+
extend ActiveSupport::Autoload
|
5
|
+
|
6
|
+
autoload :Generator
|
7
|
+
autoload :HTMLGenerator
|
8
|
+
autoload :CompanyInfo
|
9
|
+
autoload :PayrollInfo
|
10
|
+
autoload :Transaction
|
11
|
+
autoload :CustomPDFKit
|
12
|
+
|
13
|
+
def self.generate(*args)
|
14
|
+
Generator.new(*args).generate
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module AUB
|
2
|
+
module Payroll
|
3
|
+
module SummaryFile
|
4
|
+
class CompanyInfo
|
5
|
+
include PhModel
|
6
|
+
|
7
|
+
attribute :name
|
8
|
+
attribute :account_number
|
9
|
+
attribute :address1
|
10
|
+
attribute :address2
|
11
|
+
attribute :bank_branch
|
12
|
+
|
13
|
+
attribute :prepared_by_name_1
|
14
|
+
attribute :prepared_by_name_2
|
15
|
+
attribute :checked_by_name_1
|
16
|
+
attribute :checked_by_name_2
|
17
|
+
|
18
|
+
validates :name, :account_number, :bank_branch, presence: true
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module AUB
|
2
|
+
module Payroll
|
3
|
+
module SummaryFile
|
4
|
+
|
5
|
+
# just overriding executable so its easy to configure this for the gem directly
|
6
|
+
class CustomPDFKit < PDFKit
|
7
|
+
def executable
|
8
|
+
AUB::Payroll.configuration.wkhtmltopdf_bin
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module AUB
|
2
|
+
module Payroll
|
3
|
+
module SummaryFile
|
4
|
+
class Generator
|
5
|
+
|
6
|
+
def initialize(company_info:, payroll_info:, transactions:)
|
7
|
+
@company_info = CompanyInfo.build(company_info)
|
8
|
+
@payroll_info = PayrollInfo.build(payroll_info)
|
9
|
+
@transactions = transactions.map { |transaction| Transaction.build(transaction) }
|
10
|
+
end
|
11
|
+
|
12
|
+
def generate
|
13
|
+
html_generator.generate do
|
14
|
+
kit = File.open('body.html', 'r') do |body_file|
|
15
|
+
options = {
|
16
|
+
page_size: 'Letter',
|
17
|
+
header_html: 'header.html',
|
18
|
+
footer_html: 'footer.html',
|
19
|
+
margin_top: 38,
|
20
|
+
margin_bottom: 5,
|
21
|
+
margin_left: 0,
|
22
|
+
margin_right: 0,
|
23
|
+
}
|
24
|
+
CustomPDFKit.new(body_file, options)
|
25
|
+
end
|
26
|
+
kit.to_pdf
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def html_generator
|
31
|
+
HTMLGenerator.new(company_info: @company_info, payroll_info: @payroll_info, transactions: @transactions)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|