1
0
Files
bigcapital/packages/server/src/modules/SaleReceipts/queries/GetSaleReceipts.service.ts
T
Ahmed Bouhuolia 2f45263263 feat(server): add Query DTOs for consistent filtering across modules
- Add GetBillsQuery.dto.ts, GetCreditNotesQuery.dto.ts, GetExpensesQuery.dto.ts
- Add GetItemCategoriesQuery.dto.ts, GetManualJournalsQuery.dto.ts
- Add GetPaymentsReceivedQuery.dto.ts, GetSaleEstimatesQuery.dto.ts
- Add GetSaleInvoicesQuery.dto.ts, GetSaleReceiptsQuery.dto.ts, GetVendorCreditsQuery.dto.ts
- Update DynamicFilterQuery.dto.ts with enhanced filter options
- Refactor controllers and services to use new Query DTOs
- Update SDK schema and sale-estimates types

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 08:50:15 +02:00

81 lines
2.6 KiB
TypeScript

import * as R from 'ramda';
import { Inject, Injectable } from '@nestjs/common';
import { SaleReceiptTransformer } from './SaleReceiptTransformer';
import { TransformerInjectable } from '@/modules/Transformer/TransformerInjectable.service';
import { DynamicListService } from '@/modules/DynamicListing/DynamicList.service';
import { IFilterMeta, IPaginationMeta } from '@/interfaces/Model';
import { GetSaleReceiptsQueryDto } from '../dtos/GetSaleReceiptsQuery.dto';
import { SaleReceipt } from '../models/SaleReceipt';
import { TenantModelProxy } from '@/modules/System/models/TenantBaseModel';
interface GetSaleReceiptsSettings {
fetchEntriesGraph?: boolean;
}
@Injectable()
export class GetSaleReceiptsService {
constructor(
private readonly transformer: TransformerInjectable,
private readonly dynamicListService: DynamicListService,
@Inject(SaleReceipt.name)
private readonly saleReceiptModel: TenantModelProxy<typeof SaleReceipt>,
) {}
/**
* Retrieve sales receipts paginated and filterable list.
* @param {GetSaleReceiptsQueryDto} filterDTO - Sales receipts filter.
*/
public async getSaleReceipts(filterDTO: GetSaleReceiptsQueryDto): Promise<{
data: SaleReceipt[];
pagination: IPaginationMeta;
filterMeta: IFilterMeta;
}> {
const _filterDto = {
sortOrder: 'desc',
columnSortBy: 'created_at',
page: 1,
pageSize: 12,
...filterDTO,
};
// Parses the stringified filter roles.
const filter = this.parseListFilterDTO(_filterDto);
// Dynamic list service.
const dynamicFilter = await this.dynamicListService.dynamicList(
SaleReceipt,
filter,
);
const { results, pagination } = await this.saleReceiptModel()
.query()
.onBuild((builder) => {
builder.withGraphFetched('depositAccount');
builder.withGraphFetched('customer');
builder.withGraphFetched('entries.item');
dynamicFilter.buildQuery()(builder);
_filterDto?.filterQuery && _filterDto?.filterQuery(builder);
})
.pagination(filter.page - 1, filter.pageSize);
// Transformes the estimates models to POJO.
const salesEstimates = await this.transformer.transform(
results,
new SaleReceiptTransformer(),
);
return {
data: salesEstimates,
pagination,
filterMeta: dynamicFilter.getResponseMeta(),
};
}
/**
* Parses the sale invoice list filter DTO.
* @param filterDTO
* @returns
*/
private parseListFilterDTO(filterDTO) {
return R.compose(this.dynamicListService.parseStringifiedFilter)(filterDTO);
}
}