Parcourir la source

Merge branch 'dev' of http://36.137.93.232:3000/hf/byte-sailing-mobile into dev

cz il y a 1 an
Parent
commit
ec385a7a78

+ 20 - 0
src/lang/cnLXF.js

@@ -309,6 +309,26 @@ export function cnLXF() {
       remarksMsg: "请输入付款条件",
       warranty: "质保期 (天)",
     },
+    invoice: {
+      name: "发票管理",
+      supplyName: "供应商",
+      supplyNameMsg: " 请选择供应商",
+      type: "发票类型",
+      typeMsg: "请选择发票类型",
+      money: "发票金额",
+      add: "添加发票",
+      edit: "编辑发票",
+      invoiceAmount: "开票金额",
+      invoiceAmountMsg: "请输入开票金额",
+      purchaseContract: "采购合同",
+      contractCode: "合同编号",
+      contractMoney: "合同金额",
+      receivedInvoice: "已收发票",
+      relatedAmount: "关联金额",
+      relatedAmountMsg: "请输入关联金额",
+      supplierNoContract: "该供应商暂无关联合同",
+      unequalAmounts: "开票金额不等于关联金额",
+    },
   };
   return cnLXF;
 }

+ 5 - 0
src/main.js

@@ -9,6 +9,8 @@ app.use(i18n).mount("#app");
 import { uploadDdRightBtn } from "@/utils/ddAdapter";
 import { post, get } from "@/utils/axios";
 
+import store from './store'
+
 app.config.globalProperties.get = get;
 app.config.globalProperties.post = post;
 // 金额千分符
@@ -23,6 +25,9 @@ app.config.globalProperties.uploadDdRightBtn = uploadDdRightBtn;
 // form组件 select change事件回填
 app.config.globalProperties.formChange = formChange;
 app.config.globalProperties.formChangeTwo = formChangeTwo;
+//pinia
+app.use(store);
+
 
 //中英文全局挂载
 app.config.globalProperties.t = i18n.global.t;

+ 10 - 0
src/router/routerLXF.js

@@ -145,6 +145,16 @@ export function routesLXF() {
       name: "销售合同",
       component: () => import("../views/salesContract/contract/index.vue"),
     },
+    {
+      path: "invoice",
+      name: "发票管理",
+      component: () => import("../views/purchase-payment/invoice/index.vue"),
+    },
+    {
+      path: "invoiceAdd",
+      name: "添加发票",
+      component: () => import("../views/purchase-payment/invoice/add.vue"),
+    },
   ];
   return routesLXF;
 }

+ 3 - 0
src/store/index.js

@@ -0,0 +1,3 @@
+import { createPinia } from "pinia";
+const store = createPinia();
+export default store;

+ 90 - 95
src/views/processApproval/components/SendSubscribe.vue

@@ -4,7 +4,11 @@
 			<van-tab title="申购信息">
 				<div class="common-process-card">
 					<div class="common-title">申购信息</div>
-					<van-form @submit="onSubmit" label-align="top" style="margin-top: 20px">
+					<van-form 
+						@submit="onSubmit" 
+						label-align="top" 
+						style="margin-top: 20px" 
+						:readonly="route.query.processType == 10 || route.query.processType == 20">
 						<van-cell-group inset>
 							<van-field
 								v-model="formData.deptName"
@@ -13,8 +17,7 @@
 								:label="$t('purchased.procurementDepartment')"
 								:placeholder="$t('purchased.selectProcurementDepartment')"
 								:rules="[{ required: true, message: $t('purchased.procurementDepartmentCanNotBeEmpty') }]"
-								@click="submitType === 'edit' ? typeModal = false : typeModal = true"
-								:readonly="submitType === 'edit'"
+								@click="route.query.processType == 10 || route.query.processType == 20 ? typeModal = false : typeModal = true"
 								required
 							/>
 							<van-popup v-model:show="typeModal" round position="bottom">
@@ -32,7 +35,6 @@
 								:placeholder="$t('purchased.pleaseFillInTheProcurementPersonName')"
 								:rules="[{ required: true, message: $t('purchased.procurementPersonNameCanNotBeEmpty') }]"
 								required
-								:readonly="submitType === 'edit'"
 							/>
 							<van-field
 								v-model="formData.subcribeTime"
