einvoice 0.1.0 → 0.2.0
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/einvoice.gemspec +2 -0
- data/lib/einvoice/client.rb +13 -0
- data/lib/einvoice/configuration.rb +1 -1
- data/lib/einvoice/connection.rb +7 -2
- data/lib/einvoice/neweb/model/base.rb +39 -0
- data/lib/einvoice/neweb/model/contact.rb +21 -0
- data/lib/einvoice/neweb/model/customer_defined.rb +19 -0
- data/lib/einvoice/neweb/model/invoice.rb +62 -0
- data/lib/einvoice/neweb/model/invoice_item.rb +27 -0
- data/lib/einvoice/neweb/provider.rb +35 -0
- data/lib/einvoice/neweb/validator/carrier_id1_validator.rb +13 -0
- data/lib/einvoice/neweb/validator/carrier_id2_validator.rb +13 -0
- data/lib/einvoice/neweb/validator/customs_clearance_mark_validator.rb +13 -0
- data/lib/einvoice/neweb/validator/print_mark_validator.rb +13 -0
- data/lib/einvoice/{api.rb → provider.rb} +2 -1
- data/lib/einvoice/response.rb +39 -0
- data/lib/einvoice/result.rb +17 -0
- data/lib/einvoice/utils.rb +23 -0
- data/lib/einvoice/version.rb +1 -1
- data/lib/einvoice.rb +9 -8
- data/lib/faraday/request/digest_neweb.rb +5 -3
- metadata +45 -14
- data/lib/einvoice/client/neweb.rb +0 -20
- data/lib/einvoice/model/base.rb +0 -16
- data/lib/einvoice/model/contact.rb +0 -18
- data/lib/einvoice/model/customer_defined.rb +0 -17
- data/lib/einvoice/model/invoice.rb +0 -54
- data/lib/einvoice/model/invoice_item.rb +0 -22
- data/lib/einvoice/validator/carrier_id1_validator.rb +0 -7
- data/lib/einvoice/validator/carrier_id2_validator.rb +0 -7
- data/lib/einvoice/validator/customs_clearance_mark_validator.rb +0 -7
- data/lib/einvoice/validator/print_mark_validator.rb +0 -7
- data/lib/faraday/request/encode_xml.rb +0 -52
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d40d662bce05b0f05bff5b9b980a27abb5a1bb47
|
4
|
+
data.tar.gz: 43edf9033179b4475711025ba4a240e8fe2b116f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 80e76b8fd5a68e4c8c28547751d1f67a2c372b07912bba3ec2768143b73988a88024d17b30e3c9b2d41ed6d383542eb56d36b83ed395e9c49c6706917f79bbad
|
7
|
+
data.tar.gz: 283626dbf581277a1993eef18c6ffad7e666901219df18cd4cb4b031a93ecbb2b8087a48fe1f1488dccae634f254d9ec7b98f25f05f1384c65d04e74eaff0cb1
|
data/einvoice.gemspec
CHANGED
@@ -23,10 +23,12 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_dependency "faraday_middleware"
|
24
24
|
spec.add_dependency "multi_xml"
|
25
25
|
spec.add_dependency "activemodel"
|
26
|
+
spec.add_dependency "activesupport"
|
26
27
|
spec.add_dependency "gyoku"
|
27
28
|
|
28
29
|
spec.add_development_dependency "bundler", "~> 1.11"
|
29
30
|
spec.add_development_dependency "rake", "~> 10.0"
|
31
|
+
spec.add_development_dependency "pry"
|
30
32
|
spec.add_development_dependency "rspec"
|
31
33
|
spec.add_development_dependency "factory_girl"
|
32
34
|
spec.add_development_dependency "shoulda-matchers"
|
data/lib/einvoice/connection.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "faraday_middleware"
|
2
|
+
require "faraday/request/digest_neweb"
|
2
3
|
|
3
4
|
module Einvoice
|
4
5
|
module Connection
|
@@ -11,9 +12,13 @@ module Einvoice
|
|
11
12
|
}
|
12
13
|
|
13
14
|
::Faraday::Connection.new(options) do |connection|
|
15
|
+
connection.request :digest, client_secret
|
16
|
+
connection.request :url_encoded
|
17
|
+
|
18
|
+
# Parser
|
14
19
|
case format.to_s.downcase
|
15
|
-
when "xml" then connection.
|
16
|
-
when "json" then connection.
|
20
|
+
when "xml" then connection.response :xml
|
21
|
+
when "json" then connection.response :json
|
17
22
|
end
|
18
23
|
|
19
24
|
connection.adapter Faraday.default_adapter
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require "active_model"
|
2
|
+
|
3
|
+
require "einvoice/neweb/validator/carrier_id1_validator"
|
4
|
+
require "einvoice/neweb/validator/carrier_id2_validator"
|
5
|
+
require "einvoice/neweb/validator/customs_clearance_mark_validator"
|
6
|
+
require "einvoice/neweb/validator/print_mark_validator"
|
7
|
+
|
8
|
+
module Einvoice
|
9
|
+
module Neweb
|
10
|
+
module Model
|
11
|
+
class Base
|
12
|
+
include ActiveModel::Model
|
13
|
+
include ActiveModel::Validations
|
14
|
+
include ActiveModel::Serialization
|
15
|
+
include ActiveModel::Serializers::JSON
|
16
|
+
|
17
|
+
def attributes=(hash)
|
18
|
+
@invoice_item ||= []
|
19
|
+
hash.each do |key, value|
|
20
|
+
case key.to_sym
|
21
|
+
when :invoice_item
|
22
|
+
value.each { |v| @invoice_item << InvoiceItem.new(v) }
|
23
|
+
when :contact
|
24
|
+
@contact = Contact.new(value)
|
25
|
+
when :customer_defined
|
26
|
+
@customer_defined = CustomerDefined.new(value)
|
27
|
+
else
|
28
|
+
send("#{key}=", value)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def attributes
|
34
|
+
instance_values
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Einvoice
|
2
|
+
module Neweb
|
3
|
+
module Model
|
4
|
+
class Contact < Base
|
5
|
+
VALID_OPTIONS_KEYS = [
|
6
|
+
:name,
|
7
|
+
:address,
|
8
|
+
:t_e_l,
|
9
|
+
:email
|
10
|
+
].freeze
|
11
|
+
|
12
|
+
attr_accessor *VALID_OPTIONS_KEYS
|
13
|
+
|
14
|
+
validates :name, presence: true, length: { maximum: 64 }
|
15
|
+
validates :address, presence: true, length: { maximum: 128 }
|
16
|
+
validates :t_e_l, length: { maximum: 64 }
|
17
|
+
validates :email, length: { maximum: 512 }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Einvoice
|
2
|
+
module Neweb
|
3
|
+
module Model
|
4
|
+
class CustomerDefined < Base
|
5
|
+
VALID_OPTIONS_KEYS = [
|
6
|
+
:project_no,
|
7
|
+
:purchase_no,
|
8
|
+
:stamp_duty_flag
|
9
|
+
].freeze
|
10
|
+
|
11
|
+
attr_accessor *VALID_OPTIONS_KEYS
|
12
|
+
|
13
|
+
validates :project_no, length: { maximum: 64 }
|
14
|
+
validates :purchase_no, length: { maximum: 64 }
|
15
|
+
validates :stamp_duty_flag, length: { maximum: 1 }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Einvoice
|
2
|
+
module Neweb
|
3
|
+
module Model
|
4
|
+
class Invoice < Base
|
5
|
+
include Einvoice::Validator::Neweb
|
6
|
+
|
7
|
+
VALID_OPTIONS_KEYS = [
|
8
|
+
:data_number,
|
9
|
+
:data_date,
|
10
|
+
:seller_id,
|
11
|
+
:buyer_name,
|
12
|
+
:buyer_id,
|
13
|
+
:customs_clearance_mark,
|
14
|
+
:invoice_type,
|
15
|
+
:donate_mark,
|
16
|
+
:carrier_type,
|
17
|
+
:carrier_id1,
|
18
|
+
:carrier_id2,
|
19
|
+
:print_mark,
|
20
|
+
:n_p_o_b_a_n,
|
21
|
+
:random_number,
|
22
|
+
:invoice_item,
|
23
|
+
:sales_amount,
|
24
|
+
:free_tax_sales_amount,
|
25
|
+
:zero_tax_sales_amount,
|
26
|
+
:tax_type,
|
27
|
+
:tax_rate,
|
28
|
+
:tax_amount,
|
29
|
+
:total_amount,
|
30
|
+
:contact,
|
31
|
+
:customer_defined
|
32
|
+
].freeze
|
33
|
+
|
34
|
+
attr_accessor *VALID_OPTIONS_KEYS
|
35
|
+
|
36
|
+
validates :data_number, presence: true, length: { maximum: 20 }
|
37
|
+
validates :data_date, presence: true, length: { maximum: 10 }, format: { with: /\A\d{4}\/\d{2}\/\d{2}\z/ }
|
38
|
+
validates :seller_id, presence: true, length: { maximum: 10 }
|
39
|
+
validates :buyer_name, presence: true, length: { maximum: 60 }
|
40
|
+
validates :buyer_id, presence: true, length: { maximum: 10 }
|
41
|
+
validates :customs_clearance_mark, length: { maximum: 1 }, format: { with: /[01]/ }, customs_clearance_mark: true, allow_blank: true
|
42
|
+
validates :invoice_type, presence: true, length: { maximum: 2 }, format: { with: /07|08/ }
|
43
|
+
validates :donate_mark, presence: true, length: { maximum: 1 }, format: { with: /[01]/ }
|
44
|
+
validates :carrier_type, length: { maximum: 6 }, format: { with: /[a-zA-Z]{2}\d{4}/ }, allow_blank: true
|
45
|
+
validates :carrier_id1, length: { maximum: 64 }, carrier_id1: true, allow_blank: true
|
46
|
+
validates :carrier_id2, length: { maximum: 64 }, carrier_id2: true, allow_blank: true
|
47
|
+
validates :print_mark, presence: true, length: { maximum: 1 }, format: { with: /[YN]/ }, print_mark: true
|
48
|
+
validates :n_p_o_b_a_n, length: { maximum: 10 }
|
49
|
+
validates :random_number, length: { maximum: 4 }
|
50
|
+
validates :invoice_item, presence: true
|
51
|
+
validates :sales_amount, presence: true, length: { maximum: 12 }, numericality: { greater_than_or_equal_to: 0 }
|
52
|
+
validates :free_tax_sales_amount, presence: true, length: { maximum: 12 }, numericality: { greater_than_or_equal_to: 0 }
|
53
|
+
validates :zero_tax_sales_amount, presence: true, length: { maximum: 12 }, numericality: { greater_than_or_equal_to: 0 }
|
54
|
+
validates :tax_type, presence: true, length: { maximum: 1 }
|
55
|
+
validates :tax_rate, presence: true, length: { maximum: 6 }
|
56
|
+
validates :tax_amount, presence: true, length: { maximum: 12 }, numericality: { greater_than_or_equal_to: 0 }
|
57
|
+
validates :total_amount, presence: true, length: { maximum: 12 }, numericality: { greater_than_or_equal_to: 0 }
|
58
|
+
validates :contact, presence: true
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Einvoice
|
2
|
+
module Neweb
|
3
|
+
module Model
|
4
|
+
class InvoiceItem < Base
|
5
|
+
VALID_OPTIONS_KEYS = [
|
6
|
+
:description,
|
7
|
+
:quantity,
|
8
|
+
:unit,
|
9
|
+
:unit_price,
|
10
|
+
:amount,
|
11
|
+
:sequence_number,
|
12
|
+
:remark
|
13
|
+
].freeze
|
14
|
+
|
15
|
+
attr_accessor *VALID_OPTIONS_KEYS
|
16
|
+
|
17
|
+
validates :description, presence: true, length: { maximum: 256 }
|
18
|
+
validates :quantity, presence: true, length: { maximum: 17 }
|
19
|
+
validates :unit, length: { maximum: 6 }
|
20
|
+
validates :unit_price, presence: true, length: { maximum: 17 }
|
21
|
+
validates :amount, presence: true, length: { maximum: 17 }
|
22
|
+
validates :sequence_number, presence: true, length: { maximum: 3 }
|
23
|
+
validates :remark, length: { maximum: 40 }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "einvoice/utils"
|
2
|
+
|
3
|
+
require "einvoice/neweb/model/base"
|
4
|
+
require "einvoice/neweb/model/contact"
|
5
|
+
require "einvoice/neweb/model/customer_defined"
|
6
|
+
require "einvoice/neweb/model/invoice_item"
|
7
|
+
require "einvoice/neweb/model/invoice"
|
8
|
+
|
9
|
+
module Einvoice
|
10
|
+
module Neweb
|
11
|
+
class Provider < Einvoice::Provider
|
12
|
+
include Einvoice::Utils
|
13
|
+
|
14
|
+
def issue(payload)
|
15
|
+
invoice = Einvoice::Neweb::Model::Invoice.new
|
16
|
+
invoice.from_json(payload.to_json)
|
17
|
+
|
18
|
+
if invoice.valid?
|
19
|
+
action = "IN_PreInvoiceS.action"
|
20
|
+
response = connection.post do |request|
|
21
|
+
request.url endpoint + action
|
22
|
+
request.body = {
|
23
|
+
storecode: client_id,
|
24
|
+
xmldata: encode_xml(wrap(serialize(invoice)))
|
25
|
+
}
|
26
|
+
end.body
|
27
|
+
|
28
|
+
Einvoice::Result.new(Einvoice::NewebResponse.new(response))
|
29
|
+
else
|
30
|
+
Einvoice::Result.new(Einvoice::NewebResponse.new(response))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Einvoice
|
2
|
+
module Validator
|
3
|
+
module Neweb
|
4
|
+
class CarrierId1Validator < ActiveModel::EachValidator
|
5
|
+
def validate_each(record, attribute, value)
|
6
|
+
if (record.print_mark.to_s == "Y" && value.present?) || (record.print_mark.to_s == "N" && value.blank?)
|
7
|
+
record.errors.add attribute, options[:message] || :invalid
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Einvoice
|
2
|
+
module Validator
|
3
|
+
module Neweb
|
4
|
+
class CarrierId2Validator < ActiveModel::EachValidator
|
5
|
+
def validate_each(record, attribute, value)
|
6
|
+
if (record.print_mark.to_s == "Y" && value.present?) || (record.print_mark.to_s == "N" && value.blank?)
|
7
|
+
record.errors.add attribute, options[:message] || :invalid
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Einvoice
|
2
|
+
module Validator
|
3
|
+
module Neweb
|
4
|
+
class CustomsClearanceMarkValidator < ActiveModel::EachValidator
|
5
|
+
def validate_each(record, attribute, value)
|
6
|
+
if record.tax_rate.present? && record.tax_rate.to_i.zero? && value.blank?
|
7
|
+
record.errors.add attribute, options[:message] || :invalid
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Einvoice
|
2
|
+
module Validator
|
3
|
+
module Neweb
|
4
|
+
class PrintMarkValidator < ActiveModel::EachValidator
|
5
|
+
def validate_each(record, attribute, value)
|
6
|
+
if value == "Y" && (record.carrier_id1.present? || record.carrier_id2.present? || record.donate_mark == "Y")
|
7
|
+
record.errors.add attribute, options[:message] || :invalid
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Einvoice
|
2
|
+
class Response
|
3
|
+
attr_reader :response
|
4
|
+
|
5
|
+
def initialize(response = nil)
|
6
|
+
@response = response
|
7
|
+
end
|
8
|
+
|
9
|
+
def errors
|
10
|
+
raise NotImplementedError, 'You must initialize one of Einvoice::Response subclasses then use it.'
|
11
|
+
end
|
12
|
+
|
13
|
+
def success?
|
14
|
+
raise NotImplementedError, 'You must initialize one of Einvoice::Response subclasses then use it.'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class NewebResponse < Response
|
19
|
+
def errors
|
20
|
+
if response.is_a? ActiveModel::Errors
|
21
|
+
response.full_messages.join('; ')
|
22
|
+
else
|
23
|
+
response && response.fetch("Result", {}) do |data|
|
24
|
+
"#{data["statcode"]}: #{data["statdesc"]}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def success?
|
30
|
+
if response.is_a? ActiveModel::Errors
|
31
|
+
false
|
32
|
+
elsif response && response.fetch("Result", {})["statdesc"] == "0000"
|
33
|
+
true
|
34
|
+
else
|
35
|
+
false
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "gyoku"
|
2
|
+
|
3
|
+
module Einvoice
|
4
|
+
module Utils
|
5
|
+
def serialize(object)
|
6
|
+
object.serializable_hash(except: [:errors, :validation_context], include: [:invoice_item, :contact, :customer_defined])
|
7
|
+
end
|
8
|
+
|
9
|
+
def wrap(hash)
|
10
|
+
{ invoice_root:
|
11
|
+
{ invoice: hash }
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def camelize(hash)
|
16
|
+
hash.deep_transform_keys { |k| k.to_s.camelize }
|
17
|
+
end
|
18
|
+
|
19
|
+
def encode_xml(hash)
|
20
|
+
::Gyoku.xml(hash, key_converter: :none)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/einvoice/version.rb
CHANGED
data/lib/einvoice.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
|
-
require "
|
1
|
+
require "active_support"
|
2
|
+
|
3
|
+
require "einvoice/client"
|
2
4
|
require "einvoice/configuration"
|
3
5
|
require "einvoice/connection"
|
4
|
-
require "einvoice/
|
5
|
-
require "einvoice/
|
6
|
+
require "einvoice/provider"
|
7
|
+
require "einvoice/response"
|
8
|
+
require "einvoice/result"
|
9
|
+
require "einvoice/utils"
|
10
|
+
require "einvoice/version"
|
6
11
|
|
7
|
-
require "einvoice/
|
8
|
-
require "einvoice/model/invoice"
|
9
|
-
require "einvoice/model/invoice_item"
|
10
|
-
require "einvoice/model/contact"
|
11
|
-
require "einvoice/model/customer_defined"
|
12
|
+
require "einvoice/neweb/provider"
|
12
13
|
|
13
14
|
module Einvoice
|
14
15
|
extend Configuration
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'faraday'
|
2
2
|
|
3
|
-
module
|
4
|
-
class DigestNeweb < Faraday::Middleware
|
3
|
+
module Faraday
|
4
|
+
class Request::DigestNeweb < Faraday::Middleware
|
5
5
|
dependency do
|
6
6
|
require 'digest' unless defined?(::Digest)
|
7
7
|
end
|
@@ -13,8 +13,10 @@ module FaradayMiddleware
|
|
13
13
|
|
14
14
|
def call(env)
|
15
15
|
xmldata = env[:body][:xmldata]
|
16
|
-
env[:body][:hash] = Digest::MD5.
|
16
|
+
env[:body][:hash] = Digest::MD5.hexdigest(xmldata + @secret)
|
17
17
|
@app.call env
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
21
|
+
|
22
|
+
Faraday::Request.register_middleware digest: Faraday::Request::DigestNeweb
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: einvoice
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Yun
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: activesupport
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: gyoku
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,6 +122,20 @@ dependencies:
|
|
108
122
|
- - "~>"
|
109
123
|
- !ruby/object:Gem::Version
|
110
124
|
version: '10.0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: pry
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
111
139
|
- !ruby/object:Gem::Dependency
|
112
140
|
name: rspec
|
113
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -168,22 +196,25 @@ files:
|
|
168
196
|
- bin/setup
|
169
197
|
- einvoice.gemspec
|
170
198
|
- lib/einvoice.rb
|
171
|
-
- lib/einvoice/
|
172
|
-
- lib/einvoice/client/neweb.rb
|
199
|
+
- lib/einvoice/client.rb
|
173
200
|
- lib/einvoice/configuration.rb
|
174
201
|
- lib/einvoice/connection.rb
|
175
|
-
- lib/einvoice/model/base.rb
|
176
|
-
- lib/einvoice/model/contact.rb
|
177
|
-
- lib/einvoice/model/customer_defined.rb
|
178
|
-
- lib/einvoice/model/invoice.rb
|
179
|
-
- lib/einvoice/model/invoice_item.rb
|
180
|
-
- lib/einvoice/
|
181
|
-
- lib/einvoice/validator/
|
182
|
-
- lib/einvoice/validator/
|
183
|
-
- lib/einvoice/validator/
|
202
|
+
- lib/einvoice/neweb/model/base.rb
|
203
|
+
- lib/einvoice/neweb/model/contact.rb
|
204
|
+
- lib/einvoice/neweb/model/customer_defined.rb
|
205
|
+
- lib/einvoice/neweb/model/invoice.rb
|
206
|
+
- lib/einvoice/neweb/model/invoice_item.rb
|
207
|
+
- lib/einvoice/neweb/provider.rb
|
208
|
+
- lib/einvoice/neweb/validator/carrier_id1_validator.rb
|
209
|
+
- lib/einvoice/neweb/validator/carrier_id2_validator.rb
|
210
|
+
- lib/einvoice/neweb/validator/customs_clearance_mark_validator.rb
|
211
|
+
- lib/einvoice/neweb/validator/print_mark_validator.rb
|
212
|
+
- lib/einvoice/provider.rb
|
213
|
+
- lib/einvoice/response.rb
|
214
|
+
- lib/einvoice/result.rb
|
215
|
+
- lib/einvoice/utils.rb
|
184
216
|
- lib/einvoice/version.rb
|
185
217
|
- lib/faraday/request/digest_neweb.rb
|
186
|
-
- lib/faraday/request/encode_xml.rb
|
187
218
|
homepage: https://github.com/abookyun/einvoice
|
188
219
|
licenses:
|
189
220
|
- MIT
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Einvoice
|
2
|
-
module Client
|
3
|
-
class Neweb < API
|
4
|
-
def initialize
|
5
|
-
connection.use Faraday::Request::UrlEncoded
|
6
|
-
connection.use Faraday::Request::DigestNeweb :neweb, client_secret
|
7
|
-
end
|
8
|
-
|
9
|
-
def create_invoice(invoice)
|
10
|
-
connection.post do |request|
|
11
|
-
request.url "IN_PreInvoiceS.action"
|
12
|
-
request.body = {
|
13
|
-
StoreCode: client_id,
|
14
|
-
xmldata: invoice.to_json
|
15
|
-
}
|
16
|
-
end.body
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
data/lib/einvoice/model/base.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
require "active_model"
|
2
|
-
|
3
|
-
require "einvoice/validator/carrier_id1_validator"
|
4
|
-
require "einvoice/validator/carrier_id2_validator"
|
5
|
-
require "einvoice/validator/customs_clearance_mark_validator"
|
6
|
-
require "einvoice/validator/print_mark_validator"
|
7
|
-
|
8
|
-
module Einvoice
|
9
|
-
module Model
|
10
|
-
class Base
|
11
|
-
include ActiveModel::Model
|
12
|
-
include ActiveModel::Validations
|
13
|
-
include ActiveModel::Serialization
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
module Einvoice
|
2
|
-
module Model
|
3
|
-
class Contact < Einvoice::Model::Base
|
4
|
-
attr_accessor :name, :address, :t_e_l, :email
|
5
|
-
|
6
|
-
validates :name, presence: true, length: { maximum: 64 }
|
7
|
-
validates :address, presence: true, length: { maximum: 128 }
|
8
|
-
validates :t_e_l, length: { maximum: 64 }
|
9
|
-
validates :email, length: { maximum: 512 }
|
10
|
-
|
11
|
-
def initialize(attributes={})
|
12
|
-
attributes.each do |attribute, value|
|
13
|
-
instance_variable_set("@#{attribute}", value) if respond_to?(attribute.to_sym)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module Einvoice
|
2
|
-
module Model
|
3
|
-
class CustomerDefined < Einvoice::Model::Base
|
4
|
-
attr_accessor :project_no, :purchase_no, :stamp_duty_flag
|
5
|
-
|
6
|
-
validates :project_no, length: { maximum: 64 }
|
7
|
-
validates :purchase_no, length: { maximum: 64 }
|
8
|
-
validates :stamp_duty_flag, length: { maximum: 1 }
|
9
|
-
|
10
|
-
def initialize(attributes={})
|
11
|
-
attributes.each do |attribute, value|
|
12
|
-
instance_variable_set("@#{attribute}", value) if respond_to?(attribute.to_sym)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,54 +0,0 @@
|
|
1
|
-
module Einvoice
|
2
|
-
module Model
|
3
|
-
class Invoice < Einvoice::Model::Base
|
4
|
-
attr_accessor :data_number, :data_date, :seller_id, :buyer_name,
|
5
|
-
:buyer_id, :customs_clearance_mark, :invoice_type,
|
6
|
-
:donate_mark, :carrier_type, :carrier_id1, :carrier_id2,
|
7
|
-
:print_mark, :n_p_o_b_a_n, :random_number, :invoice_items,
|
8
|
-
:sales_amount, :free_tax_sales_amount,
|
9
|
-
:zero_tax_sales_amount, :tax_type, :tax_rate, :tax_amount,
|
10
|
-
:total_amount, :contact, :customer_defined
|
11
|
-
|
12
|
-
validates :data_number, presence: true, length: { maximum: 20 }
|
13
|
-
validates :data_date, presence: true, length: { maximum: 10 }, format: { with: /\A\d{4}\/\d{2}\/\d{2}\z/ }
|
14
|
-
validates :seller_id, presence: true, length: { maximum: 10 }
|
15
|
-
validates :buyer_name, presence: true, length: { maximum: 60 }
|
16
|
-
validates :buyer_id, presence: true, length: { maximum: 10 }
|
17
|
-
validates :customs_clearance_mark, length: { maximum: 1 }, format: { with: /[01]/ }, customs_clearance_mark: true
|
18
|
-
validates :invoice_type, presence: true, length: { maximum: 2 }, format: { with: /07|08/ }
|
19
|
-
validates :donate_mark, presence: true, length: { maximum: 1 }, format: { with: /[01]/ }
|
20
|
-
validates :carrier_type, length: { maximum: 6 }, format: { with: /[a-zA-Z]{2}\d{4}/ }, allow_blank: true
|
21
|
-
validates :carrier_id1, length: { maximum: 64 }, carrier_id1: true
|
22
|
-
validates :carrier_id2, length: { maximum: 64 }, carrier_id2: true
|
23
|
-
validates :print_mark, presence: true, length: { maximum: 1 }, format: { with: /[YN]/ }, print_mark: true
|
24
|
-
validates :n_p_o_b_a_n, length: { maximum: 10 }
|
25
|
-
validates :random_number, length: { maximum: 4 }
|
26
|
-
validates :invoice_items, presence: true
|
27
|
-
validates :sales_amount, presence: true, length: { maximum: 12 }, numericality: { greater_than_or_equal_to: 0 }
|
28
|
-
validates :free_tax_sales_amount, presence: true, length: { maximum: 12 }, numericality: { greater_than_or_equal_to: 0 }
|
29
|
-
validates :zero_tax_sales_amount, presence: true, length: { maximum: 12 }, numericality: { greater_than_or_equal_to: 0 }
|
30
|
-
validates :tax_type, presence: true, length: { maximum: 1 }
|
31
|
-
validates :tax_rate, presence: true, length: { maximum: 6 }
|
32
|
-
validates :tax_amount, presence: true, length: { maximum: 12 }, numericality: { greater_than_or_equal_to: 0 }
|
33
|
-
validates :total_amount, presence: true, length: { maximum: 12 }, numericality: { greater_than_or_equal_to: 0 }
|
34
|
-
validates :contact, presence: true
|
35
|
-
validates :customer_defined, presence: true
|
36
|
-
|
37
|
-
def initialize(attributes={})
|
38
|
-
invoice_items = []
|
39
|
-
attributes.each do |attribute, value|
|
40
|
-
case attribute.to_sym
|
41
|
-
when :invoice_item
|
42
|
-
invoice_items << InvoiceItem.new(value)
|
43
|
-
when :contact
|
44
|
-
contact = Contact.new(value)
|
45
|
-
when :customer_defined
|
46
|
-
customer_defined = CustomerDefined.new(value)
|
47
|
-
else
|
48
|
-
instance_variable_set("@#{attribute}", value) if respond_to?(attribute.to_sym)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module Einvoice
|
2
|
-
module Model
|
3
|
-
class InvoiceItem < Einvoice::Model::Base
|
4
|
-
attr_accessor :description, :quantity, :unit, :unit_price, :amount,
|
5
|
-
:sequence_number, :remark
|
6
|
-
|
7
|
-
validates :description, presence: true, length: { maximum: 256 }
|
8
|
-
validates :quantity, presence: true, length: { maximum: 17 }
|
9
|
-
validates :unit, length: { maximum: 6 }
|
10
|
-
validates :unit_price, presence: true, length: { maximum: 17 }
|
11
|
-
validates :amount, presence: true, length: { maximum: 17 }
|
12
|
-
validates :sequence_number, presence: true, length: { maximum: 3 }
|
13
|
-
validates :remark, length: { maximum: 40 }
|
14
|
-
|
15
|
-
def initialize(attributes={})
|
16
|
-
attributes.each do |attribute, value|
|
17
|
-
instance_variable_set("@#{attribute}", value) if respond_to?(attribute.to_sym)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,7 +0,0 @@
|
|
1
|
-
class CarrierId1Validator < ActiveModel::EachValidator
|
2
|
-
def validate_each(record, attribute, value)
|
3
|
-
if (record.print_mark.to_s == "Y" && value.present?) || (record.print_mark.to_s == "N" && value.blank?)
|
4
|
-
record.errors.add attribute, options[:message] || :invalid
|
5
|
-
end
|
6
|
-
end
|
7
|
-
end
|
@@ -1,7 +0,0 @@
|
|
1
|
-
class CarrierId2Validator < ActiveModel::EachValidator
|
2
|
-
def validate_each(record, attribute, value)
|
3
|
-
if (record.print_mark.to_s == "Y" && value.present?) || (record.print_mark.to_s == "N" && value.blank?)
|
4
|
-
record.errors.add attribute, options[:message] || :invalid
|
5
|
-
end
|
6
|
-
end
|
7
|
-
end
|
@@ -1,7 +0,0 @@
|
|
1
|
-
class PrintMarkValidator < ActiveModel::EachValidator
|
2
|
-
def validate_each(record, attribute, value)
|
3
|
-
if value == "Y" && (record.carrier_id1.present? || record.carrier_id2.present? || record.donate_mark == "Y")
|
4
|
-
record.errors.add attribute, options[:message] || :invalid
|
5
|
-
end
|
6
|
-
end
|
7
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
require 'faraday'
|
2
|
-
|
3
|
-
module FaradayMiddleware
|
4
|
-
# Request middleware that encodes the body as XML.
|
5
|
-
#
|
6
|
-
# Processes only requests with matching Content-type or those without a type.
|
7
|
-
# If a request doesn't have a type but has a body, it sets the Content-type
|
8
|
-
# to XML MIME-type.
|
9
|
-
#
|
10
|
-
# Doesn't try to encode bodies that already are in string form.
|
11
|
-
class EncodeXml < Faraday::Middleware
|
12
|
-
CONTENT_TYPE = 'Content-Type'.freeze
|
13
|
-
MIME_TYPE = 'application/xml'.freeze
|
14
|
-
|
15
|
-
dependency do
|
16
|
-
require 'gyoku' unless defined?(::Gyoku)
|
17
|
-
end
|
18
|
-
|
19
|
-
def call(env)
|
20
|
-
match_content_type(env) do |data|
|
21
|
-
env[:body] = encode data
|
22
|
-
end
|
23
|
-
@app.call env
|
24
|
-
end
|
25
|
-
|
26
|
-
def encode(data)
|
27
|
-
::Gyoku.xml(data, :key_converter => :none)
|
28
|
-
end
|
29
|
-
|
30
|
-
def match_content_type(env)
|
31
|
-
if process_request?(env)
|
32
|
-
env[:request_headers][CONTENT_TYPE] ||= MIME_TYPE
|
33
|
-
yield env[:body] unless env[:body].respond_to?(:to_str)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def process_request?(env)
|
38
|
-
type = request_type(env)
|
39
|
-
has_body?(env) and (type.empty? or type == MIME_TYPE)
|
40
|
-
end
|
41
|
-
|
42
|
-
def has_body?(env)
|
43
|
-
body = env[:body] and !(body.respond_to?(:to_str) and body.empty?)
|
44
|
-
end
|
45
|
-
|
46
|
-
def request_type(env)
|
47
|
-
type = env[:request_headers][CONTENT_TYPE].to_s
|
48
|
-
type = type.split(';', 2).first if type.index(';')
|
49
|
-
type
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|