PluginProbe
ووسلام – همگام سازی ووکامرس و باسلام / 1.10.23
ووسلام – همگام سازی ووکامرس و باسلام v1.10.23
1.10.23 1.10.22 1.10.21 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 All 56 releases
sync-basalam / assets / js / finance-balance-settlement.js

finance-balance-settlement.js in ووسلام – همگام سازی ووکامرس و باسلام 1.10.23, at assets/js/finance-balance-settlement.js

383 lines 12.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 (function () {
2 var config = window.syncBasalamBalanceSettlement;
3
4 if (!config || typeof window.fetch !== "function") {
5 return;
6 }
7
8 var overlay = document.getElementById("basalam-settlement-modal");
9 var amountInput = document.getElementById("basalam-settlement-amount");
10 var submitBtn = document.getElementById("basalam-settlement-submit");
11 var nextBtn = document.getElementById("basalam-settlement-next");
12 var cancelBtn = document.getElementById("basalam-settlement-cancel");
13 var closeBtn = document.getElementById("basalam-settlement-close");
14 var errorMessage = document.getElementById("basalam-settlement-error");
15 var methodInput = document.getElementById("basalam-settlement-method");
16 var investmentInput = document.getElementById("basalam-settlement-investment-option-id");
17 var bankAccountInput = document.getElementById("basalam-settlement-bank-account-id");
18
19 var step1 = document.getElementById("basalam-settlement-step-1");
20 var step2 = document.getElementById("basalam-settlement-step-2");
21 var backBtn = document.getElementById("basalam-settlement-back");
22 var submitBankBtn = document.getElementById("basalam-settlement-submit-bank");
23 var bankAccountsList = document.getElementById("basalam-bank-accounts-list");
24 var bankAccountsError = document.getElementById("basalam-bank-accounts-error");
25
26 var selectedBankAccountId = null;
27
28 function formatWithCommas(value) {
29 var num = value.replace(/\D/g, "");
30 return num.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
31 }
32
33 function getRawNumber(value) {
34 return parseInt(value.replace(/,/g, ""), 10) || 0;
35 }
36
37 function openModal(method) {
38 methodInput.value = method;
39 amountInput.value = "";
40 amountInput.classList.remove("basalam-plus-modal__input--error");
41 errorMessage.style.display = "none";
42 errorMessage.textContent = "";
43 selectedBankAccountId = null;
44
45 var balanceError = document.getElementById("basalam-settlement-balance-error");
46 if (balanceError) {
47 balanceError.style.display = "none";
48 }
49
50 // Show step 1, hide step 2
51 step1.style.display = "";
52 step2.style.display = "none";
53
54 // For bank transfer (method=1): show "بعدی", hide "ثبت درخواست"
55 // For wallet transfer (method=2): hide "بعدی", show "ثبت درخواست"
56 var isBank = parseInt(method, 10) === 1;
57 nextBtn.style.display = isBank ? "" : "none";
58 submitBtn.style.display = isBank ? "none" : "";
59
60 submitBtn.disabled = false;
61 submitBtn.textContent = config.submitText;
62
63 overlay.classList.add("is-open");
64 amountInput.focus();
65 }
66
67 function closeModal() {
68 overlay.classList.remove("is-open");
69 }
70
71 function showError(msg) {
72 errorMessage.textContent = msg;
73 errorMessage.style.display = "block";
74 }
75
76 function setLoading(loading) {
77 submitBtn.disabled = loading;
78 submitBtn.textContent = loading ? config.loadingText : config.submitText;
79 }
80
81 function setBankLoading(loading) {
82 submitBankBtn.disabled = loading;
83 submitBankBtn.textContent = loading ? config.loadingText : config.submitText;
84 }
85
86 function goToStep2() {
87 step1.style.display = "none";
88 step2.style.display = "";
89 fetchBankAccounts();
90 }
91
92 function goToStep1() {
93 step2.style.display = "none";
94 step1.style.display = "";
95 }
96
97 function fetchBankAccounts() {
98 bankAccountsList.innerHTML = '<div class="basalam-bank-accounts-loading">در حال بارگذاری...</div>';
99 bankAccountsError.style.display = "none";
100 selectedBankAccountId = null;
101 submitBankBtn.disabled = true;
102
103 var body = new URLSearchParams();
104 body.set("action", config.bankAccountsAction);
105 body.set("nonce", config.nonce);
106
107 window
108 .fetch(config.ajaxUrl, {
109 method: "POST",
110 credentials: "same-origin",
111 headers: {
112 Accept: "application/json",
113 "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
114 },
115 body: body.toString(),
116 })
117 .then(function (response) {
118 if (response.status === 403) {
119 window.syncBasalamFinanceLock();
120 throw new Error(config.bankAccountsError);
121 }
122 return response.json();
123 })
124 .then(function (payload) {
125 if (!payload || !payload.success) {
126 var msg = payload && payload.data && payload.data.message ? payload.data.message : config.bankAccountsError;
127 throw new Error(msg);
128 }
129
130 var accounts = payload.data && payload.data.accounts ? payload.data.accounts : [];
131 renderBankAccounts(accounts);
132 })
133 .catch(function (error) {
134 if (document.querySelector('.basalam-finance-page.is-locked')) {
135 return;
136 }
137 bankAccountsList.innerHTML = "";
138 bankAccountsError.textContent = error.message || config.bankAccountsError;
139 bankAccountsError.style.display = "block";
140 });
141 }
142
143 function renderBankAccounts(accounts) {
144 if (!accounts || accounts.length === 0) {
145 bankAccountsList.innerHTML = '<div class="basalam-bank-accounts-empty">حساب بانکی یافت نشد.</div>';
146 return;
147 }
148
149 var html = "";
150 for (var i = 0; i < accounts.length; i++) {
151 var acc = accounts[i];
152 var id = acc.id || "";
153 var owner = acc.account_owner || "-";
154 var bankName = acc.bank_name || "-";
155 var sheba = acc.sheba_number || "-";
156
157 html +=
158 '<label class="basalam-bank-account-item" data-id="' + id + '">' +
159 '<input type="radio" name="bank_account" value="' + id + '" class="basalam-bank-account-item__radio" />' +
160 '<div class="basalam-bank-account-item__content">' +
161 '<div class="basalam-bank-account-item__row">' +
162 '<span class="basalam-bank-account-item__label">صاحب حساب:</span>' +
163 '<span class="basalam-bank-account-item__value">' + owner + '</span>' +
164 '</div>' +
165 '<div class="basalam-bank-account-item__row">' +
166 '<span class="basalam-bank-account-item__label">بانک:</span>' +
167 '<span class="basalam-bank-account-item__value">' + bankName + '</span>' +
168 '</div>' +
169 '<div class="basalam-bank-account-item__row">' +
170 '<span class="basalam-bank-account-item__label">ش�
171 اره شبا:</span>' +
172 '<span class="basalam-bank-account-item__value basalam-bank-account-item__sheba">' + sheba + '</span>' +
173 '</div>' +
174 '</div>' +
175 '</label>';
176 }
177
178 bankAccountsList.innerHTML = html;
179 }
180
181 // Bank account selection
182 bankAccountsList.addEventListener("change", function (e) {
183 if (e.target.name !== "bank_account") {
184 return;
185 }
186
187 var id = e.target.value;
188 selectedBankAccountId = id;
189 bankAccountInput.value = id;
190 submitBankBtn.disabled = false;
191
192 // Highlight selected
193 var items = bankAccountsList.querySelectorAll(".basalam-bank-account-item");
194 for (var i = 0; i < items.length; i++) {
195 items[i].classList.toggle("is-selected", items[i].getAttribute("data-id") === id);
196 }
197 });
198
199 // Open modal on button click
200 document.addEventListener("click", function (e) {
201 var btn = e.target.closest(".basalam-balance-action");
202 if (!btn || btn.disabled) {
203 return;
204 }
205
206 var method = btn.getAttribute("data-method");
207 if (!method) {
208 return;
209 }
210
211 e.preventDefault();
212 openModal(parseInt(method, 10));
213
214 var title = btn.classList.contains("basalam-balance-action--wallet") ? config.walletTitle : config.bankTitle;
215 var modalTitle = overlay.querySelector(".basalam-plus-modal__title");
216 if (modalTitle) {
217 modalTitle.textContent = title;
218 }
219 });
220
221 // Format input with commas and validate against balance
222 amountInput.addEventListener("input", function () {
223 var cursorPos = this.selectionStart;
224 var before = this.value;
225 var formatted = formatWithCommas(this.value);
226 this.value = formatted;
227
228 var diff = formatted.length - before.length;
229 this.setSelectionRange(cursorPos + diff, cursorPos + diff);
230
231 // Reset error state on new input
232 this.classList.remove("basalam-plus-modal__input--error");
233 var balanceError = document.getElementById("basalam-settlement-balance-error");
234 if (balanceError) {
235 balanceError.style.display = "none";
236 }
237
238 // Validate against max balance
239 var maxBalance = parseInt(this.getAttribute("data-max-balance"), 10) || 0;
240 var rawAmount = getRawNumber(formatted);
241 if (maxBalance > 0 && rawAmount > maxBalance) {
242 this.classList.add("basalam-plus-modal__input--error");
243 if (balanceError) {
244 balanceError.style.display = "block";
245 }
246 }
247 });
248
249 // Close modal
250 cancelBtn.addEventListener("click", closeModal);
251 closeBtn.addEventListener("click", closeModal);
252
253 overlay.addEventListener("click", function (e) {
254 if (e.target === overlay) {
255 closeModal();
256 }
257 });
258
259 document.addEventListener("keydown", function (e) {
260 if (e.key === "Escape" && overlay.classList.contains("is-open")) {
261 closeModal();
262 }
263 });
264
265 // Validate amount helper
266 function validateAmount() {
267 var rawAmount = getRawNumber(amountInput.value);
268
269 if (rawAmount <= 0) {
270 showError(config.amountError);
271 return false;
272 }
273
274 if (amountInput.classList.contains("basalam-plus-modal__input--error")) {
275 return false;
276 }
277
278 return true;
279 }
280
281 // Next button (step 1 → step 2) for bank transfer
282 nextBtn.addEventListener("click", function () {
283 errorMessage.style.display = "none";
284 if (!validateAmount()) {
285 return;
286 }
287 goToStep2();
288 });
289
290 // Back button (step 2 → step 1)
291 backBtn.addEventListener("click", function () {
292 goToStep1();
293 });
294
295 // Submit settlement request (used by both wallet and bank)
296 function submitSettlement() {
297 var rawAmount = getRawNumber(amountInput.value);
298
299 if (!validateAmount()) {
300 return;
301 }
302
303 var rialAmount = rawAmount * 10;
304
305 errorMessage.style.display = "none";
306
307 var body = new URLSearchParams();
308 body.set("action", config.action);
309 body.set("nonce", config.nonce);
310 body.set("amount", String(rialAmount));
311 body.set("method", methodInput.value);
312
313 var investmentId = investmentInput ? investmentInput.value : "";
314 var bankAccountIdVal = bankAccountInput ? bankAccountInput.value : "";
315
316 if (investmentId !== "") {
317 body.set("investment_option_id", investmentId);
318 }
319 if (bankAccountIdVal !== "") {
320 body.set("bank_account_id", bankAccountIdVal);
321 }
322
323 return window.fetch(config.ajaxUrl, {
324 method: "POST",
325 credentials: "same-origin",
326 headers: {
327 Accept: "application/json",
328 "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
329 },
330 body: body.toString(),
331 })
332 .then(function (response) {
333 if (response.status === 403) {
334 window.syncBasalamFinanceLock();
335 throw new Error(config.errorMessage);
336 }
337 return response.json();
338 })
339 .then(function (payload) {
340 if (!payload || !payload.success) {
341 var msg = payload && payload.data && payload.data.message ? payload.data.message : config.errorMessage;
342 throw new Error(msg);
343 }
344
345 closeModal();
346 if (payload.data && payload.data.message) {
347 window.alert(payload.data.message);
348 } else {
349 window.alert(config.successMessage);
350 }
351 window.location.reload();
352 });
353 }
354
355 // Wallet submit (step 1 direct)
356 submitBtn.addEventListener("click", function () {
357 setLoading(true);
358 submitSettlement().catch(function (error) {
359 if (document.querySelector('.basalam-finance-page.is-locked')) {
360 return;
361 }
362 setLoading(false);
363 showError(error.message || config.errorMessage);
364 });
365 });
366
367 // Bank submit (step 2)
368 submitBankBtn.addEventListener("click", function () {
369 if (!selectedBankAccountId) {
370 return;
371 }
372 setBankLoading(true);
373 submitSettlement().catch(function (error) {
374 if (document.querySelector('.basalam-finance-page.is-locked')) {
375 return;
376 }
377 setBankLoading(false);
378 bankAccountsError.textContent = error.message || config.errorMessage;
379 bankAccountsError.style.display = "block";
380 });
381 });
382 })();
383