collmex-ruby 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/collmex.rb CHANGED
@@ -4,9 +4,20 @@ require 'collmex/request'
4
4
  module Collmex
5
5
 
6
6
  class << self
7
- attr_accessor :customer_id
8
- attr_accessor :username
9
- attr_accessor :password
7
+
8
+ attr_accessor :username, :password, :customer_id
9
+
10
+ def setup_login_data(logindata)
11
+ Collmex.username = logindata[:username]
12
+ Collmex.password = logindata[:password]
13
+ Collmex.customer_id = logindata[:customer_id]
14
+ end
15
+
16
+ def reset_login_data
17
+ Collmex.username = nil
18
+ Collmex.password = nil
19
+ Collmex.customer_id = nil
20
+ end
10
21
 
11
22
  def csv_opts
12
23
  {
@@ -14,22 +25,5 @@ module Collmex
14
25
  }
15
26
  end
16
27
 
17
-
18
- def setup_login_data
19
- config = YAML.load_file('config/collmex_config.yml')["development"]
20
- Collmex.username = config["username"]
21
- Collmex.password = config["password"]
22
- Collmex.customer_id = config["customer_id"]
23
- end
24
-
25
- def reset_login_data
26
- Collmex.username = "000000"
27
- Collmex.password = "000000"
28
- Collmex.customer_id = "000000"
29
- end
30
28
  end
31
29
  end
32
-
33
- Collmex.reset_login_data
34
-
35
-
data/lib/collmex/api.rb CHANGED
@@ -6,7 +6,7 @@ module Collmex
6
6
  def self.is_a_collmex_api_line_obj? obj
7
7
  obj.class.name =~ /Collmex\:\:Api/
8
8
  end
9
-
9
+
10
10
  def self.line_class_exists?(class_name)
11
11
  klass = Collmex::Api.const_get(class_name)
12
12
  return klass.is_a?(Class)
@@ -16,18 +16,18 @@ module Collmex
16
16
 
17
17
  def self.parse_line(line)
18
18
  if line.is_a?(Array) and line.first.is_a?(String)
19
- identifyer = line.first.split("_").map{ |s| s.downcase.capitalize }.join
19
+ identifyer = line.first.split(/_|-/).map { |s| s.downcase.capitalize }.join
20
20
  if self.line_class_exists?(identifyer)
21
21
  Collmex::Api.const_get(identifyer).new(line)
22
22
  else
23
- raise "Could not find a Collmex::Api::Line class for \"#{identifyer}\""
23
+ raise "Could not find a Collmex::Api::Line class for \"#{identifyer}\" (\"#{line.first}\")"
24
24
  end
25
25
  elsif line.is_a?(String) && parsed_line = CSV.parse_line(line, Collmex.csv_opts)
26
- identifyer = parsed_line.first.split("_").map{ |s| s.downcase.capitalize }.join
26
+ identifyer = parsed_line.first.split(/_|-/).map { |s| s.downcase.capitalize }.join
27
27
  if self.line_class_exists?(identifyer)
28
28
  Collmex::Api.const_get(identifyer).new(parsed_line)
29
29
  else
30
- raise "Could not find a Collmex::Api::Line class for \"#{identifyer}\""
30
+ raise "Could not find a Collmex::Api::Line class for \"#{identifyer}\" (\"#{parsed_line.first}\")"
31
31
  end
32
32
  else
33
33
  raise "Could not parse a Collmex::Api Line from #{line.inspect}"
@@ -66,13 +66,13 @@ module Collmex
66
66
  when :date then data.strftime("%Y%m%d") unless data.nil?
67
67
  end
68
68
  end
69
-
69
+
70
70
  def self.stringify_currency(data)
71
71
  case
72
72
  when data.is_a?(Integer) then sprintf("%.2f",(data.to_f / 100)).gsub('.',',')
73
73
  when data.is_a?(Float) then sprintf("%.2f",(data.to_f)).gsub('.',',')
74
- when data.is_a?(String)
75
- int = self.parse_currency(data)
74
+ when data.is_a?(String)
75
+ int = self.parse_currency(data)
76
76
  sprintf("%.2f",(int.to_f / 100)).gsub('.',',')
77
77
  else data
78
78
  end
@@ -92,7 +92,7 @@ module Collmex
92
92
 
93
93
  def self.default_hash
94
94
  hash = {}
95
- self.specification.each_with_index do |field_spec, index|
95
+ self.specification.each_with_index do |field_spec, index|
96
96
  if field_spec.has_key? :fix
97
97
  hash[field_spec[:name]] = field_spec[:fix]
98
98
  elsif field_spec.has_key? :default
@@ -109,21 +109,21 @@ module Collmex
109
109
  fields_spec = self.specification
110
110
 
111
111
  if data.is_a? Array
