From 19115d50feaa0780500adc31c3251ac4aff63aa2 Mon Sep 17 00:00:00 2001 From: Kallesh B S Date: Fri, 19 Sep 2025 17:29:05 +0530 Subject: [PATCH] adding carnet module --- .../carnet-application.controller.ts | 302 ++++++++++++++ .../carnet-application.module.ts | 9 + .../carnet-application.service.ts | 371 ++++++++++++++++++ src/pg/pg.module.ts | 3 +- src/utils/helper.ts | 3 +- 5 files changed, 686 insertions(+), 2 deletions(-) create mode 100644 src/pg/carnet-application/carnet-application.controller.ts create mode 100644 src/pg/carnet-application/carnet-application.module.ts create mode 100644 src/pg/carnet-application/carnet-application.service.ts diff --git a/src/pg/carnet-application/carnet-application.controller.ts b/src/pg/carnet-application/carnet-application.controller.ts new file mode 100644 index 0000000..1998bdb --- /dev/null +++ b/src/pg/carnet-application/carnet-application.controller.ts @@ -0,0 +1,302 @@ +import { Body, Controller, Delete, Get, HttpCode, Param, Patch, Post, Put, Res, StreamableFile, UseGuards } from '@nestjs/common'; +import { CarnetApplicationService } from './carnet-application.service'; + +import { + AddCountriesDTO, + AddGenerallistItemsDTO, + CA_UpdateHolderDTO, + CapturePaymentDTO, + CarnetProcessingCenterDTO, CarnetProcessingCenterDTO2, CopyCarnetDTO, CreateApplicationDTO, DeleteGenerallistItemsDTO, EditGenerallistItemsDTO, GetCarnetControlCenterDTO, GetExtendedSectionDTO, GetOrderDetailsDTO, GetPaymentHistoryDTO, InitiatePaymentDTO, PrintCarnetDTO, PrintGLDTO, SaveCarnetApplicationDTO, SaveExtensionApplicationDTO, SaveHistoryDTO, TransmitApplicationtoProcessDTO, + UpdateExpGoodsAuthRepDTO, + UpdateShippingDetailsDTO +} from 'src/dto/property.dto'; +import { Roles } from 'src/decorators/roles.decorator'; +import { deleteFilesAsync, generateFinalPDF, replaceSlashWithDash } from 'src/utils/helper'; +import { Response } from 'express'; +import { join } from 'path'; +import { InternalServerException } from 'src/exceptions/internalServerError.exception'; +import { BadRequestException } from 'src/exceptions/badRequest.exception'; +import { createReadStream } from 'fs'; +import { BadRequestException as BR } from 'src/exceptions/badRequest.exception'; +import { JwtAuthGuard } from 'src/guards/jwt-auth.guard'; +import { RolesGuard } from 'src/guards/roles.guard'; +import { ApiExcludeController, ApiTags } from '@nestjs/swagger'; + +@ApiTags('Carnet Application - PG') +// @UseGuards(JwtAuthGuard, RolesGuard) +@Roles('ca', 'sa') +@Controller('2') +export class CarnetApplicationController { + constructor(private readonly carnetApplicationService: CarnetApplicationService) { } + + // [ CARNETAPPLICATION_PKG ] + + // @Post('SaveCarnetApplication') + // async CreateClientData(@Body() body: SaveCarnetApplicationDTO) { + // return this.carnetApplicationService.SaveCarnetApplication(body); + // } + + @Post('TransmitApplicationtoProcess') + @Roles('ca') + TransmitApplicationtoProcess(@Body() body: TransmitApplicationtoProcessDTO) { + return this.carnetApplicationService.TransmitApplicationtoProcess(body); + } + + @Post('CreateApplication') + @Roles('ca') + CreateApplication(@Body() body: CreateApplicationDTO) { + return this.carnetApplicationService.CreateApplication(body); + } + + @Patch('update-holder') + UpdateHolder(@Body() body: CA_UpdateHolderDTO) { + return this.carnetApplicationService.UpdateHolder(body); + } + + // @Patch('UpdateExpGoodsAuthRep') + // UpdateExpGoodsAuthRep(@Body() body: UpdateExpGoodsAuthRepDTO) { + // return this.carnetApplicationService.UpdateExpGoodsAuthRep(body); + // } + + // @Post('AddGenerallistItems') + // AddGenerallistItems(@Body() body: AddGenerallistItemsDTO) { + // return this.carnetApplicationService.AddGenerallistItems(body); + // } + + // @Post('AddCountries') + // AddCountries(@Body() body: AddCountriesDTO) { + // return this.carnetApplicationService.AddCountries(body); + // } + + // @Put('EditGenerallistItems') + // EditGenerallistItems(@Body() body: EditGenerallistItemsDTO) { + // return this.carnetApplicationService.EditGenerallistItems(body); + // } + + // @Delete('DeleteGenerallistItems') + // DeleteGenerallistItems(@Body() body: DeleteGenerallistItemsDTO) { + // return this.carnetApplicationService.DeleteGenerallistItems(body); + // } + + // @Patch('UpdateShippingDetails') + // UpdateShippingDetails(@Body() body: UpdateShippingDetailsDTO) { + // return this.carnetApplicationService.UpdateShippingDetails(body); + // } + + // @Get('EstimatedFees/:P_SPID/:P_USERID/:P_HEADERID') + // EstimatedFees(@Param() body: GetCarnetControlCenterDTO) { + // return this.carnetApplicationService.EstimatedFees(body); + // } + + // // processing [ PROCESSINGCENTER_PKG ] + + // @Patch('ProcessCarnet') + // ProcessOriginalCarnet(@Body() body: CarnetProcessingCenterDTO) { + // return this.carnetApplicationService.ProcessCarnet(body); + // } + + // @Patch('UpdatePrintCarnet') + // UpdatePrintCarnet(@Body() body: CarnetProcessingCenterDTO) { + // return this.carnetApplicationService.UpdatePrintCarnet(body); + // } + + // @Patch('VoidCarnet') + // @Roles('sa') + // VoidCarnet(@Body() body: CarnetProcessingCenterDTO) { + // return this.carnetApplicationService.VoidCarnet(body); + // } + + + // @Patch('CopyCarnet') + // CopyCarnet(@Body() body: CopyCarnetDTO) { + // return this.carnetApplicationService.CopyCarnet(body); + // } + + // @Patch('DuplicateCarnet') + // DuplicateCarnet(@Body() body: CarnetProcessingCenterDTO2) { + // return this.carnetApplicationService.DuplicateCarnet(body); + // } + + // @Patch('AddlSets') + // AddlSets(@Body() body: CarnetProcessingCenterDTO2) { + // return this.carnetApplicationService.AddlSets(body); + // } + + // @Patch('ExtendCarnet') + // ExtendCarnet(@Body() body: CarnetProcessingCenterDTO2) { + // return this.carnetApplicationService.ExtendCarnet(body); + // } + + // @Get('GetExtendedSection/:P_SPID/:P_HEADERID') + // GetExtendedSection(@Param() body: GetExtendedSectionDTO) { + // return this.carnetApplicationService.GetExtendedSection(body); + // } + + // @Post('SaveExtensionApplication') + // @HttpCode(200) + // SaveExtensionApplication(@Body() body: SaveExtensionApplicationDTO) { + // return this.carnetApplicationService.SaveExtensionApplication(body); + // } + + // @Patch('CloseCarnet') + // @Roles('sa') + // CloseCarnet(@Body() body: CarnetProcessingCenterDTO) { + // return this.carnetApplicationService.CloseCarnet(body); + // } + + // @Patch('ResetCarnet') + // @Roles('sa') + // ResetCarnet(@Body() body: CarnetProcessingCenterDTO) { + // return this.carnetApplicationService.ResetCarnet(body); + // } + + // @Delete('DeleteCarnet') + // DeleteCarnet(@Body() body: CarnetProcessingCenterDTO) { + // return this.carnetApplicationService.DeleteCarnet(body); + // } + + // [ CARNETCONTROLCENTER_PKG ] + + @Get('GetHolderstoEdit/:P_SPID/:P_USERID/:P_HEADERID') + GetHolderstoEdit(@Param() body: GetCarnetControlCenterDTO) { + return this.carnetApplicationService.GetHolderstoEdit(body); + } + + @Get('GetGoodsDetailstoEdit/:P_SPID/:P_USERID/:P_HEADERID') + GetGoodsDetailstoEdit(@Param() body: GetCarnetControlCenterDTO) { + return this.carnetApplicationService.GetGoodsDetailstoEdit(body); + } + + @Get('GetGoodsItemstoEdit/:P_SPID/:P_USERID/:P_HEADERID') + GetGoodsItemstoEdit(@Param() body: GetCarnetControlCenterDTO) { + return this.carnetApplicationService.GetGoodsItemstoEdit(body); + } + + @Get('GetCountryDetailstoEdit/:P_SPID/:P_USERID/:P_HEADERID') + GetCountryDetailstoEdit(@Param() body: GetCarnetControlCenterDTO) { + return this.carnetApplicationService.GetCountryDetailstoEdit(body); + } + + @Get('GetShipPaymentDetailstoEdit/:P_SPID/:P_USERID/:P_HEADERID') + GetShipPaymentDetailstoEdit(@Param() body: GetCarnetControlCenterDTO) { + return this.carnetApplicationService.GetShipPaymentDetailstoEdit(body); + } + + // [PRINT_PKG] + // @Post('PrintCarnet') + // @HttpCode(200) + // async PrintCarnet(@Body() body: PrintCarnetDTO, @Res({ passthrough: true }) res: Response) { + + // try { + // const { finalArray, carnetData }: any = await this.carnetApplicationService.PrintCarnet(body); + // // const filterCarnetData = finalArray.filter(item => item !== '2GeneralList.pdf') + + // let filesArray = [`${replaceSlashWithDash(carnetData.carnetNo)}p1.pdf`, `${replaceSlashWithDash(carnetData.carnetNo)}p2.pdf`]; + // // await generateFinalPDF([...filesArray, '2GeneralList.pdf', ...carnetData], 'carnet.pdf'); + // await generateFinalPDF([...filesArray, ...finalArray, '13LastSheetP3.pdf', '13LastSheetP4.pdf'], `${replaceSlashWithDash(carnetData.carnetNo)}carnet.pdf`); + + // const fileName = `${replaceSlashWithDash(carnetData.carnetNo)}carnet.pdf`; + + // res.set({ + // 'Content-Type': 'application/pdf', + // 'Content-Disposition': `attachment; filename="${fileName}"`, + // }); + + // const filePath = join(process.cwd(), 'dist/public/carnet-pdf', fileName); //server + // // const filePath = join(process.cwd(), 'public/carnet-pdf', fileName); //local + + // console.log(filePath); + + + // // console.log(filePath); + + // const stream = createReadStream(filePath); + + // // Clean up files after response finishes streaming + // res.on('finish', async () => { + // await deleteFilesAsync([...filesArray, ...finalArray.filter(x => x !== `${replaceSlashWithDash(carnetData.carnetNo)}p2.pdf`), fileName]); + // }); + + // return new StreamableFile(stream); + // } catch (error) { + // if (error instanceof BadRequestException || error instanceof BR) { + // throw new BadRequestException("Download failed please check the details") + // } + // else { + // throw new InternalServerException("Error while downloading"); + // } + // } + // } + + // @Post('PrintGL') + // @HttpCode(200) + // async PrintGL(@Body() body: PrintGLDTO, @Res({ passthrough: true }) res: Response) { + // try { + // const { finalArray, carnetData }: any = await this.carnetApplicationService.PrintGL(body); + + // let filesArray = [`${body.P_HEADERID}p2.pdf`]; + // // await generateFinalPDF([...filesArray, '2GeneralList.pdf', ...carnetData], 'carnet.pdf'); + // await generateFinalPDF([...filesArray, ...finalArray], `${body.P_HEADERID}-GL.pdf`); + + // const fileName = `${body.P_HEADERID}-GL.pdf`; + + // res.set({ + // 'Content-Type': 'application/pdf', + // 'Content-Disposition': `attachment; filename="${fileName}"`, + // }); + + // const filePath = join(process.cwd(), 'dist/public/carnet-pdf', fileName); //server + // // const filePath = join(process.cwd(), 'public/carnet-pdf', fileName); //local + + // // console.log(filePath); + + + // // console.log(filePath); + + // const stream = createReadStream(filePath); + + // // Clean up files after response finishes streaming + // res.on('finish', async () => { + // await deleteFilesAsync([...filesArray, ...finalArray, fileName]); + // }); + + // return new StreamableFile(stream); + // } catch (error) { + // if (error instanceof BadRequestException || error instanceof BR) { + // throw new BadRequestException("Download failed please check the details") + // } + // else { + // throw new InternalServerException("Error while downloading"); + // } + // } + // } + + //[payment] + + // @Post('InitiatePayment') + // async InitiatePayment(@Body() body: InitiatePaymentDTO) { + // return this.carnetApplicationService.InitiatePayment(body); + // } + + // @Post('CompletePayment') + // @HttpCode(200) + // async CapturePayment(@Body() body: CapturePaymentDTO) { + // return this.carnetApplicationService.CapturePayment(body); + // } + + // @Get('OrderDetails/:P_ORDERID') + async OrderDetails(@Param() body: GetOrderDetailsDTO) { + return this.carnetApplicationService.OrderDetails(body); + } + + // @Get('GetPaymentHistory/:P_APPLICATIONNAME/:P_USERID') + // async GetPaymentHistory(@Param() body: GetPaymentHistoryDTO) { + // return this.carnetApplicationService.GetPaymentHistory(body); + // } + + // @Post('SaveHistory') + // @HttpCode(200) + // async SaveHistory(@Body() body: SaveHistoryDTO) { + // return this.carnetApplicationService.SaveHistory(body); + // } +} diff --git a/src/pg/carnet-application/carnet-application.module.ts b/src/pg/carnet-application/carnet-application.module.ts new file mode 100644 index 0000000..a96f46d --- /dev/null +++ b/src/pg/carnet-application/carnet-application.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { CarnetApplicationController } from './carnet-application.controller'; +import { CarnetApplicationService } from './carnet-application.service'; + +@Module({ + controllers: [CarnetApplicationController], + providers: [CarnetApplicationService] +}) +export class CarnetApplicationModule {} diff --git a/src/pg/carnet-application/carnet-application.service.ts b/src/pg/carnet-application/carnet-application.service.ts new file mode 100644 index 0000000..bb148ee --- /dev/null +++ b/src/pg/carnet-application/carnet-application.service.ts @@ -0,0 +1,371 @@ +import { Injectable } from '@nestjs/common'; + +import { + CarnetProcessingCenterDTO, SaveCarnetApplicationDTO, TransmitApplicationtoProcessDTO, + CreateApplicationDTO, + UpdateExpGoodsAuthRepDTO, + AddGenerallistItemsDTO, + AddCountriesDTO, + UpdateShippingDetailsDTO, + CA_UpdateHolderDTO, + GetCarnetControlCenterDTO, + DeleteGenerallistItemsDTO, + PrintCarnetDTO, + PrintGLDTO, + YON, + CopyCarnetDTO, + GetExtendedSectionDTO, + SaveExtensionApplicationDTO, + CarnetProcessingCenterDTO2, + CapturePaymentDTO, + InitiatePaymentDTO, + GetOrderDetailsDTO, + GetPaymentHistoryDTO, + SaveHistoryDTO +} from 'src/dto/property.dto'; +import { BadRequestException } from 'src/exceptions/badRequest.exception'; +import { PoolClient } from 'pg'; +import { PgDBService } from 'src/db/db.service'; +import { checkPgUserDefinedErrors, handlePgError, releasePgClient, ResponseStatus } from 'src/utils/helper'; + +@Injectable() +export class CarnetApplicationService { + + constructor(private readonly pgDBService: PgDBService) { } + + // [ CARNETAPPLICATION_PKG ] + + // async SaveCarnetApplication(body: SaveCarnetApplicationDTO) { } + async TransmitApplicationtoProcess(body: TransmitApplicationtoProcessDTO) { + let client: PoolClient | null = null; + + const cursorName = 'p_cursor'; + + try { + client = await this.pgDBService.getConnection(); + + await client.query('BEGIN'); + + const callProcQuery = ` + CALL "CARNETSYS".carnetapplication_pkg_transmitapplicationtoprocess($1, $2, $3, $4) + `; + await client.query(callProcQuery, [body.P_SPID, body.P_USERID, body.P_HEADERID, cursorName]); + + // 🚫 DON'T quote the cursor name in FETCH + const fetchResult = await client.query(`FETCH ALL FROM ${cursorName}`); + + // 🚫 DON'T quote the cursor name in CLOSE + await client.query(`CLOSE ${cursorName}`); + await client.query('COMMIT'); + + checkPgUserDefinedErrors(fetchResult); + + return { + statusCode: 200, + message: ResponseStatus.transmitted, + ...fetchResult?.rows?.[0] || {} + }; + + } catch (error) { + if (client) await client.query('ROLLBACK'); + handlePgError(error, CarnetApplicationService.name) + } finally { + releasePgClient(client) + } + } + + async CreateApplication(body: CreateApplicationDTO) { + let client: PoolClient | null = null; + + const cursorName = 'p_cursor'; + + try { + client = await this.pgDBService.getConnection(); + + await client.query('BEGIN'); + + const callProcQuery = ` + CALL "CARNETSYS".carnetapplication_pkg_createapplication($1, $2, $3, $4, $5, $6, $7) + `; + await client.query(callProcQuery, [body.P_SPID, body.P_CLIENTID, body.P_LOCATIONID, body.P_USERID, body.P_APPLICATIONNAME, body.P_ORDERTYPE, cursorName]); + + // 🚫 DON'T quote the cursor name in FETCH + const fetchResult = await client.query(`FETCH ALL FROM ${cursorName}`); + + // 🚫 DON'T quote the cursor name in CLOSE + await client.query(`CLOSE ${cursorName}`); + await client.query('COMMIT'); + + checkPgUserDefinedErrors(fetchResult); + + return { + statusCode: 201, + message: ResponseStatus.created, + ...fetchResult?.rows?.[0] || {} + }; + + } catch (error) { + if (client) await client.query('ROLLBACK'); + handlePgError(error, CarnetApplicationService.name) + } finally { + releasePgClient(client) + } + } + + async UpdateHolder(body: CA_UpdateHolderDTO) { + let client: PoolClient | null = null; + + const cursorName = 'p_cursor'; + + try { + client = await this.pgDBService.getConnection(); + + await client.query('BEGIN'); + + const callProcQuery = ` + CALL "CARNETSYS".carnetapplication_pkg_createapplication($1, $2, $3) + `; + await client.query(callProcQuery, [body.P_HEADERID, body.P_HOLDERID, cursorName]); + + // 🚫 DON'T quote the cursor name in FETCH + const fetchResult = await client.query(`FETCH ALL FROM ${cursorName}`); + + // 🚫 DON'T quote the cursor name in CLOSE + await client.query(`CLOSE ${cursorName}`); + await client.query('COMMIT'); + + checkPgUserDefinedErrors(fetchResult); + + return { + statusCode: 200, + message: ResponseStatus.updated, + ...fetchResult?.rows?.[0] || {} + }; + + } catch (error) { + if (client) await client.query('ROLLBACK'); + handlePgError(error, CarnetApplicationService.name) + } finally { + releasePgClient(client) + } + } + + async UpdateExpGoodsAuthRep(body: UpdateExpGoodsAuthRepDTO) { } + async AddGenerallistItems(body: AddGenerallistItemsDTO) { } + async EditGenerallistItems(body: AddGenerallistItemsDTO) { } + async DeleteGenerallistItems(body: DeleteGenerallistItemsDTO) { } + async AddCountries(body: AddCountriesDTO) { } + async UpdateShippingDetails(body: UpdateShippingDetailsDTO) { } + async EstimatedFees(body: GetCarnetControlCenterDTO) { } + + // processing [ PROCESSINGCENTER_PKG ] + + async ProcessCarnet(body: CarnetProcessingCenterDTO) { } + async UpdatePrintCarnet(body: CarnetProcessingCenterDTO) { } + async VoidCarnet(body: CarnetProcessingCenterDTO) { } + + async CopyCarnet(body: CopyCarnetDTO) { } + async DuplicateCarnet(body: CarnetProcessingCenterDTO2) { } + async AddlSets(body: CarnetProcessingCenterDTO2) { } + async ExtendCarnet(body: CarnetProcessingCenterDTO2) { } + async GetExtendedSection(body: GetExtendedSectionDTO) { } + async SaveExtensionApplication(body: SaveExtensionApplicationDTO) { } + + async CloseCarnet(body: CarnetProcessingCenterDTO) { } + async ResetCarnet(body: CarnetProcessingCenterDTO) { } + async DeleteCarnet(body: CarnetProcessingCenterDTO) { } + + // [ CARNETCONTROLCENTER_PKG ] + + async GetHolderstoEdit(body: GetCarnetControlCenterDTO) { + let client: PoolClient | null = null; + + const cursorName = 'p_cursor'; + + try { + client = await this.pgDBService.getConnection(); + + await client.query('BEGIN'); + + const callProcQuery = ` + CALL "CARNETSYS".carnetcontrolcenter_pkg_getholderstoedit($1, $2, $3, $4) + `; + await client.query(callProcQuery, [body.P_SPID, body.P_USERID, body.P_HEADERID, cursorName]); + + // 🚫 DON'T quote the cursor name in FETCH + const fetchResult = await client.query(`FETCH ALL FROM ${cursorName}`); + + // 🚫 DON'T quote the cursor name in CLOSE + await client.query(`CLOSE ${cursorName}`); + await client.query('COMMIT'); + + return fetchResult.rows; + + } catch (error) { + if (client) await client.query('ROLLBACK'); + handlePgError(error, CarnetApplicationService.name) + } finally { + releasePgClient(client) + } + } + + async GetGoodsDetailstoEdit(body: GetCarnetControlCenterDTO) { + let client: PoolClient | null = null; + + const cursorName = 'p_cursor'; + + try { + client = await this.pgDBService.getConnection(); + + await client.query('BEGIN'); + + const callProcQuery = ` + CALL "CARNETSYS".carnetcontrolcenter_pkg_getgoodsdetailstoedit($1, $2, $3, $4) + `; + await client.query(callProcQuery, [body.P_SPID, body.P_USERID, body.P_HEADERID, cursorName]); + + // 🚫 DON'T quote the cursor name in FETCH + const fetchResult = await client.query(`FETCH ALL FROM ${cursorName}`); + + // 🚫 DON'T quote the cursor name in CLOSE + await client.query(`CLOSE ${cursorName}`); + await client.query('COMMIT'); + + return fetchResult.rows; + + } catch (error) { + if (client) await client.query('ROLLBACK'); + handlePgError(error, CarnetApplicationService.name) + } finally { + releasePgClient(client) + } + } + + async GetCountryDetailstoEdit(body: GetCarnetControlCenterDTO) { + let client: PoolClient | null = null; + + const cursorName = 'p_cursor'; + + try { + client = await this.pgDBService.getConnection(); + + await client.query('BEGIN'); + + const callProcQuery = ` + CALL "CARNETSYS".carnetcontrolcenter_pkg_getcountrydetailstoedit($1, $2, $3, $4) + `; + await client.query(callProcQuery, [body.P_SPID, body.P_USERID, body.P_HEADERID, cursorName]); + + // 🚫 DON'T quote the cursor name in FETCH + const fetchResult = await client.query(`FETCH ALL FROM ${cursorName}`); + + // 🚫 DON'T quote the cursor name in CLOSE + await client.query(`CLOSE ${cursorName}`); + await client.query('COMMIT'); + + return fetchResult.rows; + + } catch (error) { + if (client) await client.query('ROLLBACK'); + handlePgError(error, CarnetApplicationService.name) + } finally { + releasePgClient(client) + } + } + + async GetShipPaymentDetailstoEdit(body: GetCarnetControlCenterDTO) { + let client: PoolClient | null = null; + + const cursorName = 'p_cursor'; + + try { + client = await this.pgDBService.getConnection(); + + await client.query('BEGIN'); + + const callProcQuery = ` + CALL "CARNETSYS".carnetcontrolcenter_pkg_getshippaymentdetailstoedit($1, $2, $3, $4) + `; + await client.query(callProcQuery, [body.P_SPID, body.P_USERID, body.P_HEADERID, cursorName]); + + // 🚫 DON'T quote the cursor name in FETCH + const fetchResult = await client.query(`FETCH ALL FROM ${cursorName}`); + + // 🚫 DON'T quote the cursor name in CLOSE + await client.query(`CLOSE ${cursorName}`); + await client.query('COMMIT'); + + return fetchResult.rows; + + } catch (error) { + if (client) await client.query('ROLLBACK'); + handlePgError(error, CarnetApplicationService.name) + } finally { + releasePgClient(client) + } + } + + async GetGoodsItemstoEdit(body: GetCarnetControlCenterDTO) { + let client: PoolClient | null = null; + + const cursorName = 'p_cursor'; + + try { + client = await this.pgDBService.getConnection(); + + await client.query('BEGIN'); + + const callProcQuery = ` + CALL "CARNETSYS".carnetcontrolcenter_pkg_getgoodsitemstoedit($1, $2, $3, $4) + `; + await client.query(callProcQuery, [body.P_SPID, body.P_USERID, body.P_HEADERID, cursorName]); + + // 🚫 DON'T quote the cursor name in FETCH + const fetchResult = await client.query(`FETCH ALL FROM ${cursorName}`); + + // 🚫 DON'T quote the cursor name in CLOSE + await client.query(`CLOSE ${cursorName}`); + await client.query('COMMIT'); + + return fetchResult.rows; + + } catch (error) { + if (client) await client.query('ROLLBACK'); + handlePgError(error, CarnetApplicationService.name) + } finally { + releasePgClient(client) + } + } + + // [PRINT_PKG] + + async getPrintingData(body: PrintCarnetDTO) { } + + async PrintCarnet(body: PrintCarnetDTO) { } + + async PrintGL(body: PrintGLDTO) { } + + // [payment] + + async formatAmount(amount) { + if (typeof amount !== 'number' || isNaN(amount)) { + throw new Error('Amount must be a valid number'); + } + + if (amount < 0) { + throw new BadRequestException('Amount must be non-negative'); + } + + return amount.toFixed(2); // Always returns a string with 2 decimal places + } + + async InitiatePayment(body: InitiatePaymentDTO) { } + + async CapturePayment(body: CapturePaymentDTO) { } + + async OrderDetails(body: GetOrderDetailsDTO) { } + + async GetPaymentHistory(body: GetPaymentHistoryDTO) { } + + async SaveHistory(body: SaveHistoryDTO) { } +} diff --git a/src/pg/pg.module.ts b/src/pg/pg.module.ts index e6653dc..af1efb2 100644 --- a/src/pg/pg.module.ts +++ b/src/pg/pg.module.ts @@ -6,10 +6,11 @@ import { UserMaintenanceModule } from './user-maintenance/user-maintenance.modul import { ManageFeeModule } from './manage-fee/manage-fee.module'; import { ManageHolderModule } from './manage-holder/manage-holder.module'; import { ManageClientsModule } from './manage-clients/manage-clients.module'; +import { CarnetApplicationModule } from './carnet-application/carnet-application.module'; @Global() @Module({ - imports: [DbModule, ParamTableModule, UscibManagedSpModule, UserMaintenanceModule, ManageFeeModule, ManageHolderModule, ManageClientsModule], + imports: [DbModule, ParamTableModule, UscibManagedSpModule, UserMaintenanceModule, ManageFeeModule, ManageHolderModule, ManageClientsModule, CarnetApplicationModule], providers: [], exports: [UserMaintenanceModule] }) diff --git a/src/utils/helper.ts b/src/utils/helper.ts index 10ce65c..6a600e7 100644 --- a/src/utils/helper.ts +++ b/src/utils/helper.ts @@ -24,7 +24,8 @@ export enum ResponseStatus { inActivate = 'Inactivated Successfully', reActivate = 'Reactivated Successfully', clientRegistrationDone = 'Client registration initiated successfully', - lockedUserDone = 'Locked Successfully' + lockedUserDone = 'Locked Successfully', + transmitted = 'Transmitted Successfully' } export const handleError = (error: any, context: string = 'UnknownService'): never => {