61 lines
1.8 KiB
TypeScript
61 lines
1.8 KiB
TypeScript
import { readBody } from 'h3';
|
|
import {
|
|
createTransaction,
|
|
type TransactionStatus,
|
|
} from '~/utils/finance-repository';
|
|
import { useResponseError, useResponseSuccess } from '~/utils/response';
|
|
import { notifyTransactionWebhook } from '~/utils/telegram-webhook';
|
|
|
|
const DEFAULT_CURRENCY = 'CNY';
|
|
const ALLOWED_STATUSES: TransactionStatus[] = [
|
|
'draft',
|
|
'pending',
|
|
'approved',
|
|
'rejected',
|
|
'paid',
|
|
];
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const body = await readBody(event);
|
|
|
|
if (!body?.type || !body?.amount || !body?.transactionDate) {
|
|
return useResponseError('缺少必填字段', -1);
|
|
}
|
|
|
|
const amount = Number(body.amount);
|
|
if (Number.isNaN(amount)) {
|
|
return useResponseError('金额格式不正确', -1);
|
|
}
|
|
|
|
const status =
|
|
(body.status as TransactionStatus | undefined) ?? 'approved';
|
|
if (!ALLOWED_STATUSES.includes(status)) {
|
|
return useResponseError('状态值不合法', -1);
|
|
}
|
|
|
|
const transaction = createTransaction({
|
|
type: body.type,
|
|
amount,
|
|
currency: body.currency ?? DEFAULT_CURRENCY,
|
|
categoryId: body.categoryId ?? null,
|
|
accountId: body.accountId ?? null,
|
|
transactionDate: body.transactionDate,
|
|
description: body.description ?? '',
|
|
project: body.project ?? null,
|
|
memo: body.memo ?? null,
|
|
status,
|
|
reimbursementBatch: body.reimbursementBatch ?? null,
|
|
reviewNotes: body.reviewNotes ?? null,
|
|
submittedBy: body.submittedBy ?? null,
|
|
approvedBy: body.approvedBy ?? null,
|
|
statusUpdatedAt: body.statusUpdatedAt ?? undefined,
|
|
approvedAt: body.approvedAt ?? undefined,
|
|
});
|
|
|
|
notifyTransactionWebhook(transaction, { action: 'created' }).catch((error) =>
|
|
console.error('[finance][transactions.post] webhook notify failed', error),
|
|
);
|
|
|
|
return useResponseSuccess(transaction);
|
|
});
|