1
0

Merge pull request #1019 from bigcapitalhq/feat/reports-openapi-response-dtos

feat(server): add OpenAPI response DTOs for financial reports
This commit is contained in:
Ahmed Bouhuolia
2026-03-06 05:27:31 +02:00
committed by GitHub
36 changed files with 2342 additions and 26 deletions
@@ -11,12 +11,6 @@ export class BankAccountsController {
@Get()
@ApiOperation({ summary: 'Retrieve the bank accounts.' })
@ApiQuery({
name: 'query',
description: 'Query parameters for the bank accounts list.',
type: BankAccountsQueryDto,
required: false,
})
@ApiResponse({
status: 200,
description: 'List of bank accounts retrieved successfully.',
@@ -0,0 +1,103 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
// ============== Common DTOs ==============
export class FinancialReportTotalDto {
@ApiProperty({ description: 'Numeric amount', type: Number })
amount: number;
@ApiProperty({ description: 'Formatted amount string' })
formattedAmount: string;
@ApiProperty({ description: 'Currency code' })
currencyCode: string;
@ApiPropertyOptional({ description: 'Date associated with the total' })
date?: string | Date;
}
export class FinancialReportPercentageDto {
@ApiProperty({ description: 'Percentage amount', type: Number })
amount: number;
@ApiProperty({ description: 'Formatted percentage string' })
formattedAmount: string;
}
export class FinancialReportMetaDto {
@ApiProperty({ description: 'Organization name' })
organizationName: string;
@ApiProperty({ description: 'Base currency code' })
baseCurrency: string;
@ApiProperty({ description: 'Date format string' })
dateFormat: string;
@ApiProperty({ description: 'Whether cost computation is running' })
isCostComputeRunning: boolean;
@ApiProperty({ description: 'Sheet name' })
sheetName: string;
}
// ============== Table DTOs ==============
export class FinancialTableCellDto {
@ApiProperty({ description: 'Cell key' })
key: string;
@ApiProperty({ description: 'Cell value' })
value: string;
}
export class FinancialTableRowDto {
@ApiProperty({ description: 'Cell data for this row', type: [FinancialTableCellDto] })
cells: FinancialTableCellDto[];
@ApiProperty({ description: 'Row type classifications', type: [String] })
rowTypes: string[];
@ApiProperty({ description: 'Row identifier' })
id: string | number;
@ApiPropertyOptional({ description: 'Child rows', type: () => [FinancialTableRowDto] })
children?: FinancialTableRowDto[];
}
export class FinancialTableColumnDto {
@ApiProperty({ description: 'Column key' })
key: string;
@ApiProperty({ description: 'Column header label' })
label: string;
@ApiPropertyOptional({ description: 'Cell position index', type: Number })
cellIndex?: number;
@ApiPropertyOptional({ description: 'Nested column definitions', type: () => [FinancialTableColumnDto] })
children?: FinancialTableColumnDto[];
}
export class FinancialTableDataDto {
@ApiProperty({ description: 'Table column definitions', type: [FinancialTableColumnDto] })
columns: FinancialTableColumnDto[];
@ApiProperty({ description: 'Table row data', type: [FinancialTableRowDto] })
rows: FinancialTableRowDto[];
}
// ============== Base Report Response DTOs ==============
export class BaseFinancialReportResponseDto {
@ApiProperty({ description: 'Report metadata', type: FinancialReportMetaDto })
meta: FinancialReportMetaDto;
}
export class BaseFinancialTableResponseDto {
@ApiProperty({ description: 'Table data structure', type: FinancialTableDataDto })
table: FinancialTableDataDto;
@ApiProperty({ description: 'Report metadata', type: FinancialReportMetaDto })
meta: FinancialReportMetaDto;
}
@@ -3,13 +3,19 @@ import { Controller, Get, Headers, Query, Res, UseGuards } from '@nestjs/common'
import { APAgingSummaryApplication } from './APAgingSummaryApplication';
import { AcceptType } from '@/constants/accept-type';
import {
ApiExtraModels,
ApiOperation,
ApiProduces,
ApiResponse,
ApiTags,
getSchemaPath,
} from '@nestjs/swagger';
import { APAgingSummaryQueryDto } from './APAgingSummaryQuery.dto';
import { APAgingSummaryResponseExample } from './APAgingSummary.swagger';
import {
APAgingSummaryResponseDto,
APAgingSummaryTableResponseDto,
} from './APAgingSummaryResponse.dto';
import { ApiCommonHeaders } from '@/common/decorators/ApiCommonHeaders';
import { RequirePermission } from '@/modules/Roles/RequirePermission.decorator';
import { PermissionGuard } from '@/modules/Roles/Permission.guard';
@@ -21,6 +27,7 @@ import { ReportsAction } from '../../types/Report.types';
@ApiTags('Reports')
@ApiCommonHeaders()
@UseGuards(AuthorizationGuard, PermissionGuard)
@ApiExtraModels(APAgingSummaryResponseDto, APAgingSummaryTableResponseDto)
export class APAgingSummaryController {
constructor(private readonly APAgingSummaryApp: APAgingSummaryApplication) { }
@@ -30,7 +37,15 @@ export class APAgingSummaryController {
@ApiResponse({
status: 200,
description: 'A/P aging summary response',
example: APAgingSummaryResponseExample,
content: {
[AcceptType.ApplicationJson]: {
schema: { $ref: getSchemaPath(APAgingSummaryResponseDto) },
example: APAgingSummaryResponseExample,
},
[AcceptType.ApplicationJsonTable]: {
schema: { $ref: getSchemaPath(APAgingSummaryTableResponseDto) },
},
},
})
@ApiProduces(
AcceptType.ApplicationJson,
@@ -0,0 +1,109 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { NumberFormatQueryDto } from '@/modules/BankingTransactions/dtos/NumberFormatQuery.dto';
import {
FinancialReportTotalDto,
FinancialReportMetaDto,
FinancialTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class APAgingPeriodDto {
@ApiProperty({ description: 'From period date' })
fromPeriod: string;
@ApiPropertyOptional({ description: 'To period date' })
toPeriod: string | null;
@ApiProperty({ description: 'Before days', type: Number })
beforeDays: number;
@ApiPropertyOptional({ description: 'To days', type: Number })
toDays: number | null;
}
export class APAgingPeriodTotalDto extends APAgingPeriodDto {
@ApiProperty({ description: 'Period total', type: FinancialReportTotalDto })
total: FinancialReportTotalDto;
}
export class APAgingVendorDto {
@ApiProperty({ description: 'Vendor name' })
vendorName: string;
@ApiProperty({ description: 'Current balance', type: FinancialReportTotalDto })
current: FinancialReportTotalDto;
@ApiProperty({ description: 'Aging periods', type: [APAgingPeriodTotalDto] })
aging: APAgingPeriodTotalDto[];
@ApiProperty({ description: 'Vendor total', type: FinancialReportTotalDto })
total: FinancialReportTotalDto;
}
export class APAgingSummaryDataDto {
@ApiProperty({ description: 'Vendors aging data', type: [APAgingVendorDto] })
vendors: APAgingVendorDto[];
@ApiProperty({ description: 'Current total', type: FinancialReportTotalDto })
current: FinancialReportTotalDto;
@ApiProperty({ description: 'Aging totals', type: [APAgingPeriodTotalDto] })
aging: APAgingPeriodTotalDto[];
@ApiProperty({ description: 'Grand total', type: FinancialReportTotalDto })
total: FinancialReportTotalDto;
}
export class APAgingSummaryMetaDto extends FinancialReportMetaDto {
@ApiProperty({ description: 'Formatted as-of date' })
formattedAsDate: string;
}
export class APAgingSummaryQueryResponseDto {
@ApiProperty({ description: 'As-of date' })
asDate: string;
@ApiProperty({ description: 'Aging days before', type: Number })
agingDaysBefore: number;
@ApiProperty({ description: 'Number of aging periods', type: Number })
agingPeriods: number;
@ApiProperty({ description: 'Number format settings', type: NumberFormatQueryDto })
numberFormat: NumberFormatQueryDto;
@ApiProperty({ description: 'Vendor IDs to include', type: [Number] })
vendorsIds: number[];
@ApiProperty({ description: 'Branch IDs to include', type: [Number] })
branchesIds: number[];
@ApiProperty({ description: 'Exclude zero balance accounts' })
noneZero: boolean;
}
export class APAgingSummaryResponseDto {
@ApiProperty({ description: 'Aging summary data', type: APAgingSummaryDataDto })
data: APAgingSummaryDataDto;
@ApiProperty({ description: 'Report metadata', type: APAgingSummaryMetaDto })
meta: APAgingSummaryMetaDto;
}
// Re-export table DTOs for convenience
export {
FinancialTableCellDto as APAgingSummaryTableCellDto,
FinancialTableRowDto as APAgingSummaryTableRowDto,
FinancialTableColumnDto as APAgingSummaryTableColumnDto,
FinancialTableDataDto as APAgingSummaryTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class APAgingSummaryTableResponseDto {
@ApiProperty({ description: 'Table data structure', type: () => FinancialTableDataDto })
table: FinancialTableDataDto;
@ApiProperty({ description: 'Query parameters used to generate the report', type: APAgingSummaryQueryResponseDto })
query: APAgingSummaryQueryResponseDto;
@ApiProperty({ description: 'Report metadata', type: APAgingSummaryMetaDto })
meta: APAgingSummaryMetaDto;
}
@@ -3,13 +3,19 @@ import { ARAgingSummaryApplication } from './ARAgingSummaryApplication';
import { AcceptType } from '@/constants/accept-type';
import { Response } from 'express';
import {
ApiExtraModels,
ApiOperation,
ApiProduces,
ApiResponse,
ApiTags,
getSchemaPath,
} from '@nestjs/swagger';
import { ARAgingSummaryQueryDto } from './ARAgingSummaryQuery.dto';
import { ARAgingSummaryResponseExample } from './ARAgingSummary.swagger';
import {
ARAgingSummaryResponseDto,
ARAgingSummaryTableResponseDto,
} from './ARAgingSummaryResponse.dto';
import { ApiCommonHeaders } from '@/common/decorators/ApiCommonHeaders';
import { RequirePermission } from '@/modules/Roles/RequirePermission.decorator';
import { PermissionGuard } from '@/modules/Roles/Permission.guard';
@@ -21,6 +27,7 @@ import { ReportsAction } from '../../types/Report.types';
@ApiTags('Reports')
@ApiCommonHeaders()
@UseGuards(AuthorizationGuard, PermissionGuard)
@ApiExtraModels(ARAgingSummaryResponseDto, ARAgingSummaryTableResponseDto)
export class ARAgingSummaryController {
constructor(private readonly ARAgingSummaryApp: ARAgingSummaryApplication) {}
@@ -30,7 +37,15 @@ export class ARAgingSummaryController {
@ApiResponse({
status: 200,
description: 'Receivable aging summary response',
example: ARAgingSummaryResponseExample,
content: {
[AcceptType.ApplicationJson]: {
schema: { $ref: getSchemaPath(ARAgingSummaryResponseDto) },
example: ARAgingSummaryResponseExample,
},
[AcceptType.ApplicationJsonTable]: {
schema: { $ref: getSchemaPath(ARAgingSummaryTableResponseDto) },
},
},
})
@ApiProduces(
AcceptType.ApplicationJson,
@@ -0,0 +1,115 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { NumberFormatQueryDto } from '@/modules/BankingTransactions/dtos/NumberFormatQuery.dto';
import {
FinancialReportTotalDto,
FinancialReportMetaDto,
FinancialTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class ARAgingPeriodDto {
@ApiProperty({ description: 'From period date' })
fromPeriod: string;
@ApiPropertyOptional({ description: 'To period date' })
toPeriod: string | null;
@ApiProperty({ description: 'Before days', type: Number })
beforeDays: number;
@ApiPropertyOptional({ description: 'To days', type: Number })
toDays: number | null;
}
export class ARAgingPeriodTotalDto extends ARAgingPeriodDto {
@ApiProperty({ description: 'Period total', type: FinancialReportTotalDto })
total: FinancialReportTotalDto;
}
export class ARAgingCustomerDto {
@ApiProperty({ description: 'Customer name' })
customerName: string;
@ApiProperty({ description: 'Current balance', type: FinancialReportTotalDto })
current: FinancialReportTotalDto;
@ApiProperty({ description: 'Aging periods', type: [ARAgingPeriodTotalDto] })
aging: ARAgingPeriodTotalDto[];
@ApiProperty({ description: 'Customer total', type: FinancialReportTotalDto })
total: FinancialReportTotalDto;
}
export class ARAgingSummaryDataDto {
@ApiProperty({ description: 'Customers aging data', type: [ARAgingCustomerDto] })
customers: ARAgingCustomerDto[];
@ApiProperty({ description: 'Current total', type: FinancialReportTotalDto })
current: FinancialReportTotalDto;
@ApiProperty({ description: 'Aging totals', type: [ARAgingPeriodTotalDto] })
aging: ARAgingPeriodTotalDto[];
@ApiProperty({ description: 'Grand total', type: FinancialReportTotalDto })
total: FinancialReportTotalDto;
}
export class ARAgingSummaryMetaDto extends FinancialReportMetaDto {
@ApiProperty({ description: 'Formatted as-of date' })
formattedAsDate: string;
}
export class ARAgingSummaryQueryResponseDto {
@ApiProperty({ description: 'As-of date' })
asDate: string;
@ApiProperty({ description: 'Aging days before', type: Number })
agingDaysBefore: number;
@ApiProperty({ description: 'Number of aging periods', type: Number })
agingPeriods: number;
@ApiProperty({ description: 'Number format settings', type: NumberFormatQueryDto })
numberFormat: NumberFormatQueryDto;
@ApiProperty({ description: 'Customer IDs to include', type: [Number] })
customersIds: number[];
@ApiProperty({ description: 'Branch IDs to include', type: [Number] })
branchesIds: number[];
@ApiProperty({ description: 'Exclude zero balance accounts' })
noneZero: boolean;
}
export class ARAgingSummaryResponseDto {
@ApiProperty({ description: 'Query parameters used to generate the report', type: ARAgingSummaryQueryResponseDto })
query: ARAgingSummaryQueryResponseDto;
@ApiProperty({ description: 'Aging columns definitions', type: [ARAgingPeriodDto] })
columns: ARAgingPeriodDto[];
@ApiProperty({ description: 'Aging summary data', type: ARAgingSummaryDataDto })
data: ARAgingSummaryDataDto;
@ApiProperty({ description: 'Report metadata', type: ARAgingSummaryMetaDto })
meta: ARAgingSummaryMetaDto;
}
// Re-export table DTOs for convenience
export {
FinancialTableCellDto as ARAgingSummaryTableCellDto,
FinancialTableRowDto as ARAgingSummaryTableRowDto,
FinancialTableColumnDto as ARAgingSummaryTableColumnDto,
FinancialTableDataDto as ARAgingSummaryTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class ARAgingSummaryTableResponseDto {
@ApiProperty({ description: 'Table data structure', type: () => FinancialTableDataDto })
table: FinancialTableDataDto;
@ApiProperty({ description: 'Query parameters used to generate the report', type: ARAgingSummaryQueryResponseDto })
query: ARAgingSummaryQueryResponseDto;
@ApiProperty({ description: 'Report metadata', type: ARAgingSummaryMetaDto })
meta: ARAgingSummaryMetaDto;
}
@@ -3,13 +3,22 @@ import { Controller, Get, Headers, Query, Res, UseGuards } from '@nestjs/common'
import { AcceptType } from '@/constants/accept-type';
import { BalanceSheetApplication } from './BalanceSheetApplication';
import {
ApiExtraModels,
ApiOperation,
ApiProduces,
ApiResponse,
ApiTags,
getSchemaPath,
} from '@nestjs/swagger';
import { BalanceSheetQueryDto } from './BalanceSheet.dto';
import { BalanceSheetResponseExample } from './BalanceSheet.swagger';
import {
BalanceSheetResponseExample,
BalanceSheetTableResponseExample,
} from './BalanceSheet.swagger';
import {
BalanceSheetResponseDto,
BalanceSheetTableResponseDto,
} from './BalanceSheetResponse.dto';
import { ApiCommonHeaders } from '@/common/decorators/ApiCommonHeaders';
import { RequirePermission } from '@/modules/Roles/RequirePermission.decorator';
import { PermissionGuard } from '@/modules/Roles/Permission.guard';
@@ -21,6 +30,7 @@ import { ReportsAction } from '../../types/Report.types';
@ApiTags('Reports')
@ApiCommonHeaders()
@UseGuards(AuthorizationGuard, PermissionGuard)
@ApiExtraModels(BalanceSheetResponseDto, BalanceSheetTableResponseDto)
export class BalanceSheetStatementController {
constructor(private readonly balanceSheetApp: BalanceSheetApplication) {}
@@ -36,7 +46,16 @@ export class BalanceSheetStatementController {
@ApiResponse({
status: 200,
description: 'Balance sheet statement',
example: BalanceSheetResponseExample,
content: {
[AcceptType.ApplicationJson]: {
schema: { $ref: getSchemaPath(BalanceSheetResponseDto) },
example: BalanceSheetResponseExample,
},
[AcceptType.ApplicationJsonTable]: {
schema: { $ref: getSchemaPath(BalanceSheetTableResponseDto) },
example: BalanceSheetTableResponseExample,
},
},
})
@ApiProduces(
AcceptType.ApplicationJson,
@@ -0,0 +1,158 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { NumberFormatQueryDto } from '@/modules/BankingTransactions/dtos/NumberFormatQuery.dto';
import {
FinancialReportTotalDto,
FinancialReportPercentageDto,
FinancialReportMetaDto,
FinancialTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class BalanceSheetDataNodeDto {
@ApiProperty({ description: 'Node identifier (string for aggregates, number for accounts)' })
id: string | number;
@ApiProperty({ description: 'Account or category name' })
name: string;
@ApiProperty({
description: 'Type of node',
enum: ['AGGREGATE', 'ACCOUNTS', 'ACCOUNT', 'NET_INCOME'],
})
nodeType: string;
@ApiPropertyOptional({ description: 'Node type alias' })
type?: string;
@ApiProperty({ description: 'Total amount information', type: FinancialReportTotalDto })
total: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Horizontal totals for date periods', type: [FinancialReportTotalDto] })
horizontalTotals?: FinancialReportTotalDto[];
@ApiPropertyOptional({ description: 'Percentage of row', type: FinancialReportPercentageDto })
percentageRow?: FinancialReportPercentageDto;
@ApiPropertyOptional({ description: 'Percentage of column', type: FinancialReportPercentageDto })
percentageColumn?: FinancialReportPercentageDto;
@ApiPropertyOptional({ description: 'Previous period total', type: FinancialReportTotalDto })
previousPeriod?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Previous period change', type: FinancialReportTotalDto })
previousPeriodChange?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Previous period percentage', type: FinancialReportPercentageDto })
previousPeriodPercentage?: FinancialReportPercentageDto;
@ApiPropertyOptional({ description: 'Previous year total', type: FinancialReportTotalDto })
previousYear?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Previous year change', type: FinancialReportTotalDto })
previousYearChange?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Previous year percentage', type: FinancialReportPercentageDto })
previousYearPercentage?: FinancialReportPercentageDto;
@ApiPropertyOptional({ description: 'Account code' })
code?: string;
@ApiPropertyOptional({ description: 'Display index', type: Number })
index?: number;
@ApiPropertyOptional({ description: 'Parent account ID', type: Number })
parentAccountId?: number;
@ApiPropertyOptional({ description: 'Child nodes', type: () => [BalanceSheetDataNodeDto] })
children?: BalanceSheetDataNodeDto[];
}
export class BalanceSheetMetaDto extends FinancialReportMetaDto {
@ApiProperty({ description: 'Formatted as-of date' })
formattedAsDate: string;
@ApiProperty({ description: 'Formatted date range' })
formattedDateRange: string;
}
export class BalanceSheetQueryResponseDto {
@ApiProperty({ description: 'Column display type', enum: ['total', 'date_periods'] })
displayColumnsType: string;
@ApiProperty({ description: 'Column grouping', enum: ['day', 'month', 'year', 'quarter'] })
displayColumnsBy: string;
@ApiProperty({ description: 'Start date' })
fromDate: string;
@ApiProperty({ description: 'End date' })
toDate: string;
@ApiProperty({ description: 'Number format settings', type: NumberFormatQueryDto })
numberFormat: NumberFormatQueryDto;
@ApiProperty({ description: 'Exclude zero balance accounts' })
noneZero: boolean;
@ApiProperty({ description: 'Exclude accounts with no transactions' })
noneTransactions: boolean;
@ApiProperty({ description: 'Accounting basis', enum: ['cash', 'accrual'] })
basis: string;
@ApiProperty({ description: 'Account IDs to include', type: [Number] })
accountIds: number[];
@ApiProperty({ description: 'Show percentage of column' })
percentageOfColumn: boolean;
@ApiProperty({ description: 'Show percentage of row' })
percentageOfRow: boolean;
@ApiProperty({ description: 'Include previous period' })
previousPeriod: boolean;
@ApiProperty({ description: 'Show previous period amount change' })
previousPeriodAmountChange: boolean;
@ApiProperty({ description: 'Show previous period percentage change' })
previousPeriodPercentageChange: boolean;
@ApiProperty({ description: 'Include previous year' })
previousYear: boolean;
@ApiProperty({ description: 'Show previous year amount change' })
previousYearAmountChange: boolean;
@ApiProperty({ description: 'Show previous year percentage change' })
previousYearPercentageChange: boolean;
}
export class BalanceSheetResponseDto {
@ApiProperty({ description: 'Query parameters used to generate the report', type: BalanceSheetQueryResponseDto })
query: BalanceSheetQueryResponseDto;
@ApiProperty({ description: 'Hierarchical balance sheet data', type: [BalanceSheetDataNodeDto] })
data: BalanceSheetDataNodeDto[];
@ApiProperty({ description: 'Report metadata', type: BalanceSheetMetaDto })
meta: BalanceSheetMetaDto;
}
// Re-export table DTOs for convenience
export {
FinancialTableCellDto as BalanceSheetTableCellDto,
FinancialTableRowDto as BalanceSheetTableRowDto,
FinancialTableColumnDto as BalanceSheetTableColumnDto,
FinancialTableDataDto as BalanceSheetTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class BalanceSheetTableResponseDto {
@ApiProperty({ description: 'Table data structure', type: () => FinancialTableDataDto })
table: FinancialTableDataDto;
@ApiProperty({ description: 'Query parameters used to generate the report', type: BalanceSheetQueryResponseDto })
query: BalanceSheetQueryResponseDto;
@ApiProperty({ description: 'Report metadata', type: BalanceSheetMetaDto })
meta: BalanceSheetMetaDto;
}
@@ -3,13 +3,19 @@ import { Controller, Get, Headers, Query, Res, UseGuards } from '@nestjs/common'
import { AcceptType } from '@/constants/accept-type';
import { CashflowSheetApplication } from './CashflowSheetApplication';
import {
ApiExtraModels,
ApiOperation,
ApiProduces,
ApiResponse,
ApiTags,
getSchemaPath,
} from '@nestjs/swagger';
import { CashFlowStatementQueryDto } from './CashFlowStatementQuery.dto';
import { CashflowStatementResponseExample } from './CashflowStatement.swagger';
import {
CashflowStatementResponseDto,
CashflowStatementTableResponseDto,
} from './CashflowStatementResponse.dto';
import { ApiCommonHeaders } from '@/common/decorators/ApiCommonHeaders';
import { RequirePermission } from '@/modules/Roles/RequirePermission.decorator';
import { PermissionGuard } from '@/modules/Roles/Permission.guard';
@@ -21,6 +27,7 @@ import { ReportsAction } from '../../types/Report.types';
@ApiTags('Reports')
@ApiCommonHeaders()
@UseGuards(AuthorizationGuard, PermissionGuard)
@ApiExtraModels(CashflowStatementResponseDto, CashflowStatementTableResponseDto)
export class CashflowController {
constructor(private readonly cashflowSheetApp: CashflowSheetApplication) { }
@@ -29,7 +36,15 @@ export class CashflowController {
@ApiResponse({
status: 200,
description: 'Cashflow statement report',
example: CashflowStatementResponseExample,
content: {
[AcceptType.ApplicationJson]: {
schema: { $ref: getSchemaPath(CashflowStatementResponseDto) },
example: CashflowStatementResponseExample,
},
[AcceptType.ApplicationJsonTable]: {
schema: { $ref: getSchemaPath(CashflowStatementTableResponseDto) },
},
},
})
@ApiOperation({ summary: 'Get cashflow statement report' })
@ApiProduces(
@@ -0,0 +1,109 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { NumberFormatQueryDto } from '@/modules/BankingTransactions/dtos/NumberFormatQuery.dto';
import {
FinancialReportTotalDto,
FinancialReportMetaDto,
FinancialTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class CashflowStatementDataNodeDto {
@ApiProperty({ description: 'Node identifier (string for aggregates, number for accounts)' })
id: string | number;
@ApiProperty({ description: 'Account or category name' })
name: string;
@ApiProperty({
description: 'Type of node',
enum: ['AGGREGATE', 'ACCOUNT', 'NET_INCOME', 'TOTAL'],
})
nodeType: string;
@ApiPropertyOptional({ description: 'Node type alias' })
type?: string;
@ApiProperty({ description: 'Total amount information', type: FinancialReportTotalDto })
total: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Horizontal totals for date periods', type: [FinancialReportTotalDto] })
horizontalTotals?: FinancialReportTotalDto[];
@ApiPropertyOptional({ description: 'Account code' })
code?: string;
@ApiPropertyOptional({ description: 'Display index', type: Number })
index?: number;
@ApiPropertyOptional({ description: 'Child nodes', type: () => [CashflowStatementDataNodeDto] })
children?: CashflowStatementDataNodeDto[];
}
export class CashflowStatementMetaDto extends FinancialReportMetaDto {
@ApiProperty({ description: 'Formatted from date' })
formattedFromDate: string;
@ApiProperty({ description: 'Formatted to date' })
formattedToDate: string;
@ApiProperty({ description: 'Formatted date range' })
formattedDateRange: string;
}
export class CashflowStatementQueryResponseDto {
@ApiProperty({ description: 'Column display type', enum: ['total', 'date_periods'] })
displayColumnsType: string;
@ApiProperty({ description: 'Column grouping', enum: ['day', 'month', 'year', 'quarter'] })
displayColumnsBy: string;
@ApiProperty({ description: 'Start date' })
fromDate: string;
@ApiProperty({ description: 'End date' })
toDate: string;
@ApiProperty({ description: 'Number format settings', type: NumberFormatQueryDto })
numberFormat: NumberFormatQueryDto;
@ApiProperty({ description: 'Exclude zero balance accounts' })
noneZero: boolean;
@ApiProperty({ description: 'Exclude accounts with no transactions' })
noneTransactions: boolean;
@ApiProperty({ description: 'Accounting basis', enum: ['cash', 'accrual'] })
basis: string;
@ApiProperty({ description: 'Account IDs to include', type: [Number] })
accountIds: number[];
}
export class CashflowStatementResponseDto {
@ApiProperty({ description: 'Query parameters used to generate the report', type: CashflowStatementQueryResponseDto })
query: CashflowStatementQueryResponseDto;
@ApiProperty({ description: 'Hierarchical cashflow data', type: [CashflowStatementDataNodeDto] })
data: CashflowStatementDataNodeDto[];
@ApiProperty({ description: 'Report metadata', type: CashflowStatementMetaDto })
meta: CashflowStatementMetaDto;
}
// Re-export table DTOs for convenience
export {
FinancialTableCellDto as CashflowStatementTableCellDto,
FinancialTableRowDto as CashflowStatementTableRowDto,
FinancialTableColumnDto as CashflowStatementTableColumnDto,
FinancialTableDataDto as CashflowStatementTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class CashflowStatementTableResponseDto {
@ApiProperty({ description: 'Table data structure', type: () => FinancialTableDataDto })
table: FinancialTableDataDto;
@ApiProperty({ description: 'Query parameters used to generate the report', type: CashflowStatementQueryResponseDto })
query: CashflowStatementQueryResponseDto;
@ApiProperty({ description: 'Report metadata', type: CashflowStatementMetaDto })
meta: CashflowStatementMetaDto;
}
@@ -1,26 +1,44 @@
import { Response } from 'express';
import {
ApiExtraModels,
ApiOperation,
ApiProduces,
ApiResponse,
ApiTags,
getSchemaPath,
} from '@nestjs/swagger';
import { Controller, Get, Headers, Query, Res } from '@nestjs/common';
import { CustomerBalanceSummaryApplication } from './CustomerBalanceSummaryApplication';
import { CustomerBalanceSummaryQueryDto } from './CustomerBalanceSummaryQuery.dto';
import { AcceptType } from '@/constants/accept-type';
import {
CustomerBalanceSummaryResponseDto,
CustomerBalanceSummaryTableResponseDto,
} from './CustomerBalanceSummaryResponse.dto';
import { ApiCommonHeaders } from '@/common/decorators/ApiCommonHeaders';
@Controller('/reports/customer-balance-summary')
@ApiTags('Reports')
@ApiCommonHeaders()
@ApiExtraModels(CustomerBalanceSummaryResponseDto, CustomerBalanceSummaryTableResponseDto)
export class CustomerBalanceSummaryController {
constructor(
private readonly customerBalanceSummaryApp: CustomerBalanceSummaryApplication,
) {}
@Get()
@ApiResponse({ status: 200, description: 'Customer balance summary report' })
@ApiResponse({
status: 200,
description: 'Customer balance summary report',
content: {
[AcceptType.ApplicationJson]: {
schema: { $ref: getSchemaPath(CustomerBalanceSummaryResponseDto) },
},
[AcceptType.ApplicationJsonTable]: {
schema: { $ref: getSchemaPath(CustomerBalanceSummaryTableResponseDto) },
},
},
})
@ApiOperation({ summary: 'Get customer balance summary report' })
@ApiProduces(
AcceptType.ApplicationJson,
@@ -0,0 +1,82 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { NumberFormatQueryDto } from '@/modules/BankingTransactions/dtos/NumberFormatQuery.dto';
import {
FinancialReportTotalDto,
FinancialReportMetaDto,
FinancialTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class CustomerBalanceDto {
@ApiProperty({ description: 'Customer ID', type: Number })
customerId: number;
@ApiProperty({ description: 'Customer name' })
customerName: string;
@ApiPropertyOptional({ description: 'Opening balance', type: FinancialReportTotalDto })
openingBalance?: FinancialReportTotalDto;
@ApiProperty({ description: 'Closing balance', type: FinancialReportTotalDto })
closingBalance: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Total debit', type: FinancialReportTotalDto })
totalDebit?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Total credit', type: FinancialReportTotalDto })
totalCredit?: FinancialReportTotalDto;
}
export class CustomerBalanceSummaryMetaDto extends FinancialReportMetaDto {
@ApiProperty({ description: 'Formatted as-of date' })
formattedAsDate: string;
@ApiProperty({ description: 'Formatted date range' })
formattedDateRange: string;
}
export class CustomerBalanceSummaryQueryResponseDto {
@ApiProperty({ description: 'As-of date' })
asDate: string;
@ApiProperty({ description: 'Number format settings', type: NumberFormatQueryDto })
numberFormat: NumberFormatQueryDto;
@ApiProperty({ description: 'Customer IDs to include', type: [Number] })
customersIds: number[];
@ApiProperty({ description: 'Exclude zero balance customers' })
noneZero: boolean;
@ApiProperty({ description: 'Exclude inactive customers' })
noneInactive: boolean;
}
export class CustomerBalanceSummaryResponseDto {
@ApiProperty({ description: 'Query parameters used to generate the report', type: CustomerBalanceSummaryQueryResponseDto })
query: CustomerBalanceSummaryQueryResponseDto;
@ApiProperty({ description: 'Customer balances', type: [CustomerBalanceDto] })
data: CustomerBalanceDto[];
@ApiProperty({ description: 'Report metadata', type: CustomerBalanceSummaryMetaDto })
meta: CustomerBalanceSummaryMetaDto;
}
// Re-export table DTOs for convenience
export {
FinancialTableCellDto as CustomerBalanceSummaryTableCellDto,
FinancialTableRowDto as CustomerBalanceSummaryTableRowDto,
FinancialTableColumnDto as CustomerBalanceSummaryTableColumnDto,
FinancialTableDataDto as CustomerBalanceSummaryTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class CustomerBalanceSummaryTableResponseDto {
@ApiProperty({ description: 'Table data structure', type: () => FinancialTableDataDto })
table: FinancialTableDataDto;
@ApiProperty({ description: 'Query parameters used to generate the report', type: CustomerBalanceSummaryQueryResponseDto })
query: CustomerBalanceSummaryQueryResponseDto;
@ApiProperty({ description: 'Report metadata', type: CustomerBalanceSummaryMetaDto })
meta: CustomerBalanceSummaryMetaDto;
}
@@ -1,8 +1,10 @@
import {
ApiExtraModels,
ApiOperation,
ApiProduces,
ApiResponse,
ApiTags,
getSchemaPath,
} from '@nestjs/swagger';
import { Response } from 'express';
import { Controller, Get, Headers, Query, Res, UseGuards } from '@nestjs/common';
@@ -10,6 +12,10 @@ import { GeneralLedgerApplication } from './GeneralLedgerApplication';
import { AcceptType } from '@/constants/accept-type';
import { GeneralLedgerQueryDto } from './GeneralLedgerQuery.dto';
import { GeneralLedgerResponseExample } from './GeneralLedger.swagger';
import {
GeneralLedgerResponseDto,
GeneralLedgerTableResponseDto,
} from './GeneralLedgerResponse.dto';
import { ApiCommonHeaders } from '@/common/decorators/ApiCommonHeaders';
import { RequirePermission } from '@/modules/Roles/RequirePermission.decorator';
import { PermissionGuard } from '@/modules/Roles/Permission.guard';
@@ -21,6 +27,7 @@ import { ReportsAction } from '../../types/Report.types';
@ApiTags('Reports')
@ApiCommonHeaders()
@UseGuards(AuthorizationGuard, PermissionGuard)
@ApiExtraModels(GeneralLedgerResponseDto, GeneralLedgerTableResponseDto)
export class GeneralLedgerController {
constructor(
private readonly generalLedgerApplication: GeneralLedgerApplication,
@@ -31,7 +38,15 @@ export class GeneralLedgerController {
@ApiResponse({
status: 200,
description: 'General ledger report',
example: GeneralLedgerResponseExample,
content: {
[AcceptType.ApplicationJson]: {
schema: { $ref: getSchemaPath(GeneralLedgerResponseDto) },
example: GeneralLedgerResponseExample,
},
[AcceptType.ApplicationJsonTable]: {
schema: { $ref: getSchemaPath(GeneralLedgerTableResponseDto) },
},
},
})
@ApiOperation({ summary: 'Get general ledger report' })
@ApiProduces(
@@ -0,0 +1,156 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { NumberFormatQueryDto } from '@/modules/BankingTransactions/dtos/NumberFormatQuery.dto';
import {
FinancialReportTotalDto,
FinancialReportMetaDto,
FinancialTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class GeneralLedgerTransactionDto {
@ApiProperty({ description: 'Transaction date' })
date: string;
@ApiProperty({ description: 'Formatted date' })
dateFormatted: string;
@ApiProperty({ description: 'Reference type' })
referenceType: string;
@ApiProperty({ description: 'Reference ID', type: Number })
referenceId: number;
@ApiPropertyOptional({ description: 'Transaction number' })
transactionNumber: string | null;
@ApiProperty({ description: 'Formatted transaction type' })
transactionTypeFormatted: string;
@ApiProperty({ description: 'Contact name' })
contactName: string;
@ApiProperty({ description: 'Contact type' })
contactType: string;
@ApiProperty({ description: 'Transaction type' })
transactionType: string;
@ApiProperty({ description: 'Transaction index', type: Number })
index: number;
@ApiPropertyOptional({ description: 'Transaction note' })
note: string | null;
@ApiProperty({ description: 'Credit amount', type: Number })
credit: number;
@ApiProperty({ description: 'Debit amount', type: Number })
debit: number;
@ApiProperty({ description: 'Transaction amount', type: Number })
amount: number;
@ApiProperty({ description: 'Running balance', type: Number })
runningBalance: number;
@ApiProperty({ description: 'Formatted amount' })
formattedAmount: string;
@ApiProperty({ description: 'Formatted credit' })
formattedCredit: string;
@ApiProperty({ description: 'Formatted debit' })
formattedDebit: string;
@ApiProperty({ description: 'Formatted running balance' })
formattedRunningBalance: string;
@ApiProperty({ description: 'Currency code' })
currencyCode: string;
}
export class GeneralLedgerAccountDto {
@ApiProperty({ description: 'Account ID', type: Number })
id: number;
@ApiProperty({ description: 'Account name' })
name: string;
@ApiProperty({ description: 'Account code' })
code: string;
@ApiProperty({ description: 'Account index', type: Number })
index: number;
@ApiPropertyOptional({ description: 'Parent account ID', type: Number })
parentAccountId: number | null;
@ApiProperty({ description: 'Opening balance', type: FinancialReportTotalDto })
openingBalance: FinancialReportTotalDto;
@ApiProperty({ description: 'Account transactions', type: [GeneralLedgerTransactionDto] })
transactions: GeneralLedgerTransactionDto[];
@ApiProperty({ description: 'Closing balance', type: FinancialReportTotalDto })
closingBalance: FinancialReportTotalDto;
}
export class GeneralLedgerMetaDto extends FinancialReportMetaDto {
@ApiProperty({ description: 'Formatted from date' })
formattedFromDate: string;
@ApiProperty({ description: 'Formatted to date' })
formattedToDate: string;
@ApiProperty({ description: 'Formatted date range' })
formattedDateRange: string;
}
export class GeneralLedgerQueryResponseDto {
@ApiProperty({ description: 'Start date' })
fromDate: string;
@ApiProperty({ description: 'End date' })
toDate: string;
@ApiProperty({ description: 'Accounting basis', enum: ['cash', 'accrual'] })
basis: string;
@ApiProperty({ description: 'Number format settings', type: NumberFormatQueryDto })
numberFormat: NumberFormatQueryDto;
@ApiProperty({ description: 'Exclude zero balance accounts' })
noneZero: boolean;
@ApiProperty({ description: 'Account IDs to include', type: [Number] })
accountsIds: number[];
}
export class GeneralLedgerResponseDto {
@ApiProperty({ description: 'Query parameters used to generate the report', type: GeneralLedgerQueryResponseDto })
query: GeneralLedgerQueryResponseDto;
@ApiProperty({ description: 'General ledger data', type: [GeneralLedgerAccountDto] })
data: GeneralLedgerAccountDto[];
@ApiProperty({ description: 'Report metadata', type: GeneralLedgerMetaDto })
meta: GeneralLedgerMetaDto;
}
// Re-export table DTOs for convenience
export {
FinancialTableCellDto as GeneralLedgerTableCellDto,
FinancialTableRowDto as GeneralLedgerTableRowDto,
FinancialTableColumnDto as GeneralLedgerTableColumnDto,
FinancialTableDataDto as GeneralLedgerTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class GeneralLedgerTableResponseDto {
@ApiProperty({ description: 'Table data structure', type: () => FinancialTableDataDto })
table: FinancialTableDataDto;
@ApiProperty({ description: 'Query parameters used to generate the report', type: GeneralLedgerQueryResponseDto })
query: GeneralLedgerQueryResponseDto;
@ApiProperty({ description: 'Report metadata', type: GeneralLedgerMetaDto })
meta: GeneralLedgerMetaDto;
}
@@ -1,14 +1,19 @@
import { Response } from 'express';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import { ApiExtraModels, ApiOperation, ApiTags, ApiResponse, ApiProduces, getSchemaPath } from '@nestjs/swagger';
import { Controller, Get, Headers, Query, Res } from '@nestjs/common';
import { InventoryItemDetailsApplication } from './InventoryItemDetailsApplication';
import { AcceptType } from '@/constants/accept-type';
import { InventoryItemDetailsQueryDto } from './InventoryItemDetailsQuery.dto';
import {
InventoryItemDetailsResponseDto,
InventoryItemDetailsTableResponseDto,
} from './InventoryItemDetailsResponse.dto';
import { ApiCommonHeaders } from '@/common/decorators/ApiCommonHeaders';
@Controller('reports/inventory-item-details')
@ApiTags('Reports')
@ApiCommonHeaders()
@ApiExtraModels(InventoryItemDetailsResponseDto, InventoryItemDetailsTableResponseDto)
export class InventoryItemDetailsController {
constructor(
private readonly inventoryItemDetailsApp: InventoryItemDetailsApplication,
@@ -16,6 +21,25 @@ export class InventoryItemDetailsController {
@Get('/')
@ApiOperation({ summary: 'Get inventory item details' })
@ApiResponse({
status: 200,
description: 'Inventory item details report',
content: {
[AcceptType.ApplicationJson]: {
schema: { $ref: getSchemaPath(InventoryItemDetailsResponseDto) },
},
[AcceptType.ApplicationJsonTable]: {
schema: { $ref: getSchemaPath(InventoryItemDetailsTableResponseDto) },
},
},
})
@ApiProduces(
AcceptType.ApplicationJson,
AcceptType.ApplicationJsonTable,
AcceptType.ApplicationPdf,
AcceptType.ApplicationXlsx,
AcceptType.ApplicationCsv,
)
async inventoryItemDetails(
@Query() query: InventoryItemDetailsQueryDto,
@Res({ passthrough: true }) res: Response,
@@ -0,0 +1,114 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { NumberFormatQueryDto } from '@/modules/BankingTransactions/dtos/NumberFormatQuery.dto';
import {
FinancialReportTotalDto,
FinancialReportMetaDto,
FinancialTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class InventoryItemTransactionDto {
@ApiProperty({ description: 'Transaction date' })
date: string;
@ApiProperty({ description: 'Formatted date' })
dateFormatted: string;
@ApiProperty({ description: 'Transaction type' })
transactionType: string;
@ApiProperty({ description: 'Reference ID', type: Number })
referenceId: number;
@ApiProperty({ description: 'Transaction number' })
transactionNumber: string;
@ApiPropertyOptional({ description: 'Transaction description' })
description?: string;
@ApiProperty({ description: 'Quantity', type: Number })
quantity: number;
@ApiProperty({ description: 'Rate', type: Number })
rate: number;
@ApiProperty({ description: 'Total amount', type: FinancialReportTotalDto })
total: FinancialReportTotalDto;
@ApiProperty({ description: 'Running quantity', type: Number })
runningQuantity: number;
}
export class InventoryItemDetailDto {
@ApiProperty({ description: 'Item ID', type: Number })
id: number;
@ApiProperty({ description: 'Item name' })
name: string;
@ApiProperty({ description: 'Item code' })
code: string;
@ApiProperty({ description: 'Opening quantity', type: Number })
openingQuantity: number;
@ApiProperty({ description: 'Closing quantity', type: Number })
closingQuantity: number;
@ApiProperty({ description: 'Item transactions', type: [InventoryItemTransactionDto] })
transactions: InventoryItemTransactionDto[];
}
export class InventoryItemDetailsMetaDto extends FinancialReportMetaDto {
@ApiProperty({ description: 'Formatted from date' })
formattedFromDate: string;
@ApiProperty({ description: 'Formatted to date' })
formattedToDate: string;
@ApiProperty({ description: 'Formatted date range' })
formattedDateRange: string;
}
export class InventoryItemDetailsQueryResponseDto {
@ApiProperty({ description: 'Start date' })
fromDate: string;
@ApiProperty({ description: 'End date' })
toDate: string;
@ApiProperty({ description: 'Number format settings', type: NumberFormatQueryDto })
numberFormat: NumberFormatQueryDto;
@ApiProperty({ description: 'Item IDs to include', type: [Number] })
itemsIds: number[];
}
export class InventoryItemDetailsResponseDto {
@ApiProperty({ description: 'Query parameters used to generate the report', type: InventoryItemDetailsQueryResponseDto })
query: InventoryItemDetailsQueryResponseDto;
@ApiProperty({ description: 'Inventory items with details', type: [InventoryItemDetailDto] })
data: InventoryItemDetailDto[];
@ApiProperty({ description: 'Report metadata', type: InventoryItemDetailsMetaDto })
meta: InventoryItemDetailsMetaDto;
}
// Re-export table DTOs for convenience
export {
FinancialTableCellDto as InventoryItemDetailsTableCellDto,
FinancialTableRowDto as InventoryItemDetailsTableRowDto,
FinancialTableColumnDto as InventoryItemDetailsTableColumnDto,
FinancialTableDataDto as InventoryItemDetailsTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class InventoryItemDetailsTableResponseDto {
@ApiProperty({ description: 'Table data structure', type: () => FinancialTableDataDto })
table: FinancialTableDataDto;
@ApiProperty({ description: 'Query parameters used to generate the report', type: InventoryItemDetailsQueryResponseDto })
query: InventoryItemDetailsQueryResponseDto;
@ApiProperty({ description: 'Report metadata', type: InventoryItemDetailsMetaDto })
meta: InventoryItemDetailsMetaDto;
}
@@ -1,19 +1,26 @@
import { Response } from 'express';
import {
ApiExtraModels,
ApiOperation,
ApiProduces,
ApiResponse,
ApiTags,
getSchemaPath,
} from '@nestjs/swagger';
import { Controller, Get, Headers, Query, Res } from '@nestjs/common';
import { InventoryValuationSheetApplication } from './InventoryValuationSheetApplication';
import { InventoryValuationQueryDto } from './InventoryValuationQuery.dto';
import { AcceptType } from '@/constants/accept-type';
import {
InventoryValuationResponseDto,
InventoryValuationTableResponseDto,
} from './InventoryValuationResponse.dto';
import { ApiCommonHeaders } from '@/common/decorators/ApiCommonHeaders';
@Controller('reports/inventory-valuation')
@ApiTags('Reports')
@ApiCommonHeaders()
@ApiExtraModels(InventoryValuationResponseDto, InventoryValuationTableResponseDto)
export class InventoryValuationController {
constructor(
private readonly inventoryValuationApp: InventoryValuationSheetApplication,
@@ -24,6 +31,14 @@ export class InventoryValuationController {
@ApiResponse({
status: 200,
description: 'The inventory valuation sheet',
content: {
[AcceptType.ApplicationJson]: {
schema: { $ref: getSchemaPath(InventoryValuationResponseDto) },
},
[AcceptType.ApplicationJsonTable]: {
schema: { $ref: getSchemaPath(InventoryValuationTableResponseDto) },
},
},
})
@ApiProduces(
AcceptType.ApplicationJson,
@@ -0,0 +1,88 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { NumberFormatQueryDto } from '@/modules/BankingTransactions/dtos/NumberFormatQuery.dto';
import {
FinancialReportTotalDto,
FinancialReportMetaDto,
FinancialTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class InventoryValuationItemDto {
@ApiProperty({ description: 'Item ID', type: Number })
id: number;
@ApiProperty({ description: 'Item name' })
name: string;
@ApiProperty({ description: 'Item code' })
code: string;
@ApiProperty({ description: 'Item type' })
type: string;
@ApiPropertyOptional({ description: 'Quantity on hand', type: Number })
quantityOnHand?: number;
@ApiPropertyOptional({ description: 'Average cost', type: Number })
averageCost?: number;
@ApiPropertyOptional({ description: 'Total value', type: FinancialReportTotalDto })
totalValue?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Asset account name' })
assetAccountName?: string;
@ApiPropertyOptional({ description: 'Asset account code' })
assetAccountCode?: string;
}
export class InventoryValuationMetaDto extends FinancialReportMetaDto {
@ApiProperty({ description: 'Formatted as-of date' })
formattedAsDate: string;
@ApiProperty({ description: 'Formatted date range' })
formattedDateRange: string;
}
export class InventoryValuationQueryResponseDto {
@ApiProperty({ description: 'As-of date' })
asDate: string;
@ApiProperty({ description: 'Number format settings', type: NumberFormatQueryDto })
numberFormat: NumberFormatQueryDto;
@ApiProperty({ description: 'Item IDs to include', type: [Number] })
itemsIds: number[];
@ApiProperty({ description: 'Exclude zero quantity items' })
noneZero: boolean;
}
export class InventoryValuationResponseDto {
@ApiProperty({ description: 'Query parameters used to generate the report', type: InventoryValuationQueryResponseDto })
query: InventoryValuationQueryResponseDto;
@ApiProperty({ description: 'Inventory items valuation', type: [InventoryValuationItemDto] })
data: InventoryValuationItemDto[];
@ApiProperty({ description: 'Report metadata', type: InventoryValuationMetaDto })
meta: InventoryValuationMetaDto;
}
// Re-export table DTOs for convenience
export {
FinancialTableCellDto as InventoryValuationTableCellDto,
FinancialTableRowDto as InventoryValuationTableRowDto,
FinancialTableColumnDto as InventoryValuationTableColumnDto,
FinancialTableDataDto as InventoryValuationTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class InventoryValuationTableResponseDto {
@ApiProperty({ description: 'Table data structure', type: () => FinancialTableDataDto })
table: FinancialTableDataDto;
@ApiProperty({ description: 'Query parameters used to generate the report', type: InventoryValuationQueryResponseDto })
query: InventoryValuationQueryResponseDto;
@ApiProperty({ description: 'Report metadata', type: InventoryValuationMetaDto })
meta: InventoryValuationMetaDto;
}
@@ -3,13 +3,19 @@ import { Response } from 'express';
import { AcceptType } from '@/constants/accept-type';
import { JournalSheetApplication } from './JournalSheetApplication';
import {
ApiExtraModels,
ApiOperation,
ApiProduces,
ApiResponse,
ApiTags,
getSchemaPath,
} from '@nestjs/swagger';
import { JournalSheetQueryDto } from './JournalSheetQuery.dto';
import { JournalSheetResponseExample } from './JournalSheet.swagger';
import {
JournalSheetResponseDto,
JournalSheetTableResponseDto,
} from './JournalSheetResponse.dto';
import { ApiCommonHeaders } from '@/common/decorators/ApiCommonHeaders';
import { RequirePermission } from '@/modules/Roles/RequirePermission.decorator';
import { PermissionGuard } from '@/modules/Roles/Permission.guard';
@@ -21,6 +27,7 @@ import { ReportsAction } from '../../types/Report.types';
@ApiTags('Reports')
@ApiCommonHeaders()
@UseGuards(AuthorizationGuard, PermissionGuard)
@ApiExtraModels(JournalSheetResponseDto, JournalSheetTableResponseDto)
export class JournalSheetController {
constructor(private readonly journalSheetApp: JournalSheetApplication) {}
@@ -29,7 +36,15 @@ export class JournalSheetController {
@ApiResponse({
status: 200,
description: 'Journal report',
example: JournalSheetResponseExample,
content: {
[AcceptType.ApplicationJson]: {
schema: { $ref: getSchemaPath(JournalSheetResponseDto) },
example: JournalSheetResponseExample,
},
[AcceptType.ApplicationJsonTable]: {
schema: { $ref: getSchemaPath(JournalSheetTableResponseDto) },
},
},
})
@ApiOperation({ summary: 'Journal report' })
@ApiProduces(
@@ -0,0 +1,137 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import {
FinancialReportTotalDto,
FinancialReportMetaDto,
FinancialTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class JournalEntryDto {
@ApiProperty({ description: 'Entry index', type: Number })
index: number;
@ApiPropertyOptional({ description: 'Entry note' })
note: string | null;
@ApiPropertyOptional({ description: 'Contact name' })
contactName?: string;
@ApiPropertyOptional({ description: 'Contact type' })
contactType?: string;
@ApiProperty({ description: 'Account name' })
accountName: string;
@ApiProperty({ description: 'Account code' })
accountCode: string;
@ApiPropertyOptional({ description: 'Transaction number' })
transactionNumber: string | null;
@ApiProperty({ description: 'Formatted credit' })
formattedCredit: string;
@ApiProperty({ description: 'Formatted debit' })
formattedDebit: string;
@ApiProperty({ description: 'Credit amount', type: Number })
credit: number;
@ApiProperty({ description: 'Debit amount', type: Number })
debit: number;
}
export class JournalTransactionDto {
@ApiProperty({ description: 'Transaction date' })
date: string;
@ApiProperty({ description: 'Formatted date' })
dateFormatted: string;
@ApiProperty({ description: 'Transaction type' })
transactionType: string;
@ApiProperty({ description: 'Reference ID', type: Number })
referenceId: number;
@ApiProperty({ description: 'Formatted reference type' })
referenceTypeFormatted: string;
@ApiProperty({ description: 'Journal entries', type: [JournalEntryDto] })
entries: JournalEntryDto[];
@ApiProperty({ description: 'Total credit', type: Number })
credit: number;
@ApiProperty({ description: 'Total debit', type: Number })
debit: number;
@ApiProperty({ description: 'Formatted total credit' })
formattedCredit: string;
@ApiProperty({ description: 'Formatted total debit' })
formattedDebit: string;
}
export class JournalSheetMetaDto extends FinancialReportMetaDto {
@ApiProperty({ description: 'Formatted from date' })
formattedFromDate: string;
@ApiProperty({ description: 'Formatted to date' })
formattedToDate: string;
@ApiProperty({ description: 'Formatted date range' })
formattedDateRange: string;
}
export class JournalSheetQueryResponseDto {
@ApiProperty({ description: 'Start date' })
fromDate: string;
@ApiProperty({ description: 'End date' })
toDate: string;
@ApiPropertyOptional({ description: 'From range' })
fromRange: number | null;
@ApiPropertyOptional({ description: 'To range' })
toRange: number | null;
@ApiProperty({ description: 'Account IDs to include', type: [Number] })
accountsIds: number[];
@ApiProperty({ description: 'Number format settings', type: Object })
numberFormat: {
noCents: boolean;
divideOn1000: boolean;
};
}
export class JournalSheetResponseDto {
@ApiProperty({ description: 'Query parameters used to generate the report', type: JournalSheetQueryResponseDto })
query: JournalSheetQueryResponseDto;
@ApiProperty({ description: 'Journal transactions', type: [JournalTransactionDto] })
data: JournalTransactionDto[];
@ApiProperty({ description: 'Report metadata', type: JournalSheetMetaDto })
meta: JournalSheetMetaDto;
}
// Re-export table DTOs for convenience
export {
FinancialTableCellDto as JournalSheetTableCellDto,
FinancialTableRowDto as JournalSheetTableRowDto,
FinancialTableColumnDto as JournalSheetTableColumnDto,
FinancialTableDataDto as JournalSheetTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class JournalSheetTableResponseDto {
@ApiProperty({ description: 'Table data structure', type: () => FinancialTableDataDto })
table: FinancialTableDataDto;
@ApiProperty({ description: 'Query parameters used to generate the report', type: JournalSheetQueryResponseDto })
query: JournalSheetQueryResponseDto;
@ApiProperty({ description: 'Report metadata', type: JournalSheetMetaDto })
meta: JournalSheetMetaDto;
}
@@ -3,13 +3,19 @@ import { Controller, Get, Headers, Query, Res, UseGuards } from '@nestjs/common'
import { ProfitLossSheetApplication } from './ProfitLossSheetApplication';
import { AcceptType } from '@/constants/accept-type';
import {
ApiExtraModels,
ApiOperation,
ApiProduces,
ApiResponse,
ApiTags,
getSchemaPath,
} from '@nestjs/swagger';
import { ProfitLossSheetQueryDto } from './ProfitLossSheetQuery.dto';
import { ProfitLossSheetResponseExample } from './ProfitLossSheet.swagger';
import {
ProfitLossSheetResponseDto,
ProfitLossSheetTableResponseDto,
} from './ProfitLossSheetResponse.dto';
import { ApiCommonHeaders } from '@/common/decorators/ApiCommonHeaders';
import { RequirePermission } from '@/modules/Roles/RequirePermission.decorator';
import { PermissionGuard } from '@/modules/Roles/Permission.guard';
@@ -21,6 +27,7 @@ import { ReportsAction } from '../../types/Report.types';
@ApiTags('Reports')
@ApiCommonHeaders()
@UseGuards(AuthorizationGuard, PermissionGuard)
@ApiExtraModels(ProfitLossSheetResponseDto, ProfitLossSheetTableResponseDto)
export class ProfitLossSheetController {
constructor(
private readonly profitLossSheetApp: ProfitLossSheetApplication,
@@ -37,7 +44,15 @@ export class ProfitLossSheetController {
@ApiResponse({
status: 200,
description: 'Profit & loss statement',
example: ProfitLossSheetResponseExample,
content: {
[AcceptType.ApplicationJson]: {
schema: { $ref: getSchemaPath(ProfitLossSheetResponseDto) },
example: ProfitLossSheetResponseExample,
},
[AcceptType.ApplicationJsonTable]: {
schema: { $ref: getSchemaPath(ProfitLossSheetTableResponseDto) },
},
},
})
@ApiOperation({ summary: 'Get profit/loss statement report' })
@ApiProduces(
@@ -0,0 +1,170 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { NumberFormatQueryDto } from '@/modules/BankingTransactions/dtos/NumberFormatQuery.dto';
import {
FinancialReportTotalDto,
FinancialReportPercentageDto,
FinancialReportMetaDto,
FinancialTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class ProfitLossSheetDataNodeDto {
@ApiProperty({ description: 'Node identifier (string for aggregates, number for accounts)' })
id: string | number;
@ApiProperty({ description: 'Account or category name' })
name: string;
@ApiProperty({
description: 'Type of node',
enum: ['ACCOUNTS', 'ACCOUNT', 'EQUATION', 'TOTAL'],
})
node_type: string;
@ApiPropertyOptional({ description: 'Node type alias' })
type?: string;
@ApiProperty({ description: 'Total amount information', type: FinancialReportTotalDto })
total: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Horizontal totals for date periods', type: [FinancialReportTotalDto] })
horizontal_totals?: FinancialReportTotalDto[];
@ApiPropertyOptional({ description: 'Percentage of income', type: FinancialReportPercentageDto })
percentage_income?: FinancialReportPercentageDto;
@ApiPropertyOptional({ description: 'Percentage of expense', type: FinancialReportPercentageDto })
percentage_expense?: FinancialReportPercentageDto;
@ApiPropertyOptional({ description: 'Percentage of row', type: FinancialReportPercentageDto })
percentage_row?: FinancialReportPercentageDto;
@ApiPropertyOptional({ description: 'Percentage of column', type: FinancialReportPercentageDto })
percentage_column?: FinancialReportPercentageDto;
@ApiPropertyOptional({ description: 'Previous period total', type: FinancialReportTotalDto })
previous_period?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Previous period change', type: FinancialReportTotalDto })
previous_period_change?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Previous period percentage', type: FinancialReportPercentageDto })
previous_period_percentage?: FinancialReportPercentageDto;
@ApiPropertyOptional({ description: 'Previous year total', type: FinancialReportTotalDto })
previous_year?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Previous year change', type: FinancialReportTotalDto })
previous_year_change?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Previous year percentage', type: FinancialReportPercentageDto })
previous_year_percentage?: FinancialReportPercentageDto;
@ApiPropertyOptional({ description: 'Account code' })
code?: string;
@ApiPropertyOptional({ description: 'Display index', type: Number })
index?: number;
@ApiPropertyOptional({ description: 'Child nodes', type: () => [ProfitLossSheetDataNodeDto] })
children?: ProfitLossSheetDataNodeDto[];
}
export class ProfitLossSheetMetaDto extends FinancialReportMetaDto {
@ApiProperty({ description: 'Formatted from date' })
formatted_from_date: string;
@ApiProperty({ description: 'Formatted to date' })
formatted_to_date: string;
@ApiProperty({ description: 'Formatted date range' })
formatted_date_range: string;
}
export class ProfitLossSheetQueryResponseDto {
@ApiProperty({ description: 'Column display type', enum: ['total', 'date_periods'] })
display_columns_type: string;
@ApiProperty({ description: 'Column grouping', enum: ['day', 'month', 'year', 'quarter'] })
display_columns_by: string;
@ApiProperty({ description: 'Start date' })
from_date: string;
@ApiProperty({ description: 'End date' })
to_date: string;
@ApiProperty({ description: 'Number format settings', type: NumberFormatQueryDto })
number_format: NumberFormatQueryDto;
@ApiProperty({ description: 'Exclude zero balance accounts' })
none_zero: boolean;
@ApiProperty({ description: 'Exclude accounts with no transactions' })
none_transactions: boolean;
@ApiProperty({ description: 'Accounting basis', enum: ['cash', 'accrual'] })
basis: string;
@ApiProperty({ description: 'Account IDs to include', type: [Number] })
accounts_ids: number[];
@ApiProperty({ description: 'Show percentage of column' })
percentage_column: boolean;
@ApiProperty({ description: 'Show percentage of row' })
percentage_row: boolean;
@ApiProperty({ description: 'Show percentage of income' })
percentage_income: boolean;
@ApiProperty({ description: 'Show percentage of expense' })
percentage_expense: boolean;
@ApiProperty({ description: 'Include previous period' })
previous_period: boolean;
@ApiProperty({ description: 'Show previous period amount change' })
previous_period_amount_change: boolean;
@ApiProperty({ description: 'Show previous period percentage change' })
previous_period_percentage_change: boolean;
@ApiProperty({ description: 'Include previous year' })
previous_year: boolean;
@ApiProperty({ description: 'Show previous year amount change' })
previous_year_amount_change: boolean;
@ApiProperty({ description: 'Show previous year percentage change' })
previous_year_percentage_change: boolean;
}
export class ProfitLossSheetResponseDto {
@ApiProperty({ description: 'Query parameters used to generate the report', type: ProfitLossSheetQueryResponseDto })
query: ProfitLossSheetQueryResponseDto;
@ApiProperty({ description: 'Hierarchical profit/loss data', type: [ProfitLossSheetDataNodeDto] })
data: ProfitLossSheetDataNodeDto[];
@ApiProperty({ description: 'Report metadata', type: ProfitLossSheetMetaDto })
meta: ProfitLossSheetMetaDto;
}
// Re-export table DTOs for convenience
export {
FinancialTableCellDto as ProfitLossSheetTableCellDto,
FinancialTableRowDto as ProfitLossSheetTableRowDto,
FinancialTableColumnDto as ProfitLossSheetTableColumnDto,
FinancialTableDataDto as ProfitLossSheetTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class ProfitLossSheetTableResponseDto {
@ApiProperty({ description: 'Table data structure', type: () => FinancialTableDataDto })
table: FinancialTableDataDto;
@ApiProperty({ description: 'Query parameters used to generate the report', type: ProfitLossSheetQueryResponseDto })
query: ProfitLossSheetQueryResponseDto;
@ApiProperty({ description: 'Report metadata', type: ProfitLossSheetMetaDto })
meta: ProfitLossSheetMetaDto;
}
@@ -2,20 +2,36 @@ import { Response } from 'express';
import { Controller, Get, Headers, Query, Res } from '@nestjs/common';
import { PurchasesByItemsApplication } from './PurchasesByItemsApplication';
import { AcceptType } from '@/constants/accept-type';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { ApiExtraModels, ApiOperation, ApiResponse, ApiTags, getSchemaPath } from '@nestjs/swagger';
import { PurchasesByItemsQueryDto } from './PurchasesByItemsQuery.dto';
import {
PurchasesByItemsResponseDto,
PurchasesByItemsTableResponseDto,
} from './PurchasesByItemsResponse.dto';
import { ApiCommonHeaders } from '@/common/decorators/ApiCommonHeaders';
@Controller('/reports/purchases-by-items')
@ApiTags('Reports')
@ApiCommonHeaders()
@ApiExtraModels(PurchasesByItemsResponseDto, PurchasesByItemsTableResponseDto)
export class PurchasesByItemReportController {
constructor(
private readonly purchasesByItemsApp: PurchasesByItemsApplication,
) {}
@Get()
@ApiResponse({ status: 200, description: 'Purchases by items report' })
@ApiResponse({
status: 200,
description: 'Purchases by items report',
content: {
[AcceptType.ApplicationJson]: {
schema: { $ref: getSchemaPath(PurchasesByItemsResponseDto) },
},
[AcceptType.ApplicationJsonTable]: {
schema: { $ref: getSchemaPath(PurchasesByItemsTableResponseDto) },
},
},
})
@ApiOperation({ summary: 'Get purchases by items report' })
async purchasesByItems(
@Query() filter: PurchasesByItemsQueryDto,
@@ -0,0 +1,88 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { NumberFormatQueryDto } from '@/modules/BankingTransactions/dtos/NumberFormatQuery.dto';
import {
FinancialReportTotalDto,
FinancialReportMetaDto,
FinancialTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class PurchasesByItemDto {
@ApiProperty({ description: 'Item ID', type: Number })
id: number;
@ApiProperty({ description: 'Item name' })
name: string;
@ApiProperty({ description: 'Item code' })
code: string;
@ApiProperty({ description: 'Item type' })
type: string;
@ApiProperty({ description: 'Quantity purchased', type: Number })
quantity: number;
@ApiProperty({ description: 'Total purchases amount', type: FinancialReportTotalDto })
total: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Average cost', type: Number })
averageCost?: number;
}
export class PurchasesByItemsMetaDto extends FinancialReportMetaDto {
@ApiProperty({ description: 'Formatted from date' })
formattedFromDate: string;
@ApiProperty({ description: 'Formatted to date' })
formattedToDate: string;
@ApiProperty({ description: 'Formatted date range' })
formattedDateRange: string;
}
export class PurchasesByItemsQueryResponseDto {
@ApiProperty({ description: 'Start date' })
fromDate: string;
@ApiProperty({ description: 'End date' })
toDate: string;
@ApiProperty({ description: 'Number format settings', type: NumberFormatQueryDto })
numberFormat: NumberFormatQueryDto;
@ApiProperty({ description: 'Item IDs to include', type: [Number] })
itemsIds: number[];
@ApiProperty({ description: 'Vendor IDs to include', type: [Number] })
vendorsIds: number[];
}
export class PurchasesByItemsResponseDto {
@ApiProperty({ description: 'Query parameters used to generate the report', type: PurchasesByItemsQueryResponseDto })
query: PurchasesByItemsQueryResponseDto;
@ApiProperty({ description: 'Purchases by items', type: [PurchasesByItemDto] })
data: PurchasesByItemDto[];
@ApiProperty({ description: 'Report metadata', type: PurchasesByItemsMetaDto })
meta: PurchasesByItemsMetaDto;
}
// Re-export table DTOs for convenience
export {
FinancialTableCellDto as PurchasesByItemsTableCellDto,
FinancialTableRowDto as PurchasesByItemsTableRowDto,
FinancialTableColumnDto as PurchasesByItemsTableColumnDto,
FinancialTableDataDto as PurchasesByItemsTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class PurchasesByItemsTableResponseDto {
@ApiProperty({ description: 'Table data structure', type: () => FinancialTableDataDto })
table: FinancialTableDataDto;
@ApiProperty({ description: 'Query parameters used to generate the report', type: PurchasesByItemsQueryResponseDto })
query: PurchasesByItemsQueryResponseDto;
@ApiProperty({ description: 'Report metadata', type: PurchasesByItemsMetaDto })
meta: PurchasesByItemsMetaDto;
}
@@ -10,18 +10,34 @@ import {
import { AcceptType } from '@/constants/accept-type';
import { SalesByItemsApplication } from './SalesByItemsApplication';
import { Response } from 'express';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { ApiExtraModels, ApiOperation, ApiResponse, ApiTags, getSchemaPath } from '@nestjs/swagger';
import { SalesByItemsQueryDto } from './SalesByItemsQuery.dto';
import {
SalesByItemsResponseDto,
SalesByItemsTableResponseDto,
} from './SalesByItemsResponse.dto';
import { ApiCommonHeaders } from '@/common/decorators/ApiCommonHeaders';
@Controller('/reports/sales-by-items')
@ApiTags('Reports')
@ApiCommonHeaders()
@ApiExtraModels(SalesByItemsResponseDto, SalesByItemsTableResponseDto)
export class SalesByItemsController {
constructor(private readonly salesByItemsApp: SalesByItemsApplication) {}
@Get()
@ApiResponse({ status: 200, description: 'Sales by items report' })
@ApiResponse({
status: 200,
description: 'Sales by items report',
content: {
[AcceptType.ApplicationJson]: {
schema: { $ref: getSchemaPath(SalesByItemsResponseDto) },
},
[AcceptType.ApplicationJsonTable]: {
schema: { $ref: getSchemaPath(SalesByItemsTableResponseDto) },
},
},
})
@ApiOperation({
summary: 'Sales by items report',
description: 'Retrieves the sales by items report.',
@@ -0,0 +1,97 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { NumberFormatQueryDto } from '@/modules/BankingTransactions/dtos/NumberFormatQuery.dto';
import {
FinancialReportTotalDto,
FinancialReportMetaDto,
FinancialTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class SalesByItemDto {
@ApiProperty({ description: 'Item ID', type: Number })
id: number;
@ApiProperty({ description: 'Item name' })
name: string;
@ApiProperty({ description: 'Item code' })
code: string;
@ApiProperty({ description: 'Item type' })
type: string;
@ApiProperty({ description: 'Quantity sold', type: Number })
quantity: number;
@ApiProperty({ description: 'Total sales amount', type: FinancialReportTotalDto })
total: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Average price', type: Number })
averagePrice?: number;
@ApiPropertyOptional({ description: 'COGS', type: FinancialReportTotalDto })
cogs?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Profit', type: FinancialReportTotalDto })
profit?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Profit percentage', type: Number })
profitPercentage?: number;
}
export class SalesByItemsMetaDto extends FinancialReportMetaDto {
@ApiProperty({ description: 'Formatted from date' })
formattedFromDate: string;
@ApiProperty({ description: 'Formatted to date' })
formattedToDate: string;
@ApiProperty({ description: 'Formatted date range' })
formattedDateRange: string;
}
export class SalesByItemsQueryResponseDto {
@ApiProperty({ description: 'Start date' })
fromDate: string;
@ApiProperty({ description: 'End date' })
toDate: string;
@ApiProperty({ description: 'Number format settings', type: NumberFormatQueryDto })
numberFormat: NumberFormatQueryDto;
@ApiProperty({ description: 'Item IDs to include', type: [Number] })
itemsIds: number[];
@ApiProperty({ description: 'Customer IDs to include', type: [Number] })
customersIds: number[];
}
export class SalesByItemsResponseDto {
@ApiProperty({ description: 'Query parameters used to generate the report', type: SalesByItemsQueryResponseDto })
query: SalesByItemsQueryResponseDto;
@ApiProperty({ description: 'Sales by items', type: [SalesByItemDto] })
data: SalesByItemDto[];
@ApiProperty({ description: 'Report metadata', type: SalesByItemsMetaDto })
meta: SalesByItemsMetaDto;
}
// Re-export table DTOs for convenience
export {
FinancialTableCellDto as SalesByItemsTableCellDto,
FinancialTableRowDto as SalesByItemsTableRowDto,
FinancialTableColumnDto as SalesByItemsTableColumnDto,
FinancialTableDataDto as SalesByItemsTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class SalesByItemsTableResponseDto {
@ApiProperty({ description: 'Table data structure', type: () => FinancialTableDataDto })
table: FinancialTableDataDto;
@ApiProperty({ description: 'Query parameters used to generate the report', type: SalesByItemsQueryResponseDto })
query: SalesByItemsQueryResponseDto;
@ApiProperty({ description: 'Report metadata', type: SalesByItemsMetaDto })
meta: SalesByItemsMetaDto;
}
@@ -1,19 +1,26 @@
import { Response } from 'express';
import {
ApiExtraModels,
ApiOperation,
ApiProduces,
ApiResponse,
ApiTags,
getSchemaPath,
} from '@nestjs/swagger';
import { Controller, Get, Headers, Query, Res } from '@nestjs/common';
import { AcceptType } from '@/constants/accept-type';
import { SalesTaxLiabilitySummaryApplication } from './SalesTaxLiabilitySummaryApplication';
import { SalesTaxLiabilitySummaryQueryDto } from './dtos/SalesTaxLiabilityQuery.dto';
import {
SalesTaxLiabilitySummaryResponseDto,
SalesTaxLiabilitySummaryTableResponseDto,
} from './SalesTaxLiabilitySummaryResponse.dto';
import { ApiCommonHeaders } from '@/common/decorators/ApiCommonHeaders';
@Controller('/reports/sales-tax-liability-summary')
@ApiTags('Reports')
@ApiCommonHeaders()
@ApiExtraModels(SalesTaxLiabilitySummaryResponseDto, SalesTaxLiabilitySummaryTableResponseDto)
export class SalesTaxLiabilitySummaryController {
constructor(
private readonly salesTaxLiabilitySummaryApp: SalesTaxLiabilitySummaryApplication,
@@ -23,6 +30,14 @@ export class SalesTaxLiabilitySummaryController {
@ApiResponse({
status: 200,
description: 'Sales tax liability summary report',
content: {
[AcceptType.ApplicationJson]: {
schema: { $ref: getSchemaPath(SalesTaxLiabilitySummaryResponseDto) },
},
[AcceptType.ApplicationJsonTable]: {
schema: { $ref: getSchemaPath(SalesTaxLiabilitySummaryTableResponseDto) },
},
},
})
@ApiOperation({ summary: 'Get sales tax liability summary report' })
@ApiProduces(
@@ -0,0 +1,79 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { NumberFormatQueryDto } from '@/modules/BankingTransactions/dtos/NumberFormatQuery.dto';
import {
FinancialReportTotalDto,
FinancialReportMetaDto,
FinancialTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class TaxRateSummaryDto {
@ApiProperty({ description: 'Tax rate ID', type: Number })
id: number;
@ApiProperty({ description: 'Tax rate name' })
name: string;
@ApiProperty({ description: 'Tax rate percentage', type: Number })
rate: number;
@ApiProperty({ description: 'Taxable amount', type: FinancialReportTotalDto })
taxableAmount: FinancialReportTotalDto;
@ApiProperty({ description: 'Tax amount collected', type: FinancialReportTotalDto })
taxAmount: FinancialReportTotalDto;
@ApiProperty({ description: 'Total sales (including tax)', type: FinancialReportTotalDto })
totalSales: FinancialReportTotalDto;
}
export class SalesTaxLiabilitySummaryMetaDto extends FinancialReportMetaDto {
@ApiProperty({ description: 'Formatted from date' })
formattedFromDate: string;
@ApiProperty({ description: 'Formatted to date' })
formattedToDate: string;
@ApiProperty({ description: 'Formatted date range' })
formattedDateRange: string;
}
export class SalesTaxLiabilitySummaryQueryResponseDto {
@ApiProperty({ description: 'Start date' })
fromDate: string;
@ApiProperty({ description: 'End date' })
toDate: string;
@ApiProperty({ description: 'Number format settings', type: NumberFormatQueryDto })
numberFormat: NumberFormatQueryDto;
}
export class SalesTaxLiabilitySummaryResponseDto {
@ApiProperty({ description: 'Query parameters used to generate the report', type: SalesTaxLiabilitySummaryQueryResponseDto })
query: SalesTaxLiabilitySummaryQueryResponseDto;
@ApiProperty({ description: 'Tax rate summaries', type: [TaxRateSummaryDto] })
data: TaxRateSummaryDto[];
@ApiProperty({ description: 'Report metadata', type: SalesTaxLiabilitySummaryMetaDto })
meta: SalesTaxLiabilitySummaryMetaDto;
}
// Re-export table DTOs for convenience
export {
FinancialTableCellDto as SalesTaxLiabilitySummaryTableCellDto,
FinancialTableRowDto as SalesTaxLiabilitySummaryTableRowDto,
FinancialTableColumnDto as SalesTaxLiabilitySummaryTableColumnDto,
FinancialTableDataDto as SalesTaxLiabilitySummaryTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class SalesTaxLiabilitySummaryTableResponseDto {
@ApiProperty({ description: 'Table data structure', type: () => FinancialTableDataDto })
table: FinancialTableDataDto;
@ApiProperty({ description: 'Query parameters used to generate the report', type: SalesTaxLiabilitySummaryQueryResponseDto })
query: SalesTaxLiabilitySummaryQueryResponseDto;
@ApiProperty({ description: 'Report metadata', type: SalesTaxLiabilitySummaryMetaDto })
meta: SalesTaxLiabilitySummaryMetaDto;
}
@@ -1,5 +1,9 @@
import { Controller, Get, Headers, Query, Res } from '@nestjs/common';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { ApiExtraModels, ApiOperation, ApiResponse, ApiTags, getSchemaPath } from '@nestjs/swagger';
import {
TransactionsByCustomerResponseDto,
TransactionsByCustomerTableResponseDto,
} from './TransactionsByCustomerResponse.dto';
import { ITransactionsByCustomersFilter } from './TransactionsByCustomer.types';
import { TransactionsByCustomerApplication } from './TransactionsByCustomersApplication';
import { AcceptType } from '@/constants/accept-type';
@@ -10,6 +14,7 @@ import { ApiCommonHeaders } from '@/common/decorators/ApiCommonHeaders';
@Controller('/reports/transactions-by-customers')
@ApiTags('Reports')
@ApiCommonHeaders()
@ApiExtraModels(TransactionsByCustomerResponseDto, TransactionsByCustomerTableResponseDto)
export class TransactionsByCustomerController {
constructor(
private readonly transactionsByCustomersApp: TransactionsByCustomerApplication,
@@ -17,7 +22,18 @@ export class TransactionsByCustomerController {
@Get()
@ApiOperation({ summary: 'Get transactions by customer' })
@ApiResponse({ status: 200, description: 'Transactions by customer' })
@ApiResponse({
status: 200,
description: 'Transactions by customer',
content: {
[AcceptType.ApplicationJson]: {
schema: { $ref: getSchemaPath(TransactionsByCustomerResponseDto) },
},
[AcceptType.ApplicationJsonTable]: {
schema: { $ref: getSchemaPath(TransactionsByCustomerTableResponseDto) },
},
},
})
async transactionsByCustomer(
@Query() filter: TransactionsByCustomerQueryDto,
@Res({ passthrough: true }) res: Response,
@@ -0,0 +1,117 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { NumberFormatQueryDto } from '@/modules/BankingTransactions/dtos/NumberFormatQuery.dto';
import {
FinancialReportTotalDto,
FinancialReportMetaDto,
FinancialTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class CustomerTransactionDto {
@ApiProperty({ description: 'Transaction date' })
date: string;
@ApiProperty({ description: 'Formatted date' })
dateFormatted: string;
@ApiProperty({ description: 'Transaction type' })
transactionType: string;
@ApiProperty({ description: 'Transaction number' })
transactionNumber: string;
@ApiPropertyOptional({ description: 'Reference type' })
referenceType?: string;
@ApiPropertyOptional({ description: 'Reference ID', type: Number })
referenceId?: number;
@ApiPropertyOptional({ description: 'Transaction description' })
description?: string;
@ApiProperty({ description: 'Transaction amount', type: FinancialReportTotalDto })
amount: FinancialReportTotalDto;
@ApiProperty({ description: 'Running balance', type: FinancialReportTotalDto })
runningBalance: FinancialReportTotalDto;
}
export class CustomerWithTransactionsDto {
@ApiProperty({ description: 'Customer ID', type: Number })
customerId: number;
@ApiProperty({ description: 'Customer name' })
customerName: string;
@ApiPropertyOptional({ description: 'Opening balance', type: FinancialReportTotalDto })
openingBalance?: FinancialReportTotalDto;
@ApiProperty({ description: 'Customer transactions', type: [CustomerTransactionDto] })
transactions: CustomerTransactionDto[];
@ApiProperty({ description: 'Closing balance', type: FinancialReportTotalDto })
closingBalance: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Total debit', type: FinancialReportTotalDto })
totalDebit?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Total credit', type: FinancialReportTotalDto })
totalCredit?: FinancialReportTotalDto;
}
export class TransactionsByCustomerMetaDto extends FinancialReportMetaDto {
@ApiProperty({ description: 'Formatted from date' })
formattedFromDate: string;
@ApiProperty({ description: 'Formatted to date' })
formattedToDate: string;
@ApiProperty({ description: 'Formatted date range' })
formattedDateRange: string;
}
export class TransactionsByCustomerQueryResponseDto {
@ApiProperty({ description: 'Start date' })
fromDate: string;
@ApiProperty({ description: 'End date' })
toDate: string;
@ApiProperty({ description: 'Number format settings', type: NumberFormatQueryDto })
numberFormat: NumberFormatQueryDto;
@ApiProperty({ description: 'Customer IDs to include', type: [Number] })
customersIds: number[];
@ApiProperty({ description: 'Exclude zero balance customers' })
noneZero: boolean;
}
export class TransactionsByCustomerResponseDto {
@ApiProperty({ description: 'Query parameters used to generate the report', type: TransactionsByCustomerQueryResponseDto })
query: TransactionsByCustomerQueryResponseDto;
@ApiProperty({ description: 'Customers with transactions', type: [CustomerWithTransactionsDto] })
data: CustomerWithTransactionsDto[];
@ApiProperty({ description: 'Report metadata', type: TransactionsByCustomerMetaDto })
meta: TransactionsByCustomerMetaDto;
}
// Re-export table DTOs for convenience
export {
FinancialTableCellDto as TransactionsByCustomerTableCellDto,
FinancialTableRowDto as TransactionsByCustomerTableRowDto,
FinancialTableColumnDto as TransactionsByCustomerTableColumnDto,
FinancialTableDataDto as TransactionsByCustomerTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class TransactionsByCustomerTableResponseDto {
@ApiProperty({ description: 'Table data structure', type: () => FinancialTableDataDto })
table: FinancialTableDataDto;
@ApiProperty({ description: 'Query parameters used to generate the report', type: TransactionsByCustomerQueryResponseDto })
query: TransactionsByCustomerQueryResponseDto;
@ApiProperty({ description: 'Report metadata', type: TransactionsByCustomerMetaDto })
meta: TransactionsByCustomerMetaDto;
}
@@ -3,13 +3,18 @@ import { ITransactionsByVendorsFilter } from './TransactionsByVendor.types';
import { AcceptType } from '@/constants/accept-type';
import { Response } from 'express';
import { TransactionsByVendorApplication } from './TransactionsByVendorApplication';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { ApiExtraModels, ApiOperation, ApiResponse, ApiTags, getSchemaPath } from '@nestjs/swagger';
import {
TransactionsByVendorResponseDto,
TransactionsByVendorTableResponseDto,
} from './TransactionsByVendorResponse.dto';
import { TransactionsByVendorQueryDto } from './TransactionsByVendorQuery.dto';
import { ApiCommonHeaders } from '@/common/decorators/ApiCommonHeaders';
@Controller('/reports/transactions-by-vendors')
@ApiTags('Reports')
@ApiCommonHeaders()
@ApiExtraModels(TransactionsByVendorResponseDto, TransactionsByVendorTableResponseDto)
export class TransactionsByVendorController {
constructor(
private readonly transactionsByVendorsApp: TransactionsByVendorApplication,
@@ -17,7 +22,18 @@ export class TransactionsByVendorController {
@Get()
@ApiOperation({ summary: 'Get transactions by vendor' })
@ApiResponse({ status: 200, description: 'Transactions by vendor' })
@ApiResponse({
status: 200,
description: 'Transactions by vendor',
content: {
[AcceptType.ApplicationJson]: {
schema: { $ref: getSchemaPath(TransactionsByVendorResponseDto) },
},
[AcceptType.ApplicationJsonTable]: {
schema: { $ref: getSchemaPath(TransactionsByVendorTableResponseDto) },
},
},
})
async transactionsByVendor(
@Query() filter: TransactionsByVendorQueryDto,
@Res({ passthrough: true }) res: Response,
@@ -0,0 +1,117 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { NumberFormatQueryDto } from '@/modules/BankingTransactions/dtos/NumberFormatQuery.dto';
import {
FinancialReportTotalDto,
FinancialReportMetaDto,
FinancialTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class VendorTransactionDto {
@ApiProperty({ description: 'Transaction date' })
date: string;
@ApiProperty({ description: 'Formatted date' })
dateFormatted: string;
@ApiProperty({ description: 'Transaction type' })
transactionType: string;
@ApiProperty({ description: 'Transaction number' })
transactionNumber: string;
@ApiPropertyOptional({ description: 'Reference type' })
referenceType?: string;
@ApiPropertyOptional({ description: 'Reference ID', type: Number })
referenceId?: number;
@ApiPropertyOptional({ description: 'Transaction description' })
description?: string;
@ApiProperty({ description: 'Transaction amount', type: FinancialReportTotalDto })
amount: FinancialReportTotalDto;
@ApiProperty({ description: 'Running balance', type: FinancialReportTotalDto })
runningBalance: FinancialReportTotalDto;
}
export class VendorWithTransactionsDto {
@ApiProperty({ description: 'Vendor ID', type: Number })
vendorId: number;
@ApiProperty({ description: 'Vendor name' })
vendorName: string;
@ApiPropertyOptional({ description: 'Opening balance', type: FinancialReportTotalDto })
openingBalance?: FinancialReportTotalDto;
@ApiProperty({ description: 'Vendor transactions', type: [VendorTransactionDto] })
transactions: VendorTransactionDto[];
@ApiProperty({ description: 'Closing balance', type: FinancialReportTotalDto })
closingBalance: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Total debit', type: FinancialReportTotalDto })
totalDebit?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Total credit', type: FinancialReportTotalDto })
totalCredit?: FinancialReportTotalDto;
}
export class TransactionsByVendorMetaDto extends FinancialReportMetaDto {
@ApiProperty({ description: 'Formatted from date' })
formattedFromDate: string;
@ApiProperty({ description: 'Formatted to date' })
formattedToDate: string;
@ApiProperty({ description: 'Formatted date range' })
formattedDateRange: string;
}
export class TransactionsByVendorQueryResponseDto {
@ApiProperty({ description: 'Start date' })
fromDate: string;
@ApiProperty({ description: 'End date' })
toDate: string;
@ApiProperty({ description: 'Number format settings', type: NumberFormatQueryDto })
numberFormat: NumberFormatQueryDto;
@ApiProperty({ description: 'Vendor IDs to include', type: [Number] })
vendorsIds: number[];
@ApiProperty({ description: 'Exclude zero balance vendors' })
noneZero: boolean;
}
export class TransactionsByVendorResponseDto {
@ApiProperty({ description: 'Query parameters used to generate the report', type: TransactionsByVendorQueryResponseDto })
query: TransactionsByVendorQueryResponseDto;
@ApiProperty({ description: 'Vendors with transactions', type: [VendorWithTransactionsDto] })
data: VendorWithTransactionsDto[];
@ApiProperty({ description: 'Report metadata', type: TransactionsByVendorMetaDto })
meta: TransactionsByVendorMetaDto;
}
// Re-export table DTOs for convenience
export {
FinancialTableCellDto as TransactionsByVendorTableCellDto,
FinancialTableRowDto as TransactionsByVendorTableRowDto,
FinancialTableColumnDto as TransactionsByVendorTableColumnDto,
FinancialTableDataDto as TransactionsByVendorTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class TransactionsByVendorTableResponseDto {
@ApiProperty({ description: 'Table data structure', type: () => FinancialTableDataDto })
table: FinancialTableDataDto;
@ApiProperty({ description: 'Query parameters used to generate the report', type: TransactionsByVendorQueryResponseDto })
query: TransactionsByVendorQueryResponseDto;
@ApiProperty({ description: 'Report metadata', type: TransactionsByVendorMetaDto })
meta: TransactionsByVendorMetaDto;
}
@@ -1,9 +1,11 @@
import { Controller, Get, Headers, Query, Res } from '@nestjs/common';
import {
ApiExtraModels,
ApiOperation,
ApiProduces,
ApiResponse,
ApiTags,
getSchemaPath,
} from '@nestjs/swagger';
import { castArray } from 'lodash';
import { Response } from 'express';
@@ -11,11 +13,16 @@ import { AcceptType } from '@/constants/accept-type';
import { TrialBalanceSheetApplication } from './TrialBalanceSheetApplication';
import { TrialBalanceSheetQueryDto } from './TrialBalanceSheetQuery.dto';
import { TrialBalanceSheetResponseExample } from './TrialBalanceSheet.swagger';
import {
TrialBalanceSheetResponseDto,
TrialBalanceSheetTableResponseDto,
} from './TrialBalanceSheetResponse.dto';
import { ApiCommonHeaders } from '@/common/decorators/ApiCommonHeaders';
@Controller('reports/trial-balance-sheet')
@ApiTags('Reports')
@ApiCommonHeaders()
@ApiExtraModels(TrialBalanceSheetResponseDto, TrialBalanceSheetTableResponseDto)
export class TrialBalanceSheetController {
constructor(
private readonly trialBalanceSheetApp: TrialBalanceSheetApplication,
@@ -26,7 +33,15 @@ export class TrialBalanceSheetController {
@ApiResponse({
status: 200,
description: 'Trial balance sheet',
example: TrialBalanceSheetResponseExample,
content: {
[AcceptType.ApplicationJson]: {
schema: { $ref: getSchemaPath(TrialBalanceSheetResponseDto) },
example: TrialBalanceSheetResponseExample,
},
[AcceptType.ApplicationJsonTable]: {
schema: { $ref: getSchemaPath(TrialBalanceSheetTableResponseDto) },
},
},
})
@ApiProduces(
AcceptType.ApplicationJson,
@@ -0,0 +1,123 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import {
FinancialReportTotalDto,
FinancialReportMetaDto,
FinancialTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class TrialBalanceSheetAccountDto {
@ApiProperty({ description: 'Account ID', type: Number })
id: number;
@ApiProperty({ description: 'Account name' })
name: string;
@ApiProperty({ description: 'Account code' })
code: string;
@ApiPropertyOptional({ description: 'Opening balance', type: FinancialReportTotalDto })
openingBalance?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Closing balance', type: FinancialReportTotalDto })
closingBalance?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Debit total', type: FinancialReportTotalDto })
debitTotal?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Credit total', type: FinancialReportTotalDto })
creditTotal?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Debit/change', type: FinancialReportTotalDto })
debit?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Credit/change', type: FinancialReportTotalDto })
credit?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Period balance', type: FinancialReportTotalDto })
periodBalance?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Account normal', enum: ['debit', 'credit'] })
accountNormal?: string;
@ApiPropertyOptional({ description: 'Account index', type: Number })
index?: number;
}
export class TrialBalanceSheetMetaDto extends FinancialReportMetaDto {
@ApiProperty({ description: 'Formatted from date' })
formattedFromDate: string;
@ApiProperty({ description: 'Formatted to date' })
formattedToDate: string;
@ApiProperty({ description: 'Formatted date range' })
formattedDateRange: string;
@ApiPropertyOptional({ description: 'Opening balance at', type: Date })
openingBalanceAt?: Date;
@ApiPropertyOptional({ description: 'Closing balance at', type: Date })
closingBalanceAt?: Date;
@ApiPropertyOptional({ description: 'Formatted opening balance date' })
formattedOpeningBalanceDate?: string;
@ApiPropertyOptional({ description: 'Formatted closing balance date' })
formattedClosingBalanceDate?: string;
}
export class TrialBalanceSheetQueryResponseDto {
@ApiProperty({ description: 'Start date' })
fromDate: string;
@ApiProperty({ description: 'End date' })
toDate: string;
@ApiProperty({ description: 'Account IDs to include', type: [Number] })
accountIds: number[];
@ApiProperty({ description: 'Exclude zero balance accounts' })
noneZero: boolean;
@ApiProperty({ description: 'Exclude accounts with no transactions' })
noneTransactions: boolean;
@ApiProperty({ description: 'Accounting basis', enum: ['cash', 'accrual'] })
basis: string;
@ApiProperty({ description: 'Column display type', enum: ['total', 'date_periods'] })
displayColumnsType: string;
@ApiProperty({ description: 'Column grouping', enum: ['day', 'month', 'year', 'quarter'] })
displayColumnsBy: string;
}
export class TrialBalanceSheetResponseDto {
@ApiProperty({ description: 'Query parameters used to generate the report', type: TrialBalanceSheetQueryResponseDto })
query: TrialBalanceSheetQueryResponseDto;
@ApiProperty({ description: 'Trial balance sheet data', type: [TrialBalanceSheetAccountDto] })
data: TrialBalanceSheetAccountDto[];
@ApiProperty({ description: 'Report metadata', type: TrialBalanceSheetMetaDto })
meta: TrialBalanceSheetMetaDto;
}
// Re-export table DTOs for convenience
export {
FinancialTableCellDto as TrialBalanceSheetTableCellDto,
FinancialTableRowDto as TrialBalanceSheetTableRowDto,
FinancialTableColumnDto as TrialBalanceSheetTableColumnDto,
FinancialTableDataDto as TrialBalanceSheetTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class TrialBalanceSheetTableResponseDto {
@ApiProperty({ description: 'Table data structure', type: () => FinancialTableDataDto })
table: FinancialTableDataDto;
@ApiProperty({ description: 'Query parameters used to generate the report', type: TrialBalanceSheetQueryResponseDto })
query: TrialBalanceSheetQueryResponseDto;
@ApiProperty({ description: 'Report metadata', type: TrialBalanceSheetMetaDto })
meta: TrialBalanceSheetMetaDto;
}
@@ -4,17 +4,24 @@ import { VendorBalanceSummaryApplication } from './VendorBalanceSummaryApplicati
import { Response } from 'express';
import { AcceptType } from '@/constants/accept-type';
import {
ApiExtraModels,
ApiOperation,
ApiProduces,
ApiResponse,
ApiTags,
getSchemaPath,
} from '@nestjs/swagger';
import { VendorBalanceSummaryQueryDto } from './VendorBalanceSummaryQuery.dto';
import {
VendorBalanceSummaryResponseDto,
VendorBalanceSummaryTableResponseDto,
} from './VendorBalanceSummaryResponse.dto';
import { ApiCommonHeaders } from '@/common/decorators/ApiCommonHeaders';
@Controller('/reports/vendor-balance-summary')
@ApiTags('Reports')
@ApiCommonHeaders()
@ApiExtraModels(VendorBalanceSummaryResponseDto, VendorBalanceSummaryTableResponseDto)
export class VendorBalanceSummaryController {
constructor(
private readonly vendorBalanceSummaryApp: VendorBalanceSummaryApplication,
@@ -22,7 +29,18 @@ export class VendorBalanceSummaryController {
@Get()
@ApiOperation({ summary: 'Get vendor balance summary' })
@ApiResponse({ status: 200, description: 'Vendor balance summary' })
@ApiResponse({
status: 200,
description: 'Vendor balance summary',
content: {
[AcceptType.ApplicationJson]: {
schema: { $ref: getSchemaPath(VendorBalanceSummaryResponseDto) },
},
[AcceptType.ApplicationJsonTable]: {
schema: { $ref: getSchemaPath(VendorBalanceSummaryTableResponseDto) },
},
},
})
@ApiProduces(
AcceptType.ApplicationJson,
AcceptType.ApplicationJsonTable,
@@ -0,0 +1,82 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { NumberFormatQueryDto } from '@/modules/BankingTransactions/dtos/NumberFormatQuery.dto';
import {
FinancialReportTotalDto,
FinancialReportMetaDto,
FinancialTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class VendorBalanceDto {
@ApiProperty({ description: 'Vendor ID', type: Number })
vendorId: number;
@ApiProperty({ description: 'Vendor name' })
vendorName: string;
@ApiPropertyOptional({ description: 'Opening balance', type: FinancialReportTotalDto })
openingBalance?: FinancialReportTotalDto;
@ApiProperty({ description: 'Closing balance', type: FinancialReportTotalDto })
closingBalance: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Total debit', type: FinancialReportTotalDto })
totalDebit?: FinancialReportTotalDto;
@ApiPropertyOptional({ description: 'Total credit', type: FinancialReportTotalDto })
totalCredit?: FinancialReportTotalDto;
}
export class VendorBalanceSummaryMetaDto extends FinancialReportMetaDto {
@ApiProperty({ description: 'Formatted as-of date' })
formattedAsDate: string;
@ApiProperty({ description: 'Formatted date range' })
formattedDateRange: string;
}
export class VendorBalanceSummaryQueryResponseDto {
@ApiProperty({ description: 'As-of date' })
asDate: string;
@ApiProperty({ description: 'Number format settings', type: NumberFormatQueryDto })
numberFormat: NumberFormatQueryDto;
@ApiProperty({ description: 'Vendor IDs to include', type: [Number] })
vendorsIds: number[];
@ApiProperty({ description: 'Exclude zero balance vendors' })
noneZero: boolean;
@ApiProperty({ description: 'Exclude inactive vendors' })
noneInactive: boolean;
}
export class VendorBalanceSummaryResponseDto {
@ApiProperty({ description: 'Query parameters used to generate the report', type: VendorBalanceSummaryQueryResponseDto })
query: VendorBalanceSummaryQueryResponseDto;
@ApiProperty({ description: 'Vendor balances', type: [VendorBalanceDto] })
data: VendorBalanceDto[];
@ApiProperty({ description: 'Report metadata', type: VendorBalanceSummaryMetaDto })
meta: VendorBalanceSummaryMetaDto;
}
// Re-export table DTOs for convenience
export {
FinancialTableCellDto as VendorBalanceSummaryTableCellDto,
FinancialTableRowDto as VendorBalanceSummaryTableRowDto,
FinancialTableColumnDto as VendorBalanceSummaryTableColumnDto,
FinancialTableDataDto as VendorBalanceSummaryTableDataDto,
} from '../../dtos/FinancialReportResponse.dto';
export class VendorBalanceSummaryTableResponseDto {
@ApiProperty({ description: 'Table data structure', type: () => FinancialTableDataDto })
table: FinancialTableDataDto;
@ApiProperty({ description: 'Query parameters used to generate the report', type: VendorBalanceSummaryQueryResponseDto })
query: VendorBalanceSummaryQueryResponseDto;
@ApiProperty({ description: 'Report metadata', type: VendorBalanceSummaryMetaDto })
meta: VendorBalanceSummaryMetaDto;
}