Sha256: b983808a62ae10d43c74ab02979d74d236f8418d7d1c0bd5fa1ac5bf7c697968

Contents?: true

Size: 1.77 KB

Versions: 1

Compression:

Stored size: 1.77 KB

Contents

require_dependency "renalware/modalities"

module Renalware
  module Modalities
    class Modality < ApplicationRecord
      include Accountable
      include PatientScope

      belongs_to :description, class_name: "Description"
      belongs_to :patient, touch: true
      belongs_to :reason, class_name: "Reason"

      scope :ordered, -> { order(ended_on: :desc, updated_at: :desc) }

      scope :started_on_reversed, -> { order(started_on: :desc, updated_at: :desc) }
      scope :last_started_on, -> { started_on_reversed.where(ended_on: nil) }

      validates :patient, presence: true
      validates :started_on, presence: true
      validates :description, presence: true

      validates :started_on, timeliness: { type: :date }

      validate :validate_modality_starts_later_than_previous, on: :create, if: :patient

      def transfer!(attrs)
        transaction do
          successor = patient.modalities.new(attrs)
          successor.save!
          terminate!(successor) if successor.valid?
          successor
        end
      end

      def to_s
        description.name
      end

      def terminated?
        state == "terminated"
      end

      private

      def validate_modality_starts_later_than_previous
        unless started_later_than_previous?
          errors.add(:started_on, "can't be before previous modality's start date.")
        end
      end

      def started_later_than_previous?
        if (previous_modality = patient.modalities.last_started_on.first)
          started_on.present? && started_on >= previous_modality.started_on
        else
          true
        end
      end

      def terminate!(successor)
        self.ended_on = successor.started_on
        self.state = "terminated"
        self.by = successor.by
        save!
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
renalware-core-2.0.0.pre.beta4 app/models/renalware/modalities/modality.rb