feat: add cardNumber and IBAN fields to user and professor forms and import UI

This commit is contained in:
2026-08-21 12:56:23 +03:30
parent 26762e4dac
commit f9a3f555eb
5 changed files with 50 additions and 2 deletions
+5 -1
View File
@@ -65,6 +65,8 @@
"postalCode": "کد پستی",
"education": "میزان تحصیلات و رشته",
"parentPhoneNumber": "تلفن همراه والد",
"cardNumber": "شماره کارت",
"shabaNumber": "شماره شبا (IBAN)",
"address": "آدرس",
"tabInfo": "اطلاعات شخصی",
"tabCourses": "دوره‌های ثبت‌نامی",
@@ -78,7 +80,9 @@
"addProfessor": "افزودن استاد جدید",
"editProfessor": "ویرایش اطلاعات استاد",
"bio": "بیوگرافی / رزومه",
"expertise": "تخصص ها"
"expertise": "تخصص ها",
"cardNumber": "شماره کارت",
"shabaNumber": "شماره شبا (IBAN)"
},
"courses": {
"title": "دوره‌های آموزشی",
@@ -35,6 +35,16 @@
<InputText v-model.trim="form.email" class="w-full text-sm" dir="ltr" />
</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">
<label class="font-semibold text-sm">{{ $t('professors.bio') }}</label>
<Textarea v-model="form.bio" rows="3" class="w-full text-sm" />
@@ -73,6 +83,8 @@ const form = reactive({
nationalIdCode: '',
phoneNumber: '',
email: '',
cardNumber: '',
shabaNumber: '',
bio: ''
});
@@ -87,6 +99,8 @@ const fetchProfessor = async () => {
nationalIdCode: data.nationalIdCode || data.nationalId || '',
phoneNumber: data.phoneNumber || data.phone || '',
email: data.email || '',
cardNumber: data.cardNumber || '',
shabaNumber: data.shabaNumber || data.iban || '',
bio: data.bio || ''
});
} catch (err) {
@@ -115,6 +129,8 @@ const handleSubmit = async () => {
nationalIdCode: form.nationalIdCode,
phoneNumber: form.phoneNumber,
email: form.email || undefined,
cardNumber: form.cardNumber || undefined,
shabaNumber: form.shabaNumber || undefined,
bio: form.bio || undefined
};
if (isEditMode.value) {
+5 -1
View File
@@ -419,7 +419,8 @@
</div>
<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-payments-import.json</code>
</p>
@@ -430,6 +431,9 @@
>
<div class="font-semibold mb-2">نتیجه آخرین بارگذاری</div>
<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?.classesCreated ?? 0 }} بازاستفاده: {{ importResult.stats?.classesReused ?? 0 }}</li>
<li>کاربر جدید: {{ importResult.stats?.studentsCreated ?? 0 }} بهروزرسانی: {{ importResult.stats?.studentsUpdated ?? 0 }}</li>
+8
View File
@@ -80,6 +80,14 @@
<span class="text-muted text-xs block mb-1">تحصیلات</span>
<span class="font-bold text-color text-base">{{ user.education || '-' }}</span>
</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">
<span class="text-muted text-xs block mb-1">آدرس سکونت</span>
<span class="text-color text-sm">{{ user.address || '-' }}</span>
+16
View File
@@ -99,6 +99,16 @@
/>
</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">
<label class="font-semibold text-sm">{{ $t('users.address') }}</label>
<InputText v-model.trim="form.address" class="w-full text-sm" />
@@ -275,6 +285,8 @@ const form = reactive({
postalCode: '',
education: '',
parentPhoneNumber: '',
cardNumber: '',
shabaNumber: '',
address: '',
username: '',
password: '',
@@ -296,6 +308,8 @@ const buildPayload = () => {
postalCode: form.postalCode || undefined,
education: form.education || undefined,
parentPhoneNumber: form.parentPhoneNumber || undefined,
cardNumber: form.cardNumber || undefined,
shabaNumber: form.shabaNumber || undefined,
address: form.address || undefined,
adminNotes: (form.adminNotes || []).map((n) => String(n).trim()).filter(Boolean)
};
@@ -347,6 +361,8 @@ const fetchUser = async () => {
postalCode: data.postalCode || '',
education: data.education || '',
parentPhoneNumber: data.parentPhoneNumber || '',
cardNumber: data.cardNumber || '',
shabaNumber: data.shabaNumber || data.iban || '',
address: data.address || '',
username: data.username || '',
password: '',