From ec3d558af04950723c2d9872bb38ed3ed96f1d43 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Fri, 23 Mar 2018 17:21:51 +0100 Subject: [PATCH 1/4] Pipedrive: extract methods in service --- .../manager/demandes_controller.rb | 39 +------------------ app/services/pipedrive_service.rb | 38 ++++++++++++++++++ config/initializers/urls.rb | 3 ++ 3 files changed, 43 insertions(+), 37 deletions(-) create mode 100644 app/services/pipedrive_service.rb diff --git a/app/controllers/manager/demandes_controller.rb b/app/controllers/manager/demandes_controller.rb index 513bbcf38..a35930212 100644 --- a/app/controllers/manager/demandes_controller.rb +++ b/app/controllers/manager/demandes_controller.rb @@ -1,10 +1,5 @@ module Manager class DemandesController < Manager::ApplicationController - PIPEDRIVE_PEOPLE_URL = 'https://api.pipedrive.com/v1/persons' - PIPEDRIVE_POSTE_ATTRIBUTE_ID = '33a790746f1713d712fe97bcce9ac1ca6374a4d6' - PIPEDRIVE_DEV_ID = '2748449' - PIPEDRIVE_CAMILLE_ID = '3189424' - def index @pending_demandes = pending_demandes end @@ -13,7 +8,7 @@ module Manager administrateur = current_administration.invite_admin(create_administrateur_params[:email]) if administrateur.errors.empty? - change_person_owner(create_administrateur_params[:person_id], PIPEDRIVE_CAMILLE_ID) + PipedriveService.update_person_owner(create_administrateur_params[:person_id], PipedriveService::PIPEDRIVE_CAMILLE_ID) flash.notice = "Administrateur créé" redirect_to manager_demandes_path else @@ -25,14 +20,6 @@ module Manager private - def change_person_owner(person_id, owner_id) - url = PIPEDRIVE_PEOPLE_URL + "/#{person_id}?api_token=#{PIPEDRIVE_TOKEN}" - - params = { 'owner_id': owner_id } - - RestClient.put(url, params.to_json, { content_type: :json }) - end - def create_administrateur_params params.require(:administrateur).permit(:email, :person_id) end @@ -46,29 +33,7 @@ module Manager end def demandes - @demandes ||= fetch_demandes - end - - def fetch_demandes - params = { - start: 0, - limit: 500, - user_id: PIPEDRIVE_DEV_ID, - api_token: PIPEDRIVE_TOKEN - } - - response = RestClient.get(PIPEDRIVE_PEOPLE_URL, { params: params }) - json = JSON.parse(response.body) - - json['data'].map do |datum| - { - person_id: datum['id'], - nom: datum['name'], - poste: datum[PIPEDRIVE_POSTE_ATTRIBUTE_ID], - email: datum.dig('email', 0, 'value'), - organisation: datum['org_name'] - } - end + @demandes ||= PipedriveService.fetch_people_demandes end end end diff --git a/app/services/pipedrive_service.rb b/app/services/pipedrive_service.rb new file mode 100644 index 000000000..b284db8c0 --- /dev/null +++ b/app/services/pipedrive_service.rb @@ -0,0 +1,38 @@ +class PipedriveService + PIPEDRIVE_POSTE_ATTRIBUTE_ID = '33a790746f1713d712fe97bcce9ac1ca6374a4d6' + + PIPEDRIVE_DEV_ID = '2748449' + PIPEDRIVE_CAMILLE_ID = '3189424' + + class << self + def update_person_owner(person_id, owner_id) + url = PIPEDRIVE_PEOPLE_URL + "/#{person_id}?api_token=#{PIPEDRIVE_TOKEN}" + + params = { owner_id: owner_id } + + RestClient.put(url, params.to_json, { content_type: :json }) + end + + def fetch_people_demandes + params = { + start: 0, + limit: 500, + user_id: PIPEDRIVE_DEV_ID, + api_token: PIPEDRIVE_TOKEN + } + + response = RestClient.get(PIPEDRIVE_PEOPLE_URL, { params: params }) + json = JSON.parse(response.body) + + json['data'].map do |datum| + { + person_id: datum['id'], + nom: datum['name'], + poste: datum[PIPEDRIVE_POSTE_ATTRIBUTE_ID], + email: datum.dig('email', 0, 'value'), + organisation: datum['org_name'] + } + end + end + end +end diff --git a/config/initializers/urls.rb b/config/initializers/urls.rb index 3a82c6557..8c2306361 100644 --- a/config/initializers/urls.rb +++ b/config/initializers/urls.rb @@ -3,3 +3,6 @@ if Rails.env.production? else API_ENTREPRISE_URL = 'https://staging.entreprise.api.gouv.fr/v2' end + +PIPEDRIVE_API_URL = 'https://api.pipedrive.com/v1/' +PIPEDRIVE_PEOPLE_URL = URI.join(PIPEDRIVE_API_URL, 'persons').to_s From 31adc8e990bf6ed22b9175b48ea8ecda658b0e27 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Tue, 27 Mar 2018 10:41:20 +0200 Subject: [PATCH 2/4] Pipedrive: Rename pipedrive_dev_id --- app/services/pipedrive_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/services/pipedrive_service.rb b/app/services/pipedrive_service.rb index b284db8c0..039ee93c8 100644 --- a/app/services/pipedrive_service.rb +++ b/app/services/pipedrive_service.rb @@ -1,7 +1,7 @@ class PipedriveService PIPEDRIVE_POSTE_ATTRIBUTE_ID = '33a790746f1713d712fe97bcce9ac1ca6374a4d6' - PIPEDRIVE_DEV_ID = '2748449' + PIPEDRIVE_ROBOT_ID = '2748449' PIPEDRIVE_CAMILLE_ID = '3189424' class << self @@ -17,7 +17,7 @@ class PipedriveService params = { start: 0, limit: 500, - user_id: PIPEDRIVE_DEV_ID, + user_id: PIPEDRIVE_ROBOT_ID, api_token: PIPEDRIVE_TOKEN } From 6a74aaa42af83a92c1ab9b1322bf8728d5671daf Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Fri, 23 Mar 2018 17:25:58 +0100 Subject: [PATCH 3/4] [fix #1697] Pipedrive: use a job to process an admin creation --- .../manager/demandes_controller.rb | 7 ++- app/jobs/pipedrive_accepts_deals_job.rb | 5 ++ app/services/pipedrive_service.rb | 48 ++++++++++++++++--- config/initializers/urls.rb | 1 + 4 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 app/jobs/pipedrive_accepts_deals_job.rb diff --git a/app/controllers/manager/demandes_controller.rb b/app/controllers/manager/demandes_controller.rb index a35930212..acfbb489c 100644 --- a/app/controllers/manager/demandes_controller.rb +++ b/app/controllers/manager/demandes_controller.rb @@ -8,7 +8,12 @@ module Manager administrateur = current_administration.invite_admin(create_administrateur_params[:email]) if administrateur.errors.empty? - PipedriveService.update_person_owner(create_administrateur_params[:person_id], PipedriveService::PIPEDRIVE_CAMILLE_ID) + PipedriveAcceptsDealsJob.perform_later( + create_administrateur_params[:person_id], + PipedriveService::PIPEDRIVE_CAMILLE_ID, + PipedriveService::PIPEDRIVE_ADMIN_CENTRAL_STOCK_STAGE_ID + ) + flash.notice = "Administrateur créé" redirect_to manager_demandes_path else diff --git a/app/jobs/pipedrive_accepts_deals_job.rb b/app/jobs/pipedrive_accepts_deals_job.rb new file mode 100644 index 000000000..4df5a0406 --- /dev/null +++ b/app/jobs/pipedrive_accepts_deals_job.rb @@ -0,0 +1,5 @@ +class PipedriveAcceptsDealsJob < ApplicationJob + def perform(person_id, owner_id, stage_id) + PipedriveService.accept_deals_from_person(person_id, owner_id, stage_id) + end +end diff --git a/app/services/pipedrive_service.rb b/app/services/pipedrive_service.rb index 039ee93c8..c0c698091 100644 --- a/app/services/pipedrive_service.rb +++ b/app/services/pipedrive_service.rb @@ -4,13 +4,15 @@ class PipedriveService PIPEDRIVE_ROBOT_ID = '2748449' PIPEDRIVE_CAMILLE_ID = '3189424' + PIPEDRIVE_ALL_NOT_DELETED_DEALS = 'all_not_deleted' + + PIPEDRIVE_ADMIN_CENTRAL_STOCK_STAGE_ID = 35 + class << self - def update_person_owner(person_id, owner_id) - url = PIPEDRIVE_PEOPLE_URL + "/#{person_id}?api_token=#{PIPEDRIVE_TOKEN}" - - params = { owner_id: owner_id } - - RestClient.put(url, params.to_json, { content_type: :json }) + def accept_deals_from_person(person_id, owner_id, stage_id) + waiting_deal_ids = fetch_waiting_deal_ids(person_id) + waiting_deal_ids.each { |deal_id| update_deal_owner_and_stage(deal_id, owner_id, stage_id) } + update_person_owner(person_id, owner_id) end def fetch_people_demandes @@ -34,5 +36,39 @@ class PipedriveService } end end + + private + + def fetch_waiting_deal_ids(person_id) + url = [PIPEDRIVE_PEOPLE_URL, person_id, "deals"].join('/') + + params = { + start: 0, + limit: 500, + status: PIPEDRIVE_ALL_NOT_DELETED_DEALS, + api_token: PIPEDRIVE_TOKEN + } + + response = RestClient.get(url, params: params) + json = JSON.parse(response.body) + + json['data'].map { |datum| datum['id'] } + end + + def update_deal_owner_and_stage(deal_id, owner_id, stage_id) + url = PIPEDRIVE_DEALS_URL + "/#{deal_id}?api_token=#{PIPEDRIVE_TOKEN}" + + params = { user_id: owner_id, stage_id: stage_id } + + RestClient.put(url, params.to_json, { content_type: :json }) + end + + def update_person_owner(person_id, owner_id) + url = PIPEDRIVE_PEOPLE_URL + "/#{person_id}?api_token=#{PIPEDRIVE_TOKEN}" + + params = { owner_id: owner_id } + + RestClient.put(url, params.to_json, { content_type: :json }) + end end end diff --git a/config/initializers/urls.rb b/config/initializers/urls.rb index 8c2306361..17bccab1a 100644 --- a/config/initializers/urls.rb +++ b/config/initializers/urls.rb @@ -6,3 +6,4 @@ end PIPEDRIVE_API_URL = 'https://api.pipedrive.com/v1/' PIPEDRIVE_PEOPLE_URL = URI.join(PIPEDRIVE_API_URL, 'persons').to_s +PIPEDRIVE_DEALS_URL = URI.join(PIPEDRIVE_API_URL, 'deals').to_s From 2102130fa3738d58782b4f5b5770d21eb9892f98 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Fri, 23 Mar 2018 17:31:03 +0100 Subject: [PATCH 4/4] Pipedrive: allow super admin to choose target pipeline --- .../manager/demandes_controller.rb | 4 ++-- app/services/pipedrive_service.rb | 5 +++++ app/views/manager/demandes/index.html.erb | 22 +++++++++++++++---- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/app/controllers/manager/demandes_controller.rb b/app/controllers/manager/demandes_controller.rb index acfbb489c..1e1fb4c95 100644 --- a/app/controllers/manager/demandes_controller.rb +++ b/app/controllers/manager/demandes_controller.rb @@ -11,7 +11,7 @@ module Manager PipedriveAcceptsDealsJob.perform_later( create_administrateur_params[:person_id], PipedriveService::PIPEDRIVE_CAMILLE_ID, - PipedriveService::PIPEDRIVE_ADMIN_CENTRAL_STOCK_STAGE_ID + create_administrateur_params[:stage_id] ) flash.notice = "Administrateur créé" @@ -26,7 +26,7 @@ module Manager private def create_administrateur_params - params.require(:administrateur).permit(:email, :person_id) + params.permit(:email, :person_id, :stage_id) end def pending_demandes diff --git a/app/services/pipedrive_service.rb b/app/services/pipedrive_service.rb index c0c698091..917bcf8a7 100644 --- a/app/services/pipedrive_service.rb +++ b/app/services/pipedrive_service.rb @@ -7,6 +7,11 @@ class PipedriveService PIPEDRIVE_ALL_NOT_DELETED_DEALS = 'all_not_deleted' PIPEDRIVE_ADMIN_CENTRAL_STOCK_STAGE_ID = 35 + PIPEDRIVE_REGIONS_STOCK_STAGE_ID = 24 + PIPEDRIVE_PREFECTURES_STOCK_STAGE_ID = 20 + PIPEDRIVE_DEPARTEMENTS_STOCK_STAGE_ID = 30 + PIPEDRIVE_COMMUNES_STOCK_STAGE_ID = 40 + PIPEDRIVE_ORGANISMES_STOCK_STAGE_ID = 1 class << self def accept_deals_from_person(person_id, owner_id, stage_id) diff --git a/app/views/manager/demandes/index.html.erb b/app/views/manager/demandes/index.html.erb index 526619635..de2fce227 100644 --- a/app/views/manager/demandes/index.html.erb +++ b/app/views/manager/demandes/index.html.erb @@ -29,10 +29,24 @@ <%= demande[key] %> <% end %> - - <%= button_to('Créer', - manager_demandes_create_administrateur_path, - params: { administrateur: { email: demande[:email], person_id: demande[:person_id] } }) %> + + <%= form_tag(manager_demandes_create_administrateur_path) do -%> + <%= select_tag "stage_id", + options_for_select({ + "administration centrale" => PipedriveService::PIPEDRIVE_ADMIN_CENTRAL_STOCK_STAGE_ID, + "région" => PipedriveService::PIPEDRIVE_REGIONS_STOCK_STAGE_ID, + "préfecture" => PipedriveService::PIPEDRIVE_PREFECTURES_STOCK_STAGE_ID, + "département" =>PipedriveService::PIPEDRIVE_DEPARTEMENTS_STOCK_STAGE_ID, + "commune" => PipedriveService::PIPEDRIVE_COMMUNES_STOCK_STAGE_ID, + "organisme" => PipedriveService::PIPEDRIVE_ORGANISMES_STOCK_STAGE_ID + }), + style: 'margin-bottom: 20px; width: inherit;' %> + + <%= hidden_field_tag 'email', demande[:email] %> + <%= hidden_field_tag 'person_id', demande[:person_id] %> + + <%= submit_tag 'Créer' %> + <% end -%> <% end %>