112
- fields_spec.each_with_index do |field_spec, index|
112
+ fields_spec.each_with_index do |field_spec, index|
113
113
  if !data[index].nil? && !field_spec.has_key?(:fix)
114
- hash[field_spec[:name]] = Collmex::Api.parse_field(data[index], field_spec[:type])
114
+ hash[field_spec[:name]] = Collmex::Api.parse_field(data[index], field_spec[:type])
115
115
  end
116
116
  end
117
117
  elsif data.is_a? Hash
118
118
  fields_spec.each_with_index do |field_spec, index|
119
119
  if data.key?(field_spec[:name]) && !field_spec.has_key?(:fix)
120
- hash[field_spec[:name]] = Collmex::Api.parse_field(data[field_spec[:name]], field_spec[:type])
120
+ hash[field_spec[:name]] = Collmex::Api.parse_field(data[field_spec[:name]], field_spec[:type])
121
121
  end
122
122
  end
123
123
  elsif data.is_a?(String) && parsed = CSV.parse_line(data,Collmex.csv_opts)
124
- fields_spec.each_with_index do |field_spec, index|
124
+ fields_spec.each_with_index do |field_spec, index|
125
125
  if !data[index].nil? && !field_spec.has_key?(:fix)
126
- hash[field_spec[:name]] = Collmex::Api.parse_field(parsed[index], field_spec[:type])
126
+ hash[field_spec[:name]] = Collmex::Api.parse_field(parsed[index], field_spec[:type])
127
127
  end
128
128
  end
129
129
  end
@@ -131,8 +131,8 @@ module Collmex
131
131
  end
132
132
 
133
133
 
134
- def initialize(arg = nil)
135
- #puts self.class.name
134
+ def initialize(arg = nil)
135
+ #puts self.class.name
136
136
  @hash = self.class.default_hash
137
137
  @hash = @hash.merge(self.class.hashify(arg)) if !arg.nil?
138
138
  if self.class.specification.empty? && self.class.name.to_s != "Collmex::Api::Line"
@@ -140,7 +140,7 @@ module Collmex
140
140
  end
141
141
  end
142
142
 
143
-
143
+
144
144
  def to_a
145
145
  array = []
146
146
  self.class.specification.each do |spec|
@@ -188,8 +188,8 @@ module Collmex
188
188
  def self.specification
189
189
  [
190
190
  { name: :identifyer, type: :string, fix: "LOGIN" },
191
- { name: :username, type: :integer },
192
- { name: :password, type: :integer }
191
+ { name: :username, type: :string },
192
+ { name: :password, type: :string }
193
193
  ]
194
194
  end
195
195
  end
@@ -204,7 +204,7 @@ module Collmex
204
204
  { name: :title , type: :string },
205
205
  { name: :firstname , type: :string },
206
206
  { name: :lastname , type: :string },
207
- { name: :comapyn , type: :string },
207
+ { name: :company , type: :string },
208
208
  { name: :department , type: :string },
209
209
  { name: :street , type: :string },
210
210
  { name: :zipcode , type: :string },
@@ -221,6 +221,7 @@ module Collmex
221
221
  { name: :bic , type: :string },
222
222
  { name: :bank_name , type: :string },
223
223
  { name: :vat_id , type: :string },
224
+ { name: :ust_ldnr , type: :string },
224
225
  { name: :payment_condition, type: :integer },
225
226
  { name: :dscout_group , type: :integer },
226
227
  { name: :deliver_conditions, type: :string },
@@ -357,5 +358,142 @@ module Collmex
357
358
  end
358
359
  end
359
360
 
