94 lines
2.5 KiB
Ruby
94 lines
2.5 KiB
Ruby
# -*- coding: utf-8 -*-
|
|
# Module for Borkenstein csv import
|
|
|
|
require 'csv'
|
|
|
|
module ArticleImport::Borkenstein
|
|
|
|
REGEX = {
|
|
:main => /^(.+)\s+\[([^\[\]]+)\]\s+(\d+\.\d+)\((\d+\.\d+)\)$/,
|
|
:manufacturer => /^(.+)\s{4}\[\]\s{4}\(\)$/,
|
|
:origin => /(.+)\s+(\w+)\/\w+[\/[\w\-]+]?/
|
|
}.freeze
|
|
|
|
NAME = "Borkenstein (CSV)"
|
|
OUTLIST = false
|
|
OPTIONS = {
|
|
col_sep: ",",
|
|
encoding: "UTF-8" # @todo check this
|
|
}.freeze
|
|
|
|
def self.parse(file, **opts)
|
|
global_manufacturer = nil
|
|
|
|
file.set_encoding(opts[:encoding] || OPTIONS[:encoding])
|
|
col_sep = opts[:col_sep] || OPTIONS[:col_sep]
|
|
CSV.new(file, {col_sep: col_sep, :headers => false}).each do |row|
|
|
|
|
# Set manufacturer
|
|
if row[1] == "-"
|
|
match = row[2].match(REGEX[:manufacturer])
|
|
global_manufacturer = match.captures.first unless match.nil?
|
|
end
|
|
|
|
# check if the line is empty
|
|
unless row[1].blank? || row[1] == "-"
|
|
|
|
# Split string and remove beginning "
|
|
matched = row[2].gsub(/^\"/, "").gsub(/\"$/, "").match(REGEX[:main])
|
|
|
|
if matched.nil?
|
|
puts "No regular article data for #{row[1]}: #{row[2]}"
|
|
|
|
else
|
|
|
|
name, units, price_high, price_low = matched.captures
|
|
|
|
# Try to get origin
|
|
matched_name = name.match(REGEX[:origin])
|
|
if matched_name
|
|
name, origin = matched_name.captures
|
|
else
|
|
name, origin = name.gsub(/\s{2,}/, ""), nil
|
|
end
|
|
|
|
# Manufacturer
|
|
if name.match(/^[A-Za-z]{2,3}\s{1}/)
|
|
name.gsub!(/^[A-Za-z]{2,3}\s{1}/, "")
|
|
manufacturer = global_manufacturer
|
|
end
|
|
|
|
|
|
# Get unit quantities
|
|
units = units.split("x")
|
|
if units.size == 2
|
|
unit_quantity = units.first
|
|
unit = units.last
|
|
else
|
|
unit_quantity = 1
|
|
unit = units.first
|
|
end
|
|
|
|
article = {
|
|
:number => row[1],
|
|
:name => name,
|
|
:origin => origin,
|
|
:manufacturer => manufacturer,
|
|
:unit_quantity => unit_quantity,
|
|
:unit => unit,
|
|
:price => price_low, # Inklusive Rabattstufe von 10%
|
|
:tax => 0.0 # Tax is included
|
|
}
|
|
|
|
# test, if neccecary attributes exists
|
|
if article[:unit].nil? || article[:price].nil? || article[:unit_quantity].nil?
|
|
raise "Fehler: Einheit, Preis und MwSt. müssen gegeben sein: #{article.inspect}"
|
|
end
|
|
|
|
yield article, nil
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|