Browse Source

Merge branch 'develop'

master
Guillaume Bourgeois 3 months ago
parent
commit
5451aa41d1
12 changed files with 247 additions and 46 deletions
  1. +5
    -2
      backend/controllers/AutomaticEmailController.php
  2. +7
    -2
      backend/views/automatic-email/_form.php
  3. +23
    -7
      backend/views/automatic-email/index.php
  4. +21
    -0
      backend/web/js/backend.js
  5. +19
    -10
      common/components/Date.php
  6. +15
    -6
      console/commands/AutomaticEmailController.php
  7. +34
    -0
      console/migrations/m240912_075936_add_columns_automatic_email.php
  8. +81
    -8
      domain/Communication/AutomaticEmail/AutomaticEmail.php
  9. +0
    -1
      domain/Communication/AutomaticEmail/AutomaticEmailBuilder.php
  10. +25
    -6
      domain/Communication/AutomaticEmail/AutomaticEmailManager.php
  11. +1
    -1
      domain/Communication/Email/ContactListResolver.php
  12. +16
    -3
      domain/Communication/Email/EmailGenerator.php

+ 5
- 2
backend/controllers/AutomaticEmailController.php View File

@@ -86,10 +86,13 @@ class AutomaticEmailController extends BackendController
if ($automaticEmailModel->load(\Yii::$app->request->post()) && $automaticEmailModel->validate()) {
$automaticEmail = $automaticEmailModule->getManager()->createAutomaticEmail(
$this->getProducerCurrent(),
$automaticEmailModel->getDay(),
$automaticEmailModel->getDelayBeforeDistribution(),
$automaticEmailModel->getSubject(),
$automaticEmailModel->getMessage(),
$automaticEmailModel->getDay(),
$automaticEmailModel->getPointSale(),
$automaticEmailModel->getDelayBeforeDistribution(),
$automaticEmailModel->getSendingDay(),
$automaticEmailModel->getSendingHour(),
$automaticEmailModel->getIntegrateProductList()
);
$this->setFlash('success', "Email automatique ajouté");

+ 7
- 2
backend/views/automatic-email/_form.php View File

@@ -41,6 +41,8 @@ use common\helpers\Dropdown;
use lo\widgets\Toggle;
use yii\widgets\ActiveForm;

$pointSaleModule = $this->getPointSaleModule();

?>

<div class="automatic-email-form">
@@ -63,8 +65,11 @@ use yii\widgets\ActiveForm;
],
]);
?>
<?= $form->field($automaticEmail, 'day')->dropDownList(Date::getDaysOfWeekArray()) ?>
<?= $form->field($automaticEmail, 'delay_before_distribution')->dropDownList(Dropdown::numberChoices(1, 7, false, ' jour(s) avant')); ?>
<?= $form->field($automaticEmail, 'day')->dropDownList(Date::getDaysOfWeekArray(true)) ?>
<?= $form->field($automaticEmail, 'id_point_sale')->dropDownList($pointSaleModule->getRepository()->populatePointSaleDropdownList()) ?>
<?= $form->field($automaticEmail, 'delay_before_distribution')->dropDownList(Dropdown::numberChoices(1, 7, true, ' jour(s) avant')); ?>
<?= $form->field($automaticEmail, 'sending_day')->dropDownList(Date::getDaysOfWeekArray(true)) ?>
<?= $form->field($automaticEmail, 'sending_hour')->dropDownList(Dropdown::numberChoices(0, 23, true, 'h')) ?>
<?= $form->field($automaticEmail, 'subject')->textInput() ?>
<?= $form->field($automaticEmail, 'message')->widget(letyii\tinymce\Tinymce::class, [
'configs' => [

+ 23
- 7
backend/views/automatic-email/index.php View File

@@ -51,17 +51,21 @@ $this->addButton(['label' => 'Nouvel email automatique <span class="glyphicon gl

?>

<div class="callout callout-info">
<p>
<i class="icon fa fa-info-circle"></i>
L'heure d'envoi des emails automatiques est programmée à 7h
</p>
</div>

<div class="automatic-email-index">
<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
[
'attribute' => 'id_point_sale',
'format' => 'raw',
'value' => function(AutomaticEmail $automaticEmail) {
if(!$automaticEmail->getPointSale()) {
return '<span class="label label-default">Tous</span>';
}

return $automaticEmail->getPointSale()->getName();
}
],
[
'attribute' => 'day',
'value' => function(AutomaticEmail $automaticEmail) {
@@ -74,6 +78,18 @@ $this->addButton(['label' => 'Nouvel email automatique <span class="glyphicon gl
return $automaticEmail->getDelayBeforeDistributionAsString();
}
],
[
'attribute' => 'sending_day',
'value' => function(AutomaticEmail $automaticEmail) {
return $automaticEmail->getSendingDayAsString();
}
],
[
'attribute' => 'sending_hour',
'value' => function(AutomaticEmail $automaticEmail) {
return $automaticEmail->getSendingHour().'h';
}
],
'subject',
[
'attribute' => 'message',

+ 21
- 0
backend/web/js/backend.js View File

@@ -61,8 +61,29 @@ $(document).ready(function () {
opendistrib_tinymce_responsive();
opendistrib_sponsorship();
opendistrib_clipboard_paste();
opendistrib_automatic_email();
});

function opendistrib_automatic_email() {
if($('.automatic-email-form').size()) {
opendistrib_automatic_email_form_event();
$('#automaticemail-day').change(function() {
opendistrib_automatic_email_form_event();
});
}
}

function opendistrib_automatic_email_form_event() {
var day = parseFloat($('#automaticemail-day').val());
if(day) {
$('.field-automaticemail-sending_day').hide();
$('.field-automaticemail-delay_before_distribution').show();
}
else {
$('.field-automaticemail-sending_day').show();
$('.field-automaticemail-delay_before_distribution').hide();
}
}

function label_unit_reference(unit) {
if(unit == 'piece') {

+ 19
- 10
common/components/Date.php View File

@@ -4,17 +4,26 @@ namespace common\components;

class Date
{
public static function getDaysOfWeekArray(): array
public static function getDaysOfWeekArray(bool $withNullValue = false): array
{
return [
1 => 'Lundi',
2 => 'Mardi',
3 => 'Mercredi',
4 => 'Jeudi',
5 => 'Vendredi',
6 => 'Samedi',
7 => 'Dimanche'
];
$daysOfWeekArray = [];

if($withNullValue) {
$daysOfWeekArray[null] = '--';
}

$daysOfWeekArray = $daysOfWeekArray +
[
1 => 'Lundi',
2 => 'Mardi',
3 => 'Mercredi',
4 => 'Jeudi',
5 => 'Vendredi',
6 => 'Samedi',
7 => 'Dimanche'
];

return $daysOfWeekArray;
}

public static function getDayOfWeekStringByNumber(int $dayOfWeekNumber): string

+ 15
- 6
console/commands/AutomaticEmailController.php View File

@@ -13,6 +13,8 @@ class AutomaticEmailController extends Controller
// ./yii automatic-email/send
public function actionSend()
{
$dayToday = date('N');
$currentHour = date('G');
$automaticEmailModule = AutomaticEmailModule::getInstance();
$producerModule = ProducerModule::getInstance();
$emailModule = EmailModule::getInstance();
@@ -22,12 +24,19 @@ class AutomaticEmailController extends Controller
\Yii::$app->logic->setProducerContext($producer);
$automaticEmailsArray = $automaticEmailModule->getRepository()->findAutomaticEmails();
foreach($automaticEmailsArray as $automaticEmail) {
$distribution = $automaticEmailModule->getResolver()->getMatchedDistribution($automaticEmail);
if($automaticEmail->isEnabled() && $distribution) {
$email = $automaticEmailModule->getManager()->createEmailFromAutomaticEmail($automaticEmail, $distribution);
$usersArray = $emailModule->getContactListResolver()->search($producer, Email::TYPE_ORDER_TAKING, $distribution);
$emailModule->getBulkMailer()->sendEmail($email, $usersArray);
echo 'Email automatique "'.$automaticEmail->getSubject().'" envoyé à '.count($usersArray)." utilisateur(s)\n";
if($automaticEmail->isEnabled()) {
$distribution = $automaticEmailModule->getResolver()->getMatchedDistribution($automaticEmail);
if(($distribution || $automaticEmail->getSendingDay() == $dayToday) && $automaticEmail->getSendingHour() == $currentHour) {
$email = $automaticEmailModule->getManager()->createEmailFromAutomaticEmail($automaticEmail, $distribution);
$usersArray = $emailModule->getContactListResolver()->search(
$producer,
Email::TYPE_ORDER_TAKING,
$distribution,
$automaticEmail->getPointSale()
);
$emailModule->getBulkMailer()->sendEmail($email, $usersArray);
echo 'Email automatique "'.$automaticEmail->getSubject().'" envoyé à '.count($usersArray)." utilisateur(s)\n";
}
}
}
}

+ 34
- 0
console/migrations/m240912_075936_add_columns_automatic_email.php View File

@@ -0,0 +1,34 @@
<?php

use yii\db\Migration;
use yii\db\Schema;

/**
* Class m240912_075936_add_columns_automatic_email
*/
class m240912_075936_add_columns_automatic_email extends Migration
{
/**
* {@inheritdoc}
*/
public function safeUp()
{
$this->addColumn('automatic_email', 'id_point_sale', Schema::TYPE_INTEGER);
$this->addColumn('automatic_email', 'sending_day', Schema::TYPE_INTEGER);
$this->addColumn('automatic_email', 'sending_hour', Schema::TYPE_INTEGER);
$this->addForeignKey('automatic_email_fk_id_point_sale', 'automatic_email', 'id_point_sale', 'point_sale', 'id');

$this->alterColumn('automatic_email', 'day', Schema::TYPE_INTEGER);
$this->alterColumn('automatic_email', 'delay_before_distribution', Schema::TYPE_INTEGER);
}

/**
* {@inheritdoc}
*/
public function safeDown()
{
$this->dropColumn('automatic_email', 'id_point_sale');
$this->dropColumn('automatic_email', 'sending_day');
$this->dropColumn('automatic_email', 'sending_hour');
}
}

+ 81
- 8
domain/Communication/AutomaticEmail/AutomaticEmail.php View File

@@ -5,6 +5,7 @@ namespace domain\Communication\AutomaticEmail;
use common\components\ActiveRecordCommon;
use common\components\Date;
use domain\_\StatusInterface;
use domain\PointSale\PointSale\PointSale;
use domain\Producer\Producer\Producer;
use yii\db\ActiveQuery;

@@ -18,9 +19,15 @@ class AutomaticEmail extends ActiveRecordCommon
public function rules()
{
return [
[['id_producer', 'day', 'subject', 'message', 'status'], 'required'],
[['id_producer', 'subject', 'message', 'status', 'sending_hour'], 'required'],
['sending_day', 'required', 'when' => function($model) {
return !$model->getDay();
}],
['delay_before_distribution', 'required', 'when' => function($model) {
return $model->getDay();
}],
[['subject', 'message'], 'string'],
[['id_producer', 'day', 'delay_before_distribution', 'status'], 'integer'],
[['id_producer', 'day', 'delay_before_distribution', 'status', 'id_point_sale', 'sending_day', 'sending_hour'], 'integer'],
[['integrate_product_list'], 'boolean']
];
}
@@ -29,12 +36,15 @@ class AutomaticEmail extends ActiveRecordCommon
{
return [
'id_producer' => 'Producteur',
'day' => 'Jour de distribution',
'day' => 'Distribution',
'delay_before_distribution' => 'Envoi du message',
'subject' => 'Sujet',
'message' => 'Message',
'integrate_product_list' => 'Intégrer la liste des produits au message',
'status' => 'Statut'
'status' => 'Statut',
'id_point_sale' => 'Point de vente',
'sending_day' => "Jour d'envoi",
'sending_hour' => "Heure d'envoi",
];
}

@@ -47,11 +57,28 @@ class AutomaticEmail extends ActiveRecordCommon

public function getDayAsString(): string
{
if(!$this->getDay()) {
return '';
}

return Date::getDayOfWeekStringByNumber($this->getDay());
}

public function getSendingDayAsString(): string
{
if(!$this->getSendingDay()) {
return '';
}

return Date::getDayOfWeekStringByNumber($this->getSendingDay());
}

public function getDelayBeforeDistributionAsString(): string
{
if(!$this->getDelayBeforeDistribution()) {
return '';
}

return $this->getDelayBeforeDistribution().' jour(s) avant';
}

@@ -83,23 +110,31 @@ class AutomaticEmail extends ActiveRecordCommon
return $this;
}

public function getDay(): int
public function getDay(): ?int
{
if(!$this->day) {
return null;
}

return $this->day;
}

public function setDay(int $day): self
public function setDay(?int $day): self
{
$this->day = $day;
return $this;
}

public function getDelayBeforeDistribution(): int
public function getDelayBeforeDistribution(): ?int
{
if(!$this->delay_before_distribution) {
return 0;
}

return $this->delay_before_distribution;
}

public function setDelayBeforeDistribution(int $delayBeforeDistribution): self
public function setDelayBeforeDistribution(?int $delayBeforeDistribution): self
{
$this->delay_before_distribution = $delayBeforeDistribution;
return $this;
@@ -149,10 +184,48 @@ class AutomaticEmail extends ActiveRecordCommon
return $this;
}

public function getPointSale(): ?PointSale
{
return $this->pointSaleRelation;
}

public function setPointSale(PointSale $pointSale): self
{
$this->populateFieldObject('id_point_sale', 'pointSaleRelation', $pointSale);
return $this;
}

public function getSendingDay(): ?int
{
return $this->sending_day;
}

public function setSendingDay(?int $sendingDay): self
{
$this->sending_day = $sendingDay;
return $this;
}

public function getSendingHour(): ?int
{
return $this->sending_hour;
}

public function setSendingHour(?int $sendingHour): self
{
$this->sending_hour = $sendingHour;
return $this;
}

/* Relations */

public function getProducerRelation(): ActiveQuery
{
return $this->hasOne(Producer::class, ['id' => 'id_producer']);
}

public function getPointSaleRelation(): ActiveQuery
{
return $this->hasOne(PointSale::class, ['id' => 'id_point_sale']);
}
}

+ 0
- 1
domain/Communication/AutomaticEmail/AutomaticEmailBuilder.php View File

@@ -12,7 +12,6 @@ class AutomaticEmailBuilder extends AbstractBuilder
{
$automaticEmail = new AutomaticEmail();
$automaticEmail->setProducer($producer);
$automaticEmail->setDelayBeforeDistribution(2);
$automaticEmail->setStatus(StatusInterface::STATUS_ONLINE);
return $automaticEmail;
}

+ 25
- 6
domain/Communication/AutomaticEmail/AutomaticEmailManager.php View File

@@ -6,6 +6,7 @@ use domain\_\AbstractManager;
use domain\Communication\Email\Email;
use domain\Communication\Email\EmailGenerator;
use domain\Distribution\Distribution\Distribution;
use domain\PointSale\PointSale\PointSale;
use domain\Producer\Producer\Producer;

class AutomaticEmailManager extends AbstractManager
@@ -21,16 +22,33 @@ class AutomaticEmailManager extends AbstractManager

public function createAutomaticEmail(
Producer $producer,
int $day,
int $delayBeforeDistribution,
string $subject,
string $message,
int $day = null,
PointSale $pointSale = null,
int $delayBeforeDistribution = null,
int $sendingDay = null,
int $sendingHour = null,
bool $integrateProductList = null
): AutomaticEmail
{
$automaticEmail = $this->automaticEmailBuilder->instanciateAutomaticEmail($producer);
$automaticEmail->setDay($day);
$automaticEmail->setDelayBeforeDistribution($delayBeforeDistribution);

if($day) {
$automaticEmail->setDay($day);
$automaticEmail->setSendingDay(null);
$automaticEmail->setDelayBeforeDistribution($delayBeforeDistribution);
}
else {
$automaticEmail->setSendingDay($sendingDay);
$automaticEmail->setDelayBeforeDistribution(null);
}

if($pointSale) {
$automaticEmail->setPointSale($pointSale);
}

$automaticEmail->setSendingHour($sendingHour);
$automaticEmail->setSubject($subject);
$automaticEmail->setMessage($message);
$automaticEmail->setIntegrateProductList($integrateProductList);
@@ -40,14 +58,15 @@ class AutomaticEmailManager extends AbstractManager
return $automaticEmail;
}

public function createEmailFromAutomaticEmail(AutomaticEmail $automaticEmail, Distribution $distribution): Email
public function createEmailFromAutomaticEmail(AutomaticEmail $automaticEmail, Distribution $distribution = null): Email
{
return $this->emailGenerator->createEmail(
$automaticEmail->getSubject(),
$automaticEmail->getMessage(),
$automaticEmail->getIntegrateProductList(),
$automaticEmail->getProducer(),
$distribution
$distribution,
true
);
}


+ 1
- 1
domain/Communication/Email/ContactListResolver.php View File

@@ -40,7 +40,7 @@ class ContactListResolver extends AbstractResolver
$users = [];

foreach($distribution->pointSaleDistribution as $pointSaleDistribution) {
if($pointSaleDistribution->delivery) {
if($pointSaleDistribution->delivery && (!$pointSale || $pointSale->id == $pointSaleDistribution->id_point_sale)) {
$usersPointSaleArray = $this->userRepository->queryUsersBy([
'id_producer' => $producer->id,
'id_point_sale' => $pointSaleDistribution->id_point_sale,

+ 16
- 3
domain/Communication/Email/EmailGenerator.php View File

@@ -33,9 +33,15 @@ class EmailGenerator extends AbstractResolver
string $message,
bool $integrateProductList,
Producer $producer = null,
Distribution $distribution = null
Distribution $distribution = null,
bool $addLinkOrderWhenNoDistribution = false
): Email
{
$linkProducer = '';
if($producer) {
$linkProducer = 'https://'.$producer->slug.'.souke.fr';
}

$messageAutoText = '' ;
$messageAutoHtml = '' ;

@@ -59,7 +65,7 @@ class EmailGenerator extends AbstractResolver
' ;
$messageAutoHtml .= '<br /><br />' ;

$linkOrder = $this->distributionSolver->getLinkOrder($distribution);
$linkOrder = $linkProducer.'/order/order?date='.$distribution->date;
$dateOrder = strftime('%A %d %B %Y', strtotime($distribution->date)) ;
$messageAutoHtml .= '<a href="'.$linkOrder.'">Passer ma commande du '.$dateOrder.'</a>' ;
$messageAutoText .= 'Suivez ce lien pour passer votre commande du '.$dateOrder.' :
@@ -107,12 +113,19 @@ Produits disponibles :
}
}
}
else {
if($addLinkOrderWhenNoDistribution) {
$linkOrder = $linkProducer.'/order/order';
$messageAutoHtml .= '<a href="'.$linkOrder.'">Passer ma commande</a>' ;
$messageAutoText .= 'Suivez ce lien pour passer votre commande :
'.$linkOrder ;
}
}

if($producer) {
$fromEmail = $this->producerSolver->getProducerEmailPlatform($producer) ;
$fromName = $producer->name ;

$linkProducer = 'https://'.$producer->slug.'.souke.fr';
$linkUnsubscribe = $linkProducer.'/newsletter/unsubscribe';

// Message inscription newsletter

Loading…
Cancel
Save