feat: add cardNumber and IBAN fields to user and professor forms and import UI
This commit is contained in:
+5
-1
@@ -65,6 +65,8 @@
|
|||||||
"postalCode": "کد پستی",
|
"postalCode": "کد پستی",
|
||||||
"education": "میزان تحصیلات و رشته",
|
"education": "میزان تحصیلات و رشته",
|
||||||
"parentPhoneNumber": "تلفن همراه والد",
|
"parentPhoneNumber": "تلفن همراه والد",
|
||||||
|
"cardNumber": "شماره کارت",
|
||||||
|
"shabaNumber": "شماره شبا (IBAN)",
|
||||||
"address": "آدرس",
|
"address": "آدرس",
|
||||||
"tabInfo": "اطلاعات شخصی",
|
"tabInfo": "اطلاعات شخصی",
|
||||||
"tabCourses": "دورههای ثبتنامی",
|
"tabCourses": "دورههای ثبتنامی",
|
||||||
@@ -78,7 +80,9 @@
|
|||||||
"addProfessor": "افزودن استاد جدید",
|
"addProfessor": "افزودن استاد جدید",
|
||||||
"editProfessor": "ویرایش اطلاعات استاد",
|
"editProfessor": "ویرایش اطلاعات استاد",
|
||||||
"bio": "بیوگرافی / رزومه",
|
"bio": "بیوگرافی / رزومه",
|
||||||
"expertise": "تخصص ها"
|
"expertise": "تخصص ها",
|
||||||
|
"cardNumber": "شماره کارت",
|
||||||
|
"shabaNumber": "شماره شبا (IBAN)"
|
||||||
},
|
},
|
||||||
"courses": {
|
"courses": {
|
||||||
"title": "دورههای آموزشی",
|
"title": "دورههای آموزشی",
|
||||||
|
|||||||
@@ -35,6 +35,16 @@
|
|||||||
<InputText v-model.trim="form.email" class="w-full text-sm" dir="ltr" />
|
<InputText v-model.trim="form.email" class="w-full text-sm" dir="ltr" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="col-12 md:col-6 flex flex-column gap-2">
|
||||||
|
<label class="font-semibold text-sm">{{ $t('professors.cardNumber') }}</label>
|
||||||
|
<InputText v-model.trim="form.cardNumber" class="w-full text-sm" dir="ltr" placeholder="شماره کارت ۱۶ رقمی" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-12 md:col-6 flex flex-column gap-2">
|
||||||
|
<label class="font-semibold text-sm">{{ $t('professors.shabaNumber') }}</label>
|
||||||
|
<InputText v-model.trim="form.shabaNumber" class="w-full text-sm" dir="ltr" placeholder="شماره شبا (بدون IR یا با IR)" />
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="col-12 flex flex-column gap-2">
|
<div class="col-12 flex flex-column gap-2">
|
||||||
<label class="font-semibold text-sm">{{ $t('professors.bio') }}</label>
|
<label class="font-semibold text-sm">{{ $t('professors.bio') }}</label>
|
||||||
<Textarea v-model="form.bio" rows="3" class="w-full text-sm" />
|
<Textarea v-model="form.bio" rows="3" class="w-full text-sm" />
|
||||||
@@ -73,6 +83,8 @@ const form = reactive({
|
|||||||
nationalIdCode: '',
|
nationalIdCode: '',
|
||||||
phoneNumber: '',
|
phoneNumber: '',
|
||||||
email: '',
|
email: '',
|
||||||
|
cardNumber: '',
|
||||||
|
shabaNumber: '',
|
||||||
bio: ''
|
bio: ''
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -87,6 +99,8 @@ const fetchProfessor = async () => {
|
|||||||
nationalIdCode: data.nationalIdCode || data.nationalId || '',
|
nationalIdCode: data.nationalIdCode || data.nationalId || '',
|
||||||
phoneNumber: data.phoneNumber || data.phone || '',
|
phoneNumber: data.phoneNumber || data.phone || '',
|
||||||
email: data.email || '',
|
email: data.email || '',
|
||||||
|
cardNumber: data.cardNumber || '',
|
||||||
|
shabaNumber: data.shabaNumber || data.iban || '',
|
||||||
bio: data.bio || ''
|
bio: data.bio || ''
|
||||||
});
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
@@ -115,6 +129,8 @@ const handleSubmit = async () => {
|
|||||||
nationalIdCode: form.nationalIdCode,
|
nationalIdCode: form.nationalIdCode,
|
||||||
phoneNumber: form.phoneNumber,
|
phoneNumber: form.phoneNumber,
|
||||||
email: form.email || undefined,
|
email: form.email || undefined,
|
||||||
|
cardNumber: form.cardNumber || undefined,
|
||||||
|
shabaNumber: form.shabaNumber || undefined,
|
||||||
bio: form.bio || undefined
|
bio: form.bio || undefined
|
||||||
};
|
};
|
||||||
if (isEditMode.value) {
|
if (isEditMode.value) {
|
||||||
|
|||||||
@@ -419,7 +419,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p class="text-xs text-muted m-0 line-height-3">
|
<p class="text-xs text-muted m-0 line-height-3">
|
||||||
نمونه فایلها: <code dir="ltr">raw-data/import-data.json</code>،
|
نمونه فایلها: <code dir="ltr">raw-data/professors-import.json</code>،
|
||||||
|
<code dir="ltr">raw-data/import-data.json</code>،
|
||||||
<code dir="ltr">raw-data/taksa-tir-1405-import.json</code>
|
<code dir="ltr">raw-data/taksa-tir-1405-import.json</code>
|
||||||
و <code dir="ltr">raw-data/taksa-tir-1405-payments-import.json</code>
|
و <code dir="ltr">raw-data/taksa-tir-1405-payments-import.json</code>
|
||||||
</p>
|
</p>
|
||||||
@@ -430,6 +431,9 @@
|
|||||||
>
|
>
|
||||||
<div class="font-semibold mb-2">نتیجه آخرین بارگذاری</div>
|
<div class="font-semibold mb-2">نتیجه آخرین بارگذاری</div>
|
||||||
<ul class="m-0 pr-3 line-height-3">
|
<ul class="m-0 pr-3 line-height-3">
|
||||||
|
<li v-if="importResult.stats?.professorsCreated || importResult.stats?.professorsUpdated || importResult.stats?.professorsSkipped">
|
||||||
|
استاد جدید: {{ importResult.stats?.professorsCreated ?? 0 }} — بهروزرسانی: {{ importResult.stats?.professorsUpdated ?? 0 }} — رد شده: {{ importResult.stats?.professorsSkipped ?? 0 }}
|
||||||
|
</li>
|
||||||
<li>دوره جدید: {{ importResult.stats?.coursesCreated ?? 0 }} — بازاستفاده: {{ importResult.stats?.coursesReused ?? 0 }}</li>
|
<li>دوره جدید: {{ importResult.stats?.coursesCreated ?? 0 }} — بازاستفاده: {{ importResult.stats?.coursesReused ?? 0 }}</li>
|
||||||
<li>کلاس جدید: {{ importResult.stats?.classesCreated ?? 0 }} — بازاستفاده: {{ importResult.stats?.classesReused ?? 0 }}</li>
|
<li>کلاس جدید: {{ importResult.stats?.classesCreated ?? 0 }} — بازاستفاده: {{ importResult.stats?.classesReused ?? 0 }}</li>
|
||||||
<li>کاربر جدید: {{ importResult.stats?.studentsCreated ?? 0 }} — بهروزرسانی: {{ importResult.stats?.studentsUpdated ?? 0 }}</li>
|
<li>کاربر جدید: {{ importResult.stats?.studentsCreated ?? 0 }} — بهروزرسانی: {{ importResult.stats?.studentsUpdated ?? 0 }}</li>
|
||||||
|
|||||||
@@ -80,6 +80,14 @@
|
|||||||
<span class="text-muted text-xs block mb-1">تحصیلات</span>
|
<span class="text-muted text-xs block mb-1">تحصیلات</span>
|
||||||
<span class="font-bold text-color text-base">{{ user.education || '-' }}</span>
|
<span class="font-bold text-color text-base">{{ user.education || '-' }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-12 sm:col-6 md:col-4 mb-3">
|
||||||
|
<span class="text-muted text-xs block mb-1">شماره کارت</span>
|
||||||
|
<span class="font-bold text-color text-base" dir="ltr">{{ user.cardNumber || '-' }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 sm:col-6 md:col-4 mb-3">
|
||||||
|
<span class="text-muted text-xs block mb-1">شماره شبا (IBAN)</span>
|
||||||
|
<span class="font-bold text-color text-base" dir="ltr">{{ user.shabaNumber || user.iban || '-' }}</span>
|
||||||
|
</div>
|
||||||
<div class="col-12 mb-3">
|
<div class="col-12 mb-3">
|
||||||
<span class="text-muted text-xs block mb-1">آدرس سکونت</span>
|
<span class="text-muted text-xs block mb-1">آدرس سکونت</span>
|
||||||
<span class="text-color text-sm">{{ user.address || '-' }}</span>
|
<span class="text-color text-sm">{{ user.address || '-' }}</span>
|
||||||
|
|||||||
@@ -99,6 +99,16 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="col-12 md:col-6 flex flex-column gap-2">
|
||||||
|
<label class="font-semibold text-sm">{{ $t('users.cardNumber') }}</label>
|
||||||
|
<InputText v-model.trim="form.cardNumber" class="w-full text-sm" dir="ltr" placeholder="شماره کارت ۱۶ رقمی" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-12 md:col-6 flex flex-column gap-2">
|
||||||
|
<label class="font-semibold text-sm">{{ $t('users.shabaNumber') }}</label>
|
||||||
|
<InputText v-model.trim="form.shabaNumber" class="w-full text-sm" dir="ltr" placeholder="شماره شبا (بدون IR یا با IR)" />
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="col-12 flex flex-column gap-2">
|
<div class="col-12 flex flex-column gap-2">
|
||||||
<label class="font-semibold text-sm">{{ $t('users.address') }}</label>
|
<label class="font-semibold text-sm">{{ $t('users.address') }}</label>
|
||||||
<InputText v-model.trim="form.address" class="w-full text-sm" />
|
<InputText v-model.trim="form.address" class="w-full text-sm" />
|
||||||
@@ -275,6 +285,8 @@ const form = reactive({
|
|||||||
postalCode: '',
|
postalCode: '',
|
||||||
education: '',
|
education: '',
|
||||||
parentPhoneNumber: '',
|
parentPhoneNumber: '',
|
||||||
|
cardNumber: '',
|
||||||
|
shabaNumber: '',
|
||||||
address: '',
|
address: '',
|
||||||
username: '',
|
username: '',
|
||||||
password: '',
|
password: '',
|
||||||
@@ -296,6 +308,8 @@ const buildPayload = () => {
|
|||||||
postalCode: form.postalCode || undefined,
|
postalCode: form.postalCode || undefined,
|
||||||
education: form.education || undefined,
|
education: form.education || undefined,
|
||||||
parentPhoneNumber: form.parentPhoneNumber || undefined,
|
parentPhoneNumber: form.parentPhoneNumber || undefined,
|
||||||
|
cardNumber: form.cardNumber || undefined,
|
||||||
|
shabaNumber: form.shabaNumber || undefined,
|
||||||
address: form.address || undefined,
|
address: form.address || undefined,
|
||||||
adminNotes: (form.adminNotes || []).map((n) => String(n).trim()).filter(Boolean)
|
adminNotes: (form.adminNotes || []).map((n) => String(n).trim()).filter(Boolean)
|
||||||
};
|
};
|
||||||
@@ -347,6 +361,8 @@ const fetchUser = async () => {
|
|||||||
postalCode: data.postalCode || '',
|
postalCode: data.postalCode || '',
|
||||||
education: data.education || '',
|
education: data.education || '',
|
||||||
parentPhoneNumber: data.parentPhoneNumber || '',
|
parentPhoneNumber: data.parentPhoneNumber || '',
|
||||||
|
cardNumber: data.cardNumber || '',
|
||||||
|
shabaNumber: data.shabaNumber || data.iban || '',
|
||||||
address: data.address || '',
|
address: data.address || '',
|
||||||
username: data.username || '',
|
username: data.username || '',
|
||||||
password: '',
|
password: '',
|
||||||
|
|||||||
Reference in New Issue
Block a user