Files
yunhaifinance/backend/src/modules/finance/finance.controller.ts
T

239 lines
8.1 KiB
TypeScript

import { Controller, Get, Post, Put, Delete, Body, Param, Query, UseGuards, Request } from '@nestjs/common';
import { FinanceService } from './finance.service';
import { AuthGuard } from '@nestjs/passport';
@Controller('api/v1/finance')
export class FinanceController {
constructor(private financeService: FinanceService) {}
// 报销申请相关接口
@UseGuards(AuthGuard('jwt'))
@Post('expense-claims')
async createExpenseClaim(@Body() data: any, @Request() req) {
data.user_id = req.user.id;
return this.financeService.createExpenseClaim(data);
}
@UseGuards(AuthGuard('jwt'))
@Get('expense-claims')
async getExpenseClaims(@Query() filter: any, @Request() req) {
// 普通用户只能查看自己的报销申请
if (req.user.role.name !== 'admin') {
filter.user_id = req.user.id;
}
return this.financeService.getExpenseClaims(filter);
}
@UseGuards(AuthGuard('jwt'))
@Get('expense-claims/:id')
async getExpenseClaimById(@Param('id') id: string, @Request() req) {
const expenseClaim = await this.financeService.getExpenseClaimById(id);
// 普通用户只能查看自己的报销申请
if (req.user.role.name !== 'admin' && expenseClaim.user_id !== req.user.id) {
throw new Error('Access denied');
}
return expenseClaim;
}
@UseGuards(AuthGuard('jwt'))
@Put('expense-claims/:id/approve')
async approveExpenseClaim(@Param('id') id: string, @Body() data: any, @Request() req) {
// 只有管理员可以审批
if (req.user.role.name !== 'admin') {
throw new Error('Access denied');
}
return this.financeService.approveExpenseClaim(id, req.user.id, data.notes);
}
@UseGuards(AuthGuard('jwt'))
@Put('expense-claims/:id/reject')
async rejectExpenseClaim(@Param('id') id: string, @Body() data: any, @Request() req) {
// 只有管理员可以审批
if (req.user.role.name !== 'admin') {
throw new Error('Access denied');
}
return this.financeService.rejectExpenseClaim(id, req.user.id, data.notes);
}
// 预支款相关接口
@UseGuards(AuthGuard('jwt'))
@Post('advance-payments')
async createAdvancePayment(@Body() data: any, @Request() req) {
data.user_id = req.user.id;
return this.financeService.createAdvancePayment(data);
}
@UseGuards(AuthGuard('jwt'))
@Get('advance-payments')
async getAdvancePayments(@Query() filter: any, @Request() req) {
// 普通用户只能查看自己的预支款
if (req.user.role.name !== 'admin') {
filter.user_id = req.user.id;
}
return this.financeService.getAdvancePayments(filter);
}
@UseGuards(AuthGuard('jwt'))
@Get('advance-payments/:id')
async getAdvancePaymentById(@Param('id') id: string, @Request() req) {
const advancePayment = await this.financeService.getAdvancePaymentById(id);
// 普通用户只能查看自己的预支款
if (req.user.role.name !== 'admin' && advancePayment.user_id !== req.user.id) {
throw new Error('Access denied');
}
return advancePayment;
}
@UseGuards(AuthGuard('jwt'))
@Put('advance-payments/:id/approve')
async approveAdvancePayment(@Param('id') id: string, @Body() data: any, @Request() req) {
// 只有管理员可以审批
if (req.user.role.name !== 'admin') {
throw new Error('Access denied');
}
return this.financeService.approveAdvancePayment(id, req.user.id, data.notes);
}
@UseGuards(AuthGuard('jwt'))
@Put('advance-payments/:id/reject')
async rejectAdvancePayment(@Param('id') id: string, @Body() data: any, @Request() req) {
// 只有管理员可以审批
if (req.user.role.name !== 'admin') {
throw new Error('Access denied');
}
return this.financeService.rejectAdvancePayment(id, req.user.id, data.notes);
}
@UseGuards(AuthGuard('jwt'))
@Put('advance-payments/:id/usage')
async updateAdvancePaymentUsage(@Param('id') id: string, @Body() data: any, @Request() req) {
const advancePayment = await this.financeService.getAdvancePaymentById(id);
// 普通用户只能更新自己的预支款使用情况
if (req.user.role.name !== 'admin' && advancePayment.user_id !== req.user.id) {
throw new Error('Access denied');
}
return this.financeService.updateAdvancePaymentUsage(id, data.used_amount);
}
// 凭证相关接口
@UseGuards(AuthGuard('jwt'))
@Post('vouchers')
async uploadVoucher(@Body() data: any, @Request() req) {
data.uploaded_by = req.user.id;
return this.financeService.uploadVoucher(data);
}
@UseGuards(AuthGuard('jwt'))
@Get('vouchers')
async getVouchers(@Query() filter: any) {
return this.financeService.getVouchers(filter);
}
// 财务审批相关接口
@UseGuards(AuthGuard('jwt'))
@Post('approvals')
async createFinanceApproval(@Body() data: any, @Request() req) {
data.requester_id = req.user.id;
return this.financeService.createFinanceApproval(data);
}
@UseGuards(AuthGuard('jwt'))
@Get('approvals')
async getFinanceApprovals(@Query() filter: any, @Request() req) {
// 普通用户只能查看自己的审批请求
if (req.user.role.name !== 'admin') {
filter.requester_id = req.user.id;
}
return this.financeService.getFinanceApprovals(filter);
}
@UseGuards(AuthGuard('jwt'))
@Put('approvals/:id/approve')
async approveFinanceApproval(@Param('id') id: string, @Body() data: any, @Request() req) {
// 只有管理员可以审批
if (req.user.role.name !== 'admin') {
throw new Error('Access denied');
}
return this.financeService.approveFinanceApproval(id, req.user.id, data.notes);
}
@UseGuards(AuthGuard('jwt'))
@Put('approvals/:id/reject')
async rejectFinanceApproval(@Param('id') id: string, @Body() data: any, @Request() req) {
// 只有管理员可以审批
if (req.user.role.name !== 'admin') {
throw new Error('Access denied');
}
return this.financeService.rejectFinanceApproval(id, req.user.id, data.notes);
}
// 公司账目管理接口
@UseGuards(AuthGuard('jwt'))
@Get('company-records')
async getCompanyFinancialRecords(@Query() filter: any, @Request() req) {
// 只有管理员可以查看公司账目
if (req.user.role.name !== 'admin') {
throw new Error('Access denied');
}
return this.financeService.getCompanyFinancialRecords(filter);
}
// 项目财务记录接口
@UseGuards(AuthGuard('jwt'))
@Get('project-records/:projectId')
async getProjectFinancialRecords(@Param('projectId') projectId: string) {
return this.financeService.getProjectFinancialRecords(projectId);
}
// 员工个人记账接口
@UseGuards(AuthGuard('jwt'))
@Get('employee-records')
async getEmployeeFinancialRecords(@Request() req) {
return this.financeService.getEmployeeFinancialRecords(req.user.id);
}
// 汇率管理相关接口
@UseGuards(AuthGuard('jwt'))
@Get('currency-rates')
async getCurrencyRates(@Request() req) {
// 只有管理员可以查看汇率设置
if (req.user.role.name !== 'admin') {
throw new Error('Access denied');
}
return this.financeService.getCurrencyRates();
}
@UseGuards(AuthGuard('jwt'))
@Post('currency-rates')
async createOrUpdateCurrencyRate(@Body() data: any, @Request() req) {
// 只有管理员可以设置汇率
if (req.user.role.name !== 'admin') {
throw new Error('Access denied');
}
return this.financeService.createOrUpdateCurrencyRate(data);
}
@UseGuards(AuthGuard('jwt'))
@Put('currency-rates/:id/status')
async updateCurrencyRateStatus(@Param('id') id: string, @Body() data: any, @Request() req) {
// 只有管理员可以更新汇率状态
if (req.user.role.name !== 'admin') {
throw new Error('Access denied');
}
return this.financeService.updateCurrencyRateStatus(id, data.is_active);
}
@UseGuards(AuthGuard('jwt'))
@Get('currencies')
async getSupportedCurrencies() {
return this.financeService.getSupportedCurrencies();
}
@UseGuards(AuthGuard('jwt'))
@Post('convert-currency')
async convertCurrency(@Body() data: any) {
const { amount, from_currency, to_currency } = data;
return this.financeService.convertCurrency(amount, from_currency, to_currency);
}
}