2015-08-10 11:05:06 +02:00
class Dossier < ActiveRecord :: Base
2015-11-02 11:23:55 +01:00
enum state : { draft : 'draft' ,
2015-11-02 15:46:43 +01:00
initiated : 'initiated' ,
2015-11-02 11:45:52 +01:00
replied : 'replied' ,
2015-11-02 11:23:55 +01:00
updated : 'updated' ,
2015-11-02 11:52:39 +01:00
validated : 'validated' ,
2015-11-02 15:46:43 +01:00
submitted : 'submitted' , #-submit_validated
2015-11-02 15:00:28 +01:00
closed : 'closed' } #-processed
2015-09-22 18:30:20 +02:00
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
2015-09-21 17:59:03 +02:00
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
2015-08-12 10:09:52 +02:00
2015-08-13 15:55:19 +02:00
delegate :siren , to : :entreprise
delegate :siret , to : :etablissement
2015-09-21 17:59:03 +02:00
delegate :types_de_piece_justificative , to : :procedure
2015-11-05 11:21:44 +01:00
delegate :types_de_champ , to : :procedure
2015-08-13 15:55:19 +02:00
2015-08-18 14:22:16 +02:00
before_create :build_default_cerfa
2015-09-21 17:59:03 +02:00
after_save :build_default_pieces_justificatives , if : Proc . new { procedure_id_changed? }
2015-11-03 15:27:49 +01:00
after_save :build_default_champs , if : Proc . new { procedure_id_changed? }
2015-08-24 15:23:07 +02:00
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
2015-09-24 11:17:17 +02:00
validates :user , presence : true
2015-08-21 11:37:13 +02:00
2015-09-24 18:12:08 +02:00
def retrieve_piece_justificative_by_type ( type )
pieces_justificatives . where ( type_de_piece_justificative_id : type ) . last
end
def build_default_pieces_justificatives
2015-11-03 15:27:49 +01:00
2015-09-24 18:12:08 +02:00
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
2015-11-03 15:27:49 +01:00
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 )
2015-11-03 15:27:49 +01:00
end
end
2015-11-04 11:14:07 +01:00
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' )
2015-11-04 11:14:07 +01:00
end
def ordered_commentaires
commentaires . order ( created_at : :desc )
end
2015-09-24 18:12:08 +02:00
def sous_domaine
if Rails . env . production?
'tps'
else
'tps-dev'
end
end
def next_step! role , action
2015-11-02 15:46:43 +01:00
unless %w( initiate update comment valid submit close ) . include? ( action )
2015-09-24 18:12:08 +02:00
fail 'action is not valid'
end
2015-10-05 16:42:29 +02:00
unless %w( user gestionnaire ) . include? ( role )
2015-09-24 18:12:08 +02:00
fail 'role is not valid'
end
if role == 'user'
case action
2015-11-02 15:31:15 +01:00
when 'initiate'
2015-09-24 18:12:08 +02:00
if draft?
2015-11-02 15:31:15 +01:00
initiated!
2015-09-24 18:12:08 +02:00
end
2015-11-02 15:46:43 +01:00
when 'submit'
2015-11-02 11:45:52 +01:00
if validated?
2015-11-02 15:46:43 +01:00
submitted!
2015-09-24 18:12:08 +02:00
end
when 'update'
2015-11-02 11:33:00 +01:00
if replied?
2015-09-24 18:12:08 +02:00
updated!
end
when 'comment'
2015-11-02 11:33:00 +01:00
if replied?
2015-09-24 18:12:08 +02:00
updated!
end
end
elsif role == 'gestionnaire'
case action
when 'comment'
if updated?
2015-11-02 11:33:00 +01:00
replied!
2015-11-02 15:31:15 +01:00
elsif initiated?
2015-11-02 11:33:00 +01:00
replied!
2015-09-24 18:12:08 +02:00
end
2015-11-02 11:45:52 +01:00
when 'valid'
2015-09-24 18:12:08 +02:00
if updated?
2015-11-02 11:45:52 +01:00
validated!
2015-11-02 11:33:00 +01:00
elsif replied?
2015-11-02 11:45:52 +01:00
validated!
2015-11-02 15:31:15 +01:00
elsif initiated?
2015-11-02 11:45:52 +01:00
validated!
2015-09-24 18:12:08 +02:00
end
2015-11-02 15:00:28 +01:00
when 'close'
2015-11-02 15:46:43 +01:00
if submitted?
2015-11-02 15:00:28 +01:00
closed!
2015-09-24 18:12:08 +02:00
end
end
end
state
end
2015-11-10 11:58:56 +01:00
def self . a_traiter current_gestionnaire
Dossier . joins ( :procedure ) . where ( " (state='initiated' OR state='updated' OR state='submitted') AND dossiers.procedure_id = procedures.id AND procedures.administrateur_id = #{ current_gestionnaire . administrateur_id } " ) . order ( 'updated_at ASC' )
2015-09-24 18:12:08 +02:00
end
2015-11-10 11:58:56 +01:00
def self . en_attente current_gestionnaire
Dossier . joins ( :procedure ) . where ( " (state='replied' OR state='validated') AND dossiers.procedure_id = procedures.id AND procedures.administrateur_id = #{ current_gestionnaire . administrateur_id } " ) . order ( 'updated_at ASC' )
2015-09-24 18:12:08 +02:00
end
2015-11-10 11:58:56 +01:00
def self . termine current_gestionnaire
Dossier . joins ( :procedure ) . where ( " state='closed' AND dossiers.procedure_id = procedures.id AND procedures.administrateur_id = #{ current_gestionnaire . administrateur_id } " ) . order ( 'updated_at ASC' )
2015-09-24 18:12:08 +02:00
end
2015-11-17 18:21:03 +01:00
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-17 18:21:03 +01:00
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-17 18:21:03 +01:00
2015-11-16 15:58:35 +01:00
terms . split . each do | word |
query_string = " % #{ word } % "
query_string_start_with = " #{ word } % "
2015-11-17 18:21:03 +01:00
2015-11-16 15:58:35 +01:00
composed_scope = composed_scope . where (
dossiers [ :nom_projet ] . matches ( query_string ) . or \
2015-11-17 18:21:03 +01:00
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
2015-11-17 18:21:03 +01:00
#TODO refactor
composed_scope = composed_scope . where (
dossiers [ :id ] . eq_any ( current_gestionnaire . dossiers . ids ) . and \
dossiers [ :state ] . does_not_match ( 'draft' ) )
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
2015-09-24 18:12:08 +02:00
private
def build_default_cerfa
build_cerfa
true
end
2015-08-10 11:05:06 +02:00
end