import { Body,Controller,Post,Req,UseGuards } from '@nestjs/common';
import type { z } from 'zod';
import { AuthGuard } from '../../../common/auth/auth.guard';
import { OrganizationContextGuard } from '../../../common/auth/organization-context.guard';
import { LocationContextGuard,type LocationScopedRequest } from '../../../common/auth/location-context.guard';
import { PermissionGuard } from '../../../common/auth/permission.guard';
import { RequirePermissions } from '../../../common/auth/permissions.decorator';
import { AccountingIntegrationService } from '../application/accounting-integration.service';
import { ZodValidationPipe } from '../../../common/validation/zod-validation.pipe';
import { accountingConnectionSchema,accountingInvoiceTransferSchema } from '../../../common/validation/critical-write.schemas';
type AccountingConnectionBody = z.infer<typeof accountingConnectionSchema>;
type AccountingInvoiceTransferBody = z.infer<typeof accountingInvoiceTransferSchema>;
import { AccountingTransferWorker } from '../workers/accounting-transfer.worker';
@Controller('/accounting/integrations')
@UseGuards(AuthGuard,OrganizationContextGuard,LocationContextGuard,PermissionGuard)
export class AccountingIntegrationsController {
constructor(
private readonly integrations:AccountingIntegrationService,
private readonly transfers:AccountingTransferWorker,
) {}
@Post()
@RequirePermissions('accounting.manage')
create(@Req() req:LocationScopedRequest,@Body(new ZodValidationPipe(accountingConnectionSchema)) body:AccountingConnectionBody) {
return this.integrations.createConnection({
organizationId:req.organizationId!,locationId:req.locationId!,
userId:req.auth?.userId,...body,
});
}
@Post('/invoice-transfer')
@RequirePermissions('accounting.export')
queueInvoice(@Req() req:LocationScopedRequest,@Body(new ZodValidationPipe(accountingInvoiceTransferSchema)) body:AccountingInvoiceTransferBody) {
return this.transfers.queueInvoice({
organizationId:req.organizationId!,
connectionId:body.connectionId,
invoiceId:body.invoiceId,
});
}
@Post('/workers/transfer')
@RequirePermissions('accounting.export')
runTransfers(){return this.transfers.runBatch();}
}
