diff --git a/app/models/bike_csv_importer.rb b/app/models/bike_csv_importer.rb index dc22774..bd193a5 100644 --- a/app/models/bike_csv_importer.rb +++ b/app/models/bike_csv_importer.rb @@ -9,6 +9,11 @@ class BikeCsvImporter def run result = {imported_count: 0, skipped_shop_ids: []} + + @bike_purpose_cache = {} + @bike_brand_cache = {} + @bike_model_cache = {} + fetch do |bike_hash| bike = import_bike bike_hash if bike.try :persisted? @@ -17,6 +22,13 @@ class BikeCsvImporter result[:skipped_shop_ids].push bike.try(:shop_id) || bike_hash.values.first end end + + missing_brands = @bike_brand_cache.select { |_, v| v.nil? }.map(&:first) + result[:missing_brands] = missing_brands if missing_brands.any? + + missing_models = @bike_model_cache.select { |_, v| v.nil? }.map(&:first) + result[:missing_models] = missing_models if missing_models.any? + result end @@ -67,8 +79,8 @@ class BikeCsvImporter # Date In -> Create a bike log entry with start_date & end_date with same value as "Date In". Set action_id to "AQUIRED" # Date Out -> Should be the start_date & end_date value for "Gone" column mentioned above. # + Price -> Bikes.value - # Make -> Bikes.bike_brand_id - # Model -> Bikes.bike_model_id + # + Make -> Bikes.bike_brand_id + # + Model -> Bikes.bike_model_id # + to Whom -> ignore # + Zip Code -> ignore # Comment -> Create a bike log entry with action_id "NOTE". The log 'description' should be the value of 'Comment'. @@ -82,7 +94,7 @@ class BikeCsvImporter end def bike_attrs(bike_hash) - %i{ shop_id bike_purpose_id value }.each_with_object({}) do |field, memo| + %i{ shop_id bike_purpose_id value bike_brand_id bike_model_id model }.each_with_object({}) do |field, memo| memo[field] = send :"bike_attr_#{ field }", bike_hash end end @@ -115,6 +127,22 @@ class BikeCsvImporter clean_value(bike_hash['price']).try(:gsub, /[$]/, '').try :to_i end + def bike_attr_bike_brand_id(bike_hash) + brand = clean_value(bike_hash['make']) + return unless brand + cached_bike_brand(brand).try :id + end + + def bike_attr_bike_model_id(bike_hash) + model = clean_value(bike_hash['model']) + return unless model + cached_bike_model(model).try :id + end + + def bike_attr_model(bike_hash) + clean_value bike_hash['model'] + end + def clean_value(value) value_or_nil strip_value(value) end @@ -128,7 +156,22 @@ class BikeCsvImporter end def cached_bike_purpose(purpose) - @bike_purpose_cache ||= {} - @bike_purpose_cache[purpose] ||= BikePurpose.find_by_purpose purpose + @bike_purpose_cache[purpose] ||= BikePurpose.find_by_purpose purpose + end + + def cached_bike_brand(brand) + if @bike_brand_cache.has_key? brand + @bike_brand_cache[brand] + else + @bike_brand_cache[brand] = BikeBrand.where('lower(brand) = ?', brand.downcase).first + end + end + + def cached_bike_model(model) + if @bike_model_cache.has_key? model + @bike_model_cache[model] + else + @bike_model_cache[model] = BikeModel.where('lower(model) = ?', model.downcase).first + end end end