all api completed
This commit is contained in:
parent
8e94cdd97a
commit
cecfa1030a
@ -183,120 +183,120 @@ export class CarnetApplicationController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// [PRINT_PKG]
|
// [PRINT_PKG]
|
||||||
// @Post('PrintCarnet')
|
@Post('PrintCarnet')
|
||||||
// @HttpCode(200)
|
@HttpCode(200)
|
||||||
// async PrintCarnet(@Body() body: PrintCarnetDTO, @Res({ passthrough: true }) res: Response) {
|
async PrintCarnet(@Body() body: PrintCarnetDTO, @Res({ passthrough: true }) res: Response) {
|
||||||
|
|
||||||
// try {
|
try {
|
||||||
// const { finalArray, carnetData }: any = await this.carnetApplicationService.PrintCarnet(body);
|
const { finalArray, carnetData }: any = await this.carnetApplicationService.PrintCarnet(body);
|
||||||
// // const filterCarnetData = finalArray.filter(item => item !== '2GeneralList.pdf')
|
// const filterCarnetData = finalArray.filter(item => item !== '2GeneralList.pdf')
|
||||||
|
|
||||||
// let filesArray = [`${replaceSlashWithDash(carnetData.carnetNo)}p1.pdf`, `${replaceSlashWithDash(carnetData.carnetNo)}p2.pdf`];
|
let filesArray = [`${replaceSlashWithDash(carnetData.carnetNo)}p1.pdf`, `${replaceSlashWithDash(carnetData.carnetNo)}p2.pdf`];
|
||||||
// // await generateFinalPDF([...filesArray, '2GeneralList.pdf', ...carnetData], 'carnet.pdf');
|
// await generateFinalPDF([...filesArray, '2GeneralList.pdf', ...carnetData], 'carnet.pdf');
|
||||||
// await generateFinalPDF([...filesArray, ...finalArray, '13LastSheetP3.pdf', '13LastSheetP4.pdf'], `${replaceSlashWithDash(carnetData.carnetNo)}carnet.pdf`);
|
await generateFinalPDF([...filesArray, ...finalArray, '13LastSheetP3.pdf', '13LastSheetP4.pdf'], `${replaceSlashWithDash(carnetData.carnetNo)}carnet.pdf`);
|
||||||
|
|
||||||
// const fileName = `${replaceSlashWithDash(carnetData.carnetNo)}carnet.pdf`;
|
const fileName = `${replaceSlashWithDash(carnetData.carnetNo)}carnet.pdf`;
|
||||||
|
|
||||||
// res.set({
|
res.set({
|
||||||
// 'Content-Type': 'application/pdf',
|
'Content-Type': 'application/pdf',
|
||||||
// 'Content-Disposition': `attachment; filename="${fileName}"`,
|
'Content-Disposition': `attachment; filename="${fileName}"`,
|
||||||
// });
|
});
|
||||||
|
|
||||||
// const filePath = join(process.cwd(), 'dist/public/carnet-pdf', fileName); //server
|
const filePath = join(process.cwd(), 'dist/public/carnet-pdf', fileName); //server
|
||||||
// // const filePath = join(process.cwd(), 'public/carnet-pdf', fileName); //local
|
// const filePath = join(process.cwd(), 'public/carnet-pdf', fileName); //local
|
||||||
|
|
||||||
// console.log(filePath);
|
console.log(filePath);
|
||||||
|
|
||||||
|
|
||||||
// // console.log(filePath);
|
// console.log(filePath);
|
||||||
|
|
||||||
// const stream = createReadStream(filePath);
|
const stream = createReadStream(filePath);
|
||||||
|
|
||||||
// // Clean up files after response finishes streaming
|
// Clean up files after response finishes streaming
|
||||||
// res.on('finish', async () => {
|
res.on('finish', async () => {
|
||||||
// await deleteFilesAsync([...filesArray, ...finalArray.filter(x => x !== `${replaceSlashWithDash(carnetData.carnetNo)}p2.pdf`), fileName]);
|
await deleteFilesAsync([...filesArray, ...finalArray.filter(x => x !== `${replaceSlashWithDash(carnetData.carnetNo)}p2.pdf`), fileName]);
|
||||||
// });
|
});
|
||||||
|
|
||||||
// return new StreamableFile(stream);
|
return new StreamableFile(stream);
|
||||||
// } catch (error) {
|
} catch (error) {
|
||||||
// if (error instanceof BadRequestException || error instanceof BR) {
|
if (error instanceof BadRequestException || error instanceof BR) {
|
||||||
// throw new BadRequestException("Download failed please check the details")
|
throw new BadRequestException("Download failed please check the details")
|
||||||
// }
|
}
|
||||||
// else {
|
else {
|
||||||
// throw new InternalServerException("Error while downloading");
|
throw new InternalServerException("Error while downloading");
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
// @Post('PrintGL')
|
@Post('PrintGL')
|
||||||
// @HttpCode(200)
|
@HttpCode(200)
|
||||||
// async PrintGL(@Body() body: PrintGLDTO, @Res({ passthrough: true }) res: Response) {
|
async PrintGL(@Body() body: PrintGLDTO, @Res({ passthrough: true }) res: Response) {
|
||||||
// try {
|
try {
|
||||||
// const { finalArray, carnetData }: any = await this.carnetApplicationService.PrintGL(body);
|
const { finalArray, carnetData }: any = await this.carnetApplicationService.PrintGL(body);
|
||||||
|
|
||||||
// let filesArray = [`${body.P_HEADERID}p2.pdf`];
|
let filesArray = [`${body.P_HEADERID}p2.pdf`];
|
||||||
// // await generateFinalPDF([...filesArray, '2GeneralList.pdf', ...carnetData], 'carnet.pdf');
|
// await generateFinalPDF([...filesArray, '2GeneralList.pdf', ...carnetData], 'carnet.pdf');
|
||||||
// await generateFinalPDF([...filesArray, ...finalArray], `${body.P_HEADERID}-GL.pdf`);
|
await generateFinalPDF([...filesArray, ...finalArray], `${body.P_HEADERID}-GL.pdf`);
|
||||||
|
|
||||||
// const fileName = `${body.P_HEADERID}-GL.pdf`;
|
const fileName = `${body.P_HEADERID}-GL.pdf`;
|
||||||
|
|
||||||
// res.set({
|
res.set({
|
||||||
// 'Content-Type': 'application/pdf',
|
'Content-Type': 'application/pdf',
|
||||||
// 'Content-Disposition': `attachment; filename="${fileName}"`,
|
'Content-Disposition': `attachment; filename="${fileName}"`,
|
||||||
// });
|
});
|
||||||
|
|
||||||
// const filePath = join(process.cwd(), 'dist/public/carnet-pdf', fileName); //server
|
const filePath = join(process.cwd(), 'dist/public/carnet-pdf', fileName); //server
|
||||||
// // const filePath = join(process.cwd(), 'public/carnet-pdf', fileName); //local
|
// const filePath = join(process.cwd(), 'public/carnet-pdf', fileName); //local
|
||||||
|
|
||||||
// // console.log(filePath);
|
// console.log(filePath);
|
||||||
|
|
||||||
|
|
||||||
// // console.log(filePath);
|
// console.log(filePath);
|
||||||
|
|
||||||
// const stream = createReadStream(filePath);
|
const stream = createReadStream(filePath);
|
||||||
|
|
||||||
// // Clean up files after response finishes streaming
|
// Clean up files after response finishes streaming
|
||||||
// res.on('finish', async () => {
|
res.on('finish', async () => {
|
||||||
// await deleteFilesAsync([...filesArray, ...finalArray, fileName]);
|
await deleteFilesAsync([...filesArray, ...finalArray, fileName]);
|
||||||
// });
|
});
|
||||||
|
|
||||||
// return new StreamableFile(stream);
|
return new StreamableFile(stream);
|
||||||
// } catch (error) {
|
} catch (error) {
|
||||||
// if (error instanceof BadRequestException || error instanceof BR) {
|
if (error instanceof BadRequestException || error instanceof BR) {
|
||||||
// throw new BadRequestException("Download failed please check the details")
|
throw new BadRequestException("Download failed please check the details")
|
||||||
// }
|
}
|
||||||
// else {
|
else {
|
||||||
// throw new InternalServerException("Error while downloading");
|
throw new InternalServerException("Error while downloading");
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
//[payment]
|
//[payment]
|
||||||
|
|
||||||
// @Post('InitiatePayment')
|
@Post('InitiatePayment')
|
||||||
// async InitiatePayment(@Body() body: InitiatePaymentDTO) {
|
async InitiatePayment(@Body() body: InitiatePaymentDTO) {
|
||||||
// return this.carnetApplicationService.InitiatePayment(body);
|
return this.carnetApplicationService.InitiatePayment(body);
|
||||||
// }
|
}
|
||||||
|
|
||||||
// @Post('CompletePayment')
|
@Post('CompletePayment')
|
||||||
// @HttpCode(200)
|
@HttpCode(200)
|
||||||
// async CapturePayment(@Body() body: CapturePaymentDTO) {
|
async CapturePayment(@Body() body: CapturePaymentDTO) {
|
||||||
// return this.carnetApplicationService.CapturePayment(body);
|
return this.carnetApplicationService.CapturePayment(body);
|
||||||
// }
|
}
|
||||||
|
|
||||||
// @Get('OrderDetails/:P_ORDERID')
|
// @Get('OrderDetails/:P_ORDERID')
|
||||||
async OrderDetails(@Param() body: GetOrderDetailsDTO) {
|
async OrderDetails(@Param() body: GetOrderDetailsDTO) {
|
||||||
return this.carnetApplicationService.OrderDetails(body);
|
return this.carnetApplicationService.OrderDetails(body);
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Get('GetPaymentHistory/:P_APPLICATIONNAME/:P_USERID')
|
@Get('GetPaymentHistory/:P_APPLICATIONNAME/:P_USERID')
|
||||||
// async GetPaymentHistory(@Param() body: GetPaymentHistoryDTO) {
|
async GetPaymentHistory(@Param() body: GetPaymentHistoryDTO) {
|
||||||
// return this.carnetApplicationService.GetPaymentHistory(body);
|
return this.carnetApplicationService.GetPaymentHistory(body);
|
||||||
// }
|
}
|
||||||
|
|
||||||
// @Post('SaveHistory')
|
@Post('SaveHistory')
|
||||||
// @HttpCode(200)
|
@HttpCode(200)
|
||||||
// async SaveHistory(@Body() body: SaveHistoryDTO) {
|
async SaveHistory(@Body() body: SaveHistoryDTO) {
|
||||||
// return this.carnetApplicationService.SaveHistory(body);
|
return this.carnetApplicationService.SaveHistory(body);
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,12 +26,19 @@ import {
|
|||||||
import { BadRequestException } from 'src/exceptions/badRequest.exception';
|
import { BadRequestException } from 'src/exceptions/badRequest.exception';
|
||||||
import { PoolClient } from 'pg';
|
import { PoolClient } from 'pg';
|
||||||
import { PgDBService } from 'src/db/db.service';
|
import { PgDBService } from 'src/db/db.service';
|
||||||
import { checkPgUserDefinedErrors, handlePgError, releasePgClient, ResponseStatus, toUpperCaseKeys } from 'src/utils/helper';
|
import { checkPgUserDefinedErrors, deleteFilesAsync, fnCounterFoil, fnVochers, generateFinalPDF, generateGL, generateGL1, generateGreenCoverPDF, handlePgError, pdfCarnetData, pdfGLData, releasePgClient, replaceSlashWithDash, ResponseStatus, tnVochers, toUpperCaseKeys, tsCounterFoil, usCounterFoil } from 'src/utils/helper';
|
||||||
|
import { InternalServerException } from 'src/exceptions/internalServerError.exception';
|
||||||
|
import axios from 'axios';
|
||||||
|
import { PaypalService } from 'src/paypal/paypal.service';
|
||||||
|
import { NotFoundException } from 'src/exceptions/notFound.exception';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class CarnetApplicationService {
|
export class CarnetApplicationService {
|
||||||
|
|
||||||
constructor(private readonly pgDBService: PgDBService) { }
|
constructor(
|
||||||
|
private readonly pgDBService: PgDBService,
|
||||||
|
private readonly payPalService: PaypalService
|
||||||
|
) { }
|
||||||
|
|
||||||
// [ CARNETAPPLICATION_PKG ]
|
// [ CARNETAPPLICATION_PKG ]
|
||||||
|
|
||||||
@ -1133,11 +1140,239 @@ export class CarnetApplicationService {
|
|||||||
|
|
||||||
// [PRINT_PKG]
|
// [PRINT_PKG]
|
||||||
|
|
||||||
async getPrintingData(body: PrintCarnetDTO) { }
|
async getPrintingData(body: PrintCarnetDTO) {
|
||||||
|
|
||||||
async PrintCarnet(body: PrintCarnetDTO) { }
|
let client: PoolClient | null = null;
|
||||||
|
|
||||||
async PrintGL(body: PrintGLDTO) { }
|
const p_carnetdatacursor = 'p_carnetdatacursor';
|
||||||
|
const p_gldatacursor = 'p_gldatacursor';
|
||||||
|
|
||||||
|
try {
|
||||||
|
client = await this.pgDBService.getConnection();
|
||||||
|
|
||||||
|
await client.query('BEGIN');
|
||||||
|
|
||||||
|
const callProcQuery = `
|
||||||
|
CALL "CARNETSYS".print_pkg_printcarnet($1, $2, $3, $4, $5)
|
||||||
|
`;
|
||||||
|
await client.query(callProcQuery, [body.P_SPID, body.P_HEADERID, body.P_PRINTGL, p_carnetdatacursor, p_gldatacursor]);
|
||||||
|
|
||||||
|
// 🚫 DON'T quote the cursor name in FETCH
|
||||||
|
const p_carnetdatacursorResult = await client.query(`FETCH ALL FROM ${p_carnetdatacursor}`);
|
||||||
|
const p_gldatacursorResult = await client.query(`FETCH ALL FROM ${p_gldatacursor}`);
|
||||||
|
|
||||||
|
// 🚫 DON'T quote the cursor name in CLOSE
|
||||||
|
await client.query(`CLOSE ${p_carnetdatacursor}`);
|
||||||
|
await client.query(`CLOSE ${p_gldatacursor}`);
|
||||||
|
|
||||||
|
await client.query('COMMIT');
|
||||||
|
|
||||||
|
checkPgUserDefinedErrors(p_carnetdatacursorResult);
|
||||||
|
checkPgUserDefinedErrors(p_gldatacursorResult);
|
||||||
|
|
||||||
|
return { fres: toUpperCaseKeys(p_carnetdatacursorResult.rows), fres1: toUpperCaseKeys(p_gldatacursorResult.rows) }
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
if (client) await client.query('ROLLBACK');
|
||||||
|
handlePgError(error, CarnetApplicationService.name)
|
||||||
|
} finally {
|
||||||
|
releasePgClient(client)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async PrintCarnet(body: PrintCarnetDTO) {
|
||||||
|
try {
|
||||||
|
const { fres, fres1 }: any = await this.getPrintingData(body);
|
||||||
|
|
||||||
|
if (body.P_PRINTGL === 'Y') {
|
||||||
|
if (fres.length === 0 || !fres[0].CARNETNO || fres1.length === 0) {
|
||||||
|
throw new BadRequestException("Print failed please check the submitted details");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (fres.length === 0 || !fres[0].CARNETNO) {
|
||||||
|
throw new BadRequestException("Print failed please check the submitted details");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fres.length > 0 && fres[0].ERRORMESG) {
|
||||||
|
// this.logger.warn(fres[0].ERRORMESG);
|
||||||
|
console.log(fres[0].ERRORMESG);
|
||||||
|
throw new BadRequestException(fres[0].ERRORMESG)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const glData: pdfGLData[] = fres1.map((x: any) => {
|
||||||
|
return {
|
||||||
|
itemNo: x.ITEMNO,
|
||||||
|
description: x.ITEMDESCRIPTION,
|
||||||
|
noOfPieces: x.NOOFPIECES,
|
||||||
|
weight: x.WEIGHT,
|
||||||
|
itemValue: x.ITEMVALUE,
|
||||||
|
countryOfOrigin: x.GOODSORIGINCOUNTRY
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
const carnetData: pdfCarnetData = {
|
||||||
|
carnetNo: fres[0].CARNETNO ?? "",
|
||||||
|
ISSUEDBY: fres[0].ISSUEDBY ?? "",
|
||||||
|
ISSUEDATE: fres[0].ISSUEDATE ?? "",
|
||||||
|
EXPDATE: fres[0].EXPDATE ?? "",
|
||||||
|
AUTHREP: fres[0].AUTHREP ?? "",
|
||||||
|
NOOFUSSETS: fres[0].NOOFUSSETS ?? 0,
|
||||||
|
NOOFFOREIGNSETS: fres[0].NOOFFOREIGNSETS ?? 0,
|
||||||
|
NOOFTRANSITSETS: fres[0].NOOFTRANSITSETS ?? 0,
|
||||||
|
PRINTGOODSTOBEEXPORTED: fres[0].PRINTGOODSTOBEEXPORTED ?? "",
|
||||||
|
HOLDERDATATOPRINT: fres[0].HOLDERDATATOPRINT ?? "",
|
||||||
|
CONTINUATIONSHEETS: fres[0].CONTINUATIONSHEETS ?? 0,
|
||||||
|
NEXTUSCFNO: fres[0].NEXTUSCFNO ?? 0,
|
||||||
|
NEXTFOREIGNCFNO: fres[0].NEXTFOREIGNCFNO ?? 0,
|
||||||
|
NEXTTRANSITCFNO: fres[0].NEXTTRANSITCFNO ?? 0,
|
||||||
|
contPageNo: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
const p1Status = await generateGreenCoverPDF(carnetData);
|
||||||
|
|
||||||
|
let p2Status: any = "";
|
||||||
|
|
||||||
|
if (body.P_PRINTGL === 'Y') {
|
||||||
|
p2Status = await generateGL(glData, carnetData, body);
|
||||||
|
// console.log("-------- p2 --------", p2Status);
|
||||||
|
// console.log(typeof p2Status.batch, p2Status.batch);
|
||||||
|
|
||||||
|
if (p2Status.batch % 2 === 0) {
|
||||||
|
await generateFinalPDF([...p2Status.fileArray, '2GeneralListVOID.pdf'], `${replaceSlashWithDash(carnetData.carnetNo)}p2.pdf`)
|
||||||
|
await deleteFilesAsync([...p2Status.fileArray])
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
await generateFinalPDF([...p2Status.fileArray], `${replaceSlashWithDash(carnetData.carnetNo)}p2.pdf`)
|
||||||
|
await deleteFilesAsync([...p2Status.fileArray])
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
p2Status = await generateGL1(carnetData);
|
||||||
|
if (p2Status === 'p2 done') {
|
||||||
|
await generateFinalPDF([`${replaceSlashWithDash(carnetData.carnetNo)}p2.pdf`, '2GeneralListVOID.pdf'], `${replaceSlashWithDash(carnetData.carnetNo)}p2.pdf`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const p3Status = await usCounterFoil(carnetData);
|
||||||
|
const p4Status = await fnCounterFoil(carnetData);
|
||||||
|
const p5Status = await tsCounterFoil(carnetData);
|
||||||
|
const p6Status = await fnVochers(carnetData, body);
|
||||||
|
const p7Status = await tnVochers(carnetData, body);
|
||||||
|
|
||||||
|
const finalArray = [
|
||||||
|
...p3Status,
|
||||||
|
...p4Status,
|
||||||
|
...p5Status,
|
||||||
|
...p6Status,
|
||||||
|
...p7Status
|
||||||
|
]
|
||||||
|
|
||||||
|
return { finalArray, carnetData }
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
throw new InternalServerException(error.message)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
// if (client) await client.query('ROLLBACK');
|
||||||
|
handlePgError(error, CarnetApplicationService.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async PrintGL(body: PrintGLDTO) {
|
||||||
|
let newBody: PrintCarnetDTO = { ...body, P_PRINTGL: YON.YES }
|
||||||
|
|
||||||
|
try {
|
||||||
|
const { fres, fres1 }: any = await this.getPrintingData(newBody);
|
||||||
|
|
||||||
|
if (fres.length === 0 || fres1.length === 0) {
|
||||||
|
throw new BadRequestException("Print failed please check the submitted details");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fres.length > 0 && fres[0].ERRORMESG) {
|
||||||
|
// this.logger.warn(fres[0].ERRORMESG);
|
||||||
|
console.log(fres[0].ERRORMESG);
|
||||||
|
|
||||||
|
throw new BadRequestException(fres[0].ERRORMESG)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const glData: pdfGLData[] = fres1.map(x => {
|
||||||
|
return {
|
||||||
|
itemNo: x.ITEMNO,
|
||||||
|
description: x.ITEMDESCRIPTION,
|
||||||
|
noOfPieces: x.NOOFPIECES,
|
||||||
|
weight: x.WEIGHT,
|
||||||
|
itemValue: x.ITEMVALUE,
|
||||||
|
countryOfOrigin: x.GOODSORIGINCOUNTRY
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
const carnetData: pdfCarnetData = {
|
||||||
|
carnetNo: fres[0].CARNETNO ?? "",
|
||||||
|
ISSUEDBY: fres[0].ISSUEDBY ?? "",
|
||||||
|
ISSUEDATE: fres[0].ISSUEDATE ?? "",
|
||||||
|
EXPDATE: fres[0].EXPDATE ?? "",
|
||||||
|
AUTHREP: fres[0].AUTHREP ?? "",
|
||||||
|
NOOFUSSETS: fres[0].NOOFUSSETS ?? 0,
|
||||||
|
NOOFFOREIGNSETS: fres[0].NOOFFOREIGNSETS ?? 0,
|
||||||
|
NOOFTRANSITSETS: fres[0].NOOFTRANSITSETS ?? 0,
|
||||||
|
PRINTGOODSTOBEEXPORTED: fres[0].PRINTGOODSTOBEEXPORTED ?? "",
|
||||||
|
HOLDERDATATOPRINT: fres[0].HOLDERDATATOPRINT ?? "",
|
||||||
|
CONTINUATIONSHEETS: fres[0].CONTINUATIONSHEETS ?? 0,
|
||||||
|
NEXTUSCFNO: fres[0].NEXTUSCFNO ?? 0,
|
||||||
|
NEXTFOREIGNCFNO: fres[0].NEXTFOREIGNCFNO ?? 0,
|
||||||
|
NEXTTRANSITCFNO: fres[0].NEXTTRANSITCFNO ?? 0,
|
||||||
|
contPageNo: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// const p1Status = await generateGreenCoverPDF(carnetData);
|
||||||
|
|
||||||
|
let p2Status: any = "";
|
||||||
|
|
||||||
|
p2Status = await generateGL(glData, carnetData, body);
|
||||||
|
// console.log("-------- p2 --------", p2Status);
|
||||||
|
// console.log(typeof p2Status.batch, p2Status.batch);
|
||||||
|
|
||||||
|
if (p2Status.batch % 2 === 0) {
|
||||||
|
await generateFinalPDF([...p2Status.fileArray, '2GeneralListVOID.pdf'], `${body.P_HEADERID}p2.pdf`)
|
||||||
|
await deleteFilesAsync([...p2Status.fileArray])
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
await generateFinalPDF([...p2Status.fileArray], `${body.P_HEADERID}p2.pdf`)
|
||||||
|
await deleteFilesAsync([...p2Status.fileArray])
|
||||||
|
}
|
||||||
|
|
||||||
|
// const p3Status = await usCounterFoil(carnetData);
|
||||||
|
// const p4Status = await fnCounterFoil(carnetData);
|
||||||
|
// const p5Status = await tsCounterFoil(carnetData);
|
||||||
|
// const p6Status = await fnVochers(carnetData);
|
||||||
|
// const p7Status = await tnVochers(carnetData);
|
||||||
|
|
||||||
|
const finalArray = [
|
||||||
|
// ...p3Status,
|
||||||
|
// ...p4Status,
|
||||||
|
// ...p5Status,
|
||||||
|
// ...p6Status,
|
||||||
|
// ...p7Status
|
||||||
|
]
|
||||||
|
|
||||||
|
return { finalArray, carnetData }
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
throw new InternalServerException(error.message)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
// if (client) await client.query('ROLLBACK');
|
||||||
|
handlePgError(error, CarnetApplicationService.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// [payment]
|
// [payment]
|
||||||
|
|
||||||
@ -1153,13 +1388,328 @@ export class CarnetApplicationService {
|
|||||||
return amount.toFixed(2); // Always returns a string with 2 decimal places
|
return amount.toFixed(2); // Always returns a string with 2 decimal places
|
||||||
}
|
}
|
||||||
|
|
||||||
async InitiatePayment(body: InitiatePaymentDTO) { }
|
async InitiatePayment(body: InitiatePaymentDTO) {
|
||||||
|
const quantity = 1;
|
||||||
|
let orderID: string | null = null
|
||||||
|
|
||||||
async CapturePayment(body: CapturePaymentDTO) { }
|
const formattedAmount = await this.formatAmount(body.P_PRICE * quantity);
|
||||||
|
|
||||||
async OrderDetails(body: GetOrderDetailsDTO) { }
|
try {
|
||||||
|
const accessToken = await this.payPalService.generateAccessToken();
|
||||||
|
|
||||||
async GetPaymentHistory(body: GetPaymentHistoryDTO) { }
|
const response = await axios({
|
||||||
|
url: process.env.PAYPAL_BASE_URL + '/v2/checkout/orders',
|
||||||
|
method: 'post',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
Authorization: 'Bearer ' + accessToken
|
||||||
|
},
|
||||||
|
data: JSON.stringify({
|
||||||
|
intent: 'CAPTURE',
|
||||||
|
purchase_units: [
|
||||||
|
{
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
name: 'Carnet',
|
||||||
|
description: body.P_DESCRIPTION,
|
||||||
|
quantity: quantity,
|
||||||
|
unit_amount: {
|
||||||
|
currency_code: 'USD',
|
||||||
|
value: formattedAmount
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
amount: {
|
||||||
|
currency_code: 'USD',
|
||||||
|
value: formattedAmount,
|
||||||
|
breakdown: {
|
||||||
|
item_total: {
|
||||||
|
currency_code: 'USD',
|
||||||
|
value: formattedAmount
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
application_context: {
|
||||||
|
return_url: process.env.BASE_URL + '/complete-order',
|
||||||
|
cancel_url: process.env.BASE_URL + '/cancel-order',
|
||||||
|
shipping_preference: 'NO_SHIPPING',
|
||||||
|
user_action: 'PAY_NOW',
|
||||||
|
brand_name: 'test sample',
|
||||||
|
disable_funding: "card"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
async SaveHistory(body: SaveHistoryDTO) { }
|
orderID = response?.data?.id;
|
||||||
|
|
||||||
|
const save_result: any = await this.SaveHistory(
|
||||||
|
{
|
||||||
|
P_APPLICATIONNAME: body.P_APPLICATIONNAME,
|
||||||
|
P_ORDERID: response?.data?.id,
|
||||||
|
P_PAYMENTAMOUNT: body.P_PRICE,
|
||||||
|
P_STATUS: "CREATED",
|
||||||
|
P_USERID: body.P_USERID
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if (save_result.statusCode === 200) {
|
||||||
|
return {
|
||||||
|
id: response?.data?.id, href: response?.data?.links?.find(obj => obj.rel === 'approve')?.href
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new InternalServerException();
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error creating PayPal order:', error.response?.data || error?.message || error);
|
||||||
|
|
||||||
|
await this.SaveHistory({
|
||||||
|
P_APPLICATIONNAME: body.P_APPLICATIONNAME,
|
||||||
|
P_ORDERID: orderID,
|
||||||
|
P_PAYMENTAMOUNT: body.P_PRICE,
|
||||||
|
P_STATUS: "FAILED",
|
||||||
|
P_USERID: body.P_USERID,
|
||||||
|
P_PAYMENTERROR: orderID ? error?.message : `Error while creating ORDERID : ${error?.message}`
|
||||||
|
});
|
||||||
|
|
||||||
|
throw new InternalServerException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async CapturePayment(body: CapturePaymentDTO) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
const approve_result = await this.OrderDetails({ P_ORDERID: body.P_ORDERID });
|
||||||
|
|
||||||
|
const formattedAmount = await this.formatAmount(body.P_PRICE);
|
||||||
|
|
||||||
|
if (approve_result.data.id === body.P_ORDERID
|
||||||
|
&& approve_result.data.status === "APPROVED"
|
||||||
|
&& approve_result.data.purchase_units[0]?.amount?.value === formattedAmount + ""
|
||||||
|
) {
|
||||||
|
await this.SaveHistory({
|
||||||
|
P_APPLICATIONNAME: body.P_APPLICATIONNAME,
|
||||||
|
P_ORDERID: body.P_ORDERID,
|
||||||
|
P_PAYMENTAMOUNT: body.P_PRICE,
|
||||||
|
P_STATUS: "APPROVED",
|
||||||
|
P_USERID: body.P_USERID
|
||||||
|
// P_PAYMENTERROR: `Error while capturing Payment : ${error?.message}`
|
||||||
|
});
|
||||||
|
|
||||||
|
const accessToken = await this.payPalService.generateAccessToken();
|
||||||
|
|
||||||
|
const response = await axios({
|
||||||
|
url: `${process.env.PAYPAL_BASE_URL}/v2/checkout/orders/${body.P_ORDERID}/capture`,
|
||||||
|
method: 'post',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Authorization': `Bearer ${accessToken}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const capture = response?.data?.purchase_units?.[0]?.payments?.captures?.[0];
|
||||||
|
// console.log(JSON.stringify(response?.data));
|
||||||
|
|
||||||
|
await this.SaveHistory({
|
||||||
|
P_APPLICATIONNAME: body.P_APPLICATIONNAME,
|
||||||
|
P_ORDERID: body.P_ORDERID,
|
||||||
|
P_PAYMENTAMOUNT: body.P_PRICE,
|
||||||
|
P_STATUS: "COMPLETED",
|
||||||
|
P_USERID: body.P_USERID
|
||||||
|
// P_PAYMENTERROR: `Error while capturing Payment : ${error?.message}`
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
statusCode: 200,
|
||||||
|
message: "Payment successful",
|
||||||
|
amount: `${capture?.amount?.value} ${capture?.amount?.currency_code}`,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
await this.SaveHistory({
|
||||||
|
P_APPLICATIONNAME: body.P_APPLICATIONNAME,
|
||||||
|
P_ORDERID: body.P_ORDERID,
|
||||||
|
P_PAYMENTAMOUNT: body.P_PRICE,
|
||||||
|
P_STATUS: "FAILED",
|
||||||
|
P_USERID: body.P_USERID,
|
||||||
|
P_PAYMENTERROR: `Error while validating user approval`
|
||||||
|
});
|
||||||
|
|
||||||
|
throw new InternalServerException("failed to save approved status");
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (error: any) {
|
||||||
|
const status = error.response?.status || 500;
|
||||||
|
const message = error.response?.data?.message || "Payment failed due to an unexpected error.";
|
||||||
|
|
||||||
|
// Optional: log full error for debugging
|
||||||
|
console.error("PayPal Capture Error:", {
|
||||||
|
status,
|
||||||
|
message,
|
||||||
|
details: error.response?.data,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (status === 404) {
|
||||||
|
await this.SaveHistory({
|
||||||
|
P_APPLICATIONNAME: body.P_APPLICATIONNAME,
|
||||||
|
P_ORDERID: body.P_ORDERID,
|
||||||
|
P_PAYMENTAMOUNT: body.P_PRICE,
|
||||||
|
P_STATUS: "FAILED",
|
||||||
|
P_USERID: body.P_USERID,
|
||||||
|
P_PAYMENTERROR: `ORDERID NOT FOUND : ${error?.message}`
|
||||||
|
});
|
||||||
|
throw new NotFoundException(error.response?.data?.message || error?.message || "Resource Not Found")
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.SaveHistory({
|
||||||
|
P_APPLICATIONNAME: body.P_APPLICATIONNAME,
|
||||||
|
P_ORDERID: body.P_ORDERID,
|
||||||
|
P_PAYMENTAMOUNT: body.P_PRICE,
|
||||||
|
P_STATUS: "FAILED",
|
||||||
|
P_USERID: body.P_USERID,
|
||||||
|
P_PAYMENTERROR: `Error while capturing Payment : ${error?.message}`
|
||||||
|
});
|
||||||
|
|
||||||
|
throw new InternalServerException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async OrderDetails(body: GetOrderDetailsDTO) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
// Max length of Order ID: 36 characters (UUID)
|
||||||
|
if (!body.P_ORDERID || body.P_ORDERID.length > 36) {
|
||||||
|
throw new BadRequestException("Invalid Order ID");
|
||||||
|
}
|
||||||
|
|
||||||
|
const accessToken = await this.payPalService.generateAccessToken();
|
||||||
|
|
||||||
|
const response = await axios({
|
||||||
|
url: `${process.env.PAYPAL_BASE_URL}/v2/checkout/orders/${body.P_ORDERID}`,
|
||||||
|
method: 'get',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Authorization': `Bearer ${accessToken}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// console.log("PayPal Order Details:", JSON.stringify(response.data));
|
||||||
|
|
||||||
|
return {
|
||||||
|
statusCode: 200,
|
||||||
|
message: "Order details retrieved successfully",
|
||||||
|
data: response.data,
|
||||||
|
};
|
||||||
|
|
||||||
|
} catch (error: any) {
|
||||||
|
const isAxiosError = error.isAxiosError;
|
||||||
|
|
||||||
|
if (isAxiosError) {
|
||||||
|
const axiosErrorCode = error.code;
|
||||||
|
|
||||||
|
switch (axiosErrorCode) {
|
||||||
|
case 'ECONNABORTED':
|
||||||
|
case 'ETIMEDOUT':
|
||||||
|
console.error("PayPal request timed out. Please try again later.")
|
||||||
|
throw new InternalServerException("Service is currently unreachable. Please try again later.");
|
||||||
|
case 'ENOTFOUND':
|
||||||
|
case 'ECONNREFUSED':
|
||||||
|
console.error("PayPal service is currently unavailable. Please try again later.")
|
||||||
|
throw new InternalServerException("Service is currently unreachable. Please try again later.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const status = error.response?.status || 500;
|
||||||
|
const message = error.response?.data?.message || "Failed to fetch order details.";
|
||||||
|
|
||||||
|
|
||||||
|
console.error("PayPal OrderDetails Error:", {
|
||||||
|
status,
|
||||||
|
message,
|
||||||
|
details: error.response?.data,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (status === 404) {
|
||||||
|
throw new NotFoundException(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new InternalServerException("A Error Occured while Processing your Request");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async GetPaymentHistory(body: GetPaymentHistoryDTO) {
|
||||||
|
|
||||||
|
let client: PoolClient | null = null;
|
||||||
|
|
||||||
|
const cursorName = 'p_cursor';
|
||||||
|
|
||||||
|
try {
|
||||||
|
client = await this.pgDBService.getConnection();
|
||||||
|
|
||||||
|
await client.query('BEGIN');
|
||||||
|
|
||||||
|
const callProcQuery = `
|
||||||
|
CALL "CARNETSYS".Pay_GetPaymentHistory($1, $2, $3)
|
||||||
|
`;
|
||||||
|
await client.query(callProcQuery, [body.P_APPLICATIONNAME, body.P_USERID, 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 toUpperCaseKeys(fetchResult.rows);
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
if (client) await client.query('ROLLBACK');
|
||||||
|
handlePgError(error, CarnetApplicationService.name)
|
||||||
|
} finally {
|
||||||
|
releasePgClient(client)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async SaveHistory(body: SaveHistoryDTO) {
|
||||||
|
|
||||||
|
let client: PoolClient | null = null;
|
||||||
|
|
||||||
|
const cursorName = 'p_cursor';
|
||||||
|
|
||||||
|
try {
|
||||||
|
client = await this.pgDBService.getConnection();
|
||||||
|
|
||||||
|
await client.query('BEGIN');
|
||||||
|
|
||||||
|
const callProcQuery = `
|
||||||
|
CALL "CARNETSYS".Pay_SaveHistory($1, $2, $3, $4, $5, $6, $7)
|
||||||
|
`;
|
||||||
|
await client.query(callProcQuery, [body.P_APPLICATIONNAME, body.P_ORDERID, body.P_PAYMENTAMOUNT, body.P_STATUS, body.P_USERID, body.P_PAYMENTERROR, 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.saved,
|
||||||
|
...toUpperCaseKeys(fetchResult?.rows)[0]
|
||||||
|
};
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
if (client) await client.query('ROLLBACK');
|
||||||
|
handlePgError(error, CarnetApplicationService.name)
|
||||||
|
} finally {
|
||||||
|
releasePgClient(client)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -31,7 +31,7 @@ export class SpContactsController {
|
|||||||
return this.spContactsService.updateSPContacts(body);
|
return this.spContactsService.updateSPContacts(body);
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Patch('/InactivateSPContact/:P_SPCONTACTID')
|
@Patch('/InactivateSPContact/:P_SPCONTACTID')
|
||||||
inactivateSPContact(@Param() param: SP_CONTACTID_DTO) {
|
inactivateSPContact(@Param() param: SP_CONTACTID_DTO) {
|
||||||
return this.spContactsService.inactivateSPContact(param);
|
return this.spContactsService.inactivateSPContact(param);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -150,7 +150,7 @@ export class SpContactsService {
|
|||||||
await client.query('BEGIN');
|
await client.query('BEGIN');
|
||||||
|
|
||||||
const callProcQuery = `
|
const callProcQuery = `
|
||||||
CALL "CARNETSYS".uscib_managed_pkg_setdefaultcontact($1)
|
CALL "CARNETSYS".USCIB_Managed_Pkg_InActivateSPContacts($1)
|
||||||
`;
|
`;
|
||||||
await client.query(callProcQuery, [body.P_SPCONTACTID]);
|
await client.query(callProcQuery, [body.P_SPCONTACTID]);
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import { Roles } from 'src/decorators/roles.decorator';
|
|||||||
import { JwtAuthGuard } from 'src/guards/jwt-auth.guard';
|
import { JwtAuthGuard } from 'src/guards/jwt-auth.guard';
|
||||||
import { RolesGuard } from 'src/guards/roles.guard';
|
import { RolesGuard } from 'src/guards/roles.guard';
|
||||||
import { UserMaintenanceService } from './user-maintenance.service';
|
import { UserMaintenanceService } from './user-maintenance.service';
|
||||||
import { CreateClientLoginsDTO, CreateSPLoginsDTO, CreateUSCIBLoginsDTO, EMAIL_DTO, SPID_CLIENTID_DTO, SPID_DTO, SPID_EMAIL_DTO, USERID_DTO } from 'src/dto/property.dto';
|
import { CreateClientLoginsDTO, CreateSPLoginsDTO, CreateUSCIBLoginsDTO, EMAIL_DTO, GetCarnetDetailsbyCarnetStatusDTO, SPID_CLIENTID_DTO, SPID_DTO, SPID_EMAIL_DTO, USERID_DTO } from 'src/dto/property.dto';
|
||||||
|
|
||||||
@ApiTags('User Maintenance - PG')
|
@ApiTags('User Maintenance - PG')
|
||||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||||
@ -90,4 +90,12 @@ export class UserMaintenanceController {
|
|||||||
GetCarnetSummaryData(@Param() params: USERID_DTO) {
|
GetCarnetSummaryData(@Param() params: USERID_DTO) {
|
||||||
return this.userMaintenanceService.GetCarnetSummaryData(params);
|
return this.userMaintenanceService.GetCarnetSummaryData(params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// [carnetcontrolcenter_pkg]
|
||||||
|
|
||||||
|
@Get('GetCarnetDetailsbyCarnetStatus/:P_SPID/:P_USERID/:P_CARNETSTATUS')
|
||||||
|
@Roles('pca', 'psa', 'pua')
|
||||||
|
GetCarnetDetailsbyCarnetStatus(@Param() params: GetCarnetDetailsbyCarnetStatusDTO) {
|
||||||
|
return this.userMaintenanceService.GetCarnetDetailsbyCarnetStatus(params);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { forwardRef, Inject, Injectable, Logger } from '@nestjs/common';
|
import { forwardRef, Inject, Injectable, Logger } from '@nestjs/common';
|
||||||
import { CreateClientLoginsDTO, CreateSPLoginsDTO, CreateUSCIBLoginsDTO, EMAIL_DTO, SPID_CLIENTID_DTO, SPID_DTO, SPID_EMAIL_DTO, USERID_DTO } from 'src/dto/property.dto';
|
import { CreateClientLoginsDTO, CreateSPLoginsDTO, CreateUSCIBLoginsDTO, EMAIL_DTO, GetCarnetDetailsbyCarnetStatusDTO, SPID_CLIENTID_DTO, SPID_DTO, SPID_EMAIL_DTO, USERID_DTO } from 'src/dto/property.dto';
|
||||||
import { checkPgUserDefinedErrors, handlePgError, normalizeKeysToUpperCase, releasePgClient, ResponseStatus, toUpperCaseKeys } from 'src/utils/helper';
|
import { checkPgUserDefinedErrors, handlePgError, normalizeKeysToUpperCase, releasePgClient, ResponseStatus, toUpperCaseKeys } from 'src/utils/helper';
|
||||||
|
|
||||||
import { PoolClient } from 'pg';
|
import { PoolClient } from 'pg';
|
||||||
@ -57,7 +57,7 @@ export class UserMaintenanceService {
|
|||||||
await client.query(`CLOSE ${userDetailsCursor}`);
|
await client.query(`CLOSE ${userDetailsCursor}`);
|
||||||
|
|
||||||
await client.query('COMMIT');
|
await client.query('COMMIT');
|
||||||
|
|
||||||
checkPgUserDefinedErrors(roleResult);
|
checkPgUserDefinedErrors(roleResult);
|
||||||
checkPgUserDefinedErrors(menuResult);
|
checkPgUserDefinedErrors(menuResult);
|
||||||
checkPgUserDefinedErrors(menuPageResult);
|
checkPgUserDefinedErrors(menuPageResult);
|
||||||
@ -489,6 +489,94 @@ export class UserMaintenanceService {
|
|||||||
|
|
||||||
checkPgUserDefinedErrors(fetchResult);
|
checkPgUserDefinedErrors(fetchResult);
|
||||||
|
|
||||||
|
const fres: any = toUpperCaseKeys(fetchResult.rows);
|
||||||
|
|
||||||
|
// Step 1: Replace spaces in keys
|
||||||
|
const mappedRows = fres.map((obj) => {
|
||||||
|
const newObj = {};
|
||||||
|
for (const key in obj) {
|
||||||
|
const newKey = key.replace(/ /g, '_');
|
||||||
|
newObj[newKey] = obj[key];
|
||||||
|
}
|
||||||
|
return newObj;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Step 2: Group and aggregate
|
||||||
|
const reducedRows = mappedRows.reduce((acc, curr) => {
|
||||||
|
let existing;
|
||||||
|
|
||||||
|
if (curr.Service_Provider_Name && curr.SPID) {
|
||||||
|
existing = acc.find(
|
||||||
|
(item) =>
|
||||||
|
item.Service_Provider_Name === curr.Service_Provider_Name &&
|
||||||
|
item.SPID === curr.SPID
|
||||||
|
);
|
||||||
|
} else if (curr.Preparer_Name && curr.CLIENTID) {
|
||||||
|
existing = acc.find(
|
||||||
|
(item) =>
|
||||||
|
item.Preparer_Name === curr.Preparer_Name &&
|
||||||
|
item.CLIENTID === curr.CLIENTID
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (existing) {
|
||||||
|
existing.CARNETSTATUS.push(curr.CARNETSTATUS);
|
||||||
|
existing.Carnet_Count.push(curr.Carnet_Count);
|
||||||
|
} else {
|
||||||
|
const newItem = {
|
||||||
|
CARNETSTATUS: [curr.CARNETSTATUS],
|
||||||
|
Carnet_Count: [curr.Carnet_Count],
|
||||||
|
};
|
||||||
|
|
||||||
|
if (curr.Service_Provider_Name && curr.SPID) {
|
||||||
|
newItem['Service_Provider_Name'] = curr.Service_Provider_Name;
|
||||||
|
newItem['SPID'] = curr.SPID;
|
||||||
|
} else if (curr.Preparer_Name && curr.CLIENTID) {
|
||||||
|
newItem['Preparer_Name'] = curr.Preparer_Name;
|
||||||
|
newItem['CLIENTID'] = curr.CLIENTID;
|
||||||
|
}
|
||||||
|
|
||||||
|
acc.push(newItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc;
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return reducedRows;
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
if (client) await client.query('ROLLBACK');
|
||||||
|
handlePgError(error, UserMaintenanceService.name)
|
||||||
|
} finally {
|
||||||
|
releasePgClient(client)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async GetCarnetDetailsbyCarnetStatus(body: GetCarnetDetailsbyCarnetStatusDTO) {
|
||||||
|
|
||||||
|
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_getcarnetdetails($1, $2, $3, $4)
|
||||||
|
`;
|
||||||
|
await client.query(callProcQuery, [body.P_SPID, body.P_USERID, body.P_CARNETSTATUS, 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 toUpperCaseKeys(fetchResult.rows);
|
return toUpperCaseKeys(fetchResult.rows);
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user