361
+ # Creating Orders
362
+ class Cmxord2 < Line
363
+ def self.specification
364
+ [
365
+ {name: :identifyer, type: :string, fix: "CMXORD-2"},
366
+ {name: :order_id, type: :integer},
367
+ {name: :position, type: :integer},
368
+ {name: :order, type: :integer}, # Should be left blank
369
+ {name: :company_id, type: :integer, default: 1},
370
+ {name: :customer_id, type: :integer},
371
+ {name: :customer_title, type: :string},
372
+ {name: :customer_title_2, type: :string},
373
+ {name: :customer_first_name, type: :string},
374
+ {name: :customer_name, type: :string},
375
+ {name: :customer_company, type: :string},
376
+ {name: :customer_department, type: :string},
377
+ {name: :customer_street, type: :string},
378
+ {name: :customer_zip, type: :string},
379
+ {name: :customer_place, type: :string},
380
+ {name: :customer_country, type: :string}, # ISO code (DE)
381
+ {name: :customer_phone, type: :string},
382
+ {name: :customer_phone_2, type: :string},
383
+ {name: :customer_fax, type: :string},
384
+ {name: :customer_email, type: :string},
385
+ {name: :acct, type: :string},
386
+ {name: :customer_blz, type: :string},
387
+ {name: :customer_account_holders, type: :string},
388
+ {name: :customer_iban, type: :string},
389
+ {name: :customer_bic, type: :string},
390
+ {name: :customer_bank, type: :string},
391
+ {name: :customer_ustidnr, type: :string},
392
+ {name: :reserved, type: :integer}, # Should be left blank
393
+ {name: :order_id_for_customer, type: :string},
394
+ {name: :order_date, type: :date},
395
+ {name: :price_date, type: :date},
396
+ {name: :terms_of_payment, type: :integer},
397
+ {name: :currency, type: :string}, # ISO code (EUR)
398
+ {name: :price_group, type: :integer},
399
+ {name: :discount_group, type: :integer},
400
+ {name: :closing_off, type: :integer},
401
+ {name: :discount_ground, type: :string},
402
+ {name: :confirmation_text, type: :string},
403
+ {name: :final_text, type: :string},
404
+ {name: :internal_memo, type: :string},
405
+ {name: :billing_allowed, type: :integer},
406
+ {name: :partial_deliveries_allowed, type: :integer},
407
+ {name: :deleted, type: :integer},
408
+ {name: :status, type: :integer},
409
+ {name: :language, type: :integer}, # 0 = German, 1 = English
410
+ {name: :editor, type: :integer},
411
+ {name: :mediator, type: :integer},
412
+ {name: :system_name, type: :string},
413
+ {name: :closing_off_2, type: :currency},
414
+ {name: :closing_off_2_base, type: :string},
415
+ {name: :reserved_2, type: :string}, # Should be left blank
416
+ {name: :canceled_on, type: :date},
417
+ {name: :dispatch, type: :integer},
418
+ {name: :returns, type: :currency},
419
+ {name: :collection_fee, type: :currency},
420
+ {name: :terms_of_delivery, type: :string},
421
+ {name: :additional_delivery_conditions, type: :string},
422
+ {name: :delivery_address_title, type: :string},
423
+ {name: :delivery_address_title_2, type: :string},
424
+ {name: :delivery_address_first_name, type: :string},
425
+ {name: :delivery_address_name, type: :string},
426
+ {name: :delivery_address_company, type: :string},
427
+ {name: :delivery_address_department, type: :string},
428
+ {name: :delivery_address_street, type: :string},
429
+ {name: :delivery_address_zip, type: :string},
430
+ {name: :delivery_address_place, type: :string},
431
+ {name: :delivery_address_country, type: :string}, # ISO code (DE)
432
+ {name: :delivery_address_phone, type: :string},
433
+ {name: :delivery_address_phone_2, type: :string},
434
+ {name: :delivery_address_fax, type: :string},
435
+ {name: :delivery_address_email, type: :string},
436
+ {name: :position_type, type: :integer},
437
+ {name: :product_number, type: :string},
438
+ {name: :product_description, type: :string},
439
+ {name: :unit, type: :string}, # ISO code (EUR)
440
+ {name: :quantity, type: :float},
441
+ {name: :price, type: :currency},
442
+ {name: :delivery_date, type: :date},
443
+ {name: :price_quantity, type: :float},
444
+ {name: :item_discount, type: :currency}, # In percents
445
+ {name: :position_value, type: :currency},
446
+ {name: :product, type: :integer},
447
+ {name: :tax_classification, type: :integer},
448
+ {name: :control_abroad, type: :integer},
449
+ {name: :revenue_element, type: :integer},
450
+ {name: :fully_delivered, type: :integer},
451
+ {name: :finally_settled, type: :integer}
452
+ ]
453
+ end
454
+ end
455
+
456
+ class SalesOrderGet < Line
457
+ def self.specification
458
+ [
459
+ {name: :identifyer, type: :string, fix: "SALES_ORDER_GET"},
460
+ {name: :order_id, type: :string},
461
+ {name: :company_id, type: :integer},
462
+ {name: :customer_id, type: :integer},
463
+ {name: :date_from, type: :date},
464
+ {name: :date_to, type: :date},
465
+ {name: :order_id_for_customer, type: :string},
466
+ {name: :format, type: :string}, # 1 means ZIP file with PDF
467
+ {name: :changed_only, type: :integer},
468
+ {name: :system_name, type: :string},
469
+ {name: :created_by_system_only, type: :integer}, # 1 means take only records created by the "system_name"
470
+ {name: :without_stationary, type: :integer}
471
+ ]
472
+ end
473
+ end
474
+
475
+ class AccbalGet < Line
476
+ def self.specification
477
+ [
478
+ {name: :identifyer, type: :string, fix: "ACCBAL_GET"},
479
+ {name: :company_id, type: :integer, default: 1},
480
+ {name: :fiscal_year, type: :integer, default: Date.today.year},
481
+ {name: :date_to, type: :date},
482
+ {name: :account_number, type: :integer},
483
+ {name: :account_group, type: :integer}
484
+ ]
485
+ end
486
+ end
487
+
488
+ class AccBal < Line
489
+ def self.specification
490
+ [
491
+ {name: :identifyer, type: :string, fix: "ACC_BAL"},
492
+ {name: :account_number, type: :integer},
493
+ {name: :account_name, type: :string},
494
+ {name: :account_balance, type: :currency}
495
+ ]
496
+ end
497
+ end
360
498
  end
