Compare commits

..

No commits in common. "8c9d0d658596761deefc15c0934fd5ab2733ffd1" and "403a75c8356b3936f9b52d6448d41bb95a4e042c" have entirely different histories.

12 changed files with 30 additions and 156 deletions

View File

@ -1,6 +1,5 @@
import { Injectable } from '@nestjs/common';
import { EventBus } from '@nestjs/cqrs';
import { mappingMidtransTransaction } from '../../domain/usecases/helpers/mapping-transaction.helper';
const midtransClient = require('midtrans-client');
@Injectable()
@ -20,7 +19,20 @@ export class MidtransService {
}
async create(body): Promise<any> {
const data = mappingMidtransTransaction(body);
return await this.midtransInstance.createTransaction(data);
return await this.midtransInstance.createTransaction({
transaction_details: {
order_id: '123',
gross_amount: 10000,
},
credit_card: {
secure: true,
},
customer_details: {
first_name: 'budd',
last_name: 'pratama',
email: 'budi.pra@mail.com',
phone: '0822111111',
},
});
}
}

View File

@ -1,31 +0,0 @@
export function mappingMidtransTransaction(transaction) {
const item_details = transaction.items?.map((item) => {
return {
quantity: Number(item.qty),
price: Number(item.total_price),
name: item.item_name,
category: item.item_category_name,
};
});
if (transaction.payment_discount_total) {
item_details.push({
quantity: 1,
price: -Number(transaction.payment_discount_total),
name: 'discount',
});
}
return {
transaction_details: {
order_id: transaction.id,
gross_amount: Number(transaction.payment_total),
},
item_details: item_details,
customer_details: {
first_name: transaction.customer_name,
email: transaction.customer_email,
phone: transaction.customer_phone,
},
};
}

View File

@ -2,16 +2,19 @@ import { ConfigModule } from '@nestjs/config';
import { CqrsModule } from '@nestjs/cqrs';
import { MidtransController } from './infrastructure/midtrans.controller';
import { MidtransService } from './data/services/midtrans.service';
import { Global, Module } from '@nestjs/common';
import { Module } from '@nestjs/common';
@Global()
@Module({
imports: [
ConfigModule.forRoot(),
// TypeOrmModule.forFeature(
// [
// ],
// CONNECTION_NAME.DEFAULT,
// ),
CqrsModule,
],
controllers: [MidtransController],
providers: [MidtransService],
exports: [MidtransService],
})
export class MidtransModule {}

View File

@ -125,12 +125,6 @@ export class TransactionModel
@Column('varchar', { name: 'payment_code_reference', nullable: true })
payment_code_reference: string;
@Column('varchar', { name: 'payment_midtrans_token', nullable: true })
payment_midtrans_token: string;
@Column('varchar', { name: 'payment_midtrans_url', nullable: true })
payment_midtrans_url: string;
@Column('date', { name: 'payment_date', nullable: true })
payment_date: Date;

View File

