refactor: add upload file of employee

This commit is contained in:
Thanaphon Frappet 2024-10-08 13:45:06 +07:00
parent 13b8b480c6
commit 30c78ef269
2 changed files with 162 additions and 112 deletions

View file

@ -15,6 +15,7 @@ import useOptionStore from 'stores/options';
import { useQuotationForm } from './form';
import useOcrStore from 'stores/ocr';
import { deleteItem } from 'stores/utils';
import { runOcr, parseResultMRZ } from 'src/utils/ocr';
// NOTE Import Types
import { QuotationPayload } from 'src/stores/quotations/types';
@ -49,6 +50,7 @@ import {
uploadFileListEmployee,
columnsAttachment,
} from 'src/pages/03_customer-management/constant';
import { group } from 'node:console';
defineProps<{
readonly?: boolean;
@ -80,9 +82,12 @@ const $q = useQuasar();
const {
currentFormData: quotationFormData,
currentFormState: quotationFormState,
newWorkerList,
fileItemNewWorker,
} = storeToRefs(quotationForm);
const refSelectZoneEmployee = ref<InstanceType<typeof SelectZone>>();
const mrz = ref<Awaited<ReturnType<typeof parseResultMRZ>>>();
const selectedBranchIssuer = ref('');
const selectedCustomer = ref('');
const toggleWorker = ref(true);
@ -91,9 +96,18 @@ const branchId = ref('');
const date = ref();
const preSelectedWorker = ref<Employee[]>([]);
const selectedWorker = ref<Employee[]>([]);
const selectedWorker = ref<
(Employee & {
attachment?: {
name?: string;
group?: string;
url?: string;
file?: File;
_meta?: Record<string, any>;
}[];
})[]
>([]);
const workerList = ref<Employee[]>([]);
const newWorkerList = ref<EmployeeWorker[]>([]);
const agentPrice = ref(false);
const summaryPrice = ref<{
@ -141,8 +155,18 @@ const selectedGroup = ref<ProductGroup | null>(null);
const selectedProductServiceId = ref('');
const formDataEmployee = ref<EmployeeWorker>({
alienReferencNumber: '',
const formDataEmployee = ref<
EmployeeWorker & {
attachment?: {
name?: string;
group?: string;
url?: string;
file?: File;
_meta?: Record<string, any>;
}[];
}
>({
passportNo: '',
documentExpireDate: new Date(),
lastNameEN: '',
lastName: '',
@ -154,6 +178,7 @@ const formDataEmployee = ref<EmployeeWorker>({
nationality: '',
gender: '',
dateOfBirth: new Date(),
attachment: [],
});
const productServiceList = ref<
@ -163,7 +188,7 @@ const productServiceList = ref<
function convertDataToFormSubmit() {
quotationFormData.value.productServiceList = JSON.parse(
JSON.stringify(
productServiceList.value.map((v, i) => ({
productServiceList.value.map((v) => ({
workerIndex: [0, 1],
discount: 1,
amount: 1,
@ -174,11 +199,27 @@ function convertDataToFormSubmit() {
),
);
selectedWorker.value.forEach((v, i) => {
if (v.attachment !== undefined) {
v.attachment.forEach((value) => {
fileItemNewWorker.value.push({
employeeIndex: i,
name: value.name,
group: value.group as 'passport' | 'visa' | 'in-country-notice',
url: value.url,
file: value.file,
_meta: value._meta,
});
});
}
});
quotationFormData.value.worker = JSON.parse(
JSON.stringify(
selectedWorker.value.map((v, i) => {
selectedWorker.value.map((v) => {
if (v.id === undefined) {
return v;
const { attachment, ...payload } = v;
return payload;
} else {
return v.id;
}
@ -205,7 +246,7 @@ async function getAllProduct(
function setDefaultFormEmployee() {
formDataEmployee.value = {
alienReferencNumber: '',
passportNo: '',
documentExpireDate: new Date(),
lastNameEN: '',
lastName: '',
@ -217,6 +258,7 @@ function setDefaultFormEmployee() {
nationality: '',
gender: '',
dateOfBirth: new Date(),
attachment: [],
};
employeeFormState.value.dialogModal = false;
@ -769,8 +811,7 @@ watch(
:title="$t('form.title.create', { name: $t('customer.employee') })"
:submit="
() => {
newWorkerList.push(formDataEmployee);
quotationForm.injectNewEmployee(formDataEmployee, () =>
quotationForm.injectNewEmployee({ data: formDataEmployee }, () =>
setDefaultFormEmployee(),
);
}
@ -899,9 +940,7 @@ watch(
title="form.field.basicInformation"
prefixId="dialog"
dense
v-model:alien-reference-number="
formDataEmployee.alienReferencNumber
"
v-model:passport-no="formDataEmployee.passportNo"
v-model:document-expire-date="formDataEmployee.documentExpireDate"
class="q-mb-md"
/>
@ -927,108 +966,68 @@ watch(
<UploadFileGroup
show-title
v-model:current-id="currentFromDataEmployee.id"
v-model="currentFromDataEmployee.file"
v-model="formDataEmployee.attachment"
hide-action
:group-list="uploadFileListEmployee"
:menu="uploadFileListEmployee"
:columns="columnsAttachment"
:ocr="
async (group, file) => {
const res = await ocrStore.sendOcr({
file: file,
category: group,
});
if (group === 'passport') {
mrz = await runOcr(file, parseResultMRZ);
if (res) {
const tempValue = {
status: true,
group,
meta: res.fields,
};
if (mrz !== null) {
const mapMrz = Object.entries(mrz.result).map(
([key, value]) => ({
name: key,
value: value,
}),
);
const tempValue = {
status: true,
group,
meta: mapMrz,
};
return tempValue;
return tempValue;
}
} else {
const res = await ocrStore.sendOcr({
file: file,
category: group,
});
if (res) {
const tempValue = {
status: true,
group,
meta: res.fields,
};
return tempValue;
}
}
return { status: false, group, meta: [] };
}
"
:auto-save="currentFromDataEmployee.id !== ''"
:download="
(obj) => {
employeeStore.getFile({
parentId: currentFromDataEmployee.id || '',
group: obj.group,
fileId: obj._meta.id,
});
return { status: true, group, meta: [] };
}
"
:delete-item="
async (obj) => {
const res = await employeeStore.delMeta({
parentId: currentFromDataEmployee.id || '',
group: obj.group,
metaId: obj._meta.id,
});
if (res) {
return true;
}
return false;
}
"
:save="
async (
group: 'passport' | 'visa',
_meta: any,
file: File | undefined,
) => {
if (file !== undefined && currentFromDataEmployee.id) {
const res = await employeeStore.postMeta({
parentId: currentFromDataEmployee.id || '',
group,
meta: _meta,
file,
});
if (res) {
return true;
}
} else {
const { id, employeeId, createdAt, updatedAt, ...payload } =
_meta;
const res = await employeeStore.putMeta({
parentId: currentFromDataEmployee.id || '',
group,
metaId: _meta.id,
meta: payload,
file,
});
if (res) {
return true;
}
}
return false;
async () => {
return true;
}
"
:get-file-list="
async (group: 'passport' | 'visa') => {
if (!!currentFromDataEmployee.id) {
const resMeta = await employeeStore.getMetaList({
parentId: currentFromDataEmployee.id,
group,
});
if (formDataEmployee.attachment !== undefined) {
const resMeta = formDataEmployee.attachment.filter(
(v) => v.group === group,
);
const tempValue = resMeta.map(async (i: any) => {
return {
_meta: { ...i },
_meta: { ...i._meta },
name: i.id || '',
group: group,
url: await employeeStore.getFile({
parentId: currentFromDataEmployee.id || '',
group,
fileId: i.id,
}),
url: i.url,
file: undefined,
};
});