aboutsummaryrefslogtreecommitdiffstats
path: root/app/models/merge.rb
diff options
context:
space:
mode:
authorAlban Peignier2018-04-22 15:38:44 +0200
committerAlban Peignier2018-04-22 16:50:54 +0200
commit413eced76b245fb49cb04b9467a1589a8b388b55 (patch)
tree7600c614d2dff7cfe9aa39cf833449b7c17bba1d /app/models/merge.rb
parent2d493e67f0af0cbab24a6d5a32e32fa78ec7f1df (diff)
downloadchouette-core-413eced76b245fb49cb04b9467a1589a8b388b55.tar.bz2
Merge PurchaseWindows when associated to a VehicleJourney. Refs #5956
Diffstat (limited to 'app/models/merge.rb')
-rw-r--r--app/models/merge.rb41
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