Sha256: 64b6035532de348e00d9894e94208322eeb9ff74abbfd0c9a3abe9bceeeb93e5

Contents?: true

Size: 1.74 KB

Versions: 44

Compression:

Stored size: 1.74 KB

Contents

# frozen_string_literal: true

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, on_or_before: -> { Date.current } }
      validate :validate_modality_starts_later_than_previous, on: :create, if: :patient

      def terminate_by(user, on:)
        self.ended_on = on
        self.state = "terminated"
        save_by!(user)
      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

44 entries across 44 versions & 1 rubygems

Version Path
renalware-core-2.1.1 app/models/renalware/modalities/modality.rb
renalware-core-2.1.0 app/models/renalware/modalities/modality.rb
renalware-core-2.0.167 app/models/renalware/modalities/modality.rb
renalware-core-2.0.166 app/models/renalware/modalities/modality.rb
renalware-core-2.0.165 app/models/renalware/modalities/modality.rb
renalware-core-2.0.164 app/models/renalware/modalities/modality.rb
renalware-core-2.0.163 app/models/renalware/modalities/modality.rb
renalware-core-2.0.162 app/models/renalware/modalities/modality.rb
renalware-core-2.0.161 app/models/renalware/modalities/modality.rb
renalware-core-2.0.160 app/models/renalware/modalities/modality.rb
renalware-core-2.0.159 app/models/renalware/modalities/modality.rb
renalware-core-2.0.158 app/models/renalware/modalities/modality.rb
renalware-core-2.0.157 app/models/renalware/modalities/modality.rb
renalware-core-2.0.156 app/models/renalware/modalities/modality.rb
renalware-core-2.0.155 app/models/renalware/modalities/modality.rb
renalware-core-2.0.153 app/models/renalware/modalities/modality.rb
renalware-core-2.0.152 app/models/renalware/modalities/modality.rb
renalware-core-2.0.151 app/models/renalware/modalities/modality.rb
renalware-core-2.0.149 app/models/renalware/modalities/modality.rb
renalware-core-2.0.148 app/models/renalware/modalities/modality.rb