@@ -42,9 +44,8 @@
 								:label="$t('purchased.procurementTime')"
 								:placeholder="$t('purchased.clickToSelectTime')"
 								:rules="[{ required: true, message: $t('purchased.procurementTimeCanNotBeEmpty') }]"
-								@click="submitType === 'edit' ? timePicker = false : timePicker = true"
+								@click="route.query.processType == 10 || route.query.processType == 20 ? timePicker = false : timePicker = true"
 								required
-								:readonly="submitType === 'edit'"
 							/>
 							<van-popup v-model:show="timePicker" position="bottom">
 								<van-date-picker
@@ -60,7 +61,6 @@
 								:placeholder="$t('purchased.pleaseFillInTheProcurementDescription')"
 								:rules="[{ required: true, message: $t('purchased.procurementDescriptionCanNotBeEmpty') }]"
 								required
-								:readonly="submitType === 'edit'"
 								rows="3"
 							/>
 						</van-cell-group>
@@ -73,115 +73,103 @@
 				<div class="common-process-card">
 					<div class="common-title">明细</div>
 					<!-- 明细列表 -->
-					<div
-						v-for="(item, index) in formData.subscribeDetailList"
-						:key="index"
-					>
-						<div class="commons-delete">
-							<div class="title">{{$t('common.details')}}{{ index + 1 }}</div>
-							<div
-								class="delete"
-								@click.native="handleDel(index)"
-								v-if="!route.query.id"
-							>
-								<van-icon name="cross" />
+					<div  v-if="route.query.processType != 10 && route.query.processType != 20">
+						<div
+							v-for="(item, index) in formData.subscribeDetailList"
+							:key="index"
+						>
+							<div class="commons-delete">
+								<div class="title">{{$t('common.details')}}{{ index + 1 }}</div>
+								<div
+									class="delete"
+									@click.native="handleDel(index)"
+									v-if="!route.query.id"
+								>
+									<van-icon name="cross" />
+								</div>
 							</div>
-						</div>
-						<van-cell-group inset>
-							<van-field
-								v-model="formData.subscribeDetailList[index].bussinessName"
-								is-link
-								readonly
-								:label="$t('purchased.procurementProduct')"
-								:placeholder="$t('purchased.selectProcurementProduct')"
-								:readonly="submitType === 'edit'"
-								@click="handleSelect(index)"
-								:rules="[
-									{ required: true, message: $t('purchased.procurementProductCanNotBeEmpty') },
-								]"
-								required
-							/>
-							<van-field
-								v-model="formData.subscribeDetailList[index].count"
-								:label="$t('subscribe.quantity')"
-								:placeholder="$t('subscribe.pleaseEnterTheQuantity')"
-								:rules="[{ required: true, message: $t('subscribe.quantityCanNotBeEmpty') }]"
-								required
-								type="number"
-								:readonly="submitType === 'edit'"
-							/>
+							<van-cell-group inset>
+								<van-field
+									v-model="formData.subscribeDetailList[index].bussinessName"
+									is-link
+									readonly
+									:label="$t('purchased.procurementProduct')"
+									:placeholder="$t('purchased.selectProcurementProduct')"
+									:readonly="submitType === 'edit'"
+									@click="handleSelect(index)"
+									:rules="[
+										{ required: true, message: $t('purchased.procurementProductCanNotBeEmpty') },
+									]"
+									required
+								/>
+								<van-field
+									v-model="formData.subscribeDetailList[index].count"
+									:label="$t('subscribe.quantity')"
+									:placeholder="$t('subscribe.pleaseEnterTheQuantity')"
+									:rules="[{ required: true, message: $t('subscribe.quantityCanNotBeEmpty') }]"
+									required
+									type="number"
+									:readonly="submitType === 'edit'"
+								/>
 
-							<van-field
-								v-model="formData.subscribeDetailList[index].content"
-								:label="$t('subscribe.cause')"
-								:placeholder="$t('subscribe.pleaseEnterTheCause')"
-								:rules="[
-									{ required: true, message: $t('subscribe.causeCanNotBeEmpty') },
-								]"
-								:readonly="submitType === 'edit'"
-								rows="3"
-								type="textarea"
-								required
+								<van-field
+									v-model="formData.subscribeDetailList[index].content"
+									:label="$t('subscribe.cause')"
+									:placeholder="$t('subscribe.pleaseEnterTheCause')"
+									:rules="[
+										{ required: true, message: $t('subscribe.causeCanNotBeEmpty') },
+									]"
+									:readonly="submitType === 'edit'"
+									rows="3"
+									type="textarea"
+									required
+								/>
+							</van-cell-group>
+						</div>
+						<van-popup v-model:show="typeModalOne" round position="bottom">
+							<van-picker
+								:columns="columnsOne"
+								@cancel="typeModalOne = false"
+								@confirm="(data) => onConfirmOne(data)"
 							/>
