This commit is contained in:
Ahmed Bouhuolia
2025-11-19 22:59:21 +02:00
parent 17bcc14231
commit 2b384b2f6f
31 changed files with 405 additions and 62 deletions

View File

@@ -8,21 +8,31 @@ import { DeleteVendorCreditService } from './commands/DeleteVendorCredit.service
export class BulkDeleteVendorCreditsService {
constructor(
private readonly deleteVendorCreditService: DeleteVendorCreditService,
) {}
) { }
async bulkDeleteVendorCredits(
vendorCreditIds: number | Array<number>,
options?: { skipUndeletable?: boolean },
trx?: Knex.Transaction,
): Promise<void> {
const { skipUndeletable = false } = options ?? {};
const creditsIds = uniq(castArray(vendorCreditIds));
const results = await PromisePool.withConcurrency(1)
.for(creditsIds)
.process(async (vendorCreditId: number) => {
await this.deleteVendorCreditService.deleteVendorCredit(vendorCreditId);
try {
await this.deleteVendorCreditService.deleteVendorCredit(
vendorCreditId,
);
} catch (error) {
if (!skipUndeletable) {
throw error;
}
}
});
if (results.errors && results.errors.length > 0) {
if (!skipUndeletable && results.errors && results.errors.length > 0) {
throw results.errors[0].raw;
}
}

View File

@@ -7,23 +7,82 @@ import {
Post,
Put,
Query,
DefaultValuePipe,
ParseBoolPipe,
} from '@nestjs/common';
import { VendorCreditsApplicationService } from './VendorCreditsApplication.service';
import { IVendorCreditsQueryDTO } from './types/VendorCredit.types';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import {
ApiExtraModels,
ApiOperation,
ApiQuery,
ApiResponse,
ApiTags,
getSchemaPath,
} from '@nestjs/swagger';
import {
CreateVendorCreditDto,
EditVendorCreditDto,
} from './dtos/VendorCredit.dto';
import { ApiCommonHeaders } from '@/common/decorators/ApiCommonHeaders';
import {
BulkDeleteDto,
ValidateBulkDeleteResponseDto,
} from '@/common/dtos/BulkDelete.dto';
@Controller('vendor-credits')
@ApiTags('Vendor Credits')
@ApiCommonHeaders()
@ApiExtraModels(ValidateBulkDeleteResponseDto)
export class VendorCreditsController {
constructor(
private readonly vendorCreditsApplication: VendorCreditsApplicationService,
) {}
) { }
@Post('validate-bulk-delete')
@ApiOperation({
summary:
'Validates which vendor credits can be deleted and returns the results.',
})
@ApiResponse({
status: 200,
description:
'Validation completed with counts and IDs of deletable and non-deletable vendor credits.',
schema: {
$ref: getSchemaPath(ValidateBulkDeleteResponseDto),
},
})
async validateBulkDeleteVendorCredits(
@Body() bulkDeleteDto: BulkDeleteDto,
): Promise<ValidateBulkDeleteResponseDto> {
return this.vendorCreditsApplication.validateBulkDeleteVendorCredits(
bulkDeleteDto.ids,
);
}
@Post('bulk-delete')
@ApiOperation({ summary: 'Deletes multiple vendor credits.' })
@ApiQuery({
name: 'skip_undeletable',
required: false,
type: Boolean,
description:
'When true, undeletable vendor credits will be skipped and only deletable ones will be removed.',
})
@ApiResponse({
status: 200,
description: 'Vendor credits deleted successfully',
})
async bulkDeleteVendorCredits(
@Body() bulkDeleteDto: BulkDeleteDto,
@Query('skip_undeletable', new DefaultValuePipe(false), ParseBoolPipe)
skipUndeletable: boolean,
): Promise<void> {
return this.vendorCreditsApplication.bulkDeleteVendorCredits(
bulkDeleteDto.ids,
{ skipUndeletable },
);
}
@Post()
@ApiOperation({ summary: 'Create a new vendor credit.' })

View File

@@ -28,6 +28,8 @@ import { DynamicListModule } from '../DynamicListing/DynamicList.module';
import { InventoryCostModule } from '../InventoryCost/InventoryCost.module';
import { VendorCreditsExportable } from './commands/VendorCreditsExportable';
import { VendorCreditsImportable } from './commands/VendorCreditsImportable';
import { BulkDeleteVendorCreditsService } from './BulkDeleteVendorCredits.service';
import { ValidateBulkDeleteVendorCreditsService } from './ValidateBulkDeleteVendorCredits.service';
@Module({
imports: [
@@ -61,6 +63,8 @@ import { VendorCreditsImportable } from './commands/VendorCreditsImportable';
VendorCreditAutoSerialSubscriber,
VendorCreditsExportable,
VendorCreditsImportable,
BulkDeleteVendorCreditsService,
ValidateBulkDeleteVendorCreditsService,
],
exports: [
CreateVendorCreditService,
@@ -74,6 +78,8 @@ import { VendorCreditsImportable } from './commands/VendorCreditsImportable';
OpenVendorCreditService,
VendorCreditsExportable,
VendorCreditsImportable,
BulkDeleteVendorCreditsService,
ValidateBulkDeleteVendorCreditsService,
],
controllers: [VendorCreditsController],
})

View File

@@ -3,12 +3,21 @@ import { CreateVendorCreditService } from './commands/CreateVendorCredit.service
import { DeleteVendorCreditService } from './commands/DeleteVendorCredit.service';
import { EditVendorCreditService } from './commands/EditVendorCredit.service';
import { GetVendorCreditService } from './queries/GetVendorCredit.service';
import { IVendorCreditEditDTO, IVendorCreditsQueryDTO } from './types/VendorCredit.types';
import {
IVendorCreditEditDTO,
IVendorCreditsQueryDTO,
} from './types/VendorCredit.types';
import { IVendorCreditCreateDTO } from './types/VendorCredit.types';
import { Injectable } from '@nestjs/common';
import { OpenVendorCreditService } from './commands/OpenVendorCredit.service';
import { GetVendorCreditsService } from './queries/GetVendorCredits.service';
import { CreateVendorCreditDto, EditVendorCreditDto } from './dtos/VendorCredit.dto';
import {
CreateVendorCreditDto,
EditVendorCreditDto,
} from './dtos/VendorCredit.dto';
import { BulkDeleteVendorCreditsService } from './BulkDeleteVendorCredits.service';
import { ValidateBulkDeleteVendorCreditsService } from './ValidateBulkDeleteVendorCredits.service';
import { ValidateBulkDeleteResponseDto } from '@/common/dtos/BulkDelete.dto';
@Injectable()
export class VendorCreditsApplicationService {
@@ -25,7 +34,9 @@ export class VendorCreditsApplicationService {
private readonly getVendorCreditService: GetVendorCreditService,
private readonly openVendorCreditService: OpenVendorCreditService,
private readonly getVendorCreditsService: GetVendorCreditsService,
) {}
private readonly bulkDeleteVendorCreditsService: BulkDeleteVendorCreditsService,
private readonly validateBulkDeleteVendorCreditsService: ValidateBulkDeleteVendorCreditsService,
) { }
/**
* Creates a new vendor credit.
@@ -90,4 +101,22 @@ export class VendorCreditsApplicationService {
getVendorCredits(query: IVendorCreditsQueryDTO) {
return this.getVendorCreditsService.getVendorCredits(query);
}
bulkDeleteVendorCredits(
vendorCreditIds: number[],
options?: { skipUndeletable?: boolean },
) {
return this.bulkDeleteVendorCreditsService.bulkDeleteVendorCredits(
vendorCreditIds,
options,
);
}
validateBulkDeleteVendorCredits(
vendorCreditIds: number[],
): Promise<ValidateBulkDeleteResponseDto> {
return this.validateBulkDeleteVendorCreditsService.validateBulkDeleteVendorCredits(
vendorCreditIds,
);
}
}