archive added

This commit is contained in:
sedmedgh
2022-04-28 13:49:07 +04:30
parent fbf3b73279
commit 2a581d7eb4
11 changed files with 328 additions and 36 deletions
+6 -1
View File
@@ -99,4 +99,9 @@
.has-error .vpd-input-group{
border: 1px solid #f5222d;
border-radius: 5px;
}
}
.ant-tabs-ink-bar {
left: auto !important;
right: auto !important;
transform-origin: 0 !important;
}
@@ -118,7 +118,7 @@
.feather-icon{
color: #565656;
margin-right: 14px;
margin-left: 14px;
.feather{
width: 20px;
height:20px;
@@ -10,7 +10,7 @@ export default [
},
{
url: '/config',
icon: 'LayersIcon',
icon: 'SlidersIcon',
i18n: 'پیکربندی',
slug: 'config',
permissionId:'config'
@@ -19,7 +19,7 @@ export default [
url: "/proposal",
name: "proposal",
slug: "proposal",
icon: "AlignJustifyIcon",
icon: "FileTextIcon",
i18n: "درخواست ها",
permissionId:'request'
},
@@ -27,7 +27,7 @@ export default [
url: "/personel",
name: "personel",
slug: "personel",
icon: "AlignJustifyIcon",
icon: "UsersIcon",
i18n: "اطلاعات پرسنلی",
permissionId:'personnel'
},
@@ -43,7 +43,7 @@ export default [
url: "/permission",
name: "permission",
slug: "permission",
icon: "AlignJustifyIcon",
icon: "SettingsIcon",
i18n: "سطح دسترسی",
permissionId:'permission.show'
},
@@ -54,6 +54,14 @@ export default [
icon: "UserIcon",
i18n: "کاربران",
permissionId:'user'
},
{
url: "/restore",
name: "restore",
slug: "restore",
icon: "ArchiveIcon",
i18n: "بایگانی",
permissionId:'archive'
}
]
+9
View File
@@ -117,6 +117,15 @@ const router = new Router({
parent: 'main'
}
},
{
path: '/restore',
name: 'users',
component: () => import('./views/restore/restore.vue'),
meta: {
rule: 'editor',
parent: 'main'
}
},
{
path: '/register/users',
name: 'register-users',
+16 -10
View File
@@ -4,9 +4,9 @@
<a-spin :spinning="showLoading" tip="در حال دریافت اطلاعات">
<div class="spin-content">
<a-card>
<a-button @click="$router.push('/register/personnel')" :disabled="!$getAccess('personnel.create')">
<!-- <a-button @click="$router.push('/register/personnel')" :disabled="!$getAccess('personnel.create')">
ثبت پرسنل جدید
</a-button>
</a-button>-->
<x-table ref="personelTbl" class="mt-4"
:model="cols">
<template slot="operator" slot-scope="text,record">
@@ -149,7 +149,9 @@
<input class="ant-input" autocomplete="off" v-decorator="['proposal.iden_place']"/>
</a-form-item>
<a-form-item label="محل تولد">
<input class="ant-input" autocomplete="off" v-decorator="['proposal.birth_place']"/>
<input class="ant-input" autocomplete="off" v-decorator="['proposal.birth_place',{rules: [{
pattern: /^([\u0600-\u06FF\uFB8A\u067E\u0686\u06AF\u200C ])+$/,
message: `محل صدور باید فارسی باشد `, }]}]"/>
</a-form-item>
<a-form-item label="ایمیل">
<input class="ant-input" autocomplete="off" v-decorator="['proposal.email']"/>
@@ -255,11 +257,11 @@
</a-radio-group>
</a-form-item>
</div>
<div v-if="flags.marriage_sts == 2">
<!-- v-if="flags.marriage_sts == 2"-->
<div>
<a-form-item label="تعداد فرزند">
<input class="ant-input"
v-decorator="['proposal.count_child',{rules: [{ required: true, message: 'لطفا مقدار را وارد کنید' },{ pattern: /^[0-9]+$/, message: 'فقط عدد مجاز است' }] }]"/>
v-decorator="['proposal.count_child',{rules: [{ required: false, message: 'لطفا مقدار را وارد کنید' },{ pattern: /^[0-9]+$/, message: 'فقط عدد مجاز است' }] }]"/>
</a-form-item>
</div>
<div v-if="flags.gender == 1">
@@ -516,7 +518,8 @@
<a-button :disabled="!$getAccess('personnel.train.create')" class="mt-4 ml-2"
@click="showAddEducationalInformation=true;isAlertUpload = false">افزودن ردیف
</a-button>
<a-button type="primary" @click="savefromPersonel" class="mt-5" :disabled="checkPermission('2')">
<a-button type="primary" @click="savefromPersonel" class="mt-5" :disabled="checkPermission('2')"
v-if="training && training.length > 0">
ویرایش
</a-button>
</a-tab-pane>
@@ -666,7 +669,8 @@
</a-list-item>
</a-list>
<a-button class="mt-3 ml-2" @click="showAddContract = true">افزودن ردیف</a-button>
<a-button type="primary" @click="savefromPersonel" class="mt-5" :disabled="checkPermission('3')">
<a-button type="primary" @click="savefromPersonel" class="mt-5" :disabled="checkPermission('3')"
v-if="contract && contract.length > 0">
ویرایش
</a-button>
</a-tab-pane>
@@ -808,7 +812,8 @@
<a-button class="ml-2" :disabled="!$getAccess('personnel.function.create')"
@click="showAddPerformance=true">افزودن ردیف
</a-button>
<a-button type="primary" @click="savefromPersonel" class="mt-5" :disabled="checkPermission('6')">
<a-button type="primary" @click="savefromPersonel" class="mt-5" :disabled="checkPermission('6')"
v-if="estimate && estimate.length > 0">
ویرایش
</a-button>
</a-tab-pane>
@@ -845,7 +850,8 @@
<a-button :disabled="!$getAccess('personnel.rule.create')" class="mt-4 ml-2"
@click="showAddDocument=true;isAlertUpload = false">افزودن ردیف
</a-button>
<a-button type="primary" @click="savefromPersonel" class="mt-5" :disabled="checkPermission('7')">
<a-button type="primary" @click="savefromPersonel" class="mt-5" :disabled="checkPermission('7')"
v-if="writ && writ.length > 0">
ویرایش
</a-button>
</a-tab-pane>
+75 -3
View File
@@ -6,7 +6,7 @@
<a-switch default-checked class="mr-2"/>
</a-form-item>
</div>-->
<x-table :model="cols" class="mt-3">
<x-table :model="cols" ref="proposalTbl" class="mt-3">
<template slot="operator" slot-scope="text,record">
<a-dropdown>
<a class="ant-dropdown-link" @click="e => e.preventDefault()">
@@ -29,6 +29,12 @@
<a-menu-item v-if="$getAccess('request.employment') && !text.record.employed">
<a href="javascript:;" @click="showSetEmployeModal(text.record.id)">استخدام</a>
</a-menu-item>
<a-menu-item v-if="$getAccess('request.delete')">
<a href="javascript:;" @click="deleteProposal(text.record.id)">حذف درخواست</a>
</a-menu-item>
<a-menu-item v-if="$getAccess('personnel.type') && text.record.employed">
<a href="javascript:;" @click="showUpdateTypeModal(text.record.id)">تغییر نوع کاربری درخواست</a>
</a-menu-item>
</a-menu>
</a-dropdown>
</template>
@@ -591,14 +597,40 @@
</div>
</a-modal>
<a-modal force-render v-model="setEmployeModel" :closable="false" ok-text="بله" cancel-text="خیر" @ok="setEmploye">
<template #title>
<div class="flex justify-between">
<a-icon type="alert-circle" style="color:#faad14"/>
<div>
آیا مطمئن به استخدام هستید ؟
</div>
<a-icon type="question-circle" style="color:#faad14"/>
</div>
</template>
<a-spin type="loading" :spinning="loading">
<div>در صورتی که گزینه تایید را انتخاب نمایید فرد مورد نظر به عنوان پرسنل در سیستم ثبت می شود</div>
<a-form :form="fromPersonel">
<a-form-item label="نمایش برای نوع کاربری">
<a-select v-decorator="['user_type',{ rules:[{ required: true, message: 'نوع کاربری را وارد نمایید' }] }]" style="width: 120px">
<a-select-option v-for="item in userTypes" :value="item.id">
{{ item.value }}
</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="id" class="hidden">
<a-innput v-decorator="['id',{ rules:[{ required: true, message: 'نوع کاربری را وارد نمایید' }] }]" />
</a-form-item>
</a-form>
</a-spin>
</a-modal>
<a-modal force-render v-model="updateType" :closable="false" ok-text="بله" cancel-text="خیر" @ok="updateTypeProposal">
<template #title>
<div class="flex justify-between">
<a-icon type="alert-circle" style="color:#faad14"/>
<div>
آیا مطمئن به ویرایش هستید ؟
</div>
</div>
</template>
@@ -956,6 +988,7 @@ export default {
fromMosahebe2: this.$form.createForm(this, {name: 'coordinated'}),
fromPersonel: this.$form.createForm(this, {name: 'coordinated'}),
setEmployeModel: false,
updateType: false,
loading: false,
userTypes: [],
}
@@ -1111,12 +1144,51 @@ export default {
this.$message.error('خطا در دریافت اطلاعات');
});
},
async deleteProposal(id) {
try {
this.is_skeleton = true
await axios.get(`proposal/delete/${id}`)
this.$refs.proposalTbl.fetch()
this.$ntSet()
} catch (e) {
this.$ntSetError()
} finally {
this.is_skeleton = false
}
},
async updateTypeProposal(e) {
e.preventDefault();
this.fromPersonel.validateFields(async (err, values) => {
try {
if (!err) {
this.loading = true
await axios.get(`personnel/update/type/${values.id}/${values.user_type}`)
this.setEmployeModel = false
this.$refs.proposalTbl.fetch()
this.$ntSet()
}
else{
this.$message.error('انتخاب نوع کاربر الزامی است')
}
} catch ({message}) {
this.$message.error('این کاربر قبلا استخدام شده است.')
} finally {
this.loading = false
}
})
},
showSetEmployeModal(id) {
this.setEmployeModel = true
this.fromPersonel.setFieldsValue({
id
})
},
showUpdateTypeModal(id) {
this.updateType = true
this.fromPersonel.setFieldsValue({
id
})
},
async setEmploye(e) {
e.preventDefault();
this.fromPersonel.validateFields(async (err, values) => {
+16 -11
View File
@@ -1,9 +1,9 @@
<template>
<div class="mx-5">
<div class="flex justify-center">
<router-link to="/" class="flex justify-center">
<img src="@/assets/images/logo.svg" width="150px" class="mt-10"/>
</div>
</router-link>
<vx-card class="mx-auto mt-10">
<a-steps :current="current" v-show="current<2">
@@ -139,17 +139,18 @@
</a-radio-group>
</a-form-item>
<a-form-item label="شماره حساب بانک پاسارگاد">
<input class="ant-input" autocomplete="off"
v-decorator="['pasargad_bank_number',{initialValue: null},{ rules: [{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'},] }]"/>
<a-input-number class="w-full" autocomplete="off"
v-decorator="['pasargad_bank_number',{initialValue: null}]"/>
</a-form-item>
<a-form-item label="حقوق درخواستی">
<input class="ant-input" autocomplete="off"
v-decorator="['requested_salary',{initialValue: null,rules: [{ required: true, message: 'حقوق درخواستی را وارد نمایید' },{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'}]}]"/>
</a-form-item>
<a-form-item label="تعداد فرزند" v-if="flags.marriage_sts == 2">
<!-- v-if="flags.marriage_sts == 2"-->
<a-form-item label="تعداد فرزند">
<input class="ant-input"
v-decorator="['count_child',{rules: [{ required: true, message: 'لطفا مقدار را وارد کنید' },{ pattern: /^[0-9]+$/,type: 'string', message: 'فقط عدد مجاز است' }] }]"/>
v-decorator="['count_child',{rules: [{ required: false, message: 'لطفا مقدار را وارد کنید' },{ pattern: /^[0-9]+$/,type: 'string', message: 'فقط عدد مجاز است' }] }]"/>
</a-form-item>
<a-form-item label="وضعیت نظام وظیفه" v-if="flags.gender == 1">
@@ -170,7 +171,7 @@
<div class="grid sm:grid-cols-1 md:grid-cols-4 lg:grid-cols-4 gap-4">
<a-form-item label="شماره شناسنامه">
<input class="ant-input" autocomplete="off"
v-decorator="['iden_code',{initialValue: null,rules: [{ required: true, message: 'شماره شناسنامه را وارد نمایید' },{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'}]}]"/>
v-decorator="['iden_code',{rules: [{ required: true, message: 'شماره شناسنامه را وارد نمایید' },{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'}]}]"/>
</a-form-item>
<a-form-item label="سریال شناسنامه">
@@ -180,8 +181,8 @@
{{ item }}
</a-select-option>
</a-select>
<input class="ant-input"
v-decorator="['iden_no_right',{initialValue: null},{ rules: [{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'},] }]"
<a-input-number class="ant-input"
v-decorator="['iden_no_right']"
autocomplete="off" style="width: 77%;direction: rtl"/>
</a-input-group>
</a-form-item>
@@ -200,12 +201,16 @@
<a-form-item label="محل صدور">
<input class="ant-input" autocomplete="off"
v-decorator="['iden_where',{initialValue: null,rules: [{ required: true, message: 'محل صدور را وارد نمایید' }]}]"/>
v-decorator="['iden_where',{initialValue: null,rules: [{ required: true, message: 'محل صدور را وارد نمایید' },{
pattern: /^([\u0600-\u06FF\uFB8A\u067E\u0686\u06AF\u200C ])+$/,
message: `محل صدور باید فارسی باشد `, }]}]"/>
</a-form-item>
<a-form-item label="محل تولد">
<input class="ant-input" autocomplete="off"
v-decorator="['birth_where',{initialValue: null,rules: [{ required: true, message: 'محل تولد را وارد نمایید' }]}]"/>
v-decorator="['birth_where',{initialValue: null,rules: [{ required: true, message: 'محل تولد را وارد نمایید' },{
pattern: /^([\u0600-\u06FF\uFB8A\u067E\u0686\u06AF\u200C ])+$/,
message: `محل صدور باید فارسی باشد `, }]}]"/>
</a-form-item>
</div>
</a-card>
+10 -6
View File
@@ -151,8 +151,8 @@
</a-radio-group>
</a-form-item>
<a-form-item label="شماره حساب بانک پاسارگاد">
<input class="ant-input" autocomplete="off"
v-decorator="['pasargad_bank_number',{initialValue: null},{ rules: [{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'},] }]"/>
<a-input-number class="w-full" autocomplete="off"
v-decorator="['pasargad_bank_number',{initialValue: null}]"/>
</a-form-item>
<a-form-item label="حقوق درخواستی">
@@ -191,8 +191,8 @@
{{ item }}
</a-select-option>
</a-select>
<input class="ant-input"
v-decorator="['iden_no_right',{initialValue: null},{ rules: [{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'},] }]"
<a-input-number class="ant-input"
v-decorator="['iden_no_right']"
autocomplete="off" style="width: 77%;direction: rtl"/>
</a-input-group>
</a-form-item>
@@ -210,12 +210,16 @@
<a-form-item label="محل صدور">
<input class="ant-input" autocomplete="off"
v-decorator="['iden_where',{initialValue: null,rules: [{ required: true, message: 'محل صدور را وارد نمایید' }]}]"/>
v-decorator="['iden_where',{initialValue: null,rules: [{ required: true, message: 'محل صدور را وارد نمایید' },{
pattern: /^([\u0600-\u06FF\uFB8A\u067E\u0686\u06AF\u200C ])+$/,
message: `محل صدور باید فارسی باشد `, }]}]"/>
</a-form-item>
<a-form-item label="محل تولد">
<input class="ant-input" autocomplete="off"
v-decorator="['birth_where',{initialValue: null,rules: [{ required: true, message: 'محل تولد را وارد نمایید' }]}]"/>
v-decorator="['birth_where',{initialValue: null,rules: [{ required: true, message: 'محل تولد را وارد نمایید' },{
pattern: /^([\u0600-\u06FF\uFB8A\u067E\u0686\u06AF\u200C ])+$/,
message: `محل صدور باید فارسی باشد `, }]}]"/>
</a-form-item>
</div>
</a-card>
+12
View File
@@ -0,0 +1,12 @@
import XTbl, {Xtc} from '../../components/new-x-table/index';
const tbl = new XTbl('/personnel/table/delete', 'لیست درخواست ها');
tbl.add(new Xtc('id', 'شناسه').filterText());
tbl.add(new Xtc('name', 'نام و نام خانوادگی').filterText());
tbl.add(new Xtc('ncode', 'کد ملی').filterText())
tbl.add(new Xtc('caj', 'ثبت نام').filterDate())
tbl.add(new Xtc('uaj', 'به روز رسانی').filterDate().filterKey('updated_at'))
tbl.add(new Xtc('id', 'عملیات').renderSlot('operator'))
/*tbl.addOpt()*/
export default tbl;
+12
View File
@@ -0,0 +1,12 @@
import XTbl, {Xtc} from '../../components/new-x-table/index';
const tbl = new XTbl('/proposal/table/delete', 'لیست درخواست ها');
tbl.add(new Xtc('id', 'شناسه').filterText());
tbl.add(new Xtc('name', 'نام و نام خانوادگی').filterText());
tbl.add(new Xtc('ncode', 'کد ملی').filterText())
tbl.add(new Xtc('caj', 'ثبت نام').filterDate())
tbl.add(new Xtc('uaj', 'به روز رسانی').filterDate().filterKey('updated_at'))
tbl.add(new Xtc('id', 'عملیات').renderSlot('operator'))
/*tbl.addOpt()*/
export default tbl;
+159
View File
@@ -0,0 +1,159 @@
<template>
<a-card>
<vs-tabs alignment="center" v-model="tabs">
<vs-tab label="بایگانی پرسنل">
<x-table v-if="$getAccess('archive.personnel.show')" v-show="tabs == 0" :model="personnelCols" ref="personnelTbl" class="mt-3">
<div slot="operator" slot-scope="text,record" class="grid grid-cols-1 md:grid-cols-1 gap-2">
<!-- v-if="$getAccess('personnel.delete')"-->
<a-popconfirm title="آیا می خواهید بازیافت کنید؟" v-if="$getAccess('archive.personnel.restore')"
ok-text="بله"
cancel-text="خیر"
@confirm="restorePersonnel(text.record.id)"
>
<a-button type="primary">بازیافت اطلاعات</a-button>
</a-popconfirm>
<!-- <a-popconfirm title="آیا می خواهید حذف کنید؟" v-if="$getAccess('archive.personnel.destroy')"
ok-text="بله"
cancel-text="خیر"
@confirm="deletePersonnel(text.record.id)"
>
<a-button type="danger">حذف اطلاعات</a-button>
</a-popconfirm>-->
</div>
</x-table>
</vs-tab>
<vs-tab label="بایگانی درخواست ها">
<x-table v-if="$getAccess('archive.proposal.show')" v-show="tabs == 1" :model="proposalCols" ref="proposalTbl" class="mt-3">
<div slot="operator" slot-scope="text,record" class="grid grid-cols-1 md:grid-cols-1 gap-2">
<a-popconfirm title="آیا می خواهید بازیافت کنید؟" v-if="$getAccess('archive.proposal.restore')"
ok-text="بله"
cancel-text="خیر"
@confirm="restoreProposal(text.record.id)"
>
<a-button type="primary">بازیافت اطلاعات</a-button>
</a-popconfirm>
<!-- <a-popconfirm title="آیا می خواهید حذف کنید؟" v-if="$getAccess('archive.proposal.destroy')"
ok-text="بله"
cancel-text="خیر"
@confirm="deleteProposal(text.record.id)"
>
<a-button type="danger">حذف اطلاعات</a-button>
</a-popconfirm>-->
</div>
</x-table>
</vs-tab>
</vs-tabs>
</a-card>
</template>
<script>
import personnelCols from './personelTbl';
import proposalCols from './proposalTbl';
import XTable from "@/components/new-x-table/XTable";
import axios from "@/axios"
export default {
components: {
XTable
},
data() {
return {
/* prsonalFileList: [],
file_id: undefined,
showMosahebeModal: false,
showInformationModal: false,
showAddMosahebeModal: false,
personalInformation: {},
personalDetails: {},*/
personnelCols,
proposalCols,
tabs: 0,
/* current: 0,
fromMosahebe: this.$form.createForm(this, {name: 'coordinated'}),
mosahebe: null,
interview_at: null,
row_id: null,
interview: [],
title_interview: ['دانش تخصصی', 'تحصیلات مرتبط', 'تجربه کاری مرتبط', 'رفتار و شخصیت عمومی', 'ویژگی های اختصاصی شغل'],
is_skeleton: false,
// requestEditMode:false,
editInterviewModel: false,
editingInterviewIndex: undefined,
mosahebeData: {},
fromMosahebe0: this.$form.createForm(this, {name: 'coordinated'}),
fromMosahebe1: this.$form.createForm(this, {name: 'coordinated'}),
fromMosahebe2: this.$form.createForm(this, {name: 'coordinated'}),
fromPersonel: this.$form.createForm(this, {name: 'coordinated'}),
setEmployeModel: false,
loading: false,
userTypes: [],*/
}
},
/* computed: {
admin(){
return JSON.parse(localStorage.userInfo).name
}
},*/
methods: {
async restorePersonnel(id) {
try {
this.is_skeleton = true
await axios.get(`personnel/restore/${id}`)
this.$refs.personnelTbl.fetch()
this.$ntSet()
} catch (e) {
this.$ntSetError()
} finally {
this.is_skeleton = false
}
},
async deletePersonnel(id) {
try {
this.is_skeleton = true
await axios.delete(`personnel/delete/${id}`)
this.$refs.personnelTbl.fetch()
this.$ntSet()
} catch (e) {
this.$ntSetError()
} finally {
this.is_skeleton = false
}
},
async restoreProposal(id) {
try {
this.is_skeleton = true
await axios.get(`proposal/restore/${id}`)
this.$refs.proposalTbl.fetch()
this.$ntSet()
} catch (e) {
this.$ntSetError()
} finally {
this.is_skeleton = false
}
},
async deleteProposal(id) {
try {
this.is_skeleton = true
await axios.delete(`proposal/${id}`)
this.$refs.proposalTbl.fetch()
this.$ntSet()
} catch (e) {
this.$ntSetError()
} finally {
this.is_skeleton = false
}
},
},
async created() {
// await this.getUserTypes()
}
}
</script>
<style scoped>
</style>