|
- <?php
-
- /**
- Copyright La boîte à pain (2018)
-
- contact@laboiteapain.net
-
- 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 common\models;
-
- use Yii;
- use common\components\ActiveRecordCommon ;
- use common\models\Producer;
- use common\models\PointSale;
- use common\models\UserPointSale;
- use common\models\Order;
- use common\models\ProductOrder;
-
- /**
- * This is the model class for table "commande_auto".
- *
- * @property integer $id
- * @property integer $id_user
- * @property integer $id_producer
- * @property integer $id_point_sale
- * @property string $date_begin
- * @property string $date_end
- * @property integer $monday
- * @property integer $tuesday
- * @property integer $wednesday
- * @property integer $thursday
- * @property integer $friday
- * @property integer $saturday
- * @property integer $sunday
- * @property integer $week_frequency
- * @property string $username
- * @property string $auto_payment
- */
- class Subscription extends ActiveRecordCommon
- {
- /**
- * @inheritdoc
- */
- public static function tableName()
- {
- return 'subscription';
- }
-
- /**
- * @inheritdoc
- */
- public function rules()
- {
- return [
- [['id_producer', 'id_point_sale'], 'required'],
- [['id_user', 'id_producer', 'id_point_sale', 'monday', 'tuesday',
- 'wednesday', 'thursday', 'friday', 'saturday', 'sunday', 'week_frequency'], 'integer'],
- [['auto_payment'], 'boolean'],
- [['date_begin', 'date_end', 'username'], 'safe'],
- ];
- }
-
- /**
- * @inheritdoc
- */
- public function attributeLabels()
- {
- return [
- 'id' => 'ID',
- 'id_user' => 'Utilisateur',
- 'id_producer' => 'Etablissement',
- 'id_point_sale' => 'Point de vente',
- 'date_begin' => 'Date de début',
- 'date_end' => 'Date de fin',
- 'monday' => 'Lundi',
- 'tuesday' => 'Mardi',
- 'wednesday' => 'Mercredi',
- 'thursday' => 'Jeudi',
- 'friday' => 'Vendredi',
- 'saturday' => 'Samedi',
- 'sunday' => 'Dimanche',
- 'week_frequency' => 'Périodicité',
- 'auto_payment' => 'Paiement automatique'
- ];
- }
-
- /*
- * Relations
- */
-
- public function getUser()
- {
- return $this->hasOne(User::className(), ['id' => 'id_user']);
- }
-
- public function getProducer()
- {
- return $this->hasOne(
- Producer::className(),
- ['id' => 'id_producer']
- );
- }
-
- public function getPointSale()
- {
- return $this->hasOne(
- PointSale::className(),
- ['id' => 'id_point_sale']
- );
- }
-
- public function getProductSubscription()
- {
- return $this->hasMany(
- ProductSubscription::className(),
- ['id_subscription' => 'id']
- )->with('product');
- }
-
- /**
- * Retourne les options de base nécessaires à la fonction de recherche.
- *
- * @return array
- */
- public static function defaultOptionsSearch() {
- return [
- 'with' => ['producer', 'pointSale', 'productSubscription'],
- 'join_with' => ['user'],
- 'orderby' => 'user.name ASC',
- 'attribute_id_producer' => 'subscription.id_producer'
- ] ;
- }
-
- /**
- * Ajoute la commande pour une date donnée.
- *
- * @param string $date
- */
- public function add($date)
- {
- // distribution
- $distribution = Distribution::searchOne([
- 'distribution.date' => date('Y-m-d', strtotime($date))
- ]) ;
-
- if ($distribution && count($this->productSubscription)) {
- // commande
- $order = new Order;
- if (strlen($this->username)) {
- $order->username = $this->username;
- $order->id_user = 0;
- }
- else {
- $order->id_user = $this->id_user;
- }
- $order->date = date('Y-m-d H:i:s');
- $order->origin = Order::ORIGIN_AUTO;
- $order->id_point_sale = $this->id_point_sale;
- $order->id_distribution = $distribution->id;
- $order->auto_payment = $this->auto_payment ;
-
- $userPointSale = UserPointSale::searchOne([
- 'id_point_sale' => $this->id_point_sale,
- 'id_user' => $this->id_user
- ]) ;
-
- if ($userPointSale && strlen($userPointSale->comment)) {
- $order->comment_point_sale = $userPointSale->comment;
- }
-
- $order->save();
-
- // produits
- $amountTotal = 0;
- $productsAdd = false;
- foreach ($this->productSubscription as $productSubscription) {
- $productOrder = new ProductOrder;
- $productOrder->id_order = $order->id;
- $productOrder->id_product = $productSubscription->product->id;
- $productOrder->quantity = $productSubscription->quantity;
- $productOrder->price = $productSubscription->product->price;
- $productOrder->save();
- $productsAdd = true;
- }
-
- if (!$productsAdd) {
- $order->delete();
- }
- }
- }
-
- /**
- * Ajoute les commandes pour une date donnée à partir des abonnements.
- *
- * @param string $date
- * @param boolean $force
- */
- public static function addAll($date, $force = false)
- {
- $distribution = Distribution::searchOne([
- 'date' => date('Y-m-d', strtotime($date))
- ]) ;
-
- if ($distribution) {
- $countOrdersProd = Order::searchCount([
- Order::tableName().'.id_distribution' => $distribution->id
- ]) ;
-
- if (!$countOrdersProd || $force) {
- $subscriptions = self::searchByDate($date);
- foreach ($subscriptions as $s) {
- $s->add($date);
- }
- }
- }
- }
-
- /**
- * Retourne les abonnements pour une date donnée.
- *
- * @param string $date
- * @return array
- */
- public static function searchByDate($date)
- {
- $date = date('Y-m-d', strtotime($date));
-
- $subscriptions = Subscription::searchAll() ;
-
- $arrSubscriptions = [];
-
- foreach ($subscriptions as $s) {
- // vérif dates
- if ($date >= $s->date_begin &&
- (!$s->date_end || $date <= $s->date_end))
- {
- // périodicite
- $nbDays = (strtotime($date) - strtotime($s->date_begin)) / (24 * 60 * 60);
- if ($nbDays % ($s->week_frequency * 7) < 7) {
- // jour de la semaine
- $day = date('N', strtotime($date));
- switch ($day) {
- case 1 : $day = 'monday';
- break;
- case 2 : $day = 'tuesday';
- break;
- case 3 : $day = 'wednesday';
- break;
- case 4 : $day = 'thursday';
- break;
- case 5 : $day = 'friday';
- break;
- case 6 : $day = 'saturday';
- break;
- case 7 : $day = 'sunday';
- break;
- }
-
- if ($s->$day) {
- $arrSubscriptions[] = $s;
- }
- }
- }
- }
-
- return $arrSubscriptions;
- }
- }
|