Add admin support contact form

This commit is contained in:
Paul Chavard 2018-11-28 15:19:12 +01:00
parent 5053d4a7d9
commit b9af07b845
7 changed files with 155 additions and 4 deletions

View file

@ -5,6 +5,10 @@ class SupportController < ApplicationController
setup_context setup_context
end end
def admin
setup_context_admin
end
def create def create
if direct_message? && create_commentaire if direct_message? && create_commentaire
flash.notice = "Votre message a été envoyé sur la messagerie de votre dossier." flash.notice = "Votre message a été envoyé sur la messagerie de votre dossier."
@ -13,14 +17,23 @@ class SupportController < ApplicationController
elsif create_conversation elsif create_conversation
flash.notice = "Votre message a été envoyé." flash.notice = "Votre message a été envoyé."
redirect_to root_path(formulaire_contact_general_submitted: true) if params[:admin]
redirect_to root_path(formulaire_contact_admin_submitted: true)
else
redirect_to root_path(formulaire_contact_general_submitted: true)
end
else else
setup_context
flash.now.alert = "Une erreur est survenue. Vous pouvez nous contacter à #{helpers.mail_to(CONTACT_EMAIL)}." flash.now.alert = "Une erreur est survenue. Vous pouvez nous contacter à #{helpers.mail_to(CONTACT_EMAIL)}."
if params[:admin]
setup_context_admin
render :admin
else
setup_context
render :index render :index
end end
end end
end
private private
@ -30,10 +43,16 @@ class SupportController < ApplicationController
@options = Helpscout::FormAdapter::OPTIONS @options = Helpscout::FormAdapter::OPTIONS
end end
def setup_context_admin
@tags = tags
@options = Helpscout::FormAdapter::ADMIN_OPTIONS
end
def create_conversation def create_conversation
Helpscout::FormAdapter.new( Helpscout::FormAdapter.new(
subject: params[:subject], subject: params[:subject],
email: email, email: email,
phone: params[:phone],
text: params[:text], text: params[:text],
file: params[:file], file: params[:file],
dossier_id: dossier&.id, dossier_id: dossier&.id,

View file

@ -3,6 +3,8 @@ class Helpscout::API
CONVERSATIONS = 'conversations' CONVERSATIONS = 'conversations'
TAGS = 'tags' TAGS = 'tags'
FIELDS = 'fields' FIELDS = 'fields'
CUSTOMERS = 'customers'
PHONES = 'phones'
OAUTH2_TOKEN = 'oauth2/token' OAUTH2_TOKEN = 'oauth2/token'
def add_tags(conversation_id, tags) def add_tags(conversation_id, tags)
@ -42,6 +44,21 @@ class Helpscout::API
call_api(:post, CONVERSATIONS, body) call_api(:post, CONVERSATIONS, body)
end end
def add_phone_number(email, phone)
query = URI.encode("(email:#{email})")
response = call_api(:get, "#{CUSTOMERS}?mailbox=#{mailbox_id}&query=#{query}")
if response.success?
body = parse_response_body(response)
if body[:page][:totalElements] > 0
customer_id = body[:_embedded][:customers].first[:id]
call_api(:post, "#{CUSTOMERS}/#{customer_id}/#{PHONES}", {
type: "work",
value: phone
})
end
end
end
private private
def attachments(file) def attachments(file)

View file

@ -20,6 +20,18 @@ class Helpscout::FormAdapter
[I18n.t(TYPE_AUTRE, scope: [:support]), TYPE_AUTRE] [I18n.t(TYPE_AUTRE, scope: [:support]), TYPE_AUTRE]
] ]
ADMIN_TYPE_RDV = 'admin demande rdv'
ADMIN_TYPE_QUESTION = 'admin question'
ADMIN_TYPE_SOUCIS = 'admin soucis'
ADMIN_TYPE_AUTRE = 'admin autre'
ADMIN_OPTIONS = [
[I18n.t(ADMIN_TYPE_QUESTION, scope: [:supportadmin]), ADMIN_TYPE_QUESTION],
[I18n.t(ADMIN_TYPE_RDV, scope: [:supportadmin]), ADMIN_TYPE_RDV],
[I18n.t(ADMIN_TYPE_SOUCIS, scope: [:supportadmin]), ADMIN_TYPE_SOUCIS],
[I18n.t(ADMIN_TYPE_AUTRE, scope: [:supportadmin]), ADMIN_TYPE_AUTRE]
]
def send_form def send_form
conversation_id = create_conversation conversation_id = create_conversation
@ -51,6 +63,11 @@ class Helpscout::FormAdapter
params[:file] params[:file]
) )
response.success? ? response.headers['Resource-ID'] : nil if response.success?
if params[:phone].present?
@api.add_phone_number(params[:email], params[:phone])
end
response.headers['Resource-ID']
end
end end
end end