-						</van-cell-group>
-					</div>
-					<van-popup v-model:show="typeModalOne" round position="bottom">
-						<van-picker
-							:columns="columnsOne"
-							@cancel="typeModalOne = false"
-							@confirm="(data) => onConfirmOne(data)"
-						/>
-					</van-popup>
-					<div class="commons-add-btn"  v-if="!route.query.id">
-						<van-button
-						icon="plus"
-						type="default"
-						size="small"
-						style="margin-top: 10px"
-						block
-						@click="handleAddRow"
-						>{{$t('common.addDetails')}}</van-button
-						>
+						</van-popup>
+						<div class="commons-add-btn"  v-if="!route.query.id">
+							<van-button
+							icon="plus"
+							type="default"
+							size="small"
+							style="margin-top: 10px"
+							block
+							@click="handleAddRow"
+							>{{$t('common.addDetails')}}</van-button
+							>
+						</div>
 					</div>
 					<!-- <div style="margin: 16px" v-if="!route.query.id">
 						<van-button round block type="primary" native-type="submit">
 							{{$t('common.submit')}}
 						</van-button>
 					</div> -->
-					<div class="common-mobile-table">
+					<div class="common-mobile-table" v-else>
 						<table>
 							<thead>
 								<tr>
-									<th>物料编码</th>
-									<th>物料名称</th>
-									<th>规格型号</th>
-									<th>规格型号</th>
-									<th>规格型号</th>
-									<th>规格型号</th>
-									<th>规格型号</th>
+									<th>申购产品</th>
+									<th>数量</th>
+									<th>事由</th>
 								</tr>
 							</thead>
 							<tbody>
-								<tr>
-									<td>1000000001</td>
-									<td>电脑</td>
-									<td>台</td>
-								</tr>
-								<tr>
-									<td>1000000002</td>
-									<td>显示器</td>
-									<td>台</td>
+								<tr v-for="(i,index) in formData.subscribeDetailList" :key="index">
+									<td>{{ i.name }}</td>
+									<td>{{ i.count }}</td>
+									<td>{{ i.remark }}</td>
 								</tr>
 							</tbody>
 						</table>
 					</div>
 				</div>
-				
 			</van-tab>
-			<van-tab title="标签 3">内容 3</van-tab>
-			<van-tab title="标签 4">内容 4</van-tab>
-			<van-tab title="标签 4">内容 4</van-tab>
-			<van-tab title="标签 4">内容 4</van-tab>
 		</van-tabs>
 		
 	</div>
@@ -211,6 +199,12 @@ const formData = ref({
 	dueDate: '',
 	subscribeDetailList: [],
 })
+
+const active = ref(0)
+const tabsChange = () => {
+	active.value ++
+}
+
 const handleAddRow = () => {
 	console.log(formData.value)
 	if(!formData.value.subscribeDetailList) formData.value.subscribeDetailList = []
@@ -347,6 +341,7 @@ const onSubmit = () => {
 }
 defineExpose({
   handleSubmit,
+  tabsChange
 });
 onMounted(() => {
     

+ 15 - 11
src/views/processApproval/index.vue

@@ -110,27 +110,31 @@ const toDtl = (row) => {
 			})
 		}
 	})
