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": "کد پستی",
|
||||
"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) {
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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: '',
|
||||
|
||||
Reference in New Issue
Block a user