-
+
+
+ تومان
+
@@ -92,12 +98,18 @@
-
+
+
+ تومان
+
-
+
+
+ تومان
+
@@ -273,6 +285,7 @@
:course-id="form.course ? String(form.course) : ''"
:professor-id="form.professor ? String(form.professor) : null"
:default-session-count="defaultSessionCount"
+ :start-date="form.startDate"
:days="form.days"
:start-time="form.startTime"
:end-time="form.endTime"
@@ -308,6 +321,8 @@ import ConfirmDeleteDialog from '@/components/common/ConfirmDeleteDialog.vue';
import PermissionGate from '@/components/common/PermissionGate.vue';
import InputText from 'primevue/inputtext';
import InputNumber from 'primevue/inputnumber';
+import InputGroup from 'primevue/inputgroup';
+import InputGroupAddon from 'primevue/inputgroupaddon';
import Dropdown from 'primevue/select';
import MultiSelect from 'primevue/multiselect';
import InputSwitch from 'primevue/toggleswitch';
diff --git a/src/views/courses/CourseFormView.vue b/src/views/courses/CourseFormView.vue
index ddbbb35..e9fb103 100644
--- a/src/views/courses/CourseFormView.vue
+++ b/src/views/courses/CourseFormView.vue
@@ -25,7 +25,10 @@
-
+
+
+ تومان
+
{{ errors.price }}
@@ -158,6 +161,8 @@ import StatusTag from '@/components/common/StatusTag.vue';
import TableSkeleton from '@/components/common/TableSkeleton.vue';
import InputText from 'primevue/inputtext';
import InputNumber from 'primevue/inputnumber';
+import InputGroup from 'primevue/inputgroup';
+import InputGroupAddon from 'primevue/inputgroupaddon';
import Dropdown from 'primevue/select';
import Textarea from 'primevue/textarea';
import InputSwitch from 'primevue/toggleswitch';
diff --git a/src/views/payments/PaymentDetailView.vue b/src/views/payments/PaymentDetailView.vue
index 6e1a8ed..6a19a0b 100644
--- a/src/views/payments/PaymentDetailView.vue
+++ b/src/views/payments/PaymentDetailView.vue
@@ -152,7 +152,10 @@
-
+
+
+ تومان
+
@@ -198,7 +201,10 @@
-
+
+
+ تومان
+
diff --git a/src/views/payments/PaymentListView.vue b/src/views/payments/PaymentListView.vue
index 1efb7ca..bc94d37 100644
--- a/src/views/payments/PaymentListView.vue
+++ b/src/views/payments/PaymentListView.vue
@@ -109,7 +109,7 @@
:placeholder="createForm.classes?.length ? 'دانشجوی ثبتنامشده را انتخاب کنید' : 'ابتدا کلاس را انتخاب کنید'"
class="w-full text-sm"
:disabled="!createForm.classes?.length"
- @change="checkDuplicateInvoice"
+ @change="() => checkDuplicateInvoice()"
/>
هیچ دانشجوی ثبتنامشدهای در کلاسهای انتخابشده یافت نشد
@@ -132,7 +132,10 @@
-
+
+
+ تومان
+
@@ -142,14 +145,16 @@
-
+
+
+ تومان
+
مبلغ نهایی: {{ toPersianDigits(createPayableAmount.toLocaleString()) }} تومان
@@ -204,7 +209,10 @@
-
+
+
+ تومان
+
@@ -214,14 +222,16 @@
-
+
+
+ تومان
+
مبلغ نهایی هر صورتحساب: {{ toPersianDigits(bulkPayableAmount.toLocaleString()) }} تومان
@@ -298,6 +308,8 @@ import Dialog from 'primevue/dialog';
import Dropdown from 'primevue/select';
import MultiSelect from 'primevue/multiselect';
import InputNumber from 'primevue/inputnumber';
+import InputGroup from 'primevue/inputgroup';
+import InputGroupAddon from 'primevue/inputgroupaddon';
import Checkbox from 'primevue/checkbox';
import Textarea from 'primevue/textarea';
import DatePicker from 'vue3-persian-datetime-picker';
@@ -391,18 +403,33 @@ const eligibleUsers = computed(() => {
return usersList.value.filter((u) => eligibleIds?.has(String(u._id || u.id)));
});
+const extractId = (val) => {
+ if (!val) return null;
+ if (typeof val === 'object') {
+ if (val.value !== undefined && (typeof val.value === 'string' || typeof val.value === 'number')) {
+ return String(val.value);
+ }
+ return val._id ? String(val._id) : (val.id ? String(val.id) : null);
+ }
+ return String(val);
+};
+
const checkDuplicateInvoice = async (userIdVal = null) => {
- const targetUser = userIdVal || createForm.user;
- if (!targetUser || !createForm.classes || !createForm.classes.length) {
+ const targetUserId = extractId(userIdVal) || extractId(createForm.user);
+ if (!targetUserId || !createForm.classes || !createForm.classes.length) {
duplicateWarning.value = null;
return;
}
try {
const classIds = Array.isArray(createForm.classes)
- ? createForm.classes.map((c) => c?._id || c?.id || c).join(',')
- : String(createForm.classes);
+ ? createForm.classes.map(extractId).filter(Boolean).join(',')
+ : (extractId(createForm.classes) || '');
+ if (!classIds) {
+ duplicateWarning.value = null;
+ return;
+ }
const res = await paymentApi.checkDuplicate({
- userId: String(targetUser?._id || targetUser?.id || targetUser),
+ userId: targetUserId,
classes: classIds
});
duplicateWarning.value = res.data?.data || res.data || res;