-	proxy.$router.push({
-		path: 'processDtl',
-		query: {
-			flowKey: row.flowKey,
-			id: row.id,
-			processType: 10,
-		},
-	})
+	// proxy.$router.push({
+	// 	path: 'processDtl',
+	// 	query: {
+	// 		flowKey: row.flowKey,
+	// 		id: row.id,
+	// 		processType: 10,
+	// 	},
+	// })
 }
 onMounted(() => {
 	if (route.query) {
-		console.log(route.query)
-		req.value.status = route.query.status
+		
 		getList()
 	}
 })
 
 const getList = (type) => {
 	loading.value = true
+	const postUrl = {
+		"1":'/flowExample/getToBeProcessedPage',
+		"2":'/flowExample/getHaveInitiatedPage',
+		"3":'/flowExample/getProcessedPage',
+	}
 	proxy
-		.post('/flowExample/getToBeProcessedPage', req.value)
+		.post(postUrl[route.query.status], req.value)
 		.then((res) => {
 			listData.value =
 				type === 'refresh'

+ 7 - 33
src/views/processApproval/processDtl.vue

@@ -9,38 +9,6 @@
 						: SendSubscribe
 				"></component>
 		</div>
-
-		<!-- <div class="card">
-			<div class="common-title border-btm">申购信息</div>
-			<div class="common-form-text">
-				<div class="common-form-text-item">
-					<div class="common-form-text-item-label">申购单号</div>
-					<div class="common-form-text-item-value">
-						PR-221101-170404-296
-					</div>
-				</div>
-				<div class="common-form-text-item">
-					<div class="common-form-text-item-label">申购时间</div>
-					<div class="common-form-text-item-value">
-						2022-11-01 17:04:04
-					</div>
-				</div>
-				<div class="common-form-text-item">
-					<div class="common-form-text-item-label">申购部门</div>
-					<div class="common-form-text-item-value">仓库</div>
-				</div>
-				<div class="common-form-text-item">
-					<div class="common-form-text-item-label">申购人</div>
-					<div class="common-form-text-item-value">阮平芳</div>
-				</div>
-				<div class="common-form-text-item">
-					<div class="common-form-text-item-label">申购类型</div>
-					<div class="common-form-text-item-value">物料</div>
-				</div>
-				
-			</div>
-		</div> -->
-
 		<div class="btn-warp" :class="footerMoreType ? 'open-more' : ''">
 			<div class="more-btn" @click="footerMoreType = true">
 				更多 <van-icon name="arrow-up" />
@@ -102,7 +70,8 @@ import SendPurchasePayment from './components/SendPurchasePayment'
 import { showSuccessToast, showFailToast } from 'vant'
 const route = useRoute()
 const proxy = getCurrentInstance().proxy
-const onClickLeft = () => proxy.$router.push(componentObj.value[route.query.flowKey].backUrl)
+// const onClickLeft = () => proxy.$router.push(componentObj.value[route.query.flowKey].backUrl)
+const onClickLeft = () => proxy.$router.go(-1)
 const message = ref('')
 const onClickRight = () => {
 	proxy.$router.push('/main/working')
@@ -228,6 +197,11 @@ const handleSubmit = async (_type) => {
 				})
 		}
 	}
+	proxy.$router.go(-1)
+}
+
+const nextFn = () => {
+	makeDom.value.tabsChange()
 }
 
 const getRecords = (_id) => {

+ 194 - 0
src/views/purchase-payment/invoice/add.vue

@@ -0,0 +1,194 @@
+<template>
+  <div class="form">
+    <van-nav-bar :title="$t('invoice.' + route.query.type)" :left-text="$t('common.back')" left-arrow @click-left="onClickLeft"> </van-nav-bar>
+    <testForm v-model="formData.data" :formOption="formOption" :formConfig="formConfig" :rules="rules" @onSubmit="onSubmit" ref="formDom"> </testForm>
+  </div>
+</template>
+
+<script setup>
+import { ref, getCurrentInstance, onMounted, reactive } from "vue";
+import { showSuccessToast, showFailToast } from "vant";
+import { useRoute } from "vue-router";
+import { getUserInfo } from "@/utils/auth";
+import testForm from "@/components/testForm/index.vue";
+
+const proxy = getCurrentInstance().proxy;
+const onClickLeft = () => history.back();
+const route = useRoute();
+const getDict = () => {
+  proxy.post("/supplierInfo/page", { pageNum: 1, pageSize: 999 }).then((res) => {
+    if (res.data.rows && res.data.rows.length > 0) {
+      formConfig[0].data = res.data.rows.map((item) => {
+        return {
+          label: item.name,
+          value: item.id,
+        };
+      });
+    }
+  });
+  let query = {
+    pageNum: 1,
+    pageSize: 999,
+    tenantId: getUserInfo().tenantId,
+  };
+  proxy.post("/dictTenantData/page", { ...query, dictCode: "invoice_type" }).then((res) => {
+    if (res.data.rows && res.data.rows.length > 0) {
+      formConfig[1].data = res.data.rows.map((item) => {
+        return {
+          label: item.dictValue,
+          value: item.dictKey,
+        };
+      });
+    }
+  });
+  proxy.get("/tenantUser/list", { pageNum: 1, pageSize: 10000, tenantId: getUserInfo().tenantId }).then((res) => {
+    if (res.rows && res.rows.length > 0) {
+    }
+  });
+};
+getDict();
+const formData = reactive({
+  data: {
+    supplyId: null,
+    money: null,
+    type: null,
+    remark: null,
+    invoiceDetailsList: [],
+  },
+});
+const formDom = ref(null);
+const formOption = reactive({
+  readonly: false, //用于控制整个表单是否只读
+  disabled: false,
+  labelAlign: "top",
+  scroll: true,
+  labelWidth: "62pk",
+  hiddenSubmitBtn: false,
+  btnConfig: {
+    isNeed: false,
+    prop: "invoiceDetailsList",
+    plain: true,
+    listTitle: proxy.t("invoice.purchaseContract"),
+    listConfig: [
+      {
+        type: "input",
+        label: proxy.t("invoice.contractCode"),
+        prop: "code",
+        readonly: true,
+      },
+      {
+        type: "input",
+        label: proxy.t("invoice.contractMoney"),
+        prop: "amount",
+        readonly: true,
+      },
+      {
+        type: "input",
+        label: proxy.t("invoice.receivedInvoice"),
+        prop: "sumInvoiceMoney",
+        readonly: true,
+      },
+      {
+        type: "input",
+        label: proxy.t("invoice.relatedAmount"),
+        prop: "money",
+        itemType: "number",
+      },
+    ],
+  },
+});
+const formConfig = reactive([
+  {
+    type: "picker",
+    label: proxy.t("invoice.supplyName"),
+    prop: "supplyId",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "label",
+      value: "value",
+    },
+    data: [],
+    readonly: route.query.id,
+    changeFn: (val, data) => {
+      proxy.formChange(val, data, formData);
+      proxy.get("/purchase/getNoInvoiceListBySupplyId", { supplyId: val.selectedValues[0] }).then((res) => {
+        if (res.data && res.data.length > 0) {
+          formData.data.invoiceDetailsList = res.data.map((item) => {
+            return {
+              purchaseId: item.id,
+              code: item.code,
+              amount: item.amount,
+              sumInvoiceMoney: item.sumInvoiceMoney,
+              money: null,
+              remark: "",
+            };
+          });
+        } else {
+          formData.data.invoiceDetailsList = [];
+        }
+      });
+      data.showPicker = false;
+    },
+  },
+  {
+    type: "picker",
+    label: proxy.t("invoice.type"),
+    prop: "type",
+    itemType: "onePicker",
+    showPicker: false,
+    fieldNames: {
+      text: "label",
+      value: "value",
+    },
+    data: [],
+  },
+  {
+    type: "input",
+    label: proxy.t("invoice.invoiceAmount"),
+    prop: "money",
+    itemType: "number",
+  },
+]);
+const rules = {
+  supplyId: [{ required: true, message: proxy.t("invoice.supplyNameMsg") }],
+  type: [{ required: true, message: proxy.t("invoice.typeMsg") }],
+  money: [{ required: true, message: proxy.t("invoice.invoiceAmountMsg") }],
+  relatedAmount: [{ required: true, message: proxy.t("invoice.relatedAmountMsg") }],
+};
+const onSubmit = () => {
+  if (!(formData.data.invoiceDetailsList && formData.data.invoiceDetailsList.length > 0)) {
+    return showFailToast(proxy.t("invoice.supplierNoContract"));
+  }
+  let money = 0;
+  for (let i = 0; i < formData.data.invoiceDetailsList.length; i++) {
+    money = parseFloat(Number(money) + Number(formData.data.invoiceDetailsList[i].money)).toFixed(2);
+  }
+  if (Number(money) != Number(formData.data.money)) {
+    return showFailToast(proxy.t("invoice.unequalAmounts"));
+  }
+  proxy.post("/invoice/" + route.query.type, formData.data).then(() => {
+    showSuccessToast(route.query.type === "add" ? proxy.t("common.addSuccess") : proxy.t("common.modifySuccess"));
+    setTimeout(() => {
+      onClickLeft();
+    }, 500);
+  });
+};
+onMounted(() => {
+  if (route.query.id) {
+    proxy.post("/invoice/detail", { id: route.query.id }).then((res) => {
+      res.data.type = res.data.type + "";
+      res.data.invoiceDetailsList = res.data.invoiceDetailsVoList.map((item) => {
+        return {
+          code: item.purchaseCode,
+          purchaseId: item.purchaseId,
+          amount: item.purchaseAmount,
+          sumInvoiceMoney: item.sumMoney,
+          money: item.money,
+        };
+      });
+      formData.data = res.data;
+    });
+  }
+});
+</script>

