From f8541c6fac947cc4879015dea25d4f723760f01f Mon Sep 17 00:00:00 2001 From: TzuHanLiang Date: Mon, 7 Oct 2024 13:24:41 +0800 Subject: [PATCH 01/29] feat: add basic pusher outline --- package.json | 5 +- src/components/upload_area/upload_area.tsx | 8 +- src/constants/url.ts | 1 + src/pages/api/v2/pusher.ts | 30 +++++++ src/pages/mobile_upload.tsx | 85 +++++++++++++++++++ .../users/accounting/certificate_list.tsx | 61 ++++++++++++- 6 files changed, 185 insertions(+), 5 deletions(-) create mode 100644 src/pages/api/v2/pusher.ts create mode 100644 src/pages/mobile_upload.tsx diff --git a/package.json b/package.json index a76055831..dab30b0c6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+31", + "version": "0.8.2+33", "private": false, "scripts": { "dev": "next dev", @@ -41,11 +41,14 @@ "next-auth": "^4.24.7", "next-i18next": "^15.2.0", "next-logger": "^5.0.0", + "next-qrcode": "^2.5.1", "next-session": "^4.0.5", "nodemailer": "^6.9.8", "pino": "^9.3.2", "pino-multi-stream": "^6.0.0", "pino-pretty": "^11.2.2", + "pusher": "^5.2.0", + "pusher-js": "^8.4.0-rc2", "react": "^18.3.1", "react-apexcharts": "^1.4.1", "react-chartjs-2": "^5.2.0", diff --git a/src/components/upload_area/upload_area.tsx b/src/components/upload_area/upload_area.tsx index 9abbfe41d..0b599cccf 100644 --- a/src/components/upload_area/upload_area.tsx +++ b/src/components/upload_area/upload_area.tsx @@ -5,9 +5,10 @@ import Image from 'next/image'; interface UploadAreaProps { isDisabled: boolean; withScanner: boolean; + toggleQRCode: () => void; } -const UploadArea: React.FC = ({ isDisabled, withScanner }) => { +const UploadArea: React.FC = ({ isDisabled, withScanner, toggleQRCode }) => { const { t } = useTranslation(['common', 'journal']); const [isDragOver, setIsDragOver] = useState(false); @@ -109,7 +110,10 @@ const UploadArea: React.FC = ({ isDisabled, withScanner }) => { />

{t('journal:JOURNAL.USE_YOUR_PHONE_AS')} - + {t('journal:JOURNAL.SCANNER')}

