class InstructeursImportService def self.import_groupes(procedure, groupes_emails) groupes_emails, error_groupe_emails = groupes_emails.partition { _1['groupe'].present? } groupes_emails = groupes_emails.map do { groupe: _1['groupe'].strip, email: _1['email'].present? ? EmailSanitizableConcern::EmailSanitizer.sanitize(_1['email']) : nil } end errors = error_groupe_emails.map { _1['email'] }.uniq target_labels = groupes_emails.map { _1[:groupe] }.uniq missing_labels = target_labels - procedure.groupe_instructeurs.pluck(:label) if missing_labels.present? created_at = Time.zone.now GroupeInstructeur.create!(missing_labels.map { |label| { procedure_id: procedure.id, label:, created_at:, updated_at: created_at } }) procedure.toggle_routing end emails_in_groupe = groupes_emails .group_by { _1[:groupe] } .transform_values { |groupes_emails| groupes_emails.map { _1[:email] }.uniq } emails_in_groupe.default = [] target_groupes = procedure .groupe_instructeurs .where(label: target_labels) .map { [_1, emails_in_groupe[_1.label]] } .to_h added_instructeurs_by_group = [] target_groupes.each do |groupe_instructeur, emails| added_instructeurs, invalid_emails = groupe_instructeur.add_instructeurs(emails:) added_instructeurs_by_group << [groupe_instructeur, added_instructeurs] errors << invalid_emails end [added_instructeurs_by_group, errors.flatten] end def self.import_instructeurs(procedure, emails) instructeurs_emails = emails .map { _1["email"] } .compact .map { EmailSanitizableConcern::EmailSanitizer.sanitize(_1) } groupe_instructeur = procedure.defaut_groupe_instructeur instructeurs, invalid_emails = groupe_instructeur.add_instructeurs(emails: instructeurs_emails) [instructeurs, invalid_emails] end end