fortnox-api 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/.codeclimate.yml +3 -2
- data/.env.test +3 -0
- data/.rubocop.yml +32 -23
- data/.travis.yml +3 -2
- data/Guardfile +2 -2
- data/LICENSE.txt +165 -22
- data/README.md +56 -37
- data/fortnox-api.gemspec +9 -6
- data/lib/fortnox/api.rb +18 -2
- data/lib/fortnox/api/base.rb +5 -3
- data/lib/fortnox/api/environment_validation.rb +51 -6
- data/lib/fortnox/api/mappers.rb +49 -0
- data/lib/fortnox/api/mappers/base.rb +47 -0
- data/lib/fortnox/api/mappers/base/from_json.rb +78 -0
- data/lib/fortnox/api/mappers/base/to_json.rb +65 -0
- data/lib/fortnox/api/mappers/customer.rb +27 -0
- data/lib/fortnox/api/mappers/default_delivery_types.rb +13 -0
- data/lib/fortnox/api/mappers/default_templates.rb +15 -0
- data/lib/fortnox/api/mappers/edi_information.rb +22 -0
- data/lib/fortnox/api/mappers/email_information.rb +18 -0
- data/lib/fortnox/api/mappers/invoice.rb +27 -0
- data/lib/fortnox/api/mappers/invoice_row.rb +20 -0
- data/lib/fortnox/api/mappers/order.rb +23 -0
- data/lib/fortnox/api/mappers/order_row.rb +16 -0
- data/lib/fortnox/api/models.rb +2 -0
- data/lib/fortnox/api/models/base.rb +56 -13
- data/lib/fortnox/api/models/customer.rb +112 -101
- data/lib/fortnox/api/models/document_base.rb +189 -0
- data/lib/fortnox/api/models/invoice.rb +29 -195
- data/lib/fortnox/api/models/label.rb +17 -0
- data/lib/fortnox/api/models/order.rb +27 -0
- data/lib/fortnox/api/repositories.rb +2 -0
- data/lib/fortnox/api/repositories/base.rb +4 -5
- data/lib/fortnox/api/repositories/base/loaders.rb +22 -14
- data/lib/fortnox/api/repositories/base/savers.rb +30 -16
- data/lib/fortnox/api/repositories/customer.rb +3 -25
- data/lib/fortnox/api/repositories/invoice.rb +3 -22
- data/lib/fortnox/api/repositories/order.rb +16 -0
- data/lib/fortnox/api/request_handling.rb +3 -3
- data/lib/fortnox/api/types.rb +44 -0
- data/lib/fortnox/api/types/default_delivery_types.rb +20 -0
- data/lib/fortnox/api/types/default_templates.rb +23 -0
- data/lib/fortnox/api/types/defaulted.rb +11 -0
- data/lib/fortnox/api/types/document_row.rb +65 -0
- data/lib/fortnox/api/types/edi_information.rb +29 -0
- data/lib/fortnox/api/types/email_information.rb +26 -0
- data/lib/fortnox/api/types/enums.rb +75 -0
- data/lib/fortnox/api/types/invoice_row.rb +19 -0
- data/lib/fortnox/api/types/model.rb +40 -0
- data/lib/fortnox/api/types/nullable.rb +21 -0
- data/lib/fortnox/api/types/order_row.rb +16 -0
- data/lib/fortnox/api/types/required.rb +13 -0
- data/lib/fortnox/api/types/sized.rb +25 -0
- data/lib/fortnox/api/version.rb +1 -1
- data/spec/fortnox/api/base_spec.rb +85 -14
- data/spec/fortnox/api/mappers/base/from_json_spec.rb +70 -0
- data/spec/fortnox/api/mappers/base/to_json_spec.rb +76 -0
- data/spec/fortnox/api/mappers/base_spec.rb +156 -0
- data/spec/fortnox/api/mappers/contexts/json_conversion.rb +56 -0
- data/spec/fortnox/api/mappers/customer_spec.rb +25 -0
- data/spec/fortnox/api/mappers/default_delivery_types_spec.rb +12 -0
- data/spec/fortnox/api/mappers/edi_information_spec.rb +21 -0
- data/spec/fortnox/api/mappers/email_information_spec.rb +17 -0
- data/spec/fortnox/api/mappers/examples/mapper.rb +26 -0
- data/spec/fortnox/api/mappers/invoice_row_spec.rb +19 -0
- data/spec/fortnox/api/mappers/invoice_spec.rb +24 -0
- data/spec/fortnox/api/mappers/order_row_spec.rb +14 -0
- data/spec/fortnox/api/mappers/order_spec.rb +20 -0
- data/spec/fortnox/api/models/base_spec.rb +44 -22
- data/spec/fortnox/api/models/customer_spec.rb +9 -0
- data/spec/fortnox/api/models/examples/document_base.rb +13 -0
- data/spec/fortnox/api/models/examples/model.rb +13 -0
- data/spec/fortnox/api/models/invoice_spec.rb +7 -31
- data/spec/fortnox/api/models/order_spec.rb +13 -0
- data/spec/fortnox/api/repositories/customer_spec.rb +20 -76
- data/spec/fortnox/api/repositories/examples/all.rb +17 -0
- data/spec/fortnox/api/repositories/examples/find.rb +25 -0
- data/spec/fortnox/api/repositories/examples/only.rb +42 -0
- data/spec/fortnox/api/repositories/examples/save.rb +69 -0
- data/spec/fortnox/api/repositories/examples/save_with_nested_model.rb +32 -0
- data/spec/fortnox/api/repositories/examples/save_with_specially_named_attribute.rb +27 -0
- data/spec/fortnox/api/repositories/examples/search.rb +31 -0
- data/spec/fortnox/api/repositories/invoice_spec.rb +36 -5
- data/spec/fortnox/api/repositories/order_spec.rb +35 -0
- data/spec/fortnox/api/types/account_number_spec.rb +28 -0
- data/spec/fortnox/api/types/default_delivery_types_spec.rb +10 -0
- data/spec/fortnox/api/types/edi_information_spec.rb +13 -0
- data/spec/fortnox/api/types/email_information_spec.rb +13 -0
- data/spec/fortnox/api/types/email_spec.rb +29 -0
- data/spec/fortnox/api/types/enums_spec.rb +13 -0
- data/spec/fortnox/api/types/examples/document_row.rb +15 -0
- data/spec/fortnox/api/types/examples/enum.rb +48 -0
- data/spec/fortnox/api/types/examples/types.rb +9 -0
- data/spec/fortnox/api/types/house_work_types_spec.rb +60 -0
- data/spec/fortnox/api/types/invoice_row_spec.rb +9 -0
- data/spec/fortnox/api/types/model_spec.rb +56 -0
- data/spec/fortnox/api/types/nullable_spec.rb +57 -0
- data/spec/fortnox/api/types/order_row_spec.rb +13 -0
- data/spec/fortnox/api/types/required_spec.rb +42 -0
- data/spec/fortnox/api/types/sized_spec.rb +74 -0
- data/spec/fortnox/api_spec.rb +16 -15
- data/spec/spec_helper.rb +19 -9
- data/spec/support/helpers/dummy_class_helper.rb +19 -0
- data/spec/support/helpers/environment_helper.rb +7 -0
- data/spec/support/helpers/repository_helper.rb +8 -0
- data/spec/support/helpers/when_performing_helper.rb +5 -0
- data/spec/support/matchers.rb +1 -1
- data/spec/support/matchers/type.rb +17 -0
- data/spec/support/matchers/type/attribute_matcher.rb +39 -0
- data/spec/support/matchers/type/enum_matcher.rb +21 -0
- data/spec/support/matchers/type/have_account_number_matcher.rb +21 -0
- data/spec/support/matchers/type/have_country_code_matcher.rb +13 -0
- data/spec/support/matchers/type/have_currency_matcher.rb +7 -0
- data/spec/support/matchers/type/have_customer_type_matcher.rb +13 -0
- data/spec/support/matchers/type/have_default_delivery_type_matcher.rb +7 -0
- data/spec/support/matchers/type/have_discount_type_matcher.rb +7 -0
- data/spec/support/matchers/type/have_email_matcher.rb +22 -0
- data/spec/support/matchers/type/have_house_work_type_matcher.rb +7 -0
- data/spec/support/matchers/type/have_nullable_date_matcher.rb +58 -0
- data/spec/support/matchers/type/have_nullable_matcher.rb +52 -0
- data/spec/support/matchers/type/have_nullable_string_matcher.rb +49 -0
- data/spec/support/matchers/type/have_sized_float_matcher.rb +8 -0
- data/spec/support/matchers/type/have_sized_integer_matcher.rb +8 -0
- data/spec/support/matchers/type/have_sized_string_matcher.rb +35 -0
- data/spec/support/matchers/type/have_vat_type_matcher.rb +7 -0
- data/spec/support/matchers/type/numeric_matcher.rb +50 -0
- data/spec/support/matchers/type/require_attribute_matcher.rb +69 -0
- data/spec/support/matchers/type/type_matcher.rb +38 -0
- data/spec/vcr_cassettes/customers/all.yml +119 -9
- data/spec/vcr_cassettes/customers/find_id_1.yml +8 -9
- data/spec/vcr_cassettes/customers/find_new.yml +46 -0
- data/spec/vcr_cassettes/customers/save_new.yml +9 -11
- data/spec/vcr_cassettes/customers/save_old.yml +9 -12
- data/spec/vcr_cassettes/customers/save_with_specially_named_attribute.yml +45 -0
- data/spec/vcr_cassettes/customers/search_by_name.yml +66 -0
- data/spec/vcr_cassettes/customers/search_miss.yml +45 -0
- data/spec/vcr_cassettes/invoices/all.yml +104 -0
- data/spec/vcr_cassettes/invoices/filter_hit.yml +46 -0
- data/spec/vcr_cassettes/invoices/filter_invalid.yml +42 -0
- data/spec/vcr_cassettes/invoices/find_id_1.yml +47 -0
- data/spec/vcr_cassettes/invoices/find_new.yml +49 -0
- data/spec/vcr_cassettes/invoices/save_new.yml +48 -0
- data/spec/vcr_cassettes/invoices/save_old.yml +49 -0
- data/spec/vcr_cassettes/invoices/save_with_nested_model.yml +47 -0
- data/spec/vcr_cassettes/invoices/save_with_specially_named_attribute.yml +47 -0
- data/spec/vcr_cassettes/invoices/search_by_name.yml +48 -0
- data/spec/vcr_cassettes/invoices/search_miss.yml +45 -0
- data/spec/vcr_cassettes/orders/all.yml +144 -0
- data/spec/vcr_cassettes/orders/filter_hit.yml +48 -0
- data/spec/vcr_cassettes/orders/filter_invalid.yml +42 -0
- data/spec/vcr_cassettes/orders/find_id_1.yml +48 -0
- data/spec/vcr_cassettes/orders/find_new.yml +49 -0
- data/spec/vcr_cassettes/orders/house_work_type_babysitting.yml +47 -0
- data/spec/vcr_cassettes/orders/house_work_type_cleaning.yml +47 -0
- data/spec/vcr_cassettes/orders/house_work_type_construction.yml +47 -0
- data/spec/vcr_cassettes/orders/house_work_type_cooking.yml +43 -0
- data/spec/vcr_cassettes/orders/house_work_type_electricity.yml +47 -0
- data/spec/vcr_cassettes/orders/house_work_type_gardening.yml +47 -0
- data/spec/vcr_cassettes/orders/house_work_type_glassmetalwork.yml +47 -0
- data/spec/vcr_cassettes/orders/house_work_type_grounddrainagework.yml +47 -0
- data/spec/vcr_cassettes/orders/house_work_type_hvac.yml +47 -0
- data/spec/vcr_cassettes/orders/house_work_type_masonry.yml +47 -0
- data/spec/vcr_cassettes/orders/house_work_type_othercare.yml +47 -0
- data/spec/vcr_cassettes/orders/house_work_type_othercosts.yml +47 -0
- data/spec/vcr_cassettes/orders/house_work_type_paintingwallpapering.yml +47 -0
- data/spec/vcr_cassettes/orders/house_work_type_snowplowing.yml +47 -0
- data/spec/vcr_cassettes/orders/house_work_type_textileclothing.yml +47 -0
- data/spec/vcr_cassettes/orders/house_work_type_tutoring.yml +43 -0
- data/spec/vcr_cassettes/orders/save_new.yml +48 -0
- data/spec/vcr_cassettes/orders/save_old.yml +49 -0
- data/spec/vcr_cassettes/orders/save_with_nested_model.yml +47 -0
- data/spec/vcr_cassettes/orders/search_by_name.yml +47 -0
- data/spec/vcr_cassettes/orders/search_miss.yml +45 -0
- metadata +301 -71
- data/lib/fortnox/api/models/attributes/country_code.rb +0 -17
- data/lib/fortnox/api/models/attributes/currency.rb +0 -17
- data/lib/fortnox/api/models/edi_information.rb +0 -28
- data/lib/fortnox/api/models/email_information.rb +0 -25
- data/lib/fortnox/api/models/row.rb +0 -82
- data/lib/fortnox/api/repositories/base/json_convertion.rb +0 -68
- data/lib/fortnox/api/repositories/base/options.rb +0 -33
- data/lib/fortnox/api/validators.rb +0 -1
- data/lib/fortnox/api/validators/attributes/country_code.rb +0 -42
- data/lib/fortnox/api/validators/attributes/currency.rb +0 -38
- data/lib/fortnox/api/validators/base.rb +0 -70
- data/lib/fortnox/api/validators/constant.rb +0 -21
- data/lib/fortnox/api/validators/customer.rb +0 -29
- data/lib/fortnox/api/validators/edi_information.rb +0 -11
- data/lib/fortnox/api/validators/email_information.rb +0 -19
- data/lib/fortnox/api/validators/invoice.rb +0 -33
- data/lib/fortnox/api/validators/row.rb +0 -22
- data/spec/fortnox/api/models/attributes/country_code_spec.rb +0 -23
- data/spec/fortnox/api/models/attributes/currency_spec.rb +0 -23
- data/spec/fortnox/api/models/attributes/dummy_model_context.rb +0 -9
- data/spec/fortnox/api/models/row_spec.rb +0 -13
- data/spec/fortnox/api/repositories/context.rb +0 -10
- data/spec/fortnox/api/repositories/examples.rb +0 -16
- data/spec/fortnox/api/validators/attributes/country_code_spec.rb +0 -9
- data/spec/fortnox/api/validators/attributes/currency_spec.rb +0 -9
- data/spec/fortnox/api/validators/attributes/examples_for_validate.rb +0 -29
- data/spec/fortnox/api/validators/base_spec.rb +0 -61
- data/spec/fortnox/api/validators/constant_spec.rb +0 -12
- data/spec/fortnox/api/validators/context.rb +0 -102
- data/spec/fortnox/api/validators/customer_spec.rb +0 -31
- data/spec/fortnox/api/validators/edi_information_spec.rb +0 -18
- data/spec/fortnox/api/validators/email_information_spec.rb +0 -26
- data/spec/fortnox/api/validators/invoice_spec.rb +0 -36
- data/spec/fortnox/api/validators/row_spec.rb +0 -27
- data/spec/fortnox/api/validators/validator_examples.rb +0 -20
- data/spec/support/matchers/models.rb +0 -27
- data/spec/support/matchers/validators.rb +0 -36
@@ -0,0 +1,17 @@
|
|
1
|
+
require "fortnox/api/types"
|
2
|
+
|
3
|
+
module Fortnox
|
4
|
+
module API
|
5
|
+
module Model
|
6
|
+
class Label < Model::Base
|
7
|
+
STUB = {}.freeze
|
8
|
+
|
9
|
+
# Id integer, read-only. The ID of the label.
|
10
|
+
attribute :id, Types::Required::Integer.with( read_only: true )
|
11
|
+
|
12
|
+
# Description string, 25 characters, required. Description of the label
|
13
|
+
attribute :description, Types::Sized::String[ 25 ].with( read_only: true )
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require "fortnox/api/models/base"
|
2
|
+
require "fortnox/api/models/document_base"
|
3
|
+
|
4
|
+
module Fortnox
|
5
|
+
module API
|
6
|
+
module Model
|
7
|
+
class Order < Fortnox::API::Model::Base
|
8
|
+
UNIQUE_ID = :document_number
|
9
|
+
STUB = { customer_number: '', order_rows: [] }.freeze
|
10
|
+
|
11
|
+
DocumentBase.ify( self )
|
12
|
+
|
13
|
+
#CopyRemarks I remarks shall copies from order to invoice
|
14
|
+
attribute :copy_remarks, Types::Nullable::Boolean
|
15
|
+
|
16
|
+
# InvoiceReference Reference if an invoice is created from order
|
17
|
+
attribute :invoice_reference, Types::Nullable::Integer.with( read_only: true )
|
18
|
+
|
19
|
+
# OrderDate Date of order
|
20
|
+
attribute :order_date, Types::Nullable::Date
|
21
|
+
|
22
|
+
# OrderRows Separate object
|
23
|
+
attribute :order_rows, Types::Strict::Array.member( Types::OrderRow )
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require "fortnox/api/base"
|
2
|
-
require "fortnox/api/repositories/base/json_convertion"
|
3
2
|
require "fortnox/api/repositories/base/loaders"
|
4
3
|
require "fortnox/api/repositories/base/savers"
|
5
4
|
|
@@ -8,16 +7,16 @@ module Fortnox
|
|
8
7
|
module Repository
|
9
8
|
class Base < Fortnox::API::Base
|
10
9
|
|
11
|
-
include JSONConvertion
|
12
10
|
include Loaders
|
13
11
|
include Savers
|
14
12
|
|
15
|
-
|
13
|
+
attr_reader :mapper, :keys_filtered_on_save
|
16
14
|
|
17
|
-
def initialize(
|
15
|
+
def initialize( keys_filtered_on_save: [ :url ] )
|
18
16
|
super()
|
19
17
|
|
20
|
-
@
|
18
|
+
@keys_filtered_on_save = keys_filtered_on_save
|
19
|
+
@mapper = Registry[ Mapper::Base.canonical_name_sym( self.class::MODEL )].new
|
21
20
|
end
|
22
21
|
|
23
22
|
private
|
@@ -6,19 +6,19 @@ module Fortnox
|
|
6
6
|
module Loaders
|
7
7
|
|
8
8
|
def all()
|
9
|
-
response_hash = get(
|
10
|
-
|
11
|
-
entities_hash.map do |entity_hash|
|
12
|
-
hash_to_entity( entity_hash )
|
13
|
-
end
|
9
|
+
response_hash = get( self.class::URI )
|
10
|
+
instansiate_collection_response( response_hash )
|
14
11
|
end
|
15
12
|
|
16
13
|
def only( filter )
|
17
|
-
response_hash = get(
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
14
|
+
response_hash = get( "#{ self.class::URI }?filter=#{ filter }" )
|
15
|
+
instansiate_collection_response( response_hash )
|
16
|
+
end
|
17
|
+
|
18
|
+
def search( hash )
|
19
|
+
attribute, value = hash.first
|
20
|
+
response_hash = get( "#{ self.class::URI }?#{ attribute }=#{ value }" )
|
21
|
+
instansiate_collection_response( response_hash )
|
22
22
|
end
|
23
23
|
|
24
24
|
def find( id_or_hash )
|
@@ -32,9 +32,8 @@ module Fortnox
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def find_one_by( id )
|
35
|
-
response_hash = get( "#{
|
36
|
-
|
37
|
-
hash_to_entity( entity_hash )
|
35
|
+
response_hash = get( "#{ self.class::URI }#{ id }" )
|
36
|
+
instansiate( @mapper.wrapped_json_hash_to_entity_hash( response_hash ) )
|
38
37
|
end
|
39
38
|
|
40
39
|
# def find_all_by( hash )
|
@@ -48,9 +47,18 @@ module Fortnox
|
|
48
47
|
end
|
49
48
|
|
50
49
|
def escape( key, value )
|
51
|
-
"#{CGI.escape(key.to_s)}=#{CGI.escape(value.to_s)}"
|
50
|
+
"#{ CGI.escape(key.to_s) }=#{ CGI.escape(value.to_s) }"
|
52
51
|
end
|
53
52
|
|
53
|
+
private
|
54
|
+
|
55
|
+
def instansiate_collection_response( response_hash )
|
56
|
+
entities_hash = @mapper.wrapped_json_collection_to_entities_hash( response_hash )
|
57
|
+
entities_hash.map do |entity_hash|
|
58
|
+
instansiate( entity_hash )
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
54
62
|
end
|
55
63
|
end
|
56
64
|
end
|
@@ -6,32 +6,46 @@ module Fortnox
|
|
6
6
|
def save( entity )
|
7
7
|
return true if entity.saved?
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
return save_new( hash ) if entity.new?
|
12
|
-
update_existing( hash )
|
9
|
+
return save_new( entity ) if entity.new?
|
10
|
+
update_existing( entity )
|
13
11
|
end
|
14
12
|
|
15
13
|
private
|
14
|
+
def execute_save( entity )
|
15
|
+
body = get_changes_on( entity ).to_json
|
16
|
+
result = yield body
|
17
|
+
instansiate_saved( result )
|
18
|
+
end
|
16
19
|
|
17
|
-
def save_new(
|
18
|
-
|
20
|
+
def save_new( entity )
|
21
|
+
execute_save( entity ) do |body|
|
22
|
+
post( self.class::URI, { body: body })
|
23
|
+
end
|
19
24
|
end
|
20
25
|
|
21
|
-
def update_existing(
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
)
|
26
|
+
def update_existing( entity )
|
27
|
+
execute_save( entity ) do |body|
|
28
|
+
put( get_update_url_for( entity ), { body: body })
|
29
|
+
end
|
26
30
|
end
|
27
31
|
|
28
|
-
def
|
29
|
-
|
30
|
-
|
32
|
+
def get_changes_on( entity )
|
33
|
+
hash = @mapper.entity_to_hash( entity, @keys_filtered_on_save )
|
34
|
+
parent_hash = @mapper.entity_to_hash( entity.parent, @keys_filtered_on_save )
|
35
|
+
|
36
|
+
@mapper.wrapp_entity_json_hash( @mapper.diff( hash, parent_hash ) )
|
31
37
|
end
|
32
38
|
|
33
|
-
def
|
34
|
-
|
39
|
+
def get_update_url_for( entity )
|
40
|
+
"#{ self.class::URI }#{ entity.unique_id }"
|
41
|
+
end
|
42
|
+
|
43
|
+
def instansiate_saved( wrapped_json_hash )
|
44
|
+
instansiate(
|
45
|
+
@mapper.wrapped_json_hash_to_entity_hash(
|
46
|
+
wrapped_json_hash
|
47
|
+
)
|
48
|
+
)
|
35
49
|
end
|
36
50
|
end
|
37
51
|
end
|
@@ -1,37 +1,15 @@
|
|
1
1
|
require "fortnox/api/repositories/base"
|
2
2
|
require "fortnox/api/models/customer"
|
3
|
+
require "fortnox/api/mappers/customer"
|
3
4
|
|
4
5
|
module Fortnox
|
5
6
|
module API
|
6
7
|
module Repository
|
7
8
|
class Customer < Fortnox::API::Repository::Base
|
8
9
|
|
9
|
-
CONFIGURATION = Fortnox::API::Repository::Base::Options.new(
|
10
|
-
uri: '/customers/',
|
11
|
-
json_collection_wrapper: 'Customers',
|
12
|
-
json_entity_wrapper: 'Customer',
|
13
|
-
unique_id: 'CustomerNumber',
|
14
|
-
attribute_name_to_json_key_map: {
|
15
|
-
vat_type: 'VATType',
|
16
|
-
vat_number: 'VATNumber',
|
17
|
-
email_invoice_bcc: 'EmailInvoiceBCC',
|
18
|
-
email_invoice_cc: 'EmailInvoiceCC',
|
19
|
-
email_offer_bcc: 'EmailOfferBCC',
|
20
|
-
email_offer_cc: 'EmailOfferCC',
|
21
|
-
email_order_bcc: 'EmailOrderBCC',
|
22
|
-
email_order_cc: 'EmailOrderCC',
|
23
|
-
show_price_vat_included: 'ShowPriceVATIncluded',
|
24
|
-
},
|
25
|
-
keys_filtered_on_save: [
|
26
|
-
:url,
|
27
|
-
]
|
28
|
-
)
|
29
10
|
MODEL = Fortnox::API::Model::Customer
|
30
|
-
|
31
|
-
|
32
|
-
super( CONFIGURATION )
|
33
|
-
end
|
34
|
-
|
11
|
+
MAPPER = Fortnox::API::Mapper::Customer
|
12
|
+
URI = '/customers/'.freeze
|
35
13
|
end
|
36
14
|
end
|
37
15
|
end
|
@@ -1,34 +1,15 @@
|
|
1
1
|
require "fortnox/api/repositories/base"
|
2
2
|
require "fortnox/api/models/invoice"
|
3
|
+
require "fortnox/api/mappers/invoice"
|
3
4
|
|
4
5
|
module Fortnox
|
5
6
|
module API
|
6
7
|
module Repository
|
7
8
|
class Invoice < Fortnox::API::Repository::Base
|
8
9
|
|
9
|
-
CONFIGURATION = Fortnox::API::Repository::Base::Options.new(
|
10
|
-
uri: '/invoices/',
|
11
|
-
json_collection_wrapper: 'Invoices',
|
12
|
-
json_entity_wrapper: 'Invoice',
|
13
|
-
unique_id: 'DocumentNumber',
|
14
|
-
attribute_name_to_json_key_map: {
|
15
|
-
administration_fee_vat: 'AdministrationFeeVAT',
|
16
|
-
edi_information: 'EDIInformation',
|
17
|
-
eu_quarterly_report: 'EUQuarterlyReport',
|
18
|
-
freight_vat: 'FreightVAT',
|
19
|
-
ocr: 'OCR',
|
20
|
-
total_vat: 'TotalVAT',
|
21
|
-
vat_included: 'VATIncluded'
|
22
|
-
},
|
23
|
-
keys_filtered_on_save: [
|
24
|
-
:url,
|
25
|
-
]
|
26
|
-
)
|
27
10
|
MODEL = Fortnox::API::Model::Invoice
|
28
|
-
|
29
|
-
|
30
|
-
super( CONFIGURATION )
|
31
|
-
end
|
11
|
+
MAPPER = Fortnox::API::Mapper::Invoice
|
12
|
+
URI = '/invoices/'.freeze
|
32
13
|
end
|
33
14
|
end
|
34
15
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "fortnox/api/repositories/base"
|
2
|
+
require "fortnox/api/models/order"
|
3
|
+
require "fortnox/api/mappers/order"
|
4
|
+
|
5
|
+
module Fortnox
|
6
|
+
module API
|
7
|
+
module Repository
|
8
|
+
class Order < Fortnox::API::Repository::Base
|
9
|
+
|
10
|
+
MODEL = Fortnox::API::Model::Order
|
11
|
+
MAPPER = Fortnox::API::Mapper::Order
|
12
|
+
URI = '/orders/'.freeze
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -7,7 +7,7 @@ module Fortnox
|
|
7
7
|
def raise_api_error( error, response )
|
8
8
|
message = ( error[ 'message' ] || error[ 'Message' ] || 'Okänt fel' )
|
9
9
|
|
10
|
-
message += "\n\n#{response.request.inspect}" if Fortnox::API.debugging
|
10
|
+
message += "\n\n#{ response.request.inspect }" if Fortnox::API.debugging
|
11
11
|
|
12
12
|
raise Fortnox::API::RemoteServerError, message
|
13
13
|
end
|
@@ -24,9 +24,9 @@ module Fortnox
|
|
24
24
|
response.parsed_response
|
25
25
|
end
|
26
26
|
|
27
|
-
def execute
|
27
|
+
def execute
|
28
28
|
self.class.set_headers( @headers )
|
29
|
-
response =
|
29
|
+
response = yield( self.class )
|
30
30
|
validate_and_parse response
|
31
31
|
end
|
32
32
|
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'dry-struct'
|
2
|
+
require 'dry-types'
|
3
|
+
|
4
|
+
module Fortnox
|
5
|
+
module API
|
6
|
+
module Types
|
7
|
+
include Dry::Types.module
|
8
|
+
|
9
|
+
THE_TRUTH = { true => true, 'true' => true, false => false, 'false' => false }.freeze
|
10
|
+
|
11
|
+
require 'fortnox/api/types/required'
|
12
|
+
require 'fortnox/api/types/defaulted'
|
13
|
+
require 'fortnox/api/types/nullable'
|
14
|
+
|
15
|
+
require 'fortnox/api/types/enums'
|
16
|
+
|
17
|
+
require 'fortnox/api/types/sized'
|
18
|
+
|
19
|
+
AccountNumber = Strict::Int.constrained( gt: 0, lteq: 9999 ).optional
|
20
|
+
|
21
|
+
CountryCode = Strict::String.constrained( included_in: CountryCodes.values ).optional.constructor( EnumConstructors.sized(2) )
|
22
|
+
Currency = Strict::String.constrained( included_in: Currencies.values ).optional.constructor( EnumConstructors.sized(3) )
|
23
|
+
CustomerType = Strict::String.constrained( included_in: CustomerTypes.values ).optional.constructor( EnumConstructors.default )
|
24
|
+
|
25
|
+
DiscountType = Strict::String.constrained( included_in: DiscountTypes.values ).optional.constructor( EnumConstructors.default )
|
26
|
+
|
27
|
+
Email = Strict::String.constrained( max_size: 1024, format: /\A^$|[\w+\-.]+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i ).optional.constructor{ |v| v.to_s.downcase unless v.nil? }
|
28
|
+
|
29
|
+
HouseWorkType = Strict::String.constrained( included_in: HouseWorkTypes.values ).optional.constructor( EnumConstructors.default )
|
30
|
+
|
31
|
+
VATType = Strict::String.constrained( included_in: VATTypes.values ).optional.constructor( EnumConstructors.default )
|
32
|
+
|
33
|
+
DefaultDeliveryType = Strict::String.constrained( included_in: DefaultDeliveryTypeValues.values ).optional.constructor( EnumConstructors.default )
|
34
|
+
|
35
|
+
require 'fortnox/api/types/model'
|
36
|
+
require 'fortnox/api/types/default_delivery_types'
|
37
|
+
require 'fortnox/api/types/default_templates'
|
38
|
+
require 'fortnox/api/types/email_information'
|
39
|
+
require 'fortnox/api/types/edi_information'
|
40
|
+
require 'fortnox/api/types/invoice_row'
|
41
|
+
require 'fortnox/api/types/order_row'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'fortnox/api/types'
|
2
|
+
|
3
|
+
module Fortnox
|
4
|
+
module API
|
5
|
+
module Types
|
6
|
+
class DefaultDeliveryTypes < Types::Model
|
7
|
+
STUB = {}.freeze
|
8
|
+
|
9
|
+
#Default delivery type for invoices. Can be PRINT EMAIL or PRINTSERVICE.
|
10
|
+
attribute :invoice, Types::DefaultDeliveryType
|
11
|
+
|
12
|
+
#Default delivery type for orders. Can be PRINT EMAIL or PRINTSERVICE.
|
13
|
+
attribute :order, Types::DefaultDeliveryType
|
14
|
+
|
15
|
+
#Default delivery type for offers. Can be PRINT EMAIL or PRINTSERVICE.
|
16
|
+
attribute :offer, Types::DefaultDeliveryType
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "fortnox/api/types"
|
2
|
+
|
3
|
+
module Fortnox
|
4
|
+
module API
|
5
|
+
module Types
|
6
|
+
class DefaultTemplates < Types::Model
|
7
|
+
STUB = {}.freeze
|
8
|
+
|
9
|
+
# Default template for orders. Must be a name of an existing print template.
|
10
|
+
attribute :order, Types::Required::String
|
11
|
+
|
12
|
+
# Default template for offers. Must be a name of an existing print template.
|
13
|
+
attribute :offer, Types::Required::String
|
14
|
+
|
15
|
+
# Default template for invoices. Must be a name of an existing print template.
|
16
|
+
attribute :invoice, Types::Required::String
|
17
|
+
|
18
|
+
# Default template for cash invoices. Must be a name of an existing print template.
|
19
|
+
attribute :cash_invoice, Types::Required::String
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Fortnox
|
2
|
+
module API
|
3
|
+
module Types
|
4
|
+
module DocumentRow
|
5
|
+
def self.ify( base )
|
6
|
+
base.class_eval do
|
7
|
+
#AccountNumber Account number. 4 digits
|
8
|
+
attribute :account_number, Types::AccountNumber
|
9
|
+
|
10
|
+
#ArticleNumber Article number. 50 characters
|
11
|
+
attribute :article_number, Types::Sized::String[ 50 ]
|
12
|
+
|
13
|
+
#ContributionPercent Contribution Percent.
|
14
|
+
attribute :contribution_percent, Types::Nullable::Float.with( private: true )
|
15
|
+
|
16
|
+
#ContributionValue Contribution Value.
|
17
|
+
attribute :contribution_value, Types::Nullable::Float.with( private: true )
|
18
|
+
|
19
|
+
#CostCenter Code of the cost center for the row.
|
20
|
+
attribute :cost_center, Types::Nullable::String
|
21
|
+
|
22
|
+
#DeliveredQuantity Delivered quantity. 14 digits
|
23
|
+
attribute :delivered_quantity, Types::Sized::Float[ 0.0, 9_999_999_999_999.0 ]
|
24
|
+
|
25
|
+
#Description Description Row description. 50 characters
|
26
|
+
attribute :description, Types::Sized::String[ 50 ]
|
27
|
+
|
28
|
+
# Discount amount. 12 digits (for amount) / 5 digits (for percent)
|
29
|
+
# TODO(hannes): Verify that we can send in more than 5 digits through
|
30
|
+
# the actual API for DiscountType PERCENT. This cannot be done until
|
31
|
+
# we fix issue #62...
|
32
|
+
attribute :discount, Types::Sized::Float[ 0.0, 99_999_999_999.0 ]
|
33
|
+
|
34
|
+
#DiscountType The type of discount used for the row.
|
35
|
+
attribute :discount_type, Types::DiscountType
|
36
|
+
|
37
|
+
#HouseWork If the row is housework
|
38
|
+
attribute :house_work, Types::Nullable::Boolean
|
39
|
+
|
40
|
+
#HouseWorkHoursToReport Hours to be reported if the quantity of the row should not be used as hours. 5 digits
|
41
|
+
attribute :house_work_hours_to_report, Types::Sized::Integer[ 0, 99_999 ]
|
42
|
+
|
43
|
+
#HouseWorkType The type of house work.
|
44
|
+
attribute :house_work_type, Types::HouseWorkType
|
45
|
+
|
46
|
+
#Price Price per unit. 12 digits
|
47
|
+
attribute :price, Types::Sized::Float[ 0.0, 99_999_999_999.0 ]
|
48
|
+
|
49
|
+
#Project Code of the project for the row.
|
50
|
+
attribute :project, Types::Nullable::String
|
51
|
+
|
52
|
+
#Total Total amount for the row.
|
53
|
+
attribute :total, Types::Nullable::Float.with( private: true )
|
54
|
+
|
55
|
+
#Unit Code of the unit for the row.
|
56
|
+
attribute :unit, Types::Nullable::String
|
57
|
+
|
58
|
+
#VAT VAT percentage of the row.
|
59
|
+
attribute :vat, Types::Nullable::Integer
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|