modified
parent
f30d800269
commit
b8f74a685f
@ -0,0 +1,12 @@
|
||||
export class PaymentMasterDto {
|
||||
|
||||
userId:string
|
||||
|
||||
tenderId:number
|
||||
|
||||
transId:number
|
||||
|
||||
status?:string
|
||||
|
||||
finalBidAmt?:number
|
||||
}
|
||||
@ -0,0 +1,102 @@
|
||||
export class PayuTransactionListDto {
|
||||
|
||||
id: string
|
||||
|
||||
status: string
|
||||
|
||||
key: string
|
||||
|
||||
merchantname: string
|
||||
|
||||
firstname: string
|
||||
|
||||
lastname: string
|
||||
|
||||
addedon: Date
|
||||
|
||||
bank_name: string
|
||||
|
||||
payment_gateway: string
|
||||
|
||||
phone: number | any
|
||||
|
||||
email: string
|
||||
|
||||
transaction_fee: number
|
||||
|
||||
amount: number | any
|
||||
|
||||
discount: number | any
|
||||
|
||||
additional_charges: number | any
|
||||
|
||||
productinfo: string
|
||||
|
||||
error_code: string
|
||||
|
||||
bank_ref_no: number | any
|
||||
|
||||
ibibo_code: string
|
||||
|
||||
mode: string
|
||||
|
||||
ip: string
|
||||
|
||||
card_no: number | any
|
||||
|
||||
cardtype: string
|
||||
|
||||
offer_key: string
|
||||
|
||||
field0: string
|
||||
|
||||
field1: string
|
||||
|
||||
field2: string
|
||||
|
||||
field3: string
|
||||
|
||||
field4: string
|
||||
|
||||
field5: string
|
||||
|
||||
field6: string
|
||||
|
||||
field7: string
|
||||
|
||||
field8: string
|
||||
|
||||
field9: string
|
||||
|
||||
udf1: string
|
||||
|
||||
udf2: string
|
||||
|
||||
udf3: string
|
||||
|
||||
udf4: string
|
||||
|
||||
udf5: string
|
||||
|
||||
address2: string
|
||||
|
||||
city: string
|
||||
|
||||
zipcode: string
|
||||
|
||||
pg_mid: string
|
||||
|
||||
issuing_bank: string
|
||||
|
||||
offer_type: string
|
||||
|
||||
failure_reason: string
|
||||
|
||||
mer_service_fee: string
|
||||
|
||||
mer_service_tax: string
|
||||
|
||||
txnid: string;
|
||||
|
||||
gateway: string;
|
||||
}
|
||||
@ -0,0 +1,17 @@
|
||||
|
||||
export class PurchaseDto {
|
||||
|
||||
amount: number;
|
||||
|
||||
application: string;
|
||||
|
||||
mobile: string;
|
||||
|
||||
email: string;
|
||||
|
||||
type: string;
|
||||
|
||||
menuId?: string;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,289 @@
|
||||
import { Body, Controller, Get, Param, Post, Query, Req, Res, UseGuards } from '@nestjs/common';
|
||||
import { FreeChargePaymentGatewayService, PaymentGatewayService } from './payment-gateway.service';
|
||||
import * as config from 'config';
|
||||
import { AuthGuard } from '@nestjs/passport';
|
||||
import { GetUser } from 'src/auth/dto/get-user.decorator';
|
||||
import { PcduserDto } from 'src/auth/dto/pcd-user.dto';
|
||||
import { PurchaseDto } from 'src/dto/purchase.dto';
|
||||
import { FindManyOptions } from 'typeorm';
|
||||
import { PaymentMasterRepository } from 'src/tables/payment-master/payment-master.repository';
|
||||
|
||||
@Controller('payment-gateway')
|
||||
export class PaymentGatewayController {
|
||||
constructor(
|
||||
private paymentGatewayService: PaymentGatewayService,
|
||||
private paymentMasterRepo : PaymentMasterRepository
|
||||
) { }
|
||||
|
||||
@Post()
|
||||
@UseGuards(AuthGuard())
|
||||
createPayment(
|
||||
@Req() req,
|
||||
@Res() res,
|
||||
@GetUser() user: PcduserDto
|
||||
): void {
|
||||
// console.log('=============',user);
|
||||
|
||||
try {
|
||||
const paymentBody: PurchaseDto = req.body;
|
||||
paymentBody.amount = req.body.amount;
|
||||
paymentBody.email = req.body.email;
|
||||
paymentBody['user'] = user.userId;
|
||||
paymentBody.mobile = req.body.mobile;
|
||||
paymentBody.application = `${req.body.application}ESC${user.userId}`;
|
||||
paymentBody.type = req.body.type;
|
||||
this.paymentGatewayService.makePayment(req.body, (error, result) => {
|
||||
if (error) {
|
||||
res.status(error.code).send(error)
|
||||
//res.send (error);
|
||||
} else {
|
||||
res.send(result);
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
console.log("Exception in creating User Data . ", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Post('public')
|
||||
createPaymentPublic(
|
||||
@Req() req,
|
||||
@Res() res,
|
||||
): void {
|
||||
// console.log('=============',user);
|
||||
|
||||
try {
|
||||
const paymentBody: PurchaseDto = req.body;
|
||||
paymentBody.amount = req.body.amount;
|
||||
paymentBody.email = req.body.email;
|
||||
paymentBody['user'] = 'system';
|
||||
paymentBody.mobile = req.body.mobile;
|
||||
paymentBody.application = req.body.application;
|
||||
paymentBody.type = req.body.type;
|
||||
paymentBody.menuId = 'PUBLIC';
|
||||
this.paymentGatewayService.makePayment(req.body, (error, result) => {
|
||||
if (error) {
|
||||
res.status(error.code).send(error)
|
||||
//res.send (error);
|
||||
} else {
|
||||
res.send(result);
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
console.log("Exception in creating User Data . ", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Post('success')
|
||||
async paymentSuccess(
|
||||
@Req() req,
|
||||
@Res() res,
|
||||
): Promise<void> {
|
||||
console.log("==req====", req.body);
|
||||
try {
|
||||
const paymentSuccessBody = req.body;
|
||||
console.log(paymentSuccessBody);
|
||||
const userId = paymentSuccessBody.lastname.split('ESC')[1];
|
||||
const tenderId = paymentSuccessBody.lastname.split('ESC')[0];
|
||||
let user = await this.paymentMasterRepo.findOne({ userId: userId , tenderId:tenderId});
|
||||
console.log(user);
|
||||
|
||||
this.paymentGatewayService.paymentSuccess(paymentSuccessBody, (error, result) => {
|
||||
const prodInfo = paymentSuccessBody.productinfo.split('ESC');
|
||||
console.log(prodInfo, '#####');
|
||||
console.log('*************', config.get('payment-gateway'));
|
||||
|
||||
if (error) {
|
||||
let redirectUrl
|
||||
redirectUrl = config.get('url').url + config.get('payment-gateway').failureRedirectUrl + `/${req.body.lastname.split('ESC')[0]}/f`;
|
||||
user.status = 'F'
|
||||
this.paymentMasterRepo.save(user);
|
||||
console.log("==redirectUrl====", redirectUrl);
|
||||
res.redirect(redirectUrl);
|
||||
// res.send(error);
|
||||
} else {
|
||||
let redirectUrl
|
||||
redirectUrl = config.get('url').url + config.get('payment-gateway').successRedirectUrl + `/${req.body.lastname.split('ESC')[0]}/s`;
|
||||
user.status = 'S'
|
||||
this.paymentMasterRepo.save(user);
|
||||
console.log("==redirectUrl====", redirectUrl);
|
||||
res.redirect(redirectUrl);
|
||||
}
|
||||
});
|
||||
|
||||
} catch (e) {
|
||||
console.log("Exception in creating User Data . ", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Post('failure')
|
||||
async paymentFailure(
|
||||
@Req() req,
|
||||
@Res() res,
|
||||
): Promise<void> {
|
||||
console.log(req.body, 'request body');
|
||||
try {
|
||||
const paymentFailureBody = req.body;
|
||||
const userId = paymentFailureBody.lastname.split('ESC')[1];
|
||||
const tenderId = paymentFailureBody.lastname.split('ESC')[0];
|
||||
let user = await this.paymentMasterRepo.findOne({ userId: userId , tenderId:tenderId});
|
||||
console.log(user);
|
||||
this.paymentGatewayService.paymentFailure(paymentFailureBody, (error, result) => {
|
||||
console.log(paymentFailureBody);
|
||||
console.log(config.get('payment-gateway'));
|
||||
|
||||
|
||||
|
||||
if (error) {
|
||||
res.send(error);
|
||||
user.status = 'F'
|
||||
this.paymentMasterRepo.save(user);
|
||||
} else {
|
||||
// Redirect to payment failure page
|
||||
let redirectUrl
|
||||
redirectUrl = config.get('url').url + config.get('payment-gateway').failureRedirectUrl + `${req.body.lastname.split('ESC')[0]}/f`;
|
||||
user.status = 'F'
|
||||
this.paymentMasterRepo.save(user);
|
||||
res.redirect(redirectUrl);
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
console.log("Exception in creating User Data . ", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// @Controller('payment-gateway-fc')
|
||||
// export class FreeChargePaymentGatewayController {
|
||||
// constructor(
|
||||
// private freeChargePaymentGatewayService: FreeChargePaymentGatewayService
|
||||
// ) { }
|
||||
|
||||
// @Post('status')
|
||||
// async checkPaymentStatus(
|
||||
// @Body() body: any,
|
||||
// @GetUser() user: PcduserDto
|
||||
// ): Promise<any> {
|
||||
// console.log("===dd===", body);
|
||||
// return await this.freeChargePaymentGatewayService.checkPaymentStatus(body, user);
|
||||
// }
|
||||
|
||||
// @Post('refund')
|
||||
// async refundPayment(
|
||||
// @Body() body: any,
|
||||
// @GetUser() user: PcduserDto
|
||||
// ): Promise<any> {
|
||||
// console.log("===dd===", body);
|
||||
// return await this.freeChargePaymentGatewayService.refundPayment(body, user);
|
||||
// }
|
||||
|
||||
|
||||
// @Post()
|
||||
// @UseGuards(AuthGuard())
|
||||
// createPayment(
|
||||
// @Req() req,
|
||||
// @Res() res,
|
||||
// @GetUser() user: PcduserDto
|
||||
// ): void {
|
||||
// // console.log('=============',user);
|
||||
|
||||
// try {
|
||||
// const paymentBody: PurchaseDto = req.body;
|
||||
// paymentBody.amount = req.body.amount;
|
||||
// paymentBody.email = req.body.email;
|
||||
// paymentBody['user'] = user.userId;
|
||||
// paymentBody.mobile = req.body.mobile;
|
||||
// paymentBody.application = req.body.application;
|
||||
// paymentBody.type = req.body.type;
|
||||
// this.freeChargePaymentGatewayService.makePayment(paymentBody, (error, result) => {
|
||||
// if (error) {
|
||||
// // console.log(error,'err here');
|
||||
|
||||
// res.status(error.status).send()
|
||||
// //res.send (error);
|
||||
// } else {
|
||||
// res.send(result);
|
||||
// }
|
||||
// });
|
||||
// } catch (e) {
|
||||
// console.log("Exception in creating User Data . ", e);
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
// @Post('success')
|
||||
// paymentSuccess(
|
||||
// @Req() req,
|
||||
// @Res() res,
|
||||
// ): void {
|
||||
// console.log("==req====", req.body);
|
||||
// try {
|
||||
|
||||
// console.log(req.body);
|
||||
// if (req.body.statusCode == "SPG-0000") {
|
||||
// const paymentSuccessBody = req.body;
|
||||
// this.freeChargePaymentGatewayService.paymentSuccess(paymentSuccessBody, (error, result) => {
|
||||
// if (error) {
|
||||
// console.log(error, 'error test');
|
||||
|
||||
// let redirectUrl
|
||||
// if (paymentSuccessBody.productinfo == 'F') {
|
||||
// redirectUrl = config.get('url').url + config.get('payment-gateway').successRedirectUrl + `/${paymentSuccessBody.lastname}?payment=Y`;
|
||||
// } else if (paymentSuccessBody.productinfo == 'S') {
|
||||
// redirectUrl = config.get('url').url + config.get('payment-gateway').failureRedirectUrlStudent + `?id=${paymentSuccessBody.lastname}&status=Y`;
|
||||
// } else if (paymentSuccessBody.productinfo == 'A') {
|
||||
// redirectUrl = config.get('url').url + config.get('payment-gateway').failureRedirectUrlAcceptance + `/${paymentSuccessBody.lastname}?status=N`;
|
||||
// } else if (paymentSuccessBody.productinfo == 'I') {
|
||||
// redirectUrl = config.get('url').url + config.get('payment-gateway').failureRedirectUrlStudentInternal + `?rollNo=${paymentSuccessBody.lastname}&status=N`;
|
||||
// }
|
||||
|
||||
|
||||
// res.redirect(redirectUrl);
|
||||
// // res.send(error);
|
||||
// } else {
|
||||
// console.log('success test', paymentSuccessBody.productinfo);
|
||||
|
||||
// let redirectUrl
|
||||
// if (paymentSuccessBody.productinfo == 'F') {
|
||||
// redirectUrl = config.get('url').url + config.get('payment-gateway').successRedirectUrl + `/${paymentSuccessBody.lastname}?payment=Y`;
|
||||
// } else if (paymentSuccessBody.productinfo == 'S') {
|
||||
// redirectUrl = config.get('url').url + config.get('payment-gateway').successRedirectUrlStudent + `?id=${paymentSuccessBody.lastname}&status=Y`;
|
||||
// } else if (paymentSuccessBody.productinfo == 'A') {
|
||||
// redirectUrl = config.get('url').url + config.get('payment-gateway').successRedirectUrlAcceptance + `/${paymentSuccessBody.lastname}?status=Y`;
|
||||
// } else if (paymentSuccessBody.productinfo == 'I') {
|
||||
// redirectUrl = config.get('url').url + config.get('payment-gateway').successRedirectUrlStudentInternal + `?rollNo=${paymentSuccessBody.lastname}&studentId=${paymentSuccessBody.studentId}&status=Y`;
|
||||
// }
|
||||
// console.log(redirectUrl, 'red');
|
||||
// res.redirect(redirectUrl);
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
// else if (req.body.statusCode == "SPG-0001") {
|
||||
// const paymentFailureBody = req.body;
|
||||
// this.freeChargePaymentGatewayService.paymentFailure(paymentFailureBody, (error, result) => {
|
||||
// if (error) {
|
||||
// res.send(error);
|
||||
// } else {
|
||||
// // Redirect to payment failure page
|
||||
// let redirectUrl
|
||||
// if (paymentFailureBody.productinfo.split('ESC')[1] == 'F') {
|
||||
// redirectUrl = config.get('url').url + config.get('payment-gateway').successRedirectUrl + `/${paymentFailureBody.lastname}?payment=N`;
|
||||
// } else if (paymentFailureBody.productinfo.split('ESC')[1] == 'S') {
|
||||
// redirectUrl = config.get('url').url + config.get('payment-gateway').failureRedirectUrlStudent + `?id=${paymentFailureBody.lastname}&status=N`;
|
||||
// } else if (paymentFailureBody.productinfo.split('ESC')[1] == 'A') {
|
||||
// redirectUrl = config.get('url').url + config.get('payment-gateway').failureRedirectUrlAcceptance + `/${paymentFailureBody.lastname}?status=N`;
|
||||
// } else if (paymentFailureBody.productinfo.split('ESC')[1] == 'I') {
|
||||
// redirectUrl = config.get('url').url + config.get('payment-gateway').failureRedirectUrlStudentInternal + `?rollNo=${paymentFailureBody.lastname}&status=N`;
|
||||
// }
|
||||
|
||||
// res.redirect(redirectUrl);
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
// } catch (e) {
|
||||
// console.log("Exception in creating User Data . ", e);
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
// }
|
||||
@ -0,0 +1,37 @@
|
||||
import { HttpModule, Module } from '@nestjs/common';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { AuthModule } from 'src/auth/auth.module';
|
||||
import { AuthService } from 'src/auth/auth.service';
|
||||
import { CryptoService } from 'src/auth/crypto.service';
|
||||
import { PcduserRepository } from 'src/auth/pcduser.repository';
|
||||
import { EmailModule } from 'src/email/email.module';
|
||||
import { PaymentStatusRepository } from 'src/tables/payment-status/payment-status.repository';
|
||||
|
||||
|
||||
|
||||
import { PaymentGatewayController } from './payment-gateway.controller';
|
||||
import { PaymentGatewayService } from './payment-gateway.service';
|
||||
import { PaymentMasterRepository } from 'src/tables/payment-master/payment-master.repository';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
|
||||
TypeOrmModule.forFeature([
|
||||
PaymentStatusRepository,
|
||||
PaymentMasterRepository,
|
||||
|
||||
|
||||
]), AuthModule,
|
||||
HttpModule.register({
|
||||
timeout: 5000,
|
||||
maxRedirects: 5,
|
||||
}),
|
||||
|
||||
EmailModule,
|
||||
],
|
||||
controllers: [PaymentGatewayController],
|
||||
providers: [PaymentGatewayService,
|
||||
CryptoService,
|
||||
]
|
||||
})
|
||||
export class PaymentGatewayModule { }
|
||||
@ -0,0 +1,554 @@
|
||||
import { BadRequestException, HttpException, HttpService, Injectable, InternalServerErrorException, Logger, MethodNotAllowedException } from '@nestjs/common';
|
||||
import { PaymentDto } from '../dto/payment.dto';
|
||||
import { AuthService } from 'src/auth/auth.service';
|
||||
import { Connection, FindManyOptions, getConnection } from 'typeorm';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import * as bcrypt from 'bcrypt';
|
||||
//import { generate } from 'generate-password';
|
||||
import * as config from 'config';
|
||||
import { CryptoService } from 'src/auth/crypto.service';
|
||||
import { PcduserRepository } from 'src/auth/pcduser.repository';
|
||||
import { PaymentStatusRepository } from 'src/tables/payment-status/payment-status.repository';
|
||||
import { PurchaseDto } from 'src/dto/purchase.dto';
|
||||
import { PaymentStatusDto } from 'src/dto/payment-status.dto';
|
||||
import { convertDate } from 'src/pipe/pcd-date.pipe';
|
||||
var crypto = require('crypto')
|
||||
import fetch from "node-fetch";
|
||||
import { PayuTransactionListDto } from 'src/dto/payu-transaction-list.dto';
|
||||
import { PayuTransactionListRepository } from 'src/tables/payu-transaction-list/payu-transaction-list.repository';
|
||||
import { PcduserDto } from 'src/auth/dto/pcd-user.dto';
|
||||
import { PaymentMasterDto } from 'src/dto/payment-master.dto';
|
||||
import { Console } from 'console';
|
||||
import { PaymentMasterRepository } from 'src/tables/payment-master/payment-master.repository';
|
||||
|
||||
var myHeaders = new fetch.Headers();
|
||||
|
||||
const payUMoney = require("payumoney_nodejs");
|
||||
const querystring = require('querystring');
|
||||
|
||||
const paymentGatewayConf = config.get('payment-gateway');
|
||||
const paymentGatewayMethod: "DHOFAR" | "PAYU" = paymentGatewayConf.method;
|
||||
|
||||
@Injectable()
|
||||
export class PaymentGatewayService {
|
||||
|
||||
private logger = new Logger('PaymentGatewayService'); // for logging
|
||||
|
||||
|
||||
constructor(
|
||||
private readonly http: HttpService,
|
||||
// private authService: AuthService,
|
||||
private paymentStatusRepo: PaymentStatusRepository,
|
||||
private paymentMasterRepo : PaymentMasterRepository,
|
||||
|
||||
private crypto: CryptoService,
|
||||
|
||||
) {
|
||||
// Set you MERCHANT_KEY, MERCHANT_SALT_KEY, PAYUMONEY_AUTHORIZATION_HEADER
|
||||
// for both Production and Sandox Account
|
||||
payUMoney.setProdKeys(paymentGatewayConf.key, paymentGatewayConf.salt, "ylb6+TCDC20wlyTooZbYM9wDw4abjaOVV9KiHFzGPgw=");
|
||||
payUMoney.setSandboxKeys(paymentGatewayConf.key, paymentGatewayConf.salt, "ylb6+TCDC20wlyTooZbYM9wDw4abjaOVV9KiHFzGPgw=");
|
||||
payUMoney.isProdMode(true);
|
||||
}
|
||||
|
||||
public async makePayment(paymentBody: PurchaseDto, callback: (error: any, response: any) => void) {
|
||||
// let total = 0;
|
||||
// let tax = 0;
|
||||
// let totalAmount = 0;
|
||||
// let minAmount = paymentBody.amount;
|
||||
// key : "crvbe4"
|
||||
// salt : "wIVuIkieIBBrSYtXP3aVw5uFH7eFe2nM"
|
||||
|
||||
let date = new Date()
|
||||
let paymentStatus = new PaymentStatusDto()
|
||||
paymentStatus.createdBy = paymentBody["user"];
|
||||
paymentStatus.modifiedBy = paymentBody["user"];
|
||||
paymentStatus.email = paymentBody.email;
|
||||
paymentStatus.type = paymentBody.type;
|
||||
paymentStatus.status = 'U';
|
||||
paymentStatus.paymentOption = 'P'; //F - FreeCharge | P - PayU
|
||||
|
||||
let paymentModel = new PaymentDto();
|
||||
paymentModel.txnid = Date.now();
|
||||
paymentStatus.txnid = paymentModel.txnid;
|
||||
paymentModel.firstname = 'Admin';
|
||||
paymentModel.lastname = paymentBody.application.toString();
|
||||
paymentModel.email = paymentBody.email;
|
||||
paymentModel.service_provider = 'payu_paisa';
|
||||
paymentModel.furl = config.get('payment-gateway').furl;
|
||||
paymentModel.surl = config.get('payment-gateway').surl;
|
||||
paymentModel.amount = 1;
|
||||
|
||||
let paymentMaster = new PaymentMasterDto();
|
||||
paymentMaster.userId = paymentModel.lastname.split('ESC')[1];
|
||||
paymentMaster.tenderId =parseInt( paymentModel.lastname.split('ESC')[0]);
|
||||
paymentMaster.transId = paymentStatus.txnid;
|
||||
paymentMaster.status = 'P';
|
||||
console.log('paymentmasterDto======',paymentMaster);
|
||||
|
||||
const paymentMas = this.paymentMasterRepo.save(paymentMaster);
|
||||
|
||||
|
||||
// if (paymentBody.type == 'F') {
|
||||
// let application = await this.sisAdmissionFormRepository.findOne(paymentBody.application);
|
||||
// if (!application)
|
||||
// throw new BadRequestException('application not generated')
|
||||
// paymentStatus.paymentDate = new Date();
|
||||
// paymentStatus.amount = application.receiptAmount;
|
||||
// paymentStatus.application = application.id;
|
||||
// paymentModel.phone = parseInt(application.motherPhoneNo);
|
||||
// if (paymentGatewayConf.testing == true)
|
||||
// paymentModel.amount = 1;
|
||||
// else
|
||||
// paymentModel.amount = application.receiptAmount;
|
||||
// }
|
||||
// if (paymentBody.type == 'S') {
|
||||
// let payment = await this.sisFeePaymentOnlineRepository.findOne(paymentBody.application);
|
||||
// if (!payment)
|
||||
// throw new BadRequestException('payment not generated')
|
||||
// paymentStatus.paymentDate = new Date();
|
||||
// paymentStatus.amount = payment.paidAmount;
|
||||
// paymentStatus.paymentId = payment.id;
|
||||
// paymentModel.phone = payment.contactPhone;
|
||||
// if (paymentGatewayConf.testing == true)
|
||||
// paymentModel.amount = 1;
|
||||
// else
|
||||
// paymentModel.amount = payment.paidAmount;
|
||||
|
||||
// }
|
||||
// if (paymentBody.type == 'I') {
|
||||
// let payment = await this.sisFeePaymentOnlineRepository.findOne(paymentBody.application);
|
||||
// if (!payment)
|
||||
// throw new BadRequestException('payment not generated')
|
||||
// paymentStatus.paymentDate = new Date();
|
||||
// paymentStatus.amount = payment.paidAmount;
|
||||
// paymentStatus.paymentId = payment.id;
|
||||
// paymentModel.phone = payment.contactPhone;
|
||||
// if (paymentGatewayConf.testing == true)
|
||||
// paymentModel.amount = 1;
|
||||
// else
|
||||
// paymentModel.amount = payment.paidAmount;
|
||||
|
||||
// }
|
||||
// if (paymentBody.type == 'A') {
|
||||
// let application = await this.sisAdmissionFormRepository.findOne(paymentBody.application);
|
||||
// let courseFee = await this.sisFeeRepository.findOne({ where: { id: application.acceptance } })
|
||||
// if (!application)
|
||||
// throw new BadRequestException('payment not generated')
|
||||
// let date = new Date()
|
||||
// paymentStatus.paymentDate = new Date();
|
||||
// paymentStatus.amount = parseInt(courseFee.feeCharge);
|
||||
// paymentStatus.application = application.id;
|
||||
// paymentStatus.identifier = 'A';
|
||||
// paymentModel.phone = parseInt(application.motherPhoneNo);
|
||||
// if (paymentGatewayConf.testing == true)
|
||||
// paymentModel.amount = 1;
|
||||
// else
|
||||
// paymentModel.amount = parseInt(courseFee.feeCharge);
|
||||
|
||||
// }
|
||||
const pay = await this.paymentStatusRepo.save(paymentStatus);
|
||||
paymentModel.productinfo = `${pay.id}ESC${paymentBody.type}`;
|
||||
console.log(paymentModel);
|
||||
|
||||
{
|
||||
payUMoney.pay(paymentModel, (error: any, response: any) => {
|
||||
if (error) {
|
||||
console.error("makePayment error : " + error);
|
||||
callback(error, null);
|
||||
} else {
|
||||
console.log("Payment Redirection link " + response + '===' + error);
|
||||
callback(error, { url: response });
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public async paymentSuccess(paymentBody: any, callback: (error: any, response: any) => void) {
|
||||
// console.log("===payment body===", paymentBody);
|
||||
let code;
|
||||
let paymentSuccessBody;
|
||||
let receiptNo;
|
||||
let receiptNoPrefix;
|
||||
|
||||
paymentSuccessBody = paymentBody;
|
||||
code = paymentSuccessBody.txnid;
|
||||
console.log(paymentSuccessBody, 'successbody');
|
||||
|
||||
let paymentStatus = await this.paymentStatusRepo.findOne({ where: { "id": paymentSuccessBody.productinfo.split('ESC')[0] } });
|
||||
paymentStatus.status = 'S';
|
||||
await this.paymentStatusRepo.save(paymentStatus);
|
||||
|
||||
// const queryRunner = getConnection().createQueryRunner();
|
||||
// await queryRunner.connect();
|
||||
// await queryRunner.startTransaction();
|
||||
// try {
|
||||
// let productData
|
||||
// // if (paymentStatus.type == 'F' || paymentStatus.type == 'A') {
|
||||
// // productData = await this.sisAdmissionFormRepository.findOne({ where: { id: paymentStatus.application }, select: ['id', 'sessionId'] })
|
||||
// // } else {
|
||||
// // productData = await this.sisFeePaymentOnlineRepository.findOne({ where: { id: paymentStatus.paymentId }, select: ['id', 'sessionId'] })
|
||||
// // }
|
||||
|
||||
// // const session = await this.sisSessionRepository.findOne({ where: { id: productData.sessionId } });
|
||||
// // receiptNoPrefix = session.sessionCode;
|
||||
// // receiptNo = parseInt(session.receiptSeq.toString()) + 1;
|
||||
|
||||
// // await queryRunner.manager.query(`update sis_session set receipt_seq = ${receiptNo} where id = ${session.id}`);
|
||||
// // if (paymentStatus.type == 'F')
|
||||
// // await queryRunner.manager.query(`update sis_admission_form set payment_stat ='S',receipt_no_prefix='${receiptNoPrefix}',receipt_no = '${receiptNo}' where id = ${paymentStatus.application}`)
|
||||
// // if (paymentStatus.type == 'S') {
|
||||
// // await queryRunner.manager.query(`update sis_fee_payment_online set payment_stat ='S',txnid = '${code}',receipt_no_prefix='${receiptNoPrefix}',receipt_no = ${receiptNo} where id = ${paymentStatus.paymentId}`)
|
||||
// // }
|
||||
// // if (paymentStatus.type == 'I') {
|
||||
// // await queryRunner.manager.query(`update sis_fee_payment_online set payment_stat ='S',txnid = '${code}',receipt_no_prefix='${receiptNoPrefix}',receipt_no = ${receiptNo} where id = ${paymentStatus.paymentId}`)
|
||||
// // const data = await this.sisFeePaymentOnlineRepository.findOne({ where: { id: paymentStatus.paymentId }, select: ['id', 'studentId'] });
|
||||
// // const student = await this.sisStudentRepository.findOne({ where: { id: data.studentId }, select: ['id', 'rollNo', 'sessionId'] });
|
||||
// // paymentBody.lastname = student.rollNo;
|
||||
// // paymentBody['studentId'] = student.id;
|
||||
// // paymentBody['sessionId'] = student.sessionId;
|
||||
|
||||
// // }
|
||||
// // if (paymentStatus.type == 'A') {
|
||||
// // await queryRunner.manager.query(`update sis_admission_form set acceptance_fee_stat ='S',acceptance_receipt_no_prefix='${receiptNoPrefix}',acceptance_receipt_no = '${receiptNo}' where id = ${paymentStatus.application}`)
|
||||
// // }
|
||||
// queryRunner.commitTransaction()
|
||||
|
||||
|
||||
callback(null, { status: "Payment Success", id: code });
|
||||
// } catch (error) {
|
||||
// queryRunner.rollbackTransaction()
|
||||
// } finally {
|
||||
// queryRunner.release()
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
public async paymentFailure(paymentBody: any, callback: (error: any, response: any) => void) {
|
||||
let paymentFailureBody;
|
||||
let code;
|
||||
console.log("Payment Failure");
|
||||
paymentFailureBody = paymentBody;
|
||||
|
||||
|
||||
let paymentStatus = await this.paymentStatusRepo.findOne({ where: { "txnid": paymentFailureBody.txnid } });
|
||||
paymentStatus.status = 'F';
|
||||
await this.paymentStatusRepo.save(paymentStatus);
|
||||
|
||||
code = paymentFailureBody.txnid;
|
||||
|
||||
// await this.authService.updateHeader(code, 2, paymentFailureBody);
|
||||
callback(null, { status: "Payment Failed" });
|
||||
}
|
||||
|
||||
async insertPaymentStatus() {
|
||||
|
||||
}
|
||||
|
||||
// PAYU SECTION END DONT ADD PAYU RELATED CODE BELOW
|
||||
|
||||
|
||||
|
||||
}
|
||||
@Injectable()
|
||||
export class FreeChargePaymentGatewayService {
|
||||
|
||||
constructor(
|
||||
private readonly http: HttpService,
|
||||
private paymentStatusRepo: PaymentStatusRepository,
|
||||
private crypto: CryptoService,
|
||||
private PayuTransactionListRepository: PayuTransactionListRepository
|
||||
) { }
|
||||
|
||||
async getUrl() {
|
||||
if (config.get('payment-gateway-freecharge').production) {
|
||||
return config.get('payment-gateway-freecharge').prodUrl;
|
||||
} else {
|
||||
return config.get('payment-gateway-freecharge').sandUrl;
|
||||
}
|
||||
}
|
||||
|
||||
async makePayment(paymentBody: PurchaseDto, callback: (error: any, response: any) => void) {
|
||||
let date = new Date()
|
||||
|
||||
let paymentStatus = new PaymentStatusDto()
|
||||
paymentStatus.createdBy = paymentBody["user"];
|
||||
paymentStatus.modifiedBy = paymentBody["user"];
|
||||
paymentStatus.email = paymentBody.email;
|
||||
paymentStatus.type = paymentBody.type;
|
||||
paymentStatus.status = 'U';
|
||||
paymentStatus.paymentOption = 'F'; //F - FreeCharge | P - PayU
|
||||
|
||||
|
||||
let paymentJson = {
|
||||
merchantId: config.get('payment-gateway-freecharge').merchantId,
|
||||
callbackUrl: config.get('payment-gateway-freecharge').callBackUrl,
|
||||
merchantTxnId: null,
|
||||
merchantTxnAmount: paymentBody.amount,
|
||||
currency: config.get('payment-gateway-freecharge').currency,
|
||||
customerEmailId: paymentBody.email,
|
||||
customerMobileNo: paymentBody.mobile,
|
||||
timestamp: date.getTime(),
|
||||
udf1: null
|
||||
}
|
||||
paymentStatus.txnid = paymentJson.timestamp;
|
||||
paymentJson.merchantTxnId = paymentJson.timestamp;
|
||||
|
||||
// if (paymentBody.type == 'F') {
|
||||
// let application = await this.sisAdmissionFormRepository.findOne(paymentBody.application);
|
||||
// if (!application)
|
||||
// throw new BadRequestException('application not generated')
|
||||
// paymentStatus.paymentDate = new Date();
|
||||
// paymentStatus.amount = application.receiptAmount;
|
||||
// paymentStatus.application = application.id;
|
||||
// paymentJson.customerMobileNo = application.motherPhoneNo;
|
||||
// if (paymentGatewayConf.testing == true)
|
||||
// paymentJson.merchantTxnAmount = 1;
|
||||
// else
|
||||
// paymentJson.merchantTxnAmount = application.receiptAmount;
|
||||
// }
|
||||
// if (paymentBody.type == 'S') {
|
||||
// let payment = await this.sisFeePaymentOnlineRepository.findOne(paymentBody.application);
|
||||
// if (!payment)
|
||||
// throw new BadRequestException('payment not generated')
|
||||
// paymentStatus.paymentDate = new Date();
|
||||
// paymentStatus.amount = payment.paidAmount;
|
||||
// paymentStatus.paymentId = payment.id;
|
||||
// paymentJson.customerMobileNo = payment.contactPhone.toString();
|
||||
// if (paymentGatewayConf.testing == true)
|
||||
// paymentJson.merchantTxnAmount = 1;
|
||||
// else
|
||||
// paymentJson.merchantTxnAmount = payment.paidAmount;
|
||||
|
||||
// }
|
||||
// if (paymentBody.type == 'I') {
|
||||
// let payment = await this.sisFeePaymentOnlineRepository.findOne(paymentBody.application);
|
||||
// if (!payment)
|
||||
// throw new BadRequestException('payment not generated')
|
||||
// paymentStatus.paymentDate = new Date();
|
||||
// paymentStatus.amount = payment.paidAmount;
|
||||
// paymentStatus.paymentId = payment.id;
|
||||
// paymentJson.merchantTxnAmount = payment.contactPhone;
|
||||
// if (paymentGatewayConf.testing == true)
|
||||
// paymentJson.merchantTxnAmount = 1;
|
||||
// else
|
||||
// paymentJson.merchantTxnAmount = payment.paidAmount;
|
||||
|
||||
// }
|
||||
// if (paymentBody.type == 'A') {
|
||||
// let application = await this.sisAdmissionFormRepository.findOne(paymentBody.application);
|
||||
// let courseFee = await this.sisFeeRepository.findOne({ where: { id: application.acceptance } })
|
||||
// if (!application)
|
||||
// throw new BadRequestException('payment not generated')
|
||||
// let date = new Date()
|
||||
// paymentStatus.paymentDate = new Date();
|
||||
// paymentStatus.amount = parseInt(courseFee.feeCharge);
|
||||
// paymentStatus.application = application.id;
|
||||
// paymentStatus.identifier = 'A';
|
||||
// paymentJson.customerMobileNo = application.motherPhoneNo;
|
||||
// if (paymentGatewayConf.testing == true)
|
||||
// paymentJson.merchantTxnAmount = 1;
|
||||
// else
|
||||
// paymentJson.merchantTxnAmount = parseInt(courseFee.feeCharge);
|
||||
|
||||
// }
|
||||
const pay = await this.paymentStatusRepo.save(paymentStatus);
|
||||
paymentJson.udf1 = `${pay.id}ESC${paymentBody.type}`;
|
||||
|
||||
const ordered = Object.keys(paymentJson).sort().reduce(
|
||||
(obj, key) => {
|
||||
obj[key] = paymentJson[key];
|
||||
return obj;
|
||||
},
|
||||
{}
|
||||
);
|
||||
|
||||
console.log(ordered)
|
||||
|
||||
let string = ''
|
||||
|
||||
for (const [key, value] of Object.entries(ordered)) {
|
||||
if (value)
|
||||
string = string + value
|
||||
}
|
||||
string = string + config.get('payment-gateway-freecharge').key
|
||||
console.log(string);
|
||||
|
||||
const hash = crypto.createHash('sha256').update(string).digest('hex');
|
||||
|
||||
console.log(hash);
|
||||
paymentJson['signature'] = hash
|
||||
callback(null, { paymentBody: paymentJson, url: `${await this.getUrl()}/payment/v1/checkout` })
|
||||
}
|
||||
|
||||
public async paymentSuccess(paymentBody: any, callback: (error: any, response: any) => void) {
|
||||
// console.log("===payment body===", paymentBody);
|
||||
let code;
|
||||
let paymentSuccessBody;
|
||||
let receiptNo;
|
||||
let receiptNoPrefix;
|
||||
|
||||
paymentSuccessBody = paymentBody;
|
||||
|
||||
console.log(paymentSuccessBody, 'successbody');
|
||||
|
||||
|
||||
let paymentStatus = await this.paymentStatusRepo.findOne({ where: { txnid: paymentBody.merchantTxnId } });
|
||||
await this.insertPaymentRecord(paymentStatus, paymentSuccessBody);
|
||||
if (paymentStatus.application) {
|
||||
paymentSuccessBody.lastname = paymentStatus.application;
|
||||
} else if (paymentStatus.paymentId) {
|
||||
paymentSuccessBody.lastname = paymentStatus.paymentId
|
||||
}
|
||||
code = paymentStatus.txnid;
|
||||
paymentStatus.status = 'S';
|
||||
paymentStatus.txnrefid = paymentSuccessBody.txnReferenceId;
|
||||
paymentSuccessBody.productinfo = paymentStatus.type;
|
||||
await this.paymentStatusRepo.save(paymentStatus);
|
||||
|
||||
const queryRunner = getConnection().createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
try {
|
||||
let productData
|
||||
// if (paymentStatus.type == 'F' || paymentStatus.type == 'A') {
|
||||
// productData = await this.sisAdmissionFormRepository.findOne({ where: { id: paymentStatus.application }, select: ['id', 'sessionId'] })
|
||||
// } else {
|
||||
// productData = await this.sisFeePaymentOnlineRepository.findOne({ where: { id: paymentStatus.paymentId }, select: ['id', 'sessionId'] })
|
||||
// }
|
||||
|
||||
// const session = await this.sisSessionRepository.findOne({ where: { id: productData.sessionId } });
|
||||
// receiptNoPrefix = session.sessionCode;
|
||||
// receiptNo = parseInt(session.receiptSeq.toString()) + 1;
|
||||
|
||||
// await queryRunner.manager.query(`update sis_session set receipt_seq = ${receiptNo} where id = ${session.id}`);
|
||||
// if (paymentStatus.type == 'F')
|
||||
// await queryRunner.manager.query(`update sis_admission_form set payment_stat ='S',receipt_no_prefix='${receiptNoPrefix}',receipt_no = '${receiptNo}' where id = ${paymentStatus.application}`)
|
||||
// if (paymentStatus.type == 'S') {
|
||||
// await queryRunner.manager.query(`update sis_fee_payment_online set payment_stat ='S',txnid = '${code}',receipt_no_prefix='${receiptNoPrefix}',receipt_no = ${receiptNo} where id = ${paymentStatus.paymentId}`)
|
||||
// }
|
||||
// if (paymentStatus.type == 'I') {
|
||||
// await queryRunner.manager.query(`update sis_fee_payment_online set payment_stat ='S',txnid = '${code}',receipt_no_prefix='${receiptNoPrefix}',receipt_no = ${receiptNo} where id = ${paymentStatus.paymentId}`)
|
||||
// const data = await this.sisFeePaymentOnlineRepository.findOne({ where: { id: paymentStatus.paymentId }, select: ['id', 'studentId'] });
|
||||
// const student = await this.sisStudentRepository.findOne({ where: { id: data.studentId }, select: ['id', 'rollNo', 'sessionId'] });
|
||||
// paymentBody.lastname = student.rollNo;
|
||||
// paymentBody['studentId'] = student.id;
|
||||
// paymentBody['sessionId'] = student.sessionId;
|
||||
|
||||
// }
|
||||
if (paymentStatus.type == 'A') {
|
||||
await queryRunner.manager.query(`update sis_admission_form set acceptance_fee_stat ='S',acceptance_receipt_no_prefix='${receiptNoPrefix}',acceptance_receipt_no = '${receiptNo}' where id = ${paymentStatus.application}`)
|
||||
}
|
||||
queryRunner.commitTransaction()
|
||||
|
||||
|
||||
callback(null, { status: "Payment Success", id: code });
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
|
||||
queryRunner.rollbackTransaction()
|
||||
} finally {
|
||||
queryRunner.release()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
async insertPaymentRecord(paymentStatus: PaymentStatusDto, paymentSuccessBody: any) {
|
||||
let PayuTransaction = new PayuTransactionListDto();
|
||||
PayuTransaction.addedon = paymentStatus.paymentDate;
|
||||
PayuTransaction.amount = paymentSuccessBody.amount;
|
||||
PayuTransaction.txnid = paymentSuccessBody.merchantTxnId;
|
||||
PayuTransaction.status = 'success';
|
||||
PayuTransaction.gateway = 'FreeCharge';
|
||||
PayuTransaction.transaction_fee = paymentSuccessBody.amount;
|
||||
PayuTransaction.mer_service_fee = paymentSuccessBody.handlingFee;
|
||||
PayuTransaction.mer_service_tax = paymentSuccessBody.taxAmount;
|
||||
PayuTransaction.id = paymentSuccessBody.txnReferenceId;
|
||||
await this.PayuTransactionListRepository.save(PayuTransaction)
|
||||
}
|
||||
|
||||
|
||||
async checkPaymentStatus(body: any, user: PcduserDto) {
|
||||
let paymentBody = {
|
||||
"merchantId": `${config.get('payment-gateway-freecharge').merchantId}`,
|
||||
"merchantTxnId": `${body.merchantTxnId}`
|
||||
}
|
||||
let string = ''
|
||||
for (const [key, value] of Object.entries(paymentBody)) {
|
||||
if (value)
|
||||
string = string + value
|
||||
}
|
||||
string = string + config.get('payment-gateway-freecharge').key
|
||||
console.log(string);
|
||||
|
||||
const hash = crypto.createHash('sha256').update(string).digest('hex');
|
||||
paymentBody['signature'] = hash;
|
||||
return this.http.post(`${await this.getUrl()}/payment/v1/txn/status`, paymentBody).toPromise().then((res) => {
|
||||
console.log("===res====", res.data);
|
||||
return res.data;
|
||||
}, (err) => {
|
||||
console.log("===errr====", err);
|
||||
return err;
|
||||
});
|
||||
}
|
||||
|
||||
async refundPayment(body: any, user: PcduserDto) {
|
||||
let date = new Date()
|
||||
let paymentBody = {
|
||||
"merchantId": `${config.get('payment-gateway-freecharge').merchantId}`,
|
||||
"merchantRefundTxnId": date.getTime(),
|
||||
"txnReferenceId": body.txnReferenceId,
|
||||
"refundAmount": body.amount,
|
||||
"currency": "INR"
|
||||
}
|
||||
const ordered = Object.keys(paymentBody).sort().reduce(
|
||||
(obj, key) => {
|
||||
obj[key] = paymentBody[key];
|
||||
return obj;
|
||||
},
|
||||
{}
|
||||
);
|
||||
let string = ''
|
||||
for (const [key, value] of Object.entries(ordered)) {
|
||||
if (value)
|
||||
string = string + value
|
||||
}
|
||||
string = string + config.get('payment-gateway-freecharge').key;
|
||||
const hash = crypto.createHash('sha256').update(string).digest('hex');
|
||||
paymentBody['signature'] = hash;
|
||||
return this.http.post(`${await this.getUrl()}/payment/v1/refund`, paymentBody).toPromise().then((res) => {
|
||||
console.log("===res====", res.data);
|
||||
return res.data;
|
||||
}, (err) => {
|
||||
console.log("===errr====", err);
|
||||
return err;
|
||||
});
|
||||
}
|
||||
|
||||
public async paymentFailure(paymentBody: any, callback: (error: any, response: any) => void) {
|
||||
let paymentFailureBody;
|
||||
let code;
|
||||
|
||||
paymentFailureBody = paymentBody;
|
||||
let paymentStatus = await this.paymentStatusRepo.findOne({ where: { "txnid": paymentFailureBody.merchantTxnId } });
|
||||
paymentFailureBody.productinfo = paymentStatus.type;
|
||||
if (paymentStatus.application) {
|
||||
paymentFailureBody.lastname = paymentStatus.application;
|
||||
} else if (paymentStatus.paymentId) {
|
||||
paymentFailureBody.lastname = paymentStatus.paymentId
|
||||
}
|
||||
|
||||
paymentStatus.status = 'F';
|
||||
await this.paymentStatusRepo.save(paymentStatus);
|
||||
|
||||
code = paymentFailureBody.merchantTxnId;
|
||||
|
||||
// await this.authService.updateHeader(code, 2, paymentFailureBody);
|
||||
callback(null, { status: "Payment Failed" });
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -0,0 +1,44 @@
|
||||
import { Controller, Get, Param, Post,Body,UseGuards } from '@nestjs/common';
|
||||
import { PaymentMasterDto } from 'src/dto/payment-master.dto';
|
||||
import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller';
|
||||
import { PaymentMasterService } from './payment-master.service';
|
||||
import { AuthGuard } from '@nestjs/passport';
|
||||
@UseGuards(AuthGuard())
|
||||
@Controller('payment-master')
|
||||
export class PaymentMasterController extends PcdFormGridController<PaymentMasterDto> {
|
||||
|
||||
constructor(
|
||||
private paymentMasterService: PaymentMasterService
|
||||
) {
|
||||
super(paymentMasterService);
|
||||
}
|
||||
|
||||
|
||||
@Get('bid-report/:id')
|
||||
async bidReport(
|
||||
@Param('id') tenderId: string
|
||||
):Promise<void>{
|
||||
return this.paymentMasterService.bidReport(tenderId)
|
||||
}
|
||||
|
||||
|
||||
@Get('bid-payment-check/:userId/:tenderId')
|
||||
async bidPaymentCheck(
|
||||
@Param('userId') userId: string,
|
||||
@Param('tenderId') tenderId : string
|
||||
){
|
||||
|
||||
|
||||
return this.paymentMasterService.bidPaymentCheck(tenderId ,userId)
|
||||
}
|
||||
|
||||
@Post('finalBidAmt/:userId/:tenderId')
|
||||
async finalBidAmt(
|
||||
@Body() body: { bidAmount : number },
|
||||
@Param('userId') userId: string,
|
||||
@Param('tenderId') tenderId : string,
|
||||
){
|
||||
return this.paymentMasterService.finalBidAmt(tenderId ,userId , body)
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,58 @@
|
||||
import { PcdBaseEntity } from "src/framework/custom/pcd-entity.custom";
|
||||
import { Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from "typeorm";
|
||||
import { TenderMaster } from "../tender-master/tender-master.entity";
|
||||
import { Pcduser } from "src/auth/pcduser.entity";
|
||||
|
||||
@Entity('payment-master')
|
||||
export class PaymentMaster extends PcdBaseEntity{
|
||||
@PrimaryGeneratedColumn({
|
||||
name:"id"
|
||||
})
|
||||
id:number
|
||||
|
||||
@Column({
|
||||
name:"user_id",
|
||||
type:"varchar",
|
||||
nullable:true,
|
||||
})
|
||||
userId:string
|
||||
|
||||
@Column({
|
||||
name:"tender_id",
|
||||
type:"numeric",
|
||||
nullable:true,
|
||||
})
|
||||
tenderId:number
|
||||
|
||||
@Column({
|
||||
name:"trans_id",
|
||||
type:"numeric",
|
||||
nullable:true,
|
||||
})
|
||||
transId:number
|
||||
|
||||
@Column({
|
||||
name:"status",
|
||||
type:"varchar",
|
||||
nullable:true,
|
||||
length:2
|
||||
})
|
||||
status:string
|
||||
|
||||
@Column({
|
||||
name:"final_bid_amt",
|
||||
type:"numeric",
|
||||
nullable:true,
|
||||
})
|
||||
finalBidAmt:number
|
||||
|
||||
|
||||
@ManyToOne(() => Pcduser, (pcduser) => pcduser.paymentMaster, { eager: true })
|
||||
@JoinColumn([{ name: "user_id", referencedColumnName: "userId" }])
|
||||
pcduserD: Pcduser
|
||||
|
||||
@ManyToOne(() => TenderMaster, (tenderMaster) => tenderMaster.paymentMaster, )
|
||||
@JoinColumn([{ name: "tender_id", referencedColumnName: "id" }])
|
||||
tenderMasterD: TenderMaster
|
||||
|
||||
}
|
||||
@ -0,0 +1,16 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { PaymentMasterController } from './payment-master.controller';
|
||||
import { PaymentMasterService } from './payment-master.service';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { AuthModule } from 'src/auth/auth.module';
|
||||
import { PaymentMasterRepository } from './payment-master.repository';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
TypeOrmModule.forFeature([PaymentMasterRepository]),
|
||||
AuthModule
|
||||
],
|
||||
controllers: [PaymentMasterController],
|
||||
providers: [PaymentMasterService]
|
||||
})
|
||||
export class PaymentMasterModule {}
|
||||
@ -0,0 +1,7 @@
|
||||
import { EntityRepository, Repository } from "typeorm";
|
||||
import { PaymentMaster } from "./payment-master.entity";
|
||||
|
||||
@EntityRepository(PaymentMaster)
|
||||
export class PaymentMasterRepository extends Repository<PaymentMaster>{
|
||||
|
||||
}
|
||||
@ -0,0 +1,66 @@
|
||||
import { Injectable ,BadRequestException} from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { PaymentMasterDto } from 'src/dto/payment-master.dto';
|
||||
import { PcdFormGridService } from 'src/framework/beans/pcd-form-grid.service';
|
||||
import { PaymentMasterRepository } from './payment-master.repository';
|
||||
import { log } from 'console';
|
||||
|
||||
@Injectable()
|
||||
export class PaymentMasterService extends PcdFormGridService<PaymentMasterDto>{
|
||||
|
||||
constructor(
|
||||
@InjectRepository(PaymentMasterRepository)
|
||||
private paymentMasterRepository: PaymentMasterRepository,
|
||||
) {
|
||||
super(paymentMasterRepository);
|
||||
}
|
||||
|
||||
async bidReport(tenderId){
|
||||
let id = tenderId.toString()
|
||||
console.log(id);
|
||||
|
||||
let query= `SELECT "PaymentMaster"."id" AS "id",
|
||||
"PaymentMaster"."user_id" AS "userId", "PaymentMaster"."tender_id" AS "tenderId",
|
||||
"PaymentMaster"."trans_id" AS "transId", "PaymentMaster"."status" AS "status",
|
||||
"PaymentMaster"."final_bid_amt" AS "finalBidAmt",
|
||||
"PaymentMaster_pcduserD"."user_name" AS "userName",
|
||||
"PaymentMaster_pcduserD"."email" AS "email",
|
||||
"PaymentMaster_pcduserD"."mobile_number" AS "mobileNumber" FROM "payment-master" "PaymentMaster" LEFT JOIN "pcduser" "PaymentMaster_pcduserD" ON
|
||||
"PaymentMaster_pcduserD"."user_id"="PaymentMaster"."user_id" WHERE "PaymentMaster"."tender_id"= ${id}`
|
||||
let report =await this.paymentMasterRepository.query(query)
|
||||
return report;
|
||||
|
||||
}
|
||||
|
||||
async bidPaymentCheck(tenderId,userId){
|
||||
let query= `SELECT "PaymentMaster"."id" AS "id",
|
||||
"PaymentMaster"."user_id" AS "userId", "PaymentMaster"."tender_id" AS "tenderId",
|
||||
"PaymentMaster"."trans_id" AS "transId", "PaymentMaster"."status" AS "status",
|
||||
"PaymentMaster_pcduserD"."user_name" AS "userName",
|
||||
"PaymentMaster_pcduserD"."email" AS "email",
|
||||
"PaymentMaster_pcduserD"."mobile_number" AS "mobileNumber" FROM "payment-master" "PaymentMaster" LEFT JOIN "pcduser" "PaymentMaster_pcduserD" ON
|
||||
"PaymentMaster_pcduserD"."user_id"="PaymentMaster"."user_id" WHERE "PaymentMaster"."tender_id"= ${tenderId} and "PaymentMaster"."user_id"= '${userId}'
|
||||
and "PaymentMaster"."status"='S' `
|
||||
let report =await this.paymentMasterRepository.query(query)
|
||||
return report;
|
||||
|
||||
}
|
||||
|
||||
async finalBidAmt(tenderId ,userId,body){
|
||||
let user = await this.paymentMasterRepository.findOne({ tenderId:tenderId , userId:userId });
|
||||
if(!user){
|
||||
throw new BadRequestException('User Details not found')
|
||||
}
|
||||
if(user.finalBidAmt == null){
|
||||
user.finalBidAmt = body.bidAmount;
|
||||
this.paymentMasterRepository.save(user)
|
||||
return {data : "Final Bid Amount Successfully Saved"}
|
||||
}else{
|
||||
throw new BadRequestException('Bid Amount Already Exist')
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,15 @@
|
||||
import { Controller, UseGuards } from '@nestjs/common';
|
||||
import { AuthGuard } from '@nestjs/passport';
|
||||
import { PaymentStatusDto } from 'src/dto/payment-status.dto';
|
||||
import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller';
|
||||
import { PaymentStatusService } from './payment-status.service';
|
||||
|
||||
@UseGuards(AuthGuard())
|
||||
@Controller('payment-status')
|
||||
export class PaymentStatusController extends PcdFormGridController<PaymentStatusDto>{
|
||||
constructor(
|
||||
private iservice: PaymentStatusService
|
||||
) {
|
||||
super(iservice);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,166 @@
|
||||
import { PcdBaseEntity } from "src/framework/custom/pcd-entity.custom";
|
||||
import { Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from "typeorm";
|
||||
|
||||
|
||||
@Entity("payment_status")
|
||||
export class PaymentStatus extends PcdBaseEntity {
|
||||
@PrimaryGeneratedColumn({
|
||||
name: "id",
|
||||
})
|
||||
id: number;
|
||||
|
||||
@Column({
|
||||
name: "payment_date",
|
||||
type: "date",
|
||||
nullable: true
|
||||
})
|
||||
paymentDate: Date;
|
||||
|
||||
@Column({
|
||||
name: 'payment_option',
|
||||
type: 'char',
|
||||
length: 1,
|
||||
nullable: true
|
||||
})
|
||||
paymentOption: string;
|
||||
|
||||
@Column({
|
||||
name: 'payment_card_details',
|
||||
type: 'varchar',
|
||||
length: 500,
|
||||
nullable: true
|
||||
})
|
||||
paymentCardDetails: string;
|
||||
|
||||
@Column({
|
||||
name: 'status',
|
||||
type: 'char',
|
||||
length: 1,
|
||||
nullable: true
|
||||
})
|
||||
status: string;
|
||||
|
||||
@Column({
|
||||
name: 'type',
|
||||
type: 'char',
|
||||
length: 1,
|
||||
nullable: true
|
||||
})
|
||||
type: string;
|
||||
|
||||
@Column({
|
||||
name: 'email',
|
||||
type: 'varchar',
|
||||
length: 500,
|
||||
nullable: true
|
||||
})
|
||||
email: string;
|
||||
|
||||
@Column({
|
||||
name: 'mobile',
|
||||
type: 'varchar',
|
||||
length: 100,
|
||||
nullable: true
|
||||
})
|
||||
mobile: string;
|
||||
|
||||
@Column({
|
||||
name: 'application',
|
||||
type: 'numeric',
|
||||
nullable: true
|
||||
})
|
||||
application: number;
|
||||
|
||||
|
||||
// @ManyToOne(type => SisAdmissionForm, sisAdmissionForm => sisAdmissionForm.paymentStatus)
|
||||
// @JoinColumn({ name: 'application', referencedColumnName: 'id' })
|
||||
// applicationD: SisAdmissionForm;
|
||||
|
||||
@Column({
|
||||
name: 'payment_id',
|
||||
type: 'numeric',
|
||||
nullable: true
|
||||
})
|
||||
paymentId: number;
|
||||
|
||||
// @ManyToOne(type => SisFeePaymentOnline, sisFeePaymentOnline => sisFeePaymentOnline.paymentStatus)
|
||||
// @JoinColumn({ name: 'payment_id', referencedColumnName: 'id' })
|
||||
// paymentIdD: SisFeePaymentOnline;
|
||||
|
||||
@Column({
|
||||
name: 'billing_address_1',
|
||||
type: 'varchar',
|
||||
length: 100,
|
||||
nullable: true
|
||||
})
|
||||
billingAddress1: string;
|
||||
|
||||
@Column({
|
||||
name: 'billing_address_2',
|
||||
type: 'varchar',
|
||||
length: 100,
|
||||
nullable: true
|
||||
})
|
||||
billingAddress2: string;
|
||||
|
||||
@Column({
|
||||
name: 'billing_address_3',
|
||||
type: 'varchar',
|
||||
length: 100,
|
||||
nullable: true
|
||||
})
|
||||
billingAddress3: string;
|
||||
|
||||
@Column({
|
||||
name: 'billing_address_4',
|
||||
type: 'varchar',
|
||||
length: 100,
|
||||
nullable: true
|
||||
})
|
||||
billingAddress4: string;
|
||||
|
||||
@Column({
|
||||
name: 'amount',
|
||||
type: 'numeric',
|
||||
precision: 18,
|
||||
scale: 3,
|
||||
nullable: true
|
||||
})
|
||||
amount: number;
|
||||
|
||||
|
||||
@Column({
|
||||
name: 'remarks',
|
||||
type: 'varchar',
|
||||
length: 1000,
|
||||
nullable: true
|
||||
})
|
||||
remarks: string;
|
||||
|
||||
|
||||
@Column({
|
||||
name: 'txnid',
|
||||
type: 'numeric',
|
||||
nullable: false
|
||||
})
|
||||
txnid: number;
|
||||
|
||||
@Column({
|
||||
name: 'txnrefid',
|
||||
type: 'varchar',
|
||||
nullable: true,
|
||||
length: 100
|
||||
})
|
||||
txnrefid: string;
|
||||
|
||||
@Column({
|
||||
name: 'retry_count',
|
||||
type: 'numeric',
|
||||
default: () => "(0)"
|
||||
})
|
||||
retryCount: number;
|
||||
|
||||
@Column("varchar", { name: "identifier", nullable: true, length: 1 })
|
||||
identifier: string;
|
||||
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { AuthModule } from 'src/auth/auth.module';
|
||||
import { PaymentStatusController } from './payment-status.controller';
|
||||
import { PaymentStatusRepository } from './payment-status.repository';
|
||||
import { PaymentStatusService } from './payment-status.service';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
TypeOrmModule.forFeature([
|
||||
PaymentStatusRepository
|
||||
]),
|
||||
AuthModule
|
||||
],
|
||||
controllers: [PaymentStatusController],
|
||||
providers: [PaymentStatusService]
|
||||
})
|
||||
export class PaymentStatusModule { }
|
||||
@ -0,0 +1,7 @@
|
||||
import { EntityRepository, Repository } from "typeorm";
|
||||
import { PaymentStatus } from "./payment-status.entity";
|
||||
|
||||
@EntityRepository(PaymentStatus)
|
||||
export class PaymentStatusRepository extends Repository<PaymentStatus>{
|
||||
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { PaymentStatusDto } from 'src/dto/payment-status.dto';
|
||||
import { PcdFormGridService } from 'src/framework/beans/pcd-form-grid.service';
|
||||
import { PaymentStatusRepository } from './payment-status.repository';
|
||||
|
||||
@Injectable()
|
||||
export class PaymentStatusService extends PcdFormGridService<PaymentStatusDto>{
|
||||
MANDATORY_FEILDS: string[] = [];
|
||||
DUPLICATE_CHK: string[] = [];
|
||||
MAIN_KEY = 'id'
|
||||
constructor(
|
||||
@InjectRepository(PaymentStatusRepository)
|
||||
private paymentStatusRepository: PaymentStatusRepository,
|
||||
) {
|
||||
super(paymentStatusRepository);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,37 @@
|
||||
import { Body, Controller, Get, Post, Query, UseGuards } from '@nestjs/common';
|
||||
import { AuthGuard } from '@nestjs/passport';
|
||||
import { GetUser } from 'src/auth/dto/get-user.decorator';
|
||||
import { PcduserDto } from 'src/auth/dto/pcd-user.dto';
|
||||
import { PayuTransactionListDto } from 'src/dto/payu-transaction-list.dto';
|
||||
import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller';
|
||||
import { FindManyOptions } from 'typeorm';
|
||||
import { PayuTransactionListService } from './payu-transaction-list.service';
|
||||
|
||||
@UseGuards(AuthGuard())
|
||||
@Controller('payu-transaction-list')
|
||||
export class PayuTransactionListController extends PcdFormGridController<PayuTransactionListDto>{
|
||||
constructor(
|
||||
private PayuTransactionListservice: PayuTransactionListService
|
||||
) {
|
||||
super(PayuTransactionListservice);
|
||||
}
|
||||
@Post('get-transaction')
|
||||
getTransactionDetails(
|
||||
@Body() body: PcduserDto,
|
||||
@GetUser() user: PcduserDto): Promise<any> {
|
||||
|
||||
return this.PayuTransactionListservice.getTransactionDetails(body);
|
||||
}
|
||||
|
||||
@Get('date-filter')
|
||||
dateFilter(@Query() filter: FindManyOptions) {
|
||||
|
||||
return this.PayuTransactionListservice.dateFilter(filter)
|
||||
}
|
||||
|
||||
@Get('check-status')
|
||||
checkPaymentStatus(): Promise<any> {
|
||||
|
||||
return this.PayuTransactionListservice.checkPaymentStatus();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,362 @@
|
||||
// import { PcdBaseEntity } from "src/framework/custom/pcd-entity.custom";
|
||||
import { BaseEntity, Column, Entity, PrimaryGeneratedColumn } from "typeorm"
|
||||
|
||||
@Entity('payu_transaction')
|
||||
export class PayuTransactionListEntity extends BaseEntity {
|
||||
|
||||
@PrimaryGeneratedColumn({
|
||||
name: 'id',
|
||||
})
|
||||
sisId: string;
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'payu_id',
|
||||
})
|
||||
id: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'status',
|
||||
nullable: true,
|
||||
|
||||
|
||||
})
|
||||
status: string;
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'key',
|
||||
nullable: true
|
||||
})
|
||||
key: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'merchantname',
|
||||
nullable: true
|
||||
})
|
||||
merchantname: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'firstName',
|
||||
nullable: true
|
||||
})
|
||||
firstname: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'lastname',
|
||||
nullable: true
|
||||
})
|
||||
lastname: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'addedon',
|
||||
nullable: true
|
||||
})
|
||||
addedon: Date
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'bank_name',
|
||||
nullable: true
|
||||
})
|
||||
bank_name: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'payment_gateway',
|
||||
nullable: true
|
||||
})
|
||||
payment_gateway: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'phone',
|
||||
nullable: true
|
||||
})
|
||||
phone: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'email',
|
||||
nullable: true
|
||||
})
|
||||
email: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'transaction_fee',
|
||||
nullable: true
|
||||
})
|
||||
transaction_fee: number
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'amount',
|
||||
nullable: true
|
||||
})
|
||||
amount: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'discount',
|
||||
nullable: true
|
||||
})
|
||||
discount: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'additional_charges',
|
||||
nullable: true
|
||||
})
|
||||
additional_charges: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'productinfo',
|
||||
nullable: true
|
||||
})
|
||||
productinfo: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'error_code',
|
||||
nullable: true
|
||||
})
|
||||
error_code: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'bank_ref_no',
|
||||
nullable: true
|
||||
})
|
||||
bank_ref_no: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'ibibo_code',
|
||||
nullable: true
|
||||
})
|
||||
ibibo_code: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'mode',
|
||||
nullable: true
|
||||
})
|
||||
mode: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'ip',
|
||||
nullable: true
|
||||
})
|
||||
ip: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'card_no',
|
||||
nullable: true
|
||||
})
|
||||
card_no: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'cardtype',
|
||||
nullable: true
|
||||
})
|
||||
cardtype: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'offer_key',
|
||||
nullable: true
|
||||
})
|
||||
offer_key: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'field0',
|
||||
nullable: true
|
||||
})
|
||||
field0: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'field1',
|
||||
nullable: true
|
||||
})
|
||||
field1: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'field2',
|
||||
nullable: true
|
||||
})
|
||||
field2: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'field3',
|
||||
nullable: true
|
||||
})
|
||||
field3: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'field4',
|
||||
nullable: true
|
||||
})
|
||||
field4: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'field5',
|
||||
nullable: true
|
||||
})
|
||||
field5: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'field6',
|
||||
nullable: true
|
||||
})
|
||||
field6: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'field7',
|
||||
nullable: true
|
||||
})
|
||||
field7: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'field8',
|
||||
nullable: true
|
||||
})
|
||||
field8: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'field9',
|
||||
nullable: true
|
||||
})
|
||||
field9: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'udf1',
|
||||
nullable: true
|
||||
})
|
||||
udf1: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'udf2',
|
||||
nullable: true
|
||||
})
|
||||
udf2: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'udf3',
|
||||
nullable: true
|
||||
})
|
||||
udf3: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'udf4',
|
||||
nullable: true
|
||||
})
|
||||
udf4: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'udf5',
|
||||
nullable: true
|
||||
})
|
||||
udf5: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'address2',
|
||||
nullable: true
|
||||
})
|
||||
address2: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'city',
|
||||
nullable: true
|
||||
})
|
||||
city: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'zipcode',
|
||||
nullable: true
|
||||
})
|
||||
zipcode: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'pg_mid',
|
||||
nullable: true
|
||||
})
|
||||
pg_mid: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'issuing_bank',
|
||||
nullable: true
|
||||
})
|
||||
issuing_bank: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'offer_type',
|
||||
nullable: true
|
||||
})
|
||||
offer_type: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'failure_reason',
|
||||
nullable: true
|
||||
})
|
||||
failure_reason: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'mer_service_fee',
|
||||
nullable: true
|
||||
})
|
||||
mer_service_fee: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'mer_service_tax',
|
||||
nullable: true
|
||||
})
|
||||
mer_service_tax: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'txnid',
|
||||
nullable: true
|
||||
})
|
||||
txnid: string
|
||||
|
||||
@Column({
|
||||
type: 'varchar',
|
||||
name: 'gateway',
|
||||
nullable: true
|
||||
})
|
||||
gateway: string;
|
||||
}
|
||||
@ -0,0 +1,21 @@
|
||||
import { HttpModule, Module } from '@nestjs/common';
|
||||
import { PayuTransactionListService } from './payu-transaction-list.service';
|
||||
import { PayuTransactionListController } from './payu-transaction-list.controller';
|
||||
import { PayuTransactionListRepository } from './payu-transaction-list.repository';
|
||||
import { PcduserRepository } from 'src/auth/pcduser.repository';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { AuthModule } from 'src/auth/auth.module';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
TypeOrmModule.forFeature([
|
||||
PayuTransactionListRepository,
|
||||
]),
|
||||
AuthModule,
|
||||
HttpModule
|
||||
],
|
||||
providers: [PayuTransactionListService],
|
||||
controllers: [PayuTransactionListController],
|
||||
exports: [PayuTransactionListService]
|
||||
})
|
||||
export class PayuTransactionListModule { }
|
||||
@ -0,0 +1,8 @@
|
||||
import { Logger } from "@nestjs/common";
|
||||
import { EntityRepository, Repository } from "typeorm";
|
||||
import { PayuTransactionListEntity } from "./payu-transaction-list.entity";
|
||||
|
||||
@EntityRepository(PayuTransactionListEntity)
|
||||
export class PayuTransactionListRepository extends Repository<PayuTransactionListEntity>{
|
||||
private logger = new Logger ("SisPayuTransactionListRepository");
|
||||
}
|
||||
@ -0,0 +1,130 @@
|
||||
import { Body, HttpService, Injectable } from '@nestjs/common';
|
||||
import { Cron } from '@nestjs/schedule';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import * as config from 'config';
|
||||
// import { sha512 } from 'js-sha512';
|
||||
import { of } from 'rxjs';
|
||||
import { PayuTransactionListDto } from 'src/dto/payu-transaction-list.dto';
|
||||
import { PcdFormGridService } from 'src/framework/beans/pcd-form-grid.service';
|
||||
import { convertDateString } from 'src/pipe/pcd-date.pipe';
|
||||
import { FindManyOptions, In } from 'typeorm';
|
||||
import { PayuTransactionListRepository } from './payu-transaction-list.repository';
|
||||
import { sha512 } from 'js-sha512';
|
||||
|
||||
|
||||
@Injectable()
|
||||
export class PayuTransactionListService extends PcdFormGridService<PayuTransactionListDto>{
|
||||
constructor(
|
||||
@InjectRepository(PayuTransactionListRepository)
|
||||
private PayuTransactionListRepository: PayuTransactionListRepository,
|
||||
private readonly http: HttpService
|
||||
) {
|
||||
super(PayuTransactionListRepository);
|
||||
}
|
||||
@Cron('* 55 23 * * *')
|
||||
async handleCron() {
|
||||
let date = new Date();
|
||||
const DateString = convertDateString(date, "yyyy-MM-dd");
|
||||
|
||||
await this.getTransactionDetails({ var1: DateString, var2: DateString, isSave: true });
|
||||
|
||||
}
|
||||
async getTransactionDetails(body: any) {
|
||||
const command = "get_Transaction_Details"
|
||||
const key = config.get('payment-gateway').key
|
||||
const salt = config.get('payment-gateway').salt
|
||||
const var1 = body.var1
|
||||
const var2 = body.var2
|
||||
const sha = key + '|' + command + '|' + var1 + '|' + salt
|
||||
const hash = sha512(sha);
|
||||
const url = 'https://info.payu.in/merchant/postservice?form=2'
|
||||
|
||||
let postData = {
|
||||
"key": key,
|
||||
"salt": salt,
|
||||
"var1": var1,
|
||||
"var2": var2,
|
||||
"hash": hash,
|
||||
"command": command
|
||||
|
||||
}
|
||||
console.log(postData);
|
||||
|
||||
let Data = new URLSearchParams(postData).toString();
|
||||
const data: any = await this.http.post(url, Data).toPromise().then((res) => {
|
||||
console.log("===res====", res.data);
|
||||
return res.data;
|
||||
}, (err) => {
|
||||
console.log("===errr====", err);
|
||||
return err;
|
||||
});
|
||||
// console.log(data.Transaction_details);
|
||||
|
||||
if (body.isSave && data?.Transaction_details) {
|
||||
console.log('cron started');
|
||||
|
||||
for (let row of data.Transaction_details) {
|
||||
let existing = await this.PayuTransactionListRepository.findOne({ where: { id: row.id } })
|
||||
if (!existing) {
|
||||
row.gateway = 'PayU'
|
||||
await this.PayuTransactionListRepository.save(row);
|
||||
}else{
|
||||
row.gateway = 'PayU'
|
||||
await this.PayuTransactionListRepository.update( { id: row.id },row);
|
||||
}
|
||||
}
|
||||
this.PayuTransactionListRepository.query(`DELETE FROM
|
||||
sis_payu_transaction a
|
||||
USING sis_payu_transaction b
|
||||
WHERE
|
||||
a.id > b.id
|
||||
AND a.payu_id = b.payu_id`)
|
||||
console.log('completed');
|
||||
|
||||
}
|
||||
return data;
|
||||
|
||||
}
|
||||
//fromDate and toDate filter
|
||||
async dateFilter(filter: FindManyOptions) {
|
||||
console.log("dateFilter", filter)
|
||||
const date = await this.PayuTransactionListRepository.query(`select * from sis_payu_transaction spt where spt.addedon between '${filter.where['fromDate']}' and '${filter.where['toDate']}'`)
|
||||
return date;
|
||||
}
|
||||
|
||||
@Cron('0 */2 * * *')
|
||||
async checkPaymentStatus() {
|
||||
|
||||
const payments = await this.PayuTransactionListRepository.find({ where: { status: In(['initiated', 'in progress']) } })
|
||||
for (let row of payments) {
|
||||
const command = "verify_payment"
|
||||
const key = config.get('payment-gateway').key
|
||||
const salt = config.get('payment-gateway').salt
|
||||
const var1 = row.txnid;
|
||||
const sha = key + '|' + command + '|' + var1 + '|' + salt
|
||||
const hash = sha512(sha);
|
||||
const url = 'https://info.payu.in/merchant/postservice?form=2'
|
||||
|
||||
let postData = {
|
||||
"key": key,
|
||||
"salt": salt,
|
||||
"var1": var1,
|
||||
"hash": hash,
|
||||
"command": command
|
||||
|
||||
}
|
||||
let Data = new URLSearchParams(postData).toString();
|
||||
const data: any = await this.http.post(url, Data).toPromise().then(async (res) => {
|
||||
if (res.data.status = 1) {
|
||||
if (res.data.transaction_details[var1].status) {
|
||||
row.status = res.data.transaction_details[var1].status
|
||||
this.PayuTransactionListRepository.save(row)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue