feat: wip migrate to nestjs

This commit is contained in:
Ahmed Bouhuolia
2024-12-26 15:40:29 +02:00
parent a6932d76f3
commit cd84872a61
96 changed files with 2051 additions and 745 deletions

View File

@@ -0,0 +1,57 @@
import {
Body,
Controller,
Delete,
Get,
Param,
ParseIntPipe,
Post,
Put,
} from '@nestjs/common';
import { ISaleReceiptDTO } from './types/SaleReceipts.types';
import { SaleReceiptApplication } from './SaleReceiptApplication.service';
import { PublicRoute } from '../Auth/Jwt.guard';
@Controller('sale-receipts')
@PublicRoute()
export class SaleReceiptsController {
constructor(private saleReceiptApplication: SaleReceiptApplication) {}
@Post()
createSaleReceipt(@Body() saleReceiptDTO: ISaleReceiptDTO) {
return this.saleReceiptApplication.createSaleReceipt(saleReceiptDTO);
}
@Put(':id')
editSaleReceipt(
@Param('id', ParseIntPipe) id: number,
@Body() saleReceiptDTO: ISaleReceiptDTO,
) {
return this.saleReceiptApplication.editSaleReceipt(id, saleReceiptDTO);
}
@Get(':id')
getSaleReceipt(@Param('id', ParseIntPipe) id: number) {
return this.saleReceiptApplication.getSaleReceipt(id);
}
@Delete(':id')
deleteSaleReceipt(@Param('id', ParseIntPipe) id: number) {
return this.saleReceiptApplication.deleteSaleReceipt(id);
}
@Post(':id/close')
closeSaleReceipt(@Param('id', ParseIntPipe) id: number) {
return this.saleReceiptApplication.closeSaleReceipt(id);
}
@Get(':id/pdf')
getSaleReceiptPdf(@Param('id', ParseIntPipe) id: number) {
return this.saleReceiptApplication.getSaleReceiptPdf(0, id);
}
@Get('state')
getSaleReceiptState() {
return this.saleReceiptApplication.getSaleReceiptState();
}
}

View File

@@ -5,15 +5,47 @@ import { EditSaleReceipt } from './commands/EditSaleReceipt.service';
import { GetSaleReceipt } from './queries/GetSaleReceipt.service';
import { DeleteSaleReceipt } from './commands/DeleteSaleReceipt.service';
import { CloseSaleReceipt } from './commands/CloseSaleReceipt.service';
import { SaleReceiptsPdfService } from './queries/SaleReceiptsPdf.service';
import { GetSaleReceiptState } from './queries/GetSaleReceiptState.service';
import { ItemsModule } from '../Items/items.module';
import { SaleReceiptDTOTransformer } from './commands/SaleReceiptDTOTransformer.service';
import { SaleReceiptValidators } from './commands/SaleReceiptValidators.service';
import { ChromiumlyTenancyModule } from '../ChromiumlyTenancy/ChromiumlyTenancy.module';
import { TemplateInjectableModule } from '../TemplateInjectable/TemplateInjectable.module';
import { TenancyContext } from '../Tenancy/TenancyContext.service';
import { SaleReceiptBrandingTemplate } from './queries/SaleReceiptBrandingTemplate.service';
import { BranchesModule } from '../Branches/Branches.module';
import { WarehousesModule } from '../Warehouses/Warehouses.module';
import { SaleReceiptIncrement } from './commands/SaleReceiptIncrement.service';
import { PdfTemplatesModule } from '../PdfTemplate/PdfTemplates.module';
import { AutoIncrementOrdersModule } from '../AutoIncrementOrders/AutoIncrementOrders.module';
import { SaleReceiptsController } from './SaleReceipts.controller';
@Module({
controllers: [SaleReceiptsController],
imports: [
ItemsModule,
ChromiumlyTenancyModule,
TemplateInjectableModule,
BranchesModule,
WarehousesModule,
PdfTemplatesModule,
AutoIncrementOrdersModule
],
providers: [
TenancyContext,
SaleReceiptValidators,
SaleReceiptApplication,
CreateSaleReceipt,
EditSaleReceipt,
GetSaleReceipt,
DeleteSaleReceipt,
CloseSaleReceipt,
SaleReceiptsPdfService,
GetSaleReceiptState,
SaleReceiptDTOTransformer,
SaleReceiptBrandingTemplate,
SaleReceiptIncrement,
],
})
export class SaleReceiptsModule {}

View File

@@ -1,7 +1,7 @@
import { Inject, Injectable } from '@nestjs/common';
import * as R from 'ramda';
import { sumBy, omit } from 'lodash';
import composeAsync from 'async/compose';
import * as composeAsync from 'async/compose';
import moment from 'moment';
import { SaleReceiptIncrement } from './SaleReceiptIncrement.service';
import { ItemsEntriesService } from '@/modules/Items/ItemsEntries.service';
@@ -18,6 +18,15 @@ import { Customer } from '@/modules/Customers/models/Customer';
@Injectable()
export class SaleReceiptDTOTransformer {
/**
* @param {ItemsEntriesService} itemsEntriesService - Items entries service.
* @param {BranchTransactionDTOTransformer} branchDTOTransform - Branch transaction DTO transformer.
* @param {WarehouseTransactionDTOTransform} warehouseDTOTransform - Warehouse transaction DTO transformer.
* @param {SaleReceiptValidators} validators - Sale receipt validators.
* @param {SaleReceiptIncrement} receiptIncrement - Sale receipt increment.
* @param {BrandingTemplateDTOTransformer} brandingTemplatesTransformer - Branding template DTO transformer.
* @param {typeof ItemEntry} itemEntryModel - Item entry model.
*/
constructor(
private readonly itemsEntriesService: ItemsEntriesService,
private readonly branchDTOTransform: BranchTransactionDTOTransformer,
@@ -60,10 +69,9 @@ export class SaleReceiptDTOTransformer {
reference_type: 'SaleReceipt',
...entry,
}));
const asyncEntries = await composeAsync(
// Sets default cost and sell account to receipt items entries.
this.itemsEntriesService.setItemsEntriesDefaultAccounts(),
this.itemsEntriesService.setItemsEntriesDefaultAccounts,
)(initialEntries);
const entries = R.compose(
@@ -97,6 +105,6 @@ export class SaleReceiptDTOTransformer {
return R.compose(
this.branchDTOTransform.transformDTO<SaleReceipt>,
this.warehouseDTOTransform.transformDTO<SaleReceipt>,
)(initialAsyncDTO);
)(initialAsyncDTO) as SaleReceipt;
}
}