@ -47,8 +47,6 @@ export interface TransactionEntity extends BaseStatusEntity {
payment_type_method_qr: string;
payment_card_information: string;
payment_code_reference: string;
payment_midtrans_token: string;
payment_midtrans_url: string;
payment_date: Date;
// calculation data

View File

@ -1,44 +0,0 @@
import { EventsHandler, IEventHandler } from '@nestjs/cqrs';
import { MidtransCallbackEvent } from 'src/modules/configuration/midtrans/domain/entities/midtrans-callback.event';
import { TransactionDataService } from '../../../data/services/transaction-data.service';
import { TransactionModel } from '../../../data/models/transaction.model';
import { STATUS } from 'src/core/strings/constants/base.constants';
@EventsHandler(MidtransCallbackEvent)
export class MidtransCallbackHandler
implements IEventHandler<MidtransCallbackEvent>
{
constructor(private dataService: TransactionDataService) {}
async handle(event: MidtransCallbackEvent) {
const data_id = event.data.id;
const data = event.data.data;
const transaction = await this.dataService.getOneByOptions({
where: {
id: data_id,
},
});
if (['capture', 'settlement'].includes(data.transaction_status)) {
Object.assign(transaction, {
status: STATUS.SETTLED,
settlement_date: new Date(data.settlement_time),
payment_code_reference: data.approval_code,
});
} else if (['pending'].includes(data['transaction_status'])) {
Object.assign(transaction, {
status: STATUS.PENDING,
});
} else {
Object.assign(transaction, {
status: STATUS.EXPIRED,
});
}
const queryRunner = this.dataService
.getRepository()
.manager.connection.createQueryRunner();
await this.dataService.create(queryRunner, TransactionModel, transaction);
}
}

View File

@ -30,12 +30,10 @@ export class BatchConfirmDataTransactionManager extends BaseBatchUpdateStatusMan
Object.assign(data, {
status: STATUS.WAITING,
reconciliation_status: [
TransactionPaymentType.COUNTER,
TransactionPaymentType.MIDTRANS,
].includes(data.payment_type)
? null
: STATUS.PENDING,
reconciliation_status:
data.payment_type == TransactionPaymentType.COUNTER
? null
: STATUS.PENDING,
});
return;

View File

@ -13,13 +13,9 @@ import {
UnprocessableEntityException,
} from '@nestjs/common';
import { STATUS } from 'src/core/strings/constants/base.constants';
import { generateInvoiceCodeHelper } from './helpers/generate-invoice-code.helper';
import { TransactionPaymentType } from '../../../constants';
@Injectable()
export class BatchConfirmTransactionManager extends BaseBatchUpdateStatusManager<TransactionEntity> {
protected relations = ['items'];
async validateData(data: TransactionEntity): Promise<void> {
if (data.status != STATUS.DRAFT) {
throw new UnprocessableEntityException({
@ -30,26 +26,7 @@ export class BatchConfirmTransactionManager extends BaseBatchUpdateStatusManager
}
const freeTransaction = data.payment_total < 1;
if (data.payment_type == TransactionPaymentType.MIDTRANS) {
try {
const { token, redirect_url } = await this.dataServiceFirstOpt.create(
data,
);
Object.assign(data, {
payment_midtrans_token: token,
payment_midtrans_url: redirect_url,
});
} catch (error) {
throw new UnprocessableEntityException({
statusCode: HttpStatus.UNPROCESSABLE_ENTITY,
message: `Failed! this transaction already created, please check your email to continue payment`,
error: 'Unprocessable Entity',
});
}
}
Object.assign(data, {
invoice_code: await generateInvoiceCodeHelper(this.dataService),
status: freeTransaction ? STATUS.ACTIVE : STATUS.PENDING,
});
return;

View File

@ -39,12 +39,10 @@ export class ConfirmDataTransactionManager extends BaseUpdateStatusManager<Trans
Object.assign(this.data, {
status: STATUS.WAITING,
reconciliation_status: [
TransactionPaymentType.COUNTER,
TransactionPaymentType.MIDTRANS,
].includes(this.oldData.payment_type)
? null
: STATUS.PENDING,
reconciliation_status:
this.oldData.payment_type == TransactionPaymentType.COUNTER
? null
: STATUS.PENDING,
});
return;
}

View File

@ -13,12 +13,9 @@ import { TransactionModel } from '../../../data/models/transaction.model';
import { TransactionChangeStatusEvent } from '../../entities/event/transaction-change-status.event';
import { STATUS } from 'src/core/strings/constants/base.constants';
import { generateInvoiceCodeHelper } from './helpers/generate-invoice-code.helper';
import { TransactionPaymentType } from '../../../constants';
@Injectable()
export class ConfirmTransactionManager extends BaseUpdateStatusManager<TransactionEntity> {
protected relations = ['items'];
getResult(): string {
return `Success active data ${this.result.invoice_code}`;
}
@ -36,25 +33,6 @@ export class ConfirmTransactionManager extends BaseUpdateStatusManager<Transacti
async beforeProcess(): Promise<void> {
const freeTransaction = this.data.payment_total < 1;
if (this.data.payment_type == TransactionPaymentType.MIDTRANS) {
try {
const { token, redirect_url } = await this.dataServiceFirstOpt.create(
this.oldData,
);
Object.assign(this.data, {
payment_midtrans_token: token,
payment_midtrans_url: redirect_url,
});
} catch (error) {
throw new UnprocessableEntityException({
statusCode: HttpStatus.UNPROCESSABLE_ENTITY,
message: `Failed! this transaction already created, please check your email to continue payment`,
error: 'Unprocessable Entity',
});
}
}
Object.assign(this.data, {
invoice_code: await generateInvoiceCodeHelper(this.dataService),
status: freeTransaction ? STATUS.ACTIVE : STATUS.PENDING,

View File

@ -14,7 +14,6 @@ import { CancelTransactionManager } from './managers/cancel-transaction.manager'
import { BatchCancelTransactionManager } from './managers/batch-cancel-transaction.manager';
import { ConfirmDataTransactionManager } from './managers/confirm-data-transaction.manager';
import { BatchConfirmDataTransactionManager } from './managers/batch-confirm-data-transaction.manager';
import { MidtransService } from 'src/modules/configuration/midtrans/data/services/midtrans.service';
@Injectable()
export class TransactionDataOrchestrator {
@ -30,7 +29,6 @@ export class TransactionDataOrchestrator {
private cancelManager: CancelTransactionManager,
private batchCancelManager: BatchCancelTransactionManager,
private serviceData: TransactionDataService,
private midtransService: MidtransService,
) {}
async create(data): Promise<TransactionEntity> {
@ -83,11 +81,7 @@ export class TransactionDataOrchestrator {
async confirm(dataId): Promise<string> {
this.confirmManager.setData(dataId, STATUS.ACTIVE);
this.confirmManager.setService(
this.serviceData,
TABLE_NAME.TRANSACTION,
this.midtransService,
);
this.confirmManager.setService(this.serviceData, TABLE_NAME.TRANSACTION);
await this.confirmManager.execute();
return this.confirmManager.getResult();
}
@ -97,7 +91,6 @@ export class TransactionDataOrchestrator {
this.batchConfirmManager.setService(
this.serviceData,
TABLE_NAME.TRANSACTION,
this.midtransService,
);
await this.batchConfirmManager.execute();
return this.batchConfirmManager.getResult();

View File

@ -31,7 +31,6 @@ import { SalesPriceFormulaModel } from '../sales-price-formula/data/models/sales
import { TaxModel } from '../tax/data/models/tax.model';
import { SettledTransactionHandler } from './domain/usecases/handlers/settled-transaction.handler';
import { RefundUpdatedHandler } from './domain/usecases/handlers/refund-update.handler';
import { MidtransCallbackHandler } from './domain/usecases/handlers/midtrans-transaction-callback.handler';
@Module({
imports: [
@ -52,7 +51,6 @@ import { MidtransCallbackHandler } from './domain/usecases/handlers/midtrans-tra
providers: [
RefundUpdatedHandler,
PosTransactionHandler,
MidtransCallbackHandler,
SettledTransactionHandler,
IndexTransactionManager,