2015-08-10 11:05:06 +02:00
|
|
|
class Dossier < ActiveRecord::Base
|
2016-02-19 16:59:18 +01:00
|
|
|
|
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-19 18:04:09 +01:00
|
|
|
submitted: 'submitted',
|
|
|
|
closed: 'closed'}
|
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
|
2016-03-16 15:34:35 +01:00
|
|
|
has_many :cerfa, dependent: :destroy
|
2016-01-18 16:20:51 +01:00
|
|
|
|
2015-09-24 11:45:00 +02:00
|
|
|
has_many :pieces_justificatives, dependent: :destroy
|
2015-11-03 10:48:40 +01:00
|
|
|
has_many :champs, dependent: :destroy
|
2015-11-24 10:02:55 +01:00
|
|
|
has_many :quartier_prioritaires, dependent: :destroy
|
2016-01-18 12:03:18 +01:00
|
|
|
has_many :cadastres, dependent: :destroy
|
2016-01-18 16:20:51 +01:00
|
|
|
has_many :commentaires, dependent: :destroy
|
2016-02-08 18:16:18 +01:00
|
|
|
has_many :invites, dependent: :destroy
|
2016-01-18 16:20:51 +01:00
|
|
|
|
2015-09-21 17:59:03 +02:00
|
|
|
belongs_to :procedure
|
2015-09-23 12:16:21 +02:00
|
|
|
belongs_to :user
|
2015-08-12 10:09:52 +02:00
|
|
|
|
2015-08-13 15:55:19 +02:00
|
|
|
delegate :siren, to: :entreprise
|
2015-12-03 12:00:22 +01:00
|
|
|
delegate :siret, to: :etablissement, allow_nil: true
|
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-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-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)
|
|
|
|
|
2016-03-17 14:50:10 +01:00
|
|
|
def retrieve_last_piece_justificative_by_type(type)
|
2015-09-24 18:12:08 +02:00
|
|
|
pieces_justificatives.where(type_de_piece_justificative_id: type).last
|
|
|
|
end
|
|
|
|
|
2016-03-17 14:50:10 +01:00
|
|
|
def retrieve_all_piece_justificative_by_type(type)
|
|
|
|
pieces_justificatives.where(type_de_piece_justificative_id: type)
|
2015-09-24 18:12:08 +02:00
|
|
|
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-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
|
|
|
|
|
2015-11-30 15:56:06 +01:00
|
|
|
def self.waiting_for_gestionnaire order = 'ASC'
|
|
|
|
where(state: WAITING_FOR_GESTIONNAIRE, archived: false).order("updated_at #{order}")
|
2015-09-24 18:12:08 +02:00
|
|
|
end
|
|
|
|
|
2015-11-30 15:56:06 +01:00
|
|
|
def self.waiting_for_user order = 'ASC'
|
|
|
|
where(state: WAITING_FOR_USER, archived: false).order("updated_at #{order}")
|
2015-09-24 18:12:08 +02:00
|
|
|
end
|
|
|
|
|
2015-11-30 15:56:06 +01:00
|
|
|
def self.termine order = 'ASC'
|
|
|
|
where(state: TERMINE, archived: false).order("updated_at #{order}")
|
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(
|
2016-03-14 16:49:12 +01:00
|
|
|
dossiers[:id].eq_any(current_gestionnaire.dossiers_filter.ids).and\
|
2015-11-27 15:04:24 +01:00
|
|
|
dossiers[:state].does_not_match('draft').and\
|
|
|
|
dossiers[:archived].eq(false))
|
2015-11-17 18:21:03 +01:00
|
|
|
|
|
|
|
begin
|
2016-03-14 16:49:12 +01:00
|
|
|
if Float(terms) && terms.to_i <= 2147483647 && current_gestionnaire.dossiers_filter.ids.include?(terms.to_i)
|
2015-11-17 18:21:03 +01:00
|
|
|
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
|
|
|
|
|
2016-02-02 18:37:38 +01:00
|
|
|
def cerfa_available?
|
2016-03-16 15:34:35 +01:00
|
|
|
procedure.cerfa_flag? && cerfa.size != 0
|
2016-02-02 18:37:38 +01:00
|
|
|
end
|
|
|
|
|
2016-02-19 16:59:18 +01:00
|
|
|
def as_csv(options={})
|
|
|
|
dossier_attr = DossierSerializer.new(self).attributes
|
|
|
|
etablissement_attr = EtablissementSerializer.new(self.etablissement).attributes.map {|k, v| ["etablissement.#{k}", v] }.to_h
|
|
|
|
entreprise_attr = EntrepriseSerializer.new(self.entreprise).attributes.map {|k, v| ["entreprise.#{k}", v] }.to_h
|
|
|
|
dossier_attr.merge(etablissement_attr).merge(entreprise_attr)
|
|
|
|
end
|
2015-08-10 11:05:06 +02:00
|
|
|
end
|