PluginProbe
ووسلام – همگام سازی ووکامرس و باسلام / 1.10.0
ووسلام – همگام سازی ووکامرس و باسلام v1.10.0
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 / includes / Registrar / AdminRegistrar.php

AdminRegistrar.php in ووسلام – همگام سازی ووکامرس و باسلام 1.10.0, at includes/Registrar/AdminRegistrar.php

385 lines 14.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace SyncBasalam\Registrar;
4
5 use SyncBasalam\Actions\RegisterActions;
6 use SyncBasalam\Admin\Pages;
7 use SyncBasalam\Registrar\Contracts\RegistrarInterface;
8 use SyncBasalam\Admin\Product\elements\ProductList\StatusColumn;
9 use SyncBasalam\Admin\Product\elements\ProductList\MetaBox;
10 use SyncBasalam\Admin\Product\elements\ProductList\BulkEdit;
11 use SyncBasalam\Admin\Product\elements\SingleProduct\Tab;
12 use SyncBasalam\Admin\Product\elements\SingleProduct\VideoField;
13 use SyncBasalam\Admin\Product\elements\ProductList\Filter;
14 use SyncBasalam\Admin\Product\elements\ProductList\Actions;
15 use SyncBasalam\Admin\Order\OrderColumn;
16 use SyncBasalam\Admin\Order\OrderMetaBox;
17 use SyncBasalam\Admin\Components\OrderPageComponents;
18 use SyncBasalam\Admin\Order\OrderStatuses;
19 use SyncBasalam\Admin\Product\ProductOperations;
20 use SyncBasalam\Admin\Product\Operations\ConnectProduct;
21 use SyncBasalam\Admin\Announcement\AnnouncementCenter;
22 use SyncBasalam\Admin\Onboarding\PointerTour;
23 use SyncBasalam\Services\SystemResourceMonitor;
24 use SyncBasalam\Utilities\ChatWidget;
25 use SyncBasalam\Admin\FinancialManagement\Menu as FinancialManagementMenu;
26 use SyncBasalam\Admin\FinancialManagement\BalanceSettlement;
27 use SyncBasalam\Admin\FinancialManagement\FinancialManagementHistory;
28
29 defined("ABSPATH") || exit;
30
31 class AdminRegistrar implements RegistrarInterface
32 {
33 public static function register(): void
34 {
35 $container = syncBasalamContainer();
36 $pages = $container->get(Pages::class);
37 $filter = $container->get(Filter::class);
38 $orderColumn = $container->get(OrderColumn::class);
39 $orderMetaBox = $container->get(OrderMetaBox::class);
40 $orderStatuses = $container->get(OrderStatuses::class);
41 $actions = $container->get(Actions::class);
42 $bulkEdit = $container->get(BulkEdit::class);
43
44 // Initialize Admin Actions
45 $container->get(RegisterActions::class);
46
47 // Admin Menu
48 \add_action("admin_menu", [$pages, "registerMenus"]);
49 \add_filter("script_loader_tag", [ChatWidget::class, "addTokenToWidgetScript"], 10, 3);
50
51 // Admin Scripts & Styles
52 \add_action("admin_enqueue_scripts", [self::class, "adminEnqueueStyles"]);
53 \add_action("admin_enqueue_scripts", [self::class, "adminEnqueueScripts"]);
54 \add_action("admin_enqueue_scripts", [self::class, "financialManagementEnqueueAssets"]);
55 \add_action("admin_footer", [AnnouncementCenter::class, 'renderPanel']);
56
57 // Financial Management (�
58 دیریت �
59 الی)
60 FinancialManagementHistory::register();
61 BalanceSettlement::register();
62
63 // Product Columns
64 \add_filter("manage_edit-product_columns", [StatusColumn::class, "registerStatusColumn"]);
65 \add_action("manage_product_posts_custom_column", [StatusColumn::class, "renderStatusColumnContent"], 10, 2);
66
67 // Product Meta Boxes
68 \add_action("add_meta_boxes_product", [MetaBox::class, "registerMetaBox"]);
69
70 // Basalam Product Settings Tab
71 \add_filter('woocommerce_product_data_tabs', [Tab::class, 'registerTab']);
72 \add_action('woocommerce_product_data_panels', [Tab::class, 'renderTabContent']);
73 \add_action('woocommerce_process_product_meta', [Tab::class, 'saveTabData']);
74
75 // Basalam Product Video Meta Box (sidebar, like product image/gallery)
76 \add_action('add_meta_boxes_product', [VideoField::class, 'registerMetaBox']);
77 \add_action('woocommerce_process_product_meta', [VideoField::class, 'save']);
78
79 // Product Filter
80 \add_action("restrict_manage_posts", [$filter, "renderFilterDropdown"]);
81 \add_action("pre_get_posts", [$filter, "applyFilterToQuery"]);
82
83 // Order Columns (HPOS)
84 \add_action("manage_woocommerce_page_wc-orders_custom_column", [$orderColumn, "renderColumn"], 10, 2);
85 \add_filter("manage_woocommerce_page_wc-orders_columns", [$orderColumn, "addColumn"]);
86
87 // Order Columns (Traditional CPT - non-HPOS)
88 \add_action("manage_shop_order_posts_custom_column", [$orderColumn, "renderColumn"], 10, 2);
89 \add_filter("manage_edit-shop_order_columns", [$orderColumn, "addColumn"]);
90
91 // Order Meta Boxes
92 \add_action("add_meta_boxes", [$orderMetaBox, "registerMetaBox"], 10);
93
94 // Order Meta Boxes (Traditional CPT - non-HPOS)
95 \add_action("add_meta_boxes_shop_order", [$orderMetaBox, "registerMetaBox"], 10);
96
97 // Order Statuses
98 \add_filter("wc_order_statuses", [$orderStatuses, "registerorderStatuses"]);
99
100 // Order Stock Levels
101 \add_action("woocommerce_order_status_bslm-rejected", "wc_maybe_increase_stock_levels");
102 \add_action("woocommerce_order_status_bslm-preparation", "wc_maybe_reduce_stock_levels");
103 \add_action("woocommerce_order_status_bslm-shipping", "wc_maybe_reduce_stock_levels");
104 \add_action("woocommerce_order_status_bslm-completed", "wc_maybe_reduce_stock_levels");
105
106 // Bulk Actions
107 \add_filter("bulk_actions-edit-product", [$actions, "registerBulkActions"]);
108 \add_filter("handle_bulk_actions-edit-product", [$actions, "handleBulkAction"], 10, 3);
109 \add_action('bulk_edit_custom_box', [$bulkEdit, 'renderFields'], 10, 2);
110 \add_action('admin_action_sync_basalam_bulk_edit', [$bulkEdit, 'save']);
111
112 // Product Duplicate
113 \add_action("woocommerce_product_duplicate", function ($newProduct) {
114 ProductOperations::disconnectProduct($newProduct->get_id());
115 }, 10, 1);
116
117 // Order Check Buttons (HPOS)
118 \add_action("woocommerce_order_list_table_extra_tablenav", [OrderPageComponents::class, "renderCheckOrdersButton"], 20, 1);
119
120 // Order Check Buttons (Traditional CPT - uses same hook as product filter)
121 \add_action("restrict_manage_posts", [OrderPageComponents::class, "renderCheckOrdersButtonTraditional"]);
122
123 // Initialize AJAX handlers
124 $connectProduct = $container->get(ConnectProduct::class);
125 add_action('wp_ajax_basalam_search_products', [$connectProduct, 'handleSearchProducts']);
126 add_action('wp_ajax_sync_basalam_mark_pointer_onboarding_completed', [PointerTour::class, 'markPointerOnboardingCompleted']);
127 add_action('wp_ajax_' . AnnouncementCenter::MARK_SEEN_ACTION, [AnnouncementCenter::class, 'markAllSeen']);
128 add_action('wp_ajax_' . AnnouncementCenter::FETCH_PAGE_ACTION, [AnnouncementCenter::class, 'fetchPage']);
129
130 // Tasks per minute calculation handler
131 add_action('wp_ajax_basalam_calculate_tasks_per_minute', function () {
132 check_ajax_referer('basalam_update_setting_nonce', 'nonce', true);
133
134 $monitor = syncBasalamContainer()->get(SystemResourceMonitor::class);
135 $optimal = $monitor->calculateOptimalTasksPerMinute();
136
137 wp_send_json_success([
138 'optimal_tasks_per_minute' => $optimal
139 ]);
140 });
141 }
142
143
144 public static function assetsUrl($path = null)
145 {
146 return plugin_dir_url(dirname(__FILE__, 2)) . "assets/" . $path;
147 }
148
149 public static function adminEnqueueStyles($hook = '')
150 {
151 $version = syncbasalamplugin()->getVersion();
152
153 wp_enqueue_style(
154 "basalam-admin-style",
155 self::assetsUrl("css/style.css"),
156 array(),
157 $version
158 );
159 wp_enqueue_style(
160 "basalam-admin-font-style",
161 self::assetsUrl("css/font.css"),
162 array(),
163 $version
164 );
165 wp_enqueue_style(
166 "basalam-admin-social-style",
167 self::assetsUrl("css/social.css"),
168 array(),
169 $version
170 );
171 wp_enqueue_style(
172 "basalam-admin-logs-style",
173 self::assetsUrl("css/logs.css"),
174 array(),
175 $version
176 );
177 wp_enqueue_style(
178 "basalam-admin-onboarding-style",
179 self::assetsUrl("css/onboarding.css"),
180 array(),
181 $version
182 );
183 wp_enqueue_style(
184 "basalam-admin-toast-style",
185 self::assetsUrl("css/toast.css"),
186 array(),
187 $version
188 );
189
190 if (PointerTour::shouldLoadPointerTour((string) $hook)) {
191 wp_enqueue_style('wp-pointer');
192 }
193 }
194
195 public static function adminEnqueueScripts($hook = '')
196 {
197 $shouldLoadPointerTour = PointerTour::shouldLoadPointerTour((string) $hook);
198 $version = syncbasalamplugin()->getVersion();
199
200 if ($shouldLoadPointerTour) {
201 wp_enqueue_script('wp-pointer');
202 }
203
204 wp_enqueue_script(
205 "basalam-admin-toast-script",
206 self::assetsUrl("js/toast.js"),
207 [],
208 $version,
209 true
210 );
211 wp_enqueue_script(
212 "basalam-admin-logs-script",
213 self::assetsUrl("js/logs.js"),
214 ["jquery", "basalam-admin-toast-script"],
215 $version,
216 true
217 );
218 wp_enqueue_script(
219 "basalam-admin-help-script",
220 self::assetsUrl("js/help.js"),
221 ["jquery", "basalam-admin-toast-script"],
222 $version,
223 true
224 );
225 wp_enqueue_script(
226 "basalam-admin-product-fields-script",
227 self::assetsUrl("js/product-fields.js"),
228 ["jquery", "basalam-admin-toast-script"],
229 $version,
230 true
231 );
232 wp_enqueue_script(
233 "basalam-admin-manage-box-script",
234 self::assetsUrl("js/manage-box.js"),
235 ["jquery", "basalam-admin-toast-script"],
236 $version,
237 true
238 );
239 wp_enqueue_script(
240 "basalam-admin-connect-modal-script",
241 self::assetsUrl("js/connect-modal.js"),
242 ["jquery", "basalam-admin-toast-script"],
243 $version,
244 true
245 );
246 wp_enqueue_script(
247 "basalam-round-script",
248 self::assetsUrl("js/round.js"),
249 ["jquery", "basalam-admin-toast-script"],
250 $version,
251 true
252 );
253 wp_enqueue_script(
254 "basalam-get-category-script",
255 self::assetsUrl("js/get-category.js"),
256 ["jquery", "basalam-admin-toast-script"],
257 $version,
258 true
259 );
260 wp_enqueue_script(
261 "basalam-order-script",
262 self::assetsUrl("js/order.js"),
263 ["jquery", "basalam-admin-toast-script"],
264 $version,
265 true
266 );
267 wp_enqueue_script(
268 "basalam-admin-script",
269 self::assetsUrl("js/admin.js"),
270 $shouldLoadPointerTour ? ["jquery", "wp-pointer", "basalam-admin-toast-script"] : ["jquery", "basalam-admin-toast-script"],
271 $version,
272 true
273 );
274 wp_enqueue_script(
275 "basalam-check-sync-script",
276 self::assetsUrl("js/check-sync.js"),
277 ["jquery", "basalam-admin-toast-script"],
278 $version,
279 true
280 );
281 wp_enqueue_script(
282 "basalam-map-category-option-script",
283 self::assetsUrl("js/map-category-option.js"),
284 ["jquery", "basalam-admin-toast-script"],
285 $version,
286 true
287 );
288
289 wp_enqueue_script(
290 "basalam-generate-product-variation-script",
291 self::assetsUrl("js/generate-product-variation.js"),
292 ["jquery", "basalam-admin-toast-script"],
293 $version,
294 true
295 );
296
297 wp_enqueue_script(
298 "basalam-ticket-script",
299 self::assetsUrl("js/ticket.js"),
300 ["basalam-admin-toast-script"],
301 $version,
302 true
303 );
304
305 if (ChatWidget::shouldLoadWidget()) {
306 wp_enqueue_script(
307 "basalam-chat-widget-script",
308 self::assetsUrl("chat/widget-loader.js"),
309 [],
310 $version,
311 true
312 );
313 }
314
315 if ($shouldLoadPointerTour) {
316 wp_localize_script('basalam-admin-script', 'basalamPointerTour', PointerTour::getPointerTourConfig());
317 }
318
319 if (AnnouncementCenter::shouldLoadAnnouncement()) {
320 wp_localize_script('basalam-admin-script', 'basalamAnnouncements', AnnouncementCenter::getConfig());
321 }
322 }
323
324 public static function financialManagementEnqueueAssets($hook = '')
325 {
326 $page = isset($_GET['page']) ? sanitize_text_field(wp_unslash($_GET['page'])) : '';
327 if ($page !== FinancialManagementMenu::PAGE_SLUG) {
328 return;
329 }
330
331 $version = syncbasalamplugin()->getVersion();
332
333 wp_enqueue_style(
334 'sync-basalam-finance-style',
335 self::assetsUrl('css/finance.css'),
336 [],
337 $version
338 );
339
340 wp_enqueue_script(
341 'sync-basalam-finance-history-pagination',
342 self::assetsUrl('js/finance-history-pagination.js'),
343 [],
344 $version,
345 true
346 );
347
348 wp_localize_script('sync-basalam-finance-history-pagination', 'syncBasalamHistoryPagination', [
349 'ajaxUrl' => admin_url('admin-ajax.php'),
350 'action' => FinancialManagementHistory::AJAX_ACTION,
351 'nonce' => wp_create_nonce(FinancialManagementHistory::AJAX_ACTION),
352 'pageSlug' => FinancialManagementMenu::PAGE_SLUG,
353 'errorMessage' => 'بارگذاری تاریخچه تسویه انجا�
354 نشد.',
355 ]);
356
357 wp_enqueue_script(
358 'sync-basalam-finance-balance-settlement',
359 self::assetsUrl('js/finance-balance-settlement.js'),
360 [],
361 $version,
362 true
363 );
364
365 wp_localize_script('sync-basalam-finance-balance-settlement', 'syncBasalamBalanceSettlement', [
366 'ajaxUrl' => admin_url('admin-ajax.php'),
367 'action' => BalanceSettlement::AJAX_ACTION,
368 'bankAccountsAction' => BalanceSettlement::AJAX_ACTION_BANK_ACCOUNTS,
369 'nonce' => wp_create_nonce(BalanceSettlement::AJAX_ACTION),
370 'submitText' => 'ثبت درخواست',
371 'loadingText' => 'در حال ارسال...',
372 'errorMessage' => 'خطا در ثبت درخواست تسویه.',
373 'successMessage' => 'درخواست تسویه با �
374 وفقیت ثبت شد.',
375 'amountError' => 'لطفاً �
376 بلغ �
377 عتبری وارد کنید.',
378 'walletTitle' => 'انتقال به کیف پول',
379 'bankTitle' => 'انتقال به حساب بانکی',
380 'bankAccountsError' => 'خطا در دریافت لیست حساب‌های بانکی.',
381 ]);
382 }
383
384 }
385