automatewoo/includes/Entity/Workflow.php
fei-source 47d3c9a8b6 Update to v6.2.2
Source: GrootMade/Festinger Vault
2026-03-15 08:31:15 +08:00

472 lines
9 KiB
PHP

<?php
namespace AutomateWoo\Entity;
use AutomateWoo\Workflows\Status;
/**
* @class Workflow
* @since 5.1.0
*/
class Workflow {
const TYPE_AUTOMATIC = 'automatic';
const TYPE_MANUAL = 'manual';
const ORIGIN_MANUALLY_CREATED = 'manually_created';
/**
* @var int
*/
protected $id = 0;
/**
* @var string
*/
protected $type = self::TYPE_AUTOMATIC;
/**
* @var Status
*/
protected $status;
/**
* @var string
*/
protected $title = '';
/**
* @var WorkflowTiming
*/
protected $timing;
/**
* @var bool
*/
protected $is_transactional = false;
/**
* @var bool
*/
protected $is_tracking_enabled = false;
/**
* @var bool
*/
protected $is_conversion_tracking_enabled = false;
/**
* Google Analytics link tracking
*
* This will be appended to every URL in the email content or SMS body. e.g. utm_source=automatewoo&utm_medium=email&utm_campaign=example
*
* @var string
*/
protected $ga_link_tracking = '';
/**
* @var Trigger
*/
protected $trigger;
/**
* Multiple groups of rules.
*
* @var RuleGroup[]
*/
protected $rule_groups = [];
/**
* @var Action[]
*/
protected $actions = [];
/**
* Order in which the workflows will run.
*
* @var integer
*/
protected $order = 0;
/**
* The origin of the workflow indicating how it was created (e.g. manually, a preset name, etc.)
*
* @var string
*/
protected $origin = self::ORIGIN_MANUALLY_CREATED;
/**
* Workflow constructor.
*
* @param Trigger $trigger
* @param string $type
* @param WorkflowTiming|null $timing Used when the workflow type is 'automatic'
* @param Status|null $status
*/
public function __construct( Trigger $trigger, string $type = self::TYPE_AUTOMATIC, $timing = null, $status = null ) {
$this->trigger = $trigger;
$this->type = $type;
$this->timing = $timing ?? new WorkflowTimingImmediate();
$this->status = $status ?? new Status( Status::DISABLED );
}
/**
* @return int
*/
public function get_id(): int {
return $this->id;
}
/**
* @param int $id
* @return $this
*/
public function set_id( int $id ) {
$this->id = $id;
return $this;
}
/**
* @return string
*/
public function get_type(): string {
return $this->type;
}
/**
* @param string $type
* @return $this
*/
public function set_type( string $type ) {
$this->type = $type;
return $this;
}
/**
* @return Status
*/
public function get_status(): Status {
return $this->status;
}
/**
* @param Status $status
* @return $this
*/
public function set_status( Status $status ) {
$this->status = $status;
return $this;
}
/**
* @return string
*/
public function get_title(): string {
return $this->title;
}
/**
* @param string $title
* @return $this
*/
public function set_title( string $title ) {
$this->title = $title;
return $this;
}
/**
* @return WorkflowTiming
*/
public function get_timing(): WorkflowTiming {
return $this->timing;
}
/**
* @param WorkflowTiming $timing
* @return $this
*/
public function set_timing( WorkflowTiming $timing ) {
$this->timing = $timing;
return $this;
}
/**
* @return bool
*/
public function is_transactional(): bool {
return $this->is_transactional;
}
/**
* @param bool $is_transactional
* @return $this
*/
public function set_is_transactional( $is_transactional ) {
$this->is_transactional = (bool) $is_transactional;
return $this;
}
/**
* @return bool
*/
public function is_tracking_enabled(): bool {
return $this->is_tracking_enabled;
}
/**
* @param bool $is_tracking_enabled
* @return $this
*/
public function set_is_tracking_enabled( $is_tracking_enabled ) {
$this->is_tracking_enabled = (bool) $is_tracking_enabled;
return $this;
}
/**
* @return bool
*/
public function is_conversion_tracking_enabled(): bool {
return $this->is_conversion_tracking_enabled;
}
/**
* @param bool $is_conversion_tracking_enabled
* @return $this
*/
public function set_is_conversion_tracking_enabled( $is_conversion_tracking_enabled ) {
$this->is_conversion_tracking_enabled = (bool) $is_conversion_tracking_enabled;
return $this;
}
/**
* @return string
*/
public function get_ga_link_tracking(): string {
return $this->ga_link_tracking;
}
/**
* @param string $ga_link_tracking
* @return Workflow
*/
public function set_ga_link_tracking( string $ga_link_tracking ) {
$this->ga_link_tracking = $ga_link_tracking;
return $this;
}
/**
* @return Trigger
*/
public function get_trigger() {
return $this->trigger;
}
/**
* @param Trigger $trigger
* @return $this
*/
public function set_trigger( Trigger $trigger ) {
$this->trigger = $trigger;
return $this;
}
/**
* @return RuleGroup[]
*/
public function get_rule_groups() {
return $this->rule_groups;
}
/**
* @param RuleGroup[] $rule_groups
*
* @return $this
*/
public function set_rule_groups( $rule_groups ) {
$this->rule_groups = [];
foreach ( $rule_groups as $rule_group ) {
$this->add_rule_group( $rule_group );
}
return $this;
}
/**
* @param RuleGroup $rule
*
* @return $this
*/
public function add_rule_group( RuleGroup $rule ) {
$this->rule_groups[] = $rule;
return $this;
}
/**
* @return Action[]
*/
public function get_actions() {
return $this->actions;
}
/**
* @param Action[] $actions
* @return $this
*/
public function set_actions( $actions ) {
$this->actions = [];
foreach ( $actions as $action ) {
$this->add_action( $action );
}
return $this;
}
/**
* @param Action $action
* @return $this
*/
public function add_action( Action $action ) {
$this->actions[] = $action;
return $this;
}
/**
* @param string|int $index
* @return $this
*/
public function remove_action( $index ) {
unset( $this->actions[ $index ] );
return $this;
}
/**
* @return int
*/
public function get_order(): int {
return $this->order;
}
/**
* @param int $order
*
* @return Workflow
*/
public function set_order( int $order ): Workflow {
$this->order = $order;
return $this;
}
/**
* @return string
*/
public function get_origin(): string {
return $this->origin;
}
/**
* @param string $origin
*
* @return Workflow
*/
public function set_origin( string $origin ): Workflow {
$this->origin = $origin;
return $this;
}
/**
* Convert workflow data to an array.
*
* @since 6.0.10
*
* @return array
*/
public function to_array(): array {
// Some options are stored together.
$options = array_merge(
[
'click_tracking' => $this->is_tracking_enabled(),
'conversion_tracking' => $this->is_conversion_tracking_enabled(),
'ga_link_tracking' => $this->get_ga_link_tracking(),
],
$this->get_timing_options_data( $this->get_timing() )
);
// Main data for the workflow.
$data = [
'title' => $this->get_title(),
'status' => $this->get_status(),
'type' => $this->get_type(),
'is_transactional' => $this->is_transactional(),
'order' => $this->get_order(),
'origin' => $this->get_origin(),
'options' => $options,
'trigger' => $this->get_trigger() ? $this->get_trigger()->to_array() : [],
'actions' => [],
'rules' => [],
];
foreach ( $this->get_actions() as $action ) {
$data['actions'][] = $action->to_array();
}
foreach ( $this->get_rule_groups() as $rule_group ) {
$data['rules'][] = $rule_group->to_array();
}
if ( $this->get_id() ) {
$data['id'] = $this->get_id();
}
return $data;
}
/**
* Get data from the Workflow timing object.
*
* @since 6.0.10
*
* @return array Normalized data from the timing object.
*/
private function get_timing_options_data(): array {
$data = [
'when_to_run' => $this->timing->get_type(),
];
switch ( get_class( $this->timing ) ) {
case WorkflowTimingScheduled::class:
/** @var WorkflowTimingScheduled $timing */
$data['scheduled_time'] = $this->timing->get_scheduled_time();
$data['scheduled_day'] = $this->timing->get_scheduled_days();
// Deliberately skip break to ensure delay value and unit are set in the next clause.
case WorkflowTimingDelayed::class:
/** @var WorkflowTimingDelayed|WorkflowTimingScheduled $timing */
$data['run_delay_value'] = $this->timing->get_delay_value();
$data['run_delay_unit'] = $this->timing->get_delay_unit();
break;
case WorkflowTimingFixed::class:
/** @var WorkflowTimingFixed $timing */
$datetime = $this->timing->get_fixed_datetime()->convert_to_site_time();
$data['fixed_date'] = $datetime->format( 'Y-m-d' );
$data['fixed_time'] = [
$datetime->format( 'H' ),
$datetime->format( 'i' ),
];
break;
case WorkflowTimingVariable::class:
/** @var WorkflowTimingVariable $timing */
$data['queue_datetime'] = $this->timing->get_variable();
break;
case WorkflowTimingImmediate::class:
default:
// nothing to do here.
break;
}
return $data;
}
}