|
- <?php
-
- /**
- * Copyright Souke (2018)
- *
- * contact@souke.fr
- *
- * Ce logiciel est un programme informatique servant à aider les producteurs
- * à distribuer leur production en circuits courts.
- *
- * Ce logiciel est régi par la licence CeCILL soumise au droit français et
- * respectant les principes de diffusion des logiciels libres. Vous pouvez
- * utiliser, modifier et/ou redistribuer ce programme sous les conditions
- * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
- * sur le site "http://www.cecill.info".
- *
- * En contrepartie de l'accessibilité au code source et des droits de copie,
- * de modification et de redistribution accordés par cette licence, il n'est
- * offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
- * seule une responsabilité restreinte pèse sur l'auteur du programme, le
- * titulaire des droits patrimoniaux et les concédants successifs.
- *
- * A cet égard l'attention de l'utilisateur est attirée sur les risques
- * associés au chargement, à l'utilisation, à la modification et/ou au
- * développement et à la reproduction du logiciel par l'utilisateur étant
- * donné sa spécificité de logiciel libre, qui peut le rendre complexe à
- * manipuler et qui le réserve donc à des développeurs et des professionnels
- * avertis possédant des connaissances informatiques approfondies. Les
- * utilisateurs sont donc invités à charger et tester l'adéquation du
- * logiciel à leurs besoins dans des conditions permettant d'assurer la
- * sécurité de leurs systèmes et ou de leurs données et, plus généralement,
- * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
- *
- * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
- * pris connaissance de la licence CeCILL, et que vous en avez accepté les
- * termes.
- */
-
- namespace frontend\forms;
-
- use domain\Config\TaxRate\TaxRate;
- use domain\Producer\Producer\Producer;
- use domain\Producer\Producer\ProducerModule;
- use domain\User\User\User;
- use domain\User\User\UserModule;
- use domain\User\UserGroup\UserGroupModule;
- use yii\base\Model;
-
- /**
- * Signup form
- */
- class SignupForm extends Model
- {
- public $signup_producer_only = false;
- public $username;
- public $email;
- public $password;
- public $name;
- public $lastname;
- public $phone;
- public $is_producer;
- public $siret;
- public $name_producer;
- public $postcode;
- public $city;
- public $id_producer;
- public $option_user_producer;
- public $cgv;
- public $code;
- public $type;
- // public $free_price ;
- public $id_tax_rate_default;
- public $verifyCode;
- public $is_test;
- public $newsletter = false;
- public $newsletter_souke = false;
- public $sponsored_by = false;
-
- /**
- * @inheritdoc
- */
- public function rules()
- {
- return [
- ['email', 'filter', 'filter' => 'trim'],
- ['email', 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
- return !$model->signup_producer_only;
- }],
- ['email', 'email'],
- ['email', function ($attribute, $params) {
- $email = $this->$attribute;
-
- $userExist = User::searchOne([
- 'type' => 'individual',
- 'email' => $email
- ]);
-
- if ($userExist) {
- $this->addError($attribute, 'Cet email est déjà utilisé.');
- }
- }],
- [['name', 'lastname', 'phone'], 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
- return !$model->signup_producer_only;
- }],
- [['name', 'lastname', 'phone', 'option_user_producer'], 'string', 'min' => 2, 'max' => 255],
- ['password', 'required', 'message' => 'Champs obligatoire', 'when' => function($model) {
- return !$model->signup_producer_only;
- }],
- ['password', 'string', 'min' => 6, 'tooShort' => 'Votre mot de passe doit contenir au moins 6 caractères'],
- [['is_producer', 'newsletter', 'newsletter_souke'], 'boolean'],
- ['cgv', 'boolean'],
- ['cgv', function ($attribute, $params) {
- $cgv = $this->$attribute;
-
- if ($this->option_user_producer == 'producer' && !$cgv) {
- $this->addError($attribute, 'Vous devez accepter les conditions générales de vente pour vous inscrire.');
- }
- }],
- ['postcode', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
- return $model->option_user_producer == 'producer';
- }],
- ['id_tax_rate_default', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
- return $model->option_user_producer == 'producer';
- }],
- ['city', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
- return $model->option_user_producer == 'producer';
- }],
- [['name_producer', 'type', 'siret', 'is_test'], 'string'],
- ['name_producer', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
- return $model->option_user_producer == 'producer';
- }],
- ['type', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
- return $model->option_user_producer == 'producer';
- }],
- ['siret', function ($attribute, $params) {
- $siret = $this->$attribute;
- $siret = str_replace(' ', '', $siret);
-
- if (strlen($siret) != 14) {
- $this->addError($attribute, 'Le numéro SIRET doit contenir 14 caractères');
- return;
- }
-
- if (!is_numeric($siret)) {
- $this->addError($attribute, 'Le numéro SIRET ne doit contenir que des chiffres');
- return;
- }
-
- // on prend chaque chiffre un par un
- // si son index (position dans la chaîne en commence à 0 au premier caractère) est pair
- // on double sa valeur et si cette dernière est supérieure à 9, on lui retranche 9
- // on ajoute cette valeur à la somme totale
-
- $sum = 0;
- for ($index = 0; $index < 14; $index++) {
- $number = (int)$siret[$index];
- if (($index % 2) == 0) {
- if (($number *= 2) > 9)
- $number -= 9;
- }
- $sum += $number;
- }
-
- // le numéro est valide si la somme des chiffres est multiple de 10
- if (($sum % 10) != 0)
- $this->addError($attribute, 'Numéro SIRET invalide');
- }],
- ['id_producer', 'integer'],
- ['id_producer', function ($attribute, $params) {
- if ($this->id_producer) {
- $producer = Producer::findOne($this->id_producer);
- if (!$producer) {
- $this->addError($attribute, 'Ce producteur n\'existe pas.');
- }
- }
- }],
- ['id_producer', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
- return $this->option_user_producer == 'user';
- }],
- ['sponsored_by', 'safe'],
- ['code', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) {
- $producer = Producer::findOne($this->id_producer);
- if ($producer) {
- return strlen($producer->code);
- } else {
- return false;
- }
- }],
- ['code', function ($attribute, $params) {
- $code = $this->$attribute;
- $producer = Producer::findOne($this->id_producer);
-
- if ($producer && strtolower(trim($code)) != strtolower(trim($producer->code))) {
- $this->addError($attribute, 'Code incorrect');
- }
- }],
- //['free_price', 'number'],
- ['id_tax_rate_default', 'exist',
- 'targetClass' => TaxRate::className(),
- 'targetAttribute' => ['id_tax_rate_default' => 'id']],
- ['verifyCode', 'captcha', 'message' => 'Veuillez recopier le code de vérification', 'when' => function($model) {
- return $model->is_test != 'isTest';
- }],
- ];
- }
-
- public function attributeLabels()
- {
- return [
- 'id' => 'ID',
- 'username' => 'Identifiant',
- 'password' => 'Mot de passe',
- 'rememberMe' => 'Se souvenir de moi',
- 'name' => 'Prénom',
- 'lastname' => 'Nom',
- 'phone' => 'Téléphone',
- 'is_producer' => "Je suis professionnel et souhaite mettre en place un système de réservation dans mon établissement",
- 'name_producer' => 'Nom de votre structure',
- 'siret' => 'Numéro SIRET',
- 'postcode' => 'Code postal',
- 'city' => 'Commune',
- 'id_producer' => 'Producteur',
- 'type' => 'Type de producteur',
- 'id_tax_rate_default' => 'TVA par défaut',
- 'verifyCode' => 'Code de vérification',
- 'newsletter' => "S'abonner à l'infolettre de ce producteur",
- 'newsletter_souke' => "S'abonner à l'infolettre de Souke",
- ];
- }
-
- /**
- * Signs user up.
- *
- * @return User|null the saved model or null if saving fails
- */
- public function signup($user = null)
- {
- $userGroupModule = UserGroupModule::getInstance();
- $userModule = UserModule::getInstance();
- $producerModule = \Yii::$app->logic->getProducerModule();
-
- if ($this->validate()) {
-
- $sendEmailSignup = false;
- if(!$user) {
- $sendEmailSignup = true;
- $user = $userModule->instanciateUser(User::TYPE_INDIVIDUAL);
- $this->populateUser($user);
- }
-
- if ($this->isProducer()) {
- $producer = $this->processFormProducer($user);
- $idProducer = $producer->id;
- } else {
- $idProducer = $this->id_producer;
- }
-
- $producer = $producerModule->findOneProducerById($idProducer);
-
- if ($user->save() && $producer) {
- \Yii::$app->logic->setProducerContext($producer);
-
- if(!$this->isProducer()) {
- if($producer->id_user_group_default) {
- $userGroupDefault = $userGroupModule->getRepository()->findOneUserGroupById($producer->id_user_group_default);
- $userModule->getBuilder()->addUserGroup($user, $userGroupDefault);
- }
- }
- $producerModule->addUser($user, $producer, true, $this->newsletter);
- if($sendEmailSignup) {
- $userModule->sendEmailSignup($user, $producer);
- }
-
- return $user;
- }
- }
-
- return null;
- }
-
- public function isCustomer()
- {
- return $this->option_user_producer == 'user';
- }
-
- public function isProducer()
- {
- return $this->option_user_producer == 'producer';
- }
-
- public function processFormProducer($user)
- {
- $userModule = UserModule::getInstance();
- $producerModule = ProducerModule::getInstance();
-
- // Création du producteur
- $producer = $producerModule->instanciateProducer();
- $this->populateProducer($producer);
- $producerModule->initProducer($producer);
- $producer->save();
-
- // Parrainage
- if($this->sponsored_by) {
- $sponsorshipProducerSponsor = $producerModule->getRepository()->findOneProducerById($this->sponsored_by);
- if($sponsorshipProducerSponsor) {
- $producer->sponsored_by = $this->sponsored_by;
- $producer->save();
- }
- }
-
- /*
- * Envoi d'un email à l'administrateur pour le prévenir
- * qu'un nouveau producteur s'est inscrit
- */
- $producerModule->sendEmailNewProducer($producer);
-
- // Initialisation de l'utilisateur (statut et liaison au producteur)
- $userModule->initProducer($user, $producer);
-
- return $producer;
- }
-
- public function populateUser($user)
- {
- $userModule = UserModule::getInstance();
- $userModule->initPassword($user, $this->password);
-
- $user->username = $this->email;
- $user->email = $this->email;
- $user->name = $this->name;
- $user->lastname = $this->lastname;
- $user->phone = $this->phone;
- $user->newsletter_souke = $this->newsletter_souke;
- }
-
- public function populateProducer($producer)
- {
- $producer->name = $this->name_producer;
- $producer->type = $this->type;
- $producer->siret = $this->siret;
- $producer->postcode = $this->postcode;
- $producer->city = $this->city;
- $producer->id_tax_rate_default = $this->id_tax_rate_default;
- }
- }
|