demarches-normaliennes/app/models/dossier.rb

195 lines
5.3 KiB
Ruby
Raw Normal View History

2015-08-10 11:05:06 +02:00
class Dossier < ActiveRecord::Base
enum state: {draft: 'draft',
initiated: 'initiated',
replied: 'replied',
updated: 'updated',
validated: 'validated',
2015-11-19 18:04:09 +01:00
submitted: 'submitted',
closed: 'closed'}
2015-09-24 11:45:00 +02:00
has_one :etablissement, dependent: :destroy
has_one :entreprise, dependent: :destroy
has_one :cerfa, dependent: :destroy
has_many :pieces_justificatives, dependent: :destroy
2015-11-03 10:48:40 +01:00
has_many :champs, dependent: :destroy
has_many :quartier_prioritaires, dependent: :destroy
belongs_to :procedure
2015-09-23 12:16:21 +02:00
belongs_to :user
2015-09-24 11:45:00 +02:00
has_many :commentaires, dependent: :destroy
delegate :siren, to: :entreprise
delegate :siret, to: :etablissement, allow_nil: true
delegate :types_de_piece_justificative, to: :procedure
2015-11-05 11:21:44 +01:00
delegate :types_de_champ, to: :procedure
2015-08-18 14:22:16 +02:00
before_create :build_default_cerfa
after_save :build_default_pieces_justificatives, if: Proc.new { procedure_id_changed? }
after_save :build_default_champs, if: Proc.new { procedure_id_changed? }
2015-08-25 10:19:39 +02:00
validates :nom_projet, presence: true, allow_blank: false, allow_nil: true
validates :description, presence: true, allow_blank: false, allow_nil: true
validates :user, presence: true
2015-08-21 11:37:13 +02:00
2015-11-30 14:48:37 +01:00
WAITING_FOR_GESTIONNAIRE = %w(initiated updated submitted)
WAITING_FOR_USER = %w(replied validated)
2015-11-19 18:04:09 +01:00
TERMINE = %w(closed)
def retrieve_piece_justificative_by_type(type)
pieces_justificatives.where(type_de_piece_justificative_id: type).last
end
def build_default_pieces_justificatives
procedure.types_de_piece_justificative.each do |type_de_piece_justificative|
PieceJustificative.create(type_de_piece_justificative_id: type_de_piece_justificative.id, dossier_id: id)
end
end
def build_default_champs
2015-11-05 11:21:44 +01:00
procedure.types_de_champ.each do |type_de_champ|
Champ.create(type_de_champ_id: type_de_champ.id, dossier_id: id)
end
end
def ordered_champs
2015-11-05 11:21:44 +01:00
champs.joins(', types_de_champ').where('champs.type_de_champ_id = types_de_champ.id').order('order_place')
end
def ordered_commentaires
commentaires.order(created_at: :desc)
end
def sous_domaine
if Rails.env.production?
'tps'
else
'tps-dev'
end
end
def next_step! role, action
unless %w(initiate update comment valid submit close).include?(action)
fail 'action is not valid'
end
2015-10-05 16:42:29 +02:00
unless %w(user gestionnaire).include?(role)
fail 'role is not valid'
end
if role == 'user'
case action
when 'initiate'
if draft?
initiated!
end
when 'submit'
if validated?
submitted!
end
when 'update'
if replied?
updated!
end
when 'comment'
if replied?
updated!
end
end
elsif role == 'gestionnaire'
case action
when 'comment'
if updated?
replied!
elsif initiated?
replied!
end
when 'valid'
if updated?
validated!
elsif replied?
validated!
elsif initiated?
validated!
end
when 'close'
if submitted?
closed!
end
end
end
state
end
2015-11-30 14:48:37 +01:00
def waiting_for_gestionnaire?
WAITING_FOR_GESTIONNAIRE.include?(state)
2015-11-19 18:04:09 +01:00
end
2015-11-30 14:48:37 +01:00
def waiting_for_user?
WAITING_FOR_USER.include?(state)
2015-11-19 18:04:09 +01:00
end
def termine?
TERMINE.include?(state)
end
def self.waiting_for_gestionnaire order = 'ASC'
where(state: WAITING_FOR_GESTIONNAIRE, archived: false).order("updated_at #{order}")
end
def self.waiting_for_user order = 'ASC'
where(state: WAITING_FOR_USER, archived: false).order("updated_at #{order}")
end
def self.termine order = 'ASC'
where(state: TERMINE, archived: false).order("updated_at #{order}")
end
def self.search current_gestionnaire, terms
return [], nil if terms.blank?
2015-11-16 15:58:35 +01:00
dossiers = Dossier.arel_table
users = User.arel_table
etablissements = Etablissement.arel_table
entreprises = Entreprise.arel_table
2015-11-16 15:58:35 +01:00
composed_scope = self.joins('LEFT OUTER JOIN users ON users.id = dossiers.user_id')
.joins('LEFT OUTER JOIN entreprises ON entreprises.dossier_id = dossiers.id')
.joins('LEFT OUTER JOIN etablissements ON etablissements.dossier_id = dossiers.id')
2015-11-16 15:58:35 +01:00
terms.split.each do |word|
query_string = "%#{word}%"
query_string_start_with = "#{word}%"
2015-11-16 15:58:35 +01:00
composed_scope = composed_scope.where(
dossiers[:nom_projet].matches(query_string).or\
users[:email].matches(query_string).or\
etablissements[:siret].matches(query_string_start_with).or\
entreprises[:raison_sociale].matches(query_string))
2015-11-16 15:58:35 +01:00
end
#TODO refactor
composed_scope = composed_scope.where(
dossiers[:id].eq_any(current_gestionnaire.dossiers.ids).and\
2015-11-27 15:04:24 +01:00
dossiers[:state].does_not_match('draft').and\
dossiers[:archived].eq(false))
begin
if Float(terms) && terms.to_i <= 2147483647 && current_gestionnaire.dossiers.ids.include?(terms.to_i)
dossier = Dossier.where("state != 'draft'").find(terms.to_i)
end
rescue ArgumentError, ActiveRecord::RecordNotFound
dossier = nil
end
return composed_scope, dossier
2015-11-16 15:58:35 +01:00
end
private
def build_default_cerfa
build_cerfa
true
end
2015-08-10 11:05:06 +02:00
end