diff options
| -rw-r--r-- | app/models/merge.rb | 41 | 
1 files changed, 40 insertions, 1 deletions
| diff --git a/app/models/merge.rb b/app/models/merge.rb index 8d661f209..16a2bb9f3 100644 --- a/app/models/merge.rb +++ b/app/models/merge.rb @@ -224,7 +224,7 @@ class Merge < ApplicationModel            new_journey_pattern = new.journey_patterns.create! attributes            if new_journey_pattern.checksum != journey_pattern.checksum -            raise "Checksum has changed for #{journey_pattern.inspect}: \"#{journey_pattern.checksum_source}\" -> \"#{new_journey_pattern.checksum_source}\"" +            raise "Checksum has changed for #{journey_pattern.inspect} (to #{new_journey_pattern.inspect}): \"#{journey_pattern.checksum_source}\" -> \"#{new_journey_pattern.checksum_source}\""            end          end        end @@ -236,6 +236,19 @@ class Merge < ApplicationModel        referential.vehicle_journeys.includes(:vehicle_journey_at_stops).all.to_a      end +    referential_purchase_windows_by_checksum, referential_vehicle_journey_purchase_window_checksums = referential.switch do +      purchase_windows_by_checksum = referential.purchase_windows.each_with_object({}) do |purchase_window, hash| +        hash[purchase_window.checksum] = purchase_window +      end + +      vehicle_journey_purchase_window_checksums = Hash.new { |h,k| h[k] = [] } +      referential.purchase_windows.joins(:vehicle_journeys).pluck("vehicle_journeys.id", :checksum).each do |vehicle_journey_id, checksum| +        vehicle_journey_purchase_window_checksums[vehicle_journey_id] << checksum +      end + +      [purchase_windows_by_checksum, vehicle_journey_purchase_window_checksums] +    end +      new.switch do        referential_vehicle_journeys.each do |vehicle_journey|          # find parent journey pattern by checksum @@ -269,6 +282,32 @@ class Merge < ApplicationModel              new_vehicle_journey.vehicle_journey_at_stops.build at_stop_attributes            end +          # Associate (and create if needed) PurchaseWindows + +          referential_vehicle_journey_purchase_window_checksums[vehicle_journey.id].each do |purchase_window_checksum| +            associated_purchase_window = new.purchase_windows.find_by(checksum: purchase_window_checksum) + +            unless associated_purchase_window +              purchase_window = referential_purchase_windows_by_checksum[purchase_window_checksum] + +              objectid = new.purchase_windows.where(objectid: purchase_window.objectid).exists? ? nil : purchase_window.objectid +              attributes = purchase_window.attributes.merge( +                id: nil, +                objectid: objectid +              ) +              new_purchase_window = new.purchase_windows.build attributes +              new_purchase_window.save! + +              if new_purchase_window.checksum != purchase_window.checksum +                raise "Checksum has changed: #{purchase_window.checksum_source} #{new_purchase_window.checksum_source}" +              end + +              associated_purchase_window = new_purchase_window +            end + +            new_vehicle_journey.purchase_windows << associated_purchase_window +          end +            new_vehicle_journey.save!            if new_vehicle_journey.checksum != vehicle_journey.checksum | 
