seperate personel components 1401-04-02

This commit is contained in:
sedmedgh
2022-06-23 17:15:17 +04:30
parent 14cec27f46
commit bf84c0c122
6 changed files with 1926 additions and 548 deletions
+556
View File
@@ -0,0 +1,556 @@
<template>
<a-spin :spinning="loading" tip="در حال ثبت اطلاعات">
<a-list :locale="{emptyText:'رکوردی وجود ندارد.'}" bordered item-layout="horizontal">
<a-list-item class="grid grid-cols-4" style="direction: rtl" v-for="(item,index) in contract"
:key="index">
<div class="col-span-3 grid grid-cols-3">
<div class="mt-5">حقوق پایه :
{{ item.salary }}
</div>
<div class="mt-5">تاریخ خاتمه :
{{ item.end_atj | jtjdate }}
</div>
<div class="mt-5">تاریخ شروع :
{{ item.start_atj | jtjdate }}
</div>
<div class="mt-5">بن کارگری :
{{ item.worker_coupon }}
</div>
<div class="mt-5">کمک هزینه مسکن :
{{ item.housing_allowance }}
</div>
<div class="mt-5">حق جذب : {{ item.right_attraction }}</div>
<div class="mt-5"> شماره سفته :
{{ item.promissory_number }}
</div>
<div class="mt-5"> مبلغ سفته :
{{ item.promissory }}
</div>
<div class="mt-5"> حق سرپرستی :
{{ item.right_guardianship }}
</div>
<div class="mt-5"><span>شماره قرارداد :</span>&nbsp;<span>{{ item.contract_number }}</span>
</div>
<div class="mt-5">دلیل فسخ قرارداد :
{{ item.reason_termination }}
</div>
<div class="mt-5">تاریخ فسخ قرارداد :
{{ item.datej_termination | jtjdate }}
</div>
<div class="mt-5">نوع قرارداد :
{{ item.type_str }}
</div>
<div class="mt-5">محل خدمت :
{{ item.cnt.value }}
</div>
</div>
<div class="grid grid-cols-1" style="direction: ltr">
<div class="mt-5">
<a-button :disabled="!$getAccess('personnel.contract.termination')"
v-if="!item.date_termination" class="ml-3" @click="showTerminationModal(index)">فسخ
قرارداد
</a-button>
<a-button :disabled="!$getAccess('personnel.contract.no.termination')" v-else class="ml-3"
@click="removetermination(index)">لغو فسخ قرارداد
</a-button>
<a-button :disabled="!$getAccess('personnel.contract')" v-if="item.file" class="ml-3"
target="_blank" type="primary" :href="item.file.storage">دانلود پیوست
</a-button>
</div>
<div class="mt-5">
<a-tooltip :disabled="!$getAccess('personnel.contract.delete')" placement="bottomRight"
class="ml-3">
<template slot="title">
<span>حذف</span>
</template>
<a-popconfirm
placement="right"
title="آیا می خواهید حذف کنید؟"
ok-text="بله"
cancel-text="خیر"
@confirm="removeContract(item)">
<a-button type="danger" class="mt-3 mr-3">حذف</a-button>
</a-popconfirm>
</a-tooltip>
<a-dropdown class="mb-4">
<a-menu slot="overlay" @click="printContract($event,item.id)">
<a-menu-item v-for="(subItem,subIndex) in contractTypes" :key="subIndex">{{ subItem }}
</a-menu-item>
</a-menu>
<a-button style="margin-left: 8px"> چاپ قرارداد
<a-icon type="down"/>
</a-button>
</a-dropdown>
<a-button class="ml-3" :disabled="!$getAccess('personnel.contract.update')"
@click="openEditingContractModal(item,index)">ویرایش
</a-button>
</div>
</div>
</a-list-item>
</a-list>
<a-button class="mt-3 ml-2" @click="showAddContract = true">افزودن ردیف</a-button>
<!-- modal add edit -->
<a-modal @ok="detectEditMode" :okText="editContractFlag?'ویرایش':'ایجاد'" forceRender cancelText="بستن"
v-model="showAddContract" :title="editContractFlag?'ویرایش قرارداد':'افزودن قرارداد'"
:forceRender="true">
<a-form :form="fromContract">
<div class="grid grid-cols-2 gap-4">
<div>
<a-form-item label="تاریخ شروع">
<input v-if="!contractModel.start_at" class="hidden" autocomplete="off"
v-decorator="['note',{ rules:[{ required: true, message: 'تاریخ را وارد نمایید' }] }]"/>
<date-picker v-model="contractModel.start_at"/>
</a-form-item>
</div>
<div>
<a-form-item label="تاریخ خاتمه">
<input v-if="!contractModel.end_at" class="hidden" autocomplete="off"
v-decorator="['note',{ rules:[{ required: true, message: 'تاریخ را وارد نمایید' }] }]"/>
<date-picker v-model="contractModel.end_at"/>
</a-form-item>
</div>
</div>
<div class="grid grid-cols-3 gap-4">
<div>
<a-form-item label="حقوق پایه">
<input class="ant-input"
v-decorator="['salary', { initialValue: 0 },{ rules: [{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'},] }]"/>
</a-form-item>
</div>
<div>
<a-form-item label="بن کارگری">
<input class="ant-input"
v-decorator="['worker_coupon', { initialValue: 0 },{ rules: [{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'},] }]"/>
</a-form-item>
</div>
<div>
<a-form-item label="کمک هزینه مسکن">
<input class="ant-input"
v-decorator="['housing_allowance', { initialValue: 0 },{ rules: [{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'},] }]"/>
</a-form-item>
</div>
<div>
<a-form-item label="حق جذب">
<input class="ant-input"
v-decorator="['right_attraction', { initialValue: 0 },{ rules: [{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'},] }]"/>
</a-form-item>
</div>
<div>
<a-form-item label="حق سرپرستی">
<input class="ant-input"
v-decorator="['right_guardianship', { initialValue: 0 },{ rules: [{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'},] }]"/>
</a-form-item>
</div>
<div>
<a-form-item label="مبلغ سفته">
<input class="ant-input"
v-decorator="['promissory', { initialValue: 0 },{ rules: [{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'},] }]"/>
</a-form-item>
</div>
<div>
<a-form-item label="شماره سفته">
<input class="ant-input"
v-decorator="['promissory_number',{ rules: [{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'},] }]"/>
</a-form-item>
</div>
<div>
<a-form-item label="شماره قرارداد">
<input class="ant-input"
v-decorator="['contract_number']"/>
</a-form-item>
</div>
<div>
<a-form-item label="حق فرزند">
<input class="ant-input"
v-decorator="['right_child',{ rules: [{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'},] }]"/>
</a-form-item>
</div>
<div>
<a-form-item label="پایه سنوات">
<input class="ant-input"
v-decorator="['basic_years',{ rules: [{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'},] }]"/>
</a-form-item>
</div>
<div>
<a-form-item label="حق ماموریت">
<input class="ant-input"
v-decorator="['right_mission',{ rules: [{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'},] }]"/>
</a-form-item>
</div>
<div>
<a-form-item label="حق شیفت">
<input class="ant-input"
v-decorator="['right_shift',{ rules: [{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'},] }]"/>
</a-form-item>
</div>
<div>
<a-form-item label="پاداش مستمر">
<input class="ant-input"
v-decorator="['reward',{ rules: [{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'},] }]"/>
</a-form-item>
</div>
<a-form-item label="نوع قرارداد">
<a-select v-model="contractType" style="width: 100%" v-decorator="['type']">
<a-select-option v-for="(item,index) in contractTypes" :value="`${index}`">
{{ item }}
</a-select-option>
</a-select>
</a-form-item>
<div>
<a-form-item label="حق السعی">
<input class="ant-input"
v-decorator="['right_try',{ rules: [{pattern:/^[0-9]+$/,message:'مقدار وارد شده باید عددی باشد.'},] }]"/>
</a-form-item>
</div>
<div>
<a-form-item label="محل خدمت">
<input class="ant-input" v-decorator="['city_workplace']"/>
</a-form-item>
</div>
<div>
<a-form-item label="واحد کار">
<a-select
v-decorator="['work_unit', { initialValue:null,rules: [{ required: true, message: 'لطفاسطح مقدار را انتخاب کنید' }] }]"
@change="selectChange">
<a-select-option v-for="item in work_units" :value="item.id">
{{ item.value }}
</a-select-option>
</a-select>
</a-form-item>
</div>
<div>
<a-form-item label="نام واحد" has-feedback v-if="showName">
<input class="ant-input"
v-decorator="['work_unit_name', { rules: [{ required: true, message: 'لطفا مقدار را وارد کنید' }] }]"
autocomplete="off"
/>
</a-form-item>
</div>
</div>
<!--<a-form-item label="دلیل فسخ قرارداد">
<input class="ant-input" style="width: 100%" v-decorator="['reason_termination']" />
</a-form-item>-->
<a-form-item label="فایل">
<div class="dropbox">
<a-upload-dragger
:disabled="!$getAccess('personnel.basic.update')"
:multiple="false"
action="http://hr.asco-intl.com:2020/kernel/api/register/upload"
:file-list="contractFileList"
:default-file-list="contractFileList"
@change="contractFileUpload"
:remove="contractFileRemove"
>
<p class="ant-upload-drag-icon">
<a-icon type="inbox"/>
</p>
<p class="ant-upload-text">
فایل را درگ کنید یا اینکه کاوش کنید.
</p>
<p class="ant-upload-hint">
فایلی که بارگذاری می کنید باید زیر ۵ مگابایت باشد.
</p>
</a-upload-dragger>
<!-- <a-upload-dragger
:customRequest="uploadImage"
:file-list="contractFileList"
:before-upload="beforeUpload"
>
<p class="ant-upload-drag-icon">
<a-icon type="inbox" />
</p>
<p class="ant-upload-text">
فایل را درگ کنید یا اینکه کاوش کنید.
</p>
<p class="ant-upload-hint">
تصویر که بارگذاری می کنید باید زیر ۵ مگابایت باشد.
</p>
</a-upload-dragger>-->
<!-- <div v-else>
<a-alert message="آپلود سند با موفقیت انجام شد." type="success" />
</div>-->
</div>
</a-form-item>
</a-form>
</a-modal>
<!-- modal add edit -->
<!-- modal termision -->
<a-modal okText="ثبت" cancelText="بستن" forceRender v-model="showTermination" title="فسخ قرارداد"
@ok="addtermination">
<a-form :form="formTermination">
<a-form-item label="تاریخ فسخ قرارداد">
<input v-if="!date_termination" class="hidden" autocomplete="off"
v-decorator="['note',{ rules:[{ required: true, message: 'تاریخ را وارد نمایید' }] }]"/>
<date-picker v-model="date_termination"/>
</a-form-item>
<a-form-item label="دلیل فسخ قرارداد">
<input class="ant-input" autocomplete="off" v-decorator="['reason_termination']"/>
</a-form-item>
</a-form>
</a-modal>
<!-- modal termision -->
<!-- <a-button type="primary" @click="saveData" class="mt-5" :disabled="disabled"
v-if="contract && contract.length > 0">
ویرایش
</a-button>-->
</a-spin>
</template>
<script>
import axios from "@/axios";
export default {
name: "contracts",
props: {
contract:{
type: Array,
required: true
}
},
data() {
return{
showAddContract: false,
loading: false,
fromContract: this.$form.createForm(this, {name: 'fromContract'}),
formTermination: this.$form.createForm(this, {name: 'formTermination'}),
editContractFlag: false,
showTermination: false,
activeContract: null,
date_termination: null,
contractModel: {
start_at: '',
end_at: '',
salary: 0,
worker_coupon: 0,
housing_allowance: 0,
right_attraction: 0,
right_guardianship: 0,
reason_termination: ''
},
contractFileList: [],
work_units: [],
showName: false,
contractTypes: undefined,
contractType: "1",
}
},
methods: {
async getUnits() {
try {
let {data} = await axios.get('/personnel/unit/unit')
await this.$store.commit('personnel/setUnits', data)
data.push
({
id: "new",
value: "افزودن واحد جدید"
})
this.work_units = data
} catch (e) {
console.log(e)
}
},
selectChange(id) {
if (id == "new") {
this.showName = true
}
else if(this.showName == true) this.showName = false
},
async getTypes() {
try {
const {data} = await axios.get('/personnel/type/type')
this.contractTypes = data
await this.$store.commit('personnel/setContractTypes', data)
} catch (e) {
console.log(e)
}
},
showTerminationModal(index) {
this.activeContract = index;
this.showTermination = true;
},
async removetermination(index) {
try {
let contractList = this.contract
contractList[index].date_termination = null
contractList[index].datej_termination = null
contractList[index].reason_termination = null
await this.saveData(contractList);
} catch (e) {
this.$ntSetError()
console.log(e)
} finally {
await this.getPersonal()
}
},
async removeContract(item) {
if (item.id) {
try {
await axios.post('/personnel/remove-contract', {id: item.id});
await this.$emit('update')
} catch (e) {
console.log(e);
}
} else {
const index = this.contract.indexOf(item);
this.contract.splice(index, 1);
}
},
printContract(event, id) {
window.open(`http://hr.asco-intl.com:2020/kernel/api/personnel/print?type=${event.key}&id=${id}`, '_blank').focus()
},
openEditingContractModal(item, index) {
// console.log(this.contractTypes)
// console.log(item)
item.type = item.type ? item.type.toString() : undefined
if (item.file) {
this.contractFileList = [{uid: item.file.id, name: item.file.filename, status: 'done', url: item.file.storage}]
}
this.activeContract = index
this.editContractFlag = true
this.showAddContract = true
this.contractModel.end_at = item.end_at
this.contractModel.start_at = item.start_at
// console.log("item:::::::::::::",item)
// console.log(item)
this.fromContract.setFieldsValue(item)
},
async detectEditMode(e) {
await this.addContract(e)
if (this.editContractFlag) this.editContractFlag = false
},
addContract(e) {
e.preventDefault();
this.fromContract.validateFields((err, values) => {
if (!err) {
let contractList = this.contract
if (this.image_data) {
values.contract_file_id = this.image_data.id
}
if (values.work_unit == "new") {
values.work_unit = values.work_unit_name
}
if (this.editContractFlag) {
values.start_at = this.contractModel.start_at
values.end_at = this.contractModel.end_at
contractList[this.activeContract] = Object.assign(this.contract[this.activeContract], values)
// console.log("model", this.contractModel)
this.contractModel = {
start_at: '',
end_at: '',
salary: 0,
worker_coupon: 0,
housing_allowance: 0,
right_attraction: 0,
right_guardianship: 0,
reason_termination: ''
}
}
else {
// console.log("adding")
values.start_at = this.contractModel.start_at
values.end_at = this.contractModel.end_at
contractList.push(values);
}
// console.log("data", this.contract[this.editingContractIndex])
this.saveData(contractList);
this.showAddContract = false;
this.fromContract.resetFields();
this.image_data = null;
// console.log('contract',this.contract);
} else {
this.$ntGetError('اطلاعات را به صورت کامل وارد کنید');
}
});
},
contractFileUpload({fileList, event, file}) {
if (file.response && file.response.id) {
this.image_data = file.response
}
this.contractFileList = fileList;
},
contractFileRemove() {
this.image_data = null
},
async addtermination(e) {
e.preventDefault();
this.formTermination.validateFields(async (err, values) => {
if (!err) {
try {
let contractList = this.contract
contractList[this.activeContract].date_termination = this.date_termination //values.date_termination;
contractList[this.activeContract].reason_termination = values.reason_termination;
this.showTermination = false;
this.formTermination.resetFields();
await this.saveData(contractList);
} catch (e) {
this.$ntSetError()
console.log(e)
} finally {
this.$refs.personelTbl.fetch();
}
} else {
this.$ntGetError('اطلاعات را به صورت کامل وارد کنید');
}
});
},
async saveData(contractList) {
if (contractList) {
try {
this.loading = true
console.log('contractList',contractList)
let values = {
contract: contractList,
id: this.id
}
if (!this.$getAccess('personnel.contract')) {
values.contract = this.contract
}
await axios.post(`/personnel/contract/update`, values)
this.$ntSet()
} catch (e) {
this.$ntSetError()
console.log(e)
} finally {
await this.$emit('update')
this.loading = false
this.showAddContract = false
}
}
else {
this.$ntGetError('اطلاعات را به صورت کامل وارد کنید');
}
},
},
computed: {
id() {
return this.$route.params.id
}
},
async created() {
await this.getTypes()
await this.getUnits()
},
}
</script>
<style scoped>
</style>
+129
View File
@@ -0,0 +1,129 @@
<template>
<a-spin :spinning="loading" tip="در حال ثبت اطلاعات">
<a-list :locale="{emptyText:'رکوردی وجود ندارد.'}" bordered item-layout="horizontal">
<a-list-item class="grid grid-cols-3" v-for="(item,index) in estimate" :key="index">
<div>
<a-tooltip placement="bottomRight">
<template slot="title">
<span>حذف</span>
</template>
<a-popconfirm :disabled="!$getAccess('personnel.function.delete')"
placement="right"
title="آیا می خواهید حذف کنید؟"
ok-text="بله"
cancel-text="خیر"
@confirm="removeEstimate(item)">
<a-button type="danger" class="mr-3">حذف</a-button>
</a-popconfirm>
</a-tooltip>
</div>
<div>نمره : {{ item.score }}</div>
<div> برنامه توسعه دوره : <span>{{ item.note }} </span></div>
</a-list-item>
</a-list>
<br/>
<a-button class="ml-2" :disabled="!$getAccess('personnel.function.create')"
@click="showAddPerformance=true">افزودن ردیف
</a-button>
<a-modal @ok="savefromPerformance" okText="ایجاد" forceRender cancelText="بستن" v-model="showAddPerformance"
title="افزودن ارزیابی عملکرد">
<a-form :form="fromPerformance">
<a-form-item label="نمره">
<a-input-number autocomplete="off" :min="0" :max="20"
v-decorator="['score',{ rules:[{ required: true, message: 'وارد کردن الزامی است' }] }]"/>
</a-form-item>
<a-form-item label="برنامه توسعه دوره">
<input class="ant-input" autocomplete="off"
v-decorator="['note',{ rules:[{ required: false, message: 'وارد کردن الزامی است' }] }]"/>
</a-form-item>
</a-form>
</a-modal>
</a-spin>
</template>
<script>
import axios from "@/axios";
export default {
name: "estimate",
props: {
estimate: Array
},
data() {
return {
loading: false,
showAddPerformance: false,
fromPerformance: this.$form.createForm(this, {name: 'fromPerformance'}),
}
},
computed: {
id() {
return this.$route.params.id
}
},
methods: {
async removeEstimate(item) {
if (item.id) {
try {
await axios.post('/personnel/remove-estimate', {id: item.id});
this.$emit('update')
} catch (e) {
console.log(e);
}
} else {
const index = this.estimate.indexOf(item);
this.estimate.splice(index, 1);
}
},
savefromPerformance(e) {
e.preventDefault();
this.fromPerformance.validateFields(async (err, values) => {
if (!err) {
let estimate = this.estimate
estimate.push(values);
this.showAddPerformance = false;
this.$message.success('اطلاعات با موفقیت ثبت شد');
this.fromPerformance.resetFields();
await this.saveData(estimate);
} else {
this.$ntGetError('اطلاعات را به صورت کامل وارد کنید');
}
});
},
async saveData(estimate) {
if (estimate) {
try {
this.loading = true
let values = {
estimate: estimate,
id: this.id
}
values.documents = this.documents;
if (!this.$getAccess('personnel.train')) {
values.estimate = this.estimate
}
await axios.post('/personnel/estimate/update', values);
this.$emit('update')
this.$ntSet()
} catch (e) {
this.$ntSetError()
console.log(e)
} finally {
this.loading = false
this.showAddPerformance = false
}
} else {
this.$ntGetError('اطلاعات را به صورت کامل وارد کنید');
}
},
}
}
</script>
<style scoped>
</style>
@@ -0,0 +1,253 @@
<template>
<div id="printContent" class="hidden">
<a-card v-if="personel && personel.proposal" title="اطلاعات فردی">
<div class="grid sm:grid-cols-1 md:grid-cols-3 md:gap-3 lg:grid-cols-3 lg:gap-3">
<a-form-item label="نام و نام خانوادگی">
{{ personel.name }}
</a-form-item>
<a-form-item label="نام انگلیسی">
{{ personel.name_en }}
</a-form-item>
<a-form-item label="کدملی">
{{ personel.ncode }}
</a-form-item>
<a-form-item label="شماره پرسنلی">
{{ personel.personel_id }}
</a-form-item>
<a-form-item label="موبایل">
{{ personel.proposal.mobile }}
</a-form-item>
<a-form-item label="شهر متقاضی شغل">
{{ personel.proposal.for_cities.join(' , ') }}
</a-form-item>
<a-form-item label="شغل متقاضی">
{{ personel.proposal.job_title }}
</a-form-item>
<a-form-item label="واحد کار متقاضی">
{{ personel.unit }}
</a-form-item>
<a-form-item label="نام پدر">
{{ personel.proposal.father_name }}
</a-form-item>
<a-form-item label="تاریخ تولد">
{{ personelBirthDate | jdate }}
</a-form-item>
<a-form-item label="شماره شناسنامه">
{{ personel.proposal.iden_id }}
</a-form-item>
<a-form-item label="سریال شناسنامه">
{{ personel.proposal.iden_serial }}
</a-form-item>
<a-form-item label="محل صدور">
{{ personel.proposal.iden_place }}
</a-form-item>
<a-form-item label="محل تولد">
{{ personel.proposal.birth_place }}
</a-form-item>
<a-form-item label="ایمیل">
{{ personel.proposal.email }}
</a-form-item>
<a-form-item label="تلفن ثابت">
{{ personel.proposal.phone }}
</a-form-item>
<a-form-item label="حقوق درخواستی">
{{ personel.proposal.requested_salary }}
</a-form-item>
<a-form-item label="جنسیت">
<a-radio-group v-model="personel.proposal.gender">
<a-radio :value="1">
مرد
</a-radio>
<a-radio :value="2">
زن
</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item label="وضعیت تاهل">
<a-radio-group v-model="personel.proposal.marriage_sts">
<a-radio :value="2">
متاهل
</a-radio>
<a-radio :value="1">
مجرد
</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item label="وضعیت مسکن">
<a-radio-group v-model="personel.proposal.house_sts">
<a-radio :value="1">
مالک
</a-radio>
<a-radio :value="2">
مستاجر
</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item label="آدرس" class="col-span-3">
{{ personel.proposal.address }}
</a-form-item>
<a-form-item label="تلفن ضروری">
{{ personel.proposal.phone_emergency }}
</a-form-item>
<a-form-item label="نام فرد">
{{ personel.proposal.phone_emergency_name }}
</a-form-item>
<a-form-item label="نسبت">
{{ personel.proposal.phone_emergency_related }}
</a-form-item>
<a-form-item label="شماره کارت">
{{ personel.bank_card_number }}
</a-form-item>
<a-form-item label="شماره حساب">
{{ personel.bank_account }}
</a-form-item>
<a-form-item label="شماره بیمه">
{{ personel.insurance_no }}
</a-form-item>
<a-form-item label="وضعیت بیمه">
<a-radio-group v-model="personel.insurance_sts">
<a-radio :value="-1">
ندارد
</a-radio>
<a-radio :value="1">
دارد
</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item label="تعداد فرزند">
{{ personel.proposal.count_child }}
</a-form-item>
<a-form-item label="وضعیت نظام وظیفه">
{{
{1: 'معاف', 2: 'مشمول', 3: 'پایان خدمت'}[personel.proposal.military_sts]
}}
</a-form-item>
</div>
</a-card>
<a-card v-if="personalDetails && personalDetails.family" title="اطلاعات خانوادگی" class="mt-5">
<template v-for="(item,index) in personalDetails.family">
<div class="grid sm:grid-cols-1 md:grid-cols-3 md:gap-3 lg:grid-cols-3 lg:gap-3">
<a-form-item label="شناسه">
{{ personalDetails.family[index].id }}
</a-form-item>
<a-form-item label="نام">
{{ personalDetails.family[index].name }}
</a-form-item>
<a-form-item label="نسبت">
{{ personalDetails.family[index].relation }}
</a-form-item>
<a-form-item label="مقطع">
{{
personalDetails.family[index].edu_level ?
grade[personalDetails.family[index].edu_level.toString()] :
null
}}
</a-form-item>
<a-form-item label="رشته تحصیلی">
{{ personalDetails.family[index].edu_title }}
</a-form-item>
<a-form-item label="شغل">
{{ personalDetails.family[index].job }}
</a-form-item>
</div>
<a-divider/>
</template>
</a-card>
<a-card v-if="personalDetails && personalDetails.education" title="اطلاعات تحصیلی" class="mt-5">
<template v-for="(item,index) in personalDetails.education">
<div class="grid sm:grid-cols-1 md:grid-cols-3 md:gap-3 lg:grid-cols-3 lg:gap-3">
<a-form-item label="شناسه">
{{ personalDetails.education[index].id }}
</a-form-item>
<a-form-item label="مقطع">
{{
personalDetails.education[index].level ?
grade[personalDetails.education[index].level.toString()] :
null
}}
</a-form-item>
<a-form-item label="دانشگاه">
{{ personalDetails.education[index].university }}
</a-form-item>
<a-form-item label="رشته تحصیلی">
{{ personalDetails.education[index].title }}
</a-form-item>
<a-form-item label="گرایش">
{{ personalDetails.education[index].trend }}
</a-form-item>
<a-form-item label="سال شروع">
{{ personalDetails.education[index].start_at }}
</a-form-item>
<a-form-item label="سال خاتمه">
{{ personalDetails.education[index].end_at }}
</a-form-item>
</div>
<a-divider/>
</template>
</a-card>
<a-card v-if="personalDetails && personalDetails.traning" title="سوابق آموزشی" class="mt-5">
<template v-for="(item,index) in personalDetails.traning">
<div class="grid sm:grid-cols-1 md:grid-cols-3 md:gap-3 lg:grid-cols-3 lg:gap-3">
<a-form-item label="شناسه">
{{ personalDetails.traning[index].id }}
</a-form-item>
<a-form-item label="مرکز برگزاری">
{{ personalDetails.traning[index].university }}
</a-form-item>
<a-form-item label="عنوان دوره ">
{{ personalDetails.traning[index].title }}
</a-form-item>
<a-form-item label="سال">
{{ personalDetails.traning[index].start_at }}
</a-form-item>
<a-form-item label="امکان ارائه گواهینامه دارم">
<a-checkbox v-model="personalDetails.traning[index].has_certificate"/>
</a-form-item>
</div>
<a-divider/>
</template>
</a-card>
<a-card v-if="personalDetails && personalDetails.jobs_history" title="سوابق کاری" class="mt-5">
<template v-for="(item,index) in personalDetails.jobs_history">
<div class="grid sm:grid-cols-1 md:grid-cols-3 md:gap-3 lg:grid-cols-3 lg:gap-3">
<a-form-item label="شناسه">
{{ personalDetails.jobs_history[index].id }}
</a-form-item>
<a-form-item label="نام سازمان ">
{{ personalDetails.jobs_history[index].university }}
</a-form-item>
<a-form-item label="عنوان شغل">
{{ personalDetails.jobs_history[index].title }}
</a-form-item>
<a-form-item label="دلیل خاتمه">
{{ personalDetails.jobs_history[index].note }}
</a-form-item>
<a-form-item label="سال شروع">
{{ personalDetails.jobs_history[index].start_at }}
</a-form-item>
<a-form-item label="سال خاتمه">
{{ personalDetails.jobs_history[index].end_at }}
</a-form-item>
</div>
<a-divider/>
</template>
</a-card>
</div>
</template>
<script>
export default {
name: "printContent",
props: {
personel: Object,
personalDetails: Object,
grade: Object,
personelBirthDate: [String,null]
}
}
</script>
<style scoped>
</style>
+193
View File
@@ -0,0 +1,193 @@
<template>
<a-spin :spinning="loading" tip="در حال ثبت اطلاعات">
<a-list :locale="{emptyText:'رکوردی وجود ندارد.'}" bordered item-layout="horizontal">
<a-list-item class="grid grid-cols-3" v-for="(item,index) in training" :key="index">
<div>
<a-button v-if="item.file" target="_blank" type="primary"
:disabled="!$getAccess('personnel.train.download')" :href="item.file.storage"
class="mr-3">دانلود پیوست
</a-button>
<a-tooltip placement="bottomRight">
<template slot="title">
<span>حذف</span>
</template>
<a-popconfirm
:disabled="!$getAccess('personnel.train.delete')"
placement="right"
title="آیا می خواهید حذف کنید؟"
ok-text="بله"
cancel-text="خیر"
@confirm="removeEdu(item)"
>
<a-button type="danger" class="mr-3">حذف</a-button>
</a-popconfirm>
</a-tooltip>
</div>
<div><span>دسته گواهینامه :</span> {{ item.type }}</div>
<div style="direction: rtl">عنوان گواهینامه : {{ item.title }}</div>
</a-list-item>
</a-list>
<a-button :disabled="!$getAccess('personnel.train.create')" class="mt-4 ml-2"
@click="showAddEducationalInformation=true;isAlertUpload = false">افزودن ردیف
</a-button>
<a-modal forceRender okText="ایجاد" cancelText="بستن" v-model="showAddEducationalInformation"
title="افزودن اطلاعات آموزشی" @ok="addEdu">
<a-form :form="fromEducationalInformation">
<div class="grid sm:grid-cols-1 md:grid-cols-2 md:gap-4 lg:grid-cols-2 lg:gap-4">
<a-form-item label="دسته گواهینامه">
<!--<input class="ant-input" autocomplete="off" v-decorator="['type',{rules: [{ required: true, message: 'وارد کردن شغل الزامی است' }]}]"/>-->
<a-select style="width: 100%"
v-decorator="['type',{rules: [{ required: true, message: 'وارد کردن شغل الزامی است' }]}]">
<a-select-option v-for="(item,index) in category" :value="item">
{{ item }}
</a-select-option>
<!--<a-select-option value="lucy">
Lucy
</a-select-option>
<a-select-option value="disabled" disabled>
Disabled
</a-select-option>
<a-select-option value="Yiminghe">
yiminghe
</a-select-option>-->
</a-select>
</a-form-item>
<a-form-item label="عنوان گواهینامه">
<input class="ant-input" autocomplete="off"
v-decorator="['title',{rules: [{ required: true, message: 'وارد کردن شغل الزامی است' }]}]"/>
</a-form-item>
</div>
<a-form-item label="فایل">
<div class="dropbox">
<a-upload-dragger
v-if="!isAlertUpload"
:customRequest="uploadImage"
:show-upload-list="false"
:before-upload="beforeUpload">
<p class="ant-upload-drag-icon">
<a-icon type="inbox"/>
</p>
<p class="ant-upload-text">
فایل را درگ کنید یا اینکه کاوش کنید.
</p>
<p class="ant-upload-hint">
فایل را درگ کنید یا اینکه کاوش کنید.
</p>
</a-upload-dragger>
<div v-else>
<a-alert message="آپلود سند با موفقیت انجام شد." type="success"/>
</div>
</div>
</a-form-item>
</a-form>
</a-modal>
</a-spin>
</template>
<script>
import axios from "@/axios";
export default {
name: "training",
props: {
training: Array,
uploadImage: Function,
beforeUpload: Function,
value: [Object,null]
},
data() {
return {
loading: false,
showAddEducationalInformation: false,
isAlertUpload: false,
fromEducationalInformation: this.$form.createForm(this, {name: 'cordinate'}),
category: [],
}
},
computed: {
id() {
return this.$route.params.id
}
},
methods: {
async removeEdu(item) {
if (item.id) {
try {
await axios.post('/personnel/remove-traning', {id: item.id});
this.$emit('update')
} catch (e) {
console.log(e);
}
} else {
const index = this.training.indexOf(item);
this.training.splice(index, 1);
}
},
addEdu(e) {
e.preventDefault();
this.fromEducationalInformation.validateFields(async(err, values) => {
if (!err) {
let training = this.training
if (this.value) {
values.file_id = this.value.id
values.file = this.value.storage
}
training.push(values);
this.showAddEducationalInformation = false;
this.$message.success('اطلاعات با موفقیت ثبت شد');
this.fromEducationalInformation.resetFields();
this.$emit('input',null)
await this.saveData(training);
} else {
this.$ntGetError('اطلاعات را به صورت کامل وارد کنید');
}
});
},
async saveData(training) {
if (training) {
try {
this.loading = true
let values = {
training: training,
id: this.id
}
values.documents = this.documents;
if (!this.$getAccess('personnel.train')) {
values.training = this.training
}
await axios.post('/personnel/training/update', values);
this.$emit('update')
this.$ntSet()
} catch (e) {
this.$ntSetError()
console.log(e)
} finally {
this.loading = false
this.showAddEducationalInformation = false
}
}
else {
this.$ntGetError('اطلاعات را به صورت کامل وارد کنید');
}
},
},
async created() {
try {
this.loading = true
const {data} = await axios.get('/get-category')
this.category = data
} catch (e) {
this.$message.error('خطا در دریافت اطلاعات');
} finally {
this.loading = false
}
}
}
</script>
<style scoped>
</style>
+185
View File
@@ -0,0 +1,185 @@
<template>
<a-spin :spinning="loading" tip="در حال ثبت اطلاعات">
<a-list :locale="{emptyText:'رکوردی وجود ندارد.'}" bordered item-layout="horizontal">
<a-list-item class="grid grid-cols-3" v-for="(item,index) in writ" :key="index">
<div>
<a-tooltip placement="bottomRight">
<a-button v-if="item.file" target="_blank" type="primary" :href="item.file.storage" class="mr-3">
دانلود
پیوست
</a-button>
<template slot="title">
<span>حذف</span>
</template>
<a-popconfirm :disabled="!$getAccess('personnel.rule.delete')"
placement="right"
title="آیا می خواهید حذف کنید؟"
ok-text="بله"
cancel-text="خیر"
@confirm="removeDocs(item)"
>
<a-button type="danger" class="mr-3">حذف</a-button>
</a-popconfirm>
</a-tooltip>
</div>
<div style="direction: rtl"><span>نوع :</span><span>{{ item.type_str }}</span></div>
<div style="direction: rtl">عنوان : {{ item.note }}</div>
</a-list-item>
</a-list>
<a-button :disabled="!$getAccess('personnel.rule.create')" class="mt-4 ml-2"
@click="showAddDocument=true;isAlertUpload = false">افزودن ردیف
</a-button>
<a-modal okText="ایجاد" cancelText="بستن" forceRender v-model="showAddDocument" title="افزودن سند"
@ok="addDocs">
<a-form :form="fromDocs">
<a-form-item label="نوع" has-feedback>
<a-select
v-decorator="['type']"
placeholder="انتخاب نوع"
>
<a-select-option value="1">
حکم
</a-select-option>
<a-select-option value="2">
اخطار
</a-select-option>
<a-select-option value="3">
پاداش
</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="شرح">
<input class="ant-input" style="width:100%"
autocomplete="off"
v-decorator="['note']"
/>
</a-form-item>
<a-form-item label="فایل">
<div class="dropbox">
<a-upload-dragger
v-if="!isAlertUpload"
:customRequest="uploadImage"
:show-upload-list="false"
:before-upload="beforeUpload"
>
<p class="ant-upload-drag-icon">
<a-icon type="inbox"/>
</p>
<p class="ant-upload-text">
فایل را درگ کنید یا اینکه کاوش کنید.
</p>
<p class="ant-upload-hint">
تصویر که بارگذاری می کنید باید زیر ۵ مگابایت باشد.
</p>
</a-upload-dragger>
<div v-else>
<a-alert message="آپلود سند با موفقیت انجام شد." type="success"/>
</div>
</div>
</a-form-item>
</a-form>
</a-modal>
</a-spin>
</template>
<script>
import axios from "@/axios";
export default {
name: "writs",
props: {
writ: Array,
uploadImage: Function,
beforeUpload: Function,
value: [Object,null]
},
data() {
return {
loading: false,
showAddDocument: false,
isAlertUpload: false,
fromDocs: this.$form.createForm(this, {name: 'fromDocs'}),
}
},
computed: {
id() {
return this.$route.params.id
}
},
methods: {
async removeDocs(item) {
if (item.id) {
try {
await axios.post('/personnel/remove-writ', {id: item.id});
await this.$emit('update')
} catch (e) {
console.log(e);
}
} else {
const index = this.writ.indexOf(item);
this.writ.splice(index, 1);
}
},
addDocs(e) {
e.preventDefault();
this.fromDocs.validateFields(async(err, values) => {
if (!err) {
let writ = this.writ
if (this.value) {
values.file_id = this.value.id
values.file = this.value.storage
}
writ.push(values);
this.showAddDocument = false;
this.$message.success('اطلاعات با موفقیت ثبت شد');
this.fromDocs.resetFields();
this.$emit('input',null)
await this.saveData(writ);
} else {
this.$ntGetError('اطلاعات را به صورت کامل وارد کنید');
}
});
},
async saveData(writ) {
if (writ) {
try {
this.loading = true
let values = {
writ: writ,
id: this.id
}
values.documents = this.documents;
if (!this.$getAccess('personnel.train')) {
values.writ = this.writ
}
await axios.post('/personnel/writ/update', values);
this.$emit('update')
this.$ntSet()
} catch (e) {
this.$ntSetError()
console.log(e)
} finally {
this.loading = false
this.showAddEducationalInformation = false
}
}
else {
this.$ntGetError('اطلاعات را به صورت کامل وارد کنید');
}
},
},
}
</script>
<style scoped>
</style>
File diff suppressed because it is too large Load Diff