View file

@ -0,0 +1,51 @@
- content_for(:title, 'Contact')
#contact-form
.container
%h1.new-h1 Contactez notre équipe
.description
En tant qu'administration, vous pouvez nous contactez via ce formulaire. Nous vous répondrons dans les plus brefs délais, par email ou par téléphone.
%br
%br
%strong
Attention, ce formulaire est réservée uniquement aux organismes publics.
Il ne concerne ni les particuliers, ni les entreprises, ni les associations (sauf celles reconnues d'utilité publique). Si c'est votre cas, rendez-vous sur notre
= link_to contact_path do
formulaire de contact public
\.
= form_tag contact_path, method: :post, class: 'form' do |f|
- if !logged_in?
.contact-champ
= label_tag :email do
Adresse email professionnelle
%span.mandatory *
= text_field_tag :email, params[:email], required: true
.contact-champ
= label_tag :type do
Catégorie
%span.mandatory *
= select_tag :type, options_for_select(@options, params[:type])
.contact-champ
= label_tag :phone, 'Numéro de téléphone professionnel (ligne directe)'
= text_field_tag :phone
.contact-champ
= label_tag :subject do
Sujet
= text_field_tag :subject, params[:subject], required: false
.contact-champ
= label_tag :text do
Message
%span.mandatory *
= text_area_tag :text, params[:text], rows: 6, required: true
= hidden_field_tag :tags, @tags&.join(',')
= hidden_field_tag :admin, true
.send-wrapper
= button_tag 'Envoyer le message', type: :submit, class: 'button send primary'

View file

@ -61,6 +61,11 @@ fr:
produit: J'ai une idée d'amélioration pour votre site produit: J'ai une idée d'amélioration pour votre site
usager perdu: Je ne trouve pas la démarche que je veux faire usager perdu: Je ne trouve pas la démarche que je veux faire
autre: Autre sujet autre: Autre sujet
supportadmin:
admin demande rdv: Demande de RDV pour une présentation à distance de demarches-simplifiees.fr
admin question: J'ai une question sur demarches-simplifiees.fr
admin soucis: J'ai un problème technique avec demarches-simplifiees.fr
admin autre: Autre sujet
number: number:
currency: currency:

View file

@ -137,6 +137,8 @@ Rails.application.routes.draw do
get "contact", to: "support#index" get "contact", to: "support#index"
post "contact", to: "support#create" post "contact", to: "support#create"
get "contact-admin", to: "support#admin"
post "webhooks/helpscout", to: "webhook#helpscout" post "webhooks/helpscout", to: "webhook#helpscout"
match "webhooks/helpscout", to: lambda { |_| [204, {}, nil] }, via: :head match "webhooks/helpscout", to: lambda { |_| [204, {}, nil] }, via: :head

View file

@ -66,5 +66,45 @@ describe Helpscout::FormAdapter do
.with(conversation_id, nil, nil) .with(conversation_id, nil, nil)
end end
end end
context 'add_phone' do
before do
allow(api).to receive(:create_conversation)
.and_return(
double(
success?: true,
headers: {
'Resource-ID' => conversation_id
}
)
)
described_class.new(params, api).send_form
end
let(:params) {
{
email: email,
subject: subject,
text: text,
phone: '0666666666'
}
}
let(:phone) { '0666666666' }
let(:email) { 'paul.chavard@beta.gouv.fr' }
let(:subject) { 'Bonjour' }
let(:text) { "J'ai un problem" }
let(:tags) { ['info demarche'] }
let(:conversation_id) { '123' }
it 'should call method' do
expect(api).to have_received(:create_conversation)
.with(email, subject, text, nil)
expect(api).to have_received(:add_phone_number)
.with(email, phone)
expect(api).to have_received(:add_custom_fields)
.with(conversation_id, nil, nil)
end
end
end end
end end