magelex 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3d3dcd100c3a4c73c1e885c3e512704d4e21d1ba
4
+ data.tar.gz: da8ac0c3a739e5a8c05c361a52bd9260f4619c32
5
+ SHA512:
6
+ metadata.gz: 19cf4f8f959f1ee4c13cdb19c0ea37f456314a75050d442a3ee148458fa78213912302c54aedb4c44170259af13e69a507d734b805db81d6e006e17b84d559bb
7
+ data.tar.gz: e0113ad7243563e6dc4e55a67e7f8ebe682498a0f1339dcc466ae17a89410a8666e642b744f049ec12c5085e933c4230676fffcce1c5958050f4fad69ec65db2
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.swp
11
+ magelex.conf
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,49 @@
1
+ # Contributor Code of Conduct
2
+
3
+ As contributors and maintainers of this project, and in the interest of
4
+ fostering an open and welcoming community, we pledge to respect all people who
5
+ contribute through reporting issues, posting feature requests, updating
6
+ documentation, submitting pull requests or patches, and other activities.
7
+
8
+ We are committed to making participation in this project a harassment-free
9
+ experience for everyone, regardless of level of experience, gender, gender
10
+ identity and expression, sexual orientation, disability, personal appearance,
11
+ body size, race, ethnicity, age, religion, or nationality.
12
+
13
+ Examples of unacceptable behavior by participants include:
14
+
15
+ * The use of sexualized language or imagery
16
+ * Personal attacks
17
+ * Trolling or insulting/derogatory comments
18
+ * Public or private harassment
19
+ * Publishing other's private information, such as physical or electronic
20
+ addresses, without explicit permission
21
+ * Other unethical or unprofessional conduct
22
+
23
+ Project maintainers have the right and responsibility to remove, edit, or
24
+ reject comments, commits, code, wiki edits, issues, and other contributions
25
+ that are not aligned to this Code of Conduct, or to ban temporarily or
26
+ permanently any contributor for other behaviors that they deem inappropriate,
27
+ threatening, offensive, or harmful.
28
+
29
+ By adopting this Code of Conduct, project maintainers commit themselves to
30
+ fairly and consistently applying these principles to every aspect of managing
31
+ this project. Project maintainers who do not follow or enforce the Code of
32
+ Conduct may be permanently removed from the project team.
33
+
34
+ This code of conduct applies both within project spaces and in public spaces
35
+ when an individual is representing the project or its community.
36
+
37
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
38
+ reported by contacting a project maintainer at felix.wolfsteller@gmail.com. All
39
+ complaints will be reviewed and investigated and will result in a response that
40
+ is deemed necessary and appropriate to the circumstances. Maintainers are
41
+ obligated to maintain confidentiality with regard to the reporter of an
42
+ incident.
43
+
44
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
45
+ version 1.3.0, available at
46
+ [http://contributor-covenant.org/version/1/3/0/][version]
47
+
48
+ [homepage]: http://contributor-covenant.org
49
+ [version]: http://contributor-covenant.org/version/1/3/0/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in magelex.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # Magelex
2
+
3
+ *This README reflects (more or less) the current development state, for documentation of a given version, see the README shipped with that gem (or respective tag on github).*
4
+
5
+ Magelex takes Magento data and presents it in a format that Lexware can read.
6
+
7
+ Aim is to manage the cash flow in Lexware.
8
+
9
+ The solution is specific for one customers needs. If you need a similar solution (or have a better one!) contact me!
10
+
11
+ ## Installation
12
+
13
+ Install it yourself as:
14
+
15
+ $ gem install magelex
16
+
17
+ ## Assumptions
18
+
19
+ Customer accounts are hard coded. Database access necessary for date corrections.
20
+
21
+ ## Usage
22
+
23
+ Call `magelex --help` to get a basic idea:
24
+
25
+ Usage: magelex DIR_OR_FILE
26
+
27
+ Imports order data from magento csv export, exports this data to be imported to open positions in lexware.
28
+
29
+ -o, --out-dir DIR Directory to write output files to.
30
+ -l, --log-file FILE File to log to (default: STDERR).
31
+ -v, --verbose Run verbosely
32
+ -s, --skip-db Do not update dates from mysql database.
33
+ -h, --help Show this help and exit.
34
+ --version Show version and exit.
35
+
36
+
37
+ By default, `magelex` will log to `STDERR`, put you can pass the path to a log file.
38
+
39
+ It consumes a single file (given as argument, as in `magelex magento_orders.csv`). `magelex` will create a file with same filename in the path `lexware` (can be changed with the `--out-dir` switch).
40
+
41
+ ### Configuration
42
+
43
+ Configure magento MySQL database access in `magelex.conf` . An example configuration comes shipped with the gem (`magelex.conf.example`).
44
+
45
+ If no database queries should be done, invoke with `--skip-db`.
46
+
47
+ ### Use the command line interface
48
+
49
+ Call `magelex --help` to get a basic idea.
50
+
51
+ ## Development
52
+
53
+ After checking out the repo, run `rake spec` to run the tests. You can also run `bundle console` for an interactive prompt that will allow you to experiment. Run `bundle exec magelex` to use the gem in this directory, ignoring other installed copies of this gem.
54
+
55
+ Generally, I prefer to work and develop in `bundle exec`-mode.
56
+
57
+ To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
58
+
59
+ ## Contributing
60
+
61
+ Bug reports and pull requests are welcome on GitHub at https://github.com/fwolfst/magelex. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
62
+
63
+ That said, just get in contact.
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/magelex ADDED
@@ -0,0 +1,101 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "magelex"
4
+
5
+ require 'yaml'
6
+ require 'optparse'
7
+
8
+ program_name = File.basename __FILE__
9
+ options = {out_dir: 'lexware'}
10
+ optparse = OptionParser.new do |opts|
11
+ opts.banner = "Usage: #{program_name} DIR_OR_FILE"
12
+ opts.separator ""
13
+ opts.separator "Imports order data from magento csv export, exports this"\
14
+ " data to be imported to open positions in lexware."
15
+ opts.separator ""
16
+
17
+ opts.on('-o', '--out-dir DIR', 'Directory to write output files to.') do |o|
18
+ options[:out_dir] = o
19
+ end
20
+ opts.on('-l', '--log-file FILE', 'File to log to (default: STDERR).') do |o|
21
+ options[:log_file] = o
22
+ end
23
+ opts.on('-v', '--verbose', 'Run verbosely') do |o|
24
+ options[:verbose] = o
25
+ end
26
+ opts.on('-s', '--skip-db', 'Do not update dates from mysql database.') do |o|
27
+ options[:skipdb] = o
28
+ end
29
+ opts.on_tail('--version', 'Show version and exit.') do
30
+ puts "Magelex #{Magelex::VERSION}"
31
+ exit 0
32
+ end
33
+ opts.on('-h', '--help', 'Show this help and exit.') do
34
+ puts opts
35
+ exit 0
36
+ end
37
+ end.parse!
38
+
39
+ if ARGV.length != 1
40
+ STDERR.puts "Need an argument (directory or file)"
41
+ exit 1
42
+ end
43
+
44
+ Magelex.logger = Logger.new(options[:log_file] ? options[:log_file] : STDERR)
45
+
46
+ Magelex.logger.level = options[:verbose] ? Logger::DEBUG : Logger::INFO
47
+ Magelex.logger.datetime_format = "%Y-%m-%d %H:%M:%S"
48
+ Magelex.logger.formatter = proc { |severity, datetime, progname, msg|
49
+ "#{severity} - #{datetime} - #{msg}\n"
50
+ }
51
+
52
+ def main options
53
+ Magelex.logger.info("Started")
54
+
55
+ # Import/Read file.
56
+ bills_export = []
57
+ bills = Magelex::MagentoCSV.read ARGV[0]
58
+ bills.each do |bill|
59
+ if !bill.complete?
60
+ Magelex.logger.info("Skip order #{bill.order_nr} (incomplete: #{bill.status})")
61
+ else # complete!
62
+ bill.consume_shipping_cost
63
+ bill.swissify
64
+ if !bill.check
65
+ Magelex.logger.info("Skip order #{bill.order_nr} "\
66
+ "(totals do not match #{bill.total} != "\
67
+ "(0: #{bill.total_0} + 7: #{bill.total_7} "\
68
+ "+ 19: #{bill.total_19})")
69
+ else
70
+ Magelex.logger.debug("Handle #{bill.order_nr}")
71
+ bills_export << bill
72
+ end
73
+ end
74
+ end
75
+
76
+ # Fix dates via database.
77
+ if !options[:skipdb]
78
+ begin
79
+ Magelex.logger.info("Fetching dates from magento mysql.")
80
+ Magelex::MagentoMYSQL.update_dates YAML.load_file('magelex.conf'), bills_export
81
+ rescue => e
82
+ Magelex.logger.error("Could not connect to MySQL database, exiting.")
83
+ Magelex.logger.error(e.inspect)
84
+ exit 2
85
+ end
86
+ end
87
+
88
+ # Export/Write to file
89
+ Dir.mkdir options[:out_dir] rescue {}
90
+ outdir = Pathname.new(options[:out_dir]).realpath
91
+ outfile = outdir.join(File::basename ARGV[0])
92
+ if File.exist?(outfile)
93
+ Magelex.logger.error("Output file #{outfile} exists already, exiting.")
94
+ exit 3
95
+ end
96
+ Magelex.logger.info("Writing to #{outfile}")
97
+ Magelex::LexwareCSV.write outfile, bills_export
98
+ Magelex.logger.info("Finished")
99
+ end
100
+
101
+ main options
@@ -0,0 +1,40 @@
1
+ module Magelex
2
+ module AccountNumber
3
+ def self.for_customer bill
4
+ first_letter = bill.customer_lastname[0].upcase
5
+ first_letter.gsub!(/[ÖÜÄ]/, 'Ä' => 'A', 'Ö' => 'O', 'Ü' => 'U')
6
+
7
+ return 12300 if first_letter == "Y"
8
+ return 12300 if first_letter == "Z"
9
+
10
+ # A is 0
11
+ ord = first_letter.ord - "A".ord# + 1
12
+ 10000 + ord * 100
13
+ end
14
+
15
+ # get tax for :total_0, :total_7 or :total_19
16
+ def self.for(bill, tax_kind)
17
+ if tax_kind == :total_0
18
+ return for_0 bill
19
+ elsif tax_kind == :total_7
20
+ return for_7 bill
21
+ elsif tax_kind == :total_19
22
+ return for_19 bill
23
+ else
24
+ raise "unknown tax_kind"
25
+ end
26
+ end
27
+
28
+ def self.for_7 bill
29
+ bill.in_eu? ? '8310' : '8300'
30
+ end
31
+
32
+ def self.for_19 bill
33
+ bill.in_eu? ? '8315' : '8400'
34
+ end
35
+
36
+ def self.for_0 bill
37
+ '8120'
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,75 @@
1
+ require 'magelex'
2
+
3
+ module Magelex
4
+ class LexwareBill
5
+ @@EU_CODES = ['BE','BG','CZ','DK','EE','EL','ES','FR',
6
+ 'IE','IT','CY','LV','LT','LU','HU','MT',
7
+ 'NL','AT','PL','PT','RO','SI','SK','FI','SE','UK']
8
+
9
+ attr_accessor :order_nr, :customer_name, :country_code,
10
+ :date, :status, :shipping_cost, :total, :total_0, :total_7, :total_19
11
+
12
+ def initialize values={}
13
+ @total_0, @total_7, @total_19, @total = 0, 0, 0, 0
14
+ @customer_name = values.delete(:customer_name) || ""
15
+ @order_nr = values.delete(:order_nr) || nil
16
+ @date = values.delete(:date) || nil
17
+ @total = values.delete(:total) || 0
18
+ @total_0 = values.delete(:total_0) || 0
19
+ @total_7 = values.delete(:total_7) || 0
20
+ @total_19 = values.delete(:total_19) || 0
21
+ @status = values.delete(:status) || nil
22
+ @shipping_cost = values.delete(:shipping_cost) || nil
23
+ @country_code = values.delete(:country_code) || nil
24
+ if !values.empty?
25
+ raise "Unknown values for bill: #{values.inspect}"
26
+ end
27
+ end
28
+
29
+ def swiss?
30
+ @country_code == 'CH'
31
+ end
32
+
33
+ def add_item amount, tax, name
34
+ case TaxGuess.guess(amount, tax)
35
+ when :tax0
36
+ @total_0 += amount
37
+ when :tax7
38
+ @total_7 += amount
39
+ when :tax19
40
+ @total_19 += amount
41
+ else
42
+ raise 'Unknown Tax class'
43
+ end
44
+ end
45
+
46
+ def customer_lastname
47
+ @customer_name.split[-1]
48
+ end
49
+
50
+ def in_eu?
51
+ @@EU_CODES.include? @country_code
52
+ end
53
+
54
+ def check
55
+ @total.round(2) == (@total_0 + @total_7 + @total_19).round(2)
56
+ end
57
+
58
+ def consume_shipping_cost
59
+ @total_19 += @shipping_cost * 1.19
60
+ @shipping_cost = 0
61
+ end
62
+
63
+ def complete?
64
+ @status == "complete"
65
+ end
66
+
67
+ def swissify
68
+ return if !swiss?
69
+ @total_0 += @total_19
70
+ @total_19 = 0
71
+ @total_0 += @total_7
72
+ @total_7 = 0
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,43 @@
1
+ module Magelex
2
+ module LexwareCSV
3
+ def self.write file, bills
4
+ File.open(file, 'w') do |f|
5
+ f.write render(bills).gsub("\n", "\r\n").encode(
6
+ 'windows-1252', invalid: :replace, undef: :replace)
7
+ end
8
+ end
9
+
10
+ def self.to_rows bill
11
+ # main
12
+ rows = []
13
+ rows << [bill.date.strftime("%d.%m.%Y"),
14
+ bill.order_nr,
15
+ bill.customer_name,
16
+ bill.total.round(2),
17
+ Magelex::AccountNumber.for_customer(bill),
18
+ 0]
19
+ # subs
20
+ [:total_0, :total_7, :total_19].each do |part|
21
+ if (amount = bill.send(part)) != 0
22
+ rows << [
23
+ bill.date.strftime("%d.%m.%Y"),
24
+ bill.order_nr,
25
+ bill.customer_name,
26
+ amount.round(2),
27
+ 0,
28
+ Magelex::AccountNumber.for(bill, part),
29
+ ]
30
+ end
31
+ end
32
+ rows
33
+ end
34
+
35
+ def self.render bills
36
+ CSV.generate(encoding: 'utf-8') do |csv|
37
+ bills.each do |b|
38
+ to_rows(b).each { |r| csv << r }
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,69 @@
1
+ require 'csv'
2
+
3
+ module Magelex
4
+ module MagentoCSV
5
+ MONEY_FIELDS = ['Order Shipping', 'Order Grand Total',
6
+ 'Item Total', 'Item Tax']
7
+
8
+ CSV::Converters[:german_money_amount] = lambda do |value, info|
9
+ if MONEY_FIELDS.include? info[:header]
10
+ value.gsub(',', '.').to_f
11
+ else
12
+ value
13
+ end
14
+ end
15
+
16
+ CSV::Converters[:order_date] = lambda do |value, info|
17
+ if info[:header] == 'Order Date'
18
+ Date.strptime(value[0..10], "%d.%m.%Y")
19
+ else
20
+ value
21
+ end
22
+ end
23
+
24
+ # Reads file and returns lexware_bills
25
+ def self.read filename
26
+ self.parse(File.read filename)
27
+ end
28
+
29
+ # Creates a bill with basic information from csv line
30
+ def self.init_bill row
31
+ bill = Magelex::LexwareBill.new
32
+
33
+ # TODO: defining a attribute|colum- map would be nicer
34
+ bill.order_nr = row['Order Number']
35
+ bill.customer_name = row['Billing Name']
36
+ bill.country_code = row['Shipping Country']
37
+ bill.date = row['Order Date']
38
+
39
+ bill.status = row['Order Status']
40
+
41
+ bill.shipping_cost = row['Order Shipping']
42
+ bill.total = row['Order Grand Total']
43
+ bill
44
+ end
45
+
46
+ def self.parse string
47
+ bills = []
48
+ current_bill = Magelex::LexwareBill.new
49
+
50
+ CSV::parse(string, :headers => :first_row,
51
+ converters: [:all, :german_money_amount, :order_date]) do |row|
52
+ # Multiple rows (with same order_nr) define one order
53
+ # One order will be mapped to one bill
54
+ if current_bill.order_nr != row['Order Number']
55
+ current_bill = init_bill row
56
+ end
57
+
58
+ current_bill.add_item(row['Item Total'],
59
+ row['Item Tax'],
60
+ row['Item Name'])
61
+
62
+ if !bills.include? (current_bill)
63
+ bills << current_bill
64
+ end
65
+ end
66
+ bills
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,27 @@
1
+ require 'mysql2'
2
+
3
+ module Magelex
4
+ module MagentoMYSQL
5
+ def self.update_dates mysqlconf, bills
6
+ @client = Mysql2::Client.new(:host => mysqlconf[:host],
7
+ :port => mysqlconf[:port],
8
+ :database => mysqlconf[:database],
9
+ :username => mysqlconf[:username],
10
+ :password => mysqlconf[:password])
11
+
12
+ in_statement = bills.map{|b| "'#{b.order_id}'"}.join(',')
13
+ query = "SELECT increment_id, created_at, updated_at, "\
14
+ "invoice_status_id FROM sales_flat_invoice "\
15
+ "WHERE increment_id IN (#{in_statement});"
16
+
17
+ # Build up index TODO rubyfy
18
+ bill_idx = {}
19
+ bills.each {|b| bill_idx[b.order_id] = b}
20
+ results = @client.query(query)
21
+
22
+ results.each do |row|
23
+ bill_idx[row['increment_id']].date = row['created_at']
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ module Magelex
2
+ module TaxGuess
3
+ def self.guess(total, tax_amount)
4
+ if tax_amount == 0
5
+ :tax0
6
+ elsif (total - total/1.06) <= tax_amount && (total - total/1.08) >= tax_amount
7
+ :tax7
8
+ elsif (total - total/1.18) <= tax_amount && (total - total/1.20) >= tax_amount
9
+ :tax19
10
+ else
11
+ raise "TaxGuess: Cannot guess tax of "\
12
+ "#{total}/#{tax_amount} (#{total - total/tax_amount})"
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ module Magelex
2
+ VERSION = "0.1.0".freeze
3
+ end
data/lib/magelex.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'magelex/version'
2
+ require 'magelex/magento_csv'
3
+ require 'magelex/lexware_bill'
4
+ require 'magelex/lexware_csv'
5
+ require 'magelex/tax_guess'
6
+ require 'magelex/lexware_account'
7
+ require 'magelex/magento_mysql'
8
+
9
+ require 'logger'
10
+
11
+ module Magelex
12
+ def self.logger
13
+ @logger ||= Logger.new
14
+ end
15
+ def self.logger= logger
16
+ @logger = logger
17
+ end
18
+ end
@@ -0,0 +1,6 @@
1
+ host : 127.0.0.1
2
+ port : 3306
3
+ database : db
4
+ username : user
5
+ password : pass
6
+
data/magelex.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'magelex/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "magelex"
8
+ spec.version = Magelex::VERSION
9
+ spec.authors = ["Felix Wolfsteller"]
10
+ spec.email = ["felix.wolfsteller@gmail.com"]
11
+ spec.licenses = ['GPL-3.0']
12
+
13
+ spec.summary = %q{Bridge for data from Magento shop to Lexware financial software.}
14
+ spec.homepage = "https://github.com/fwolfst/magelex"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = "bin"
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency 'mysql2', '~> 0.4'
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.11"
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ spec.add_development_dependency "rspec", "~> 3.0"
26
+ end
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: magelex
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Felix Wolfsteller
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mysql2
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.4'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.4'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.11'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.11'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ description:
70
+ email:
71
+ - felix.wolfsteller@gmail.com
72
+ executables:
73
+ - magelex
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - ".gitignore"
78
+ - ".rspec"
79
+ - CODE_OF_CONDUCT.md
80
+ - Gemfile
81
+ - README.md
82
+ - Rakefile
83
+ - bin/magelex
84
+ - lib/magelex.rb
85
+ - lib/magelex/lexware_account.rb
86
+ - lib/magelex/lexware_bill.rb
87
+ - lib/magelex/lexware_csv.rb
88
+ - lib/magelex/magento_csv.rb
89
+ - lib/magelex/magento_mysql.rb
90
+ - lib/magelex/tax_guess.rb
91
+ - lib/magelex/version.rb
92
+ - magelex.conf.example
93
+ - magelex.gemspec
94
+ homepage: https://github.com/fwolfst/magelex
95
+ licenses:
96
+ - GPL-3.0
97
+ metadata: {}
98
+ post_install_message:
99
+ rdoc_options: []
100
+ require_paths:
101
+ - lib
102
+ required_ruby_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ required_rubygems_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ requirements: []
113
+ rubyforge_project:
114
+ rubygems_version: 2.5.1
115
+ signing_key:
116
+ specification_version: 4
117
+ summary: Bridge for data from Magento shop to Lexware financial software.
118
+ test_files: []