361
499
  end
@@ -3,10 +3,8 @@ require "uri"
3
3
 
4
4
  module Collmex
5
5
  class Request
6
-
7
-
8
6
  attr_accessor :commands, :http
9
-
7
+ attr_accessor :debug
10
8
 
11
9
  def self.run(&block)
12
10
  Request.new.tap do |request|
@@ -20,8 +18,7 @@ module Collmex
20
18
  term.to_s.split("_").collect(&:capitalize).join
21
19
  end
22
20
 
23
-
24
- def enqueue(command, args = {})
21
+ def enqueue(command, args = {})
25
22
  if command.is_a? Symbol
26
23
  add_command Collmex::Api::const_get(self.class.classify(command)).new(args)
27
24
  elsif Collmex::Api.is_a_collmex_api_line_obj?(command)
@@ -31,35 +28,34 @@ module Collmex
31
28
  end
32
29
  end
33
30
 
34
-
35
31
  def initialize
36
32
  @commands = []
37
33
  @raw_response = {}
38
34
 
39
- add_command Collmex::Api::Login.new({username: Collmex.username, password: Collmex.password})
35
+ if Collmex.username.nil? || Collmex.password.nil? || Collmex.customer_id.nil?
36
+ raise "No credentials for collmex given"
37
+ else
38
+ add_command Collmex::Api::Login.new({username: Collmex.username, password: Collmex.password})
39
+ end
40
40
  end
41
41
 
42
-
43
42
  def add_command(cmd)
44
43
  @commands << cmd
45
44
  cmd
46
45
  end
47
46
 
48
-
49
47
  def self.uri
50
48
  URI.parse "https://www.collmex.de/cgi-bin/cgi.exe\?#{Collmex.customer_id},0,data_exchange"
51
49
  end
52
50
 
53
-
54
51
  def self.header_attributes
55
52
  {"Content-Type" => "text/csv"}
56
53
  end
57
54
 
58
55
  def payload
59
- @commands.map{ |c| c.to_csv }.join
56
+ @commands.map { |c| c.to_csv }.join
60
57
  end
61
58
 
62
-
63
59
  def parse_response
64
60
  @response = @raw_response[:array].map { |l| Collmex::Api.parse_line(l) }
65
61
  @response
@@ -69,27 +65,30 @@ module Collmex
69
65
  @raw_response
70
66
  end
71
67
 
72
-
73
- def response
68
+ def response
74
69
  @response
75
70
  end
76
71
 
77
-
78
72
  def execute
79
73
  @http = Net::HTTP.new(Collmex::Request.uri.host, Collmex::Request.uri.port)
80
74
  @http.use_ssl = true
81
75
  @http.verify_mode = OpenSSL::SSL::VERIFY_NONE
82
76
 
83
- response = @http.request_post(Collmex::Request.uri.request_uri, self.payload, Collmex::Request.header_attributes)
84
-
77
+ # http://www.collmex.de/faq.html#zeichensatz_import
78
+ encoded_body = payload.encode("ISO8859-1", undef: :replace) # Do not blow up on undefined characters in ISO8859-1
79
+ response = @http.request_post(Collmex::Request.uri.request_uri, encoded_body, Collmex::Request.header_attributes)
85
80
  response.body.force_encoding("ISO8859-1") if response.body.encoding.to_s == "ASCII-8BIT"
86
81
 
87
82
  @raw_response[:string] = response.body.encode("UTF-8")
88
- @raw_response[:array] = CSV.parse(@raw_response[:string], Collmex.csv_opts)
89
-
90
- return parse_response
91
- end
92
83
 
84
+ begin
85
+ @raw_response[:array] = CSV.parse(@raw_response[:string], Collmex.csv_opts)
86
+ rescue => e
87
+ STDERR.puts "CSV.parse failed with string: #{@raw_response[:string]}" if self.debug
88
+ raise e
89
+ end
93
90
 
91
+ parse_response
92
+ end
94
93
  end
