Commit 7e61746c authored by Théo GUILLON's avatar Théo GUILLON
Browse files

Modification : utilisation des meme règles de nommage pour le soustraitant basé sur le responsable

Factorisation : des champs entre le responsable et le soustraitant
parent d7797653
......@@ -424,10 +424,6 @@ UPDATE etats SET libelle = 'Traitement initialisé, recu pour rédaction' WHERE
INSERT INTO etats (libelle, value, created, modified) VALUES
('Rédaction du traitement initialisé par le DPO', 13, NOW(), NOW());
CREATE UNIQUE INDEX responsables_raisonsocialestructure_idx ON responsables (raisonsocialestructure);
CREATE UNIQUE INDEX responsables_raisonsocialestructure_siretstructure_idx ON responsables (raisonsocialestructure, siretstructure);
CREATE UNIQUE INDEX responsables_emailstructure_idx ON responsables (emailstructure);
CREATE UNIQUE INDEX responsables_emailresponsable_idx ON responsables (emailresponsable);
ALTER TABLE responsables
ADD COLUMN civiliteresponsable VARCHAR(4),
ADD COLUMN civility_dpo VARCHAR(4),
......@@ -438,7 +434,9 @@ ALTER TABLE responsables
ADD COLUMN telephonefixe_dpo VARCHAR(15),
ADD COLUMN telephoneportable_dpo VARCHAR(15)
;
CREATE UNIQUE INDEX responsables_email_dpo_idx ON responsables (email_dpo);
CREATE UNIQUE INDEX responsables_raisonsocialestructure_idx ON responsables (raisonsocialestructure);
CREATE UNIQUE INDEX responsables_raisonsocialestructure_siretstructure_idx ON responsables (raisonsocialestructure, siretstructure);
CREATE UNIQUE INDEX responsables_emailstructure_idx ON responsables (emailstructure);
CREATE UNIQUE INDEX responsables_numerocnil_dpo_idx ON responsables (numerocnil_dpo);
ALTER TABLE responsables ADD CONSTRAINT responsables_civiliteresponsable_in_list_chk CHECK (cakephp_validate_in_list(civiliteresponsable, ARRAY['M.', 'Mme.']));
......@@ -479,4 +477,55 @@ INSERT INTO liste_droits (libelle, value, created, modified) VALUES
ALTER TABLE connecteur_ldaps ALTER COLUMN login TYPE VARCHAR(100);
ALTER TABLE soustraitants
ADD COLUMN civiliteresponsable VARCHAR(4),
ADD COLUMN prenomresponsable VARCHAR(50),
ADD COLUMN nomresponsable VARCHAR(50),
ADD COLUMN emailresponsable VARCHAR(75),
ADD COLUMN telephoneresponsable VARCHAR(15),
ADD COLUMN fonctionresponsable VARCHAR(75),
ADD COLUMN civility_dpo VARCHAR(4),
ADD COLUMN prenom_dpo VARCHAR(50),
ADD COLUMN nom_dpo VARCHAR(50),
ADD COLUMN numerocnil_dpo VARCHAR(50),
ADD COLUMN email_dpo VARCHAR(75),
ADD COLUMN telephonefixe_dpo VARCHAR(15),
ADD COLUMN telephoneportable_dpo VARCHAR(15)
;
ALTER TABLE soustraitants RENAME COLUMN raisonsociale TO raisonsocialestructure;
ALTER TABLE soustraitants RENAME COLUMN siret TO siretstructure;
ALTER TABLE soustraitants RENAME COLUMN ape TO apestructure;
ALTER TABLE soustraitants RENAME COLUMN telephone TO telephonestructure;
ALTER TABLE soustraitants RENAME COLUMN fax TO faxstructure;
ALTER TABLE soustraitants RENAME COLUMN adresse TO adressestructure;
ALTER TABLE soustraitants RENAME COLUMN email TO emailstructure;
CREATE UNIQUE INDEX soustraitants_raisonsocialestructure_idx ON soustraitants (raisonsocialestructure);
CREATE UNIQUE INDEX soustraitants_raisonsocialestructure_siretstructure_idx ON soustraitants (raisonsocialestructure, siretstructure);
CREATE UNIQUE INDEX soustraitants_emailstructure_idx ON soustraitants (emailstructure);
CREATE UNIQUE INDEX soustraitants_numerocnil_dpo_idx ON soustraitants (numerocnil_dpo);
ALTER TABLE soustraitants ALTER COLUMN apestructure DROP NOT NULL;
ALTER TABLE soustraitants ADD CONSTRAINT soustraitants_civiliteresponsable_in_list_chk CHECK (cakephp_validate_in_list(civiliteresponsable, ARRAY['M.', 'Mme.']));
ALTER TABLE soustraitants ADD CONSTRAINT soustraitants_civility_dpo_in_list_chk CHECK (cakephp_validate_in_list(civility_dpo, ARRAY['M.', 'Mme.']));
ALTER TABLE soustraitants ADD CONSTRAINT soustraitants_emailresponsable_email_chk CHECK (cakephp_validate_email(emailresponsable));
ALTER TABLE soustraitants ADD CONSTRAINT soustraitants_email_dpo_email_chk CHECK (cakephp_validate_email(email_dpo));
ALTER TABLE soustraitants ADD CONSTRAINT soustraitants_telephoneresponsable_phone_chk CHECK ( cakephp_validate_phone( telephoneresponsable, NULL, 'fr' ) );
ALTER TABLE soustraitants ADD CONSTRAINT soustraitants_telephonefixe_dpo_phone_chk CHECK ( cakephp_validate_phone( telephonefixe_dpo, NULL, 'fr' ) );
ALTER TABLE soustraitants ADD CONSTRAINT soustraitants_telephoneportable_dpo_phone_chk CHECK ( cakephp_validate_phone( telephoneportable_dpo, NULL, 'fr' ) );
ALTER TABLE soustraitances
DROP COLUMN raisonsociale,
DROP COLUMN siret,
DROP COLUMN ape,
DROP COLUMN telephone,
DROP COLUMN fax,
DROP COLUMN adresse,
DROP COLUMN email
;
ALTER TABLE soustraitances ADD FOREIGN KEY (soustraitant_id) REFERENCES soustraitants(id) ON DELETE CASCADE ON UPDATE CASCADE;
CREATE UNIQUE INDEX soustraitances_fiche_id_soustraitant_id_idx ON soustraitances (fiche_id, soustraitant_id);
COMMIT;
......@@ -591,7 +591,7 @@ class FichesController extends AppController
$query = [
'conditions' => $condition,
'order' => [
'Soustraitant.raisonsociale ASC'
'Soustraitant.raisonsocialestructure ASC'
]
];
......
......@@ -365,6 +365,7 @@ class ResponsablesController extends AppController {
$mesOrganisations = $this->WebcilUsers->mesOrganisations('list');
$this->set(compact('mesOrganisations'));
$this->set('cannotModified', false);
$this->view = 'edit';
}
......
......@@ -26,6 +26,7 @@ class SoustraitantsController extends AppController {
public $uses = [
'Soustraitant',
'Soustraitance',
];
/**
......@@ -55,7 +56,7 @@ class SoustraitantsController extends AppController {
],
'conditions' => [],
'order' => [
'Soustraitant.raisonsociale ASC'
'Soustraitant.raisonsocialestructure ASC'
]
];
......@@ -75,7 +76,7 @@ class SoustraitantsController extends AppController {
$filters = [
// Filtrer par raison sociale (du sous-traitant)
'Filtre.raisonsociale' => 'Soustraitant.raisonsociale',
'Filtre.raisonsociale' => 'Soustraitant.raisonsocialestructure',
// Filtrer par numéro SIRET (du sous-traitant)
'Filtre.siret' => 'Soustraitant.siret',
// Filtrer par code APE (du sous-traitant)
......@@ -171,10 +172,10 @@ class SoustraitantsController extends AppController {
*/
protected function _optionsFiltre($organisation_id = null) {
$options = [
'ape' => $this->Soustraitant->getStringOptionList('ape', $organisation_id),
'apestructure' => $this->Soustraitant->getStringOptionList('apestructure', $organisation_id),
'organisations' => $this->Soustraitant->Organisation->find('list', ['order' => ['Organisation.raisonsociale ASC']]),
'raisonsociale' => $this->Soustraitant->getStringOptionList('raisonsociale', $organisation_id),
'siret' => $this->Soustraitant->getStringOptionList('siret', $organisation_id),
'raisonsocialestructure' => $this->Soustraitant->getStringOptionList('raisonsocialestructure', $organisation_id),
'siretstructure' => $this->Soustraitant->getStringOptionList('siretstructure', $organisation_id),
];
return $options;
......@@ -225,6 +226,8 @@ class SoustraitantsController extends AppController {
$this->set('title', __d('soustraitant', 'soustraitant.titreModificationSoustraitant'));
}
$cannotModified = false;
if ($this->request->is('post') || $this->request->is('put')) {
if ('Cancel' === Hash::get($this->request->data, 'submit')) {
$this->redirect($this->Referers->get());
......@@ -251,10 +254,20 @@ class SoustraitantsController extends AppController {
$this->request->data['Organisation']['Organisation'] = $this->Droits->isSu() ? null : $this->Session->read('Organisation.id');
} else {
$this->request->data = $soustraitant;
$soustraitantUseInFiche = $this->Soustraitance->find('all', [
'conditions' => [
'soustraitant_id' => $id
]
]);
if (!empty($soustraitantUseInFiche)) {
$cannotModified = true;
}
}
$mesOrganisations = $this->WebcilUsers->mesOrganisations('list');
$this->set(compact('mesOrganisations'));
$this->set(compact('mesOrganisations', 'cannotModified'));
$this->view = 'edit';
}
......@@ -301,6 +314,7 @@ class SoustraitantsController extends AppController {
$mesOrganisations = $this->WebcilUsers->mesOrganisations('list');
$this->set(compact('mesOrganisations'));
$this->set('cannotModified', false);
$this->view = 'edit';
}
......
......@@ -121,9 +121,6 @@ msgstr " Ajouter un responsable"
msgid "responsable.popupTitreAffecterResponsable"
msgstr "Associer un ou plusieurs responsable(s) à une ou plusieurs entité(s)"
msgid "responsable.champSelectOrganisation"
msgstr "Associer à une ou plusieurs entité(s)"
msgid "responsable.btnAffecterEntite"
msgstr "Associer un responsable"
......@@ -179,121 +176,28 @@ msgstr "Il n'existe aucun responsable dans votre entité pour ces filtres"
########################## View/Responsables/add.ctp ##########################
msgid "responsable.titreResponsable"
msgstr "Le responsable :"
msgid "responsable.titreCoresponsable"
msgstr "Le co-responsable :"
msgid "responsable.champCiviliteresponsable"
msgstr "Civilité du responsable"
msgid "responsable.champNomresponsable"
msgstr "Nom du responsable"
msgid "responsable.placeholderChampNomresponsable"
msgstr "Nom de famille du responsable de la structure"
msgid "responsable.champPrenomresponsable"
msgstr "Prénom du responsable"
msgid "responsable.placeholderChampPrenomresponsable"
msgstr "Prénom du responsable de la structure"
msgid "responsable.champFonctionresponsable"
msgstr "Fonction du responsable "
msgid "responsable.placeholderChampFonctionresponsable"
msgstr "Fonction du responsable de la structure (PDG, Maire, ...)"
msgid "responsable.champEmailresponsable"
msgstr "E-mail du responsable"
msgid "responsable.placeholderChampEmailresponsable"
msgstr "E-mail du responsable de la structure"
msgid "responsable.champTelephoneresponsable"
msgstr "Téléphone du responsable"
msgid "responsable.placeholderChampTelephoneresponsable"
msgstr "Téléphone du responsable (requis)"
msgid "responsable.titreStructureResponsable"
msgstr "La structure du responsable"
msgid "responsable.titreStructureCoresponsable"
msgstr "La structure du co-responsable"
msgid "responsable.champRaisonsocialestructure"
msgstr "Raison sociale"
msgid "responsable.titreTableauEntiteResponsable"
msgstr "Entité(s) associée(s)"
msgid "responsable.placeholderChampRaisonsocialestructure"
msgstr "Raison sociale (requis)"
msgid "responsable.champSiretstructure"
msgstr "N° Siret"
msgid "responsable.placeholderChampSiretstructure"
msgstr "N° Siret (requis)"
msgid "responsable.champApestructure"
msgstr "Code APE"
msgid "responsable.placeholderChampApestructure"
msgstr "Code APE (facultatif)"
msgid "responsable.placeholderSelectOrganisation"
msgstr "Sélectionnez une ou plusieurs entité(s)"
msgid "responsable.champTelephonestructure"
msgstr "Téléphone"
msgid "responsable.placeholderChampTelephonestructure"
msgstr "Numéro de téléphone du responsable (facultatif)"
msgid "responsable.champFaxstructure"
msgstr "Fax"
msgid "responsable.placeholderChampFaxstructure"
msgstr "Numéro de fax du responsable (facultatif)"
msgid "responsable.champAdressestructure"
msgstr "Adresse"
msgid "responsable.placeholderChampAdressestructure"
msgstr "Adresse de la structure (facultatif)"
msgid "responsable.champEmailstructure"
msgstr "E-mail"
msgid "responsable.placeholderChampEmailstructure"
msgstr "E-mail de la structure (facultatif)"
msgid "responsable.titreAssociationEntiteResponsable"
msgstr "Association du responsable à une entité"
msgid "responsable.champCivilityDpo"
msgstr "Civilité du DPO"
msgid "responsable.champPrenomDpo"
msgstr "Prénom du DPO"
msgid "responsable.champNomDpo"
msgstr "Nom du DPO"
msgid "responsable.champNumerocnilDpo"
msgstr "Numéro d'enregistrement CNIL du DPO"
msgid "responsable.champEmailDpo"
msgstr "E-mail du DPO"
msgid "responsable.champTelephonefixeDpo"
msgstr "Téléphone fixe du DPO"
msgid "responsable.champTelephoneportableDpo"
msgstr "Téléphone portable du DPO"
###############################################################################
msgid ""
msgstr ""
"Project-Id-Version: web-DPO 1.2\n"
"PO-Revision-Date: 2020-04-03 12:00+0100\n"
"Last-Translator: Théo GUILLON <theo.guillon@libriciel.coop>\n"
"Language-Team: Théo GUILLON <theo.guillon@libriciel.coop>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n>1);\n"
# ======================================================================================================================
msgid "responsable_soustraitant.titreStructureResponsable"
msgstr "La structure du responsable"
msgid "responsable_soustraitant.champRaisonsocialestructure"
msgstr "Raison sociale"
msgid "responsable_soustraitant.placeholderChampRaisonsocialestructure"
msgstr "Raison sociale (requis)"
msgid "responsable_soustraitant.champTelephonestructure"
msgstr "Téléphone"
msgid "responsable_soustraitant.champFaxstructure"
msgstr "Fax"
msgid "responsable_soustraitant.champAdressestructure"
msgstr "Adresse"
msgid "responsable_soustraitant.placeholderChampAdressestructure"
msgstr "Adresse de la structure (facultatif)"
msgid "responsable_soustraitant.champEmailstructure"
msgstr "E-mail"
msgid "responsable_soustraitant.placeholderChampEmailstructure"
msgstr "E-mail de la structure (facultatif)"
msgid "responsable_soustraitant.champSiretstructure"
msgstr "N° Siret"
msgid "responsable_soustraitant.champApestructure"
msgstr "Code APE"
msgid "responsable_soustraitant.placeholderChampApestructure"
msgstr "Code APE (facultatif)"
msgid "responsable_soustraitant.titreResponsable"
msgstr "Le responsable :"
msgid "responsable_soustraitant.champCiviliteresponsable"
msgstr "Civilité du responsable"
msgid "responsable_soustraitant.champPrenomresponsable"
msgstr "Prénom du responsable"
msgid "responsable_soustraitant.placeholderChampPrenomresponsable"
msgstr "Prénom du responsable de la structure"
msgid "responsable_soustraitant.champNomresponsable"
msgstr "Nom du responsable"
msgid "responsable_soustraitant.placeholderChampNomresponsable"
msgstr "Nom de famille du responsable de la structure"
msgid "responsable_soustraitant.champFonctionresponsable"
msgstr "Fonction du responsable "
msgid "responsable_soustraitant.placeholderChampFonctionresponsable"
msgstr "Fonction du responsable de la structure (PDG, Maire, ...)"
msgid "responsable_soustraitant.champEmailresponsable"
msgstr "E-mail du responsable"
msgid "responsable_soustraitant.placeholderChampEmailresponsable"
msgstr "E-mail du responsable de la structure"
msgid "responsable_soustraitant.champTelephoneresponsable"
msgstr "Téléphone du responsable"
msgid "responsable_soustraitant.champCivilityDpo"
msgstr "Civilité du DPO"
msgid "responsable_soustraitant.champPrenomDpo"
msgstr "Prénom du DPO"
msgid "responsable_soustraitant.placeholderChampPrenomDpo"
msgstr "Prénom du DPO de la structure"
msgid "responsable_soustraitant.champNomDpo"
msgstr "Nom du DPO"
msgid "responsable_soustraitant.placeholderChampNomDpo"
msgstr "Nom de famille du DPO de la structure"
msgid "responsable_soustraitant.champNumerocnilDpo"
msgstr "Numéro d'enregistrement CNIL du DPO"
msgid "responsable_soustraitant.placeholderNumerocnilDpo"
msgstr "Numéro CNIL : DPO-xxxxxx"
msgid "responsable_soustraitant.champEmailDpo"
msgstr "E-mail du DPO"
msgid "responsable_soustraitant.placeholderChampEmailDpo"
msgstr "E-mail du DPO de la structure"
msgid "responsable_soustraitant.champTelephonefixeDpo"
msgstr "Téléphone fixe du DPO"
msgid "responsable_soustraitant.champTelephoneportableDpo"
msgstr "Téléphone portable du DPO"
msgid "responsable_soustraitant.champSelectOrganisation"
msgstr "Associer à une ou plusieurs entité(s)"
msgid "responsable_soustraitant.placeholderSelectOrganisation"
msgstr "Sélectionnez une ou plusieurs entité(s)"
......@@ -118,9 +118,6 @@ msgstr " Ajouter un sous-traitant"
msgid "soustraitant.popupTitreAffecterSousTraitant"
msgstr "Associer un ou plusieurs sous-traitant(s) à une ou plusieurs entité(s)"
msgid "soustraitant.champSelectOrganisation"
msgstr "Associer à une ou plusieurs entité(s)"
msgid "soustraitant.btnAffecterEntite"
msgstr "Associer un sous-traitant"
......@@ -192,9 +189,6 @@ msgstr "Code APE"
msgid "soustraitant.placeholderChampApe"
msgstr "Code APE (requis)"
msgid "soustraitant.placeholderSelectOrganisation"
msgstr "Sélectionnez une ou plusieurs entité(s)"
msgid "soustraitant.champTelephone"
msgstr "Téléphone"
......@@ -219,4 +213,7 @@ msgstr "E-mail"
msgid "soustraitant.placeholderChampEmail"
msgstr "E-mail du sous-traitant (facultatif)"
msgid "soustraitant.titreAssociationEntiteSoustraitant"
msgstr "Association du sous-traitant à une entité "
###############################################################################
......@@ -443,6 +443,20 @@ class Fiche extends AppModel implements LinkedOrganisationInterface {
'finderQuery' => '',
'with' => 'Coresponsable'
],
'Soustraitant' => [
'className' => 'Soustraitant',
'joinTable' => 'soustraitances',
'foreignKey' => 'fiche_id',
'associationForeignKey' => 'soustraitant_id',
'unique' => true,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
'with' => 'Soustraitance'
],
];
/**
......
......@@ -103,6 +103,10 @@ class Soustraitance extends AppModel {
'Fiche' => [
'className' => 'Fiche',
'foreignKey' => 'fiche_id'
]
],
'Soustraitant' => [
'className' => 'Soustraitant',
'foreignKey' => 'soustraitant_id'
],
];
}
......@@ -41,10 +41,14 @@ class Soustraitant extends AppModel implements LinkedOrganisationInterface {
'integer'
],
'formatSuffix' => '/_id$/',
'formatStripNotAlnum' => '/^(telephone|fax|siret)$/'
'formatStripNotAlnum' => '/^(telephoneresponsable|telephonestructure|faxstructure|siretstructure|telephonefixe_dpo|telephoneportable_dpo)$/'
]
],
'FieldAsFilterOption',
'LettercaseFormattable' => [
'upper_noaccents' => ['nomresponsable', 'nom_dpo'],
'title' => ['prenomresponsable', 'prenom_dpo']
]
];
/**
......@@ -57,7 +61,7 @@ class Soustraitant extends AppModel implements LinkedOrganisationInterface {
* @version v1.0.0
*/
public $validate = [
'siret' => [
'siretstructure' => [
'luhn' => [
'rule' => [
'luhn',
......@@ -83,6 +87,37 @@ class Soustraitant extends AppModel implements LinkedOrganisationInterface {
],
'message' => 'validation.numeroSIRETDoitPasDepasser14Caracteres'
]
],
'apestructure' => [
'minLength' => [
'rule' => ['minLength', 5],
'allowEmpty' => true
],
'maxLength' => [
'rule' => ['maxLength', 5],
'allowEmpty' => true
],
],
'emailstructure' => [
[
'rule' => ['custom', REGEXP_EMAIL_FR],
'message' => 'validation.adresseMailNonValide',
'allowEmpty' => true
]
],
'emailresponsable' => [
[
'rule' => ['custom', REGEXP_EMAIL_FR],
'message' => 'validation.adresseMailNonValide',
'allowEmpty' => true
]
],
'email_dpo' => [
[
'rule' => ['custom', REGEXP_EMAIL_FR],
'message' => 'validation.adresseMailNonValide',
'allowEmpty' => true
]
]
];
......@@ -109,6 +144,20 @@ class Soustraitant extends AppModel implements LinkedOrganisationInterface {
'offset' => '',
'finderQuery' => '',
'with' => 'SoustraitantOrganisation'
],
'Fiche' => [
'className' => 'Fiche',
'joinTable' => 'soustraitances',
'foreignKey' => 'soustraitant_id',
'associationForeignKey' => 'fiche_id',
'unique' => true,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
'with' => 'Soustraitance'
]
];
......
......@@ -303,5 +303,4 @@ if (isset($this->validationErrors['WebdpoCoresponsable']) && !empty($this->valid
});
}
}
</script>
\ No newline at end of file
......@@ -20,7 +20,7 @@
'text' => __d('fiche', 'fiche.champSoustraitances')
],
'class' => 'form-control',
'options' => Hash::combine($soustraitants, '{n}.Soustraitant.id', '{n}.Soustraitant.raisonsociale'),
'options' => Hash::combine($soustraitants, '{n}.Soustraitant.id', '{n}.Soustraitant.raisonsocialestructure'),
'empty' => true,
'multiple' => true,
'required' => true,
......@@ -28,6 +28,19 @@
]);
?>
</div>
<?php
if ($this->Autorisation->authorized('35', $this->Session->read('Droit.liste'))) {
echo $this->element('Fiches/modal/modalAddResponsableInTraitement');
?>
<div class="pull-left">
<a type="button" data-toggle="modal" data-target="#modalAddResponsableInFiche">
<span class="fa fa-plus fa-lg fa-fw" aria-hidden="true"></span>
</a>
</div>
<?php
}
?>
</div>
<div id="soustraitanceCards"></div>
......@@ -165,28 +178,28 @@ if (isset($this->validationErrors['WebdpoSoustraitance']) ) {
if (soustraitant['adresse'] != null) {
colLeft = colLeft + '<p>' +
'<u>Adresse :</u>' +