出差报销

master
xy 1 year ago
parent 6b53abe37b
commit 55d5446aa9

@ -192,6 +192,7 @@ export default {
}}
>
<el-table-column
label=" "
fixed='left'
align='center'
width='60'

@ -34,6 +34,11 @@
个人信息
</el-dropdown-item>
</router-link>
<router-link to="/install" target="_blank">
<el-dropdown-item>
软件安装
</el-dropdown-item>
</router-link>
<el-dropdown-item v-if="!$store.state.app.isInElectron" class="user-logout" divided @click.native="logout">
<span style="display: block">退出</span>
</el-dropdown-item>
@ -151,6 +156,7 @@ export default {
}
},
methods: {
async logout() {
if (this.$store.state.app.isInElectron) {
return

@ -71,6 +71,11 @@ export const constantRoutes = [{
],
hidden: true,
},
{
path: "/install",
component: () => import("@/views/install"),
hidden: true
}
]
/**

@ -0,0 +1,611 @@
<template>
<div>
<!-- 付款登记-->
<xy-dialog
title="付款登记"
:is-show.sync="isShowPaymentRegistration"
type="form"
class="payment-registration"
:form="paymentRegistrationForm"
:rules="paymentRegistrationRules"
@submit="submit"
ref="paymentRegistration"
>
<template v-slot:extraFormTop>
<div class="payment-registration-row">
<div class="payment-registration-row-title">出差名称</div>
<div class="payment-registration-row-content">
{{ contract.title }}
</div>
</div>
</template>
<template v-slot:applyMoney>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>申请付款金额
</div>
<div class="xy-table-item-content xy-table-item-price">
<el-input
clearable
placeholder="请填写付款金额"
v-model="paymentRegistrationForm.applyMoney"
style="width: 150px"
/>
</div>
</div>
</template>
<template v-slot:audit_money>
<div class="xy-table-item">
<div class="xy-table-item-label">审计金额</div>
<div class="xy-table-item-content xy-table-item-price">
<el-input
clearable
placeholder="请填写审计金额"
v-model="form.audit_money"
style="width: 150px"
/>
</div>
</div>
</template>
<template v-slot:deductionMoney>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>本期扣款金额
</div>
<div class="xy-table-item-content xy-table-item-price">
<el-input
clearable
placeholder="请填写扣款金额"
v-model="paymentRegistrationForm.deductionMoney"
style="width: 150px"
/>
</div>
</div>
</template>
<template v-slot:remark>
<div class="xy-table-item">
<div class="xy-table-item-label">备注</div>
<div class="xy-table-item-content">
<el-input
type="textarea"
clearable
placeholder="备注"
v-model="paymentRegistrationForm.remark"
style="width: 300px"
/>
</div>
</div>
</template>
<template v-slot:type>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>款项类型
</div>
<div class="xy-table-item-content">
<el-select
placeholder="选择款项类型或直接录入其他类型"
v-model="paymentRegistrationForm.type"
style="width: 150px"
filterable
allow-create
clearable
>
<el-option
v-for="item in paymentType"
:key="item"
:label="item"
:value="item"
>
</el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:isLast>
<div class="xy-table-item">
<div class="xy-table-item-label" style="width: 200px">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>是否为最后一笔
</div>
<div class="xy-table-item-content">
<el-switch v-model="paymentRegistrationForm.isLast" />
<!-- @change="toggleSelection"-->
</div>
</div>
</template>
<template #files v-if="paymentRegistrationForm.type === '结算款'">
<div class="xy-table-item">
<div class="xy-table-item-label">
附件
</div>
<div class="xy-table-item-content">
<el-upload
style="width: 300px"
ref="upload"
multiple
:on-success="successHandle"
:before-upload="uploadBefore"
accept=".rar,.zip,.doc,.docx,.pdf,.jpg,.png,.gif,.mp4,.xls,.xlsx"
:action="action"
:file-list="fileList"
:auto-upload="false"
:on-remove="removeHande"
:limit="10"
>
<el-button slot="trigger" size="small" type="primary"
>选取文件</el-button
>
<el-button
style="margin-left: 10px"
size="small"
type="success"
@click="$refs['upload'].submit()"
>开始上传</el-button
>
<div slot="tip" class="el-upload__tip">
支持文件格式.rar .zip .doc .docx .pdf .jpg .png .gif .mp4 .xls
.xlsx
<br />单个文件不能超过20M
</div>
</el-upload>
</div>
</div>
</template>
<template v-slot:extraFormBottom>
<div style="display: flex;align-items: center;">
<el-select
placeholder="科室选择"
clearable
size="small"
v-model="plansSelect.plan_department_id"
style="width: 160px"
>
<el-option
v-for="item in departments"
:label="item.name"
:value="item.id"
:key="item.id"
>
</el-option>
</el-select>
<el-cascader
:options="planTypes"
:props="{
checkStrictly: false,
label: 'name',
value: 'id',
}"
:value="plansSelect.type"
clearable
size="small"
style="width: 160px;margin-left: 6px;"
@change="(e) => (plansSelect.type = e[e.length - 1] || '')"
/>
<Input style="margin-left: 6px;" search enter-button=" " placeholder="搜索预算计划.." v-model="plansSelect.name" @on-search="getBudgets" />
</div>
<xy-table
:list="plans"
:show-index="false"
:table-item="planTable"
:height="310"
style="margin-top: 10px"
ref="planTable"
@select="selectPlan"
>
<template v-slot:btns>
<el-table-column label="使用金额(元)" header-align="center">
<template slot-scope="scope">
<Input
:value="scope.row.useMoney"
@input="(e) => (scope.row.useMoney = e)"
/>
</template>
</el-table-column>
</template>
</xy-table>
<div style="display: flex; justify-content: flex-end">
<Page :total="planTotal" show-elevator @on-change="pageChange" />
</div>
</template>
</xy-dialog>
</div>
</template>
<script>
import {getparameter, getparameterTree} from "@/api/system/dictionary";
import { getFundLog, addFundLog } from "@/api/paymentRegistration/fundLog";
import { getBudget } from "@/api/budget/budget";
import { detailContract, editorContract } from "@/api/contract/contract";
import { Message } from "element-ui";
import {deepCopy, parseTime} from "@/utils";
import {getOatoken} from "@/api/oatoken";
import {listdeptNoAuth} from "@/api/system/department";
import { save } from "@/api/away";
export default {
data() {
return {
departments: [],
plansSelect: {
page: 1,
page_size: 10,
name: '',
plan_department_id: "",
type: ""
},
flowIds: [
{
flow_id: 14,
name: "供应品验收",
},
{
flow_id: 57,
name: "固定资产验收"
}
],
fileList: [],
action: process.env.VUE_APP_UPLOAD_API,
searchContent: "",
planTotal: 0,
pageIndex: 1,
//
plans: [],
planTypes: [],
contract: {},
payment: [], //
payTable: [
{
label: "申请金额",
prop: "apply_money",
sortable: false,
width: 160,
align: "right",
},
{
label: "已付金额",
prop: "act_money",
sortable: false,
width: 160,
align: "right",
},
{
label: "时间",
prop: "created_at",
sortable: false,
width: 120,
formatter: (t1, t2, value) => {
return parseTime(new Date(value), "{y}-{m}-{d}");
},
},
],
paymentType: ["进度款", "结算款", "质保金"],
isShowPaymentRegistration: false,
paymentRegistrationForm: {
applyMoney: "",
plan: [],
remark: "",
files: []
},
form: {
audit_money: 0,
},
paymentRegistrationRules: {
applyMoney: [
{
required: true,
message: "必填",
},
{
pattern: /^\d+(\.\d+)?$/,
message: "必须为数字",
},
]
},
planTable: [
{
sortable: false,
width: 46,
type: "selection",
},
{
label: "分类",
prop: "type_detail.value",
},
{
label: "名称",
prop: "name",
align: "left",
},
{
label: "计划金额",
prop: "money",
align: "right",
},
],
};
},
methods: {
//
successHandle(response, file, fileList) {
this.fileList = fileList;
},
removeHande(file, fileList) {
this.fileList = fileList;
},
uploadBefore(file) {
console.log(file);
if ((file.size / 1000) > (20 * 1024)) {
this.$message({
type: "warning",
message: "上传图片大小超过2M",
});
return false;
}
},
async getPlanTypes() {
const res = await getparameterTree({
id: 3
});
const dataHandler = (data) => {
data.forEach(i => {
if (i.hasOwnProperty('detail')) {
i.children = i.detail.map(j => {
j.name = j.value
return j;
})
} else {
dataHandler(i['children'])
}
})
return data;
}
this.planTypes = dataHandler(res?.children) || []
},
//
pageChange(e) {
this.pageIndex = e;
this.getBudgets();
},
//
totalApplyMoney() {
let total = 0.0;
this.payment.map((item) => {
total += Number(item.apply_money);
});
return total.toFixed(2);
},
//
totalMoney() {
let total = 0.0;
this.payment.map((item) => {
total += Number(item.act_money);
});
return total.toFixed(2);
},
//
actNumsTotal() {
let total = 0;
this.payment.map((item) => {
if (Number(item.act_money)) {
total++;
}
});
return total;
},
//
percentPay() {
let total = this.totalMoney();
return ((total / this.contract.money) * 100 || 0).toFixed(2) || 0;
},
//
async getContract(info) {
this.contract = await info;
const res = await getFundLog({
away_id: this.contract.id,
fund_type: 2
})
this.payment = res.data;
this.paymentRegistrationForm.plan = [];
this.payment = [];
this.fileList = []
},
submit() {
let data = {
fund_type: 2,
away_id: this.contract.id,
apply_money: this.paymentRegistrationForm.applyMoney,
//discount_money: this.paymentRegistrationForm.deductionMoney,
remark: this.paymentRegistrationForm.remark,
contract_plan_act_links: this.paymentRegistrationForm.plan,
};
addFundLog(data).then((res) => {
save({
...this.contract,
financial_status: 2
})
//
// editorContract({
// id: this.contract.id,
// audit_money: this.form.audit_money,
// }).then((r) => {
// this.$emit("paid", {
// name: this.contract?.name,
// type: this.contract?.type,
// number: this.contract?.number,
// id: this.contract?.id,
// reason: this.paymentRegistrationForm.remark,
// yizhifucishu: this.actNumsTotal(),
// yizhifujine: this.totalMoney(),
// zongjia: this.contract?.money,
// zhifucishu: this.contract?.sign_plan?.length || 0,
// total: data.apply_money,
// out_pay_id: res,
// });
// this.isShowPaymentRegistration = false;
// Message({
// type: "success",
// message: "",
// });
// });
this.$refs["paymentRegistration"].reset();
this.$emit('refresh')
this.$message.success("操作成功");
this.isShowPaymentRegistration = false;
});
},
//
//
async getBudgets() {
let res = await getBudget({
top_pid: 1,
...this.plansSelect
});
this.plans = res.list.data;
this.planTotal = res.list.total;
// this.toggleSelection(this.paymentRegistrationForm.plan.map(item => {
// return item.plan_id
// }))
setTimeout(() => {
this.$nextTick(() => this.$refs["planTable"].doLayout())
},500)
},
planPageChange(e) {
this.plansSelect.page = e
this.getBudgets();
},
selectPlan(sel, row) {
if (sel) {
this.paymentRegistrationForm.plan = sel.map((item) => {
return {
plan_id: item.id,
use_money: item.useMoney,
new_money: item.money,
};
});
} else {
this.paymentRegistrationForm.plan = [];
}
},
toggleSelection(e) {
if (!e) {
return;
}
let plans = this.paymentRegistrationForm.plan.map((item) => {
return item.plan_id;
});
if (plans) {
this.plans
.filter((plan) => {
return plans.includes(plan.id);
})
.map((row) => {
this.$nextTick(() => {
this.$refs["planTable"].toggleRowSelection(row);
});
});
} else {
this.$refs["planTable"].clearSelection();
}
},
//
getDepartment() {
listdeptNoAuth().then((res) => {
this.departments = res;
});
},
},
computed: {
priceFormat() {
return function (price) {
return Number(price)
.toFixed(2)
.replace(/(\d)(?=(\d{3})+\.)/g, "$1,");
};
},
nameFormat () {
return function(index) {
if (index == 2) {
return '报销'
}
if (index == 3) {
return '其他支出'
}
return '合同'
}
}
},
watch: {
isShowPaymentRegistration(newVal) {
if (newVal) {
this.getBudgets();
}
},
},
mounted() {
this.getPlanTypes();
},
created() {
this.getDepartment()
}
};
</script>
<style scoped lang="scss">
.payment-registration {
&-row {
display: flex;
padding: 6px 0;
&-title {
padding: 0 10px;
}
&-content {
}
}
}
.xy-table-item-label {
width: 200px;
}
.xy-table-item-price {
position: relative;
&::after {
z-index: 1;
position: absolute;
right: 0;
top: 0;
content: "(元)";
}
::v-deep .el-input__clear {
position: relative;
right: 30px;
z-index: 2;
}
}
</style>

@ -138,20 +138,12 @@
<template v-else #default="{ row }">
<template v-if="row.FLOWSTATUS.expense.getStatus() === 3">
<Button
v-if="row.FLOWSTATUS.financial.getStatus() === 2"
v-if="row.FLOWSTATUS.financial.getStatus() !== 2"
style="margin: 2px;"
size="small"
type="primary"
@click="examineAway(row,1)"
@click="$refs['examineAway'].getContract(row);$refs['examineAway'].isShowPaymentRegistration=true;"
ghost
>审核取消
</Button>
<Button
v-else
style="margin: 2px;"
size="small"
type="primary"
@click="examineAway(row,2)"
>审核确认
</Button>
</template>
@ -197,16 +189,19 @@
</div>
</div>
<addAway ref="addAway" @refresh="getList"></addAway>
<examineAway ref="examineAway" @refresh="getList"></examineAway>
</div>
</template>
<script>
import examineAway from "@/views/away/component/examineAway.vue";
import addAway from "@/views/away/component/addAway.vue"
import { index, destroy, save } from "@/api/away";
export default {
components: {
addAway
addAway,
examineAway
},
data() {
return {
@ -389,6 +384,9 @@ export default {
}
},
methods: {
showExamineAway () {
},
async toOaDetail (tbname,row) {
let url = `${process.env.VUE_APP_OUT_URL}/flow/view/`
switch (tbname) {
@ -573,7 +571,7 @@ export default {
this.getList()
})
})
}
},
},
computed: {
isAuthEdit () {

@ -1,6 +1,6 @@
<template>
<div>
<Modal v-model="isShow" title="中标公告上传" @on-ok="submit">
<Modal v-model="isShow" title="中标/比价结果" @on-ok="submit">
<el-upload
style="width: 300px"
ref="upload"

@ -127,9 +127,10 @@
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>资金渠道
</div>
<div class="xy-table-item-content">
<el-select multiple clearable placeholder="请选择资金渠道" v-model="detail.fundingChannels" style="width: 300px;">
<el-option v-for="item in moneyWay" :value="item.id" :label="item.value"></el-option>
</el-select>
<el-input readonly placeholder="请填写采购预算价" :value="detail.money_way_detail instanceof Array ? detail.money_way_detail.map(i => i.value).toString() : ''" style="width: 300px;" />
<!-- <el-select multiple clearable disabled placeholder="请选择资金渠道" v-model="detail.fundingChannels" style="width: 300px;">-->
<!-- <el-option v-for="item in moneyWay" :value="item.id" :label="item.value"></el-option>-->
<!-- </el-select>-->
</div>
</div>
</template>
@ -771,6 +772,7 @@ import { resetSelect } from '@/utils'
is_framework:res.is_framework,
use_framework_buy: res.use_framework_buy,
contract_to_contracts: res.contract_to_contracts,
money_way_detail: res.money_way_detail,
plan: res.plans.map(item => {
return {
label: item.name,

@ -551,6 +551,7 @@ export default {
zhifucishu: this.contract?.sign_plan?.length || 0,
total: data.apply_money,
out_pay_id: res,
applyMoney: data.apply_money
});
this.isShowPaymentRegistration = false;
Message({

@ -303,6 +303,7 @@
multiple
size="small"
clearable
disabled
placeholder="请选择资金渠道"
:value="
form.money_way_id
@ -1338,12 +1339,27 @@ export default {
},
//
async getMoneyWay() {
this.moneyWay =
(
await getparameter({
number: "money_way",
})
)?.detail || [];
this.moneyWay = [];
const res = await getparameterTree({
id: 3
});
const dataHandler = (data) => {
data.forEach(i => {
if (i.hasOwnProperty('detail')) {
this.moneyWay.push(...i.detail)
} else {
dataHandler(i['children'])
}
})
}
dataHandler(res?.children)
console.log("this.moneyWay",this.moneyWay)
// this.moneyWay =
// (
// await getparameter({
// number: "money_way",
// })
// )?.detail || [];
},
//
async getPurchaseWay() {
@ -1449,6 +1465,7 @@ export default {
return;
}
}
this.form.money_way_id = Array.from(new Set(selections.map(i => i.type))).toString();
this.form.contract_plan_links = selections.map((i) => ({
plan_id: i.id,
use_money: i._inputMoney,

@ -586,6 +586,7 @@
签订修改
</Button>
</template>
<Button class="slot-btns-item" size="small" type="primary" @click="printFlow(scope.row)"></Button>
</div>
</Poptip>
</div>
@ -2181,6 +2182,22 @@ export default {
};
},
methods: {
printFlow (row) {
let id;
if (row.purchase_last_flow_id) {
id = row.purchase_last_flow_id;
} else if (row.join_last_flow_id) {
id = row.join_last_flow_id
} else if (row.other_flow_id) {
id = row.other_flow_id
} else {}
if (!id) {
this.$message.warning("未找到流程");
return
}
window.open(`${process.env.VUE_APP_OUT_URL}/flow/print-relate-flow?id=${id}&except_self=0&auth_token=${this.$store.getters.oa_token}`,"_blank")
},
showIsFramework () {
this.$nextTick(() => {
if (this.$refs['methodInput'].selected.label === '直接发包' && this.form.use_framework_buy) {
@ -2204,7 +2221,7 @@ export default {
url += row.other_flow_id
break;
default:
url = `${process.env.VUE_APP_OUT_URL}/admin/flow/list/todo`
url = `${process.env.VUE_APP_OUT_URL}/flow/list/todo`
}
window.open(
url,
@ -2411,7 +2428,8 @@ export default {
"658a70750b3cf": row?.yizhifujine,
"658a7036916f6": row?.zongjia,
"658a7059b6531": row?.zhifucishu,
total: row?.total
total: row?.total,
"658a6fafb27ac": row?.applyMoney
//"\\":row.supply
};
let url = `${process.env.VUE_APP_OUT_OLD}/flow/create/18?auth_token=${this.$store.getters.oa_token}&out_pay_id=${

@ -164,6 +164,7 @@ import { fundlogFlow,httpCurl } from "@/api/out";
import { getFundLog, delFundLog } from "@/api/paymentRegistration/fundLog";
import { parseTime } from "@/utils";
import { Message } from "element-ui";
import { show } from "@/api/away"
import printRegistration from "./components/printRegistration";
import detailPaymentRegistration from "./components/detailPaymentRegistration";
@ -196,6 +197,9 @@ export default {
prop: "contract.name",
align: "left",
fixed: "left",
customFn: row => {
return (<span>{ row.contract_id ? row.contract.name : row.away.title }</span>)
}
},
{
label: "付款申请金额(元)",
@ -267,9 +271,9 @@ export default {
label: "次数",
prop: "pay_count",
width: 95,
formatter: (cell, data, value) => {
return value + 1;
},
customFn: row => {
return (<span>{ row.contract_id ? row.pay_count : row.pay_count_away }</span>)
}
},
{
label: "是否为最后一笔",
@ -334,11 +338,9 @@ export default {
let payments = [];
const actNumsTotal = () => {
let total = 0;
payments.map((item) => {
if (Number(item.act_money)) {
total++;
}
});
payments.reduce((pre,cur) => {
return Number(cur.act_money) ? ++pre : pre;
},0);
return total;
};
const totalMoney = () => {
@ -348,7 +350,13 @@ export default {
});
return total.toFixed(2);
};
const contract = await detailContract({ id: row.contract_id });
let contract;
if (row.contract_id) {
contract = await detailContract({ id: row.contract_id });
} else {
contract = await show({ id: row.away_id });
}
payments =
(
await getFundLog({
@ -363,7 +371,6 @@ export default {
]);
let baseInfo = {
"flow_title": row.name || "",
title: contract?.name,
xiangmuleibie: typeMap.get(
[
{
@ -382,7 +389,6 @@ export default {
return item.value === contract.type;
})?.label
),
things: contract?.name,
"658a6f87c4a75": contract?.number,
out_pay_id: row?.id,
"658a70251f0f4": row?.remark,
@ -390,7 +396,7 @@ export default {
"658a70750b3cf": totalMoney(),
"658a7036916f6": contract?.money,
"658a7059b6531": payments.length,
total: row?.apply_money,
"658a6fafb27ac": row?.apply_money,
//"\\":row.supply
};
let url = `${process.env.VUE_APP_OUT_OLD}/flow/create/18?auth_token=${this.$store.getters.oa_token}&out_pay_id=${

@ -200,7 +200,37 @@
</div>
</template>
<template v-slot:extraFormBottom>
<Input search enter-button=" " placeholder="搜索预算计划.." v-model="plansSelect.name" @on-search="getBudgets" />
<div style="display: flex;align-items: center;">
<el-select
placeholder="科室选择"
clearable
size="small"
v-model="plansSelect.plan_department_id"
style="width: 160px"
>
<el-option
v-for="item in departments"
:label="item.name"
:value="item.id"
:key="item.id"
>
</el-option>
</el-select>
<el-cascader
:options="planTypes"
:props="{
checkStrictly: false,
label: 'name',
value: 'id',
}"
:value="plansSelect.type"
clearable
size="small"
style="width: 160px;margin-left: 6px;"
@change="(e) => (plansSelect.type = e[e.length - 1] || '')"
/>
<Input style="margin-left: 6px;" search enter-button=" " placeholder="搜索预算计划.." v-model="plansSelect.name" @on-search="getBudgets" />
</div>
<div class="contract-add-plan" style="min-width: 300px;">
<template v-if="paymentRegistrationForm.plan.length > 0">
<template v-for="item in paymentRegistrationForm.plan">
@ -249,10 +279,12 @@ import {
parseTime,
moneyFormatter, deepCopy
} from "@/utils";
import {listdeptNoAuth} from "@/api/system/department";
export default {
data() {
return {
departments: [],
flowIds: [
{
flow_id: 14,
@ -678,7 +710,13 @@ import {
} catch (e) {
this.flowIds = copy
}
}
},
//
getDepartment() {
listdeptNoAuth().then((res) => {
this.departments = res;
});
},
},
computed: {
moneyFormat() {
@ -698,6 +736,7 @@ import {
}
},
async mounted() {
this.getDepartment()
//await this.getBudgets()
await this.getPlanTypes()
await this.getAssetsFlowIds()

@ -255,6 +255,9 @@ export default {
prop: "contract.name",
fixed: "left",
align: "left",
customFn: row => {
return (<span>{ row.contract_id ? row.contract.name : row.away.title }</span>)
}
},
{
label: "付款申请金额(元)",
@ -328,9 +331,9 @@ export default {
label: "次数",
prop: "pay_count",
width: 95,
formatter: (cell, data, value) => {
return value + 1;
},
customFn: row => {
return (<span>{ row.contract_id ? row.pay_count : row.pay_count_away }</span>)
}
},
{
label: "最后一笔",

@ -0,0 +1,37 @@
<template>
<div style="padding: 40px;">
<el-card header="安装列表">
<el-table :show-header="false" :data="list" size="small">
<el-table-column type="index"></el-table-column>
<el-table-column prop="name">
<template #default="{ row }">
<el-link type="primary">{{ row.name }}</el-link>
</template>
</el-table-column>
<el-table-column prop="support"></el-table-column>
<el-table-column prop="created_at"></el-table-column>
</el-table>
</el-card>
</div>
</template>
<script>
export default {
data() {
return {
list: [
{
name: "123.exe",
support: "wind10+",
created_at: this.$moment().format("YYYY-MM-DD")
}
]
}
},
methods: {},
computed: {},
}
</script>
<style scoped lang="scss">
</style>
Loading…
Cancel
Save