diff --git a/src/constants/url.ts b/src/constants/url.ts index 725481597..b2cebf144 100644 --- a/src/constants/url.ts +++ b/src/constants/url.ts @@ -36,6 +36,7 @@ export const ISUNFA_ROUTE = { USERS_FINANCIAL_REPORTS_BALANCE_SHEET: `/users/reports/financials?report_type=${FinancialReportTypesKey.balance_sheet}`, USERS_FINANCIAL_REPORTS_INCOME_STATEMENT: `/users/reports/financials?report_type=${FinancialReportTypesKey.comprehensive_income_statement}`, USERS_FINANCIAL_REPORTS_CASH_FLOW: `/users/reports/financials?report_type=${FinancialReportTypesKey.cash_flow_statement}`, + UPLOAD: `mobile_upload`, }; export const EXTERNAL_API = { diff --git a/src/pages/api/v2/pusher.ts b/src/pages/api/v2/pusher.ts new file mode 100644 index 000000000..fa854dc5f --- /dev/null +++ b/src/pages/api/v2/pusher.ts @@ -0,0 +1,30 @@ +// /pages/api/pusher.ts +import type { NextApiRequest, NextApiResponse } from 'next'; +import Pusher from 'pusher'; + +// Info: (20241004-tzuhan) 初始化 Pusher +const pusher = new Pusher({ + appId: process.env.PUSHER_APP_ID!, + key: process.env.PUSHER_KEY!, + secret: process.env.PUSHER_SECRET!, + cluster: process.env.PUSHER_CLUSTER!, + useTLS: true, +}); + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + if (req.method === 'POST') { + const { images } = req.body; + + // Info: (20241004-tzuhan) 發送圖片 URL 給其他訂閱者 + try { + await pusher.trigger('certificate-channel', 'certificate-event', { + images, + }); + res.status(200).json({ status: 'Certificate sent successfully' }); + } catch (error) { + res.status(500).json({ status: 'Failed to send certificates', error }); + } + } else { + res.status(405).send('Method not allowed'); + } +} diff --git a/src/pages/mobile_upload.tsx b/src/pages/mobile_upload.tsx new file mode 100644 index 000000000..1b8830ac0 --- /dev/null +++ b/src/pages/mobile_upload.tsx @@ -0,0 +1,85 @@ +// /pages/page2.tsx +import { Button } from '@/components/button/button'; +import Image from 'next/image'; +import { useState } from 'react'; + +interface ImageData { + url: string; + status: string; +} + +const MobileUpload = () => { + const [selectedImages, setSelectedImages] = useState([]); + const [uploadedImages, setUploadedImages] = useState([]); + const [isUploading, setIsUploading] = useState(false); + + const handleImageChange = (e: React.ChangeEvent) => { + if (e.target.files) { + setSelectedImages(Array.from(e.target.files)); + } + }; + + const uploadImages = async () => { + setIsUploading(true); + + const imageUploads = await Promise.all( + selectedImages.map(async (image) => { + try { + // 模擬上傳圖片並獲得 URL + const url = URL.createObjectURL(image); + return { url, status: 'success' }; + } catch (error) { + return { url: '', status: 'failed' }; + } + }) + ); + + setUploadedImages(imageUploads); + + // 發送圖片和對應的狀態到伺服器 + try { + const response = await fetch('/api/v2/pusher', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ images: imageUploads }), + }); + + if (!response.ok) { + throw new Error('Failed to send images'); + } + } catch (error) { + // Deprecated: (20241004 - tzuhan) Debugging purpose only + // eslint-disable-next-line no-console + console.log('Error sending images:', error); + } finally { + setIsUploading(false); + } + }; + + return ( +
+

Upload Images

+ + +
+

Uploaded Images

+ {uploadedImages.map((image, index) => ( +
+ {image.status === 'success' ? ( + {`Uploaded + ) : ( +

Image {index + 1} upload failed

+ )} +

Status: {image.status}

+
+ ))} +
+
+ ); +}; + +export default MobileUpload; diff --git a/src/pages/users/accounting/certificate_list.tsx b/src/pages/users/accounting/certificate_list.tsx index 86c37234b..81abdcc39 100644 --- a/src/pages/users/accounting/certificate_list.tsx +++ b/src/pages/users/accounting/certificate_list.tsx @@ -1,4 +1,5 @@ -import React, { useCallback, useState } from 'react'; +import React, { useCallback, useState, useEffect } from 'react'; +import { useQRCode } from 'next-qrcode'; import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import { ILocale } from '@/interfaces/locale'; import Head from 'next/head'; @@ -12,8 +13,17 @@ import SelectionToolbar from '@/components/selection_tool_bar/selection_tool_bar import { ICertificate, ICertificateUI, OPERATIONS, VIEW_TYPES } from '@/interfaces/certificate'; import Certificate from '@/components/certificate/certificate'; import CertificateEditModal from '@/components/certificate/certificate_edit_modal'; +import Pusher, { Channel } from 'pusher-js'; +import Image from 'next/image'; +import { ISUNFA_ROUTE } from '@/constants/url'; +interface ImageData { + url: string; + status: string; +} const UploadCertificatePage: React.FC = () => { + const { Canvas } = useQRCode(); + const [showQRCode, setShowQRCode] = useState(false); const [activeTab, setActiveTab] = useState(0); const [data, setData] = useState<{ [tab: number]: { [id: number]: ICertificateUI } }>({ 0: {}, @@ -30,6 +40,7 @@ const UploadCertificatePage: React.FC = () => { 0: false, 1: false, }); + const [receivedImages, setReceivedImages] = useState([]); const handleApiResponse = useCallback((resData: ICertificate[]) => { const sumInvoiceTotalPrice = { @@ -174,6 +185,25 @@ const UploadCertificatePage: React.FC = () => { console.log('Save selected id:', certificate); }, []); + useEffect(() => { + const pusher = new Pusher(process.env.NEXT_PUBLIC_PUSHER_APP_KEY!, { + cluster: process.env.NEXT_PUBLIC_PUSHER_APP_CLUSTER!, + }); + + const channel: Channel = pusher.subscribe('certificate-channel'); + + const imageHandler = (imageData: { images: ImageData[] }) => { + setReceivedImages((prev) => [...prev, ...imageData.images]); + }; + + channel.bind('certificate-event', imageHandler); + + return () => { + channel.unbind('certificate-event', imageHandler); + pusher.unsubscribe('certificate-channel'); + }; + }, []); + return ( <> @@ -200,10 +230,37 @@ const UploadCertificatePage: React.FC = () => { {/* Info: (20240919 - tzuhan) Header */}
+ {showQRCode && ( + + )} {/* Info: (20240919 - tzuhan) Main Content */}
{/* Info: (20240919 - tzuhan) Upload Area */} - + setShowQRCode((prev) => !prev)} + /> +
+ {receivedImages.map((image, index) => ( +
+ {`Received +

Status: {image.status}

+
+ ))} +
{/* Info: (20240919 - tzuhan) Tabs */} Date: Mon, 7 Oct 2024 14:40:19 +0800 Subject: [PATCH 02/29] mock report complete --- package.json | 2 +- src/constants/api_connection.ts | 12 + src/constants/zod_schema.ts | 3 + src/interfaces/accounting_account.ts | 3 + src/interfaces/api_connection.ts | 1 + src/lib/utils/common.ts | 23 ++ .../report/financial_report_generator.ts | 12 +- src/lib/utils/zod_schema/common.ts | 8 + src/lib/utils/zod_schema/report.ts | 21 + .../company/[companyId]/report/index.test.ts | 65 +++ .../v2/company/[companyId]/report/index.ts | 369 ++++++++++++++++++ 11 files changed, 517 insertions(+), 2 deletions(-) create mode 100644 src/lib/utils/zod_schema/report.ts create mode 100644 src/pages/api/v2/company/[companyId]/report/index.test.ts create mode 100644 src/pages/api/v2/company/[companyId]/report/index.ts diff --git a/package.json b/package.json index 45c315e21..c08ce1cb9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+33", + "version": "0.8.2+35", "private": false, "scripts": { "dev": "next dev", diff --git a/src/constants/api_connection.ts b/src/constants/api_connection.ts index 7c1e323e1..a90931bb1 100644 --- a/src/constants/api_connection.ts +++ b/src/constants/api_connection.ts @@ -76,6 +76,7 @@ export enum APIName { JOURNAL_DELETE = 'JOURNAL_DELETE', REPORT_LIST = 'REPORT_LIST', REPORT_GET_BY_ID = 'REPORT_GET_BY_ID', + REPORT_GET_V2 = 'REPORT_GET_V2', REPORT_GENERATE = 'REPORT_GENERATE', STATUS_INFO_GET = 'STATUS_INFO_GET', ACCOUNT_LIST = 'ACCOUNT_LIST', @@ -156,6 +157,7 @@ export enum APIPath { JOURNAL_DELETE = `${apiPrefix}/company/:companyId/journal/:journalId`, REPORT_LIST = `${apiPrefix}/company/:companyId/report`, REPORT_GET_BY_ID = `${apiPrefix}/company/:companyId/report/:reportId`, + REPORT_GET_V2 = `${apiPrefixV2}/company/:companyId/report`, REPORT_GENERATE = `${apiPrefix}/company/:companyId/report`, STATUS_INFO_GET = `${apiPrefix}/status_info`, ACCOUNT_LIST = `${apiPrefix}/company/:companyId/account`, @@ -522,4 +524,14 @@ export const APIConfig: Record = { method: HttpMethod.GET, path: APIPath.CERTIFICATE_LIST, }), + + /** + * Info: (20241007 - Murky) + * Below is v2 API + */ + [APIName.REPORT_GET_V2]: createConfig({ + name: APIName.REPORT_GET_V2, + method: HttpMethod.GET, + path: APIPath.REPORT_GET_V2, + }), }; diff --git a/src/constants/zod_schema.ts b/src/constants/zod_schema.ts index 41599c626..9c01647e8 100644 --- a/src/constants/zod_schema.ts +++ b/src/constants/zod_schema.ts @@ -24,6 +24,7 @@ import { ocrResultGetByIdValidator, ocrUploadValidator, } from '@/lib/utils/zod_schema/ocr'; +import { reportGetValidatorV2 } from '@/lib/utils/zod_schema/report'; import { voucherCreateValidator, voucherDeleteValidatorV2, @@ -77,4 +78,6 @@ export const API_ZOD_SCHEMA = { [APIName.AI_ASK_V2]: askAIPostValidatorV2, [APIName.AI_ASK_RESULT_V2]: askAIGetResultValidatorV2, + + [APIName.REPORT_GET_V2]: reportGetValidatorV2, }; diff --git a/src/interfaces/accounting_account.ts b/src/interfaces/accounting_account.ts index ece1f1298..befe96ed3 100644 --- a/src/interfaces/accounting_account.ts +++ b/src/interfaces/accounting_account.ts @@ -47,10 +47,13 @@ export interface IAccountReadyForFrontend { curPeriodAmount: number; curPeriodAmountString: string; curPeriodPercentage: number; + curPeriodPercentageString: string; prePeriodAmount: number; prePeriodAmountString: string; prePeriodPercentage: number; + prePeriodPercentageString: string; indent: number; + children: { [code: string]: IAccountReadyForFrontend }; } export type IAccountQueryArgs = { diff --git a/src/interfaces/api_connection.ts b/src/interfaces/api_connection.ts index ae36fdae9..729858d5d 100644 --- a/src/interfaces/api_connection.ts +++ b/src/interfaces/api_connection.ts @@ -41,6 +41,7 @@ export type IAPIName = | 'JOURNAL_DELETE' | 'REPORT_LIST' | 'REPORT_GET_BY_ID' + | 'REPORT_GET_V2' | 'REPORT_GENERATE' | 'STATUS_INFO_GET' | 'ACCOUNT_LIST' diff --git a/src/lib/utils/common.ts b/src/lib/utils/common.ts index e40dabd73..4f478bcd7 100644 --- a/src/lib/utils/common.ts +++ b/src/lib/utils/common.ts @@ -648,3 +648,26 @@ export function generateUUID(): string { const randomUUID = Math.random().toString(36).substring(2, 12); return randomUUID; } + +/** + * Info: (20241007 - Murky) + * Return String version of number, comma will be added, add bracket if num is negative + * Return '-' if num is undefined, null or too small (-0.1~0.1) + * @param num - {number | null | undefined | string} + * number that be transform into string, + * if already string, than it will only be add comma than return + * @returns - {string} return number with comma and bracket + */ +export function numberBeDashIfFalsy(num: number | null | undefined | string) { + if (typeof num === 'string') { + return numberWithCommas(num); + } + + if (num === null || num === undefined || (num < 0.1 && num > -0.1)) { + return '-'; + } + + const formattedNumber = numberWithCommas(Math.abs(num)); + + return num < 0 ? `(${formattedNumber})` : formattedNumber; +} diff --git a/src/lib/utils/report/financial_report_generator.ts b/src/lib/utils/report/financial_report_generator.ts index d1abf1a08..6a814b1f0 100644 --- a/src/lib/utils/report/financial_report_generator.ts +++ b/src/lib/utils/report/financial_report_generator.ts @@ -16,7 +16,11 @@ import { IFinancialReportInDB, IncomeStatementOtherInfo, } from '@/interfaces/report'; -import { formatNumberSeparateByComma, getTimestampOfSameDateOfLastYear } from '@/lib/utils/common'; +import { + formatNumberSeparateByComma, + getTimestampOfSameDateOfLastYear, + numberBeDashIfFalsy, +} from '@/lib/utils/common'; export default abstract class FinancialReportGenerator extends ReportGenerator { protected lastPeriodStartDateInSecond: number; @@ -166,16 +170,22 @@ export default abstract class FinancialReportGenerator extends ReportGenerator { const prePeriodPercentage = lastPeriodAccount?.percentage ? Math.round(lastPeriodAccount.percentage * 100) : 0; + + const curPeriodPercentageString = numberBeDashIfFalsy(curPeriodPercentage); + const prePeriodPercentageString = numberBeDashIfFalsy(prePeriodPercentage); const accountReadyForFrontend: IAccountReadyForFrontend = { code: curPeriodAccount.code, name: curPeriodAccount.name, curPeriodAmount, curPeriodPercentage, curPeriodAmountString, + curPeriodPercentageString, prePeriodAmount, prePeriodPercentage, prePeriodAmountString, + prePeriodPercentageString, indent: curPeriodAccount.indent, + children: {}, }; curPeriodAccountReadyForFrontendArray.push(accountReadyForFrontend); }); diff --git a/src/lib/utils/zod_schema/common.ts b/src/lib/utils/zod_schema/common.ts index 21e07ad32..4ec680d14 100644 --- a/src/lib/utils/zod_schema/common.ts +++ b/src/lib/utils/zod_schema/common.ts @@ -24,3 +24,11 @@ export function zodTimestampInSeconds(canBeUndefined: boolean = false, defaultVa .regex(/^\d+$/) .transform((val) => timestampInSeconds(Number(val))); } + +export function zodTimestampInSecondsNoDefault() { + const setting = z + .string() + .regex(/^\d+$/) + .transform((val) => timestampInSeconds(Number(val))); + return setting; +} diff --git a/src/lib/utils/zod_schema/report.ts b/src/lib/utils/zod_schema/report.ts new file mode 100644 index 000000000..84d265827 --- /dev/null +++ b/src/lib/utils/zod_schema/report.ts @@ -0,0 +1,21 @@ +import { z } from 'zod'; +import { IZodValidator } from '@/interfaces/zod_validator'; +import { zodTimestampInSecondsNoDefault } from '@/lib/utils/zod_schema/common'; +import { FinancialReportTypesKey } from '@/interfaces/report_type'; + +const reportGetQueryValidatorV2 = z.object({ + startDate: zodTimestampInSecondsNoDefault(), + endDate: zodTimestampInSecondsNoDefault(), + language: z.string(), + reportType: z.nativeEnum(FinancialReportTypesKey), +}); + +const reportGetBodyValidatorV2 = z.object({}); + +export const reportGetValidatorV2: IZodValidator< + (typeof reportGetQueryValidatorV2)['shape'], + (typeof reportGetBodyValidatorV2)['shape'] +> = { + query: reportGetQueryValidatorV2, + body: reportGetBodyValidatorV2, +}; diff --git a/src/pages/api/v2/company/[companyId]/report/index.test.ts b/src/pages/api/v2/company/[companyId]/report/index.test.ts new file mode 100644 index 000000000..b9ece05ba --- /dev/null +++ b/src/pages/api/v2/company/[companyId]/report/index.test.ts @@ -0,0 +1,65 @@ +import { NextApiRequest, NextApiResponse } from 'next'; +import { handleGetRequest } from '@/pages/api/v2/company/[companyId]/report/index'; +import { STATUS_MESSAGE } from '@/constants/status_code'; + +import { FinancialReportTypesKey } from '@/interfaces/report_type'; + +let req: jest.Mocked; +let res: jest.Mocked; + +jest.mock('../../../../../../lib/utils/session.ts', () => ({ + getSession: jest.fn().mockResolvedValue({ + userId: 1001, + companyId: 1001, + }), +})); + +jest.mock('../../../../../../lib/utils/auth_check', () => ({ + checkAuthorization: jest.fn().mockResolvedValue(true), +})); + +// Info: (20241007 - Murky) Uncomment this to check zod return +// jest.mock('../../../../../../lib/utils/logger_back', () => ({ +// loggerRequest: jest.fn().mockReturnValue({ +// info: jest.fn(), +// error: jest.fn(), +// }), +// })); + +beforeEach(() => { + req = { + headers: {}, + query: {}, + method: '', + socket: {}, + json: jest.fn(), + } as unknown as jest.Mocked; + + res = { + status: jest.fn().mockReturnThis(), + json: jest.fn(), + } as unknown as jest.Mocked; +}); + +afterEach(() => { + jest.clearAllMocks(); +}); + +describe('company/[companyId]/certificate', () => { + describe('GET Certificate List', () => { + it('should match patter', async () => { + req.query = { + startDate: '10000000', + endDate: '16000000', + language: 'zh', + reportType: FinancialReportTypesKey.balance_sheet, + }; + req.body = {}; + + const { payload, statusMessage } = await handleGetRequest(req, res); + + expect(statusMessage).toBe(STATUS_MESSAGE.SUCCESS_GET); + expect(payload).toBeDefined(); + }); + }); +}); diff --git a/src/pages/api/v2/company/[companyId]/report/index.ts b/src/pages/api/v2/company/[companyId]/report/index.ts new file mode 100644 index 000000000..a65e4ac8b --- /dev/null +++ b/src/pages/api/v2/company/[companyId]/report/index.ts @@ -0,0 +1,369 @@ +import { STATUS_MESSAGE } from '@/constants/status_code'; +import { IResponseData } from '@/interfaces/response_data'; +// import { AuthFunctionsKeys } from '@/interfaces/auth'; +// import { checkAuthorization } from '@/lib/utils/auth_check'; +import { formatApiResponse } from '@/lib/utils/common'; +import { getSession } from '@/lib/utils/session'; +import { NextApiRequest, NextApiResponse } from 'next'; +import { validateRequest } from '@/lib/utils/request_validator'; +import { APIName } from '@/constants/api_connection'; + +import { loggerError } from '@/lib/utils/logger_back'; +import { FinancialReportTypesKey } from '@/interfaces/report_type'; +import { IAccountReadyForFrontend } from '@/interfaces/accounting_account'; + +type ReportObject = { + [code: string]: IAccountReadyForFrontend; +}; + +type ReportReturnType = { + general: ReportObject; + detail: ReportObject; +} | null; + +type APIResponse = object | null; + +export async function balanceSheetHandler({ + // ToDo: (20241007 - Murky) Use these param in function + /* eslint-disable @typescript-eslint/no-unused-vars */ + startDate, + endDate, + language, + /* eslint-enable @typescript-eslint/no-unused-vars */ +}: { + startDate: number; + endDate: number; + language: string; +}) { + const statusMessage: string = STATUS_MESSAGE.SUCCESS_GET; + + // ToDo: (20241007 - Murky) negative number need to be in brackets + // ToDo: (20241007 - Murky) Maybe IAccountReadyForFrontEnd need to have "string" version of percentage + + const general: ReportObject = { + '11XX': { + code: '11XX', + name: '流動資產合計', + curPeriodAmount: 2194032910, + curPeriodAmountString: '2,194,032,910', + curPeriodPercentage: 40, + curPeriodPercentageString: '40', + prePeriodAmount: 2052896744, + prePeriodAmountString: '2,052,896,744', + prePeriodPercentage: 41, + prePeriodPercentageString: '41', + indent: 3, + children: {}, + }, + }; + + const detail: ReportObject = { + 1100: { + code: '1100', + name: '現金及約當現金', + curPeriodAmount: 20000, + curPeriodAmountString: '20,000', + curPeriodPercentage: 10, + curPeriodPercentageString: '10', + prePeriodAmount: 10000, + prePeriodAmountString: '10,000', + prePeriodPercentage: 5, + prePeriodPercentageString: '5', + indent: 3, + children: { + 1101: { + code: '1101', + name: '庫存現金', + curPeriodAmount: 10000, + curPeriodAmountString: '10,000', + curPeriodPercentage: 5, + curPeriodPercentageString: '5', + prePeriodAmount: 5000, + prePeriodAmountString: '5,000', + prePeriodPercentage: 2.5, + prePeriodPercentageString: '2.5', + indent: 4, + children: {}, + }, + 1102: { + code: '1102', + name: '零用金∕週轉金', + curPeriodAmount: 10000, + curPeriodAmountString: '10,000', + curPeriodPercentage: 5, + curPeriodPercentageString: '5', + prePeriodAmount: 5000, + prePeriodAmountString: '5,000', + prePeriodPercentage: 2.5, + prePeriodPercentageString: '2.5', + indent: 4, + children: {}, + }, + }, + }, + }; + + const payload: ReportReturnType = { + general, + detail, + }; + + return { + statusMessage, + payload, + }; +} + +export async function incomeStatementHandler({ + // ToDo: (20241007 - Murky) Use these param in function + /* eslint-disable @typescript-eslint/no-unused-vars */ + startDate, + endDate, + language, + /* eslint-enable @typescript-eslint/no-unused-vars */ +}: { + startDate: number; + endDate: number; + language: string; +}) { + const statusMessage: string = STATUS_MESSAGE.SUCCESS_GET; + + // ToDo: (20241007 - Murky) negative number need to be in brackets + // ToDo: (20241007 - Murky) Maybe IAccountReadyForFrontEnd need to have "string" version of percentage + + const general: ReportObject = { + 5950: { + code: '5950', + name: '營業毛利(毛損)淨額流動', + curPeriodAmount: 2194032910, + curPeriodAmountString: '2,194,032,910', + curPeriodPercentage: 40, + curPeriodPercentageString: '40', + prePeriodAmount: 2052896744, + prePeriodAmountString: '2,052,896,744', + prePeriodPercentage: 41, + prePeriodPercentageString: '41', + indent: 3, + children: {}, + }, + }; + + const detail: ReportObject = { + 4110: { + code: '4110', + name: '銷貨收入', + curPeriodAmount: 20000, + curPeriodAmountString: '20,000', + curPeriodPercentage: 10, + curPeriodPercentageString: '10', + prePeriodAmount: 10000, + prePeriodAmountString: '10,000', + prePeriodPercentage: 5, + prePeriodPercentageString: '5', + indent: 3, + children: { + 4111: { + code: '4111', + name: '銷貨收入', + curPeriodAmount: 10000, + curPeriodAmountString: '10,000', + curPeriodPercentage: 5, + curPeriodPercentageString: '5', + prePeriodAmount: 5000, + prePeriodAmountString: '5,000', + prePeriodPercentage: 2.5, + prePeriodPercentageString: '2.5', + indent: 4, + children: {}, + }, + 4112: { + code: '4112', + name: '天然氣銷貨收入(天然氣業)', + curPeriodAmount: 10000, + curPeriodAmountString: '10,000', + curPeriodPercentage: 5, + curPeriodPercentageString: '5', + prePeriodAmount: 5000, + prePeriodAmountString: '5,000', + prePeriodPercentage: 2.5, + prePeriodPercentageString: '2.5', + indent: 4, + children: {}, + }, + }, + }, + }; + + const payload: ReportReturnType = { + general, + detail, + }; + + return { + statusMessage, + payload, + }; +} + +export async function cashFlowHandler({ + // ToDo: (20241007 - Murky) Use these param in function + /* eslint-disable @typescript-eslint/no-unused-vars */ + startDate, + endDate, + language, + /* eslint-enable @typescript-eslint/no-unused-vars */ +}: { + startDate: number; + endDate: number; + language: string; +}) { + const statusMessage: string = STATUS_MESSAGE.SUCCESS_GET; + + // ToDo: (20241007 - Murky) negative number need to be in brackets + // ToDo: (20241007 - Murky) Maybe IAccountReadyForFrontEnd need to have "string" version of percentage + + const general: ReportObject = { + A20010: { + code: 'A200105950', + name: '收益費損項目合計', + curPeriodAmount: 2194032910, + curPeriodAmountString: '2,194,032,910', + curPeriodPercentage: 40, + curPeriodPercentageString: '40', + prePeriodAmount: 2052896744, + prePeriodAmountString: '2,052,896,744', + prePeriodPercentage: 41, + prePeriodPercentageString: '41', + indent: 3, + children: {}, + }, + }; + + const detail: ReportObject = { + 4110: { + code: '4110', + name: '銷貨收入', + curPeriodAmount: 20000, + curPeriodAmountString: '20,000', + curPeriodPercentage: 10, + curPeriodPercentageString: '10', + prePeriodAmount: 10000, + prePeriodAmountString: '10,000', + prePeriodPercentage: 5, + prePeriodPercentageString: '5', + indent: 3, + children: {}, + }, + }; + + const payload: ReportReturnType = { + general, + detail, + }; + + return { + statusMessage, + payload, + }; +} + +export async function report401Handler({ + // ToDo: (20241007 - Murky) Use these param in function + /* eslint-disable @typescript-eslint/no-unused-vars */ + startDate, + endDate, + language, + /* eslint-enable @typescript-eslint/no-unused-vars */ +}: { + startDate: number; + endDate: number; + language: string; +}) { + const statusMessage: string = STATUS_MESSAGE.SUCCESS_UPDATE; + const payload = null; + return { + statusMessage, + payload, + }; +} + +type ReportHandlers = { + [K in FinancialReportTypesKey]: ({ + startDate, + endDate, + language, + }: { + startDate: number; + endDate: number; + language: string; + }) => Promise<{ statusMessage: string; payload: ReportReturnType }>; +}; + +const reportHandlers: ReportHandlers = { + [FinancialReportTypesKey.balance_sheet]: balanceSheetHandler, + [FinancialReportTypesKey.comprehensive_income_statement]: incomeStatementHandler, + [FinancialReportTypesKey.cash_flow_statement]: cashFlowHandler, + [FinancialReportTypesKey.report_401]: report401Handler, +}; + +export async function handleGetRequest(req: NextApiRequest, res: NextApiResponse) { + let statusMessage: string = STATUS_MESSAGE.BAD_REQUEST; + let payload: object | null = null; + + const session = await getSession(req, res); + const { userId } = session; + + // ToDo: (20240924 - Murky) We need to check auth + const { query } = validateRequest(APIName.REPORT_GET_V2, req, userId); + + if (query) { + // ToDo: (20240924 - Murky) Remember to use sortBy, sortOrder, startDate, endDate, searchQuery, hasBeenUsed + const { startDate, endDate, language, reportType } = query; + const reportHandler = reportHandlers[reportType]; + + ({ payload, statusMessage } = await reportHandler({ + startDate, + endDate, + language, + })); + } + + return { + statusMessage, + payload, + userId, + }; +} + +const methodHandlers: { + [key: string]: ( + req: NextApiRequest, + res: NextApiResponse + ) => Promise<{ statusMessage: string; payload: APIResponse; userId: number }>; +} = { + GET: handleGetRequest, +}; + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse> +) { + let statusMessage: string = STATUS_MESSAGE.BAD_REQUEST; + let payload: APIResponse = null; + let userId = -1; + try { + const handleRequest = methodHandlers[req.method || '']; + if (handleRequest) { + ({ statusMessage, payload, userId } = await handleRequest(req, res)); + } else { + statusMessage = STATUS_MESSAGE.METHOD_NOT_ALLOWED; + } + } catch (_error) { + const error = _error as Error; + const logger = loggerError(userId, error.name, error.message); + logger.error(error); + statusMessage = error.message; + } + const { httpCode, result } = formatApiResponse(statusMessage, payload); + res.status(httpCode).json(result); +} From 592dba4499e8891c91dbf0077b1711b90cb33a73 Mon Sep 17 00:00:00 2001 From: Tiny_Murky Date: Mon, 7 Oct 2024 14:53:26 +0800 Subject: [PATCH 03/29] change IAccountReadyForFrontEnd --- package.json | 2 +- src/constants/financial_report.ts | 3 +++ .../api/v1/company/[companyId]/report/[reportId]/index.ts | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index c08ce1cb9..af633640f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+35", + "version": "0.8.2+36", "private": false, "scripts": { "dev": "next dev", diff --git a/src/constants/financial_report.ts b/src/constants/financial_report.ts index 2057501cb..a4ffaddda 100644 --- a/src/constants/financial_report.ts +++ b/src/constants/financial_report.ts @@ -15,8 +15,11 @@ export const EMPTY_I_ACCOUNT_READY_FRONTEND: IAccountReadyForFrontend = { curPeriodAmount: 0, curPeriodAmountString: '0', curPeriodPercentage: 0, + curPeriodPercentageString: '0', prePeriodAmount: 0, prePeriodAmountString: '0', prePeriodPercentage: 0, + prePeriodPercentageString: '0', indent: 0, + children: {}, }; diff --git a/src/pages/api/v1/company/[companyId]/report/[reportId]/index.ts b/src/pages/api/v1/company/[companyId]/report/[reportId]/index.ts index a4f6a92a8..468045b26 100644 --- a/src/pages/api/v1/company/[companyId]/report/[reportId]/index.ts +++ b/src/pages/api/v1/company/[companyId]/report/[reportId]/index.ts @@ -102,10 +102,13 @@ function transformDetailsIntoGeneral( curPeriodAmount: 0, curPeriodAmountString: '0', curPeriodPercentage: 0, + curPeriodPercentageString: '0', prePeriodAmount: 0, prePeriodAmountString: '0', prePeriodPercentage: 0, + prePeriodPercentageString: '0', indent: account.indent, + children: {}, }; }); return general; From 5d0e2917fba99dae217d11d9f45fea0bdc25d073 Mon Sep 17 00:00:00 2001 From: TzuHanLiang Date: Mon, 7 Oct 2024 17:36:28 +0800 Subject: [PATCH 04/29] feat: add API to test [unfinish] --- package.json | 2 +- src/components/certificate/certificate.tsx | 5 +- .../certificate/certificate_grid.tsx | 31 ++- .../certificate/certificate_qrcode_modal.tsx | 74 +++++++ .../floating_upload_popup.tsx | 22 ++- src/components/upload_area/upload_area.tsx | 4 +- src/interfaces/certificate.ts | 17 +- src/pages/api/v2/pusher.ts | 23 ++- src/pages/api/v2/upload.ts | 67 +++++++ .../accounting => }/certificate_list.tsx | 108 ++++++---- src/pages/mobile_upload.tsx | 187 +++++++++++++----- 11 files changed, 409 insertions(+), 131 deletions(-) create mode 100644 src/components/certificate/certificate_qrcode_modal.tsx create mode 100644 src/pages/api/v2/upload.ts rename src/pages/{users/accounting => }/certificate_list.tsx (77%) diff --git a/package.json b/package.json index dab30b0c6..c637fe216 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+33", + "version": "0.8.2+34", "private": false, "scripts": { "dev": "next dev", diff --git a/src/components/certificate/certificate.tsx b/src/components/certificate/certificate.tsx index 350ffe1d2..d77902a73 100644 --- a/src/components/certificate/certificate.tsx +++ b/src/components/certificate/certificate.tsx @@ -2,12 +2,11 @@ import React, { useState } from 'react'; import Pagination from '@/components/pagination/pagination'; import { ICertificateUI, VIEW_TYPES } from '@/interfaces/certificate'; import CertificateTable from '@/components/certificate/certificate_table'; -import CertificateGrid from './certificate_grid'; +import CertificateGrid from '@/components/certificate/certificate_grid'; interface CertificateProps { data: ICertificateUI[]; // Info: (20240923 - tzuhan) 項目列表 viewType: VIEW_TYPES; // Info: (20240923 - tzuhan) 顯示模式 - activeTab: number; // Info: (20240926 - tzuhan) 活躍的 Tab activeSelection: boolean; // Info: (20240923 - tzuhan) 是否處於選擇狀態 handleSelect: (ids: number[], isSelected: boolean) => void; isSelectedAll: boolean; @@ -21,7 +20,6 @@ interface CertificateProps { const Certificate: React.FC = ({ data, viewType, - activeTab, activeSelection, handleSelect, isSelectedAll, @@ -48,7 +46,6 @@ const Certificate: React.FC = ({ {viewType === VIEW_TYPES.GRID && ( void; onRemove: (id: number) => void; onDownload: (id: number) => void; @@ -16,29 +14,24 @@ interface CertificateGridProps { const CertificateGrid: React.FC = ({ data, activeSelection, - activeTab, handleSelect, onRemove, onDownload, onEdit, }) => { return ( - <> -
- {data.map((certificate) => ( - - ))} -
- {/* Info: (20240926- tzuhan) Floating Upload Popup */} - {activeTab === 0 && } - +
+ {data.map((certificate) => ( + + ))} +
); }; diff --git a/src/components/certificate/certificate_qrcode_modal.tsx b/src/components/certificate/certificate_qrcode_modal.tsx new file mode 100644 index 000000000..cb163802b --- /dev/null +++ b/src/components/certificate/certificate_qrcode_modal.tsx @@ -0,0 +1,74 @@ +import React from 'react'; +import { ISUNFA_ROUTE } from '@/constants/url'; +import { DOMAIN } from '@/constants/config'; +import { RxCross1 } from 'react-icons/rx'; +import { Button } from '@/components/button/button'; +import { useQRCode } from 'next-qrcode'; + +interface CertificateQRCodeModalProps { + isOpen: boolean; + isOnTopOfModal: boolean; + token: string; + onClose: () => void; // Info: (20240924 - tzuhan) 關閉模態框的回調函數 +} + +const CertificateQRCodeModal: React.FC = ({ + isOpen, + isOnTopOfModal = false, + token, + onClose, +}) => { + if (!isOpen) return null; + const { Canvas } = useQRCode(); + const isDev = process.env.NODE_ENV === 'development'; + + return ( +
+
+ {/* Info: (20240924 - tzuhan) 關閉按鈕 */} + + {/* Info: (20240924 - tzuhan) 模態框標題 */} +

+
Url
+
for mobile upload
+

+
+ {/* Info: (20240924 - tzuhan) 發票縮略圖 */} + +
+
+ +
+
+
+ ); +}; + +export default CertificateQRCodeModal; diff --git a/src/components/floating_upload_popup/floating_upload_popup.tsx b/src/components/floating_upload_popup/floating_upload_popup.tsx index 7a772852b..c3959ecdc 100644 --- a/src/components/floating_upload_popup/floating_upload_popup.tsx +++ b/src/components/floating_upload_popup/floating_upload_popup.tsx @@ -1,14 +1,20 @@ import React, { useState } from 'react'; -import UploadFileItem, { UploadFile } from '@/components/upload_certificate/upload_file_item'; +import UploadFileItem from '@/components/upload_certificate/upload_file_item'; import { ProgressStatus } from '@/constants/account'; import Image from 'next/image'; +import { ICertificateInfo } from '@/interfaces/certificate'; -const FloatingUploadPopup: React.FC = () => { - const [files, setFiles] = useState([ - { name: 'preline-ui.xls', size: 7, progress: 20, status: ProgressStatus.IN_PROGRESS }, - { name: 'preline-ui.xls', size: 7, progress: 50, status: ProgressStatus.IN_PROGRESS }, - { name: 'preline-ui.xls', size: 7, progress: 80, status: ProgressStatus.IN_PROGRESS }, - ]); +interface FloatingUploadPopupProps { + uploadingCertificates: ICertificateInfo[]; +} + +const FloatingUploadPopup: React.FC = ({ uploadingCertificates }) => { + const [files, setFiles] = useState(uploadingCertificates); + // const [files, setFiles] = useState([ + // { name: 'preline-ui.xls', size: 7, progress: 20, status: ProgressStatus.IN_PROGRESS }, + // { name: 'preline-ui.xls', size: 7, progress: 50, status: ProgressStatus.IN_PROGRESS }, + // { name: 'preline-ui.xls', size: 7, progress: 80, status: ProgressStatus.IN_PROGRESS }, + // ]); const [expanded, setExpanded] = useState(false); // Info: (20240919 - tzuhan) 控制展開/收縮狀態 // Info: (20240919 - tzuhan) 計算總上傳進度和狀態 @@ -19,7 +25,7 @@ const FloatingUploadPopup: React.FC = () => { ); // Info: (20240919 - tzuhan) 暫停或繼續上傳 - const updateFileStatus = (prevFiles: UploadFile[], index: number) => + const updateFileStatus = (prevFiles: ICertificateInfo[], index: number) => prevFiles.map((file, i) => { return i === index ? { diff --git a/src/components/upload_area/upload_area.tsx b/src/components/upload_area/upload_area.tsx index 0b599cccf..ef47fdbca 100644 --- a/src/components/upload_area/upload_area.tsx +++ b/src/components/upload_area/upload_area.tsx @@ -5,7 +5,7 @@ import Image from 'next/image'; interface UploadAreaProps { isDisabled: boolean; withScanner: boolean; - toggleQRCode: () => void; + toggleQRCode?: () => void; } const UploadArea: React.FC = ({ isDisabled, withScanner, toggleQRCode }) => { @@ -82,7 +82,7 @@ const UploadArea: React.FC = ({ isDisabled, withScanner, toggle /> - {withScanner && ( + {withScanner && toggleQRCode && ( <>

{t('common:COMMON.OR')} diff --git a/src/interfaces/certificate.ts b/src/interfaces/certificate.ts index 050dc835f..42220e0c9 100644 --- a/src/interfaces/certificate.ts +++ b/src/interfaces/certificate.ts @@ -1,5 +1,6 @@ -// Info: (20240920 - tzuhan) 定義 ICertificate 接口 +import { ProgressStatus } from '@/constants/account'; +// Info: (20240920 - tzuhan) 定義 ICertificate 接口 export enum CERTIFICATE_TYPES { INPUT = 'Input', OUTPUT = 'Output', @@ -30,6 +31,20 @@ export interface ICertificate { uploader: string; } +export interface ICertificateData { + token: string; + url: string; + status: ProgressStatus; +} + +export interface ICertificateInfo { + url: string; + name: string; + size: number; + status: ProgressStatus; + progress: number; +} + export enum VIEW_TYPES { GRID = 'grid', LIST = 'list', diff --git a/src/pages/api/v2/pusher.ts b/src/pages/api/v2/pusher.ts index fa854dc5f..b6ca42850 100644 --- a/src/pages/api/v2/pusher.ts +++ b/src/pages/api/v2/pusher.ts @@ -1,25 +1,32 @@ -// /pages/api/pusher.ts import type { NextApiRequest, NextApiResponse } from 'next'; import Pusher from 'pusher'; // Info: (20241004-tzuhan) 初始化 Pusher const pusher = new Pusher({ appId: process.env.PUSHER_APP_ID!, - key: process.env.PUSHER_KEY!, + key: process.env.NEXT_PUBLIC_PUSHER_KEY!, secret: process.env.PUSHER_SECRET!, - cluster: process.env.PUSHER_CLUSTER!, - useTLS: true, + host: process.env.NEXT_PUBLIC_PUSHER_HOST!, + useTLS: process.env.PUSHER_USE_TLS === 'true', }); export default async function handler(req: NextApiRequest, res: NextApiResponse) { if (req.method === 'POST') { - const { images } = req.body; + const { certificates } = req.body; + + // eslint-disable-next-line no-console + console.log('certificates:', certificates); // Info: (20241004-tzuhan) 發送圖片 URL 給其他訂閱者 try { - await pusher.trigger('certificate-channel', 'certificate-event', { - images, - }); + await Promise.all( + certificates.map(async (certificate: { url: string; token: string }) => { + await pusher.trigger('certificate-channel', 'certificate-event', { + url: certificate.url, + token: certificate.token, + }); + }) + ); res.status(200).json({ status: 'Certificate sent successfully' }); } catch (error) { res.status(500).json({ status: 'Failed to send certificates', error }); diff --git a/src/pages/api/v2/upload.ts b/src/pages/api/v2/upload.ts new file mode 100644 index 000000000..0bef24f54 --- /dev/null +++ b/src/pages/api/v2/upload.ts @@ -0,0 +1,67 @@ +import { NextApiRequest, NextApiResponse } from 'next'; +import { IncomingForm, File as FormidableFile } from 'formidable'; +import { promises as fs } from 'fs'; + +import path from 'path'; + +// Info: (20241007 - tzuhan) 禁用內建的 body 解析 +export const config = { + api: { + bodyParser: false, + }, +}; + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + if (req.method === 'POST') { + const form = new IncomingForm({ + uploadDir: path.join(process.cwd(), '/tmp'), + keepExtensions: true, // Info: (20241007 - tzuhan) 保留文件擴展名 + }); + + // Deprecated: (20241011 - tzuhan) Debugging purpose + // eslint-disable-next-line no-console + console.log('form:', form); + + form.parse(req, async (err, fields, files) => { + if (err) { + // Deprecated: (20241011 - tzuhan) Debugging purpose + // eslint-disable-next-line no-console + console.error('Error parsing the files:', err); + return res.status(500).json({ message: 'File upload error' }); + } + + // Deprecated: (20241011 - tzuhan) Debugging purpose + // eslint-disable-next-line no-console + console.log('files:', files); + + // Info: (20241007 - tzuhan) 處理多個文件 + const uploadedFiles = Array.isArray(files.files) ? files.files : [files.files]; // 確保它是數組 + + const uploadDir = path.join(process.cwd(), '/public/uploads'); + await fs.mkdir(uploadDir, { recursive: true }); // Info: (20241007 - tzuhan) 確保上傳目錄存在 + + // Info: (20241007 - tzuhan) 生成每個文件的 URL 和 token + const certificates = await Promise.all( + uploadedFiles + .filter((file: FormidableFile | undefined) => !!file) + .map(async (file: FormidableFile) => { + const tempFilePath = file.filepath; + const fileName = `${Date.now()}_${file.originalFilename}`; + const finalFilePath = path.join(uploadDir, fileName); + + await fs.rename(tempFilePath, finalFilePath); // Info: (20241007 - tzuhan) 將文件移動到最終目錄 + + const fileUrl = `/uploads/${fileName}`; // Info: (20241007 - tzuhan) 文件的相對 URL + + return { + fileUrl, + }; + }) + ); + + return res.status(200).json({ certificates }); + }); + } else { + res.status(405).json({ message: 'Method not allowed' }); + } +} diff --git a/src/pages/users/accounting/certificate_list.tsx b/src/pages/certificate_list.tsx similarity index 77% rename from src/pages/users/accounting/certificate_list.tsx rename to src/pages/certificate_list.tsx index 81abdcc39..7191ff249 100644 --- a/src/pages/users/accounting/certificate_list.tsx +++ b/src/pages/certificate_list.tsx @@ -1,5 +1,4 @@ import React, { useCallback, useState, useEffect } from 'react'; -import { useQRCode } from 'next-qrcode'; import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import { ILocale } from '@/interfaces/locale'; import Head from 'next/head'; @@ -10,19 +9,23 @@ import Tabs from '@/components/tabs/tabs'; import FilterSection from '@/components/filter_section/filter_section'; import { APIName } from '@/constants/api_connection'; import SelectionToolbar from '@/components/selection_tool_bar/selection_tool_bar'; -import { ICertificate, ICertificateUI, OPERATIONS, VIEW_TYPES } from '@/interfaces/certificate'; +import { + ICertificate, + ICertificateInfo, + ICertificateUI, + OPERATIONS, + VIEW_TYPES, +} from '@/interfaces/certificate'; import Certificate from '@/components/certificate/certificate'; import CertificateEditModal from '@/components/certificate/certificate_edit_modal'; import Pusher, { Channel } from 'pusher-js'; +import FloatingUploadPopup from '@/components/floating_upload_popup/floating_upload_popup'; +import CertificateQRCodeModal from '@/components/certificate/certificate_qrcode_modal'; import Image from 'next/image'; -import { ISUNFA_ROUTE } from '@/constants/url'; +import { v4 as uuidv4 } from 'uuid'; +import { ProgressStatus } from '@/constants/account'; -interface ImageData { - url: string; - status: string; -} const UploadCertificatePage: React.FC = () => { - const { Canvas } = useQRCode(); const [showQRCode, setShowQRCode] = useState(false); const [activeTab, setActiveTab] = useState(0); const [data, setData] = useState<{ [tab: number]: { [id: number]: ICertificateUI } }>({ @@ -40,7 +43,8 @@ const UploadCertificatePage: React.FC = () => { 0: false, 1: false, }); - const [receivedImages, setReceivedImages] = useState([]); + const token = uuidv4(); // Info: (20241007 - tzuhan) 生成唯一 token + const [uploadingCertificates, setUploadingCertificates] = useState([]); const handleApiResponse = useCallback((resData: ICertificate[]) => { const sumInvoiceTotalPrice = { @@ -185,21 +189,58 @@ const UploadCertificatePage: React.FC = () => { console.log('Save selected id:', certificate); }, []); + const certificateHandler = async (certificateData: { url: string; token: string }) => { + // TODO: (20241007 - tzuhan) post certificate data to server and get uploading certificate list back and update certificate list when uploaded + // TODO: (20241007 - tzuhan) get Token from server + if (certificateData.token === token) { + // Info: (20241007 - tzuhan) 使用 fetch 下載圖片文件 + const response = await fetch(certificateData.url); + const blob = await response.blob(); + + // Info: (20241007 - tzuhan) 獲取文件名,從 response headers 提取 + const contentDisposition = response.headers.get('Content-Disposition'); + let fileName = 'unknown'; + if (contentDisposition) { + const match = contentDisposition.match(/filename="(.+)"/); + if (match && match[1]) { + // Info: (20241007 - tzuhan) 使用陣列解構提取文件名 + [, fileName] = match; + } + } else { + // Info: (20241007 - tzuhan) 如果沒有提供 header,可以從 url 推斷出文件名 + fileName = certificateData.url.split('/').pop() || 'unknown'; + } + + // Info: (20241007 - tzuhan) 獲取文件大小 + const fileSize = blob.size; + + const imageObjectUrl = URL.createObjectURL(blob); + setUploadingCertificates((prev) => [ + ...prev, + { + url: imageObjectUrl, + status: ProgressStatus.IN_PROGRESS, + name: fileName, + size: fileSize, + progress: 80, + }, + ]); + } + }; + useEffect(() => { - const pusher = new Pusher(process.env.NEXT_PUBLIC_PUSHER_APP_KEY!, { - cluster: process.env.NEXT_PUBLIC_PUSHER_APP_CLUSTER!, + const pusher = new Pusher(process.env.NEXT_PUBLIC_PUSHER_KEY!, { + cluster: '', + wsHost: process.env.NEXT_PUBLIC_PUSHER_HOST!, + wsPort: parseFloat(process.env.NEXT_PUBLIC_PUSHER_PORT!), }); const channel: Channel = pusher.subscribe('certificate-channel'); - const imageHandler = (imageData: { images: ImageData[] }) => { - setReceivedImages((prev) => [...prev, ...imageData.images]); - }; - - channel.bind('certificate-event', imageHandler); + channel.bind('certificate-event', certificateHandler); return () => { - channel.unbind('certificate-event', imageHandler); + channel.unbind('certificate-event', certificateHandler); pusher.unsubscribe('certificate-channel'); }; }, []); @@ -221,6 +262,14 @@ const UploadCertificatePage: React.FC = () => { onSave={handleSave} /> )} + {showQRCode && ( + setShowQRCode((prev) => !prev)} + isOnTopOfModal={false} + token={token} + /> + )} {/* Info: (20240919 - tzuhan) Side Menu */} @@ -229,22 +278,6 @@ const UploadCertificatePage: React.FC = () => {
{/* Info: (20240919 - tzuhan) Header */}
- - {showQRCode && ( - - )} {/* Info: (20240919 - tzuhan) Main Content */}
{/* Info: (20240919 - tzuhan) Upload Area */} @@ -254,7 +287,7 @@ const UploadCertificatePage: React.FC = () => { toggleQRCode={() => setShowQRCode((prev) => !prev)} />
- {receivedImages.map((image, index) => ( + {uploadingCertificates.map((image, index) => (
{`Received

Status: {image.status}

@@ -292,7 +325,7 @@ const UploadCertificatePage: React.FC = () => { onActiveChange={setActiveSelection} items={Object.values(data[activeTab])} itemType="Certificates" - subtitle={`Invoice Total Price: ${sumPrice} TWD`} + subtitle={`Invoice Total Price: ${sumPrice[activeTab]} TWD`} selectedCount={filterSelectedIds().length} totalCount={Object.values(data[activeTab]).length || 0} handleSelect={handleSelect} @@ -307,7 +340,6 @@ const UploadCertificatePage: React.FC = () => { { onEdit={onEdit} />
+ {/* Info: (20240926- tzuhan) Floating Upload Popup */} + {uploadingCertificates.length > 0 && ( + + )}
diff --git a/src/pages/mobile_upload.tsx b/src/pages/mobile_upload.tsx index 1b8830ac0..6b879b85a 100644 --- a/src/pages/mobile_upload.tsx +++ b/src/pages/mobile_upload.tsx @@ -1,85 +1,168 @@ -// /pages/page2.tsx +import { useRouter } from 'next/router'; import { Button } from '@/components/button/button'; +import Head from 'next/head'; import Image from 'next/image'; import { useState } from 'react'; +import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; +import { ILocale } from '@/interfaces/locale'; +import { ICertificateData } from '@/interfaces/certificate'; +import { ProgressStatus } from '@/constants/account'; -interface ImageData { +interface FileWithUrl extends File { url: string; - status: string; } -const MobileUpload = () => { - const [selectedImages, setSelectedImages] = useState([]); - const [uploadedImages, setUploadedImages] = useState([]); +const MobileUploadPage: React.FC = () => { + const router = useRouter(); + const { query } = router; + const { token } = query; + const [selectedCertificates, setSelectedCertificates] = useState([]); + const [uploadedCertificates, setUploadedCertificates] = useState([]); const [isUploading, setIsUploading] = useState(false); - const handleImageChange = (e: React.ChangeEvent) => { + const handleCertificateChange = (e: React.ChangeEvent) => { if (e.target.files) { - setSelectedImages(Array.from(e.target.files)); + setSelectedCertificates( + Array.from(e.target.files).map((file) => { + return { + ...file, + url: URL.createObjectURL(file), + }; + }) + ); } }; - const uploadImages = async () => { + const uploadCertificates = async () => { setIsUploading(true); - const imageUploads = await Promise.all( - selectedImages.map(async (image) => { - try { - // 模擬上傳圖片並獲得 URL - const url = URL.createObjectURL(image); - return { url, status: 'success' }; - } catch (error) { - return { url: '', status: 'failed' }; - } - }) - ); - - setUploadedImages(imageUploads); - - // 發送圖片和對應的狀態到伺服器 + // Info: (20241007 - tzuhan) 使用 FormData 上傳文件 + const formData = new FormData(); + selectedCertificates.forEach((certificate) => { + formData.append('file', certificate); + }); + try { - const response = await fetch('/api/v2/pusher', { + const response = await fetch('/api/v2/upload', { method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ images: imageUploads }), + body: formData, }); + const data = await response.json(); if (!response.ok) { - throw new Error('Failed to send images'); + throw new Error('Failed to upload certificates'); } + + // Deprecated: (20241011 - tzuhan) Debugging purpose + // eslint-disable-next-line no-console + console.log('data:', data); + + const { certificates } = data; + certificates.forEach(async (certificate: { fileUrl: string }) => { + const certificateUpload = { + url: certificate.fileUrl, + token: token as string, + status: ProgressStatus.IN_PROGRESS, + }; + + setUploadedCertificates([...uploadedCertificates, certificateUpload]); + + // Deprecated: (20241011 - tzuhan) Debugging purpose + // eslint-disable-next-line no-console + console.log('certificates:', certificateUpload); + + // Info: (20241007 - tzuhan) 通過 Pusher 傳送圖片 URL 和 token + await fetch('/api/v2/pusher', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ certificate: certificateUpload }), + }); + }); + + setSelectedCertificates([]); } catch (error) { - // Deprecated: (20241004 - tzuhan) Debugging purpose only + // Deprecated: (20241011 - tzuhan) Debugging purpose // eslint-disable-next-line no-console - console.log('Error sending images:', error); + console.error('Error uploading certificates:', error); } finally { setIsUploading(false); } }; return ( -
-

Upload Images

- - -
-

Uploaded Images

- {uploadedImages.map((image, index) => ( -
- {image.status === 'success' ? ( - {`Uploaded - ) : ( -

Image {index + 1} upload failed

- )} -

Status: {image.status}

+ <> + + + + + Upload Certificate - iSunFA + +
+

Upload Certificates

+ + +
+

Selected Certificates

+
+ {selectedCertificates.map((certificate, index) => ( +
+ {`Uploaded +
+ ))}
- ))} -
-
+
+
+

Uploaded Certificates

+
+ {uploadedCertificates.map((certificate, index) => ( +
+ {certificate.status !== ProgressStatus.SYSTEM_ERROR ? ( + {`Uploaded + ) : ( +

Certificate {index + 1} upload failed

+ )} +

Status: {certificate.status}

+
+ ))} +
+
+ + ); }; -export default MobileUpload; +const getStaticPropsFunction = async ({ locale }: ILocale) => ({ + props: { + ...(await serverSideTranslations(locale, [ + 'common', + 'journal', + 'kyc', + 'project', + 'report_401', + 'salary', + 'setting', + 'terms', + ])), + }, +}); + +export const getStaticProps = getStaticPropsFunction; + +export default MobileUploadPage; From 7420544dc9796a68f49430a1599436f01c57d13d Mon Sep 17 00:00:00 2001 From: Luphia Chang Date: Mon, 7 Oct 2024 20:00:33 +0800 Subject: [PATCH 05/29] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index af633640f..c4a624902 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+36", + "version": "0.8.2+34", "private": false, "scripts": { "dev": "next dev", From e0d0d6d5bb23346704912fb27787d9aa86e7547f Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 8 Oct 2024 14:47:33 +0800 Subject: [PATCH 06/29] Feat: fix style --- package.json | 2 +- src/components/certificate/certificate_selection.tsx | 2 +- src/components/voucher/new_voucher_form.tsx | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index c4a624902..c08ce1cb9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+34", + "version": "0.8.2+35", "private": false, "scripts": { "dev": "next dev", diff --git a/src/components/certificate/certificate_selection.tsx b/src/components/certificate/certificate_selection.tsx index 62aec19f7..b710c8ed2 100644 --- a/src/components/certificate/certificate_selection.tsx +++ b/src/components/certificate/certificate_selection.tsx @@ -91,7 +91,7 @@ const CertificateSelection: React.FC = ({ return (
{
{t('journal:VOUCHER.DEBIT')}
-
+
{t('journal:VOUCHER.CREDIT')}
-
{/* Info: (20240927 - Julian) Table Body */} {voucherLines} From 24732b67bf3aee00d0b30907c72fec141bc9846f Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 8 Oct 2024 14:55:16 +0800 Subject: [PATCH 07/29] Feat: Add React.FC --- package.json | 2 +- src/components/voucher/ap_and_ar_item.tsx | 2 +- src/components/voucher/ap_and_ar_list.tsx | 2 +- .../voucher/ap_and_ar_page_body.tsx | 2 +- src/components/voucher/new_voucher_form.tsx | 2 +- src/components/voucher/sorting_button.tsx | 11 ++++---- src/components/voucher/voucher_item.tsx | 2 +- src/components/voucher/voucher_line_item.tsx | 26 ++++++++++--------- src/components/voucher/voucher_list.tsx | 2 +- .../voucher/voucher_list_page_body.tsx | 2 +- .../users/accounting/add_new_voucher.tsx | 2 +- .../accounting/payable_receivable_list.tsx | 3 ++- src/pages/users/accounting/voucher_list.tsx | 2 +- 13 files changed, 31 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index c08ce1cb9..af633640f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+35", + "version": "0.8.2+36", "private": false, "scripts": { "dev": "next dev", diff --git a/src/components/voucher/ap_and_ar_item.tsx b/src/components/voucher/ap_and_ar_item.tsx index 0487d4f4c..16e89b973 100644 --- a/src/components/voucher/ap_and_ar_item.tsx +++ b/src/components/voucher/ap_and_ar_item.tsx @@ -5,7 +5,7 @@ import { FaDownload, FaUpload } from 'react-icons/fa'; import { VoucherType } from '@/constants/account'; import { FiRepeat } from 'react-icons/fi'; -const APandARItem = () => { +const APandARItem: React.FC = () => { // ToDo: (20240924 - Julian) dummy data const date: number = new Date().getTime() / 1000; const voucherType: VoucherType = VoucherType.EXPENSE; diff --git a/src/components/voucher/ap_and_ar_list.tsx b/src/components/voucher/ap_and_ar_list.tsx index b2cd6b5fd..c67021b04 100644 --- a/src/components/voucher/ap_and_ar_list.tsx +++ b/src/components/voucher/ap_and_ar_list.tsx @@ -10,7 +10,7 @@ enum ListType { PAYABLE = 'Payable', } -const APandARList = () => { +const APandARList: React.FC = () => { const { t } = useTranslation('common'); // ToDo: (20240924 - Julian) tabs 切換 diff --git a/src/components/voucher/ap_and_ar_page_body.tsx b/src/components/voucher/ap_and_ar_page_body.tsx index 6bdc2391f..7013c558a 100644 --- a/src/components/voucher/ap_and_ar_page_body.tsx +++ b/src/components/voucher/ap_and_ar_page_body.tsx @@ -2,7 +2,7 @@ import React, { useState } from 'react'; import APandARList from '@/components/voucher/ap_and_ar_list'; import Tabs from '@/components/tabs/tabs'; -const APandARPageBody = () => { +const APandARPageBody: React.FC = () => { const [activeTab, setActiveTab] = useState(0); return ( diff --git a/src/components/voucher/new_voucher_form.tsx b/src/components/voucher/new_voucher_form.tsx index db4f3e55d..7979e0f5c 100644 --- a/src/components/voucher/new_voucher_form.tsx +++ b/src/components/voucher/new_voucher_form.tsx @@ -37,7 +37,7 @@ enum RecurringUnit { WEEK = 'week', } -const NewVoucherForm = () => { +const NewVoucherForm: React.FC = () => { const { t } = useTranslation('common'); const router = useRouter(); diff --git a/src/components/voucher/sorting_button.tsx b/src/components/voucher/sorting_button.tsx index 1993c38ca..35333f400 100644 --- a/src/components/voucher/sorting_button.tsx +++ b/src/components/voucher/sorting_button.tsx @@ -1,17 +1,16 @@ // Info: (20240924 - tzuhan) To Julian, this component is seperated from your VourchList // Info: (20240920 - Julian) 排序按鈕 +import React from 'react'; import { SortOrder } from '@/constants/sort'; import { BsFillTriangleFill } from 'react-icons/bs'; -const SortingButton = ({ - string, - sortOrder, - setSortOrder, -}: { +interface ISortingButtonProps { string: string; sortOrder: null | SortOrder; setSortOrder: (sortOrder: null | SortOrder) => void; -}) => { +} + +const SortingButton: React.FC = ({ string, sortOrder, setSortOrder }) => { // Info: (20240920 - Julian) 初始無排序 -> 點擊後變成 ASC -> 再點擊變成 DESC -> 再點擊變回無排序 const clickHandler = () => { switch (sortOrder) { diff --git a/src/components/voucher/voucher_item.tsx b/src/components/voucher/voucher_item.tsx index 45c5eed54..4144de827 100644 --- a/src/components/voucher/voucher_item.tsx +++ b/src/components/voucher/voucher_item.tsx @@ -13,7 +13,7 @@ interface IVoucherItemProps { isCheckBoxOpen: boolean; } -const VoucherItem = ({ voucher, isCheckBoxOpen }: IVoucherItemProps) => { +const VoucherItem: React.FC = ({ voucher, isCheckBoxOpen }) => { const { date, voucherNo, diff --git a/src/components/voucher/voucher_line_item.tsx b/src/components/voucher/voucher_line_item.tsx index 916da100d..b49126225 100644 --- a/src/components/voucher/voucher_line_item.tsx +++ b/src/components/voucher/voucher_line_item.tsx @@ -8,18 +8,7 @@ import { useAccountingCtx } from '@/contexts/accounting_context'; import { IAccount } from '@/interfaces/accounting_account'; import { numberWithCommas } from '@/lib/utils/common'; -const VoucherLineItem = ({ - flagOfClear, - flagOfSubmit, - accountIsNull, - amountNotEqual, - amountIsZero, - deleteHandler, - accountTitleHandler, - particularsChangeHandler, - debitChangeHandler, - creditChangeHandler, -}: { +interface IVoucherLineItemProps { flagOfClear: boolean; flagOfSubmit: boolean; accountIsNull: boolean; @@ -30,6 +19,19 @@ const VoucherLineItem = ({ particularsChangeHandler: (particulars: string) => void; debitChangeHandler: (debit: number) => void; creditChangeHandler: (credit: number) => void; +} + +const VoucherLineItem: React.FC = ({ + flagOfClear, + flagOfSubmit, + accountIsNull, + amountNotEqual, + amountIsZero, + deleteHandler, + accountTitleHandler, + particularsChangeHandler, + debitChangeHandler, + creditChangeHandler, }) => { const { t } = useTranslation('common'); const { accountList } = useAccountingCtx(); diff --git a/src/components/voucher/voucher_list.tsx b/src/components/voucher/voucher_list.tsx index 29ab6052b..63d656954 100644 --- a/src/components/voucher/voucher_list.tsx +++ b/src/components/voucher/voucher_list.tsx @@ -11,7 +11,7 @@ import { SortOrder } from '@/constants/sort'; import { useGlobalCtx } from '@/contexts/global_context'; import { IVoucherBeta, dummyVoucherList } from '@/interfaces/voucher'; -const VoucherList = () => { +const VoucherList: React.FC = () => { const { t } = useTranslation('common'); const { exportVoucherModalVisibilityHandler } = useGlobalCtx(); diff --git a/src/components/voucher/voucher_list_page_body.tsx b/src/components/voucher/voucher_list_page_body.tsx index 25ed3135b..78d24edf8 100644 --- a/src/components/voucher/voucher_list_page_body.tsx +++ b/src/components/voucher/voucher_list_page_body.tsx @@ -5,7 +5,7 @@ import { Button } from '@/components/button/button'; import VoucherList from '@/components/voucher/voucher_list'; import Tabs from '@/components/tabs/tabs'; -const VoucherListPageBody = () => { +const VoucherListPageBody: React.FC = () => { const { t } = useTranslation('common'); const [activeTab, setActiveTab] = useState(0); diff --git a/src/pages/users/accounting/add_new_voucher.tsx b/src/pages/users/accounting/add_new_voucher.tsx index 6a6838410..36dcb6a8e 100644 --- a/src/pages/users/accounting/add_new_voucher.tsx +++ b/src/pages/users/accounting/add_new_voucher.tsx @@ -5,7 +5,7 @@ import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import { ILocale } from '@/interfaces/locale'; import NewVoucherForm from '@/components/voucher/new_voucher_form'; -const AddNewVoucherPage = () => { +const AddNewVoucherPage: React.FC = () => { const { t } = useTranslation('common'); const [isSidebarOpen, setIsSidebarOpen] = useState(true); diff --git a/src/pages/users/accounting/payable_receivable_list.tsx b/src/pages/users/accounting/payable_receivable_list.tsx index db3582bbf..e50b9c70d 100644 --- a/src/pages/users/accounting/payable_receivable_list.tsx +++ b/src/pages/users/accounting/payable_receivable_list.tsx @@ -1,10 +1,11 @@ +import React from 'react'; import Head from 'next/head'; import { useTranslation } from 'next-i18next'; import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import { ILocale } from '@/interfaces/locale'; import APandARPageBody from '@/components/voucher/ap_and_ar_page_body'; -const APandARListPage = () => { +const APandARListPage: React.FC = () => { const { t } = useTranslation('common'); return ( diff --git a/src/pages/users/accounting/voucher_list.tsx b/src/pages/users/accounting/voucher_list.tsx index 246afa63b..4a088b21d 100644 --- a/src/pages/users/accounting/voucher_list.tsx +++ b/src/pages/users/accounting/voucher_list.tsx @@ -5,7 +5,7 @@ import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import { ILocale } from '@/interfaces/locale'; import VoucherListPageBody from '@/components/voucher/voucher_list_page_body'; -const VoucherListPage = () => { +const VoucherListPage: React.FC = () => { const { t } = useTranslation('common'); const [isSidebarOpen, setIsSidebarOpen] = useState(true); From ed779390e8ca42a034095e5298d4f923f2d63150 Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 8 Oct 2024 16:22:06 +0800 Subject: [PATCH 08/29] Feat: fix style --- package.json | 2 +- src/components/voucher/new_voucher_form.tsx | 2 +- src/components/voucher/voucher_line_item.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index af633640f..47ed8048f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+36", + "version": "0.8.2+37", "private": false, "scripts": { "dev": "next dev", diff --git a/src/components/voucher/new_voucher_form.tsx b/src/components/voucher/new_voucher_form.tsx index 7979e0f5c..e2de672af 100644 --- a/src/components/voucher/new_voucher_form.tsx +++ b/src/components/voucher/new_voucher_form.tsx @@ -703,7 +703,7 @@ const NewVoucherForm: React.FC = () => {
{displayedCounterparty}
diff --git a/src/components/voucher/voucher_line_item.tsx b/src/components/voucher/voucher_line_item.tsx index b49126225..4130156f8 100644 --- a/src/components/voucher/voucher_line_item.tsx +++ b/src/components/voucher/voucher_line_item.tsx @@ -262,7 +262,7 @@ const VoucherLineItem: React.FC = ({
{isEditAccounting}
From 3fed48ab49475232281544c6389fdbd6690fea39 Mon Sep 17 00:00:00 2001 From: Liz Date: Tue, 8 Oct 2024 16:29:52 +0800 Subject: [PATCH 09/29] refactor redirect logics in user context --- package.json | 2 +- src/contexts/user_context.tsx | 102 +++++++++++++++++++++++++++------- 2 files changed, 82 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index c4a624902..c08ce1cb9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+34", + "version": "0.8.2+35", "private": false, "scripts": { "dev": "next dev", diff --git a/src/contexts/user_context.tsx b/src/contexts/user_context.tsx index 585de84ad..6c5ec2d76 100644 --- a/src/contexts/user_context.tsx +++ b/src/contexts/user_context.tsx @@ -128,6 +128,10 @@ export const UserProvider = ({ children }: { children: React.ReactNode }) => { // Info: (20240530 - Shirley) 在瀏覽器被重新整理後,如果沒有登入,就 redirect to login page const redirectToLoginPage = () => { if (router.pathname.startsWith('/users') && !router.pathname.includes(ISUNFA_ROUTE.LOGIN)) { + // Info: (20241008 - Liz) 將當前路徑存入 localStorage,以便登入後重新導向 + const currentPath = router.asPath; + localStorage.setItem('redirectPath', currentPath); + router.push(ISUNFA_ROUTE.LOGIN); } // Deprecated: (20241001 - Liz) @@ -142,10 +146,33 @@ export const UserProvider = ({ children }: { children: React.ReactNode }) => { // } // }; + // ToDo: (20241008 - Liz) Beta 要重新導向到選擇角色的頁面。但目前先導向到選擇公司的頁面。 const goToSelectRolePage = () => { + // Deprecated: (20241008 - Liz) + // eslint-disable-next-line no-console + console.log('呼叫 goToSelectRolePage'); + router.push(ISUNFA_ROUTE.SELECT_COMPANY); }; + // ToDo: (20241008 - Liz) 如果沒有選擇公司,重新導向到可以選擇公司的儀表板 + // const goToDashboard = () => { + // router.push(ISUNFA_ROUTE.DASHBOARD); + // }; + + const goBackToOriginalPath = () => { + const redirectPath = localStorage.getItem('redirectPath'); + localStorage.removeItem('redirectPath'); // Info: (20241008 - Liz) 移除 localStorage 中的 redirectPath + + // Deprecated: (20241008 - Liz) + // eslint-disable-next-line no-console + console.log('呼叫 goBackToOriginalPath, redirectPath:', redirectPath); + + if (redirectPath) { + router.push(redirectPath || '/'); + } + }; + const checkIsRegistered = async (): Promise<{ isRegistered: boolean; credentials: PublicKeyCredential | null; @@ -245,28 +272,38 @@ export const UserProvider = ({ children }: { children: React.ReactNode }) => { setIsAgreePrivacyPolicy(hasAgreedToPrivacy); }; - /* // Deprecated: (20241004 - Liz) 之後統一刪除 + // Deprecated: (20241004 - Liz) 之後統一刪除 // Info: (20241001 - Liz) 此函數處理公司資訊: // 如果公司資料存在且不為空,它會設定選定的公司 (setSelectedCompany),並標記成功選擇公司。 // 若公司資料不存在,會將公司資訊設為空,並檢查路由是否位於 users 路徑中。如果符合條件且不在 SELECT_COMPANY 頁面,它會呼叫 redirectToSelectCompanyPage 函數進行重新導向。 - // const processCompanyInfo = (company: ICompany) => { - // if (company && Object.keys(company).length > 0) { - // setSelectedCompany(company); - // setSuccessSelectCompany(true); - // handleReturnUrl(); - // } else { - // setSuccessSelectCompany(undefined); - // setSelectedCompany(null); - - // const isInUsersRoute = - // router.pathname.includes('users') && !router.pathname.includes(ISUNFA_ROUTE.SELECT_COMPANY); - - // if (isInUsersRoute) { - // redirectToSelectCompanyPage(); - // } - // } - // }; - */ + const processCompanyInfo = (company: ICompany) => { + if (company && Object.keys(company).length > 0) { + // Deprecated: (20241008 - Liz) + // eslint-disable-next-line no-console + console.log('執行 processCompanyInfo 並且 company 存在:', company); + + setSelectedCompany(company); + setSuccessSelectCompany(true); + + return true; + } else { + // Deprecated: (20241008 - Liz) + // eslint-disable-next-line no-console + console.log('執行 processCompanyInfo 並且 company 不存在:', company); + + setSuccessSelectCompany(undefined); + setSelectedCompany(null); + + return false; + + // const isInUsersRoute = + // router.pathname.includes('users') && !router.pathname.includes(ISUNFA_ROUTE.SELECT_COMPANY); + + // if (isInUsersRoute) { + // goToSelectRolePage(); + // } + } + }; // ToDo: (20241004 - Liz) 之後會新增一個函數來處理「使用者的角色資訊」 @@ -291,7 +328,30 @@ export const UserProvider = ({ children }: { children: React.ReactNode }) => { // eslint-disable-next-line no-console console.log('呼叫 processUserInfo 並且 user 存在:', user); - goToSelectRolePage(); + return true; + } else { + // clearStates(); + // redirectToLoginPage(); + return false; + } + }; + + const handleUserAndCompanyProcessing = (user: IUser, company: ICompany) => { + const isProcessedInfo = processUserInfo(user); + const isProcessedCompany = processCompanyInfo(company); + // ToDo: (20241008 - Liz) 之後會新增一個函數來處理「使用者的角色資訊」 + // const isProcessedRole = processRoleInfo(role); + + // Deprecated: (20241008 - Liz) + // eslint-disable-next-line no-console + console.log('isProcessedInfo: ', isProcessedInfo, 'isProcessedCompany: ', isProcessedCompany); + + // ToDo: (20241008 - Liz) 之後會增加一個判斷是否有選擇角色的邏輯 + if (isProcessedInfo && isProcessedCompany) { + goBackToOriginalPath(); + } else if (isProcessedInfo && !isProcessedCompany) { + // goToDashboard(); // ToDo: (20241008 - Liz) 之後沒有選擇公司會導向到可以選擇公司的儀表板 + goToSelectRolePage(); // Info: (20241008 - Liz) 暫時用 Alpha 版的選擇公司頁面 } else { clearStates(); redirectToLoginPage(); @@ -320,7 +380,7 @@ export const UserProvider = ({ children }: { children: React.ReactNode }) => { console.log('getStatusInfo:', StatusInfo, 'getStatusInfoSuccess:', getStatusInfoSuccess); if (getStatusInfoSuccess && StatusInfo) { - processUserInfo(StatusInfo.user); + handleUserAndCompanyProcessing(StatusInfo.user, StatusInfo.company); } else { clearStates(); redirectToLoginPage(); From 81b9a7a306c306c94c886673a7b3c8613a3ffe7e Mon Sep 17 00:00:00 2001 From: Tiny_Murky Date: Tue, 8 Oct 2024 17:34:55 +0800 Subject: [PATCH 10/29] change stuff --- package.json | 2 +- src/constants/financial_report.ts | 2 +- src/interfaces/accounting_account.ts | 2 +- .../report/financial_report_generator.ts | 2 +- .../[companyId]/report/[reportId]/index.ts | 2 +- .../v2/company/[companyId]/report/index.ts | 72 +++++++++---------- 6 files changed, 40 insertions(+), 42 deletions(-) diff --git a/package.json b/package.json index c4a624902..c08ce1cb9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+34", + "version": "0.8.2+35", "private": false, "scripts": { "dev": "next dev", diff --git a/src/constants/financial_report.ts b/src/constants/financial_report.ts index a4ffaddda..0bef77dbe 100644 --- a/src/constants/financial_report.ts +++ b/src/constants/financial_report.ts @@ -21,5 +21,5 @@ export const EMPTY_I_ACCOUNT_READY_FRONTEND: IAccountReadyForFrontend = { prePeriodPercentage: 0, prePeriodPercentageString: '0', indent: 0, - children: {}, + children: [], }; diff --git a/src/interfaces/accounting_account.ts b/src/interfaces/accounting_account.ts index befe96ed3..fb43dfdbf 100644 --- a/src/interfaces/accounting_account.ts +++ b/src/interfaces/accounting_account.ts @@ -53,7 +53,7 @@ export interface IAccountReadyForFrontend { prePeriodPercentage: number; prePeriodPercentageString: string; indent: number; - children: { [code: string]: IAccountReadyForFrontend }; + children: IAccountReadyForFrontend[]; } export type IAccountQueryArgs = { diff --git a/src/lib/utils/report/financial_report_generator.ts b/src/lib/utils/report/financial_report_generator.ts index 6a814b1f0..82fca8d53 100644 --- a/src/lib/utils/report/financial_report_generator.ts +++ b/src/lib/utils/report/financial_report_generator.ts @@ -185,7 +185,7 @@ export default abstract class FinancialReportGenerator extends ReportGenerator { prePeriodAmountString, prePeriodPercentageString, indent: curPeriodAccount.indent, - children: {}, + children: [], }; curPeriodAccountReadyForFrontendArray.push(accountReadyForFrontend); }); diff --git a/src/pages/api/v1/company/[companyId]/report/[reportId]/index.ts b/src/pages/api/v1/company/[companyId]/report/[reportId]/index.ts index 101449a84..5842fa53d 100644 --- a/src/pages/api/v1/company/[companyId]/report/[reportId]/index.ts +++ b/src/pages/api/v1/company/[companyId]/report/[reportId]/index.ts @@ -108,7 +108,7 @@ function transformDetailsIntoGeneral( prePeriodPercentage: 0, prePeriodPercentageString: '0', indent: account.indent, - children: {}, + children: [], }; }); return general; diff --git a/src/pages/api/v2/company/[companyId]/report/index.ts b/src/pages/api/v2/company/[companyId]/report/index.ts index a65e4ac8b..0dd19f7b6 100644 --- a/src/pages/api/v2/company/[companyId]/report/index.ts +++ b/src/pages/api/v2/company/[companyId]/report/index.ts @@ -12,9 +12,7 @@ import { loggerError } from '@/lib/utils/logger_back'; import { FinancialReportTypesKey } from '@/interfaces/report_type'; import { IAccountReadyForFrontend } from '@/interfaces/accounting_account'; -type ReportObject = { - [code: string]: IAccountReadyForFrontend; -}; +type ReportObject = IAccountReadyForFrontend[]; type ReportReturnType = { general: ReportObject; @@ -40,8 +38,8 @@ export async function balanceSheetHandler({ // ToDo: (20241007 - Murky) negative number need to be in brackets // ToDo: (20241007 - Murky) Maybe IAccountReadyForFrontEnd need to have "string" version of percentage - const general: ReportObject = { - '11XX': { + const general: ReportObject = [ + { code: '11XX', name: '流動資產合計', curPeriodAmount: 2194032910, @@ -53,12 +51,12 @@ export async function balanceSheetHandler({ prePeriodPercentage: 41, prePeriodPercentageString: '41', indent: 3, - children: {}, + children: [], }, - }; + ]; - const detail: ReportObject = { - 1100: { + const detail: ReportObject = [ + { code: '1100', name: '現金及約當現金', curPeriodAmount: 20000, @@ -70,8 +68,8 @@ export async function balanceSheetHandler({ prePeriodPercentage: 5, prePeriodPercentageString: '5', indent: 3, - children: { - 1101: { + children: [ + { code: '1101', name: '庫存現金', curPeriodAmount: 10000, @@ -83,9 +81,9 @@ export async function balanceSheetHandler({ prePeriodPercentage: 2.5, prePeriodPercentageString: '2.5', indent: 4, - children: {}, + children: [], }, - 1102: { + { code: '1102', name: '零用金∕週轉金', curPeriodAmount: 10000, @@ -97,11 +95,11 @@ export async function balanceSheetHandler({ prePeriodPercentage: 2.5, prePeriodPercentageString: '2.5', indent: 4, - children: {}, + children: [], }, - }, + ], }, - }; + ]; const payload: ReportReturnType = { general, @@ -131,8 +129,8 @@ export async function incomeStatementHandler({ // ToDo: (20241007 - Murky) negative number need to be in brackets // ToDo: (20241007 - Murky) Maybe IAccountReadyForFrontEnd need to have "string" version of percentage - const general: ReportObject = { - 5950: { + const general: ReportObject = [ + { code: '5950', name: '營業毛利(毛損)淨額流動', curPeriodAmount: 2194032910, @@ -144,12 +142,12 @@ export async function incomeStatementHandler({ prePeriodPercentage: 41, prePeriodPercentageString: '41', indent: 3, - children: {}, + children: [], }, - }; + ]; - const detail: ReportObject = { - 4110: { + const detail: ReportObject = [ + { code: '4110', name: '銷貨收入', curPeriodAmount: 20000, @@ -161,8 +159,8 @@ export async function incomeStatementHandler({ prePeriodPercentage: 5, prePeriodPercentageString: '5', indent: 3, - children: { - 4111: { + children: [ + { code: '4111', name: '銷貨收入', curPeriodAmount: 10000, @@ -174,9 +172,9 @@ export async function incomeStatementHandler({ prePeriodPercentage: 2.5, prePeriodPercentageString: '2.5', indent: 4, - children: {}, + children: [], }, - 4112: { + { code: '4112', name: '天然氣銷貨收入(天然氣業)', curPeriodAmount: 10000, @@ -188,11 +186,11 @@ export async function incomeStatementHandler({ prePeriodPercentage: 2.5, prePeriodPercentageString: '2.5', indent: 4, - children: {}, + children: [], }, - }, + ], }, - }; + ]; const payload: ReportReturnType = { general, @@ -222,8 +220,8 @@ export async function cashFlowHandler({ // ToDo: (20241007 - Murky) negative number need to be in brackets // ToDo: (20241007 - Murky) Maybe IAccountReadyForFrontEnd need to have "string" version of percentage - const general: ReportObject = { - A20010: { + const general: ReportObject = [ + { code: 'A200105950', name: '收益費損項目合計', curPeriodAmount: 2194032910, @@ -235,12 +233,12 @@ export async function cashFlowHandler({ prePeriodPercentage: 41, prePeriodPercentageString: '41', indent: 3, - children: {}, + children: [], }, - }; + ]; - const detail: ReportObject = { - 4110: { + const detail: ReportObject = [ + { code: '4110', name: '銷貨收入', curPeriodAmount: 20000, @@ -252,9 +250,9 @@ export async function cashFlowHandler({ prePeriodPercentage: 5, prePeriodPercentageString: '5', indent: 3, - children: {}, + children: [], }, - }; + ]; const payload: ReportReturnType = { general, From 6eee2adb12e4957b003ed4267bf9ec116626ed04 Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 8 Oct 2024 17:37:39 +0800 Subject: [PATCH 11/29] Feat: voucher detail interface for fontend --- package.json | 2 +- src/constants/api_connection.ts | 5 + src/interfaces/api_connection.ts | 3 +- src/pages/voucher_detail.tsx | 331 +++++++++++++++++++++++++++++-- 4 files changed, 319 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 47ed8048f..038ad00ab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+37", + "version": "0.8.2+38", "private": false, "scripts": { "dev": "next dev", diff --git a/src/constants/api_connection.ts b/src/constants/api_connection.ts index 7c1e323e1..9fc3e476b 100644 --- a/src/constants/api_connection.ts +++ b/src/constants/api_connection.ts @@ -522,4 +522,9 @@ export const APIConfig: Record = { method: HttpMethod.GET, path: APIPath.CERTIFICATE_LIST, }), + [APIName.VOUCHER_GET_BY_ID_V2]: createConfig({ + name: APIName.VOUCHER_GET_BY_ID_V2, + method: HttpMethod.GET, + path: APIPath.VOUCHER_GET_BY_ID_V2, + }), }; diff --git a/src/interfaces/api_connection.ts b/src/interfaces/api_connection.ts index ae36fdae9..d999fd94e 100644 --- a/src/interfaces/api_connection.ts +++ b/src/interfaces/api_connection.ts @@ -64,7 +64,8 @@ export type IAPIName = | 'GET_PROJECT_BY_ID' | 'UPDATE_PROJECT_BY_ID' | 'PUBLIC_KEY_GET' - | 'CERTIFICATE_LIST'; + | 'CERTIFICATE_LIST' + | 'VOUCHER_GET_BY_ID_V2'; export type IHttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD'; diff --git a/src/pages/voucher_detail.tsx b/src/pages/voucher_detail.tsx index ed286fc63..678f7783d 100644 --- a/src/pages/voucher_detail.tsx +++ b/src/pages/voucher_detail.tsx @@ -1,16 +1,154 @@ import React from 'react'; +import Head from 'next/head'; import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; +import { FiTrash2, FiEdit, FiBookOpen } from 'react-icons/fi'; +import { MdOutlineFileDownload } from 'react-icons/md'; import { ILocale } from '@/interfaces/locale'; -import Head from 'next/head'; import SideMenu from '@/components/upload_certificate/side_menu'; import Header from '@/components/upload_certificate/header'; import { generateRandomCertificates, ICertificateUI, OPERATIONS } from '@/interfaces/certificate'; import CertificateSelection from '@/components/certificate/certificate_selection'; import { Button } from '@/components/button/button'; -import Image from 'next/image'; +import { timestampToString, numberWithCommas } from '@/lib/utils/common'; +import { ILineItem } from '@/interfaces/line_item'; +import { IDatePeriod } from '@/interfaces/date_period'; +import { useModalContext } from '@/contexts/modal_context'; +import { MessageType } from '@/interfaces/message_modal'; +import { APIName } from '@/constants/api_connection'; +import APIHandler from '@/lib/utils/api_handler'; +import Skeleton from '@/components/skeleton/skeleton'; + +interface IVoucherDetailForFrontend { + id: number; + voucherDate: number; + type: string; + note: string; + counterParty: { + id: number; + companyId: number; + name: string; + }; + recurringInfo: { + type: string; + startDate: number; + endDate: number; + daysOfWeek: number[]; + dayOfMonth: number[]; + daysOfYear: { + month: number; + day: number; + }[]; + }; +} -const AddVoucherPage: React.FC = () => { - const selectedCertificates: ICertificateUI[] = generateRandomCertificates(0).map( +const defaultVoucherDetail: IVoucherDetailForFrontend = { + id: 0, + voucherDate: 0, + type: '', + note: '', + counterParty: { + id: 0, + companyId: 0, + name: '', + }, + recurringInfo: { + type: '', + startDate: 0, + endDate: 0, + daysOfWeek: [], + dayOfMonth: [], + daysOfYear: [], + }, +}; + +const VoucherDetailPage: React.FC = () => { + const recurringStr: string = 'Every month'; + const recurringPeriod: IDatePeriod = { + startTimeStamp: 1643567783, + endTimeStamp: 1801578367, + }; + const payableAmount: number = 1300; + const paidAmount: number = 1000; + const remainAmount: number = 300; + const reverseVouchers: string[] = ['20241008-002', '20241008-003']; + // ToDo: (20241008 - Julian) Asset + // const assetIds = ['A00000001', 'A00000002', 'A00000003']; + const voucherLineItems: ILineItem[] = [ + { + lineItemIndex: '0', + accountId: 320, + account: 'Cash', + description: 'Buy a printer', + debit: true, + amount: 1000, + }, + { + lineItemIndex: '1', + accountId: 503, + account: 'Accounts Payable', + description: '', + debit: false, + amount: 1300, + }, + { + lineItemIndex: '3', + accountId: 673, + account: 'Miscellaneous Expense', + description: '', + debit: true, + amount: 300, + }, + ]; + + const { data: voucherData, isLoading } = APIHandler( + APIName.VOUCHER_GET_BY_ID_V2, + { + params: { + companyId: '111', + voucherId: '123', + }, + }, + true + ); + + const { + id: voucherId, + voucherDate, + type, + note, + counterParty, + } = voucherData || defaultVoucherDetail; + const { messageModalVisibilityHandler, messageModalDataHandler } = useModalContext(); + + const pageTitle = `Voucher ${voucherId}`; + const totalDebit = voucherLineItems.reduce((acc, cur) => (cur.debit ? acc + cur.amount : acc), 0); + const totalCredit = voucherLineItems.reduce( + (acc, cur) => (!cur.debit ? acc + cur.amount : acc), + 0 + ); + + const recurringPeriodStr = `From ${timestampToString(recurringPeriod.startTimeStamp).date} to ${timestampToString(recurringPeriod.endTimeStamp).date}`; + + // ToDo: (20241008 - Julian) Call API to delete voucher + const deleteVoucher = async () => { + // eslint-disable-next-line no-console + console.log('Voucher deleted'); + }; + + const deleteClickHandler = () => { + messageModalDataHandler({ + messageType: MessageType.WARNING, + title: 'Do you really want to delete this Voucher?', + content: 'All the assets that are connected to this voucher will be deleted too.', + submitBtnStr: 'Yes, delete the voucher.', + submitBtnFunction: deleteVoucher, + backBtnStr: 'Cancel', + backBtnFunction: messageModalVisibilityHandler, + }); + messageModalVisibilityHandler(); + }; + + const selectedCertificates: ICertificateUI[] = generateRandomCertificates(3).map( (certificate) => { const actions = [OPERATIONS.DOWNLOAD, OPERATIONS.REMOVE]; return { @@ -21,40 +159,107 @@ const AddVoucherPage: React.FC = () => { } ); + const reverseVoucherList = reverseVouchers.map((reverseVoucher) => ( +

+ {reverseVoucher} +

+ )); + + // ToDo: (20241008 - Julian) Display asset + // const displayAssetIds = assetIds.map((assetId) => ( + //

+ // {assetId} + //

+ // )); + + const voucherLineBlock = voucherLineItems.map((lineItem) => ( + <> +
+

+ {lineItem.accountId} - {lineItem.account} +

+
+ +
+
+
+ {lineItem.description} +
+
+ {lineItem.debit ? ( + numberWithCommas(lineItem.amount) + ) : ( +

0

+ )} +
+
+ {lineItem.debit ? ( +

0

+ ) : ( + numberWithCommas(lineItem.amount) + )} +
+ + )); + + const isDisplayDate = !isLoading ? ( +

{timestampToString(voucherDate).date}

+ ) : ( + + ); + + const isDisplayType = !isLoading ? ( +

{type}

+ ) : ( + + ); + + const isDisplayNote = !isLoading ? ( +

{note}

+ ) : ( + + ); + + const isDisplayCounterParty = !isLoading ? ( +

{counterParty.name}

+ ) : ( + + ); + return ( <> - Upload Certificate - iSunFA + {pageTitle} - iSunFA
{/* Info: (20240919 - tzuhan) Side Menu */} {/* Info: (20240919 - tzuhan) Main Content Area */} -
+
{/* Info: (20240919 - tzuhan) Header */}
{/* Info: (20240919 - tzuhan) Main Content */} -
+
- - -
{/* Info: (20240926 - tzuhan) CertificateSelection */} @@ -63,6 +268,92 @@ const AddVoucherPage: React.FC = () => { isSelectable={false} isDeletable /> + + {/* Info: (20241008 - Julian) Voucher Detail */} +
+ {/* Info: (20241007 - Julian) Voucher date */} +
+

Voucher Date

+ {isDisplayDate} +
+ {/* Info: (20241007 - Julian) Voucher type */} +
+

Voucher Type

+ {isDisplayType} +
+ {/* Info: (20241007 - Julian) Note */} +
+

Note

+ {isDisplayNote} +
+ {/* Info: (20241007 - Julian) Counterparty */} +
+

Counterparty

+ {isDisplayCounterParty} +
+ {/* Info: (20241007 - Julian) Recurring Entry */} +
+

Recurring Entry

+
+

{recurringStr}

+

{recurringPeriodStr}

+
+
+ {/* Info: (20241007 - Julian) Payable Amount */} +
+

Payable Amount

+

+ {numberWithCommas(payableAmount)} + TWD +

+
+ {/* Info: (20241007 - Julian) Paid Amount */} +
+

Paid Amount

+

+ {numberWithCommas(paidAmount)} + TWD +

+
+ {/* Info: (20241007 - Julian) Remain Amount */} +
+

Remain Amount

+

+ {numberWithCommas(remainAmount)} + TWD +

+
+ {/* Info: (20241007 - Julian) Reverse Vouchers */} +
+

Reverse Vouchers

+
{reverseVoucherList}
+
+ {/* Info: (20241007 - Julian) Asset */} + {/*
+

Asset

+
{displayAssetIds}
+
*/} +
+ + {/* Info: (20241008 - Julian) Voucher Line Block */} +
+ {/* Info: (20241008 - Julian) Voucher Line Header */} +
+

Accounting

+

Particulars

+

Debit

+

Credit

+
+ {/* Info: (20241008 - Julian) Voucher Line Items */} +
+ {voucherLineBlock} +
+ {/* Info: (20241008 - Julian) Voucher Line Total */} +
+
{numberWithCommas(totalDebit)}
+
{numberWithCommas(totalCredit)}
+
+
@@ -87,4 +378,4 @@ const getStaticPropsFunction = async ({ locale }: ILocale) => ({ export const getStaticProps = getStaticPropsFunction; -export default AddVoucherPage; +export default VoucherDetailPage; From b5115fe9c4a155f80a45199fa58e021b7a012229 Mon Sep 17 00:00:00 2001 From: Liz Date: Tue, 8 Oct 2024 18:23:26 +0800 Subject: [PATCH 12/29] update redirect logics in user context --- package.json | 2 +- src/contexts/user_context.tsx | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index c08ce1cb9..af633640f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+35", + "version": "0.8.2+36", "private": false, "scripts": { "dev": "next dev", diff --git a/src/contexts/user_context.tsx b/src/contexts/user_context.tsx index 6c5ec2d76..d57ddba21 100644 --- a/src/contexts/user_context.tsx +++ b/src/contexts/user_context.tsx @@ -128,15 +128,15 @@ export const UserProvider = ({ children }: { children: React.ReactNode }) => { // Info: (20240530 - Shirley) 在瀏覽器被重新整理後,如果沒有登入,就 redirect to login page const redirectToLoginPage = () => { if (router.pathname.startsWith('/users') && !router.pathname.includes(ISUNFA_ROUTE.LOGIN)) { - // Info: (20241008 - Liz) 將當前路徑存入 localStorage,以便登入後重新導向 - const currentPath = router.asPath; - localStorage.setItem('redirectPath', currentPath); + // Deprecated: (20241008 - Liz) + // eslint-disable-next-line no-console + console.log('呼叫 redirectToLoginPage 並且重新導向到登入頁面'); router.push(ISUNFA_ROUTE.LOGIN); } // Deprecated: (20241001 - Liz) // eslint-disable-next-line no-console - console.log('呼叫 redirectToLoginPage'); + console.log('呼叫 redirectToLoginPage (但不一定真的重新導向喔)'); }; // Info: (20241001 - Liz) Alpha:重新導向到選擇公司的頁面 ; Beta:重新導向到選擇角色的頁面 @@ -369,6 +369,14 @@ export const UserProvider = ({ children }: { children: React.ReactNode }) => { setIsAuthLoading(true); + // Info: (20241008 - Liz) 將當前路徑存入 localStorage,以便登入後可以重新導向回原本的路徑 + const currentPath = router.asPath; + localStorage.setItem('redirectPath', currentPath); + + // Deprecated: (20241008 - Liz) + // eslint-disable-next-line no-console + console.log('儲存現在路由 currentPath:', currentPath); + const { data: StatusInfo, success: getStatusInfoSuccess, From 74e5811c3b2bfd55c8edf044b7f4de04a0c16e92 Mon Sep 17 00:00:00 2001 From: Liz Date: Tue, 8 Oct 2024 19:02:17 +0800 Subject: [PATCH 13/29] PreviewModal UI --- package.json | 2 +- public/images/fake_preview_cover.png | Bin 0 -> 346167 bytes .../beta/select_role/preview_modal.tsx | 46 ++++++++++++++++++ src/pages/beta/select_role.tsx | 14 +++++- 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 public/images/fake_preview_cover.png create mode 100644 src/components/beta/select_role/preview_modal.tsx diff --git a/package.json b/package.json index af633640f..47ed8048f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+36", + "version": "0.8.2+37", "private": false, "scripts": { "dev": "next dev", diff --git a/public/images/fake_preview_cover.png b/public/images/fake_preview_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..52daccae5d7509a9674eb18de8a1531790080250 GIT binary patch literal 346167 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℞6b{g>FRy) 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

    9vw~kFS)x4iC4&hl~-e(Mc(0bx^>;T}CdQ-HXp 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 void; +} + +const PreviewModal = ({ togglePreviewModal }: PreviewModalProps) => { + return ( +
    +
    +
    +

    + Role Function Preview +

    + +
    + + {/* // Info: (20241008 - Liz) 預覽影片 */} +
    + fake_preview_cover +
    + + {/* // Info: (20241008 - Liz) 切換影片控制鈕 */} +
    + + + + + +
    +
    +
    + ); +}; + +export default PreviewModal; diff --git a/src/pages/beta/select_role.tsx b/src/pages/beta/select_role.tsx index 6b7d5bc12..2855a9db5 100644 --- a/src/pages/beta/select_role.tsx +++ b/src/pages/beta/select_role.tsx @@ -5,10 +5,20 @@ import { ILocale } from '@/interfaces/locale'; import { useTranslation } from 'next-i18next'; import Introduction from '@/components/beta/select_role/introduction'; import RoleCard from '@/components/beta/select_role/role_card'; +import PreviewModal from '@/components/beta/select_role/preview_modal'; const SelectRolePage = () => { const { t } = useTranslation(['common', 'kyc']); const [role, setRole] = useState(''); + const [isPreviewModalVisible, setIsPreviewModalVisible] = useState(true); + + // Deprecated: (20241008 - Liz) + // eslint-disable-next-line no-console + console.log('isPreviewModalVisible', isPreviewModalVisible); + + const togglePreviewModal = () => { + setIsPreviewModalVisible((prev) => !prev); + }; return ( <> @@ -31,12 +41,14 @@ const SelectRolePage = () => { /> -
    +
    + + {isPreviewModalVisible && }
    ); From 88fda1cbde4abada611ec6a37dfa123ecdbfee67 Mon Sep 17 00:00:00 2001 From: Tiny_Murky Date: Wed, 9 Oct 2024 11:58:15 +0800 Subject: [PATCH 14/29] Cash flow begin fix --- package.json | 2 +- src/interfaces/voucher.ts | 15 +++++++++++++ src/lib/utils/repo/voucher.beta.repo.ts | 6 +++++- src/lib/utils/repo/voucher.repo.ts | 6 +++++- .../report/cash_flow_statement_generator.ts | 21 +++++++++++++------ 5 files changed, 41 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 47ed8048f..038ad00ab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+37", + "version": "0.8.2+38", "private": false, "scripts": { "dev": "next dev", diff --git a/src/interfaces/voucher.ts b/src/interfaces/voucher.ts index cc619f839..96a05facf 100644 --- a/src/interfaces/voucher.ts +++ b/src/interfaces/voucher.ts @@ -58,6 +58,21 @@ export type IVoucherFromPrismaIncludeJournalLineItems = Prisma.VoucherGetPayload }; }>; +export type IVoucherForCashFlow = Prisma.VoucherGetPayload<{ + include: { + journal: { + include: { + invoice: true; + }; + }; + lineItems: { + include: { + account: true; + }; + }; + }; +}>; + export type IVoucherFromPrismaIncludeLineItems = Prisma.VoucherGetPayload<{ include: { lineItems: { diff --git a/src/lib/utils/repo/voucher.beta.repo.ts b/src/lib/utils/repo/voucher.beta.repo.ts index 0cdf7fe44..dffe6e065 100644 --- a/src/lib/utils/repo/voucher.beta.repo.ts +++ b/src/lib/utils/repo/voucher.beta.repo.ts @@ -191,7 +191,11 @@ export async function findManyVoucherWithCashInPrisma( }; const include = { - journal: true, + journal: { + include: { + invoice: true, + }, + }, lineItems: { include: { account: true, diff --git a/src/lib/utils/repo/voucher.repo.ts b/src/lib/utils/repo/voucher.repo.ts index a41f47259..2e291938c 100644 --- a/src/lib/utils/repo/voucher.repo.ts +++ b/src/lib/utils/repo/voucher.repo.ts @@ -303,7 +303,11 @@ export async function findManyVoucherWithCashInPrisma( }, }, include: { - journal: true, + journal: { + include: { + invoice: true, + }, + }, lineItems: { include: { account: true, diff --git a/src/lib/utils/report/cash_flow_statement_generator.ts b/src/lib/utils/report/cash_flow_statement_generator.ts index 60b2dfe64..afec4c42b 100644 --- a/src/lib/utils/report/cash_flow_statement_generator.ts +++ b/src/lib/utils/report/cash_flow_statement_generator.ts @@ -9,7 +9,10 @@ import { } from '@/interfaces/accounting_account'; import { IDirectCashFlowMapping, IOperatingCashFlowMapping } from '@/interfaces/cash_flow'; import { OPERATING_CASH_FLOW_INDIRECT_MAPPING } from '@/constants/cash_flow/operating_cash_flow'; -import { IVoucherFromPrismaIncludeJournalLineItems } from '@/interfaces/voucher'; +import { + IVoucherForCashFlow, + IVoucherFromPrismaIncludeJournalLineItems, +} from '@/interfaces/voucher'; import { findManyVoucherWithCashInPrisma } from '@/lib/utils/repo/voucher.repo'; import { INVESTING_CASH_FLOW_DIRECT_MAPPING } from '@/constants/cash_flow/investing_cash_flow'; import { FINANCING_CASH_FLOW_DIRECT_MAPPING } from '@/constants/cash_flow/financing_cash_flow'; @@ -28,7 +31,7 @@ export default class CashFlowStatementGenerator extends FinancialReportGenerator private voucherRelatedToCash: IVoucherFromPrismaIncludeJournalLineItems[]; - private voucherLastPeriod: IVoucherFromPrismaIncludeJournalLineItems[]; + private voucherLastPeriod: IVoucherForCashFlow[]; private YEAR_RANGE = 5; @@ -38,7 +41,7 @@ export default class CashFlowStatementGenerator extends FinancialReportGenerator companyId: number, startDateInSecond: number, endDateInSecond: number, - voucherRelatedToCash: IVoucherFromPrismaIncludeJournalLineItems[] + voucherRelatedToCash: IVoucherForCashFlow[] ) { const reportSheetType = ReportSheetType.CASH_FLOW_STATEMENT; super(companyId, startDateInSecond, endDateInSecond, reportSheetType); @@ -54,13 +57,19 @@ export default class CashFlowStatementGenerator extends FinancialReportGenerator endDateInSecond ); this.voucherRelatedToCash = voucherRelatedToCash.filter((voucher) => { - const laterThanStartDate = voucher.journal.createdAt >= startDateInSecond; - const earlierThanEndDate = voucher.journal.createdAt <= endDateInSecond; + const laterThanStartDate = voucher.journal?.invoice?.date + ? voucher.journal.invoice.date >= startDateInSecond + : false; + const earlierThanEndDate = voucher.journal?.invoice?.date + ? voucher.journal?.invoice?.date <= endDateInSecond + : false; return laterThanStartDate && earlierThanEndDate; }); this.voucherLastPeriod = voucherRelatedToCash.filter((voucher) => { - const earlierThanStartDate = voucher.journal.createdAt < startDateInSecond; + const earlierThanStartDate = voucher.journal?.invoice?.date + ? voucher.journal?.invoice?.date < startDateInSecond + : false; return earlierThanStartDate; }); } From d9856ea41d75b5d204e09e15989a2d763c79ca38 Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 9 Oct 2024 13:57:38 +0800 Subject: [PATCH 15/29] Feat: enhance counterparty --- package.json | 2 +- public/icons/asset.svg | 7 ++ src/components/voucher/new_voucher_form.tsx | 133 +++++++++++++------- src/locales/cn/common.json | 1 + src/locales/cn/journal.json | 3 +- src/locales/en/common.json | 1 + src/locales/en/journal.json | 3 +- src/locales/tw/common.json | 1 + src/locales/tw/journal.json | 3 +- 9 files changed, 106 insertions(+), 48 deletions(-) create mode 100644 public/icons/asset.svg diff --git a/package.json b/package.json index 47ed8048f..038ad00ab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+37", + "version": "0.8.2+38", "private": false, "scripts": { "dev": "next dev", diff --git a/public/icons/asset.svg b/public/icons/asset.svg new file mode 100644 index 000000000..07d9a9375 --- /dev/null +++ b/public/icons/asset.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/components/voucher/new_voucher_form.tsx b/src/components/voucher/new_voucher_form.tsx index e2de672af..d01151e2e 100644 --- a/src/components/voucher/new_voucher_form.tsx +++ b/src/components/voucher/new_voucher_form.tsx @@ -1,23 +1,24 @@ import React, { useState, useEffect, useRef } from 'react'; +import Image from 'next/image'; import { useRouter } from 'next/router'; import { FaChevronDown, FaPlus } from 'react-icons/fa6'; import { BiSave } from 'react-icons/bi'; -import { FiSearch } from 'react-icons/fi'; +import { FiPlus, FiSearch } from 'react-icons/fi'; import { useTranslation } from 'next-i18next'; import useOuterClick from '@/lib/hooks/use_outer_click'; +import { numberWithCommas } from '@/lib/utils/common'; import VoucherLineItem from '@/components/voucher/voucher_line_item'; import { Button } from '@/components/button/button'; import DatePicker, { DatePickerType } from '@/components/date_picker/date_picker'; import Toggle from '@/components/toggle/toggle'; import { IDatePeriod } from '@/interfaces/date_period'; +import { IAccount } from '@/interfaces/accounting_account'; +import { MessageType } from '@/interfaces/message_modal'; import { checkboxStyle, default30DayPeriodInSec } from '@/constants/display'; import { VoucherType } from '@/constants/account'; import { useUserCtx } from '@/contexts/user_context'; import { useAccountingCtx } from '@/contexts/accounting_context'; -import { IAccount } from '@/interfaces/accounting_account'; -import { numberWithCommas } from '@/lib/utils/common'; import { useModalContext } from '@/contexts/modal_context'; -import { MessageType } from '@/interfaces/message_modal'; interface ILineItem { id: number; @@ -37,6 +38,8 @@ enum RecurringUnit { WEEK = 'week', } +const AccountTitlesOfAPandAR = ['應收帳款', '應付帳款']; + const NewVoucherForm: React.FC = () => { const { t } = useTranslation('common'); const router = useRouter(); @@ -90,45 +93,50 @@ const NewVoucherForm: React.FC = () => { }, ]; - // Info: (20241004 - Julian) form state + // Info: (20241004 - Julian) 通用項目 const [date, setDate] = useState(default30DayPeriodInSec); const [type, setType] = useState(VoucherType.EXPENSE); const [note, setNote] = useState(''); - // Info: (20241004 - Julian) counterparty state - const [counterKeyword, setCounterKeyword] = useState(''); - const [counterparty, setCounterparty] = useState( - t('journal:ADD_NEW_VOUCHER.COUNTERPARTY') - ); - const [filteredCounterparty, setFilteredCounterparty] = - useState(dummyCounterparty); - - // Info: (20241004 - Julian) recurring state + // Info: (20241004 - Julian) 週期性分錄相關 state const [isRecurring, setIsRecurring] = useState(false); const [recurringPeriod, setRecurringPeriod] = useState(default30DayPeriodInSec); const [recurringUnit, setRecurringUnit] = useState(RecurringUnit.MONTH); const [recurringArray, setRecurringArray] = useState([]); - // Info: (20241004 - Julian) voucher line state + // Info: (20241004 - Julian) 傳票列 const [lineItems, setLineItems] = useState([initialVoucherLine]); - // Info: (20241004 - Julian) verification state + // Info: (20241004 - Julian) 傳票列驗證條件 const [totalCredit, setTotalCredit] = useState(0); const [totalDebit, setTotalDebit] = useState(0); const [haveZeroLine, setHaveZeroLine] = useState(false); const [isAccountingNull, setIsAccountingNull] = useState(false); - // Info: (20241004 - Julian) style state - const [isShowDateHint, setIsShowDateHint] = useState(false); - const [isShowCounterHint, setIsShowCounterHint] = useState(false); - const [isShowRecurringPeriodHint, setIsShowRecurringPeriodHint] = useState(false); - const [isShowRecurringArrayHint, setIsShowRecurringArrayHint] = useState(false); - // Info: (20241004 - Julian) 清空表單 flag const [flagOfClear, setFlagOfClear] = useState(false); // Info: (20241007 - Julian) 送出表單 flag const [flagOfSubmit, setFlagOfSubmit] = useState(false); + // Info: (20241009 - Julian) 追加項目 + const [isCounterpartyRequired, setIsCounterpartyRequired] = useState(false); + // const [isAssetRequired, setIsAssetRequired] = useState(false); + // const [isReverseRequired, setIsReverseRequired] = useState(false); + + // Info: (20241004 - Julian) 交易對象相關 state + const [counterKeyword, setCounterKeyword] = useState(''); + const [counterparty, setCounterparty] = useState( + t('journal:ADD_NEW_VOUCHER.COUNTERPARTY') + ); + const [filteredCounterparty, setFilteredCounterparty] = + useState(dummyCounterparty); + + // Info: (20241004 - Julian) 是否顯示提示 + const [isShowDateHint, setIsShowDateHint] = useState(false); + const [isShowCounterHint, setIsShowCounterHint] = useState(false); + const [isShowRecurringPeriodHint, setIsShowRecurringPeriodHint] = useState(false); + const [isShowRecurringArrayHint, setIsShowRecurringArrayHint] = useState(false); + // Info: (20241004 - Julian) Type 下拉選單 const { targetRef: typeRef, @@ -176,10 +184,16 @@ const NewVoucherForm: React.FC = () => { // Info: (20241004 - Julian) 檢查是否有未選擇的會計科目 const accountingNull = lineItems.some((item) => item.account === null); + // Info: (20241009 - Julian) 會計科目有應收付帳款時,顯示 Counterparty + const isAPorAR = lineItems.some((item) => + AccountTitlesOfAPandAR.includes(item.account?.name || '')); + setTotalDebit(debitTotal); setTotalCredit(creditTotal); setHaveZeroLine(zeroLine); setIsAccountingNull(accountingNull); + + setIsCounterpartyRequired(isAPorAR); }, [lineItems]); useEffect(() => { @@ -237,6 +251,7 @@ const NewVoucherForm: React.FC = () => { } }, [isRecurring, recurringPeriod]); + // Info: (20241007 - Julian) 週期未選擇時顯示提示 useEffect(() => { if (isRecurring && recurringArray.length > 0) { setIsShowRecurringArrayHint(false); @@ -308,7 +323,7 @@ const NewVoucherForm: React.FC = () => { setFlagOfClear(!flagOfClear); }; - // Info: (20241004 - Julian) Message Modal + // Info: (20241004 - Julian) 清空表單前的警告提示 const clearClickHandler = () => { messageModalDataHandler({ messageType: MessageType.WARNING, @@ -356,15 +371,18 @@ const NewVoucherForm: React.FC = () => { // Info: (20241007 - Julian) 日期不可為 0:顯示日期提示,並定位到日期欄位 setIsShowDateHint(true); router.push('#voucher-date'); - } else if (counterparty === '' || counterparty === t('journal:ADD_NEW_VOUCHER.COUNTERPARTY')) { - // Info: (20241004 - Julian) 交易對象不可為空:顯示類型提示,並定位到類型欄位 + } else if ( + // Info: (20241004 - Julian) 如果需填入交易對象,則交易對象不可為空:顯示類型提示,並定位到類型欄位 + isCounterpartyRequired && + (counterparty === '' || counterparty === t('journal:ADD_NEW_VOUCHER.COUNTERPARTY')) + ) { setIsShowCounterHint(true); router.push('#voucher-counterparty'); } else if ( + // Info: (20241007 - Julian) 如果開啟週期,但週期區間未選擇,則顯示週期提示,並定位到週期欄位 isRecurring && (recurringPeriod.startTimeStamp === 0 || recurringPeriod.endTimeStamp === 0) ) { - // Info: (20241007 - Julian) 如果開啟週期,但週期區間未選擇,則顯示週期提示,並定位到週期欄位 setIsShowRecurringPeriodHint(true); router.push('#voucher-recurring'); } else if (isRecurring && recurringArray.length === 0) { @@ -580,7 +598,7 @@ const NewVoucherForm: React.FC = () => { className="py-8px hover:bg-dropdown-surface-menu-background-secondary" onClick={recurringUnitClickHandler} > - {unit} + {t(`common:COMMON.${unit.toUpperCase()}`)} ); })} @@ -695,24 +713,26 @@ const NewVoucherForm: React.FC = () => { />
{/* Info: (20240926 - Julian) Counterparty */} -
-

- {t('journal:ADD_NEW_VOUCHER.COUNTERPARTY')} - * -

-
- {displayedCounterparty} -
- + {isCounterpartyRequired && ( +
+

+ {t('journal:ADD_NEW_VOUCHER.COUNTERPARTY')} + * +

+
+ {displayedCounterparty} +
+ +
+ {/* Info: (20241004 - Julian) Counterparty drop menu */} + {counterpartyDropMenu}
- {/* Info: (20241004 - Julian) Counterparty drop menu */} - {counterpartyDropMenu} -
+ )} {/* Info: (20241007 - Julian) Recurring */}
{/* Info: (20241007 - Julian) switch */} @@ -740,7 +760,9 @@ const NewVoucherForm: React.FC = () => { > {/* Info: (20241007 - Julian) recurring unit block */}
-

Every

+

+ {t('journal:ADD_NEW_VOUCHER.EVERY')} +

{
+ {/* Info: (20241009 - Julian) Asset */} +
+ {/* Info: (20241009 - Julian) Asset Divider */} +
+
+
+ asset_icon +

Asset

+
+
+
+ {/* Info: (20241009 - Julian) Asset block */} +
+
+

Empty

+

Please add at least 1 asset!

+
+ +
+
{/* Info: (20240926 - Julian) voucher line block */} {voucherLineBlock} {/* Info: (20240926 - Julian) buttons */} diff --git a/src/locales/cn/common.json b/src/locales/cn/common.json index 787c7a880..8ed619364 100644 --- a/src/locales/cn/common.json +++ b/src/locales/cn/common.json @@ -267,6 +267,7 @@ "BUSINESS_REGISTRATION_NUMBER": "商业登记号码", "EMPTY": "无资料", "STATUS": "状态", + "WEEK": "周", "MONTH": "月", "YEAR": "年", "SELECT": "选择", diff --git a/src/locales/cn/journal.json b/src/locales/cn/journal.json index b634a0606..00fdb8489 100644 --- a/src/locales/cn/journal.json +++ b/src/locales/cn/journal.json @@ -234,7 +234,8 @@ "RECURRING_ENTRY": "周期性分录", "SELECT_ACCOUNTING": "选择会计科目", "NO_ACCOUNTING_FOUND": "查无会计科目", - "NO_COUNTERPARTY_FOUND": "查无交易对象" + "NO_COUNTERPARTY_FOUND": "查无交易对象", + "EVERY": "每" }, "ACCOUNT_TYPE": { "ASSET": "资产", diff --git a/src/locales/en/common.json b/src/locales/en/common.json index 49d080eb8..cf4ef7c71 100644 --- a/src/locales/en/common.json +++ b/src/locales/en/common.json @@ -267,6 +267,7 @@ "BUSINESS_REGISTRATION_NUMBER": "Business Registration Number", "EMPTY": "Empty", "STATUS": "Status", + "WEEK": "Week", "MONTH": "Month", "YEAR": "Year", "SELECT": "Select", diff --git a/src/locales/en/journal.json b/src/locales/en/journal.json index 27fc5675a..e1eaff797 100644 --- a/src/locales/en/journal.json +++ b/src/locales/en/journal.json @@ -234,7 +234,8 @@ "RECURRING_ENTRY": "Recurring Entry", "SELECT_ACCOUNTING": "Select Accounting", "NO_ACCOUNTING_FOUND": "No accounting found", - "NO_COUNTERPARTY_FOUND": "No counterparty found" + "NO_COUNTERPARTY_FOUND": "No counterparty found", + "EVERY": "Every" }, "ACCOUNT_TYPE": { "ASSET": "Assets", diff --git a/src/locales/tw/common.json b/src/locales/tw/common.json index 8228037e8..b46bbc704 100644 --- a/src/locales/tw/common.json +++ b/src/locales/tw/common.json @@ -267,6 +267,7 @@ "BUSINESS_REGISTRATION_NUMBER": "商業登記號碼", "EMPTY": "無資料", "STATUS": "狀態", + "WEEK": "週", "MONTH": "月", "YEAR": "年", "SELECT": "選擇", diff --git a/src/locales/tw/journal.json b/src/locales/tw/journal.json index 84b94f610..4fe1abfb6 100644 --- a/src/locales/tw/journal.json +++ b/src/locales/tw/journal.json @@ -234,7 +234,8 @@ "RECURRING_ENTRY": "週期性分錄", "SELECT_ACCOUNTING": "選擇會計科目", "NO_ACCOUNTING_FOUND": "查無會計科目", - "NO_COUNTERPARTY_FOUND": "查無交易對象" + "NO_COUNTERPARTY_FOUND": "查無交易對象", + "EVERY": "每" }, "ACCOUNT_TYPE": { "ASSET": "資產", From 0f1491b32ed583a0f54947fc02ebd7961b2330a9 Mon Sep 17 00:00:00 2001 From: Liz Date: Wed, 9 Oct 2024 14:51:15 +0800 Subject: [PATCH 16/29] update PreviewModal & user context --- package.json | 2 +- .../beta/select_role/introduction.tsx | 61 +++++++++++++------ .../beta/select_role/preview_modal.tsx | 31 +++++++--- src/components/beta/select_role/role_card.tsx | 24 ++++---- src/constants/role.ts | 2 +- src/contexts/user_context.tsx | 46 ++++++++------ src/pages/beta/select_role.tsx | 13 ++-- 7 files changed, 111 insertions(+), 68 deletions(-) diff --git a/package.json b/package.json index 47ed8048f..038ad00ab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+37", + "version": "0.8.2+38", "private": false, "scripts": { "dev": "next dev", diff --git a/src/components/beta/select_role/introduction.tsx b/src/components/beta/select_role/introduction.tsx index dc32bfa71..9d41d0cf8 100644 --- a/src/components/beta/select_role/introduction.tsx +++ b/src/components/beta/select_role/introduction.tsx @@ -2,12 +2,26 @@ import React from 'react'; import Image from 'next/image'; import { FiEye, FiArrowRight } from 'react-icons/fi'; import { RoleId } from '@/constants/role'; +import { useUserCtx } from '@/contexts/user_context'; interface IntroductionProps { - role: React.SetStateAction; + showingRole: React.SetStateAction; + togglePreviewModal: () => void; +} +interface ButtonsProps { + showingRole: RoleId; + togglePreviewModal: () => void; +} +interface BookkeeperIntroductionProps { + showingRole: RoleId; + togglePreviewModal: () => void; +} +interface EducationalTrialVersionIntroductionProps { + showingRole: RoleId; + togglePreviewModal: () => void; } -const DefaultIntroduction = () => { +const DefaultIntroduction: React.FC = () => { return (
@@ -26,17 +40,15 @@ const DefaultIntroduction = () => { ); }; -const Buttons = () => { - const handlePreview = () => { - // Deprecated: (20241007 - Liz) - // eslint-disable-next-line no-console - console.log('Preview'); - }; +const Buttons: React.FC = ({ togglePreviewModal, showingRole }) => { + const { selectRole } = useUserCtx(); const handleStart = () => { // Deprecated: (20241007 - Liz) // eslint-disable-next-line no-console - console.log('Start'); + console.log('showingRole:', showingRole, '儲存 showingRole 到 userCtx'); + + selectRole(showingRole); }; return ( @@ -44,7 +56,7 @@ const Buttons = () => {
); }; -const EducationalTrialVersionIntroduction = () => { +const EducationalTrialVersionIntroduction: React.FC = ({ + showingRole, + togglePreviewModal, +}) => { return (
@@ -113,18 +131,25 @@ const EducationalTrialVersionIntroduction = () => {

General Ledger, Voucher Issuance

- +
); }; -const Introduction = ({ role }: IntroductionProps) => { +const Introduction: React.FC = ({ showingRole, togglePreviewModal }) => { return ( <> - {!role && } - {role === RoleId.BOOKKEEPER && } - {role === RoleId.EDUCATIONAL_TRIAL_VERSION && } + {!showingRole && } + {showingRole === RoleId.BOOKKEEPER && ( + + )} + {showingRole === RoleId.EDUCATIONAL_TRIAL_VERSION && ( + + )} ); }; diff --git a/src/components/beta/select_role/preview_modal.tsx b/src/components/beta/select_role/preview_modal.tsx index ca2d9875a..28424ab34 100644 --- a/src/components/beta/select_role/preview_modal.tsx +++ b/src/components/beta/select_role/preview_modal.tsx @@ -1,4 +1,5 @@ import Image from 'next/image'; +import { useState } from 'react'; import { IoCloseOutline, IoEllipse } from 'react-icons/io5'; interface PreviewModalProps { @@ -6,6 +7,11 @@ interface PreviewModalProps { } const PreviewModal = ({ togglePreviewModal }: PreviewModalProps) => { + // ToDo: (20241009 - Liz) 根據 videoIndex 顯示不同影片 + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [videoIndex, setVideoIndex] = useState(0); + const videoIds = ['video1', 'video2', 'video3', 'video4', 'video5']; + return (
@@ -13,7 +19,7 @@ const PreviewModal = ({ togglePreviewModal }: PreviewModalProps) => {

Role Function Preview

- @@ -28,15 +34,20 @@ const PreviewModal = ({ togglePreviewModal }: PreviewModalProps) => { > - {/* // Info: (20241008 - Liz) 切換影片控制鈕 */} -
- - - - - + {/* // Info: (20241008 - Liz) 切換影片控制按鈕 */} +
+ {videoIds.map((id, index) => ( + + ))}
diff --git a/src/components/beta/select_role/role_card.tsx b/src/components/beta/select_role/role_card.tsx index ffdac742b..f31c93e4c 100644 --- a/src/components/beta/select_role/role_card.tsx +++ b/src/components/beta/select_role/role_card.tsx @@ -3,8 +3,8 @@ import Image from 'next/image'; import { RoleId } from '@/constants/role'; interface RoleCardProps { - role: React.SetStateAction; - setRole: React.Dispatch>; + showingRole: React.SetStateAction; + setShowingRole: React.Dispatch>; } interface CardProps { @@ -13,8 +13,8 @@ interface CardProps { title: string; imageSrc: string; altText: string; - role: React.SetStateAction; - setRole: React.Dispatch>; + showingRole: React.SetStateAction; + setShowingRole: React.Dispatch>; } // Info: (20241007 - Liz) 每個角色卡片的資訊 @@ -55,15 +55,15 @@ const Card: React.FC = ({ title, imageSrc, altText, - role, - setRole, + showingRole, + setShowingRole, }) => { - const isRoleSelected = role === roleId; + const isRoleSelected = showingRole === roleId; return ( ); }; -const RoleCard = ({ role, setRole }: RoleCardProps) => { +const RoleCard = ({ showingRole, setShowingRole }: RoleCardProps) => { return (
{cards.map((card) => ( @@ -94,8 +94,8 @@ const RoleCard = ({ role, setRole }: RoleCardProps) => { title={card.title} imageSrc={card.imageSrc} altText={card.altText} - role={role} - setRole={setRole} + showingRole={showingRole} + setShowingRole={setShowingRole} /> ))}
diff --git a/src/constants/role.ts b/src/constants/role.ts index 76c21dd45..c56000dac 100644 --- a/src/constants/role.ts +++ b/src/constants/role.ts @@ -1,4 +1,4 @@ -// Info: (20241007 - Liz) 每個角色卡片的角色 id +// Info: (20241007 - Liz) 角色 id (與後端的角色 id 不同,未來後端會提供 role name) export enum RoleId { BOOKKEEPER = 'bookkeeper', EDUCATIONAL_TRIAL_VERSION = 'educational_trial_version', diff --git a/src/contexts/user_context.tsx b/src/contexts/user_context.tsx index d57ddba21..cb138c1c6 100644 --- a/src/contexts/user_context.tsx +++ b/src/contexts/user_context.tsx @@ -25,6 +25,8 @@ interface UserContextType { isAgreeTermsOfService: boolean; isAgreePrivacyPolicy: boolean; isSignInError: boolean; + role: string | null; + selectRole: (roleId: string) => void; selectedCompany: ICompany | null; selectCompany: (company: ICompany | null, isPublic?: boolean) => Promise; successSelectCompany: boolean | undefined; @@ -56,6 +58,8 @@ export const UserContext = createContext({ isAgreeTermsOfService: false, isAgreePrivacyPolicy: false, isSignInError: false, + role: null, + selectRole: () => {}, selectedCompany: null, selectCompany: async () => {}, successSelectCompany: undefined, @@ -80,6 +84,7 @@ export const UserProvider = ({ children }: { children: React.ReactNode }) => { const [, setCredential, credentialRef] = useStateRef(null); const [userAuth, setUserAuth, userAuthRef] = useStateRef(null); const [, setUsername, usernameRef] = useStateRef(null); + const [, setRole, roleRef] = useStateRef(null); const [, setSelectedCompany, selectedCompanyRef] = useStateRef(null); const [, setSuccessSelectCompany, successSelectCompanyRef] = useStateRef( undefined @@ -118,6 +123,7 @@ export const UserProvider = ({ children }: { children: React.ReactNode }) => { setCredential(null); setIsSignIn(false); setIsSignInError(false); + setRole(null); setSelectedCompany(null); setSuccessSelectCompany(undefined); localStorage.removeItem('userId'); @@ -272,10 +278,9 @@ export const UserProvider = ({ children }: { children: React.ReactNode }) => { setIsAgreePrivacyPolicy(hasAgreedToPrivacy); }; - // Deprecated: (20241004 - Liz) 之後統一刪除 // Info: (20241001 - Liz) 此函數處理公司資訊: // 如果公司資料存在且不為空,它會設定選定的公司 (setSelectedCompany),並標記成功選擇公司。 - // 若公司資料不存在,會將公司資訊設為空,並檢查路由是否位於 users 路徑中。如果符合條件且不在 SELECT_COMPANY 頁面,它會呼叫 redirectToSelectCompanyPage 函數進行重新導向。 + // 若公司資料不存在,會將公司資訊設為空,並標記為未選擇公司。 const processCompanyInfo = (company: ICompany) => { if (company && Object.keys(company).length > 0) { // Deprecated: (20241008 - Liz) @@ -295,23 +300,17 @@ export const UserProvider = ({ children }: { children: React.ReactNode }) => { setSelectedCompany(null); return false; - - // const isInUsersRoute = - // router.pathname.includes('users') && !router.pathname.includes(ISUNFA_ROUTE.SELECT_COMPANY); - - // if (isInUsersRoute) { - // goToSelectRolePage(); - // } } }; // ToDo: (20241004 - Liz) 之後會新增一個函數來處理「使用者的角色資訊」 // Info: (20241001 - Liz) 此函數處理使用者資訊: - // 如果使用者資料存在且有效,會設定使用者認證、名稱,並標記為已登入。 - // 它還會將使用者的 userId 和過期時間儲存在 localStorage。 - // 最後,它會呼叫 updateUserAgreements 函數更新使用者的協議狀態。 - // 如果使用者資料不存在,則會清除狀態,並導向登入頁面。 + // 如果使用者資料存在且有效,會設定使用者認證、名稱,並標記為已登入, + // 它還會將使用者的 userId 和過期時間儲存在 localStorage 中, + // 接著它會呼叫 updateUserAgreements 函數更新使用者的協議狀態, + // 最後回傳 true。 + // 如果使用者資料不存在,會回傳 false。 const processUserInfo = (user: IUser) => { if (user && Object.keys(user).length > 0) { setUserAuth(user); @@ -330,12 +329,15 @@ export const UserProvider = ({ children }: { children: React.ReactNode }) => { return true; } else { - // clearStates(); - // redirectToLoginPage(); + // clearStates(); // Deprecated: (20241009 - Liz) + // redirectToLoginPage(); // Deprecated: (20241009 - Liz) return false; } }; + // Info: (20241009 - Liz) 此函數是在處理使用者和公司資訊,並根據處理結果來決定下一步的操作: + // 它會呼叫 processUserInfo 和 processCompanyInfo 分別處理使用者和公司資訊。 + // 依據處理結果,它會執行不同的自動導向邏輯。 const handleUserAndCompanyProcessing = (user: IUser, company: ICompany) => { const isProcessedInfo = processUserInfo(user); const isProcessedCompany = processCompanyInfo(company); @@ -359,9 +361,9 @@ export const UserProvider = ({ children }: { children: React.ReactNode }) => { }; // Info: (20241001 - Liz) 此函數使用 useCallback 封裝,用來非同步取得使用者和公司狀態資訊。 - // 它首先檢查是否需要取得使用者資料 (isProfileFetchNeeded),如果不需要,則直接返回。 - // 當資料獲取中,它會設定載入狀態 (setIsAuthLoading) 並清除公司選擇狀態。 - // 當 API 回傳成功且有資料時,它會呼叫 processUserInfo 和 processCompanyInfo 分別處理使用者和公司資訊。 + // 它首先檢查是否需要取得使用者資料 (isProfileFetchNeeded),如果不需要,則直接結束。 + // 當資料獲取中,它會設定載入狀態 (setIsAuthLoading) + // 當 API 回傳成功且有資料時,它會呼叫 handleUserAndCompanyProcessing 分別處理使用者和公司資訊。 // 如果獲取資料失敗,它會執行未登入的處理邏輯: 清除狀態、導向登入頁面、設定登入錯誤狀態、設定錯誤代碼。 // 最後,它會將載入狀態設為完成。 const getStatusInfo = useCallback(async () => { @@ -462,6 +464,11 @@ export const UserProvider = ({ children }: { children: React.ReactNode }) => { } }; + // ToDo: (20241009 - Liz) 選擇角色的功能 + const selectRole = (roleId: string) => { + setRole(roleId); + }; + // Info: (20240513 - Julian) 選擇公司的功能 const selectCompany = async (company: ICompany | null, isPublic = false) => { setSelectedCompany(null); @@ -556,6 +563,8 @@ export const UserProvider = ({ children }: { children: React.ReactNode }) => { isAgreeTermsOfService: isAgreeTermsOfServiceRef.current, isAgreePrivacyPolicy: isAgreePrivacyPolicyRef.current, isSignInError: isSignInErrorRef.current, + role: roleRef.current, + selectRole, selectedCompany: selectedCompanyRef.current, selectCompany, successSelectCompany: successSelectCompanyRef.current, @@ -570,6 +579,7 @@ export const UserProvider = ({ children }: { children: React.ReactNode }) => { }), [ credentialRef.current, + roleRef.current, selectedCompanyRef.current, successSelectCompanyRef.current, errorCodeRef.current, diff --git a/src/pages/beta/select_role.tsx b/src/pages/beta/select_role.tsx index 2855a9db5..86a88cb7d 100644 --- a/src/pages/beta/select_role.tsx +++ b/src/pages/beta/select_role.tsx @@ -6,15 +6,12 @@ import { useTranslation } from 'next-i18next'; import Introduction from '@/components/beta/select_role/introduction'; import RoleCard from '@/components/beta/select_role/role_card'; import PreviewModal from '@/components/beta/select_role/preview_modal'; +import { RoleId } from '@/constants/role'; const SelectRolePage = () => { const { t } = useTranslation(['common', 'kyc']); - const [role, setRole] = useState(''); - const [isPreviewModalVisible, setIsPreviewModalVisible] = useState(true); - - // Deprecated: (20241008 - Liz) - // eslint-disable-next-line no-console - console.log('isPreviewModalVisible', isPreviewModalVisible); + const [showingRole, setShowingRole] = useState(null); + const [isPreviewModalVisible, setIsPreviewModalVisible] = useState(false); const togglePreviewModal = () => { setIsPreviewModalVisible((prev) => !prev); @@ -42,10 +39,10 @@ const SelectRolePage = () => {
- +
- +
{isPreviewModalVisible && } From 25a707f008b1820e3a754f3d530f92c5663e711f Mon Sep 17 00:00:00 2001 From: TzuHanLiang Date: Wed, 9 Oct 2024 15:52:29 +0800 Subject: [PATCH 17/29] feat: pusher implement --- package.json | 2 +- .../certificate/certificate_qrcode_modal.tsx | 8 +- .../floating_upload_popup.tsx | 43 +++-- src/constants/account.ts | 1 + src/constants/api_connection.ts | 28 ++++ src/constants/file.ts | 3 + src/constants/pusher.ts | 13 ++ src/interfaces/api_connection.ts | 9 +- src/interfaces/certificate.ts | 10 +- src/lib/pusher.ts | 19 +++ src/lib/pusherClient.ts | 26 +++ src/lib/utils/parse_image_form.ts | 40 ++++- src/lib/utils/pusher_token.ts | 32 ++++ src/pages/api/v2/encrypt.ts | 24 +++ src/pages/api/v2/pusher.ts | 59 +++---- src/pages/api/v2/upload.ts | 110 ++++++------ src/pages/mobile_upload.tsx | 157 ++++++++++++------ .../accounting}/certificate_list.tsx | 137 ++++++++------- 18 files changed, 491 insertions(+), 230 deletions(-) create mode 100644 src/constants/pusher.ts create mode 100644 src/lib/pusher.ts create mode 100644 src/lib/pusherClient.ts create mode 100644 src/lib/utils/pusher_token.ts create mode 100644 src/pages/api/v2/encrypt.ts rename src/pages/{ => users/accounting}/certificate_list.tsx (76%) diff --git a/package.json b/package.json index c637fe216..45349ca1b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+34", + "version": "0.8.2+35", "private": false, "scripts": { "dev": "next dev", diff --git a/src/components/certificate/certificate_qrcode_modal.tsx b/src/components/certificate/certificate_qrcode_modal.tsx index cb163802b..49fffb986 100644 --- a/src/components/certificate/certificate_qrcode_modal.tsx +++ b/src/components/certificate/certificate_qrcode_modal.tsx @@ -40,7 +40,7 @@ const CertificateQRCodeModal: React.FC = ({
Url
for mobile upload

-
+
{/* Info: (20240924 - tzuhan) 發票縮略圖 */} = ({ }, }} /> + {`${isDev ? 'http://localhost:3000' : DOMAIN}/${ISUNFA_ROUTE.UPLOAD}?token=${token}`}
@@ -127,8 +180,8 @@ const MobileUploadPage: React.FC = () => {

Uploaded Certificates

{uploadedCertificates.map((certificate, index) => ( -
- {certificate.status !== ProgressStatus.SYSTEM_ERROR ? ( +
+ {certificate.status !== ProgressStatus.FAILED ? ( {`Uploaded { ); }; -const getStaticPropsFunction = async ({ locale }: ILocale) => ({ +export const getStaticProps = async ({ locale }: ILocale) => ({ props: { ...(await serverSideTranslations(locale, [ 'common', @@ -163,6 +216,4 @@ const getStaticPropsFunction = async ({ locale }: ILocale) => ({ }, }); -export const getStaticProps = getStaticPropsFunction; - export default MobileUploadPage; diff --git a/src/pages/certificate_list.tsx b/src/pages/users/accounting/certificate_list.tsx similarity index 76% rename from src/pages/certificate_list.tsx rename to src/pages/users/accounting/certificate_list.tsx index 7191ff249..a9604fdc6 100644 --- a/src/pages/certificate_list.tsx +++ b/src/pages/users/accounting/certificate_list.tsx @@ -18,14 +18,19 @@ import { } from '@/interfaces/certificate'; import Certificate from '@/components/certificate/certificate'; import CertificateEditModal from '@/components/certificate/certificate_edit_modal'; -import Pusher, { Channel } from 'pusher-js'; +import { getPusherInstance } from '@/lib/pusherClient'; import FloatingUploadPopup from '@/components/floating_upload_popup/floating_upload_popup'; import CertificateQRCodeModal from '@/components/certificate/certificate_qrcode_modal'; -import Image from 'next/image'; -import { v4 as uuidv4 } from 'uuid'; -import { ProgressStatus } from '@/constants/account'; +import APIHandler from '@/lib/utils/api_handler'; +import { CERTIFICATE_EVENT, PRIVATE_CHANNEL } from '@/constants/pusher'; +import useStateRef from 'react-usestateref'; +import { useUserCtx } from '@/contexts/user_context'; -const UploadCertificatePage: React.FC = () => { +const CertificateListPage: React.FC = () => { + const { selectedCompany } = useUserCtx(); + const { id: companyId } = selectedCompany!; + const { trigger: encryptAPI } = APIHandler(APIName.ENCRYPT); + const [token, setToken, tokenRef] = useStateRef(undefined); const [showQRCode, setShowQRCode] = useState(false); const [activeTab, setActiveTab] = useState(0); const [data, setData] = useState<{ [tab: number]: { [id: number]: ICertificateUI } }>({ @@ -43,8 +48,10 @@ const UploadCertificatePage: React.FC = () => { 0: false, 1: false, }); - const token = uuidv4(); // Info: (20241007 - tzuhan) 生成唯一 token - const [uploadingCertificates, setUploadingCertificates] = useState([]); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [uploadingCertificates, setUploadingCertificates, uploadingCertificatesRef] = useStateRef<{ + [id: number]: ICertificateInfo; + }>({}); const handleApiResponse = useCallback((resData: ICertificate[]) => { const sumInvoiceTotalPrice = { @@ -189,61 +196,60 @@ const UploadCertificatePage: React.FC = () => { console.log('Save selected id:', certificate); }, []); - const certificateHandler = async (certificateData: { url: string; token: string }) => { - // TODO: (20241007 - tzuhan) post certificate data to server and get uploading certificate list back and update certificate list when uploaded - // TODO: (20241007 - tzuhan) get Token from server - if (certificateData.token === token) { - // Info: (20241007 - tzuhan) 使用 fetch 下載圖片文件 - const response = await fetch(certificateData.url); - const blob = await response.blob(); + const certificateHandler = useCallback( + async (message: { token: string; certificate: ICertificateInfo }) => { + const { token: receivedToken, certificate: certificateData } = message; + // Deprecated: (20241011 - tzuhan) Debugging purpose + // eslint-disable-next-line no-console + console.log( + `pusher got message, (token(${tokenRef.current})===_token${receivedToken})?${tokenRef.current === receivedToken} message:`, + message + ); - // Info: (20241007 - tzuhan) 獲取文件名,從 response headers 提取 - const contentDisposition = response.headers.get('Content-Disposition'); - let fileName = 'unknown'; - if (contentDisposition) { - const match = contentDisposition.match(/filename="(.+)"/); - if (match && match[1]) { - // Info: (20241007 - tzuhan) 使用陣列解構提取文件名 - [, fileName] = match; - } + if (receivedToken === tokenRef.current) { + const updatedCertificates = { + ...uploadingCertificatesRef.current, + }; + updatedCertificates[certificateData.id] = certificateData; + setUploadingCertificates(updatedCertificates); + // Deprecated: (20241011 - tzuhan) Debugging purpose + // eslint-disable-next-line no-console + console.log(`uploadingCertificatesRef.current:`, uploadingCertificatesRef.current); + } + }, + [tokenRef, setUploadingCertificates] + ); + const getToken = useCallback(async () => { + if (!tokenRef.current) { + const res = await encryptAPI({ body: { companyId } }); + if (res.success && res.data) { + setToken(res.data); } else { - // Info: (20241007 - tzuhan) 如果沒有提供 header,可以從 url 推斷出文件名 - fileName = certificateData.url.split('/').pop() || 'unknown'; + setToken(''); } - - // Info: (20241007 - tzuhan) 獲取文件大小 - const fileSize = blob.size; - - const imageObjectUrl = URL.createObjectURL(blob); - setUploadingCertificates((prev) => [ - ...prev, - { - url: imageObjectUrl, - status: ProgressStatus.IN_PROGRESS, - name: fileName, - size: fileSize, - progress: 80, - }, - ]); } - }; + }, [tokenRef, companyId, setToken]); + + const toggleQRCode = useCallback(() => { + getToken(); + setShowQRCode((prev) => !prev); + }, []); useEffect(() => { - const pusher = new Pusher(process.env.NEXT_PUBLIC_PUSHER_KEY!, { - cluster: '', - wsHost: process.env.NEXT_PUBLIC_PUSHER_HOST!, - wsPort: parseFloat(process.env.NEXT_PUBLIC_PUSHER_PORT!), - }); + getToken(); + }, [getToken]); - const channel: Channel = pusher.subscribe('certificate-channel'); + useEffect(() => { + const pusher = getPusherInstance(); + const channel = pusher.subscribe(PRIVATE_CHANNEL.CERTIFICATE); - channel.bind('certificate-event', certificateHandler); + channel.bind(CERTIFICATE_EVENT.UPLOAD, certificateHandler); return () => { - channel.unbind('certificate-event', certificateHandler); - pusher.unsubscribe('certificate-channel'); + channel.unbind(CERTIFICATE_EVENT.UPLOAD, certificateHandler); + pusher.unsubscribe(PRIVATE_CHANNEL.CERTIFICATE); }; - }, []); + }, [certificateHandler]); return ( <> @@ -251,7 +257,7 @@ const UploadCertificatePage: React.FC = () => { - Upload Certificate - iSunFA + Certificate List - iSunFA
{editingId && ( @@ -262,12 +268,12 @@ const UploadCertificatePage: React.FC = () => { onSave={handleSave} /> )} - {showQRCode && ( + {showQRCode && !!token && ( setShowQRCode((prev) => !prev)} isOnTopOfModal={false} - token={token} + token={tokenRef.current!} /> )} @@ -281,20 +287,7 @@ const UploadCertificatePage: React.FC = () => { {/* Info: (20240919 - tzuhan) Main Content */}
{/* Info: (20240919 - tzuhan) Upload Area */} - setShowQRCode((prev) => !prev)} - /> -
- {uploadingCertificates.map((image, index) => ( -
- {`Received -

Status: {image.status}

-
- ))} -
- + {/* Info: (20240919 - tzuhan) Tabs */} { />
{/* Info: (20240926- tzuhan) Floating Upload Popup */} - {uploadingCertificates.length > 0 && ( - - )} +
@@ -375,4 +368,4 @@ const getStaticPropsFunction = async ({ locale }: ILocale) => ({ export const getStaticProps = getStaticPropsFunction; -export default UploadCertificatePage; +export default CertificateListPage; From f05f5b7971044b88f8431d6d252a41d8b07de4b7 Mon Sep 17 00:00:00 2001 From: TzuHanLiang Date: Wed, 9 Oct 2024 17:43:06 +0800 Subject: [PATCH 18/29] feat: remove debug code --- package.json | 2 +- src/lib/utils/parse_image_form.ts | 28 +--------------------------- 2 files changed, 2 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index 346bc828a..99d0a4032 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+38", + "version": "0.8.2+39", "private": false, "scripts": { "dev": "next dev", diff --git a/src/lib/utils/parse_image_form.ts b/src/lib/utils/parse_image_form.ts index 71af979e0..76bee46a0 100644 --- a/src/lib/utils/parse_image_form.ts +++ b/src/lib/utils/parse_image_form.ts @@ -1,4 +1,4 @@ -import formidable, { IncomingForm, Fields, Files } from 'formidable'; +import { IncomingForm, Fields, Files } from 'formidable'; import { promises as fs } from 'fs'; import path from 'path'; import { NextApiRequest } from 'next'; @@ -6,32 +6,12 @@ import { FORMIDABLE_OPTIONS } from '@/constants/config'; import { FileFolder, getFileFolder } from '@/constants/file'; import loggerBack from '@/lib/utils/logger_back'; -export const extractKeyAndIvFromFields = (fields: formidable.Fields) => { - const { encryptedSymmetricKey, iv } = fields; - const keyStr = - encryptedSymmetricKey && encryptedSymmetricKey.length ? encryptedSymmetricKey[0] : ''; - const ivStr = iv ? iv[0] : ''; - - const ivUnit8: Uint8Array = new Uint8Array(ivStr.split(',').map((num) => parseInt(num, 10))); - - const isEncrypted = !!(keyStr && ivUnit8.length > 0); - - return { - isEncrypted, - encryptedSymmetricKey: keyStr, - iv: ivUnit8, - }; -}; - export const parseForm = async ( req: NextApiRequest, subDir: FileFolder = FileFolder.TMP, // Info: (20240726 - Jacky) 預設子資料夾名稱為tmp subSubDir?: string // Info: (202410008 - Tzuhan) 如果有傳入subSubDir,則使用subSubDir ) => { let uploadDir = getFileFolder(subDir); - // Deprecated: (20241011-tzuhan) Debugging purpose - // eslint-disable-next-line no-console - console.log(`parseForm (subDir: ${subDir}, subSubDir: ${subSubDir}), req`, req); // Info: (202410008 - Tzuhan) 如果有傳入subSubDir,更新 uploadDir if (subSubDir) { @@ -48,14 +28,8 @@ export const parseForm = async ( const parsePromise = new Promise<{ fields: Fields; files: Files }>((resolve, reject) => { form.parse(req, (err, fields, files) => { if (err) { - // Deprecated: (20241011-tzuhan) Debugging purpose - // eslint-disable-next-line no-console - console.error(`form.parse err:`, err); reject(err); } else { - // Deprecated: (20241011-tzuhan) Debugging purpose - // eslint-disable-next-line no-console - console.log(`form.parse fields, files:`, fields, files); resolve({ fields, files }); } }); From 50899cd878292de5884050176295b7efea9388e9 Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 9 Oct 2024 18:13:49 +0800 Subject: [PATCH 19/29] Feat: develop asset section & reverse section --- package.json | 2 +- public/icons/number_sign.svg | 3 + src/components/voucher/asset_section.tsx | 94 ++++++++++ src/components/voucher/new_voucher_form.tsx | 108 ++++------- src/components/voucher/reverse_section.tsx | 188 +++++++++++++++++++ src/components/voucher/voucher_line_item.tsx | 8 +- src/constants/asset.ts | 64 +++++++ src/constants/display.ts | 8 + src/interfaces/counterparty.ts | 34 ++++ 9 files changed, 432 insertions(+), 77 deletions(-) create mode 100644 public/icons/number_sign.svg create mode 100644 src/components/voucher/asset_section.tsx create mode 100644 src/components/voucher/reverse_section.tsx create mode 100644 src/interfaces/counterparty.ts diff --git a/package.json b/package.json index 038ad00ab..9e140cedf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+38", + "version": "0.8.2+39", "private": false, "scripts": { "dev": "next dev", diff --git a/public/icons/number_sign.svg b/public/icons/number_sign.svg new file mode 100644 index 000000000..a6ad5472e --- /dev/null +++ b/public/icons/number_sign.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/voucher/asset_section.tsx b/src/components/voucher/asset_section.tsx new file mode 100644 index 000000000..0d58ea807 --- /dev/null +++ b/src/components/voucher/asset_section.tsx @@ -0,0 +1,94 @@ +import React, { useState } from 'react'; +import Image from 'next/image'; +import { FiEdit, FiPlus, FiTrash2 } from 'react-icons/fi'; +import { Button } from '@/components/button/button'; +import { IAssetItem, mockAssetItem } from '@/interfaces/asset'; + +const AssetSection: React.FC = () => { + const [assets, setAssets] = useState([]); + + // ToDo: (20241009 - Julian) Replace with real function to add asset + const generateRandomAsset = () => { + const newId = assets[assets.length - 1]?.id || 0; + const randomNum = Math.random() * 10; + const randomAssetName = + randomNum > 8 + ? 'MacBook Pro' + : randomNum > 5 + ? 'Printer' + : randomNum > 2 + ? 'Monitor' + : 'Keyboard'; + + const randomAsset: IAssetItem = { + ...mockAssetItem, + id: newId, + assetName: randomAssetName, + assetNumber: `A - ${newId.toFixed(0).padStart(6, '0')}`, + }; + + setAssets([...assets, randomAsset]); + }; + + const displayedAssetList = + assets && assets.length > 0 ? ( + assets.map((asset) => { + const deleteHandler = () => setAssets(assets.filter((a) => a.id !== asset.id)); + + return ( +
+ number_sign +
+

{asset.assetName}

+

{asset.assetNumber}

+
+
+ + +
+
+ ); + }) + ) : ( +
+

Empty

+

Please add at least 1 asset!

+
+ ); + + return ( + <> + {/* Info: (20241009 - Julian) Asset Divider */} +
+
+
+ asset_icon +

Asset

+
+
+
+ +
+ {displayedAssetList} + +
+ + ); +}; + +export default AssetSection; diff --git a/src/components/voucher/new_voucher_form.tsx b/src/components/voucher/new_voucher_form.tsx index d01151e2e..668afd198 100644 --- a/src/components/voucher/new_voucher_form.tsx +++ b/src/components/voucher/new_voucher_form.tsx @@ -1,9 +1,8 @@ import React, { useState, useEffect, useRef } from 'react'; -import Image from 'next/image'; import { useRouter } from 'next/router'; import { FaChevronDown, FaPlus } from 'react-icons/fa6'; import { BiSave } from 'react-icons/bi'; -import { FiPlus, FiSearch } from 'react-icons/fi'; +import { FiSearch } from 'react-icons/fi'; import { useTranslation } from 'next-i18next'; import useOuterClick from '@/lib/hooks/use_outer_click'; import { numberWithCommas } from '@/lib/utils/common'; @@ -11,14 +10,18 @@ import VoucherLineItem from '@/components/voucher/voucher_line_item'; import { Button } from '@/components/button/button'; import DatePicker, { DatePickerType } from '@/components/date_picker/date_picker'; import Toggle from '@/components/toggle/toggle'; +import AssetSection from '@/components/voucher/asset_section'; +import ReverseSection from '@/components/voucher/reverse_section'; import { IDatePeriod } from '@/interfaces/date_period'; import { IAccount } from '@/interfaces/accounting_account'; import { MessageType } from '@/interfaces/message_modal'; -import { checkboxStyle, default30DayPeriodInSec } from '@/constants/display'; -import { VoucherType } from '@/constants/account'; +import { ICounterparty, dummyCounterparty } from '@/interfaces/counterparty'; import { useUserCtx } from '@/contexts/user_context'; import { useAccountingCtx } from '@/contexts/accounting_context'; import { useModalContext } from '@/contexts/modal_context'; +import { checkboxStyle, inputStyle, default30DayPeriodInSec } from '@/constants/display'; +import { VoucherType } from '@/constants/account'; +import { AccountCodesOfAPandAR, AccountCodesOfAsset } from '@/constants/asset'; interface ILineItem { id: number; @@ -27,30 +30,16 @@ interface ILineItem { debit: number; credit: number; } -interface ICounterparty { - id: number; - code: string; - name: string; -} enum RecurringUnit { MONTH = 'month', WEEK = 'week', } -const AccountTitlesOfAPandAR = ['應收帳款', '應付帳款']; - const NewVoucherForm: React.FC = () => { const { t } = useTranslation('common'); const router = useRouter(); - const inputStyle = { - NORMAL: - 'border-input-stroke-input text-input-text-input-filled placeholder:text-input-text-input-placeholder disabled:text-input-text-input-placeholder', - ERROR: - 'border-input-text-error text-input-text-error placeholder:text-input-text-error disabled:text-input-text-error', - }; - const { selectedCompany } = useUserCtx(); const { getAccountListHandler } = useAccountingCtx(); const { messageModalDataHandler, messageModalVisibilityHandler } = useModalContext(); @@ -64,35 +53,6 @@ const NewVoucherForm: React.FC = () => { credit: 0, }; - // ToDo: (20241004 - Julian) dummy data - const dummyCounterparty: ICounterparty[] = [ - { - id: 1, - code: '59382730', - name: 'Padberg LLC', - }, - { - id: 2, - code: '59382731', - name: 'Hermiston - West', - }, - { - id: 3, - code: '59382732', - name: 'Feil, Ortiz and Lebsack', - }, - { - id: 4, - code: '59382733', - name: 'Romaguera Inc', - }, - { - id: 5, - code: '59382734', - name: 'Stamm - Baumbach', - }, - ]; - // Info: (20241004 - Julian) 通用項目 const [date, setDate] = useState(default30DayPeriodInSec); const [type, setType] = useState(VoucherType.EXPENSE); @@ -120,8 +80,8 @@ const NewVoucherForm: React.FC = () => { // Info: (20241009 - Julian) 追加項目 const [isCounterpartyRequired, setIsCounterpartyRequired] = useState(false); - // const [isAssetRequired, setIsAssetRequired] = useState(false); - // const [isReverseRequired, setIsReverseRequired] = useState(false); + const [isAssetRequired, setIsAssetRequired] = useState(false); + const [isReverseRequired, setIsReverseRequired] = useState(false); // Info: (20241004 - Julian) 交易對象相關 state const [counterKeyword, setCounterKeyword] = useState(''); @@ -185,8 +145,21 @@ const NewVoucherForm: React.FC = () => { const accountingNull = lineItems.some((item) => item.account === null); // Info: (20241009 - Julian) 會計科目有應收付帳款時,顯示 Counterparty - const isAPorAR = lineItems.some((item) => - AccountTitlesOfAPandAR.includes(item.account?.name || '')); + const isAPorAR = lineItems.some((item) => { + return AccountCodesOfAPandAR.includes(item.account?.code || ''); + }); + + // Info: (20241009 - Julian) 會計科目有資產時,顯示 Asset + const isAsset = lineItems.some((item) => { + return AccountCodesOfAsset.includes(item.account?.code || ''); + }); + + // Info: (20241004 - Julian) 會計科目有應付帳款且借方有值 || 會計科目有應收帳款且貸方有值,顯示 Reverse + const isReverse = lineItems.some( + (item) => + (item.account?.code === '2170' && item.debit > 0) || // Info: (20241009 - Julian) 應付帳款 + (item.account?.code === '1172' && item.credit > 0) // Info: (20241009 - Julian) 應收帳款 + ); setTotalDebit(debitTotal); setTotalCredit(creditTotal); @@ -194,6 +167,8 @@ const NewVoucherForm: React.FC = () => { setIsAccountingNull(accountingNull); setIsCounterpartyRequired(isAPorAR); + setIsAssetRequired(isAsset); + setIsReverseRequired(isReverse); }, [lineItems]); useEffect(() => { @@ -782,29 +757,18 @@ const NewVoucherForm: React.FC = () => {
{/* Info: (20241009 - Julian) Asset */} -
- {/* Info: (20241009 - Julian) Asset Divider */} -
-
-
- asset_icon -

Asset

-
-
+ {isAssetRequired && ( +
+
- {/* Info: (20241009 - Julian) Asset block */} -
-
-

Empty

-

Please add at least 1 asset!

-
- + )} + {/* Info: (20240926 - Julian) Reverse */} + {isReverseRequired && ( +
+
-
- {/* Info: (20240926 - Julian) voucher line block */} + )} + {/* Info: (20240926 - Julian) Voucher line block */} {voucherLineBlock} {/* Info: (20240926 - Julian) buttons */}
diff --git a/src/components/voucher/reverse_section.tsx b/src/components/voucher/reverse_section.tsx new file mode 100644 index 000000000..e4b7c0b6a --- /dev/null +++ b/src/components/voucher/reverse_section.tsx @@ -0,0 +1,188 @@ +import React, { useState } from 'react'; +import Image from 'next/image'; +import { BsChevronDown } from 'react-icons/bs'; +import { FiTrash2 } from 'react-icons/fi'; +import { LuPlus } from 'react-icons/lu'; +import useOuterClick from '@/lib/hooks/use_outer_click'; +import { inputStyle } from '@/constants/display'; +import { IVoucherBeta, dummyVoucherList } from '@/interfaces/voucher'; +import { numberWithCommas } from '@/lib/utils/common'; +import { Button } from '@/components/button/button'; + +interface IReverseSectionProps { + // ToDo: (20241009 - Julian) 未選擇 + isShowReverseVoucherHint?: boolean; +} + +const ReverseLine: React.FC = ({ isShowReverseVoucherHint = false }) => { + const [selectedVoucher, setSelectedVoucher] = useState(null); + const [reverseAmountInput, setReverseAmountInput] = useState(''); + // ToDo: (20241009 - Julian) Send reverse amount to backend + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [reverseAmount, setReverseAmount] = useState(0); + + // Info: (20241009 - Julian) 選單顯示狀態 + const { + targetRef: voucherMenuRef, + componentVisible: isVoucherMenuVisible, + setComponentVisible: setVoucherMenuVisible, + } = useOuterClick(false); + + const toggleVoucherEditing = () => { + setVoucherMenuVisible(!isVoucherMenuVisible); + }; + + const changeReverseAmount = (e: React.ChangeEvent) => { + // Info: (20241009 - Julian) 限制只能輸入數字,並去掉開頭 0 + const value = e.target.value.replace(/\D/g, '').replace(/^0+/, ''); + // Info: (20241009 - Julian) 加入千分位逗號 + setReverseAmountInput(numberWithCommas(value)); + // Info: (20241009 - Julian) 設定 reverseAmount + setReverseAmount(Number(e.target.value)); + }; + + const displayedReverseVoucher = selectedVoucher ? ( +
+
+ {selectedVoucher.voucherNo} +
+
{selectedVoucher.counterparty.name}
+
+ {/* ToDo: (20241009 - Julian) 須確認這欄的內容 */} + {numberWithCommas(selectedVoucher.debit.reduce((acc, cur) => acc + cur, 0))}{' '} + TWD +
+
+ ) : ( +

+ Please select... +

+ ); + + const voucherDropdownMenu = isVoucherMenuVisible ? ( +
+ {dummyVoucherList.map((voucher) => { + const clickHandler = () => { + setSelectedVoucher(voucher); + setVoucherMenuVisible(false); + }; + + return ( +
+
{voucher.voucherNo}
+
{voucher.counterparty.name}
+
+ {/* ToDo: (20241009 - Julian) 須確認這欄的內容 */} + {numberWithCommas(voucher.debit.reduce((acc, cur) => acc + cur, 0))}{' '} + TWD +
+
+ ); + })} +
+ ) : null; + + return ( +
+ {/* Info: (20241009 - Julian) reverse voucher */} +
+

+ Reverse Voucher + * +

+
+ {displayedReverseVoucher} +
+ +
+ {voucherDropdownMenu} +
+
+ {/* Info: (20241009 - Julian) reverse amount */} +
+

+ Reverse Amount + * +

+
+ +
+ tw_icon +

TWD

+
+
+
+ {/* Info: (20241009 - Julian) delete button */} + +
+ ); +}; + +const ReverseSection: React.FC = () => { + const [reverseLineItems, setReverseLineItems] = useState([1]); + + // ToDo: (20241009 - Julian) Implement addReverseLineItem + const addReverseLineItem = () => { + setReverseLineItems([...reverseLineItems, reverseLineItems.length + 1]); + }; + + // ToDo: (20241009 - Julian) 🔧施工中 + // eslint-disable-next-line react/no-array-index-key + const displayedReverseLineItems = reverseLineItems.map((_, index) => ); + + return ( + <> + {/* Info: (20241009 - Julian) Reverse Divider */} +
+
+
+ bell_icon +

Reverse

+
+
+
+ +
+ {/* Info: (20241009 - Julian) reverse voucher list */} +
{displayedReverseLineItems}
+ +
+ + ); +}; + +export default ReverseSection; diff --git a/src/components/voucher/voucher_line_item.tsx b/src/components/voucher/voucher_line_item.tsx index 4130156f8..9990206c2 100644 --- a/src/components/voucher/voucher_line_item.tsx +++ b/src/components/voucher/voucher_line_item.tsx @@ -152,8 +152,8 @@ const VoucherLineItem: React.FC = ({ }; const debitInputChangeHandler = (e: React.ChangeEvent) => { - // Info: (20241001 - Julian) 限制只能輸入數字 - const debitValue = e.target.value.replace(/\D/g, ''); + // Info: (20241001 - Julian) 限制只能輸入數字,並去掉開頭 0 + const debitValue = e.target.value.replace(/\D/g, '').replace(/^0+/, ''); // Info: (20241001 - Julian) 加入千分位逗號 setDebitInput(numberWithCommas(debitValue)); // Info: (20241001 - Julian) 設定 Debit @@ -161,8 +161,8 @@ const VoucherLineItem: React.FC = ({ }; const creditInputChangeHandler = (e: React.ChangeEvent) => { - // Info: (20241001 - Julian) 限制只能輸入數字 - const creditValue = e.target.value.replace(/\D/g, ''); + // Info: (20241001 - Julian) 限制只能輸入數字,並去掉開頭 0 + const creditValue = e.target.value.replace(/\D/g, '').replace(/^0+/, ''); // Info: (20241001 - Julian) 加入千分位逗號 setCreditInput(numberWithCommas(creditValue)); // Info: (20241001 - Julian) 設定 Credit diff --git a/src/constants/asset.ts b/src/constants/asset.ts index adcec1906..940c34be4 100644 --- a/src/constants/asset.ts +++ b/src/constants/asset.ts @@ -5,3 +5,67 @@ export enum AssetStatus { MISSING = 'missing', NORMAL = 'normal', } + +export const AccountCodesOfAsset = [ + '1602', // 土地成本 + '1606', // 土地改良物成本 + '1611', // 房屋及建築成本 + '1616', // 機器設備成本 + '1621', // 裝卸設備成本 + '1626', // 倉儲設備成本 + '1631', // 售氣及輸氣設備成本 + '1636', // 模具設備成本 + '1641', // 水電設備成本 + '1646', // 冷凍設備成本 + '1651', // 漁船設備成本 + '1656', // 電腦通訊設備成本 + '1661', // 試驗設備成本 + '1666', // 污染防治設備成本 + '1671', // 運輸設備成本 + '1676', // 船舶設備成本 + '1681', // 碼頭設備成本 + '1686', // 飛航設備成本 + '1691', // 辦公設備成本 + '1696', // 營業器具成本(觀光飯店業適用) + '1701', // 機具設備成本 + '1706', // 遊樂設備成本 + '1711', // 景觀園藝成本 + '1716', // 租賃資產成本 + '1721', // 出租資產-機器設備成本 + '1726', // 出租資產-其他成本 + '1731', // 租賃改良成本 + '1736', // 其他設備成本 + '1740', // 未完工程及待驗設備 + '1746', // 生產性植物成本 + '1751', // 礦產資源成本 + '17AA', // 使用權資產-土地成本 + '17BA', // 使用權資產-土地改良物成本 + '17CA', // 使用權資產-房屋及建築成本 + '17DA', // 使用權資產-機器設備成本 + '17EA', // 使用權資產-運輸設備成本 + '17FA', // 使用權資產-辦公設備成本 + '17GA', // 使用權資產-其他資產成本 + '1761', // 投資性不動產-土地 + '1765', // 投資性不動產-建築物 + '1771', // 投資性不動產-租賃權益 + '1776', // 投資性不動產-使用權資產 + '1773', // 建造中之投資性不動產 + '1782', // 商標權 + '1786', // 專利權 + '1792', // 特許權 + '1796', // 著作權 + '1802', // 電腦軟體 + '1805', // 商譽 + '1812', // 專門技術 + '1822', // 其他無形資產 + '1826', // 發展中之無形資產 + '1831', // 消耗性生物資產-非流動 + '1835', // 生產性生物資產-非流動 + '1906', // 有形探勘及評估資產成本 + '1911', // 無形探勘及評估資產成本 +]; + +export const AccountCodesOfAPandAR = [ + '1172', // 應收帳款 + '2170', // 應付帳款 +]; diff --git a/src/constants/display.ts b/src/constants/display.ts index 2520f6a30..e748997e2 100644 --- a/src/constants/display.ts +++ b/src/constants/display.ts @@ -66,6 +66,14 @@ export const default30DayPeriodInSec = { export const MILLISECONDS_IN_A_SECOND = 1000; +// Info: (20241009 - Julian) input CSS style +export const inputStyle = { + NORMAL: + 'border-input-stroke-input text-input-text-input-filled placeholder:text-input-text-input-placeholder disabled:text-input-text-input-placeholder', + ERROR: + 'border-input-text-error text-input-text-error placeholder:text-input-text-error disabled:text-input-text-error', +}; + // Info: (20240429 - Julian) checkbox CSS style export const checkboxStyle = 'relative h-16px w-16px appearance-none rounded-xxs border border-checkbox-stroke-unselected bg-white outline-none after:absolute after:top-0 after:-mt-3px after:ml-px after:hidden after:text-sm after:text-checkbox-stroke-check-mark after:content-checked checked:bg-checkbox-surface-selected checked:after:block'; diff --git a/src/interfaces/counterparty.ts b/src/interfaces/counterparty.ts new file mode 100644 index 000000000..d159225a8 --- /dev/null +++ b/src/interfaces/counterparty.ts @@ -0,0 +1,34 @@ +export interface ICounterparty { + id: number; + code: string; + name: string; +} + +// ToDo: (20241004 - Julian) dummy data +export const dummyCounterparty: ICounterparty[] = [ + { + id: 1, + code: '59382730', + name: 'Padberg LLC', + }, + { + id: 2, + code: '59382731', + name: 'Hermiston - West', + }, + { + id: 3, + code: '59382732', + name: 'Feil, Ortiz and Lebsack', + }, + { + id: 4, + code: '59382733', + name: 'Romaguera Inc', + }, + { + id: 5, + code: '59382734', + name: 'Stamm - Baumbach', + }, +]; From 072f1da096e3ef41d1e04d8940b908f2d2cfd507 Mon Sep 17 00:00:00 2001 From: Liz Date: Wed, 9 Oct 2024 18:24:04 +0800 Subject: [PATCH 20/29] JobRecordPage UI --- package.json | 2 +- public/images/fake_job_avatar_01.svg | 4 + public/images/fake_job_avatar_02.svg | 4 + .../beta/select_role/introduction.tsx | 20 ++- src/constants/url.ts | 2 + src/pages/beta/job_record.tsx | 140 ++++++++++++++++++ tailwind.config.ts | 4 + 7 files changed, 167 insertions(+), 9 deletions(-) create mode 100644 public/images/fake_job_avatar_01.svg create mode 100644 public/images/fake_job_avatar_02.svg create mode 100644 src/pages/beta/job_record.tsx diff --git a/package.json b/package.json index 038ad00ab..9e140cedf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+38", + "version": "0.8.2+39", "private": false, "scripts": { "dev": "next dev", diff --git a/public/images/fake_job_avatar_01.svg b/public/images/fake_job_avatar_01.svg new file mode 100644 index 000000000..7e89c9a19 --- /dev/null +++ b/public/images/fake_job_avatar_01.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/fake_job_avatar_02.svg b/public/images/fake_job_avatar_02.svg new file mode 100644 index 000000000..86ba0a295 --- /dev/null +++ b/public/images/fake_job_avatar_02.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/components/beta/select_role/introduction.tsx b/src/components/beta/select_role/introduction.tsx index 9d41d0cf8..e7b54296a 100644 --- a/src/components/beta/select_role/introduction.tsx +++ b/src/components/beta/select_role/introduction.tsx @@ -3,6 +3,8 @@ import Image from 'next/image'; import { FiEye, FiArrowRight } from 'react-icons/fi'; import { RoleId } from '@/constants/role'; import { useUserCtx } from '@/contexts/user_context'; +import Link from 'next/link'; +import { ISUNFA_ROUTE } from '@/constants/url'; interface IntroductionProps { showingRole: React.SetStateAction; @@ -62,14 +64,16 @@ const Buttons: React.FC = ({ togglePreviewModal, showingRole }) => - + + +
); }; diff --git a/src/constants/url.ts b/src/constants/url.ts index 725481597..f52699ed9 100644 --- a/src/constants/url.ts +++ b/src/constants/url.ts @@ -17,6 +17,8 @@ export const ISUNFA_ROUTE = { LOGIN: '/users/login', BETA_LOGIN: '/beta/login', // Info: (20241001 - Liz) Beta login EXAMPLE: '/beta/example', // Info: (20241001 - Liz) Beta example page for testing login + SELECT_ROLE: '/beta/select_role', + JOB_RECORD: '/beta/job_record', DASHBOARD: '/users/dashboard', KYC: '/users/kyc', diff --git a/src/pages/beta/job_record.tsx b/src/pages/beta/job_record.tsx new file mode 100644 index 000000000..d6ab8d838 --- /dev/null +++ b/src/pages/beta/job_record.tsx @@ -0,0 +1,140 @@ +import Image from 'next/image'; +import I18n from '@/components/i18n/i18n'; +import { FiHome, FiArrowRight } from 'react-icons/fi'; +import { TbLogout } from 'react-icons/tb'; +import { HiPlus } from 'react-icons/hi2'; +import { RoleId } from '@/constants/role'; +import Link from 'next/link'; +import { ISUNFA_ROUTE } from '@/constants/url'; +import { useUserCtx } from '@/contexts/user_context'; + +interface JobRecordCardProps { + roleName: string; + roleIconSrc: string; + roleAltText: string; + jobAvatarSrc: string; + jonAltText: string; + lastLoginTime: string; +} + +const jobsRecords = [ + { + jobId: 1, + roleId: RoleId.BOOKKEEPER, + roleName: 'Bookkeeper', + roleIconSrc: '/icons/information_desk.svg', + roleAltText: 'information_desk', + jobAvatarSrc: '/images/fake_job_avatar_01.svg', + jonAltText: 'fake_job_avatar_01', + lastLoginTime: '2024/09/09 15:30:30', + }, + { + jobId: 2, + roleId: RoleId.EDUCATIONAL_TRIAL_VERSION, + roleName: 'Educational', + roleIconSrc: '/icons/graduation_cap.svg', + roleAltText: 'graduation_cap', + jobAvatarSrc: '/images/fake_job_avatar_02.svg', + jonAltText: 'fake_job_avatar_02', + lastLoginTime: '2024/09/09 15:30:30', + }, +]; + +const JobRecordCard = ({ + roleName, + roleIconSrc, + roleAltText, + jobAvatarSrc, + jonAltText, + lastLoginTime, +}: JobRecordCardProps) => { + // ToDo: (20241009 - Liz) 選擇 Job 功能 + const handleStart = () => { + // Deprecated: (20241009 - Liz) + // eslint-disable-next-line no-console + console.log('選擇這個 Job 來開始工作'); + }; + + return ( +
+
+ {roleAltText} +
+ +

{roleName}

+ + {jonAltText} + +
+

Last Login Time

+ +

{lastLoginTime}

+
+ + +
+ ); +}; + +const JobRecordPage = () => { + const { signOut } = useUserCtx(); + + return ( +
+
+ +
+ + + {/* // ToDo: (20241009 - Liz) 回到主頁功能 */} + +
+ + + + {/* // Info: (20241009 - Liz) Job Record Cards */} +
+ {jobsRecords.map((jobRecord) => ( + + ))} + + + + +
+
+ ); +}; + +export default JobRecordPage; diff --git a/tailwind.config.ts b/tailwind.config.ts index 149390285..d6aaaa74e 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -1317,6 +1317,10 @@ module.exports = { Dropshadow_XS: '0px 2px 5px var(--shadow-lv-5, rgba(49, 67, 98, 0.10)), 0px 6px 10px var(--shadow-lv-4, rgba(49, 67, 98, 0.09)), 0px 11px 13px var(--shadow-lv-3, rgba(49, 67, 98, 0.05)), 0px 28px 15px var(--shadow-lv-2, rgba(49, 67, 98, 0.01)), 0px 50px 17px var(--shadow-lv-1, rgba(49, 67, 98, 0.00))', + + // Shadow/Down/Dropshadow_S + Dropshadow_S: + '0px 83px 23px 0px var(--shadow-lv-1, rgba(49, 67, 98, 0.00)), 0px 53px 21px 0px var(--shadow-lv-2, rgba(49, 67, 98, 0.01)), 0px 30px 18px 0px var(--shadow-lv-3, rgba(49, 67, 98, 0.05)), 0px 13px 13px 0px var(--shadow-lv-4, rgba(49, 67, 98, 0.09)), 0px 3px 7px 0px var(--shadow-lv-5, rgba(49, 67, 98, 0.10))', }, dropShadow: { lg: '0 4px 10px rgba(0,0,0,0.7)', From d9b3b8c73211ba73a0d35f697c6b2da56eb589fa Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 9 Oct 2024 19:02:04 +0800 Subject: [PATCH 21/29] Feat: translate --- package.json | 2 +- src/components/voucher/asset_section.tsx | 10 ++-- src/components/voucher/new_voucher_form.tsx | 10 +++- src/components/voucher/reverse_section.tsx | 15 +++-- src/constants/asset.ts | 2 +- src/locales/cn/journal.json | 12 ++++ src/locales/en/journal.json | 12 ++++ src/locales/tw/journal.json | 12 ++++ .../users/accounting/add_new_voucher.tsx | 59 +++++++++++++++---- 9 files changed, 107 insertions(+), 27 deletions(-) diff --git a/package.json b/package.json index 9e140cedf..1394b8f5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+39", + "version": "0.8.2+40", "private": false, "scripts": { "dev": "next dev", diff --git a/src/components/voucher/asset_section.tsx b/src/components/voucher/asset_section.tsx index 0d58ea807..c524ffb33 100644 --- a/src/components/voucher/asset_section.tsx +++ b/src/components/voucher/asset_section.tsx @@ -1,10 +1,12 @@ import React, { useState } from 'react'; import Image from 'next/image'; +import { useTranslation } from 'next-i18next'; import { FiEdit, FiPlus, FiTrash2 } from 'react-icons/fi'; import { Button } from '@/components/button/button'; import { IAssetItem, mockAssetItem } from '@/interfaces/asset'; const AssetSection: React.FC = () => { + const { t } = useTranslation('common'); const [assets, setAssets] = useState([]); // ToDo: (20241009 - Julian) Replace with real function to add asset @@ -63,8 +65,8 @@ const AssetSection: React.FC = () => { }) ) : (
-

Empty

-

Please add at least 1 asset!

+

{t('common:COMMON.EMPTY')}

+

{t('journal:ASSET_SECTION.EMPTY_HINT')}

); @@ -75,7 +77,7 @@ const AssetSection: React.FC = () => {
asset_icon -

Asset

+

{t('journal:ASSET_SECTION.TITLE')}


@@ -84,7 +86,7 @@ const AssetSection: React.FC = () => { {displayedAssetList}
diff --git a/src/components/voucher/new_voucher_form.tsx b/src/components/voucher/new_voucher_form.tsx index 668afd198..40c493dea 100644 --- a/src/components/voucher/new_voucher_form.tsx +++ b/src/components/voucher/new_voucher_form.tsx @@ -279,11 +279,15 @@ const NewVoucherForm: React.FC = () => { setRecurringMenuOpen(!isRecurringMenuOpen); }; - // ToDo: (20240926 - Julian) type 字串轉換 + // Info: (20240926 - Julian) type 字串轉換 const translateType = (voucherType: string) => { return t(`journal:ADD_NEW_VOUCHER.TYPE_${voucherType.toUpperCase()}`); }; + const translateUnit = (unit: RecurringUnit) => { + return t(`common:COMMON.${unit.toUpperCase()}`); + }; + // Info: (20241004 - Julian) 清空表單 const clearAllHandler = () => { setDate(default30DayPeriodInSec); @@ -573,7 +577,7 @@ const NewVoucherForm: React.FC = () => { className="py-8px hover:bg-dropdown-surface-menu-background-secondary" onClick={recurringUnitClickHandler} > - {t(`common:COMMON.${unit.toUpperCase()}`)} + {translateUnit(unit)} ); })} @@ -742,7 +746,7 @@ const NewVoucherForm: React.FC = () => { onClick={recurringUnitToggleHandler} className="relative flex flex-1 items-center justify-between px-12px py-10px text-input-text-input-filled hover:cursor-pointer" > -

{recurringUnit}

+

{translateUnit(recurringUnit)}

{/* Info: (20240926 - Julian) recurring unit dropdown */} {recurringUnitMenu} diff --git a/src/components/voucher/reverse_section.tsx b/src/components/voucher/reverse_section.tsx index e4b7c0b6a..85e03cd00 100644 --- a/src/components/voucher/reverse_section.tsx +++ b/src/components/voucher/reverse_section.tsx @@ -1,5 +1,6 @@ import React, { useState } from 'react'; import Image from 'next/image'; +import { useTranslation } from 'next-i18next'; import { BsChevronDown } from 'react-icons/bs'; import { FiTrash2 } from 'react-icons/fi'; import { LuPlus } from 'react-icons/lu'; @@ -15,6 +16,8 @@ interface IReverseSectionProps { } const ReverseLine: React.FC = ({ isShowReverseVoucherHint = false }) => { + const { t } = useTranslation('common'); + const [selectedVoucher, setSelectedVoucher] = useState(null); const [reverseAmountInput, setReverseAmountInput] = useState(''); // ToDo: (20241009 - Julian) Send reverse amount to backend @@ -57,7 +60,7 @@ const ReverseLine: React.FC = ({ isShowReverseVoucherHint

- Please select... + {t('journal:REVERSE_SECTION.REVERSE_VOUCHER_PLACEHOLDER')}

); @@ -96,7 +99,7 @@ const ReverseLine: React.FC = ({ isShowReverseVoucherHint {/* Info: (20241009 - Julian) reverse voucher */}

- Reverse Voucher + {t('journal:REVERSE_SECTION.REVERSE_VOUCHER')} *

= ({ isShowReverseVoucherHint {/* Info: (20241009 - Julian) reverse amount */}

- Reverse Amount + {t('journal:REVERSE_SECTION.REVERSE_AMOUNT')} *

@@ -146,6 +149,8 @@ const ReverseLine: React.FC = ({ isShowReverseVoucherHint }; const ReverseSection: React.FC = () => { + const { t } = useTranslation('common'); + const [reverseLineItems, setReverseLineItems] = useState([1]); // ToDo: (20241009 - Julian) Implement addReverseLineItem @@ -164,7 +169,7 @@ const ReverseSection: React.FC = () => {
bell_icon -

Reverse

+

{t('journal:REVERSE_SECTION.TITLE')}


@@ -178,7 +183,7 @@ const ReverseSection: React.FC = () => { onClick={addReverseLineItem} > -

Add more reverse voucher

+

{t('journal:REVERSE_SECTION.ADD_BTN')}

diff --git a/src/constants/asset.ts b/src/constants/asset.ts index 940c34be4..77b5c7f57 100644 --- a/src/constants/asset.ts +++ b/src/constants/asset.ts @@ -67,5 +67,5 @@ export const AccountCodesOfAsset = [ export const AccountCodesOfAPandAR = [ '1172', // 應收帳款 - '2170', // 應付帳款 + '2171', // 應付帳款 ]; diff --git a/src/locales/cn/journal.json b/src/locales/cn/journal.json index 00fdb8489..17cc25fee 100644 --- a/src/locales/cn/journal.json +++ b/src/locales/cn/journal.json @@ -246,5 +246,17 @@ "INCOME": "收益", "EXPENSE": "支出", "GAIN_OR_LOSS": "收益或损失" + }, + "ASSET_SECTION": { + "TITLE": "资产", + "EMPTY_HINT": "请新增至少 1 笔资产!", + "ADD_BTN": "新增资产" + }, + "REVERSE_SECTION": { + "TITLE": "冲销", + "REVERSE_VOUCHER": "冲销传票", + "REVERSE_VOUCHER_PLACEHOLDER": "请选择...", + "REVERSE_AMOUNT": "冲销金额", + "ADD_BTN": "新增更多冲销传票" } } diff --git a/src/locales/en/journal.json b/src/locales/en/journal.json index e1eaff797..5166f8baf 100644 --- a/src/locales/en/journal.json +++ b/src/locales/en/journal.json @@ -246,5 +246,17 @@ "INCOME": "Income", "EXPENSE": "Expenses", "GAIN_OR_LOSS": "Gain or Loss" + }, + "ASSET_SECTION": { + "TITLE": "Asset", + "EMPTY_HINT": "Please add at least 1 asset!", + "ADD_BTN": "Add New Asset" + }, + "REVERSE_SECTION": { + "TITLE": "Reverse", + "REVERSE_VOUCHER": "Reverse Voucher", + "REVERSE_VOUCHER_PLACEHOLDER": "Please select...", + "REVERSE_AMOUNT": "Reverse Amount", + "ADD_BTN": "Add more reverse voucher" } } diff --git a/src/locales/tw/journal.json b/src/locales/tw/journal.json index 4fe1abfb6..156703e06 100644 --- a/src/locales/tw/journal.json +++ b/src/locales/tw/journal.json @@ -246,5 +246,17 @@ "INCOME": "收益", "EXPENSE": "支出", "GAIN_OR_LOSS": "收益或損失" + }, + "ASSET_SECTION": { + "TITLE": "資產", + "EMPTY_HINT": "請新增至少 1 筆資產!", + "ADD_BTN": "新增資產" + }, + "REVERSE_SECTION": { + "TITLE": "沖銷", + "REVERSE_VOUCHER": "沖銷傳票", + "REVERSE_VOUCHER_PLACEHOLDER": "請選擇...", + "REVERSE_AMOUNT": "沖銷金額", + "ADD_BTN": "新增更多沖銷傳票" } } diff --git a/src/pages/users/accounting/add_new_voucher.tsx b/src/pages/users/accounting/add_new_voucher.tsx index 36dcb6a8e..f0a85c5ab 100644 --- a/src/pages/users/accounting/add_new_voucher.tsx +++ b/src/pages/users/accounting/add_new_voucher.tsx @@ -5,10 +5,37 @@ import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import { ILocale } from '@/interfaces/locale'; import NewVoucherForm from '@/components/voucher/new_voucher_form'; +// Info: (20241009 - Julian) For layout testing, to be removed +enum SidebarState { + COLLAPSED = 'collapsed', + OPEN = 'open', + EXPANDED = 'expanded', +} + const AddNewVoucherPage: React.FC = () => { const { t } = useTranslation('common'); - const [isSidebarOpen, setIsSidebarOpen] = useState(true); + const [sidebarState, setSidebarState] = useState(SidebarState.OPEN); + + const isSidebarCollapsed = sidebarState === SidebarState.COLLAPSED; + const isSidebarOpen = sidebarState === SidebarState.OPEN; + const isSidebarExpanded = sidebarState === SidebarState.EXPANDED; + + const toggleSidebar = () => { + if (isSidebarCollapsed) { + setSidebarState(SidebarState.OPEN); + } else { + setSidebarState(SidebarState.COLLAPSED); + } + }; + + const expandSidebar = () => { + if (isSidebarOpen) { + setSidebarState(SidebarState.EXPANDED); + } else { + setSidebarState(SidebarState.OPEN); + } + }; return ( <> @@ -19,28 +46,34 @@ const AddNewVoucherPage: React.FC = () => { {t('journal:ADD_NEW_VOUCHER.PAGE_TITLE')} - iSunFA - -
- This is header +
+
+ This is sidebar + +
+
+ Expand Area +
- This is sidebar + This is header
{/* Info: (20240925 - Julian) Body */}
From 03d3380b1f6be40fc5f8e8ed5682db18647dd9b6 Mon Sep 17 00:00:00 2001 From: Luphia Chang Date: Wed, 9 Oct 2024 19:09:47 +0800 Subject: [PATCH 22/29] Update upload.ts --- src/pages/api/v2/upload.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/api/v2/upload.ts b/src/pages/api/v2/upload.ts index 81ea99294..33948e00d 100644 --- a/src/pages/api/v2/upload.ts +++ b/src/pages/api/v2/upload.ts @@ -34,6 +34,7 @@ async function handlePostRequest(req: NextApiRequest) { const parsedForm = await parseForm(req, UPLOAD_TYPE_TO_FOLDER_MAP[type], token as string); // TODO: (20241011 - tzuhan) Handle file upload logic here, save to DB + // Deprecated: (20241011-tzuhan) Debugging purpose // eslint-disable-next-line no-console console.log(`API POST companyId(${companyId}) parsedForm: `, parsedForm); @@ -69,7 +70,7 @@ export default async function handler( ({ statusMessage, payload } = await handleRequest(req, res)); } else { statusMessage = STATUS_MESSAGE.METHOD_NOT_ALLOWED; - + // Deprecated: (20241011-tzuhan) Debugging purpose // eslint-disable-next-line no-console console.error('Failed to send certificates update via Pusher', `METHOD_NOT_ALLOWED`); } From e4ebee371e789a812050c8c236a26f98dd1bd2dc Mon Sep 17 00:00:00 2001 From: Luphia Chang Date: Wed, 9 Oct 2024 19:11:12 +0800 Subject: [PATCH 23/29] Update certificate_list.tsx --- src/pages/users/accounting/certificate_list.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/users/accounting/certificate_list.tsx b/src/pages/users/accounting/certificate_list.tsx index 74593713a..1e211fb41 100644 --- a/src/pages/users/accounting/certificate_list.tsx +++ b/src/pages/users/accounting/certificate_list.tsx @@ -48,6 +48,7 @@ const CertificateListPage: React.FC = () => { 0: false, 1: false, }); + // Deprecated: (20241011-tzuhan) Debugging purpose // eslint-disable-next-line @typescript-eslint/no-unused-vars const [uploadingCertificates, setUploadingCertificates, uploadingCertificatesRef] = useStateRef<{ [id: number]: ICertificateInfo; From 19488180fb0eb59afcbe2f227b18d6186699efa1 Mon Sep 17 00:00:00 2001 From: Luphia Chang Date: Wed, 9 Oct 2024 19:22:07 +0800 Subject: [PATCH 24/29] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9e140cedf..1394b8f5d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+39", + "version": "0.8.2+40", "private": false, "scripts": { "dev": "next dev", From 1326bee55b7a810a4b8d0fdde924dd50201ea93a Mon Sep 17 00:00:00 2001 From: Luphia Chang Date: Wed, 9 Oct 2024 19:38:59 +0800 Subject: [PATCH 25/29] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1394b8f5d..0a042d616 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+40", + "version": "0.8.2+41", "private": false, "scripts": { "dev": "next dev", From ba3b599e380615d9161efff1b052a57cd9a570b1 Mon Sep 17 00:00:00 2001 From: Luphia Chang Date: Wed, 9 Oct 2024 19:45:18 +0800 Subject: [PATCH 26/29] Update reverse_section.tsx --- src/components/voucher/reverse_section.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/voucher/reverse_section.tsx b/src/components/voucher/reverse_section.tsx index 85e03cd00..aafa8e9d7 100644 --- a/src/components/voucher/reverse_section.tsx +++ b/src/components/voucher/reverse_section.tsx @@ -21,6 +21,7 @@ const ReverseLine: React.FC = ({ isShowReverseVoucherHint const [selectedVoucher, setSelectedVoucher] = useState(null); const [reverseAmountInput, setReverseAmountInput] = useState(''); // ToDo: (20241009 - Julian) Send reverse amount to backend + // Deprecated: (20241009 - Julian) code incomplete // eslint-disable-next-line @typescript-eslint/no-unused-vars const [reverseAmount, setReverseAmount] = useState(0); @@ -159,6 +160,7 @@ const ReverseSection: React.FC = () => { }; // ToDo: (20241009 - Julian) 🔧施工中 + // Deprecated: (20241009 - Julian) code incomplete // eslint-disable-next-line react/no-array-index-key const displayedReverseLineItems = reverseLineItems.map((_, index) => ); From 9246b822122ce2a34885d8a2902508d5b177f2d2 Mon Sep 17 00:00:00 2001 From: Tiny_Murky Date: Fri, 11 Oct 2024 11:09:26 +0800 Subject: [PATCH 27/29] fix income statement report --- package.json | 2 +- .../income_statement_report_body_all.tsx | 229 +++--------------- .../income_statement_report_table_row.tsx | 48 ++++ 3 files changed, 77 insertions(+), 202 deletions(-) create mode 100644 src/components/income_statement_report_body/income_statement_report_table_row.tsx diff --git a/package.json b/package.json index dbe9de626..a9c93ac60 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+41", + "version": "0.8.2+42", "private": false, "scripts": { "dev": "next dev", diff --git a/src/components/income_statement_report_body/income_statement_report_body_all.tsx b/src/components/income_statement_report_body/income_statement_report_body_all.tsx index f6a744bc6..d045a1294 100644 --- a/src/components/income_statement_report_body/income_statement_report_body_all.tsx +++ b/src/components/income_statement_report_body/income_statement_report_body_all.tsx @@ -9,6 +9,7 @@ import Image from 'next/image'; import React, { useState } from 'react'; import { format } from 'date-fns'; import CollapseButton from '@/components/button/collapse_button'; +import IncomeStatementReportTableRow from './income_statement_report_table_row'; interface IIncomeStatementReportBodyAllProps { reportId: string; @@ -180,31 +181,9 @@ const IncomeStatementReportBodyAll = ({ reportId }: IIncomeStatementReportBodyAl {reportFinancial && reportFinancial.general && - reportFinancial.general.slice(0, 10).map((value) => ( - - - {value.code} - - - {value.name} - - - {value.curPeriodAmount} - - - {value.curPeriodPercentage} - - - {value.prePeriodAmount} - - - {value.prePeriodPercentage} - - - ))} + reportFinancial.general + .slice(0, 10) + .map((value) => )} )} @@ -277,28 +256,9 @@ const IncomeStatementReportBodyAll = ({ reportId }: IIncomeStatementReportBodyAl {reportFinancial && reportFinancial.general && - reportFinancial.general.slice(10, 24).map((value) => ( - - - {value.code} - - - {value.name} - - - {value.curPeriodAmount} - - - {value.curPeriodPercentage} - - - {value.prePeriodAmount} - - - {value.prePeriodPercentage} - - - ))} + reportFinancial.general + .slice(10, 24) + .map((value) => )} @@ -368,28 +328,9 @@ const IncomeStatementReportBodyAll = ({ reportId }: IIncomeStatementReportBodyAl {reportFinancial && reportFinancial.general && - reportFinancial.general.slice(24, 33).map((value) => ( - - - {value.code} - - - {value.name} - - - {value.curPeriodAmount} - - - {value.curPeriodPercentage} - - - {value.prePeriodAmount} - - - {value.prePeriodPercentage} - - - ))} + reportFinancial.general + .slice(24, 33) + .map((value) => )}   @@ -411,28 +352,9 @@ const IncomeStatementReportBodyAll = ({ reportId }: IIncomeStatementReportBodyAl {reportFinancial && reportFinancial.general && - reportFinancial.general.slice(34, 36).map((value) => ( - - - {value.code} - - - {value.name} - - - {value.curPeriodAmount} - - -   - - - {value.prePeriodAmount} - - -   - - - ))} + reportFinancial.general + .slice(34, 36) + .map((value) => )}
@@ -515,28 +437,9 @@ const IncomeStatementReportBodyAll = ({ reportId }: IIncomeStatementReportBodyAl {reportFinancial && reportFinancial.details && - reportFinancial.details.slice(0, 15).map((value) => ( - - - {value.code} - - - {value.name} - - - {value.curPeriodAmount} - - - {value.curPeriodPercentage} - - - {value.prePeriodAmount} - - - {value.prePeriodPercentage} - - - ))} + reportFinancial.details + .slice(0, 15) + .map((value) => )} )} @@ -607,28 +510,9 @@ const IncomeStatementReportBodyAll = ({ reportId }: IIncomeStatementReportBodyAl {reportFinancial && reportFinancial.details && - reportFinancial.details.slice(15, 28).map((value) => ( - - - {value.code} - - - {value.name} - - - {value.curPeriodAmount} - - - {value.curPeriodPercentage} - - - {value.prePeriodAmount} - - - {value.prePeriodPercentage} - - - ))} + reportFinancial.details + .slice(15, 28) + .map((value) => )} @@ -698,28 +582,9 @@ const IncomeStatementReportBodyAll = ({ reportId }: IIncomeStatementReportBodyAl {reportFinancial && reportFinancial.details && - reportFinancial.details.slice(28, 39).map((value) => ( - - - {value.code} - - - {value.name} - - - {value.curPeriodAmount} - - - {value.curPeriodPercentage} - - - {value.prePeriodAmount} - - - {value.prePeriodPercentage} - - - ))} + reportFinancial.details + .slice(28, 39) + .map((value) => )} @@ -791,28 +656,9 @@ const IncomeStatementReportBodyAll = ({ reportId }: IIncomeStatementReportBodyAl {reportFinancial && reportFinancial.details && - reportFinancial.details.slice(39, 49).map((value) => ( - - - {value.code} - - - {value.name} - - - {value.curPeriodAmount} - - - {value.curPeriodPercentage} - - - {value.prePeriodAmount} - - - {value.prePeriodPercentage} - - - ))} + reportFinancial.details + .slice(39, 49) + .map((value) => )} @@ -882,28 +728,9 @@ const IncomeStatementReportBodyAll = ({ reportId }: IIncomeStatementReportBodyAl {reportFinancial && reportFinancial.details && - reportFinancial.details.slice(49, 58).map((value) => ( - - - {value.code} - - - {value.name} - - - {value.curPeriodAmount} - - - {value.curPeriodPercentage} - - - {value.prePeriodAmount} - - - {value.prePeriodPercentage} - - - ))} + reportFinancial.details + .slice(49, 58) + .map((value) => )} {reportFinancial && diff --git a/src/components/income_statement_report_body/income_statement_report_table_row.tsx b/src/components/income_statement_report_body/income_statement_report_table_row.tsx new file mode 100644 index 000000000..f8553e340 --- /dev/null +++ b/src/components/income_statement_report_body/income_statement_report_table_row.tsx @@ -0,0 +1,48 @@ +import { FinancialReportItem } from '@/interfaces/report'; +import { numberBeDashIfFalsy } from '@/lib/utils/common'; + +function IncomeStatementReportTableRow({ + code, + curPeriodAmount, + curPeriodPercentage, + prePeriodAmount, + prePeriodPercentage, + name, +}: FinancialReportItem) { + /** + * Info: (20241011 - Murky) + * 將Income statement 當中沒有code 的欄位,呈現的數字變成空字串 + */ + const isCodeExist = code.length > 0; + const idCode = isCodeExist ? code : Math.random().toString(36).slice(0, 4); + const displayCode = isCodeExist ? code : ''; + const displayCurPeriodAmount: string = isCodeExist ? numberBeDashIfFalsy(curPeriodAmount) : ''; + const displayCurPeriodPercentage: string = isCodeExist + ? numberBeDashIfFalsy(curPeriodPercentage) + : ''; + const displayPrePeriodAmount: string = isCodeExist ? numberBeDashIfFalsy(prePeriodAmount) : ''; + const displayPrePeriodPercentage: string = isCodeExist + ? numberBeDashIfFalsy(prePeriodPercentage) + : ''; + + return ( + + {displayCode} + {name} + + {displayCurPeriodAmount} + + + {displayCurPeriodPercentage} + + + {displayPrePeriodAmount} + + + {displayPrePeriodPercentage} + + + ); +} + +export default IncomeStatementReportTableRow; From 4f39f6707fdad3eb5f6d6d69dcab354d4e3ba610 Mon Sep 17 00:00:00 2001 From: Tiny_Murky Date: Fri, 11 Oct 2024 13:53:47 +0800 Subject: [PATCH 28/29] balance sheet Accumulate complete --- package.json | 2 +- src/constants/account.ts | 12 +++ src/lib/utils/common.ts | 7 +- .../utils/report/balance_sheet_generator.ts | 84 ++++++++++++++++--- 4 files changed, 92 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index a9c93ac60..1e5effa30 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+42", + "version": "0.8.2+43", "private": false, "scripts": { "dev": "next dev", diff --git a/src/constants/account.ts b/src/constants/account.ts index dc46aeb94..899bfb996 100644 --- a/src/constants/account.ts +++ b/src/constants/account.ts @@ -306,6 +306,18 @@ export const SPECIAL_ACCOUNTS: { rootCode: '3350', level: 3, }, + ACCUMULATED_PROFIT_AND_LOSS: { + system: 'IFRS', + type: AccountType.EQUITY, + debit: false, + liquidity: false, + code: '3351', + name: '累積盈虧', + forUser: true, + parentCode: '3350', + rootCode: '3350', + level: 3, + }, OTHER_EQUITY_OTHER: { system: 'IFRS', type: AccountType.EQUITY, diff --git a/src/lib/utils/common.ts b/src/lib/utils/common.ts index 4f478bcd7..6211d7506 100644 --- a/src/lib/utils/common.ts +++ b/src/lib/utils/common.ts @@ -459,8 +459,11 @@ export function setTimestampToDayStart(timestamp: number) { return timestampInSeconds(date.getTime()); } -export function getTimestampOfFirstDateOfThisYear() { - const year = new Date().getFullYear(); +export function getTimestampOfFirstDateOfThisYear(currentDateInSecond?: number) { + const dateToGetYear = currentDateInSecond + ? new Date(timestampInMilliSeconds(currentDateInSecond)) + : new Date(); + const year = dateToGetYear.getFullYear(); const date = new Date(year, 0, 1); const timestamp = date.getTime(); const timestampInSecond = setTimestampToDayStart(timestamp); diff --git a/src/lib/utils/report/balance_sheet_generator.ts b/src/lib/utils/report/balance_sheet_generator.ts index 188297b88..ccedef30e 100644 --- a/src/lib/utils/report/balance_sheet_generator.ts +++ b/src/lib/utils/report/balance_sheet_generator.ts @@ -17,28 +17,42 @@ import IncomeStatementGenerator from '@/lib/utils/report/income_statement_genera import { DAY_IN_YEAR } from '@/constants/common'; import { EMPTY_I_ACCOUNT_READY_FRONTEND } from '@/constants/financial_report'; import { ASSET_CODE, SPECIAL_ACCOUNTS } from '@/constants/account'; -import { timestampToString } from '@/lib/utils/common'; +import { getTimestampOfFirstDateOfThisYear, timestampToString } from '@/lib/utils/common'; import { ILineItemIncludeAccount } from '@/interfaces/line_item'; import { findUniqueAccountByCodeInPrisma } from '@/lib/utils/repo/account.repo'; export default class BalanceSheetGenerator extends FinancialReportGenerator { + private startSecondOfYear: number; + private incomeStatementGenerator: IncomeStatementGenerator; - private incomeStatementGeneratorFromTimeZero: IncomeStatementGenerator; + private incomeStatementGeneratorFromTimeZeroToBeginOfYear: IncomeStatementGenerator; + + private incomeStatementGeneratorFromBeginOfYearToEndDate: IncomeStatementGenerator; constructor(companyId: number, startDateInSecond: number, endDateInSecond: number) { const reportSheetType = ReportSheetType.BALANCE_SHEET; super(companyId, 0, endDateInSecond, reportSheetType); + this.startSecondOfYear = getTimestampOfFirstDateOfThisYear(startDateInSecond); + this.incomeStatementGenerator = new IncomeStatementGenerator( companyId, startDateInSecond, endDateInSecond ); - this.incomeStatementGeneratorFromTimeZero = new IncomeStatementGenerator( + // Info: (20241011 - Murky) For Accumulate Profit and Loss + this.incomeStatementGeneratorFromTimeZeroToBeginOfYear = new IncomeStatementGenerator( companyId, 0, + this.startSecondOfYear + ); + + // Info: (20241011 - Murky) For NetIncome + this.incomeStatementGeneratorFromBeginOfYearToEndDate = new IncomeStatementGenerator( + companyId, + this.startSecondOfYear, endDateInSecond ); } @@ -48,14 +62,29 @@ export default class BalanceSheetGenerator extends FinancialReportGenerator { private async closeAccountFromIncomeStatement( curPeriod: boolean ): Promise { - const incomeStatementContent = - await this.incomeStatementGeneratorFromTimeZero.generateIAccountReadyForFrontendArray(); + const currentYearISContent = + await this.incomeStatementGeneratorFromBeginOfYearToEndDate.generateIAccountReadyForFrontendArray(); + const beforeISContent = + await this.incomeStatementGeneratorFromTimeZeroToBeginOfYear.generateIAccountReadyForFrontendArray(); + + // Info: (20241011 - Murky) net income 是本期範圍內的營收 const netIncome = - incomeStatementContent.find((account) => account.code === SPECIAL_ACCOUNTS.NET_INCOME.code) || + currentYearISContent.find((account) => account.code === SPECIAL_ACCOUNTS.NET_INCOME.code) || + EMPTY_I_ACCOUNT_READY_FRONTEND; + + // Info: (20241011 - Murky) Accumulate Profit and loss是本期以前的營收 + const accumulateProfitAndLoss = + beforeISContent.find((account) => account.code === SPECIAL_ACCOUNTS.NET_INCOME.code) || EMPTY_I_ACCOUNT_READY_FRONTEND; - const otherComprehensiveIncome = - incomeStatementContent.find( + + const currentOtherComprehensiveIncome = + currentYearISContent.find( + (account) => account.code === SPECIAL_ACCOUNTS.OTHER_COMPREHENSIVE_INCOME.code + ) || EMPTY_I_ACCOUNT_READY_FRONTEND; + + const beforeOtherComprehensiveIncome = + beforeISContent.find( (account) => account.code === SPECIAL_ACCOUNTS.OTHER_COMPREHENSIVE_INCOME.code ) || EMPTY_I_ACCOUNT_READY_FRONTEND; @@ -64,6 +93,7 @@ export default class BalanceSheetGenerator extends FinancialReportGenerator { const netIncomeAccount = await findUniqueAccountByCodeInPrisma( SPECIAL_ACCOUNTS.NET_INCOME.code ); + const otherComprehensiveIncomeAccount = await findUniqueAccountByCodeInPrisma( SPECIAL_ACCOUNTS.OTHER_COMPREHENSIVE_INCOME.code ); @@ -72,6 +102,10 @@ export default class BalanceSheetGenerator extends FinancialReportGenerator { SPECIAL_ACCOUNTS.NET_INCOME_IN_EQUITY.code ); + const accumulateProfitAndLossInEquity = await findUniqueAccountByCodeInPrisma( + SPECIAL_ACCOUNTS.ACCUMULATED_PROFIT_AND_LOSS.code + ); + const otherEquityOther = await findUniqueAccountByCodeInPrisma( SPECIAL_ACCOUNTS.OTHER_EQUITY_OTHER.code ); @@ -102,11 +136,41 @@ export default class BalanceSheetGenerator extends FinancialReportGenerator { }, }); + closeAccount.push({ + id: accumulateProfitAndLossInEquity?.id || -1, + amount: curPeriod + ? accumulateProfitAndLoss.curPeriodAmount + : accumulateProfitAndLoss.prePeriodAmount, + description: SPECIAL_ACCOUNTS.ACCUMULATED_PROFIT_AND_LOSS.name, + debit: SPECIAL_ACCOUNTS.ACCUMULATED_PROFIT_AND_LOSS.debit, + accountId: accumulateProfitAndLossInEquity?.id || -1, + voucherId: -1, + createdAt: 1, + updatedAt: 1, + deletedAt: null, + account: netIncomeAccount + ? { + ...netIncomeAccount, + code: SPECIAL_ACCOUNTS.ACCUMULATED_PROFIT_AND_LOSS.code, + debit: SPECIAL_ACCOUNTS.ACCUMULATED_PROFIT_AND_LOSS.debit, + } + : { + ...SPECIAL_ACCOUNTS.ACCUMULATED_PROFIT_AND_LOSS, + id: -1, + companyId: this.companyId, + createdAt: 1, + updatedAt: 1, + deletedAt: null, + }, + }); + closeAccount.push({ id: otherEquityOther?.id || -1, amount: curPeriod - ? otherComprehensiveIncome.curPeriodAmount - : otherComprehensiveIncome.prePeriodAmount, + ? currentOtherComprehensiveIncome.curPeriodAmount + + beforeOtherComprehensiveIncome.curPeriodAmount + : beforeOtherComprehensiveIncome.prePeriodAmount + + beforeOtherComprehensiveIncome.prePeriodAmount, description: SPECIAL_ACCOUNTS.OTHER_EQUITY_OTHER.name, debit: SPECIAL_ACCOUNTS.OTHER_EQUITY_OTHER.debit, accountId: otherEquityOther?.id || -1, From 40a0aad0264bdd72c000cc9aef0bfa99a3c7a14e Mon Sep 17 00:00:00 2001 From: Tiny_Murky Date: Fri, 11 Oct 2024 16:46:30 +0800 Subject: [PATCH 29/29] recursive account complete --- package.json | 2 +- src/interfaces/accounting_account.ts | 1 + src/lib/utils/account/common.ts | 70 +++++++++++++++++-- .../utils/report/balance_sheet_generator.ts | 1 - .../report/cash_flow_statement_generator.ts | 11 +++ .../report/financial_report_generator.ts | 40 +++++++---- 6 files changed, 105 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 1e5effa30..ab96a1204 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iSunFA", - "version": "0.8.2+43", + "version": "0.8.2+44", "private": false, "scripts": { "dev": "next dev", diff --git a/src/interfaces/accounting_account.ts b/src/interfaces/accounting_account.ts index fb43dfdbf..f60420724 100644 --- a/src/interfaces/accounting_account.ts +++ b/src/interfaces/accounting_account.ts @@ -38,6 +38,7 @@ export interface IAccountForSheetDisplay { amount: number | null; percentage: number | null; indent: number; + children: IAccountForSheetDisplay[]; debit?: boolean; } diff --git a/src/lib/utils/account/common.ts b/src/lib/utils/account/common.ts index 5a1b1fa3a..237caf2ba 100644 --- a/src/lib/utils/account/common.ts +++ b/src/lib/utils/account/common.ts @@ -110,17 +110,48 @@ export function updateAccountAmounts(forest: IAccountNode[], lineItemsMap: Map { + maxChildDepth = Math.max(maxChildDepth, calculateMaxHeighOfNode(child)); + }); + + return maxChildDepth + 1; +} + export function addAccountNodeToMapRecursively( accountMap: Map, account: IAccountNode, - rootAmount: number + rootAmount: number, + currentDepth: number, + maxHeight?: number ) { - const newAccountNode = { ...account, children: [] }; + // Info: (20241011 - Murky) 倒數第二層可以保有自己的child + const isSecondLastLayer = maxHeight === 1; + const newAccountNode = isSecondLastLayer ? account : { ...account, children: [] }; const percentage = rootAmount === 0 ? 0 : account.amount / rootAmount; // Info: (20240702 - Murky) Calculate percentage accountMap.set(account.code, { accountNode: newAccountNode, percentage }); + account.children.forEach((child) => { - addAccountNodeToMapRecursively(accountMap, child, rootAmount); + const maxHeightOfChild = calculateMaxHeighOfNode(child); + addAccountNodeToMapRecursively( + accountMap, + child, + rootAmount, + currentDepth + 1, + maxHeightOfChild + ); }); + + return false; } export function transformForestToMap( @@ -129,12 +160,30 @@ export function transformForestToMap( const accountMap = new Map(); forest.forEach((accountNode) => { - addAccountNodeToMapRecursively(accountMap, accountNode, accountNode.amount); + const maxHeight = calculateMaxHeighOfNode(accountNode); + addAccountNodeToMapRecursively(accountMap, accountNode, accountNode.amount, 0, maxHeight); }); return accountMap; } +export function iAccountNode2IAccountForSheetDisplay( + accountNode: IAccountNode, + percentage: number, + children?: IAccountForSheetDisplay[] +): IAccountForSheetDisplay { + const iAccountForSheetDisplay: IAccountForSheetDisplay = { + code: accountNode.code, + name: accountNode.name, + amount: accountNode.amount, + indent: accountNode.level, + debit: accountNode.debit, + percentage, + children: children || [], + }; + return iAccountForSheetDisplay; +} + export function mappingAccountToSheetDisplay( accountMap: Map, sheetMappingRow: { @@ -162,8 +211,20 @@ export function mappingAccountToSheetDisplay( indent: row.indent, debit: undefined, percentage: 0, + children: [], }); } else { + const hasChildren = account.accountNode.children.length > 0; + const children = hasChildren + ? account.accountNode.children.map((child) => { + const childAccount = accountMap.get(child.code)!; + // Info: (20241011 - Murky) 最多只有兩層,所以最底不會再有children + return iAccountNode2IAccountForSheetDisplay( + childAccount.accountNode, + childAccount.percentage + ); + }) + : []; sheetDisplay.push({ code: row.code, name: row.name, @@ -171,6 +232,7 @@ export function mappingAccountToSheetDisplay( indent: row.indent, debit: account.accountNode.debit, percentage: account.percentage, + children, }); } }); diff --git a/src/lib/utils/report/balance_sheet_generator.ts b/src/lib/utils/report/balance_sheet_generator.ts index ccedef30e..8f306cfa8 100644 --- a/src/lib/utils/report/balance_sheet_generator.ts +++ b/src/lib/utils/report/balance_sheet_generator.ts @@ -236,7 +236,6 @@ export default class BalanceSheetGenerator extends FinancialReportGenerator { const accountForest = await this.generateFinancialReportTree(curPeriod); BalanceSheetGenerator.calculateLiabilityAndEquity(accountForest); const accountMap = transformForestToMap(accountForest); - return accountMap; } diff --git a/src/lib/utils/report/cash_flow_statement_generator.ts b/src/lib/utils/report/cash_flow_statement_generator.ts index afec4c42b..bd788d12a 100644 --- a/src/lib/utils/report/cash_flow_statement_generator.ts +++ b/src/lib/utils/report/cash_flow_statement_generator.ts @@ -194,6 +194,7 @@ export default class CashFlowStatementGenerator extends FinancialReportGenerator indent: level, debit, percentage: null, + children: [], }; const newReportSheetMapping = new Map([ @@ -247,6 +248,7 @@ export default class CashFlowStatementGenerator extends FinancialReportGenerator amount: sum, indent: 0, percentage: null, + children: [], }); return indirectOperatingCashFlow; @@ -311,6 +313,7 @@ export default class CashFlowStatementGenerator extends FinancialReportGenerator amount: null, indent: 0, percentage: null, + children: [], }); let directCashFlow = 0; @@ -337,6 +340,7 @@ export default class CashFlowStatementGenerator extends FinancialReportGenerator amount: total, indent: 1, percentage: null, + children: [], }; directCashFlow += total; @@ -359,6 +363,7 @@ export default class CashFlowStatementGenerator extends FinancialReportGenerator amount: directCashFlow, indent: 1, percentage: null, + children: [], }); return reportSheetMapping; } @@ -374,6 +379,7 @@ export default class CashFlowStatementGenerator extends FinancialReportGenerator amount: directCashFlow, indent: 1, percentage: null, + children: [], }); return reportSheetMapping; } @@ -414,6 +420,7 @@ export default class CashFlowStatementGenerator extends FinancialReportGenerator amount: 0, indent: 0, percentage: null, + children: [], }); result.set(SPECIAL_ACCOUNTS.CASH_INCREASE_THIS_PERIOD.code, { @@ -422,6 +429,7 @@ export default class CashFlowStatementGenerator extends FinancialReportGenerator amount: cashFlowFromOperating, indent: 0, percentage: null, + children: [], }); result.set(SPECIAL_ACCOUNTS.CASH_AMOUNT_IN_BEGINNING.code, { @@ -430,6 +438,7 @@ export default class CashFlowStatementGenerator extends FinancialReportGenerator amount: startCashBalance, indent: 0, percentage: null, + children: [], }); result.set(SPECIAL_ACCOUNTS.CASH_AMOUNT_IN_END.code, { @@ -438,6 +447,7 @@ export default class CashFlowStatementGenerator extends FinancialReportGenerator amount: endCashBalance, indent: 0, percentage: null, + children: [], }); return result; } @@ -457,6 +467,7 @@ export default class CashFlowStatementGenerator extends FinancialReportGenerator amount: 0, indent: account.indent, percentage: 0, + children: [], }; }); return result; diff --git a/src/lib/utils/report/financial_report_generator.ts b/src/lib/utils/report/financial_report_generator.ts index 82fca8d53..5d92be2b1 100644 --- a/src/lib/utils/report/financial_report_generator.ts +++ b/src/lib/utils/report/financial_report_generator.ts @@ -144,22 +144,20 @@ export default abstract class FinancialReportGenerator extends ReportGenerator { return lineItemsFromDB; } - public async generateIAccountReadyForFrontendArray(): Promise { + private combineTwoFSReportArray( + curPeriodContent: IAccountForSheetDisplay[], + prePeriodContent: IAccountForSheetDisplay[] + ) { const curPeriodAccountReadyForFrontendArray: IAccountReadyForFrontend[] = []; - - this.curPeriodContent = await this.generateFinancialReportArray(true); - - this.prePeriodContent = await this.generateFinancialReportArray(false); - if ( - this.curPeriodContent && - this.prePeriodContent && - this.curPeriodContent.length > 0 && - this.prePeriodContent.length > 0 && - this.curPeriodContent.length === this.prePeriodContent.length + curPeriodContent && + prePeriodContent && + curPeriodContent.length > 0 && + prePeriodContent.length > 0 && + curPeriodContent.length === prePeriodContent.length ) { - this.curPeriodContent.forEach((curPeriodAccount, index) => { - const lastPeriodAccount = this.prePeriodContent[index]; + curPeriodContent.forEach((curPeriodAccount, index) => { + const lastPeriodAccount = prePeriodContent[index]; const curPeriodAmount = curPeriodAccount.amount || 0; const prePeriodAmount = lastPeriodAccount.amount || 0; const curPeriodAmountString = formatNumberSeparateByComma(curPeriodAmount); @@ -171,6 +169,11 @@ export default abstract class FinancialReportGenerator extends ReportGenerator { ? Math.round(lastPeriodAccount.percentage * 100) : 0; + const children = this.combineTwoFSReportArray( + curPeriodAccount.children, + lastPeriodAccount.children + ); + const curPeriodPercentageString = numberBeDashIfFalsy(curPeriodPercentage); const prePeriodPercentageString = numberBeDashIfFalsy(prePeriodPercentage); const accountReadyForFrontend: IAccountReadyForFrontend = { @@ -185,12 +188,21 @@ export default abstract class FinancialReportGenerator extends ReportGenerator { prePeriodAmountString, prePeriodPercentageString, indent: curPeriodAccount.indent, - children: [], + children, }; curPeriodAccountReadyForFrontendArray.push(accountReadyForFrontend); }); } + return curPeriodAccountReadyForFrontendArray; + } + + public async generateIAccountReadyForFrontendArray(): Promise { + this.curPeriodContent = await this.generateFinancialReportArray(true); + + this.prePeriodContent = await this.generateFinancialReportArray(false); + const curPeriodAccountReadyForFrontendArray: IAccountReadyForFrontend[] = + this.combineTwoFSReportArray(this.curPeriodContent, this.prePeriodContent); return curPeriodAccountReadyForFrontendArray; }