Merge branch 'staging'
This commit is contained in:
commit
9aa405f1b5
59 changed files with 601 additions and 458 deletions
6
Gemfile
6
Gemfile
|
@ -110,7 +110,7 @@ group :test do
|
|||
gem 'poltergeist'
|
||||
gem 'timecop'
|
||||
gem 'guard'
|
||||
# gem 'guard-rspec', require: false
|
||||
gem 'guard-rspec', require: false
|
||||
gem 'guard-livereload', '~> 2.4', require: false
|
||||
gem 'vcr'
|
||||
gem 'rails-controller-testing'
|
||||
|
@ -134,8 +134,8 @@ group :development, :test do
|
|||
gem 'pry-byebug'
|
||||
|
||||
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
|
||||
# gem 'spring'
|
||||
# gem 'spring-commands-rspec'
|
||||
gem 'spring'
|
||||
gem 'spring-commands-rspec'
|
||||
gem 'rspec-rails', '~> 3.0'
|
||||
|
||||
gem 'railroady'
|
||||
|
|
15
Gemfile.lock
15
Gemfile.lock
|
@ -295,6 +295,10 @@ GEM
|
|||
guard (~> 2.8)
|
||||
guard-compat (~> 1.0)
|
||||
multi_json (~> 1.8)
|
||||
guard-rspec (4.7.3)
|
||||
guard (~> 2.1)
|
||||
guard-compat (~> 1.1)
|
||||
rspec (>= 2.99.0, < 4.0)
|
||||
haml (4.0.7)
|
||||
tilt
|
||||
haml-rails (0.9.0)
|
||||
|
@ -483,6 +487,10 @@ GEM
|
|||
activesupport (>= 3.0, < 6.0)
|
||||
builder (~> 3.0)
|
||||
rubyzip (~> 1.0)
|
||||
rspec (3.5.0)
|
||||
rspec-core (~> 3.5.0)
|
||||
rspec-expectations (~> 3.5.0)
|
||||
rspec-mocks (~> 3.5.0)
|
||||
rspec-core (3.5.4)
|
||||
rspec-support (~> 3.5.0)
|
||||
rspec-expectations (3.5.0)
|
||||
|
@ -557,6 +565,10 @@ GEM
|
|||
spreadsheet_architect (1.4.8)
|
||||
axlsx (>= 2.0)
|
||||
rodf (= 0.3.7)
|
||||
spring (2.0.1)
|
||||
activesupport (>= 4.2)
|
||||
spring-commands-rspec (1.0.4)
|
||||
spring (>= 0.9.1)
|
||||
sprockets (3.7.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
rack (> 1, < 3)
|
||||
|
@ -657,6 +669,7 @@ DEPENDENCIES
|
|||
font-awesome-rails
|
||||
guard
|
||||
guard-livereload (~> 2.4)
|
||||
guard-rspec
|
||||
haml-rails
|
||||
hashie
|
||||
jbuilder (~> 2.0)
|
||||
|
@ -696,6 +709,8 @@ DEPENDENCIES
|
|||
simplecov
|
||||
smart_listing
|
||||
spreadsheet_architect
|
||||
spring
|
||||
spring-commands-rspec
|
||||
sqlite3
|
||||
therubyracer
|
||||
timecop
|
||||
|
|
42
Guardfile
42
Guardfile
|
@ -64,24 +64,24 @@ guard 'livereload' do
|
|||
watch(%r{config/locales/.+\.yml})
|
||||
end
|
||||
|
||||
# guard :rspec, cmd: 'bin/rspec' do
|
||||
# watch(%r{^spec/.+_spec\.rb$})
|
||||
# watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
||||
# watch('spec/spec_helper.rb') { "spec" }
|
||||
#
|
||||
# # Rails example
|
||||
# watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
||||
# watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
||||
# watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
||||
# watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
||||
# watch('config/routes.rb') { "spec/routing" }
|
||||
# watch('app/controllers/application_controller.rb') { "spec/controllers" }
|
||||
# watch('spec/rails_helper.rb') { "spec" }
|
||||
#
|
||||
# # Capybara features specs
|
||||
# watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
|
||||
#
|
||||
# # Turnip features and steps
|
||||
# watch(%r{^spec/acceptance/(.+)\.feature$})
|
||||
# watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
|
||||
# end
|
||||
guard :rspec, cmd: 'spring rspec' do
|
||||
watch(%r{^spec/.+_spec\.rb$})
|
||||
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
||||
watch('spec/spec_helper.rb') { "spec" }
|
||||
|
||||
# Rails example
|
||||
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
||||
watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
||||
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
||||
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
||||
watch('config/routes.rb') { "spec/routing" }
|
||||
watch('app/controllers/application_controller.rb') { "spec/controllers" }
|
||||
watch('spec/rails_helper.rb') { "spec" }
|
||||
|
||||
# Capybara features specs
|
||||
watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
|
||||
|
||||
# Turnip features and steps
|
||||
watch(%r{^spec/acceptance/(.+)\.feature$})
|
||||
watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
|
||||
end
|
||||
|
|
6
app/assets/stylesheets/_card.scss
Normal file
6
app/assets/stylesheets/_card.scss
Normal file
|
@ -0,0 +1,6 @@
|
|||
.card {
|
||||
background: white;
|
||||
padding: 15px;
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, .15);
|
||||
border-radius: 2px;
|
||||
}
|
9
app/assets/stylesheets/administrations/stats.scss
Normal file
9
app/assets/stylesheets/administrations/stats.scss
Normal file
|
@ -0,0 +1,9 @@
|
|||
@import "card";
|
||||
|
||||
.stats {
|
||||
.stat-card {
|
||||
@extend .card;
|
||||
margin: 15px auto;
|
||||
max-width: 1200px;
|
||||
}
|
||||
}
|
11
app/assets/stylesheets/custom-mails.scss
Normal file
11
app/assets/stylesheets/custom-mails.scss
Normal file
|
@ -0,0 +1,11 @@
|
|||
#custom-mails {
|
||||
padding: 20px;
|
||||
|
||||
.wrapper {
|
||||
background-color: #FFF;
|
||||
box-shadow: 0 0 1px 0 rgba(0, 0, 0, 0.5);
|
||||
margin: 15px auto;
|
||||
max-width: 800px;
|
||||
padding: 20px;
|
||||
}
|
||||
}
|
|
@ -2,23 +2,35 @@ class Admin::MailTemplatesController < AdminController
|
|||
before_action :retrieve_procedure
|
||||
|
||||
def index
|
||||
@mail_templates = @procedure.mail_templates
|
||||
@mails = mails
|
||||
end
|
||||
|
||||
def edit
|
||||
@mail_template = @procedure.mail_templates.find(params[:id])
|
||||
@mail_template = find_the_right_mail params[:id]
|
||||
end
|
||||
|
||||
def update
|
||||
mail_template = @procedure.mail_templates.find(params[:id])
|
||||
mail_template = find_the_right_mail params[:id]
|
||||
mail_template.update_attributes(update_params)
|
||||
|
||||
redirect_to admin_procedure_mail_templates_path
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def mails
|
||||
%w(initiated received closed refused without_continuation)
|
||||
.map { |name| @procedure.send(name + "_mail") }
|
||||
end
|
||||
|
||||
def find_the_right_mail type
|
||||
mails.find { |m| m.class.slug == type }
|
||||
end
|
||||
|
||||
def update_params
|
||||
params.require(:mail_template).permit(:body, :object)
|
||||
{
|
||||
procedure_id: params[:procedure_id],
|
||||
object: params[:mail_template][:object],
|
||||
body: params[:mail_template][:body],
|
||||
}
|
||||
end
|
||||
end
|
||||
|
|
24
app/controllers/administrations/stats_controller.rb
Normal file
24
app/controllers/administrations/stats_controller.rb
Normal file
|
@ -0,0 +1,24 @@
|
|||
module Administrations
|
||||
class StatsController < ApplicationController
|
||||
before_action :authenticate_administration!
|
||||
|
||||
def index
|
||||
procedures = Procedure.where(created_at: Time.current.all_quarter).group("date_trunc('day', created_at)").count
|
||||
dossiers = Dossier.where(created_at: Time.current.all_quarter).group("date_trunc('day', created_at)").count
|
||||
@procedures = clean_hash(procedures)
|
||||
@dossiers = clean_hash(dossiers)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def clean_hash h
|
||||
h.keys.each{ |key| h[key.to_date] = h[key]; h.delete(key) }
|
||||
min_date = h.keys.min
|
||||
max_date = h.keys.max
|
||||
(min_date..max_date).each do |date|
|
||||
h[date] = 0 if h[date].nil?
|
||||
end
|
||||
h
|
||||
end
|
||||
end
|
||||
end
|
|
@ -88,45 +88,53 @@ class Backoffice::DossiersController < Backoffice::DossiersListController
|
|||
def receive
|
||||
create_dossier_facade params[:dossier_id]
|
||||
|
||||
@facade.dossier.received!
|
||||
dossier = @facade.dossier
|
||||
|
||||
dossier.received!
|
||||
flash.notice = 'Dossier considéré comme reçu.'
|
||||
|
||||
NotificationMailer.dossier_received(@facade.dossier).deliver_now!
|
||||
NotificationMailer.send_notification(dossier, dossier.procedure.received_mail).deliver_now!
|
||||
|
||||
redirect_to backoffice_dossier_path(id: @facade.dossier.id)
|
||||
redirect_to backoffice_dossier_path(id: dossier.id)
|
||||
end
|
||||
|
||||
def refuse
|
||||
create_dossier_facade params[:dossier_id]
|
||||
|
||||
@facade.dossier.next_step! 'gestionnaire', 'refuse'
|
||||
dossier = @facade.dossier
|
||||
|
||||
dossier.next_step! 'gestionnaire', 'refuse'
|
||||
flash.notice = 'Dossier considéré comme refusé.'
|
||||
|
||||
NotificationMailer.dossier_refused(@facade.dossier).deliver_now!
|
||||
NotificationMailer.send_notification(dossier, dossier.procedure.refused_mail).deliver_now!
|
||||
|
||||
redirect_to backoffice_dossier_path(id: @facade.dossier.id)
|
||||
redirect_to backoffice_dossier_path(id: dossier.id)
|
||||
end
|
||||
|
||||
def without_continuation
|
||||
create_dossier_facade params[:dossier_id]
|
||||
|
||||
@facade.dossier.next_step! 'gestionnaire', 'without_continuation'
|
||||
dossier = @facade.dossier
|
||||
|
||||
dossier.next_step! 'gestionnaire', 'without_continuation'
|
||||
flash.notice = 'Dossier considéré comme sans suite.'
|
||||
|
||||
NotificationMailer.dossier_without_continuation(@facade.dossier).deliver_now!
|
||||
NotificationMailer.send_notification(dossier, dossier.procedure.without_continuation_mail).deliver_now!
|
||||
|
||||
redirect_to backoffice_dossier_path(id: @facade.dossier.id)
|
||||
redirect_to backoffice_dossier_path(id: dossier.id)
|
||||
end
|
||||
|
||||
def close
|
||||
create_dossier_facade params[:dossier_id]
|
||||
|
||||
@facade.dossier.next_step! 'gestionnaire', 'close'
|
||||
dossier = @facade.dossier
|
||||
|
||||
dossier.next_step! 'gestionnaire', 'close'
|
||||
flash.notice = 'Dossier traité avec succès.'
|
||||
|
||||
NotificationMailer.dossier_closed(@facade.dossier).deliver_now!
|
||||
NotificationMailer.send_notification(dossier, dossier.procedure.closed_mail).deliver_now!
|
||||
|
||||
redirect_to backoffice_dossier_path(id: @facade.dossier.id)
|
||||
redirect_to backoffice_dossier_path(id: dossier.id)
|
||||
end
|
||||
|
||||
def follow
|
||||
|
|
|
@ -72,6 +72,7 @@ class Users::DescriptionController < UsersController
|
|||
if mandatory
|
||||
if @dossier.draft?
|
||||
@dossier.initiated!
|
||||
NotificationMailer.send_notification(@dossier, @dossier.procedure.initiated_mail).deliver_now!
|
||||
end
|
||||
|
||||
flash.notice = 'Félicitations, votre demande a bien été enregistrée.'
|
||||
|
|
|
@ -10,7 +10,7 @@ class Users::SessionsController < Sessions::SessionsController
|
|||
|
||||
# GET /resource/sign_in
|
||||
def new
|
||||
unless user_return_to_procedure_id.nil?
|
||||
unless user_return_to_procedure_id.nil? # WTF ?
|
||||
@dossier = Dossier.new(procedure: Procedure.active(user_return_to_procedure_id))
|
||||
end
|
||||
|
||||
|
@ -21,9 +21,10 @@ class Users::SessionsController < Sessions::SessionsController
|
|||
|
||||
#POST /resource/sign_in
|
||||
def create
|
||||
try_to_authenticate(User)
|
||||
try_to_authenticate(Gestionnaire)
|
||||
try_to_authenticate(Administrateur)
|
||||
remember_me = params[:user][:remember_me] == '1'
|
||||
try_to_authenticate(User, remember_me)
|
||||
try_to_authenticate(Gestionnaire, remember_me)
|
||||
try_to_authenticate(Administrateur, remember_me)
|
||||
|
||||
if user_signed_in?
|
||||
current_user.update_attributes(loged_in_with_france_connect: '')
|
||||
|
@ -83,9 +84,10 @@ class Users::SessionsController < Sessions::SessionsController
|
|||
NumberService.to_number session["user_return_to"].split("?procedure_id=").second
|
||||
end
|
||||
|
||||
def try_to_authenticate(klass)
|
||||
def try_to_authenticate(klass, remember_me = false)
|
||||
if resource = klass.find_for_database_authentication(email: params[:user][:email])
|
||||
if resource.valid_password?(params[:user][:password])
|
||||
resource.remember_me = remember_me
|
||||
sign_in resource
|
||||
resource.force_sync_credentials
|
||||
set_flash_message :notice, :signed_in
|
||||
|
|
|
@ -1,12 +0,0 @@
|
|||
class MailTemplateDecorator < Draper::Decorator
|
||||
delegate_all
|
||||
|
||||
def name
|
||||
case object.type
|
||||
when "MailReceived"
|
||||
"E-mail d'accusé de réception"
|
||||
else
|
||||
object.type
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,28 +1,20 @@
|
|||
class NotificationMailer < ApplicationMailer
|
||||
default from: 'tps@apientreprise.fr',
|
||||
to: Proc.new { @user.email }
|
||||
|
||||
def send_notification dossier, mail_template
|
||||
vars_mailer(dossier)
|
||||
|
||||
obj = mail_template.object_for_dossier dossier
|
||||
body = mail_template.body_for_dossier dossier
|
||||
|
||||
mail(subject: obj) { |format| format.html { body } }
|
||||
end
|
||||
|
||||
def new_answer dossier
|
||||
send_mail dossier, "Nouveau message pour votre dossier TPS N°#{dossier.id}"
|
||||
end
|
||||
|
||||
def dossier_received dossier
|
||||
send_mail dossier, dossier.procedure.mail_received.object_for_dossier(dossier)
|
||||
end
|
||||
|
||||
def dossier_submitted dossier
|
||||
send_mail dossier, "Votre dossier TPS N°#{dossier.id} a été déposé"
|
||||
end
|
||||
|
||||
def dossier_without_continuation dossier
|
||||
send_mail dossier, "Votre dossier TPS N°#{dossier.id} a été classé sans suite"
|
||||
end
|
||||
|
||||
def dossier_refused dossier
|
||||
send_mail dossier, "Votre dossier TPS N°#{dossier.id} a été refusé"
|
||||
end
|
||||
|
||||
def dossier_closed dossier
|
||||
send_mail dossier, "Votre dossier TPS N°#{dossier.id} a été accepté"
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def vars_mailer dossier
|
||||
|
@ -33,7 +25,6 @@ class NotificationMailer < ApplicationMailer
|
|||
def send_mail dossier, subject
|
||||
vars_mailer dossier
|
||||
|
||||
mail(from: "tps@apientreprise.fr", to: @user.email,
|
||||
subject: subject)
|
||||
mail(subject: subject)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
class MailTemplate < ActiveRecord::Base
|
||||
module MailTemplateConcern
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
include Rails.application.routes.url_helpers
|
||||
include ActionView::Helpers::UrlHelper
|
||||
|
||||
belongs_to :procedure
|
||||
|
||||
TAGS = {
|
||||
numero_dossier: {
|
||||
description: "Permet d'afficher le numéro de dossier de l'utilisateur."
|
||||
|
@ -30,19 +30,29 @@ class MailTemplate < ActiveRecord::Base
|
|||
end
|
||||
end
|
||||
|
||||
module ClassMethods
|
||||
def slug
|
||||
self.name.demodulize.underscore.parameterize
|
||||
end
|
||||
|
||||
def default
|
||||
body = ActionController::Base.new.render_to_string(template: self.name.underscore)
|
||||
self.new(object: self.const_get(:DEFAULT_OBJECT), body: body)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def replace_tag tag, dossier
|
||||
case tag
|
||||
when :numero_dossier
|
||||
dossier.id.to_s
|
||||
when :lien_dossier
|
||||
# TPS::Application::URL # quickfix
|
||||
link_to users_dossier_recapitulatif_url(dossier), users_dossier_recapitulatif_url(dossier), target: '_blank'
|
||||
when :libelle_procedure
|
||||
dossier.procedure.libelle
|
||||
else
|
||||
'--BALISE_NON_RECONNUE--'
|
||||
when :numero_dossier
|
||||
dossier.id.to_s
|
||||
when :lien_dossier
|
||||
link_to users_dossier_recapitulatif_url(dossier), users_dossier_recapitulatif_url(dossier), target: '_blank'
|
||||
when :libelle_procedure
|
||||
dossier.procedure.libelle
|
||||
else
|
||||
'--BALISE_NON_RECONNUE--'
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,18 +0,0 @@
|
|||
class MailReceived < MailTemplate
|
||||
before_save :default_values
|
||||
|
||||
def default_values
|
||||
self.object ||= "[TPS] Accusé de réception pour votre dossier n°--numero_dossier--"
|
||||
self.body ||= "Bonjour,
|
||||
<br>
|
||||
<br>
|
||||
Votre administration vous confirme la bonne réception de votre dossier n°--numero_dossier-- complet. Celui-ci sera instruit dans le délai légal déclaré par votre interlocuteur.<br>
|
||||
<br>
|
||||
En vous souhaitant une bonne journée,
|
||||
<br>
|
||||
<br>
|
||||
---
|
||||
<br>
|
||||
L'équipe TPS"
|
||||
end
|
||||
end
|
9
app/models/mails/closed_mail.rb
Normal file
9
app/models/mails/closed_mail.rb
Normal file
|
@ -0,0 +1,9 @@
|
|||
module Mails
|
||||
class ClosedMail < ActiveRecord::Base
|
||||
include MailTemplateConcern
|
||||
|
||||
DISPLAYED_NAME = "Accusé d'acceptation"
|
||||
DEFAULT_OBJECT = 'Votre dossier TPS N°--numero_dossier-- a été accepté'
|
||||
|
||||
end
|
||||
end
|
9
app/models/mails/initiated_mail.rb
Normal file
9
app/models/mails/initiated_mail.rb
Normal file
|
@ -0,0 +1,9 @@
|
|||
module Mails
|
||||
class InitiatedMail < ActiveRecord::Base
|
||||
include MailTemplateConcern
|
||||
|
||||
DISPLAYED_NAME = 'Accusé de réception'
|
||||
DEFAULT_OBJECT = 'Votre dossier TPS N°--numero_dossier-- a été bien reçu'
|
||||
|
||||
end
|
||||
end
|
9
app/models/mails/received_mail.rb
Normal file
9
app/models/mails/received_mail.rb
Normal file
|
@ -0,0 +1,9 @@
|
|||
module Mails
|
||||
class ReceivedMail < ActiveRecord::Base
|
||||
include MailTemplateConcern
|
||||
|
||||
DISPLAYED_NAME = 'Accusé de passage en instruction'
|
||||
DEFAULT_OBJECT = 'Votre dossier TPS N°--numero_dossier-- va être instruit'
|
||||
|
||||
end
|
||||
end
|
9
app/models/mails/refused_mail.rb
Normal file
9
app/models/mails/refused_mail.rb
Normal file
|
@ -0,0 +1,9 @@
|
|||
module Mails
|
||||
class RefusedMail < ApplicationRecord
|
||||
include MailTemplateConcern
|
||||
|
||||
DISPLAYED_NAME = 'Accusé de rejet du dossier'
|
||||
DEFAULT_OBJECT = 'Votre dossier TPS N°--numero_dossier-- a été refusé'
|
||||
|
||||
end
|
||||
end
|
9
app/models/mails/without_continuation_mail.rb
Normal file
9
app/models/mails/without_continuation_mail.rb
Normal file
|
@ -0,0 +1,9 @@
|
|||
module Mails
|
||||
class WithoutContinuationMail < ApplicationRecord
|
||||
include MailTemplateConcern
|
||||
|
||||
DISPLAYED_NAME = 'Accusé de classement sans suite'
|
||||
DEFAULT_OBJECT = 'Votre dossier TPS N°--numero_dossier-- a été classé sans suite'
|
||||
|
||||
end
|
||||
end
|
|
@ -3,8 +3,6 @@ class Procedure < ActiveRecord::Base
|
|||
has_many :types_de_champ, class_name: 'TypeDeChampPublic', dependent: :destroy
|
||||
has_many :types_de_champ_private, dependent: :destroy
|
||||
has_many :dossiers
|
||||
has_many :mail_templates
|
||||
has_one :mail_received
|
||||
|
||||
has_one :procedure_path, dependent: :destroy
|
||||
|
||||
|
@ -29,10 +27,23 @@ class Procedure < ActiveRecord::Base
|
|||
validates :libelle, presence: true, allow_blank: false, allow_nil: false
|
||||
validates :description, presence: true, allow_blank: false, allow_nil: false
|
||||
|
||||
after_create :build_default_mails
|
||||
# for all those mails do
|
||||
# has_one :initiated_mail, class_name: 'Mails::InitiatedMail'
|
||||
#
|
||||
# add a method to return default mail if none is saved
|
||||
# def initiated_mail_with_override
|
||||
# self.initiated_mail_without_override || InitiatedMail.default
|
||||
# end
|
||||
# alias_method_chain :initiated_mail, :override
|
||||
|
||||
def build_default_mails
|
||||
MailReceived.create(procedure: self) unless mail_received
|
||||
MAIL_TEMPLATE_TYPES = %w(InitiatedMail ReceivedMail ClosedMail RefusedMail WithoutContinuationMail)
|
||||
|
||||
MAIL_TEMPLATE_TYPES.each do |name|
|
||||
has_one "#{name.underscore}".to_sym, class_name: "Mails::#{name}"
|
||||
define_method("#{name.underscore}_with_override") do
|
||||
self.send("#{name.underscore}_without_override") || Object.const_get("Mails::#{name}").default
|
||||
end
|
||||
alias_method_chain "#{name.underscore.to_sym}".to_s, :override
|
||||
end
|
||||
|
||||
def path
|
||||
|
@ -89,11 +100,22 @@ class Procedure < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def clone
|
||||
procedure = self.deep_clone(include: [:types_de_piece_justificative, :types_de_champ, :types_de_champ_private, :module_api_carto, :mail_templates, types_de_champ: [:drop_down_list]])
|
||||
procedure = self.deep_clone(include:
|
||||
[:types_de_piece_justificative,
|
||||
:types_de_champ,
|
||||
:types_de_champ_private,
|
||||
:module_api_carto,
|
||||
types_de_champ: [:drop_down_list]
|
||||
])
|
||||
procedure.archived = false
|
||||
procedure.published = false
|
||||
procedure.logo_secure_token = nil
|
||||
procedure.remote_logo_url = self.logo_url
|
||||
|
||||
MAIL_TEMPLATE_TYPES.each do |mtt|
|
||||
procedure.send("#{mtt.underscore}=", self.send("#{mtt.underscore}_without_override").try(:dup))
|
||||
end
|
||||
|
||||
return procedure if procedure.save
|
||||
end
|
||||
|
||||
|
|
|
@ -1,8 +1,11 @@
|
|||
.white-back
|
||||
%h3
|
||||
= @mail_template.decorate.name
|
||||
= @mail_template.class.const_get(:DISPLAYED_NAME)
|
||||
|
||||
= simple_form_for @mail_template.becomes(MailTemplate), url: admin_procedure_mail_template_path(@procedure, @mail_template) do |f|
|
||||
= simple_form_for @mail_template,
|
||||
as: 'mail_template',
|
||||
url: admin_procedure_mail_template_path(@procedure, @mail_template.class.slug),
|
||||
method: :put do |f|
|
||||
.row
|
||||
.col-md-6
|
||||
= f.input :object, label: "Objet de l'email"
|
||||
|
@ -19,7 +22,7 @@
|
|||
Balise
|
||||
%th
|
||||
Description
|
||||
- MailTemplate::TAGS.each do |balise|
|
||||
- MailTemplateConcern::TAGS.each do |balise|
|
||||
%tr
|
||||
%td.center
|
||||
= "--#{balise.first}--"
|
||||
|
|
|
@ -1,15 +1,13 @@
|
|||
.row.white-back
|
||||
%h1 E-mails personnalisables
|
||||
|
||||
.row
|
||||
.col-md-6
|
||||
%table.table
|
||||
#custom-mails
|
||||
.wrapper
|
||||
%h1 E-mails personnalisables
|
||||
%table.table
|
||||
%tr
|
||||
%th{ colspan: 2 }
|
||||
Type d'email
|
||||
- @mails.each do |mail|
|
||||
%tr
|
||||
%th{ colspan: 2 }
|
||||
Type d'email
|
||||
- @procedure.mail_templates.each do |mt|
|
||||
%tr
|
||||
%td
|
||||
= mt.decorate.name
|
||||
%td.text-right
|
||||
= link_to "Personnaliser l'e-mail", edit_admin_procedure_mail_template_path(@procedure, mt)
|
||||
%td
|
||||
= mail.class.const_get(:DISPLAYED_NAME)
|
||||
%td.text-right
|
||||
= link_to "Personnaliser l'e-mail", edit_admin_procedure_mail_template_path(@procedure, mail.class.slug)
|
||||
|
|
|
@ -10,6 +10,9 @@
|
|||
|
||||
%br
|
||||
|
||||
.center
|
||||
=link_to 'Stats', administrations_stats_path, style: 'margin-bottom: 50px; display: block', 'data-no-turbolink': true
|
||||
|
||||
= smart_listing_render :admins
|
||||
|
||||
%br
|
||||
|
|
11
app/views/administrations/stats/index.html.haml
Normal file
11
app/views/administrations/stats/index.html.haml
Normal file
|
@ -0,0 +1,11 @@
|
|||
= javascript_include_tag 'https://code.highcharts.com/highcharts.js', 'chartkick'
|
||||
|
||||
.container
|
||||
.stats
|
||||
.stat-card
|
||||
%h1 Procédures crées
|
||||
= line_chart @procedures
|
||||
|
||||
.stat-card
|
||||
%h1 Dossiers créés
|
||||
= line_chart @dossiers
|
|
@ -1,6 +1,6 @@
|
|||
%div#main-container{class: "col-xs-#{main_container_size}"}
|
||||
%div.row
|
||||
#main-container{ class: "col-xs-#{main_container_size}" }
|
||||
.row
|
||||
= render partial: 'layouts/flash_messages'
|
||||
%div.row
|
||||
.row
|
||||
= yield
|
||||
%div.row
|
||||
.row
|
||||
|
|
17
app/views/mails/closed_mail.html.haml
Normal file
17
app/views/mails/closed_mail.html.haml
Normal file
|
@ -0,0 +1,17 @@
|
|||
Bonjour
|
||||
%br
|
||||
%br
|
||||
Votre dossier N°--numero_dossier-- a été accepté.
|
||||
%br
|
||||
%br
|
||||
A tout moment, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier--
|
||||
%br
|
||||
%br
|
||||
Bonne journée
|
||||
%br
|
||||
%br
|
||||
\---
|
||||
%br
|
||||
Merci de ne pas répondre à ce mail. Postez directement vos questions dans votre dossier sur la plateforme.
|
||||
%br
|
||||
\---
|
17
app/views/mails/initiated_mail.html.haml
Normal file
17
app/views/mails/initiated_mail.html.haml
Normal file
|
@ -0,0 +1,17 @@
|
|||
Bonjour
|
||||
%br
|
||||
%br
|
||||
Votre administration vous confirme la bonne réception de votre dossier n°--numero_dossier--.
|
||||
%br
|
||||
%br
|
||||
A tout moment, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier--
|
||||
%br
|
||||
%br
|
||||
Bonne journée
|
||||
%br
|
||||
%br
|
||||
\---
|
||||
%br
|
||||
Merci de ne pas répondre à ce mail. Postez directement vos questions dans votre dossier sur la plateforme.
|
||||
%br
|
||||
\---
|
14
app/views/mails/received_mail.html.haml
Normal file
14
app/views/mails/received_mail.html.haml
Normal file
|
@ -0,0 +1,14 @@
|
|||
Bonjour
|
||||
%br
|
||||
%br
|
||||
Votre administration vous confirme la bonne réception de votre dossier n°--numero_dossier--. Celui-ci sera instruit dans le délai légal déclaré par votre interlocuteur.
|
||||
%br
|
||||
%br
|
||||
Bonne journée
|
||||
%br
|
||||
%br
|
||||
\---
|
||||
%br
|
||||
Merci de ne pas répondre à ce mail. Postez directement vos questions dans votre dossier sur la plateforme.
|
||||
%br
|
||||
\---
|
17
app/views/mails/refused_mail.html.haml
Normal file
17
app/views/mails/refused_mail.html.haml
Normal file
|
@ -0,0 +1,17 @@
|
|||
Bonjour
|
||||
%br
|
||||
%br
|
||||
Votre dossier N°--numero_dossier-- a été refusé.
|
||||
%br
|
||||
%br
|
||||
Pour en savoir plus sur le motif du refus, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier--
|
||||
%br
|
||||
%br
|
||||
Bonne journée
|
||||
%br
|
||||
%br
|
||||
\---
|
||||
%br
|
||||
Merci de ne pas répondre à ce mail. Postez directement vos questions dans votre dossier sur la plateforme.
|
||||
%br
|
||||
\---
|
17
app/views/mails/without_continuation_mail.html.haml
Normal file
17
app/views/mails/without_continuation_mail.html.haml
Normal file
|
@ -0,0 +1,17 @@
|
|||
Bonjour
|
||||
%br
|
||||
%br
|
||||
Votre dossier N°--numero_dossier-- a été classé sans suite.
|
||||
%br
|
||||
%br
|
||||
Pour en savoir plus sur les raisons de ce classement sans suite, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier--
|
||||
%br
|
||||
%br
|
||||
Bonne journée
|
||||
%br
|
||||
%br
|
||||
\---
|
||||
%br
|
||||
Merci de ne pas répondre à ce mail. Postez directement vos questions dans votre dossier sur la plateforme.
|
||||
%br
|
||||
\---
|
|
@ -1,14 +0,0 @@
|
|||
Bonjour <%= @user.email %>
|
||||
|
||||
votre dossier N°<%=@dossier.id%> déposé auprès de <%= @dossier.procedure.organisation %> a été accepté ce jour à <%= @dossier.updated_at %>.
|
||||
|
||||
A tout moment, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : <%=users_dossier_recapitulatif_url(dossier_id: @dossier.id)%>
|
||||
|
||||
Bonne journée
|
||||
|
||||
---
|
||||
Merci de ne pas répondre à ce mail. Postez directement vos questions dans votre dossier sur la plateforme.
|
||||
---
|
||||
|
||||
---
|
||||
L'équide TPS - tps@apientreprise.fr
|
|
@ -1 +0,0 @@
|
|||
<%= @dossier.procedure.mail_received.body_for_dossier(@dossier).html_safe %>
|
|
@ -1,14 +0,0 @@
|
|||
Bonjour <%= @user.email %>
|
||||
|
||||
votre dossier N°<%=@dossier.id%> déposé auprès de <%= @dossier.procedure.organisation %> a été refusé ce jour à <%= @dossier.updated_at %>.
|
||||
|
||||
Pour en savoir plus sur le motif du refus, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : <%=users_dossier_recapitulatif_url(dossier_id: @dossier.id)%>
|
||||
|
||||
Bonne journée,
|
||||
|
||||
---
|
||||
Merci de ne pas répondre à ce mail. Postez directement vos questions dans votre dossier sur la plateforme.
|
||||
---
|
||||
|
||||
---
|
||||
L'équide TPS - tps@apientreprise.fr
|
|
@ -1,12 +0,0 @@
|
|||
Bonjour <%= @user.email %>
|
||||
|
||||
Nous vous confirmons que votre dossier N°<%=@dossier.id%> a été déposé auprès de <%= @dossier.procedure.organisation %> avec succès ce jour à <%= @dossier.updated_at %>.
|
||||
|
||||
Bonne journée,
|
||||
|
||||
---
|
||||
Merci de ne pas répondre à ce mail. Postez directement vos questions dans votre dossier sur la plateforme.
|
||||
---
|
||||
|
||||
---
|
||||
L'équide TPS - tps@apientreprise.fr
|
|
@ -1,14 +0,0 @@
|
|||
Bonjour <%= @user.email %>
|
||||
|
||||
votre dossier N°<%=@dossier.id%> déposé auprès de <%= @dossier.procedure.organisation %> a été classé sans suite ce jour à <%= @dossier.updated_at %>.
|
||||
|
||||
Pour en savoir plus sur les raisons de ce classement sans suite, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : <%=users_dossier_recapitulatif_url(dossier_id: @dossier.id)%>
|
||||
|
||||
Bonne journée,
|
||||
|
||||
---
|
||||
Merci de ne pas répondre à ce mail. Postez directement vos questions dans votre dossier sur la plateforme.
|
||||
---
|
||||
|
||||
---
|
||||
L'équide TPS - tps@apientreprise.fr
|
|
@ -13,25 +13,16 @@
|
|||
Qu’est-ce que FranceConnect ?
|
||||
|
||||
%hr
|
||||
= form_for @user, url: user_session_path, method: :post do |f|
|
||||
%h4
|
||||
= f.label :email
|
||||
.input-group
|
||||
.input-group-addon
|
||||
%span.fa.fa-user
|
||||
= f.email_field :email, class: 'form-control'
|
||||
%br
|
||||
%h4
|
||||
= f.label 'Mot de passe'
|
||||
.input-group
|
||||
.input-group-addon
|
||||
%span.fa.fa-asterisk
|
||||
= f.password_field :password, class: 'form-control', value: "#{@user.password}"
|
||||
%br
|
||||
%br
|
||||
.actions
|
||||
= f.submit "Se connecter", class:'btn btn-primary'
|
||||
%br
|
||||
|
||||
.text-left
|
||||
= simple_form_for @user, url: user_session_path do |f|
|
||||
= f.input :email
|
||||
= f.input :password, label: 'Mot de passe', input_html: { value: @user.password }
|
||||
- if devise_mapping.rememberable?
|
||||
= f.input :remember_me, as: :boolean, label: 'Se souvenir de moi'
|
||||
.text-center
|
||||
= f.submit "Se connecter", class:'btn btn-primary'
|
||||
|
||||
- if @user.email != DemoEmails[:gestionnaire] && @user.email != DemoEmails[:admin]
|
||||
= render "users/shared/links"
|
||||
|
||||
|
|
|
@ -126,7 +126,7 @@ Devise.setup do |config|
|
|||
|
||||
# ==> Configuration for :rememberable
|
||||
# The time the user will be remembered without asking for credentials again.
|
||||
# config.remember_for = 2.weeks
|
||||
config.remember_for = 2.weeks
|
||||
|
||||
# Invalidates all the remember me tokens when the user signs out.
|
||||
config.expire_all_remember_me_on_sign_out = true
|
||||
|
|
|
@ -42,7 +42,10 @@ Rails.application.routes.draw do
|
|||
get 'admin' => 'admin#index'
|
||||
get 'backoffice' => 'backoffice#index'
|
||||
|
||||
resources :administrations
|
||||
resources :administrations, only: [:index, :create]
|
||||
namespace :administrations do
|
||||
resources :stats, only: [:index]
|
||||
end
|
||||
|
||||
namespace :france_connect do
|
||||
get 'particulier' => 'particulier#login'
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
class DeleteAllMailValidatedInDb < ActiveRecord::Migration[5.0]
|
||||
def change
|
||||
MailTemplate.where(type: "MailValidated").delete_all
|
||||
mail_template_exist = Object.const_get(:MailTemplate).is_a?(Class) rescue false
|
||||
MailTemplate.where(type: "MailValidated").delete_all if mail_template_exist
|
||||
end
|
||||
end
|
||||
|
|
11
db/migrate/20170302105557_create_initiated_mails.rb
Normal file
11
db/migrate/20170302105557_create_initiated_mails.rb
Normal file
|
@ -0,0 +1,11 @@
|
|||
class CreateInitiatedMails < ActiveRecord::Migration[5.0]
|
||||
def change
|
||||
create_table :initiated_mails do |t|
|
||||
t.string :object
|
||||
t.text :body
|
||||
t.belongs_to :procedure, index: true, unique: true, foreign_key: true
|
||||
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,8 +1,17 @@
|
|||
class RemoveDepositDatetimeFromDossiers < ActiveRecord::Migration[5.0]
|
||||
def change
|
||||
remove_column :dossiers, :deposit_datetime, :datetime
|
||||
end
|
||||
|
||||
def up
|
||||
Dossier.where.not(deposit_datetime: nil).each do |dossier|
|
||||
dossier.update(initiated_at: dossier.deposit_datetime)
|
||||
end
|
||||
remove_column :dossiers, :deposit_datetime, :datetime
|
||||
end
|
||||
|
||||
def down
|
||||
Dossier.where.not(initiated_at: nil).each do |dossier|
|
||||
dossier.update(deposit_datetime: dossier.initiated_at)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
12
db/migrate/20170306102116_create_received_mails.rb
Normal file
12
db/migrate/20170306102116_create_received_mails.rb
Normal file
|
@ -0,0 +1,12 @@
|
|||
class CreateReceivedMails < ActiveRecord::Migration[5.0]
|
||||
def change
|
||||
create_table :received_mails do |t|
|
||||
t.text :body
|
||||
t.string :object
|
||||
t.references :procedure, foreign_key: true
|
||||
|
||||
t.column :created_at, :timestamp, null: true
|
||||
t.column :updated_at, :timestamp, null: true
|
||||
end
|
||||
end
|
||||
end
|
11
db/migrate/20170306102238_create_closed_mails.rb
Normal file
11
db/migrate/20170306102238_create_closed_mails.rb
Normal file
|
@ -0,0 +1,11 @@
|
|||
class CreateClosedMails < ActiveRecord::Migration[5.0]
|
||||
def change
|
||||
create_table :closed_mails do |t|
|
||||
t.text :body
|
||||
t.string :object
|
||||
t.belongs_to :procedure, index: true, unique: true, foreign_key: true
|
||||
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
11
db/migrate/20170306102256_create_refused_mails.rb
Normal file
11
db/migrate/20170306102256_create_refused_mails.rb
Normal file
|
@ -0,0 +1,11 @@
|
|||
class CreateRefusedMails < ActiveRecord::Migration[5.0]
|
||||
def change
|
||||
create_table :refused_mails do |t|
|
||||
t.text :body
|
||||
t.string :object
|
||||
t.belongs_to :procedure, index: true, unique: true, foreign_key: true
|
||||
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,11 @@
|
|||
class CreateWithoutContinuationMails < ActiveRecord::Migration[5.0]
|
||||
def change
|
||||
create_table :without_continuation_mails do |t|
|
||||
t.text :body
|
||||
t.string :object
|
||||
t.belongs_to :procedure, index: true, unique: true, foreign_key: true
|
||||
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
11
db/migrate/20170307092820_move_mails_to_new_system.rb
Normal file
11
db/migrate/20170307092820_move_mails_to_new_system.rb
Normal file
|
@ -0,0 +1,11 @@
|
|||
class MoveMailsToNewSystem < ActiveRecord::Migration[5.0]
|
||||
def up
|
||||
execute 'INSERT INTO received_mails (object, body, procedure_id, created_at, updated_at)
|
||||
SELECT object, body, procedure_id, mail_templates.created_at, mail_templates.updated_at from mail_templates inner join procedures on mail_templates.procedure_id = procedures.id;'
|
||||
|
||||
execute "UPDATE received_mails set created_at='1980-01-01 00:00', updated_at='1980-01-01 00:00' where created_at is NULL"
|
||||
|
||||
change_column_null :received_mails, :created_at, false
|
||||
change_column_null :received_mails, :updated_at, false
|
||||
end
|
||||
end
|
52
db/schema.rb
52
db/schema.rb
|
@ -10,7 +10,7 @@
|
|||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(version: 20170302112312) do
|
||||
ActiveRecord::Schema.define(version: 20170307092820) do
|
||||
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "plpgsql"
|
||||
|
@ -104,6 +104,15 @@ ActiveRecord::Schema.define(version: 20170302112312) do
|
|||
t.index ["type_de_champ_id"], name: "index_champs_on_type_de_champ_id", using: :btree
|
||||
end
|
||||
|
||||
create_table "closed_mails", force: :cascade do |t|
|
||||
t.text "body"
|
||||
t.string "object"
|
||||
t.integer "procedure_id"
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.index ["procedure_id"], name: "index_closed_mails_on_procedure_id", using: :btree
|
||||
end
|
||||
|
||||
create_table "commentaires", force: :cascade do |t|
|
||||
t.string "email"
|
||||
t.datetime "created_at", null: false
|
||||
|
@ -227,6 +236,15 @@ ActiveRecord::Schema.define(version: 20170302112312) do
|
|||
t.index ["dossier_id"], name: "index_individuals_on_dossier_id", using: :btree
|
||||
end
|
||||
|
||||
create_table "initiated_mails", force: :cascade do |t|
|
||||
t.string "object"
|
||||
t.text "body"
|
||||
t.integer "procedure_id"
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.index ["procedure_id"], name: "index_initiated_mails_on_procedure_id", using: :btree
|
||||
end
|
||||
|
||||
create_table "invites", force: :cascade do |t|
|
||||
t.string "email"
|
||||
t.string "email_sender"
|
||||
|
@ -336,6 +354,24 @@ ActiveRecord::Schema.define(version: 20170302112312) do
|
|||
t.integer "dossier_id"
|
||||
end
|
||||
|
||||
create_table "received_mails", force: :cascade do |t|
|
||||
t.text "body"
|
||||
t.string "object"
|
||||
t.integer "procedure_id"
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.index ["procedure_id"], name: "index_received_mails_on_procedure_id", using: :btree
|
||||
end
|
||||
|
||||
create_table "refused_mails", force: :cascade do |t|
|
||||
t.text "body"
|
||||
t.string "object"
|
||||
t.integer "procedure_id"
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.index ["procedure_id"], name: "index_refused_mails_on_procedure_id", using: :btree
|
||||
end
|
||||
|
||||
create_table "rna_informations", force: :cascade do |t|
|
||||
t.string "association_id"
|
||||
t.string "titre"
|
||||
|
@ -387,11 +423,25 @@ ActiveRecord::Schema.define(version: 20170302112312) do
|
|||
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
|
||||
end
|
||||
|
||||
create_table "without_continuation_mails", force: :cascade do |t|
|
||||
t.text "body"
|
||||
t.string "object"
|
||||
t.integer "procedure_id"
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.index ["procedure_id"], name: "index_without_continuation_mails_on_procedure_id", using: :btree
|
||||
end
|
||||
|
||||
add_foreign_key "cerfas", "dossiers"
|
||||
add_foreign_key "closed_mails", "procedures"
|
||||
add_foreign_key "commentaires", "dossiers"
|
||||
add_foreign_key "dossiers", "users"
|
||||
add_foreign_key "initiated_mails", "procedures"
|
||||
add_foreign_key "procedure_paths", "administrateurs"
|
||||
add_foreign_key "procedure_paths", "procedures"
|
||||
add_foreign_key "received_mails", "procedures"
|
||||
add_foreign_key "refused_mails", "procedures"
|
||||
add_foreign_key "without_continuation_mails", "procedures"
|
||||
|
||||
create_view :searches, sql_definition: <<-SQL
|
||||
SELECT dossiers.id AS dossier_id,
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Admin::MailTemplatesController, type: :controller do
|
||||
let(:mail_template) { create :mail_template, :dossier_received }
|
||||
let(:procedure) { create :procedure, mail_templates: [mail_template]}
|
||||
let(:initiated_mail) { Mails::InitiatedMail.default }
|
||||
let(:procedure) { create :procedure }
|
||||
|
||||
before do
|
||||
sign_in procedure.administrateur
|
||||
|
@ -11,41 +11,32 @@ describe Admin::MailTemplatesController, type: :controller do
|
|||
describe 'GET index' do
|
||||
render_views
|
||||
|
||||
subject { get :index, params: {procedure_id: procedure.id} }
|
||||
subject { get :index, params: { procedure_id: procedure.id } }
|
||||
|
||||
it { expect(subject.status).to eq 200 }
|
||||
it { expect(subject.body).to include("E-mails personnalisables") }
|
||||
it { expect(subject.body).to include(*procedure.mail_templates.map{ |mt| mt.decorate.name }) }
|
||||
it { expect(subject.body).to include(Mails::InitiatedMail::DISPLAYED_NAME) }
|
||||
end
|
||||
|
||||
describe 'PATCH update' do
|
||||
let(:object) { 'plop modif' }
|
||||
let(:body) { 'plip modif' }
|
||||
|
||||
context 'when is mail_template id' do
|
||||
subject { patch :update,
|
||||
params: {procedure_id: mail_template.procedure.id,
|
||||
id: mail_template.id,
|
||||
mail_template: {
|
||||
object: object,
|
||||
body: body
|
||||
}} }
|
||||
before :each do
|
||||
patch :update,
|
||||
params: { procedure_id: procedure.id,
|
||||
id: initiated_mail.class.slug,
|
||||
mail_template: { object: object, body: body }
|
||||
}
|
||||
end
|
||||
|
||||
it { expect(subject).to redirect_to admin_procedure_mail_templates_path(mail_template.procedure) }
|
||||
it { expect(response).to redirect_to admin_procedure_mail_templates_path(procedure) }
|
||||
|
||||
it {
|
||||
expect {
|
||||
subject
|
||||
mail_template.reload
|
||||
}.to change(mail_template, :object).from("[TPS] Accusé de réception pour votre dossier n°--numero_dossier--").to(object)
|
||||
}
|
||||
context 'the mail template' do
|
||||
subject { procedure.reload ; procedure.initiated_mail }
|
||||
|
||||
it {
|
||||
expect {
|
||||
subject
|
||||
mail_template.reload
|
||||
}.to change(mail_template, :body).from("Votre administration vous confirme la bonne réception de votre dossier n°--numero_dossier--").to(body)
|
||||
}
|
||||
it { expect(subject.object).to eq(object) }
|
||||
it { expect(subject.body).to eq(body) }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -230,7 +230,8 @@ describe Backoffice::DossiersController, type: :controller do
|
|||
end
|
||||
|
||||
it 'Notification email is send' do
|
||||
expect(NotificationMailer).to receive(:dossier_received).and_return(NotificationMailer)
|
||||
expect(NotificationMailer).to receive(:send_notification)
|
||||
.with(dossier, kind_of(Mails::ReceivedMail)).and_return(NotificationMailer)
|
||||
expect(NotificationMailer).to receive(:deliver_now!)
|
||||
|
||||
subject
|
||||
|
@ -255,7 +256,8 @@ describe Backoffice::DossiersController, type: :controller do
|
|||
end
|
||||
|
||||
it 'Notification email is sent' do
|
||||
expect(NotificationMailer).to receive(:dossier_refused).and_return(NotificationMailer)
|
||||
expect(NotificationMailer).to receive(:send_notification)
|
||||
.with(dossier, kind_of(Mails::RefusedMail)).and_return(NotificationMailer)
|
||||
expect(NotificationMailer).to receive(:deliver_now!)
|
||||
|
||||
subject
|
||||
|
@ -280,7 +282,8 @@ describe Backoffice::DossiersController, type: :controller do
|
|||
end
|
||||
|
||||
it 'Notification email is sent' do
|
||||
expect(NotificationMailer).to receive(:dossier_without_continuation).and_return(NotificationMailer)
|
||||
expect(NotificationMailer).to receive(:send_notification)
|
||||
.with(dossier, kind_of(Mails::WithoutContinuationMail)).and_return(NotificationMailer)
|
||||
expect(NotificationMailer).to receive(:deliver_now!)
|
||||
|
||||
subject
|
||||
|
@ -304,7 +307,8 @@ describe Backoffice::DossiersController, type: :controller do
|
|||
end
|
||||
|
||||
it 'Notification email is sent' do
|
||||
expect(NotificationMailer).to receive(:dossier_closed).and_return(NotificationMailer)
|
||||
expect(NotificationMailer).to receive(:send_notification)
|
||||
.with(dossier, kind_of(Mails::ClosedMail)).and_return(NotificationMailer)
|
||||
expect(NotificationMailer).to receive(:deliver_now!)
|
||||
|
||||
subject
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe MailTemplateDecorator do
|
||||
let(:mail_template) {create :mail_template}
|
||||
let(:decorator) { mail_template.decorate }
|
||||
|
||||
context '#name' do
|
||||
subject { decorator.name }
|
||||
|
||||
context 'when mail_template is a MailReceived' do
|
||||
let(:mail_template) {create :mail_template, :dossier_received}
|
||||
it { is_expected.to eq "E-mail d'accusé de réception" }
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
|
@ -9,7 +9,6 @@ FactoryGirl.define do
|
|||
published false
|
||||
cerfa_flag false
|
||||
administrateur { create(:administrateur) }
|
||||
mail_templates { [create(:mail_template, :dossier_received)]}
|
||||
|
||||
after(:build) do |procedure, _evaluator|
|
||||
if procedure.module_api_carto.nil?
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
FactoryGirl.define do
|
||||
factory :mail_received do
|
||||
factory :received_mail, class: Mails::ReceivedMail do
|
||||
object "Mail d'accusé de bonne reception de votre dossier"
|
||||
body "Votre dossier est correctement reçu"
|
||||
type 'MailReceived'
|
||||
end
|
||||
end
|
|
@ -1,6 +1,16 @@
|
|||
require "spec_helper"
|
||||
|
||||
RSpec.describe NotificationMailer, type: :mailer do
|
||||
describe '.send_notification' do
|
||||
let(:user) { create(:user) }
|
||||
let(:dossier) { create(:dossier, user: user) }
|
||||
let(:email) { instance_double('email', object_for_dossier: 'object', body_for_dossier: 'body') }
|
||||
subject { described_class.send_notification(dossier, email) }
|
||||
|
||||
it { expect(subject.subject).to eq(email.object_for_dossier) }
|
||||
it { expect(subject.body).to eq(email.body_for_dossier) }
|
||||
end
|
||||
|
||||
describe ".new_answer" do
|
||||
let(:user) { create(:user) }
|
||||
let(:dossier) { create(:dossier, user: user) }
|
||||
|
@ -11,30 +21,4 @@ RSpec.describe NotificationMailer, type: :mailer do
|
|||
it { expect(subject.body).to include("Pour le consulter, merci de vous rendre sur #{users_dossier_recapitulatif_url(dossier_id: dossier.id)}") }
|
||||
it { expect(subject.subject).to eq("Nouveau message pour votre dossier TPS N°#{dossier.id}") }
|
||||
end
|
||||
|
||||
describe ".dossier_submitted" do
|
||||
let(:user) { create(:user) }
|
||||
let(:dossier) { create(:dossier, user: user) }
|
||||
|
||||
subject(:subject) { described_class.dossier_submitted(dossier) }
|
||||
|
||||
before { dossier.reload }
|
||||
|
||||
it { expect(subject.body).to match("Nous vous confirmons que votre dossier N°#{dossier.id} a été déposé") }
|
||||
it { expect(subject.body).to match("auprès de #{dossier.procedure.organisation} avec succès") }
|
||||
it { expect(subject.body).to match("ce jour à #{dossier.updated_at}.") }
|
||||
it { expect(subject.subject).to eq("Votre dossier TPS N°#{dossier.id} a été déposé") }
|
||||
end
|
||||
|
||||
describe '.dossier_received' do
|
||||
let(:user) { create(:user) }
|
||||
let(:dossier) { create(:dossier, user: user) }
|
||||
|
||||
subject(:subject) { described_class.dossier_received(dossier) }
|
||||
|
||||
before { dossier.reload }
|
||||
|
||||
it { expect(subject.subject).to eq("[TPS] Accusé de réception pour votre dossier n°#{dossier.id}") }
|
||||
it { expect(subject.body).to match("Votre administration vous confirme la bonne réception de votre dossier n°#{dossier.id}") }
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
class NotificationMailerPreview < ActionMailer::Preview
|
||||
|
||||
def dossier_received
|
||||
NotificationMailer.dossier_received(Dossier.last)
|
||||
def send_notification
|
||||
NotificationMailer.send_notification(Dossier.last, Dossier.last.procedure.initiated_mail)
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
load 'spec/spec_helper.rb'
|
||||
load 'db/migrate/20170215102943_remove_duplicate_email_received.rb'
|
||||
|
||||
describe RemoveDuplicateEmailReceived do
|
||||
context 'with one procedure and one associated mail_received' do
|
||||
let!(:procedure) { create(:procedure) }
|
||||
|
||||
it 'keeps the procedure mails' do
|
||||
RemoveDuplicateEmailReceived.new.change
|
||||
expect(MailReceived.count).to eq(1)
|
||||
end
|
||||
|
||||
context 'and another mail_received' do
|
||||
before :each do
|
||||
MailReceived.create!(procedure: procedure)
|
||||
end
|
||||
|
||||
it 'destroys the unecessary maiL_received' do
|
||||
RemoveDuplicateEmailReceived.new.change
|
||||
expect(MailReceived.count).to eq(1)
|
||||
expect(procedure.mail_received).not_to be_nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
17
spec/models/concern/mail_template_concern_spec.rb
Normal file
17
spec/models/concern/mail_template_concern_spec.rb
Normal file
|
@ -0,0 +1,17 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe MailTemplateConcern do
|
||||
describe '.replace_tags' do
|
||||
let(:dossier) { create :dossier }
|
||||
let(:initiated_mail) { Mails::InitiatedMail.default }
|
||||
|
||||
it 'works' do
|
||||
initiated_mail.object = '[TPS] --numero_dossier-- --libelle_procedure-- --lien_dossier--'
|
||||
expected =
|
||||
"[TPS] 1 Demande de subvention " +
|
||||
"<a target=\"_blank\" href=\"http://localhost:3000/users/dossiers/1/recapitulatif\">http://localhost:3000/users/dossiers/1/recapitulatif</a>"
|
||||
|
||||
expect(initiated_mail.object_for_dossier(dossier)).to eq(expected)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,90 +0,0 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe MailTemplate do
|
||||
it { is_expected.to have_db_column(:body) }
|
||||
it { is_expected.to have_db_column(:type) }
|
||||
|
||||
it { is_expected.to belong_to(:procedure) }
|
||||
|
||||
describe '.tags' do
|
||||
subject { MailTemplate::TAGS }
|
||||
|
||||
it { expect(subject.size).to eq 3 }
|
||||
|
||||
describe 'numero_dossier' do
|
||||
subject { super()[:numero_dossier] }
|
||||
|
||||
describe 'attr and description value' do
|
||||
|
||||
it { expect(subject[:description]).to eq "Permet d'afficher le numéro de dossier de l'utilisateur." }
|
||||
end
|
||||
end
|
||||
|
||||
describe 'libelle_procedure' do
|
||||
subject { super()[:libelle_procedure] }
|
||||
|
||||
describe 'attr and description value' do
|
||||
|
||||
it { expect(subject[:description]).to eq "Permet d'afficher le libellé de la procédure." }
|
||||
end
|
||||
end
|
||||
|
||||
describe 'lien_dossier' do
|
||||
subject { super()[:lien_dossier] }
|
||||
|
||||
describe 'attr and description value' do
|
||||
|
||||
it { expect(subject[:description]).to eq "Permet d'afficher un lien vers le dossier de l'utilisateur." }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '.replace_tags' do
|
||||
let(:dossier) { create :dossier }
|
||||
let(:procedure) { dossier.procedure }
|
||||
let(:mail_received) { procedure.mail_received }
|
||||
|
||||
describe 'for tag --numero_dossier--' do
|
||||
before do
|
||||
procedure.mail_received.update_column(:object, '[TPS] Dossier n°--numero_dossier--')
|
||||
end
|
||||
|
||||
subject { procedure.mail_received.object_for_dossier dossier }
|
||||
|
||||
it { expect(subject).to eq "[TPS] Dossier n°#{dossier.id}" }
|
||||
end
|
||||
|
||||
describe 'for tag --libelle_procedure--' do
|
||||
before do
|
||||
procedure.mail_received.update_column(:object, '[TPS] Dossier pour la procédure --libelle_procedure--')
|
||||
end
|
||||
|
||||
subject { procedure.mail_received.object_for_dossier dossier }
|
||||
|
||||
it { expect(subject).to eq "[TPS] Dossier pour la procédure #{procedure.libelle}" }
|
||||
end
|
||||
|
||||
describe 'for tag --lien_dossier--' do
|
||||
include Rails.application.routes.url_helpers
|
||||
include ActionView::Helpers::UrlHelper
|
||||
|
||||
before do
|
||||
procedure.mail_received.update_column(:body, 'Consultez votre dossier ici --lien_dossier--')
|
||||
end
|
||||
|
||||
subject { procedure.mail_received.body_for_dossier dossier }
|
||||
|
||||
it { is_expected.to eq "Consultez votre dossier ici #{link_to users_dossier_recapitulatif_url(dossier), users_dossier_recapitulatif_url(dossier), target: '_blank'}" }
|
||||
end
|
||||
|
||||
describe 'multiple tags' do
|
||||
before do
|
||||
procedure.mail_received.update_column(:object, '[TPS] Dossier n°--numero_dossier-- pour la procédure --libelle_procedure-- et encore le numéro : --numero_dossier--')
|
||||
end
|
||||
|
||||
subject { procedure.mail_received.object_for_dossier dossier }
|
||||
|
||||
it { expect(subject).to eq "[TPS] Dossier n°#{dossier.id} pour la procédure #{procedure.libelle} et encore le numéro : #{dossier.id}" }
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,57 +1,40 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Procedure do
|
||||
describe 'assocations' do
|
||||
it { is_expected.to have_many(:types_de_piece_justificative) }
|
||||
it { is_expected.to have_many(:types_de_champ) }
|
||||
it { is_expected.to have_many(:dossiers) }
|
||||
it { is_expected.to have_many(:mail_templates) }
|
||||
it { is_expected.to have_one(:module_api_carto) }
|
||||
it { is_expected.to belong_to(:administrateur) }
|
||||
it { is_expected.to have_many(:preference_list_dossiers) }
|
||||
|
||||
describe 'mails' do
|
||||
it { expect(subject.initiated_mail).to be_a(Mails::InitiatedMail) }
|
||||
it { expect(subject.received_mail).to be_a(Mails::ReceivedMail) }
|
||||
it { expect(subject.closed_mail).to be_a(Mails::ClosedMail) }
|
||||
it { expect(subject.refused_mail).to be_a(Mails::RefusedMail) }
|
||||
it { expect(subject.without_continuation_mail).to be_a(Mails::WithoutContinuationMail) }
|
||||
end
|
||||
|
||||
describe 'attributes' do
|
||||
it { is_expected.to have_db_column(:libelle) }
|
||||
it { is_expected.to have_db_column(:description) }
|
||||
it { is_expected.to have_db_column(:organisation) }
|
||||
it { is_expected.to have_db_column(:direction) }
|
||||
it { is_expected.to have_db_column(:euro_flag) }
|
||||
it { is_expected.to have_db_column(:logo) }
|
||||
it { is_expected.to have_db_column(:logo_secure_token) }
|
||||
it { is_expected.to have_db_column(:cerfa_flag) }
|
||||
it { is_expected.to have_db_column(:published) }
|
||||
describe 'initiated_mail' do
|
||||
subject { create(:procedure) }
|
||||
|
||||
describe 'mail_received' do
|
||||
let(:procedure) { create :procedure }
|
||||
|
||||
before do
|
||||
create :mail_received, procedure: procedure
|
||||
end
|
||||
|
||||
it { expect(procedure.mail_received).not_to be_nil }
|
||||
context 'when initiated_mail is not customize' do
|
||||
it { expect(subject.initiated_mail.body).to eq(Mails::InitiatedMail.default.body) }
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe '#build_default_mails' do
|
||||
subject { build :procedure, mail_templates: [] }
|
||||
|
||||
it 'call the fonction build_default_mails' do
|
||||
expect(subject).to receive(:build_default_mails)
|
||||
subject.save
|
||||
end
|
||||
|
||||
describe 'accessible values' do
|
||||
|
||||
before do
|
||||
context 'when initiated_mail is customize' do
|
||||
before :each do
|
||||
subject.initiated_mail = Mails::InitiatedMail.new(body: 'sisi')
|
||||
subject.save
|
||||
subject.reload
|
||||
end
|
||||
it { expect(subject.initiated_mail.body).to eq('sisi') }
|
||||
end
|
||||
|
||||
it { expect(subject.mail_templates.size).to eq 1 }
|
||||
context 'when initiated_mail is customize ... again' do
|
||||
before :each do
|
||||
subject.initiated_mail = Mails::InitiatedMail.new(body: 'toto')
|
||||
subject.save
|
||||
subject.reload
|
||||
end
|
||||
it { expect(subject.initiated_mail.body).to eq('toto') }
|
||||
|
||||
it { expect(subject.mail_received).not_to be_nil }
|
||||
it { expect(Mails::InitiatedMail.count).to eq(1) }
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -160,17 +143,14 @@ describe Procedure do
|
|||
describe 'clone' do
|
||||
let(:archived) { false }
|
||||
let(:published) { false }
|
||||
let(:procedure) { create(:procedure, archived: archived, published: published) }
|
||||
let(:procedure) { create(:procedure, archived: archived, published: published, received_mail: received_mail) }
|
||||
let!(:type_de_champ_0) { create(:type_de_champ_public, procedure: procedure, order_place: 0) }
|
||||
let!(:type_de_champ_1) { create(:type_de_champ_public, procedure: procedure, order_place: 1) }
|
||||
let!(:type_de_champ_private_0) { create(:type_de_champ_private, procedure: procedure, order_place: 0) }
|
||||
let!(:type_de_champ_private_1) { create(:type_de_champ_private, procedure: procedure, order_place: 1) }
|
||||
let!(:piece_justificative_0) { create(:type_de_piece_justificative, procedure: procedure, order_place: 0) }
|
||||
let!(:piece_justificative_1) { create(:type_de_piece_justificative, procedure: procedure, order_place: 1) }
|
||||
|
||||
before do
|
||||
procedure.mail_received.object = "Je vais être cloné"
|
||||
end
|
||||
let(:received_mail){ create(:received_mail) }
|
||||
|
||||
subject { procedure.clone }
|
||||
|
||||
|
@ -182,7 +162,6 @@ describe Procedure do
|
|||
expect(subject.types_de_piece_justificative.size).to eq procedure.types_de_piece_justificative.size
|
||||
expect(subject.types_de_champ.size).to eq procedure.types_de_champ.size
|
||||
expect(subject.types_de_champ_private.size).to eq procedure.types_de_champ_private.size
|
||||
expect(subject.mail_templates.size).to eq procedure.mail_templates.size
|
||||
|
||||
subject.types_de_champ.zip(procedure.types_de_champ).each do |stc, ptc|
|
||||
expect(stc).to have_same_attributes_as(ptc)
|
||||
|
@ -196,9 +175,22 @@ describe Procedure do
|
|||
expect(stc).to have_same_attributes_as(ptc)
|
||||
end
|
||||
|
||||
subject.mail_templates.zip(procedure.mail_templates).each do |stc, ptc|
|
||||
expect(stc).to have_same_attributes_as(ptc)
|
||||
end
|
||||
end
|
||||
|
||||
it 'should duplicate existing mail_templates' do
|
||||
expect(subject.received_mail.attributes.except("id", "procedure_id", "created_at", "updated_at")).to eq procedure.received_mail.attributes.except("id", "procedure_id", "created_at", "updated_at")
|
||||
expect(subject.received_mail.id).not_to eq procedure.received_mail.id
|
||||
expect(subject.received_mail.id).not_to be nil
|
||||
expect(subject.received_mail.procedure_id).not_to eq procedure.received_mail.procedure_id
|
||||
expect(subject.received_mail.procedure_id).not_to be nil
|
||||
expect(subject.received_mail.created_at).not_to eq procedure.received_mail.created_at
|
||||
expect(subject.received_mail.created_at).not_to be nil
|
||||
expect(subject.received_mail.updated_at).not_to eq procedure.received_mail.updated_at
|
||||
expect(subject.received_mail.updated_at).not_to be nil
|
||||
end
|
||||
|
||||
it 'should not duplicate default mail_template' do
|
||||
expect(subject.initiated_mail.attributes).to eq Mails::InitiatedMail.default.attributes
|
||||
end
|
||||
|
||||
it 'should not duplicate specific related objects' do
|
||||
|
|
Loading…
Reference in a new issue