e_invoice 0.1.0 → 0.1.4

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.
data/e_invoice.gemspec CHANGED
@@ -19,7 +19,14 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
+ spec.required_ruby_version = "~> 2.1"
23
+
24
+ spec.add_dependency "httpclient", "~> 2.7"
25
+
22
26
  spec.add_development_dependency "bundler", "~> 1.10"
23
27
  spec.add_development_dependency "rake", "~> 10.0"
24
- spec.add_development_dependency "rspec"
28
+ spec.add_development_dependency "rspec", "~> 3.4"
29
+ # Coveralls with SimpleCov
30
+ spec.add_development_dependency "simplecov", "~> 0.8"
31
+ spec.add_development_dependency "coveralls", "~> 0.7"
25
32
  end
@@ -0,0 +1,10 @@
1
+ module EInvoice
2
+ VERSION ||= "0.2".freeze
3
+ ONLY_WINNING_INV ||= "N".freeze
4
+ EXPIRATION_TIMESTAMP ||= "2147483647".freeze
5
+ URL ||= "https://www.einvoice.nat.gov.tw".freeze
6
+ HEADER_PATH ||= "/PB2CAPIVAN/invServ/InvServ".freeze
7
+ DETAIL_PATH ||= "/PB2CAPIVAN/invServ/InvServ".freeze
8
+ HEADER_ACTION ||= "carrierInvChk".freeze
9
+ DETAIL_ACTION ||= "carrierInvDetail".freeze
10
+ end
@@ -0,0 +1,28 @@
1
+ require "active_support/core_ext/time/calculations"
2
+
3
+ module EInvoice
4
+ class Duration
5
+ attr_reader :endpoints
6
+
7
+ def initialize(start_date = 3.months.ago, end_date = Time.current)
8
+ @start_date = Date.parse(start_date.to_s)
9
+ @end_date = Date.parse(end_date.to_s)
10
+ @endpoints = divided_by_month
11
+ end
12
+
13
+ private
14
+ def divided_by_month
15
+ month_spans = []
16
+ pointer = @start_date.beginning_of_month
17
+ while pointer < @end_date
18
+ interval_begin = pointer.beginning_of_month
19
+ interval_end = pointer.end_of_month
20
+
21
+ month_spans << { endpoint_begin: interval_begin.strftime("%Y/%m/%d"),
22
+ endpoint_end: interval_end.strftime("%Y/%m/%d") }
23
+ pointer = pointer.next_month
24
+ end
25
+ month_spans
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,33 @@
1
+ require "httpclient"
2
+
3
+ module EInvoice
4
+ class Header < Invoice
5
+ def initialize(payload, start_date, end_date)
6
+ super(payload)
7
+ @start_date = start_date
8
+ @end_date = end_date
9
+ start_and_end_at_the_same_month
10
+ end
11
+
12
+ def request
13
+ params = basic_params
14
+ params[:action] = EInvoice::HEADER_ACTION
15
+ params[:onlyWinningInv] = EInvoice::ONLY_WINNING_INV
16
+ params[:startDate] = @start_date.tr("-", "/")
17
+ params[:endDate] = @end_date.tr("-", "/")
18
+ response = HTTPClient.new.post(EInvoice::URL + EInvoice::HEADER_PATH, params)
19
+ @response_body = JSON.parse(response.body)
20
+ self
21
+ end
22
+
23
+ def details
24
+ @response_body["details"]
25
+ end
26
+
27
+ def start_and_end_at_the_same_month
28
+ if DateTime.parse(@start_date).month != DateTime.parse(@end_date).month
29
+ raise "Start_date & end_date must be the same month."
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ require "httpclient"
2
+
3
+ module EInvoice
4
+ class Info < Invoice
5
+ def initialize(payload, invoice_number, invoice_date, invoice_time)
6
+ super(payload)
7
+ @invoice_number = invoice_number
8
+ @invoice_date = invoice_date
9
+ @invoice_time = invoice_time
10
+ end
11
+
12
+ def request
13
+ params = basic_params
14
+ params[:action] = EInvoice::DETAIL_ACTION
15
+ params[:invNum] = @invoice_number
16
+ params[:invDate] = @invoice_date
17
+ response = HTTPClient.new.post(EInvoice::URL + EInvoice::DETAIL_PATH, params)
18
+ @response_body = JSON.parse(response.body)
19
+ self
20
+ end
21
+
22
+ def details
23
+ seller_name = @response_body["sellerName"]
24
+ @response_body["details"].map do |d|
25
+ d["seller_name"] = seller_name
26
+ d["invoice_number"] = @invoice_number
27
+ d["date"] = @invoice_date
28
+ d["time"] = @invoice_time
29
+ d
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,25 @@
1
+ module EInvoice
2
+ class Invoice
3
+ attr_reader :response_body
4
+
5
+ def initialize(payload)
6
+ @payload = payload
7
+ end
8
+
9
+ def response_code
10
+ @response_body["code"]
11
+ end
12
+
13
+ def basic_params
14
+ { version: EInvoice::VERSION,
15
+ expTimeStamp: EInvoice::EXPIRATION_TIMESTAMP,
16
+ timeStamp: Time.now.to_i + 10,
17
+ uuid: EInvoice::UUID,
18
+ appID: EInvoice::APPID,
19
+ cardNo: @payload.serial,
20
+ cardEncrypt: @payload.encrypt,
21
+ cardType: @payload.type
22
+ }
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,46 @@
1
+ module EInvoice
2
+ class Payload
3
+ attr_reader :type, :serial, :encrypt
4
+
5
+ def initialize(type, serial, encrypt)
6
+ @serial = serial
7
+ @encrypt = encrypt
8
+ @type = type
9
+ end
10
+
11
+ def get_invoices(start_date, end_date)
12
+ result = []
13
+ month_endpoints = Duration.new(start_date, end_date).endpoints
14
+ month_endpoints.each do |m|
15
+ header_details = request_header(m[:endpoint_begin],
16
+ m[:endpoint_end]).details
17
+ header_details.each do |h|
18
+ result += request_info(h).details
19
+ end unless header_details.nil?
20
+ end
21
+ result
22
+ end
23
+
24
+ def request_header(start_date, end_date)
25
+ Header.new(self, start_date, end_date).request
26
+ end
27
+
28
+ def request_info(header)
29
+ invoice_number = header["invNum"]
30
+ invoice_date, invoice_time = fetch_datetime(header["invDate"])
31
+ Info.new(self, invoice_number, invoice_date, invoice_time).request
32
+ end
33
+
34
+ def fetch_datetime(invoice_date)
35
+ year = (invoice_date["year"].to_i + 1911).to_s
36
+ month = invoice_date["month"].to_s
37
+ date = invoice_date["date"].to_s
38
+ hours = invoice_date["hours"].to_s
39
+ minutes = invoice_date["minutes"].to_s
40
+ seconds = invoice_date["seconds"].to_s
41
+ date_time = DateTime.parse(year + "/" + month + "/" + date + " " +
42
+ hours + ":" + minutes + ":" + seconds)
43
+ [date_time.strftime("%Y/%m/%d"), date_time.strftime("%H:%M:%S")]
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,13 @@
1
+ module EInvoice
2
+ class Result
3
+ attr_reader :response_code
4
+
5
+ def initialize(response_code = nil)
6
+ @response_code = response_code
7
+ end
8
+
9
+ def success?
10
+ !@response_code.nil? && @response_code.to_s == "200"
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  module EInvoice
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.4"
3
3
  end
