Click.php
5 months ago
Event.php
5 months ago
Order.php
5 months ago
Origin.php
5 months ago
Submission.php
5 months ago
View.php
3 months ago
Order.php
149 lines
| 1 | <?php |
| 2 | |
| 3 | namespace IAWP\Journey\Events; |
| 4 | |
| 5 | use IAWPSCOPED\Carbon\CarbonImmutable; |
| 6 | use IAWP\Illuminate_Builder; |
| 7 | use IAWP\Tables; |
| 8 | use IAWP\Utils\Currency; |
| 9 | use IAWP\Utils\Obj; |
| 10 | use IAWP\Utils\Timezone; |
| 11 | /** @internal */ |
| 12 | class Order extends \IAWP\Journey\Events\Event |
| 13 | { |
| 14 | private int $session_id; |
| 15 | private string $created_at; |
| 16 | private int $total; |
| 17 | private int $total_refunded; |
| 18 | private ?string $platform; |
| 19 | private string $status; |
| 20 | private string $order_id; |
| 21 | private ?string $admin_url; |
| 22 | public function __construct(object $record) |
| 23 | { |
| 24 | $this->session_id = $record->session_id; |
| 25 | $this->created_at = $record->created_at; |
| 26 | $this->total = $record->total; |
| 27 | $this->total_refunded = $record->total_refunded; |
| 28 | // The order of these method calls is important! |
| 29 | $this->platform = $this->calculate_platform($record); |
| 30 | $this->status = $this->calculate_status($record); |
| 31 | $this->order_id = $this->calculate_order_id($record); |
| 32 | $this->admin_url = $this->calculate_admin_url(); |
| 33 | } |
| 34 | public function type() : string |
| 35 | { |
| 36 | return 'order'; |
| 37 | } |
| 38 | public function label() : string |
| 39 | { |
| 40 | return \__('Order', 'independent-analytics'); |
| 41 | } |
| 42 | public function created_at() : ?CarbonImmutable |
| 43 | { |
| 44 | return CarbonImmutable::parse($this->created_at, 'utc')->timezone(Timezone::site_timezone()); |
| 45 | } |
| 46 | public function html() : string |
| 47 | { |
| 48 | return \IAWPSCOPED\iawp_render('journeys.timeline.order', ['event' => $this]); |
| 49 | } |
| 50 | public function total() : string |
| 51 | { |
| 52 | return Currency::format($this->total, \false); |
| 53 | } |
| 54 | public function total_refunded() : ?string |
| 55 | { |
| 56 | $total_refunded = $this->total_refunded; |
| 57 | if ($total_refunded === 0) { |
| 58 | return null; |
| 59 | } |
| 60 | return Currency::format($total_refunded, \false); |
| 61 | } |
| 62 | public function status() : string |
| 63 | { |
| 64 | return $this->status; |
| 65 | } |
| 66 | public function order_id() : string |
| 67 | { |
| 68 | return $this->order_id; |
| 69 | } |
| 70 | public function admin_url() : ?string |
| 71 | { |
| 72 | return $this->admin_url; |
| 73 | } |
| 74 | private function calculate_platform(object $record) : ?string |
| 75 | { |
| 76 | $platforms = ['woocommerce', 'surecart', 'edd', 'pmpro', 'fluent_cart']; |
| 77 | foreach ($platforms as $platform) { |
| 78 | $key = $platform . '_order_status'; |
| 79 | if (\is_string($record->{$key} ?? null)) { |
| 80 | return $platform; |
| 81 | } |
| 82 | } |
| 83 | return null; |
| 84 | } |
| 85 | private function calculate_status(object $record) : string |
| 86 | { |
| 87 | if ($this->platform === null) { |
| 88 | return ''; |
| 89 | } |
| 90 | $key = $this->platform . '_order_status'; |
| 91 | return $record->{$key}; |
| 92 | } |
| 93 | private function calculate_order_id(object $record) : string |
| 94 | { |
| 95 | if ($this->platform === null) { |
| 96 | return 0; |
| 97 | } |
| 98 | $key = $this->platform . '_order_id'; |
| 99 | return $record->{$key}; |
| 100 | } |
| 101 | private function calculate_admin_url() : ?string |
| 102 | { |
| 103 | try { |
| 104 | if ($this->platform === 'fluent_cart' && \IAWPSCOPED\iawp()->is_fluent_cart_support_enabled()) { |
| 105 | $order = \FluentCart\App\Models\Order::find($this->order_id); |
| 106 | if ($order === null) { |
| 107 | return null; |
| 108 | } |
| 109 | return $order->getViewURL('admin'); |
| 110 | } |
| 111 | if ($this->platform === 'woocommerce' && \IAWPSCOPED\iawp()->is_woocommerce_support_enabled()) { |
| 112 | $order = wc_get_order($this->order_id); |
| 113 | if ($order === null) { |
| 114 | return null; |
| 115 | } |
| 116 | return $order->get_edit_order_url(); |
| 117 | } |
| 118 | if ($this->platform === 'surecart' && \IAWPSCOPED\iawp()->is_surecart_support_enabled()) { |
| 119 | $admin_url = \admin_url('admin.php'); |
| 120 | $args = ['page' => 'sc-orders', 'action' => 'edit', 'id' => $this->order_id]; |
| 121 | $url = \add_query_arg($args, $admin_url); |
| 122 | return $url; |
| 123 | } |
| 124 | if ($this->platform === 'edd' && \IAWPSCOPED\iawp()->is_edd_support_enabled()) { |
| 125 | $admin_url = \admin_url('edit.php'); |
| 126 | $args = ['page' => 'edd-payment-history', 'post_type' => 'download', 'view' => 'view-order-details', 'id' => $this->order_id]; |
| 127 | $url = \add_query_arg($args, $admin_url); |
| 128 | return $url; |
| 129 | } |
| 130 | if ($this->platform === 'pmpro' && \IAWPSCOPED\iawp()->is_pmpro_support_enabled()) { |
| 131 | $admin_url = \admin_url('admin.php'); |
| 132 | $args = ['page' => 'pmpro-orders', 'id' => $this->order_id]; |
| 133 | $url = \add_query_arg($args, $admin_url); |
| 134 | return $url; |
| 135 | } |
| 136 | } catch (\Throwable $error) { |
| 137 | } |
| 138 | return null; |
| 139 | } |
| 140 | public static function from_session(int $session_id) : array |
| 141 | { |
| 142 | $query = Illuminate_Builder::new()->select(['sessions.session_id', 'orders.*'])->from(Tables::sessions(), 'sessions')->join(Tables::views() . ' AS views', 'sessions.session_id', '=', 'views.session_id')->join(Tables::orders() . ' AS orders', 'views.id', '=', 'orders.view_id')->where('sessions.session_id', '=', $session_id); |
| 143 | $records = $query->get()->all(); |
| 144 | return \array_map(function ($record) { |
| 145 | return new \IAWP\Journey\Events\Order(Obj::empty_strings_to_null($record)); |
| 146 | }, $records); |
| 147 | } |
| 148 | } |
| 149 |