Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 16 additions & 3 deletions src/enums/Options.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,10 @@ abstract class Options
* Available event types.
*/
public const EVENT_TYPE = [
'users' => 'Users',
'entries' => 'Entries',
'assets' => 'Assets',
'users' => 'Users',
'entries' => 'Entries',
'assets' => 'Assets',
'commerce-orders' => 'Commerce Orders',
];

/**
Expand Down Expand Up @@ -82,6 +83,18 @@ abstract class Options
// 'value' => 'after-delete-asset',
//// 'class' => 'craft\elements\Asset::EVENT_AFTER_PROPAGATE'
// ]
],
'commerce-orders' => [
[
'label' => 'When an order is completed (placed)',
'value' => 'after-complete-order',
'class' => 'craft\commerce\elements\Order::EVENT_AFTER_COMPLETE_ORDER'
],
[
'label' => 'When an order is fully paid',
'value' => 'after-order-paid',
'class' => 'craft\commerce\elements\Order::EVENT_AFTER_ORDER_PAID'
],
]
];

Expand Down
84 changes: 84 additions & 0 deletions src/helpers/events/CommerceOrderEvents.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
<?php
/**
* Notifier plugin for Craft CMS
*
* Send custom Twig messages when Craft events are triggered.
*
* @author Double Secret Agency
* @link https://plugins.doublesecretagency.com/
* @copyright Copyright (c) 2021 Double Secret Agency
*/

namespace doublesecretagency\notifier\helpers\events;

use craft\commerce\elements\Order;
use yii\base\Event;
use doublesecretagency\notifier\elements\Notification;
use doublesecretagency\notifier\NotifierPlugin;

/**
* Class CommerceOrderEvents
* @since 2.2.0
*/
class CommerceOrderEvents
{

/**
* When an order is completed (placed).
*
* @param Event $event
* @return void
*/
public static function afterCompleteOrder(Event $event): void
{
if (!($event->sender instanceof Order)) {
return;
}

$order = $event->sender;

// Get all notifications for this event
$notifications = Notification::find()
->where([
'eventType' => 'commerce-orders',
'event' => 'after-complete-order',
])
->all();

// Send all matching notifications
NotifierPlugin::getInstance()->messages->sendAll($notifications, $event, [
'object' => $order,
'order' => $order,
]);
}

/**
* When an order is fully paid.
*
* @param Event $event
* @return void
*/
public static function afterOrderPaid(Event $event): void
{
if (!($event->sender instanceof Order)) {
return;
}

$order = $event->sender;

// Get all notifications for this event
$notifications = Notification::find()
->where([
'eventType' => 'commerce-orders',
'event' => 'after-order-paid',
])
->all();

// Send all matching notifications
NotifierPlugin::getInstance()->messages->sendAll($notifications, $event, [
'object' => $order,
'order' => $order,
]);
}

}
4 changes: 3 additions & 1 deletion src/models/Dispatch.php
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ public function filterByEventType(): bool
return $this->_filterEntries();
case 'users':
case 'assets':
case 'commerce-orders':
// No further filters
return true;
}
Expand Down Expand Up @@ -593,7 +594,8 @@ private function _parseTwig(array $config, string $text): string
$vars = [
// Event Variables
'event' => $this->event,
'object' => $this->event->sender,
// Unique case for User Activated events
'object' => $this->event->user ?? $this->event->sender,
// People Variables
'recipient' => $recipient,
// Element Variables
Expand Down
28 changes: 28 additions & 0 deletions src/services/Events.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use craft\elements\Asset;
use craft\elements\Entry;
use craft\elements\User;
use craft\commerce\elements\Order;
use craft\events\RegisterComponentTypesEvent;
use craft\services\Users;
use doublesecretagency\notifier\filters\DraftFilter;
Expand All @@ -23,6 +24,7 @@
use doublesecretagency\notifier\filters\ProvisionalDraftFilter;
use doublesecretagency\notifier\filters\RevisionFilter;
use doublesecretagency\notifier\helpers\events\AssetEvents;
use doublesecretagency\notifier\helpers\events\CommerceOrderEvents;
use doublesecretagency\notifier\helpers\events\EntryEvents;
use doublesecretagency\notifier\helpers\events\UserEvents;
use yii\base\Event;
Expand Down Expand Up @@ -72,6 +74,10 @@ public function registerNotificationEvents(): void
$this->_registerEntryEvents();
$this->_registerAssetEvents();
$this->_registerUserEvents();

if (class_exists(Order::class)) {
$this->_registerCommerceOrderEvents();
}
}

