diff options
| author | Zog | 2018-03-14 10:09:35 +0100 | 
|---|---|---|
| committer | Zog | 2018-03-15 16:57:54 +0100 | 
| commit | e7b6d6679e3d2911ecb4c2d0875dd016dbade70a (patch) | |
| tree | 32e5cc384e0af4d024f95d63991dcfad39c0070c /app | |
| parent | b2a1d762cb3e7a72f0864e70843342de2566dfdf (diff) | |
| download | chouette-core-5956-merge-purchase-windows.tar.bz2 | |
Refs #5956; Clone PurchaseWindows when merging Referentials5956-merge-purchase-windows
Diffstat (limited to 'app')
| -rw-r--r-- | app/models/merge.rb | 42 | 
1 files changed, 41 insertions, 1 deletions
| diff --git a/app/models/merge.rb b/app/models/merge.rb index e72c794fe..ecaccd2ef 100644 --- a/app/models/merge.rb +++ b/app/models/merge.rb @@ -340,7 +340,7 @@ class Merge < ActiveRecord::Base            unless existing_time_table              objectid = Chouette::TimeTable.where(objectid: time_table.objectid).exists? ? nil : time_table.objectid -            candidate_time_table.objectid = objectid +              candidate_time_table.objectid = objectid              candidate_time_table.save! @@ -359,6 +359,10 @@ class Merge < ActiveRecord::Base          end        end      end + + +    # PurchaseWindows +    merge_purchase_windows new, referential    end    def save_current @@ -378,6 +382,42 @@ class Merge < ActiveRecord::Base    end +  protected +  def merge_purchase_windows new, referential +    referential_purchase_windows = referential.switch do +      Hash[referential.purchase_windows.joins(:vehicle_journeys).pluck(:id, "vehicle_journeys.checksum").inject(Hash.new { |h,k| h[k] = [] }) do |hash, row| +        id, vehicle_journey_checksum = row +        hash[referential.purchase_windows.find(id)] << vehicle_journey_checksum +        hash +      end] +    end + +    new.switch do +      referential_purchase_windows.each do |purchase_window, vehicle_journey_checksums| + +        new_purchase_window = new.purchase_windows.find_by name: purchase_window.name +        new_purchase_window ||= begin +          attributes = purchase_window.attributes.merge(id: nil) + +          new_purchase_window = new.purchase_windows.build attributes +          new_purchase_window.intersect_periods! new.metadatas.map(&:periodes).flatten + +          objectid = Chouette::PurchaseWindow.where(objectid: new_purchase_window.objectid).exists? ? nil : new_purchase_window.objectid +          new_purchase_window.objectid = objectid + +          new_purchase_window.save! +          new_purchase_window +        end + +        vehicle_journey_checksums.each do |vehicle_journey_checksum| +          # associate VehicleJourney +          associated_vehicle_journey = new.vehicle_journeys.find_by!(checksum: vehicle_journey_checksum) +          associated_vehicle_journey.purchase_windows << new_purchase_window +        end +      end +    end +  end +    class MetadatasMerger      attr_reader :merge_metadatas, :referential | 