data/lib/e_invoice.rb CHANGED
@@ -1,5 +1,8 @@
1
1
  require "e_invoice/version"
2
-
3
- module EInvoice
4
- # Your code goes here...
5
- end
2
+ require "e_invoice/result"
3
+ require "e_invoice/duration"
4
+ require "e_invoice/invoice"
5
+ require "e_invoice/info"
6
+ require "e_invoice/header"
7
+ require "e_invoice/payload"
8
+ require "e_invoice/configuration"
@@ -0,0 +1,6 @@
1
+ class EInvoiceGenerator < Rails::Generators::Base
2
+ source_root File.expand_path("../templates", __FILE__)
3
+ def create_initializer_file
4
+ copy_file "e_invoice.rb", "config/initializers/e_invoice.rb"
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ require "e_invoice"
2
+
3
+ module EInvoice
4
+ APPID = "your_APPID"
5
+ UUID = "your_UUID"
6
+ end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: e_invoice
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - JasonYCHuang, Lucas Yang(tilumi)
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-03-29 00:00:00.000000000 Z
11
+ date: 2016-04-06 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httpclient
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.7'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -42,16 +56,44 @@ dependencies:
42
56
  name: rspec
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - ">="
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.4'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.4'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.8'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.8'
83
+ - !ruby/object:Gem::Dependency
84
+ name: coveralls
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
46
88
  - !ruby/object:Gem::Version
47
- version: '0'
89
+ version: '0.7'
48
90
  type: :development
49
91
  prerelease: false
50
92
  version_requirements: !ruby/object:Gem::Requirement
51
93
  requirements:
52
- - - ">="
94
+ - - "~>"
53
95
  - !ruby/object:Gem::Version
54
- version: '0'
96
+ version: '0.7'
55
97
  description: With valid EASYCARD number and encrypt code, a user can get e-invoice
56
98
  data.
57
99
  email:
@@ -60,9 +102,11 @@ executables: []
60
102
  extensions: []
61
103
  extra_rdoc_files: []
62
104
  files:
105
+ - ".codeclimate.yml"
63
106
  - ".editorconfig"
64
107
  - ".gitignore"
65
108
  - ".rspec"
109
+ - ".rubocop.yml"
66
110
  - ".travis.yml"
67
111
  - CHANGELOG.md
68
112
  - CODE_OF_CONDUCT.md
@@ -72,9 +116,19 @@ files:
72
116
  - Rakefile
73
117
  - bin/console
74
118
  - bin/setup
119
+ - codeclimate-config.patch
75
120
  - e_invoice.gemspec
76
121
  - lib/e_invoice.rb
122
+ - lib/e_invoice/configuration.rb
123
+ - lib/e_invoice/duration.rb
124
+ - lib/e_invoice/header.rb
125
+ - lib/e_invoice/info.rb
126
+ - lib/e_invoice/invoice.rb
127
+ - lib/e_invoice/payload.rb
128
+ - lib/e_invoice/result.rb
77
129
  - lib/e_invoice/version.rb
130
+ - lib/generators/e_invoice_generator.rb
131
+ - lib/generators/templates/e_invoice.rb
78
132
  homepage: https://github.com/JasonYCHuang/e_invoice
79
133
  licenses:
80
134
  - MIT
@@ -85,9 +139,9 @@ require_paths:
85
139
  - lib
86
140
  required_ruby_version: !ruby/object:Gem::Requirement
87
141
  requirements:
88
- - - ">="
142
+ - - "~>"
89
143
  - !ruby/object:Gem::Version
90
- version: '0'
144
+ version: '2.1'
91
145
  required_rubygems_version: !ruby/object:Gem::Requirement
92
146
  requirements:
93
147
  - - ">="