// ========================================================================= //
Expand Down Expand Up @@ -151,6 +157,28 @@ private function _registerUserEvents(): void
);
}

/**
* Register all events for Commerce Orders.
*
* @return void
*/
private function _registerCommerceOrderEvents(): void
{
// When an order is completed (placed)
Event::on(
Order::class,
Order::EVENT_AFTER_COMPLETE_ORDER,
[CommerceOrderEvents::class, 'afterCompleteOrder']
);

// When an order is fully paid
Event::on(
Order::class,
Order::EVENT_AFTER_ORDER_PAID,
[CommerceOrderEvents::class, 'afterOrderPaid']
);
}

// ========================================================================= //

/**
Expand Down
12 changes: 12 additions & 0 deletions src/templates/notifications/_edit/event/commerce-orders.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{% import '_includes/forms' as forms %}

<div class="event-type-commerce-orders hidden">
{{ forms.selectField({
label: 'Commerce Orders Event'|t('notifier'),
instructions: commonInstructions,
id: 'event-commerce-orders',
name: 'event[commerce-orders]',
value: notification.event,
options: {'':''}|merge(notificationOptions.allEvents['commerce-orders'] ?? []),
}) }}
</div>
1 change: 1 addition & 0 deletions src/templates/notifications/_edit/event/index.twig
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@
{% include 'notifier/notifications/_edit/event/users' %}
{% include 'notifier/notifications/_edit/event/entries' %}
{% include 'notifier/notifications/_edit/event/assets' %}
{% include 'notifier/notifications/_edit/event/commerce-orders' %}
13 changes: 8 additions & 5 deletions src/utilities/NotificationLog.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use craft\base\Utility;
use craft\helpers\DateTimeHelper;
use DateTime;
use DateTimeZone;
use doublesecretagency\notifier\records\Log;
use Exception;

Expand Down Expand Up @@ -131,15 +132,17 @@ private static function _getLogs(string $date): array
$dayLog = [];

// Get system timezone
$timeZone = Craft::$app->timeZone;
$systemTimeZone = new DateTimeZone(Craft::$app->timeZone);
$dateObj = new DateTime($date, $systemTimeZone);

// Convert dateCreated to the system timezone
$dateCreated = "DATE(CONVERT_TZ(dateCreated, 'UTC', '{$timeZone}'))";
// Start and end of the day in system timezone
$startOfDay = (clone $dateObj)->setTime(0, 0, 0)->format('Y-m-d H:i:s');
$endOfDay = (clone $dateObj)->setTime(23, 59, 59)->format('Y-m-d H:i:s');

// Get all envelopes on selected day
$envelopes = Log::find()
->where([$dateCreated => $date])
->andWhere(['type' => 'envelope'])
->where(['type' => 'envelope'])
->andWhere(['between', 'dateCreated', $startOfDay, $endOfDay])
->orderBy('id')
->all();

Expand Down
13 changes: 11 additions & 2 deletions src/web/twig/Extension.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,21 @@ public function getGlobals(): array
// Generate available field options
$fieldOptions = $this->_fieldOptions();

// Configure available events by installed plugins
$eventTypes = Options::EVENT_TYPE;
$allEvents = Options::ALL_EVENTS;

// Hide Commerce events if Craft Commerce is not installed
if (!class_exists('craft\\commerce\\elements\\Order')) {
unset($eventTypes['commerce-orders'], $allEvents['commerce-orders']);
}

// Return globally accessible variables
return [
'notifier' => new Notifier(),
'notificationOptions' => [
'eventType' => Options::EVENT_TYPE,
'allEvents' => Options::ALL_EVENTS,
'eventType' => $eventTypes,
'allEvents' => $allEvents,
'messageType' => Options::MESSAGE_TYPE,
'emailField' => $fieldOptions['email'],
'smsField' => $fieldOptions['sms'],
Expand Down