701 lines
20 KiB
JavaScript
701 lines
20 KiB
JavaScript
import { action, observable } from "mobx";
|
|
import { message } from "antd";
|
|
import { WeaForm, WeaTableNew } from "comsMobx";
|
|
|
|
import * as API from "../apis/calculate";
|
|
import { toDecimal_n } from "../util";
|
|
|
|
const { TableStore } = WeaTableNew;
|
|
|
|
export class calculateStore {
|
|
@observable PCSearchForm = new WeaForm(); //人员确认-form
|
|
@observable ECSearchForm = new WeaForm(); //薪资核算-form
|
|
@observable otherConditions = []; //薪资核算-其他查询条件
|
|
@observable calculateForm = new WeaForm(); //薪资核算重构-核算form
|
|
@observable batchUpdateForm = new WeaForm(); //批量更新薪资项目-批量更新form
|
|
@action initBatchUpdateForm = () => this.batchUpdateForm = new WeaForm();
|
|
|
|
@observable tableStore = new TableStore(); // new table
|
|
@observable form = new WeaForm(); // nrew 一个form
|
|
@observable condition = []; // 存储后台得到的form数据
|
|
@observable hasRight = true; // 判断用户是有权限查看当前页面: 没有权限渲染无权限页面,有权限渲染数据
|
|
@observable showSearchAd = false; // 高级搜索面板显示
|
|
@observable loading = true; // 数据加载状态
|
|
|
|
// ** 薪资核算列表 **
|
|
@observable salaryListDataSource = [];
|
|
@observable salaryListColumns = [];
|
|
@observable calculateBaseForm = {};
|
|
@observable salaryListPageInfo = {};
|
|
|
|
// ** 核算信息页 ***
|
|
// 核算人员
|
|
@observable acctemployeeListDataSource = []; // dataSource
|
|
@observable acctemployeeListColumns = []; // 列
|
|
@observable acctemployeeListPageInfo = {}; // 分页信息
|
|
// 环比上期减少人员
|
|
@observable reducedemployeeListDataSource = []; // dataSource
|
|
@observable reducedemployeeListColumns = []; // 列
|
|
@observable reducedemployeeListPageInfo = {}; // 分页信息
|
|
// 薪资周期、考勤周期
|
|
@observable baseSalarySobCycle = {};
|
|
|
|
// *** 薪资核算 ***
|
|
// 核算结果--列表
|
|
@observable acctResultListDateSource = []; // dataSource
|
|
@observable acctResultListColumns = []; // 列
|
|
@observable acctresultDetailForm = {}; // 编辑薪资表单数据
|
|
@observable acctResultListTableStore = new TableStore();
|
|
@observable acctResultListPageInfo = {}; // 分页信息
|
|
// 导入
|
|
@observable importFieldData = {}; // 表头选择列表
|
|
@observable acctResultImportPreview = {}; // 核算结果预览
|
|
@observable previewAcctResultList = {}; //预览数据
|
|
@observable previewAcctResultColumns = []; // 预览列表
|
|
@observable previewAcctResultDataSource = []; // 预览DataSource
|
|
@observable importAcctResult = {}; // 导入结果
|
|
|
|
//*** 线下比对 ***
|
|
@observable comparisonResultPageInfo = [];// 线下对比列表pageInfo
|
|
@observable comparisonResultTableStore = new TableStore(); // tableStore
|
|
@observable comparisonPreviewColumns = []; // 线下对比预览列表
|
|
@observable comparisonPreviewDataSource = []; // 线下对比列表数据
|
|
@observable comparisonImportAcctResult = {}; // 导入结果
|
|
@observable comparisonResultColumns = []; // 表头
|
|
|
|
// ** 核算进度 **
|
|
@observable calculateProgress = 0;
|
|
|
|
// ** 列表说明数据 **
|
|
@observable columnDescList = {};
|
|
|
|
|
|
// ** 薪资核算-其他条件查询 **
|
|
@action
|
|
setOtherConditions = (otherConditions) => this.otherConditions = otherConditions;
|
|
// ** 薪资核算重构-初始化核算form **
|
|
@action
|
|
initCalcForm = () => this.calculateForm = new WeaForm();
|
|
|
|
// ** 设置导入参数 **
|
|
@action
|
|
setPreviewAcctResultColumns = (previewAcctResultColumns) => {
|
|
this.previewAcctResultColumns = previewAcctResultColumns;
|
|
};
|
|
|
|
@action
|
|
setPreviewAcctResultDataSource = previewAcctResultDataSource => {
|
|
this.previewAcctResultDataSource = previewAcctResultDataSource;
|
|
};
|
|
|
|
@action
|
|
setImportAcctResult = importAcctResult => {
|
|
this.importAcctResult = importAcctResult;
|
|
};
|
|
|
|
@action
|
|
setComparisonPreviewColumns = comparisonPreviewColumns => {
|
|
this.comparisonPreviewColumns = comparisonPreviewColumns;
|
|
};
|
|
|
|
@action
|
|
setComparisonPreviewDataSource = comparisonPreviewDataSource => {
|
|
this.comparisonPreviewDataSource = comparisonPreviewDataSource;
|
|
};
|
|
|
|
@action
|
|
setComparisonImportAcctResult = comparisonImportAcctResult => {
|
|
this.comparisonImportAcctResult = comparisonImportAcctResult;
|
|
};
|
|
|
|
|
|
// 编辑薪资表单数据
|
|
@action
|
|
setAcctresultDetailForm = (acctresultDetailForm) => {
|
|
this.acctresultDetailForm = acctresultDetailForm;
|
|
};
|
|
// 初始化操作
|
|
@action
|
|
doInit = () => {
|
|
this.getCondition();
|
|
this.getTableDatas();
|
|
};
|
|
|
|
// 获得高级搜索表单数据
|
|
@action
|
|
getCondition = () => {
|
|
API.getCondition().then(action(res => {
|
|
if (res.api_status) { // 接口请求成功/失败处理
|
|
this.condition = res.condition;
|
|
this.form.initFormFields(res.condition); // 渲染高级搜索form表单
|
|
} else {
|
|
message.error(res.msg || "接口调用失败!");
|
|
}
|
|
}));
|
|
};
|
|
|
|
// 渲染table数据
|
|
@action
|
|
getTableDatas = (params) => {
|
|
this.loading = true;
|
|
const formParams = this.form.getFormParams() || {};
|
|
params = params || formParams;
|
|
API.getTableDatas(params).then(action(res => {
|
|
if (res.api_status) { // 接口请求成功/失败处理
|
|
this.tableStore.getDatas(res.datas); // table 请求数据
|
|
this.hasRight = res.hasRight;
|
|
} else {
|
|
message.error(res.msg || "接口调用失败!");
|
|
}
|
|
this.loading = false;
|
|
}));
|
|
};
|
|
|
|
@action
|
|
setShowSearchAd = bool => this.showSearchAd = bool;
|
|
|
|
// 高级搜索 - 搜索
|
|
@action doSearch = () => {
|
|
this.getTableDatas();
|
|
this.showSearchAd = false;
|
|
};
|
|
|
|
// 薪资记录--薪资核算列表
|
|
@action
|
|
getSalaryAcctList = (params = {}) => {
|
|
this.loading = true;
|
|
API.getSalaryAcctList(params).then(res => {
|
|
if (res.status) {
|
|
this.salaryListDataSource = res.data.list;
|
|
this.salaryListColumns = res.data.columns;
|
|
this.salaryListPageInfo = res.data;
|
|
} else {
|
|
message.error(res.errormsg || "获取失败");
|
|
}
|
|
this.loading = false;
|
|
});
|
|
};
|
|
|
|
// 薪资记录--保存薪资核算的基本信息
|
|
@action
|
|
saveBasic = (params = {}) => {
|
|
return new Promise((resolve, reject) => {
|
|
API.saveBasic(params).then(res => {
|
|
if (res.status) {
|
|
message.success("保存成功");
|
|
resolve(res.data);
|
|
} else {
|
|
message.error(res.errormsg || "保存失败");
|
|
reject();
|
|
}
|
|
});
|
|
});
|
|
|
|
};
|
|
|
|
// 薪资记录--薪资核算详情
|
|
@action
|
|
salaryacctGetForm = (id) => {
|
|
return new Promise((resolve, reject) => {
|
|
API.salaryacctGetForm({ id }).then(res => {
|
|
if (res.status) {
|
|
this.calculateBaseForm = res.data;
|
|
resolve(res.data);
|
|
} else {
|
|
message.error(res.errormsg || "获取失败");
|
|
reject();
|
|
}
|
|
});
|
|
});
|
|
};
|
|
|
|
// 核算人员--薪资核算人员确认列表
|
|
@action
|
|
acctemployeeList = (params) => {
|
|
const { departmentIds = "", positionIds = "", ...extraParams } = params || {};
|
|
params = {
|
|
...extraParams,
|
|
departmentIds: departmentIds ? departmentIds.split(",") : undefined,
|
|
positionIds: positionIds ? positionIds.split(",") : undefined
|
|
};
|
|
for (let key in params) {
|
|
if (params[key] === "") {
|
|
delete params[key];
|
|
}
|
|
}
|
|
API.acctemployeeList(params).then((res) => {
|
|
if (res.status) {
|
|
this.acctemployeeListDataSource = res.data.list ? res.data.list : [];
|
|
this.acctemployeeListColumns = res.data.columns;
|
|
this.acctemployeeListPageInfo = res.data;
|
|
} else {
|
|
message.error(res.errormsg || "获取失败");
|
|
}
|
|
});
|
|
};
|
|
|
|
// 核算人员--检查薪资核算人员的个税扣缴义务人
|
|
@action
|
|
checkTaxAgent = (id = "") => {
|
|
API.checkTaxAgent({ salaryAcctRecordId: id }).then(res => {
|
|
if (res.status) {
|
|
|
|
} else {
|
|
message.error(res.errormsg || "获取失败");
|
|
}
|
|
});
|
|
};
|
|
|
|
// 核算人员--薪资核算环比上期减少人员列表
|
|
@action
|
|
reducedemployeeList = (params) => {
|
|
this.loading = true;
|
|
const { departmentIds = "", positionIds = "", ...extraParams } = params || {};
|
|
params = {
|
|
...extraParams,
|
|
departmentIds: departmentIds ? departmentIds.split(",") : undefined,
|
|
positionIds: positionIds ? positionIds.split(",") : undefined
|
|
};
|
|
for (let key in params) {
|
|
if (params[key] === "") {
|
|
delete params[key];
|
|
}
|
|
}
|
|
API.reducedemployeeList(params).then(res => {
|
|
if (res.status) {
|
|
this.reducedemployeeListDataSource = res.data.list ? res.data.list : [];
|
|
this.reducedemployeeListColumns = res.data.columns;
|
|
this.reducedemployeeListPageInfo = res.data;
|
|
} else {
|
|
message.error(res.errormsg || "获取失败");
|
|
}
|
|
this.loading = false;
|
|
});
|
|
};
|
|
|
|
|
|
// 薪资记录--获取薪资核算的薪资周期、考勤周期等
|
|
@action
|
|
getSalarySobCycle = (id = "") => {
|
|
API.getSalarySobCycle({ salaryAcctRecordId: id }).then(res => {
|
|
if (res.status) {
|
|
this.baseSalarySobCycle = res.data;
|
|
this.getColumnDesc({ salaryAcctRecordId: id });
|
|
} else {
|
|
message.error(res.errormsg || "获取失败");
|
|
}
|
|
});
|
|
};
|
|
|
|
// 核算人员--添加薪资核算人员
|
|
@action
|
|
saveAcctemployee = (salaryAcctRecordId, employeeIds) => {
|
|
return new Promise((resolve, reject) => {
|
|
API.saveAcctemployee({ salaryAcctRecordId, employeeIds }).then(res => {
|
|
if (res.status) {
|
|
resolve();
|
|
} else {
|
|
message.error(res.errormsg || "保存失败");
|
|
reject();
|
|
}
|
|
});
|
|
});
|
|
};
|
|
|
|
|
|
// 核算人员--导出环比减少人员
|
|
@action
|
|
exportReducedEmployee = (id) => {
|
|
API.exportReducedEmployee(id);
|
|
};
|
|
|
|
// 核算人员--导出人员范围
|
|
@action
|
|
exportAcctEmployee = (id) => {
|
|
API.exportAcctEmployee(id);
|
|
};
|
|
|
|
// 核算人员--删除薪资核算人员
|
|
@action
|
|
deleteAcctemployee = (salaryAcctRecordId, ids) => {
|
|
return new Promise((resolve, reject) => {
|
|
API.deleteAcctemployee({ salaryAcctRecordId, ids }).then(res => {
|
|
if (res.status) {
|
|
message.success("删除成功");
|
|
resolve();
|
|
} else {
|
|
message.error(res.errormsg || "删除失败");
|
|
reject();
|
|
}
|
|
});
|
|
});
|
|
};
|
|
|
|
// 核算结果--列表
|
|
@action
|
|
acctResultList = (params = {}) => {
|
|
this.loading = true;
|
|
const { departmentIds = "", positionIds = "", consolidatedTaxation = "0", ...extraParams } = params || {};
|
|
params = {
|
|
...extraParams,
|
|
departmentIds: departmentIds ? departmentIds.split(",") : undefined,
|
|
positionIds: positionIds ? positionIds.split(",") : undefined,
|
|
consolidatedTaxation: consolidatedTaxation === "0" ? null : "1"
|
|
};
|
|
for (let key in params) {
|
|
if (params[key] === "") {
|
|
delete params[key];
|
|
}
|
|
}
|
|
return new Promise((resolve, reject) => {
|
|
API.acctResultList({ ...params }).then(res => {
|
|
if (res.status) {
|
|
let list = res.data.pageInfo.list ? res.data.pageInfo.list : [];
|
|
list.map(item => {
|
|
item.key = item.id;
|
|
});
|
|
this.acctResultListDateSource = list;
|
|
this.acctResultListPageInfo = res.data.pageInfo;
|
|
this.acctResultListColumns = res.data.columns;
|
|
resolve(res.data.columns);
|
|
this.getColumnDesc({ salaryAcctRecordId: params.salaryAcctRecordId });
|
|
} else {
|
|
message.error(res.errormsg || "");
|
|
reject();
|
|
}
|
|
this.loading = false;
|
|
});
|
|
});
|
|
};
|
|
|
|
@action
|
|
getColumnDesc = (params) => {
|
|
API.getColumnDesc(params).then(res => {
|
|
if (res.status) {
|
|
this.columnDescList = res.data;
|
|
} else {
|
|
message.error(res.errormsg);
|
|
}
|
|
});
|
|
};
|
|
|
|
// 核算结果--薪资核算
|
|
@action
|
|
acctresultAccounting = (params) => {
|
|
return new Promise((resolve, reject) => {
|
|
API.acctresultAccounting(params).then(res => {
|
|
if (res.status) {
|
|
resolve();
|
|
} else {
|
|
message.error(res.errormsg || "核算失败");
|
|
reject();
|
|
}
|
|
});
|
|
});
|
|
|
|
};
|
|
|
|
// 线下比对-列表
|
|
@action
|
|
comparisonresultList = (salaryAcctRecordId, params = {}) => {
|
|
API.comparisonresultList({ salaryAcctRecordId, ...params }).then(res => {
|
|
if (res.status) {
|
|
this.comparisonresultListDataSource = res.data.list ? res.data.list : [];
|
|
this.comparisonresultListColumns = res.data.columns;
|
|
} else {
|
|
message.error(res.errormsg || "获取失败");
|
|
}
|
|
});
|
|
};
|
|
|
|
// 核算人员--刷新薪资核算人员的个税扣缴义务人
|
|
@action
|
|
refreshTaxAgent = (salaryAcctRecordId) => {
|
|
return new Promise((resolve, reject) => {
|
|
API.refreshTaxAgent({ salaryAcctRecordId }).then(res => {
|
|
if (res.status) {
|
|
message.success("刷新成功");
|
|
resolve();
|
|
} else {
|
|
message.error(res.errormsg || "刷新失败");
|
|
reject();
|
|
}
|
|
});
|
|
});
|
|
};
|
|
|
|
// 薪资核算-编辑表单
|
|
@action
|
|
acctresultDetail = (id) => {
|
|
API.acctresultDetail({ id }).then(res => {
|
|
if (res.status) {
|
|
this.acctresultDetailForm = res.data;
|
|
} else {
|
|
message.error(res.errormsg || "获取失败");
|
|
}
|
|
});
|
|
};
|
|
|
|
// 薪资记录--删除薪资核算记录
|
|
@action
|
|
deleteSalaryacct = (ids) => {
|
|
return new Promise((resolve, reject) => {
|
|
API.deleteSalaryacct(ids).then(res => {
|
|
if (res.status) {
|
|
message.success("删除成功");
|
|
resolve();
|
|
} else {
|
|
message.error(res.errormsg || "删除失败");
|
|
reject();
|
|
}
|
|
});
|
|
});
|
|
};
|
|
|
|
// 薪资记录--归档薪资核算记录
|
|
@action
|
|
fileSalaryAcct = (id) => {
|
|
return new Promise((resolve, reject) => {
|
|
API.fileSalaryAcct({ id }).then(res => {
|
|
if (res.status) {
|
|
resolve();
|
|
} else {
|
|
message.error(res.errormsg || "归档失败");
|
|
reject(res);
|
|
}
|
|
});
|
|
});
|
|
};
|
|
|
|
// 薪资记录-重新核算
|
|
@action
|
|
reAccounting = (salaryAcctRecordId) => {
|
|
return new Promise((resolve, reject) => {
|
|
API.reAccounting({ salaryAcctRecordId }).then(res => {
|
|
if (res.status) {
|
|
message.success("保存成功");
|
|
resolve();
|
|
} else {
|
|
message.error(res.errormsg || "保存失败");
|
|
reject();
|
|
}
|
|
});
|
|
});
|
|
};
|
|
// 薪资记录-回算
|
|
@action
|
|
backCalculate = (salaryAcctRecordId) => {
|
|
return new Promise((resolve, reject) => {
|
|
API.backCalculate({ salaryAcctRecordId }).then(res => {
|
|
if (res.status) {
|
|
message.success("回算成功");
|
|
resolve();
|
|
} else {
|
|
message.error(res.errormsg || "回算失败");
|
|
reject();
|
|
}
|
|
});
|
|
});
|
|
};
|
|
|
|
// 薪资结果-编辑表单保存
|
|
@action
|
|
saveAcctResult = (recordId) => {
|
|
const itemsByGroupItems = _.reduce(this.acctresultDetailForm.itemsByGroup, (pre, cur) => {
|
|
return [
|
|
...pre,
|
|
..._.map(cur.salaryItems, it => {
|
|
return {
|
|
salaryItemId: it.salaryItemId,
|
|
resultValue: (it.dataType === "number" && !!it.resultValue) ? toDecimal_n(it.resultValue, it.pattern || 2) : it.resultValue
|
|
};
|
|
})
|
|
];
|
|
}, []);
|
|
|
|
const issuedAndReissueItems = this.acctresultDetailForm.issuedAndReissueItems.map(item => {
|
|
let record = {};
|
|
record.salaryItemId = item.salaryItemId;
|
|
record.resultValue = (item.dataType === "number" && !!item.resultValue) ? toDecimal_n(item.resultValue, item.pattern || 2) : item.resultValue;
|
|
return record;
|
|
});
|
|
|
|
let items = itemsByGroupItems.concat(issuedAndReissueItems);
|
|
let params = {
|
|
salaryAcctEmpId: recordId,
|
|
items
|
|
};
|
|
return new Promise((resolve, reject) => {
|
|
API.saveAcctResult(params).then(res => {
|
|
if (res.status) {
|
|
message.success("保存成功");
|
|
resolve();
|
|
} else {
|
|
message.error(res.errormsg || "保存失败");
|
|
reject();
|
|
}
|
|
});
|
|
});
|
|
|
|
};
|
|
|
|
// 获取导入字段设置
|
|
@action
|
|
getImportField = (salaryAcctRecordId) => {
|
|
return new Promise((resolve, reject) => {
|
|
API.getImportField({ salaryAcctRecordId }).then(res => {
|
|
if (res.status) {
|
|
this.importFieldData = res.data;
|
|
resolve(res.data);
|
|
} else {
|
|
message.error(res.errormsg || "获取失败");
|
|
reject();
|
|
}
|
|
});
|
|
});
|
|
|
|
};
|
|
|
|
// 下载薪资导入核算模板
|
|
@action
|
|
getImportTemplate = (salaryItemIds, salaryAcctRecordId) => {
|
|
API.getImportTemplate(salaryItemIds, salaryAcctRecordId);
|
|
};
|
|
|
|
// 核算结果-导入预览
|
|
@action
|
|
fetchPreviewAcctResult = (params) => {
|
|
API.previewAcctResult(params).then((res) => {
|
|
if (res.status) {
|
|
this.previewAcctResultList = res.data;
|
|
this.previewAcctResultColumns = res.data.headers.map((item, index) => {
|
|
let column = {};
|
|
column.title = item;
|
|
column.dataIndex = "" + index;
|
|
column.key = index + "";
|
|
return column;
|
|
});
|
|
|
|
this.previewAcctResultDataSource = res.data.list.map((item) => {
|
|
let data = {};
|
|
item.map((i, index) => {
|
|
data[index + ""] = i;
|
|
});
|
|
return data;
|
|
});
|
|
} else {
|
|
message.error(res.errormsg || "获取失败");
|
|
}
|
|
});
|
|
};
|
|
|
|
// 核算结果-导入
|
|
@action
|
|
fetchImportAcctResult = (params) => {
|
|
API.importAcctResult(params).then(res => {
|
|
if (res.status) {
|
|
this.importAcctResult = res.data;
|
|
} else {
|
|
message.error(res.errormsg || "导入失败");
|
|
}
|
|
});
|
|
};
|
|
|
|
// 核算结果-导出全部
|
|
@action
|
|
exportAll = (salaryAcctRecordId, ids = "") => {
|
|
API.exportAcctResult(salaryAcctRecordId, ids);
|
|
};
|
|
|
|
// 线下对比-列表
|
|
@action
|
|
fetchComparisonResultList = (params) => {
|
|
this.loading = true;
|
|
API.comparisonResultList(params).then(res => {
|
|
if (res.status) {
|
|
this.comparisonResultPageInfo = res.data;
|
|
this.comparisonResultColumns = res.data.columns;
|
|
// this.comparisonResultTableStore.getDatas(res.data.dataKey.datas)
|
|
} else {
|
|
message.error(res.errormsg || "获取失败");
|
|
}
|
|
this.loading = false;
|
|
});
|
|
};
|
|
|
|
// 线下对比-导入模板
|
|
@action
|
|
exportImportTemplate = (salaryAcctRecordId) => {
|
|
API.exportImportTemplate(salaryAcctRecordId);
|
|
};
|
|
|
|
// 线下对比--导入预览
|
|
@action
|
|
previewComparisonResult = (params) => {
|
|
API.previewComparisonResult(params).then(res => {
|
|
if (res.status) {
|
|
this.comparisonPreviewColumns = res.data.headers.map((item, index) => {
|
|
let column = {};
|
|
column.title = item;
|
|
column.dataIndex = "" + index;
|
|
column.key = index + "";
|
|
return column;
|
|
});
|
|
|
|
this.comparisonPreviewDataSource = res.data.list.map((item) => {
|
|
let data = {};
|
|
item.map((i, index) => {
|
|
data[index + ""] = i;
|
|
});
|
|
return data;
|
|
});
|
|
} else {
|
|
message.error(res.errormsg || "获取失败");
|
|
}
|
|
});
|
|
};
|
|
|
|
// 线下对比-导入
|
|
@action
|
|
importComparisonExcelAcctResult = (params) => {
|
|
API.importComparisonExcelAcctResult(params).then(res => {
|
|
if (res.status) {
|
|
this.comparisonImportAcctResult = res.data;
|
|
} else {
|
|
message.error(res.errormsg || "获取失败");
|
|
}
|
|
});
|
|
};
|
|
|
|
// 线下对比-导出
|
|
@action
|
|
exportComparisonResult = (salaryAcctRecordId) => {
|
|
API.exportComparisonResult(salaryAcctRecordId);
|
|
};
|
|
|
|
// 核算进度条
|
|
@action
|
|
getCalculateProgress = (id) => {
|
|
return new Promise((resolve, reject) => {
|
|
API.getCalculateProgress(id).then(res => {
|
|
if (res.status) {
|
|
let progress = 0;
|
|
try {
|
|
progress = Number(res.data.progress) * 100;
|
|
} catch (err) {
|
|
}
|
|
resolve(res.data);
|
|
} else {
|
|
message.error(res.errormsg || "获取失败");
|
|
reject();
|
|
}
|
|
});
|
|
});
|
|
};
|
|
|
|
@action("更新薪资核算结果的锁定状态")
|
|
updateLockStatus = (params) => {
|
|
return API.updateLockStatus(params);
|
|
};
|
|
}
|