View File

@@ -12,8 +12,8 @@ export class SaleReceiptValidators {
* @param {typeof Account} accountModel - Account model.
*/
constructor(
@Inject(SaleReceipt) private saleReceiptModel: typeof SaleReceipt,
@Inject(Account) private accountModel: typeof Account,
@Inject(SaleReceipt.name) private saleReceiptModel: typeof SaleReceipt,
@Inject(Account.name) private accountModel: typeof Account,
) {}
/**

View File

@@ -119,18 +119,18 @@ export class SaleReceipt extends BaseModel {
* Relationship mapping.
*/
static get relationMappings() {
const Customer = require('@/modules/Customers/models/Customer');
const Account = require('@/modules/Accounts/models/Account.model');
const AccountTransaction = require('@/modules/AccountsTransactions/models/AccountTransaction.model');
const ItemEntry = require('@/modules/ItemsEntries/models/ItemEntry');
const Branch = require('@/modules/Branches/models/Branch');
const Document = require('@/modules/Documents/models/Document');
const Warehouse = require('@/modules/Warehouses/models/Warehouse');
const { Customer } = require('../../Customers/models/Customer');
const { Account } = require('../../Accounts/models/Account.model');
const { AccountTransaction } = require('../../Accounts/models/AccountTransaction.model');
const { ItemEntry } = require('../../TransactionItemEntry/models/ItemEntry');
const { Branch } = require('../../Branches/models/Branch.model');
const { Document } = require('../../ChromiumlyTenancy/models/Document');
const { Warehouse } = require('../../Warehouses/models/Warehouse.model');
return {
customer: {
relation: Model.BelongsToOneRelation,
modelClass: Customer.default,
modelClass: Customer,
join: {
from: 'sales_receipts.customerId',
to: 'contacts.id',
@@ -142,7 +142,7 @@ export class SaleReceipt extends BaseModel {
depositAccount: {
relation: Model.BelongsToOneRelation,
modelClass: Account.default,
modelClass: Account,
join: {
from: 'sales_receipts.depositAccountId',
to: 'accounts.id',
@@ -151,7 +151,7 @@ export class SaleReceipt extends BaseModel {
entries: {
relation: Model.HasManyRelation,
modelClass: ItemEntry.default,
modelClass: ItemEntry,
join: {
from: 'sales_receipts.id',
to: 'items_entries.referenceId',
@@ -164,7 +164,7 @@ export class SaleReceipt extends BaseModel {
transactions: {
relation: Model.HasManyRelation,
modelClass: AccountTransaction.default,
modelClass: AccountTransaction,
join: {
from: 'sales_receipts.id',
to: 'accounts_transactions.referenceId',
@@ -179,7 +179,7 @@ export class SaleReceipt extends BaseModel {
*/
branch: {
relation: Model.BelongsToOneRelation,
modelClass: Branch.default,
modelClass: Branch,
join: {
from: 'sales_receipts.branchId',
to: 'branches.id',
@@ -191,7 +191,7 @@ export class SaleReceipt extends BaseModel {
*/
warehouse: {
relation: Model.BelongsToOneRelation,
modelClass: Warehouse.default,
modelClass: Warehouse,
join: {
from: 'sales_receipts.warehouseId',
to: 'warehouses.id',
@@ -203,7 +203,7 @@ export class SaleReceipt extends BaseModel {
*/
attachments: {
relation: Model.ManyToManyRelation,
modelClass: Document.default,
modelClass: Document,
join: {
from: 'sales_receipts.id',
through: {

View File

@@ -1,4 +1,4 @@
import { Injectable } from '@nestjs/common';
import { Inject, Injectable } from '@nestjs/common';
import { SaleReceiptTransformer } from './SaleReceiptTransformer';
import { SaleReceiptValidators } from '../commands/SaleReceiptValidators.service';
import { SaleReceipt } from '../models/SaleReceipt';
@@ -7,6 +7,7 @@ import { TransformerInjectable } from '@/modules/Transformer/TransformerInjectab
@Injectable()
export class GetSaleReceipt {
constructor(
@Inject(SaleReceipt.name)
private readonly saleReceiptModel: typeof SaleReceipt,
private readonly transformer: TransformerInjectable,
private readonly validators: SaleReceiptValidators,
@@ -26,11 +27,11 @@ export class GetSaleReceipt {
.withGraphFetched('depositAccount')
.withGraphFetched('branch')
.withGraphFetched('attachments')
.throwIfNotFound()
.throwIfNotFound();
return this.transformer.transform(
saleReceipt,
new SaleReceiptTransformer()
new SaleReceiptTransformer(),
);
}
}