95
94
  end
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- sample_spec = [
3
+ sample_spec = [
4
4
  { name: :identifyer, type: :string, fix: "BLA" },
5
5
  { name: :b, type: :currency },
6
6
  { name: :c, type: :float },
@@ -26,7 +26,7 @@ describe Collmex::Api do
26
26
  end
27
27
 
28
28
  it "should succeed for a Collmex::Api Object" do
29
- b = Collmex::Api::AccdocGet.new()
29
+ b = Collmex::Api::AccdocGet.new()
30
30
  described_class.is_a_collmex_api_line_obj?(b).should be_true
31
31
  end
32
32
  end
@@ -97,7 +97,7 @@ describe Collmex::Api do
97
97
  context "when given an invalid line" do
98
98
  it "should throw an error" do
99
99
  line = ["OMG", 2,3,4,5,6]
100
- lambda { described_class.parse_line(line) }.should raise_error 'Could not find a Collmex::Api::Line class for "Omg"'
100
+ lambda { described_class.parse_line(line) }.should raise_error 'Could not find a Collmex::Api::Line class for "Omg" ("OMG")'
101
101
  end
102
102
  end
103
103
  end
@@ -181,10 +181,10 @@ end
181
181
  shared_examples_for "Collmex Api Command" do
182
182
 
183
183
  describe ".hashify" do
184
-
184
+
185
185
  it "should parse the fields" do
186
186
  string = "BLA"
187
- integer = 421
187
+ integer = 421
188
188
  float = 123.23
189
189
  currency = 200
190
190
  date = Date.parse("12.10.1985")
@@ -199,16 +199,16 @@ shared_examples_for "Collmex Api Command" do
199
199
  Collmex::Api.stub(:parse_field).with(anything(),:date).and_return date
200
200
 
201
201
  tests = [
202
- [1,2,3,4],
203
- [1,nil,3],
204
- [1],
205
- {a: 1, b:nil},
206
- {},
207
- {c: 3},
208
- "1;2;3",
209
- "1;-2;3",
210
- "1;-2,5;3",
211
- ";;3",
202
+ [1,2,3,4],
203
+ [1,nil,3],
204
+ [1],
205
+ {a: 1, b:nil},
206
+ {},
207
+ {c: 3},
208
+ "1;2;3",
209
+ "1;-2;3",
210
+ "1;-2,5;3",
211
+ ";;3",
212
212
  ]
213
213
 
214
214
  tests.each do |testdata|
@@ -217,36 +217,36 @@ shared_examples_for "Collmex Api Command" do
217
217
  end
218
218
 
219
219
  it "should set default values when nothing given" do
220
- sample_default_spec = [
220
+ sample_default_spec = [
221
221
  { name: :a, type: :string, default: "fixvalue" },
222
222
  { name: :b, type: :currency, default: 899 },
223
223
  { name: :c, type: :integer, default: 10 },
224
224
  { name: :d, type: :float, default: 2.99 },
225
- ]
225
+ ]
226
226
  sample_default_outcome = {a: "fixvalue", b: 899, c: 10, d: 2.99}
227
227
  described_class.stub(:specification).and_return sample_default_spec
228
228
  described_class.hashify([]).should eql sample_default_outcome
229
229
  end
230
230
 
231
231
  it "should overwrite default values when data is given" do
232
- sample_default_spec = [
232
+ sample_default_spec = [
233
233
  { name: :a, type: :string, default: "fixvalue" },
234
234
  { name: :b, type: :currency, default: 899 },
235
235
  { name: :c, type: :integer, default: 10 },
236
236
  { name: :d, type: :float, default: 2.99 },
237
- ]
237
+ ]
238
238
  sample_default_outcome = {a: "asd", b: 12, c: 1, d: 1.0}
239
239
  described_class.stub(:specification).and_return sample_default_spec
240
240
  described_class.hashify({a: "asd", b: 12, c: 1, d: 1}).should eql sample_default_outcome
241
241
  end
242
242
 
243
243
  it "should ignore given values for fix-value-fields" do
244
- sample_fix_spec = [
244
+ sample_fix_spec = [
245
245
  { name: :a, type: :string, fix: "fixvalue" },
246
246
  { name: :b, type: :currency, fix: 899 },
247
247
  { name: :c, type: :integer, fix: 10 },
248
248
  { name: :d, type: :float, fix: 2.99 },
249
- ]
249
+ ]
250
250
  sample_fix_outcome = {a: "fixvalue", b: 899, c: 10, d: 2.99}
251
251
  described_class.stub(:specification).and_return sample_fix_spec
252
252
  described_class.hashify([]).should eql sample_fix_outcome
@@ -314,7 +314,7 @@ shared_examples_for "Collmex Api Command" do
314
314
  end
315
315
 
316
316
  describe "#to_h" do
317
- it "should return the hash" do
317
+ it "should return the hash" do
318
318
  h = { first: 1, second: 2 }
319
319
  subject.instance_variable_set(:@hash, h)
320
320
  subject.to_h.should eql h
@@ -332,29 +332,29 @@ shared_examples_for "Collmex Api Command" do
332
332
  end
333
333
 
334
334
  describe Collmex::Api::Line do
335
- it_behaves_like "Collmex Api Command"
335
+ it_behaves_like "Collmex Api Command"
336
336
  end
337
337
 
338
338
  describe Collmex::Api::Login do
339
- subject { Collmex::Api::Login.new({:username => 12, :password => 34}) }
340
- it_behaves_like "Collmex Api Command"
341
- spec =
339
+ subject { Collmex::Api::Login.new({:username => "012", :password => "34"}) }
340
+ it_behaves_like "Collmex Api Command"
341
+ spec =
342
342
  [
343
343
  { name: :identifyer, type: :string, fix: "LOGIN" },
344
- { name: :username, type: :integer },
345
- { name: :password, type: :integer }
344
+ { name: :username, type: :string },
345
+ { name: :password, type: :string }
346
346
  ]
347
347
 
348
- specify { described_class.specification.should eql spec }
348
+ specify { described_class.specification.should eql spec }
349
349
 
350
- output = ["LOGIN", 12, 34]
350
+ output = ["LOGIN", "012", "34"]
351
351
  specify { subject.to_a.should eql output }
352
352
  end
353
353
 
354
354
  describe Collmex::Api::CustomerGet do
355
- it_behaves_like "Collmex Api Command"
355
+ it_behaves_like "Collmex Api Command"
356
356
 
357
- spec =
357
+ spec =
358
358
  [
359
359
  { name: :identifyer , type: :string , fix: "CUSTOMER_GET" },
360
360
  { name: :id , type: :integer },
@@ -371,19 +371,19 @@ describe Collmex::Api::CustomerGet do
371
371
  { name: :inactive , type: :integer },
372
372
  ]
373
373
 
374
- specify { described_class.specification.should eql spec }
374
+ specify { described_class.specification.should eql spec }
375
375
 
376
376
  subject { described_class.new( {:customer_id => 9999} ) }
377
377
 
378
- output = ["CUSTOMER_GET", nil, 1, "", nil, "", nil, nil, nil, nil, nil, "", nil]
378
+ output = ["CUSTOMER_GET", nil, 1, "", nil, "", nil, nil, nil, nil, nil, "", nil]
379
379
 
380
380
  specify { subject.to_a.should eql output }
381
381
  end
382
382
 
383
383
  describe Collmex::Api::AccdocGet do
384
- it_behaves_like "Collmex Api Command"
384
+ it_behaves_like "Collmex Api Command"
385
385
 
386
- spec =
386
+ spec =
387
387
  [
388
388
  { name: :identifyer , type: :string , fix: "ACCDOC_GET" },
389
389
  { name: :company_id , type: :integer , default: 1 },
@@ -406,7 +406,7 @@ describe Collmex::Api::AccdocGet do
406
406
 
407
407
 
408
408
 
409
- specify { described_class.specification.should eql spec }
409
+ specify { described_class.specification.should eql spec }
410
410
 
411
411
  subject { described_class.new( {id: 1} ) }
412
412
 
@@ -415,11 +415,33 @@ describe Collmex::Api::AccdocGet do
415
415
  specify { subject.to_a.should eql output }
416
416
  end
417
417
 
418
+ describe Collmex::Api::AccbalGet do
419
+ it_behaves_like "Collmex Api Command"
420
+
421
+ spec =
422
+ [
423
+ {name: :identifyer, type: :string, fix: "ACCBAL_GET"},
424
+ {name: :company_id, type: :integer, default: 1},
425
+ {name: :fiscal_year, type: :integer, default: Date.today.year},
426
+ {name: :date_to, type: :date},
427
+ {name: :account_number, type: :integer},
428
+ {name: :account_group, type: :integer}
429
+ ]
430
+
431
+ specify { described_class.specification.should eql spec }
418
432
 
419
- describe Collmex::Api::Cmxknd do
433
+ subject { described_class.new( {id: 1} ) }
434
+
435
+ output = ["ACCBAL_GET", 1, Date.today.year, nil, nil, nil]
420
436
 
421
- it_behaves_like "Collmex Api Command"
422
- spec =
437
+ specify { subject.to_a.should eql output }
438
+ end
439
+
440
+
441
+ describe Collmex::Api::Cmxknd do
442
+
443
+ it_behaves_like "Collmex Api Command"
444
+ spec =
423
445
  [
424
446
  { name: :identifyer , type: :string , fix: "CMXKND" },
425
447
  { name: :customer_id , type: :integer },
@@ -428,7 +450,7 @@ describe Collmex::Api::Cmxknd do
428
450
  { name: :title , type: :string },
429
451
  { name: :firstname , type: :string },
430
452
  { name: :lastname , type: :string },
431
- { name: :comapyn , type: :string },
453
+ { name: :company , type: :string },
432
454
  { name: :department , type: :string },
433
455
  { name: :street , type: :string },
434
456
  { name: :zipcode , type: :string },
@@ -445,6 +467,7 @@ describe Collmex::Api::Cmxknd do
445
467
  { name: :bic , type: :string },
446
468
  { name: :bank_name , type: :string },
447
469
  { name: :vat_id , type: :string },
470
+ { name: :ust_ldnr , type: :string },
448
471
  { name: :payment_condition, type: :integer },
449
472
  { name: :dscout_group , type: :integer },
450
473
  { name: :deliver_conditions, type: :string },
@@ -466,21 +489,21 @@ describe Collmex::Api::Cmxknd do
466
489
  { name: :phone_2 , type: :string },
467
490
  ]
468
491
 
469
- specify { described_class.specification.should eql spec }
492
+ specify { described_class.specification.should eql spec }
470
493
 
471
494
  subject { described_class.new( {id: 1} ) }
472
495
 
473
- output = ["CMXKND", nil, 1, "", "", "", "", "", "", "", "", "", "", nil, "", "", "", "", "", "", "", "", "", "", nil, nil, "", "", nil, "", nil, "", nil, "", nil, "", nil, nil, nil, "", nil, "", ""]
496
+ output = ["CMXKND", nil, 1, "", "", "", "", "", "", "", "", "", "", nil, "", "", "", "", "", "", "", "", "", "", "", nil, nil, "", "", nil, "", nil, "", nil, "", nil, "", nil, nil, nil, "", nil, "", ""]
474
497
 
475
498
  specify { subject.to_a.should eql output }
476
499
  end
477
500
 
478
501
 
479
- describe Collmex::Api::Message do
502
+ describe Collmex::Api::Message do
480
503
 
481
- it_behaves_like "Collmex Api Command"
504
+ it_behaves_like "Collmex Api Command"
482
505
 
483
- spec =
506
+ spec =
484
507
  [
485
508
  { name: :identifyer , type: :string , fix: "MESSAGE" },
486
509
  { name: :type , type: :string },
@@ -489,25 +512,25 @@ describe Collmex::Api::Message do
489
512
  { name: :line , type: :integer },
490
513
  ]
491
514
 
492
- specify { described_class.specification.should eql spec }
515
+ specify { described_class.specification.should eql spec }
493
516
 
494
517
  subject { described_class.new( ) }
495
518
 
496
519
  output = ["MESSAGE", "", nil, "", nil]
497
520
 
498
521
  specify { subject.to_a.should eql output }
499
-
522
+
500
523
  context "success" do
501
524
  subject { described_class.new(type: "S") }
502
- specify do
503
- subject.success?.should eql true
504
- subject.result.should eql :success
525
+ specify do
526
+ subject.success?.should eql true
527
+ subject.result.should eql :success
505
528
  end
506
529
  end
507
530
 
508
531
  context "warning" do
509
532
  subject { described_class.new(type: "W") }
510
- specify do
533
+ specify do
511
534
  subject.success?.should eql false
512
535
  subject.result.should eql :warning
513
536
  end
@@ -515,7 +538,7 @@ describe Collmex::Api::Message do
515
538
 
516
539
  context "error" do
517
540
  subject { described_class.new(type: "E") }
518
- specify do
541
+ specify do
519
542
  subject.success?.should eql false
520
543
  subject.result.should eql :error
521
544
  end
@@ -523,7 +546,7 @@ describe Collmex::Api::Message do
523
546
 
524
547
  context "undefined" do
525
548
  subject { described_class.new() }
526
- specify do
549
+ specify do
527
550
  subject.success?.should eql false
528
551
  subject.result.should eql :undefined
529
552
  end
@@ -535,9 +558,9 @@ end
535
558
 
536
559
  describe Collmex::Api::Accdoc do # fixme ACCDOC
537
560
 
538
- it_behaves_like "Collmex Api Command"
561
+ it_behaves_like "Collmex Api Command"
539
562
 
540
- spec =
563
+ spec =
541
564
  [
542
565
  { name: :identifyer , type: :string , fix: "ACCDOC" },
543
566
  { name: :company_id , type: :integer , default: 1 },
@@ -569,7 +592,7 @@ describe Collmex::Api::Accdoc do # fixme ACCDOC
569
592
 
570
593
 
571
594
 
572
- specify { described_class.specification.should eql spec }
595
+ specify { described_class.specification.should eql spec }
573
596
 
574
597
  subject { described_class.new( {id: 1} ) }
575
598
 
@@ -579,4 +602,24 @@ describe Collmex::Api::Accdoc do # fixme ACCDOC
579
602
  end
580
603
 
581
604
 
605
+ describe Collmex::Api::AccBal do
606
+
607
+ it_behaves_like "Collmex Api Command"
608
+
609
+ spec =
610
+ [
611
+ {name: :identifyer, type: :string, fix: "ACC_BAL"},
612
+ {name: :account_number, type: :integer},
613
+ {name: :account_name, type: :string},
614
+ {name: :account_balance, type: :currency}
615
+ ]
616
+
617
+ specify { described_class.specification.should eql spec }
618
+
619
+ subject { described_class.new( {id: 1} ) }
620
+
621
+ output = ["ACC_BAL", nil, "", nil]
622
+
623
+ specify { subject.to_a.should eql output }
624
+ end
582
625
 
@@ -29,6 +29,11 @@ describe Collmex::Request do
29
29
 
30
30
  describe "#initialize" do
31
31
 
32
+ it "should raise an error if no credentials given" do
33
+ Collmex.reset_login_data
34
+ lambda { Collmex::Request.new }.should raise_error "No credentials for collmex given"
35
+ end
36
+
32
37
  it "should add the Login command to its own queue" do
33
38
  request = Collmex::Request.new
34
39
  request.commands.count.should eql 1
@@ -15,11 +15,7 @@ end
15
15
  describe "CollmexIntegration" do
16
16
 
17
17
  before(:each) do
18
- Collmex.setup_login_data
19
- end
20
-
21
- after(:each) do
22
- Collmex.reset_login_data
18
+ Collmex.setup_login_data({username: 4109488, password: 6642111, customer_id: 112249})
23
19
  end
24
20
 
25
21
  it "should work with the long form" do
@@ -33,21 +29,18 @@ describe "CollmexIntegration" do
33
29
  VCR.use_cassette('standard_request') do
34
30
  request.execute
35
31
  end
36
-
37
-
38
32
  end
39
33
 
40
34
  it "should work with the block form" do
41
35
 
42
- # ap Collmex::Api::AccdocGet.new("ASDASD;2;2")
43
-
44
36
  request = Collmex::Request.run do
45
37
  enqueue :customer_get, id: 9999
46
38
  end
39
+
40
+ VCR.use_cassette('standard_request') do
41
+ request.response.last.success?.should eql true
42
+ end
47
43
 
48
- #ap request.response
49
-
50
- request.response.last.success?.should eql true
51
44
  end
52
45
  end
53
46
 
data/spec/spec_helper.rb CHANGED
@@ -1,22 +1,23 @@
1
- require 'rspec'
1
+ require "rspec"
2
2
  require "awesome_print"
3
3
  require "vcr"
4
4
 
5
5
  RSpec.configure do |config|
6
-
7
6
  config.color_enabled = true
8
7
  config.filter_run :focus => true
9
8
  config.run_all_when_everything_filtered = true
10
9
  config.treat_symbols_as_metadata_keys_with_true_values = true
11
10
 
12
11
  config.before(:each) do
13
-
12
+ Collmex.setup_login_data({username: "8866413", password: "2291502", customer_id: "104156"})
14
13
  end
15
14
 
15
+ config.after(:each) do
16
+ Collmex.reset_login_data
17
+ end
16
18
  end
17
19
 
18
-
19
- def timed(name)
20
+ def timed(name)
20
21
  start = Time.now
21
22
  puts "\n[STARTED: #{name}]"
22
23
  yield if block_given?
@@ -24,10 +25,9 @@ def timed(name)
24
25
  puts "[FINISHED: #{name} in #{(finish - start) * 1000} milliseconds]"
25
26
  end
26
27
 
27
-
28
28
  VCR.configure do |c|
29
29
  c.allow_http_connections_when_no_cassette = true
30
- c.cassette_library_dir = 'fixtures/vcr_cassettes'
30
+ c.cassette_library_dir = "spec/fixtures/vcr_cassettes"
31
31
  c.hook_into :webmock
32
32
  end
33
33
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: collmex-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-07-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70139378772860 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,15 +21,50 @@ dependencies:
21
21
  version: '2.5'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70139378772860
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '2.5'
30
+ - !ruby/object:Gem::Dependency
31
+ name: webmock
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: vcr
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
25
62
  description: A lib written in ruby that talks to the german accounting software collmex.
26
63
  email: roman.lehnert@googlemail.com
27
64
  executables: []
28
65
  extensions: []
29
66
  extra_rdoc_files: []
30
67
  files:
31
- - lib/collmex/api/line.rb
32
- - lib/collmex/api/lines.rb
33
68
  - lib/collmex/api.rb
34
69
  - lib/collmex/request.rb
35
70
  - lib/collmex.rb
@@ -38,7 +73,8 @@ files:
38
73
  - spec/lib/collmex_spec.rb
39
74
  - spec/spec_helper.rb
40
75
  homepage: https://github.com/romanlehnert/collmex-ruby
41
- licenses: []
76
+ licenses:
77
+ - MIT
42
78
  post_install_message:
43
79
  rdoc_options: []
44
80
  require_paths:
@@ -57,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
57
93
  version: '0'
58
94
  requirements: []
59
95
  rubyforge_project:
60
- rubygems_version: 1.8.10
96
+ rubygems_version: 1.8.25
61
97
  signing_key:
62
98
  specification_version: 3
63
99
  summary: A ruby api lib for collmex
File without changes
File without changes