+ 112 - 0
src/views/purchase-payment/invoice/index.vue

@@ -0,0 +1,112 @@
+<template>
+  <van-nav-bar :title="$t('invoice.name')" left-text="" left-arrow @click-left="onClickLeft" @click-right="onClickRight">
+    <template #right>{{ $t("common.add") }}</template>
+  </van-nav-bar>
+  <van-search v-model="req.keyword" :placeholder="$t('common.pleaseEnterKeywords')" @search="onRefresh" />
+  <van-pull-refresh v-model="loading" @refresh="onRefresh">
+    <div class="list">
+      <van-list v-model:loading="loading" :finished="finished" :finished-text="$t('common.noMore')" @load="getList" style="margin-bottom: 60px">
+        <commonList :data="listData" @onClick="toDtl" :config="listConfig"></commonList>
+      </van-list>
+    </div>
+  </van-pull-refresh>
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import commonList from "@/components/common-list.vue";
+import { getUserInfo } from "@/utils/auth";
+
+const proxy = getCurrentInstance().proxy;
+const onClickLeft = () => proxy.$router.push("/main/working");
+const onClickRight = () => {
+  proxy.$router.push({
+    path: "invoiceAdd",
+    query: {
+      type: "add",
+    },
+  });
+};
+const req = ref({
+  pageNum: 1,
+  keyword: null,
+});
+const finished = ref(false);
+const invoiceType = ref([]);
+const getDict = () => {
+  return proxy.post("/dictTenantData/page", { pageNum: 1, pageSize: 999, tenantId: getUserInfo().tenantId, dictCode: "invoice_type" }).then((res) => {
+    if (res.data.rows && res.data.rows.length > 0) {
+      invoiceType.value = res.data.rows.map((item) => {
+        return {
+          label: item.dictValue,
+          value: item.dictKey,
+        };
+      });
+    }
+  });
+};
+getDict();
+const onRefresh = () => {
+  req.value.pageNum = 1;
+  finished.value = false;
+  getList("refresh");
+};
+const loading = ref(false);
+const listData = ref([]);
+const getList = (type) => {
+  loading.value = true;
+  proxy
+    .post("/invoice/page", req.value)
+    .then((res) => {
+      if (res.data.rows && res.data.rows.length > 0) {
+        res.data.rows = res.data.rows.map((item) => {
+          let typeText = "";
+          if (item.type) {
+            typeText = proxy.dictValueLabel(item.type, invoiceType.value);
+          }
+          return {
+            ...item,
+            typeText: typeText,
+          };
+        });
+      }
+      listData.value = type === "refresh" ? res.data.rows : listData.value.concat(res.data.rows);
+      if (req.value.pageNum * 10 >= res.data.total) {
+        finished.value = true;
+      }
+      req.value.pageNum++;
+      loading.value = false;
+    })
+    .catch(() => {
+      loading.value = false;
+    });
+};
+const toDtl = (row) => {
+  proxy.$router.push({
+    path: "invoiceAdd",
+    query: {
+      type: "edit",
+      id: row.id,
+    },
+  });
+};
+const listConfig = ref([
+  {
+    label: proxy.t("invoice.supplyName"),
+    prop: "supplyName",
+  },
+  {
+    label: proxy.t("invoice.type"),
+    prop: "typeText",
+  },
+  {
+    label: proxy.t("invoice.money"),
+    prop: "money",
+  },
+]);
+</script>
+
+<style lang="scss" scoped>
+.list {
+  min-height: 70vh;
+}
+</style>