PluginProbe
ووسلام – همگام سازی ووکامرس و باسلام / 1.10.19
ووسلام – همگام سازی ووکامرس و باسلام v1.10.19
1.10.19 1.10.20 1.10.18 1.10.17 1.10.15 1.10.14 1.10.13 1.10.12 1.10.10 1.10.9 1.10.8 1.10.7 1.10.6 1.10.5 1.10.4 1.10.3 1.10.2 1.10.1 1.10.0 1.9.2 1.9.1 1.9.0 1.8.8 1.8.5 1.8.6 All 53 releases
sync-basalam / templates / FinancialManagement / main-page.php

main-page.php in ووسلام – همگام سازی ووکامرس و باسلام 1.10.19, at templates/FinancialManagement/main-page.php

398 lines 17.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 use SyncBasalam\Admin\FinancialManagement\FinancialManagementHistory;
4 use SyncBasalam\Services\FinancialManagementService;
5 use SyncBasalam\Utilities\DateConverter;
6
7 defined('ABSPATH') || exit;
8
9 $service = new FinancialManagementService();
10 $perPage = $service->getDefaultPerPage();
11
12 $activePage = isset($_GET['sbp_active_page']) ? max(1, absint(wp_unslash($_GET['sbp_active_page']))) : 1;
13 $historyPage = isset($_GET['sbp_history_page']) ? max(1, absint(wp_unslash($_GET['sbp_history_page']))) : 1;
14
15 $balanceResult = $service->getBalance();
16 $activeSettlementsResult = $service->getActiveSettlements($activePage, $perPage);
17 $historyResult = $service->getSettlementHistory($historyPage, $perPage);
18
19 $balanceData = (isset($balanceResult['data']) && is_array($balanceResult['data'])) ? $balanceResult['data'] : [];
20 $activeSettlementsData = (isset($activeSettlementsResult['data']) && is_array($activeSettlementsResult['data'])) ? $activeSettlementsResult['data'] : [];
21 $historyData = (isset($historyResult['data']) && is_array($historyResult['data'])) ? $historyResult['data'] : [];
22
23 $activeItems = (isset($activeSettlementsData['data']) && is_array($activeSettlementsData['data'])) ? $activeSettlementsData['data'] : [];
24 $historyItems = (isset($historyData['data']) && is_array($historyData['data'])) ? $historyData['data'] : [];
25
26 $activeTotalPages = max(1, (int) ($activeSettlementsData['last_page'] ?? 1));
27 $historyTotalPages = max(1, (int) ($historyData['last_page'] ?? 1));
28
29 // Convert from rials to Toman (divide by 10)
30 $formatAmount = static function ($amount): string {
31 if (!is_numeric($amount)) {
32 return '-';
33 }
34 $value = (float) $amount;
35 return number_format($value / 10, 0, '', ',');
36 };
37
38 $formatAmountWithUnit = static function ($amount) use ($formatAmount): string {
39 $formatted = $formatAmount($amount);
40 if ($formatted === '-') {
41 return $formatted;
42 }
43 return $formatted . ' تو�
44 ان';
45 };
46
47 $maskLastDigit = static function ($amount) use ($formatAmount): string {
48 if (!is_numeric($amount)) {
49 return '-';
50 }
51 $intAmount = (int) $amount;
52 $negativePrefix = $intAmount < 0 ? '-' : '';
53 $digits = ltrim((string) abs($intAmount), '0');
54
55 if ($digits === '') {
56 return '0';
57 }
58
59 $withoutLastDigit = strlen($digits) > 1 ? substr($digits, 0, -1) : '';
60 $formattedPart = $withoutLastDigit === '' ? '0' : $formatAmount((int) $withoutLastDigit * 10);
61
62 return $negativePrefix . $formattedPart;
63 };
64
65 // Format timestamp to Jalali (Shamsi) date using DateConverter
66 $formatJalaliTimestamp = static function ($timestamp): string {
67 if (!is_numeric($timestamp)) {
68 return '-';
69 }
70 $value = (int) $timestamp;
71 if ($value <= 0) {
72 return '-';
73 }
74
75 $dateTime = new DateTime('@' . $value);
76 $dateTime->setTimezone(wp_timezone());
77
78 $gy = (int) $dateTime->format('Y');
79 $gm = (int) $dateTime->format('m');
80 $gd = (int) $dateTime->format('d');
81 $time = $dateTime->format('H:i');
82
83 [$jy, $jm, $jd] = DateConverter::gregorianToJalaliArray($gy, $gm, $gd);
84
85 return sprintf('%04d/%02d/%02d - %s', $jy, $jm, $jd, $time);
86 };
87
88 // Format timestamp to Gregorian date
89 $formatGregorianTimestamp = static function ($timestamp): string {
90 if (!is_numeric($timestamp)) {
91 return '-';
92 }
93 $value = (int) $timestamp;
94 if ($value <= 0) {
95 return '-';
96 }
97 return wp_date('Y/m/d H:i', $value);
98 };
99
100 $getStatusLabel = static function (array $item): string {
101 if (!empty($item['status_label']) && is_string($item['status_label'])) {
102 return $item['status_label'];
103 }
104 if (!empty($item['status']['description']) && is_string($item['status']['description'])) {
105 return $item['status']['description'];
106 }
107 return '-';
108 };
109
110 $getStatusClass = static function (array $item): string {
111 $name = '';
112 if (!empty($item['status']['name']) && is_string($item['status']['name'])) {
113 $name = strtolower($item['status']['name']);
114 }
115 $map = [
116 'created' => 'created',
117 'prepared' => 'prepared',
118 'confirmed' => 'confirmed',
119 'system_payment_created' => 'prepared',
120 'system_succeeded' => 'paid',
121 'wallet_charged' => 'paid',
122 'paid' => 'paid',
123 'rejected' => 'rejected',
124 'cancelled' => 'rejected',
125 'system_failed' => 'rejected',
126 ];
127 return $map[$name] ?? 'default';
128 };
129
130 $getMethodLabel = static function (array $item): string {
131 if (!empty($item['method']['description']) && is_string($item['method']['description'])) {
132 return $item['method']['description'];
133 }
134 return '-';
135 };
136
137 $renderApiError = static function (array $result): void {
138 $statusCode = isset($result['status_code']) ? (int) $result['status_code'] : 0;
139 $message = isset($result['message']) && is_string($result['message']) ? $result['message'] : 'خطای نا�
140 شخص در دریافت اطلاعات.';
141 ?>
142 <div class="notice notice-error inline">
143 <p>
144 <?php echo esc_html($message); ?>
145 <?php if ($statusCode > 0): ?>
146 <span>(HTTP <?php echo esc_html((string) $statusCode); ?>)</span>
147 <?php endif; ?>
148 </p>
149 </div>
150 <?php
151 };
152
153 $buildPageUrl = static function (int $active, int $history): string {
154 return add_query_arg([
155 'page' => 'sync_basalam_financial_management',
156 'sbp_active_page' => max(1, $active),
157 'sbp_history_page' => max(1, $history),
158 ], admin_url('admin.php'));
159 };
160
161 $activeTitle = 'درخواست‌های تسویه فعال';
162 $historyTitle = 'ترازهای تسویه شده';
163 ?>
164
165 <div class="basalam-container">
166 <div class="basalam-dashboard">
167
168 <!-- Balance Section -->
169 <div class="basalam-status-card">
170 <div class="basalam-status-header">
171 <h2 class="basalam-h">
172 <span class="dashicons dashicons-chart-line"></span>
173
174 دیریت �
175 الی غرفه
176 </h2>
177 </div>
178
179 <?php if (empty($balanceResult['success'])): ?>
180 <?php $renderApiError($balanceResult); ?>
181 <?php else: ?>
182 <div class="basalam-balance-grid">
183 <div class="basalam-balance-card">
184 <div class="basalam-balance-card__icon">
185 <span class="dashicons dashicons-chart-area"></span>
186 </div>
187 <div class="basalam-balance-card__content">
188 <h3>تراز غرفه</h3>
189 <div class="basalam-balance-card__value"><?php echo esc_html($maskLastDigit($balanceData['balance'] ?? null)); ?> تو�
190 ان</div>
191 <p>تراز غرفه تا ساعت <?php echo esc_html($formatJalaliTimestamp($balanceData['calculated_at'] ?? null)); ?></p>
192 </div>
193 </div>
194
195 <div class="basalam-balance-card basalam-balance-card--highlight">
196 <div class="basalam-balance-card__icon">
197 <span class="dashicons dashicons-building"></span>
198 </div>
199 <div class="basalam-balance-card__content">
200 <h3>تسویه بانکی سال جاری</h3>
201 <div class="basalam-balance-card__value basalam-balance-card__value--small"><?php echo esc_html($formatAmountWithUnit($balanceData['settled']['cash'] ?? null)); ?></div>
202 </div>
203 </div>
204
205 <div class="basalam-balance-card">
206 <div class="basalam-balance-card__icon">
207 <span class="dashicons dashicons-money"></span>
208 </div>
209 <div class="basalam-balance-card__content">
210 <h3>تسویه کیف پول سال جاری</h3>
211 <div class="basalam-balance-card__value basalam-balance-card__value--small"><?php echo esc_html($formatAmountWithUnit($balanceData['settled']['credit'] ?? null)); ?></div>
212 </div>
213 </div>
214 </div>
215
216 <div class="basalam-balance-actions">
217 <button
218 type="button"
219 class="basalam-balance-action basalam-balance-action--wallet"
220 data-method="2">
221 انتقال به کیف پول
222 </button>
223 <button
224 type="button"
225 class="basalam-balance-action basalam-balance-action--bank"
226 data-method="1">
227 انتقال به حساب بانکی
228 </button>
229 </div>
230 <?php endif; ?>
231 </div>
232
233 <!-- Active Settlements -->
234 <div class="basalam-status-card">
235 <div class="basalam-status-header">
236 <h2 class="basalam-h">
237 <span class="dashicons dashicons-list-view"></span>
238 <?php echo esc_html($activeTitle); ?>
239 </h2>
240 <?php if (!empty($activeSettlementsResult['success']) && !empty($activeItems)): ?>
241 <span class="basalam-badge-success">
242 <?php echo esc_html(sprintf('تعداد %s �
243 ورد', number_format_i18n((int) ($activeSettlementsData['total'] ?? count($activeItems))))); ?>
244 </span>
245 <?php endif; ?>
246 </div>
247
248 <?php if (empty($activeSettlementsResult['success'])): ?>
249 <?php $renderApiError($activeSettlementsResult); ?>
250 <?php elseif (empty($activeItems)): ?>
251 <div class="basalam-empty-state">
252 <span class="dashicons dashicons-yes-alt"></span>
253 <p>در حال حاضر درخواست تسویه فعالی وجود ندارد.</p>
254 </div>
255 <?php else: ?>
256 <div class="basalam-settlement-list">
257 <?php foreach ($activeItems as $item): ?>
258 <?php if (!is_array($item)) {
259 continue;
260 } ?>
261 <?php $statusClass = $getStatusClass($item); ?>
262 <div class="basalam-settlement-card">
263 <div class="basalam-settlement-card__top">
264 <span class="basalam-settlement-card__id">#<?php echo esc_html((string) ($item['id'] ?? '-')); ?></span>
265 <span class="basalam-settlement-card__amount"><?php echo esc_html($formatAmountWithUnit($item['amount'] ?? null)); ?></span>
266 </div>
267
268 <div class="basalam-settlement-card__meta">
269 <span class="basalam-status-badge basalam-status-badge--<?php echo esc_attr($statusClass); ?>">
270 <?php echo esc_html($getStatusLabel($item)); ?>
271 </span>
272 <span>
273 <span class="dashicons dashicons-calendar-alt"></span>
274 ثبت: <?php echo esc_html($formatJalaliTimestamp($item['created_at'] ?? null)); ?>
275 </span>
276 <span>
277 <span class="dashicons dashicons-clock"></span>
278 قابل پرداخت: <?php echo esc_html($formatJalaliTimestamp($item['payable_at'] ?? null)); ?>
279 </span>
280 </div>
281
282 <p class="basalam-settlement-card__description">
283 <?php echo esc_html((string) ($item['status_description'] ?? 'توضیح وضعیت �
284 وجود نیست.')); ?>
285 </p>
286 </div>
287 <?php endforeach; ?>
288 </div>
289
290 <?php if ($activeTotalPages > 1): ?>
291 <div class="basalam-pagination" role="navigation" aria-label="صفحه‌بندی تسویه فعال">
292 <?php if ($activePage > 1): ?>
293 <a class="page-numbers" href="<?php echo esc_url($buildPageUrl($activePage - 1, $historyPage)); ?>">قبلی</a>
294 <?php endif; ?>
295
296 <?php $activeStart = max(1, $activePage - 2); ?>
297 <?php $activeEnd = min($activeTotalPages, $activePage + 2); ?>
298 <?php for ($i = $activeStart; $i <= $activeEnd; $i++): ?>
299 <a class="page-numbers <?php echo $i === $activePage ? 'current' : ''; ?>" href="<?php echo esc_url($buildPageUrl($i, $historyPage)); ?>">
300 <?php echo esc_html(number_format_i18n($i)); ?>
301 </a>
302 <?php endfor; ?>
303
304 <?php if ($activePage < $activeTotalPages): ?>
305 <a class="page-numbers prev-next" href="<?php echo esc_url($buildPageUrl($activePage + 1, $historyPage)); ?>">بعدی</a>
306 <?php endif; ?>
307 </div>
308 <?php endif; ?>
309 <?php endif; ?>
310 </div>
311
312 <!-- Settlement History -->
313 <?php
314 echo FinancialManagementHistory::render([
315 'activePage' => $activePage,
316 'historyPage' => $historyPage,
317 'historyTitle' => $historyTitle,
318 'historyResult' => $historyResult,
319 'historyData' => $historyData,
320 'historyItems' => $historyItems,
321 'historyTotalPages' => $historyTotalPages,
322 ]);
323 ?>
324
325 </div>
326
327 <!-- Settlement Modal -->
328 <div id="basalam-settlement-modal" class="basalam-plus-modal-overlay" role="dialog" aria-modal="true" aria-label="درخواست تسویه">
329 <div class="basalam-plus-modal">
330 <div class="basalam-plus-modal__header">
331 <h3 class="basalam-plus-modal__title">انتقال به کیف پول</h3>
332 <button type="button" id="basalam-settlement-close" class="basalam-plus-modal__close" aria-label="بستن">&times;</button>
333 </div>
334
335 <!-- Step 1: Amount -->
336 <div id="basalam-settlement-step-1">
337 <div class="basalam-plus-modal__body">
338 <div class="basalam-plus-modal__balance-info">
339 تراز غرفه: <strong><?php echo esc_html($formatAmount($balanceData['balance'] ?? 0)); ?> تو�
340 ان</strong>
341 </div>
342 <label for="basalam-settlement-amount" class="basalam-plus-modal__label">�
343 بلغ (تو�
344 ان)</label>
345 <input
346 type="text"
347 id="basalam-settlement-amount"
348 class="basalam-plus-modal__input basalam-input"
349 inputmode="numeric"
350 placeholder="�
351 ثال: 100,000"
352 autocomplete="off"
353 data-max-balance="<?php echo esc_attr((int) (($balanceData['balance'] ?? 0) / 10)); ?>" />
354 <div id="basalam-settlement-balance-error" class="basalam-plus-modal__error basalam-plus-modal__balance-error" style="display:none;">
355
356 بلغ نباید بیشتر از تراز غرفه باشد
357 </div>
358 <div id="basalam-settlement-error" class="basalam-plus-modal__error" style="display:none;"></div>
359 <input type="hidden" id="basalam-settlement-method" value="2" />
360 <input type="hidden" id="basalam-settlement-investment-option-id" value="1" />
361 <input type="hidden" id="basalam-settlement-bank-account-id" value="" />
362 </div>
363 <div class="basalam-plus-modal__footer">
364 <button type="button" id="basalam-settlement-cancel" class="basalam-plus-modal__btn basalam-plus-modal__btn--secondary">
365 انصراف
366 </button>
367 <button type="button" id="basalam-settlement-next" class="basalam-plus-modal__btn basalam-plus-modal__btn--primary" style="display:none;">
368 بعدی
369 </button>
370 <button type="button" id="basalam-settlement-submit" class="basalam-plus-modal__btn basalam-plus-modal__btn--primary">
371 ثبت درخواست
372 </button>
373 </div>
374 </div>
375
376 <!-- Step 2: Bank Accounts -->
377 <div id="basalam-settlement-step-2" style="display:none;">
378 <div class="basalam-plus-modal__body">
379 <p class="basalam-plus-modal__label">حساب بانکی �
380 قصد را انتخاب کنید</p>
381 <div id="basalam-bank-accounts-list" class="basalam-bank-accounts-list">
382 <div class="basalam-bank-accounts-loading">در حال بارگذاری...</div>
383 </div>
384 <div id="basalam-bank-accounts-error" class="basalam-plus-modal__error" style="display:none;"></div>
385 </div>
386 <div class="basalam-plus-modal__footer">
387 <button type="button" id="basalam-settlement-back" class="basalam-plus-modal__btn basalam-plus-modal__btn--secondary">
388 بازگشت
389 </button>
390 <button type="button" id="basalam-settlement-submit-bank" class="basalam-plus-modal__btn basalam-plus-modal__btn--primary" disabled>
391 ثبت درخواست
392 </button>
393 </div>
394 </div>
395
396 </div>
397 </div>
398 </div>