PluginProbe
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler / 1.8.0
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler v1.8.0
1.8.0 1.7.1 1.7.0 1.6.6 1.6.5 1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.4 1.5.5 1.5.3 1.5.2 1.5.1 1.5.0 1.4.2 1.4.1 1.4.0 1.3.28 1.3.27 1.3.26 1.3.25 1.3.23 1.3.22 All 52 releases
fluent-cart / app / Hooks / Handlers / ShortCodes / ReceiptHandler.php

ReceiptHandler.php in FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler 1.8.0, at app/Hooks/Handlers/ShortCodes/ReceiptHandler.php

214 lines 7.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentCart\App\Hooks\Handlers\ShortCodes;
4
5 use FluentCart\Api\Orders;
6 use FluentCart\App\App;
7 use FluentCart\App\Helpers\Status;
8 use FluentCart\App\Models\OrderMeta;
9 use FluentCart\App\Models\OrderOperation;
10 use FluentCart\App\Models\OrderTransaction;
11 use FluentCart\App\Services\DateTime\DateTime;
12 use FluentCart\App\Services\Email\EmailNotifications;
13 use FluentCart\App\Services\FrontendView;
14 use FluentCart\App\Services\Renderer\Receipt\ReceiptRenderer;
15 use FluentCart\App\Services\Renderer\Receipt\ThankYouRender;
16 use FluentCart\App\Vite;
17 use FluentCart\Framework\Support\Arr;
18
19 class ReceiptHandler
20 {
21 protected string $slug = '';
22 protected string $assetsPath = '';
23
24 protected $productId;
25
26 public function register()
27 {
28 add_shortcode('fluent_cart_receipt', [$this, 'renderRedirectPage']);
29 }
30
31 public function renderRedirectPage($attributes): string
32 {
33 $isReceipt = Arr::get($attributes, 'type', '') === 'receipt';
34 $request = App::request();
35 $orderHash = sanitize_text_field($request->get('order_hash'));
36 $transactionHash = sanitize_text_field($request->get('trx_hash'));
37
38 do_action('fluent_cart/before_render_redirect_page', [
39 'order_hash' => $orderHash,
40 'trx_hash' => $transactionHash,
41 'method' => sanitize_text_field($request->get('method')),
42 'is_receipt' => $isReceipt
43 ]);
44
45
46 $isEmailFooter = EmailNotifications::getSettings('show_email_footer');
47
48 if (empty($transactionHash) && empty($orderHash)) {
49 if ($request->get('action') === 'edit') {
50 return '';
51 }
52 return $this->renderNotFoundPage();
53 }
54
55 if (!empty($orderHash)) {
56 $order = (new Orders())->getBy('uuid', $orderHash);
57 } else {
58 $transaction = OrderTransaction::query()->where('uuid', $transactionHash)->first();
59 if (!$transaction) {
60 ob_start();
61 FrontendView::renderNotFoundPage(
62 __('Not found.', 'fluent-cart'),
63 __('Sorry, no transaction found.', 'fluent-cart'),
64 __('The provided transaction appears invalid, expired or does’t match our records', 'fluent-cart')
65 );
66 return ob_get_clean();
67 //return '<div class="fluent_cart_order_confirmation">No Transaction found!</div>';
68 }
69 $order = (new Orders())->getById($transaction->order_id);
70 }
71
72 if (empty($order)) {
73 return $this->renderNotFoundPage();
74 }
75
76 $userId = get_current_user_id();
77 $isOwn = $userId && $order->customer->user_id == $userId;
78
79 $isAdmin = is_user_logged_in() && current_user_can('manage_options');
80 $payment_status = Arr::get($order, 'payment_status');
81 $orderPlacedAt = DateTime::anytimeToGmt(Arr::get($order, 'created_at'));
82 $showOrder =
83 $isOwn ||
84 $isAdmin ||
85 $payment_status === Status::PAYMENT_PAID ||
86 DateTime::now() < $orderPlacedAt->addHours(2);
87
88
89 if (!$showOrder && !$isAdmin) {
90 return $this->renderNotFoundPage();
91 }
92
93 // Handle PDF download when FluentPDF is active and download=1 is requested
94 $isDownload = (bool) $request->get('download', false);
95 if ($isDownload && App::isProActive() && defined('FLUENT_PDF')) {
96 $order->loadMissing(['customer', 'order_items', 'billing_address', 'shipping_address', 'transactions', 'orderTaxRates.tax_rate']);
97 $pdfPath = apply_filters('fluent_cart/pdf/generate_receipt', null, [
98 'order' => $order,
99 'template_id' => 'order_receipt',
100 ]);
101
102 if ($pdfPath && file_exists($pdfPath)) {
103 $fileName = sanitize_file_name('receipt-' . $order->invoice_no . '.pdf');
104 header('Content-Type: application/pdf');
105 header("Content-Disposition: attachment; filename=\"" . $fileName . "\"; filename*=UTF-8''" . rawurlencode($fileName));
106 header('Content-Length: ' . filesize($pdfPath));
107 header('Cache-Control: no-cache');
108 header('X-Content-Type-Options: nosniff');
109 readfile($pdfPath);
110 @unlink($pdfPath);
111 die();
112 }
113 // If PDF generation failed, fall through to render HTML receipt
114 }
115
116 $lastTransaction = OrderTransaction::query()
117 ->where('order_id', $order->id)
118 ->where('transaction_type', '=', Status::TRANSACTION_TYPE_CHARGE)
119 ->orderBy('id', 'DESC')
120 ->first();
121
122 $order->last_transaction = $lastTransaction;
123
124 $operation = OrderOperation::query()->where('order_id', $order->id)->first();
125
126 $isFirstTime = false;
127 if ($operation && !$operation->sales_recorded && $order->payment_status === Status::PAYMENT_PAID) {
128 $operation->sales_recorded = 1;
129 $operation->save();
130 $isFirstTime = true;
131 }
132
133 $vatTaxId = $order->getMeta('vat_tax_id', '');
134
135
136 ob_start();
137 $defaultBannerImage = Vite::getAssetUrl('images/email-template/email-banner.png');
138 //
139 // $templatePath = !$isReceipt ? 'invoice.thank_you' : 'invoice.receipt_slip';
140 // App::make('view')->render($templatePath, [
141 // 'default_banner_image' => $defaultBannerImage,
142 // 'order' => $order,
143 // 'is_first_time' => $isFirstTime,
144 // 'vat_tax_id' => $vatTaxId,
145 // 'order_operation' => $operation
146 // ]);
147 $config = [
148 'order' => $order,
149 'vat_tax_id' => $vatTaxId,
150 'order_operation' => $operation,
151 'is_first_time' => $isFirstTime,
152 'default_banner_image' => $defaultBannerImage,
153 'user_tz' => Arr::get($order->config, 'user_tz', wp_timezone_string()),
154 ];
155 if ($isReceipt) {
156 (new ReceiptRenderer($config))->render();
157 } else {
158 (new ThankYouRender($config))->render();
159 }
160
161 // Not smartcode-parsed: the page holds customer-typed text, and a {{…}} in it
162 // must not resolve. Admin-authored parts are parsed before they are rendered.
163 $parsedContent = ob_get_clean();
164
165 $app = fluentCart();
166 $slug = $app->config->get('app.slug');
167
168 Vite::enqueueStyle(
169 $slug . '_checkout_confirmation',
170 'public/checkout/style/confirmation.scss',
171 );
172
173 $content = '';
174
175 ob_start();
176
177 $footerContent = "<div style='padding: 15px; text-align: center; font-size: 16px; color: #2F3448;'>Powered by <a href='https://fluentcart.com' style='color: #017EF3; text-decoration: none;'>". __('FluentCart', 'fluent-cart') ."</a></div>";
178
179 if ((!App::isProActive() || $isEmailFooter == 'yes') && $isReceipt) {
180 $parsedContent .= $footerContent;
181 }
182
183 $viewData = [
184 'order' => $order,
185 'content' => $parsedContent,
186 'is_receipt' => $isReceipt
187 ];
188
189 if(Arr::get($viewData,'is_receipt')){
190 FrontendView::renderForPrint(Arr::get($viewData,'content'),[
191 'wp_head' => false,
192 'wp_footer' => false,
193 ]);
194 }else{
195 FrontendView::make(__('Thank you', 'fluent-cart'), Arr::get($viewData,'content'));
196 }
197
198
199 $content .= ob_get_clean();
200 return $content;
201 }
202
203 public function renderNotFoundPage()
204 {
205 ob_start();
206 FrontendView::renderNotFoundPage(
207 __('Not found.', 'fluent-cart'),
208 __('Sorry, no receipt found.', 'fluent-cart'),
209 __("The requested receipt is invalid", 'fluent-cart')
210 );
211 return ob_get_clean();
212 }
213 }
214