const midtransCore = require('../../../core/midtrans.service'); const paymentLogger = require('../../../helpers/payment_logger.helper'); const db = require('../../../../models/migration'); class EWalletService { async createTransaction(payload, type) { let { order_id, external_id, amount, customer_details } = payload; if (!amount) { let order = null; if (order_id) order = await db.Order.findByPk(order_id); if (!order && external_id) order = await db.Order.findOne({ where: { orderID: external_id } }); if (!order) throw new Error("Amount wajib diisi atau order_id/external_id tidak valid"); amount = order.total; payload.amount = amount; } const projectId = process.env.PROJECT_ID; const midtransOrderId = projectId ? `${external_id}-${projectId}` : external_id; const parameter = { payment_type: type, transaction_details: { order_id: midtransOrderId, gross_amount: amount }, customer_details: customer_details, custom_expiry: { expiry_duration: parseInt(process.env.MIDTRANS_EXPIRY_DURATION || 24), unit: process.env.MIDTRANS_EXPIRY_UNIT || 'hour' } }; if (type === 'gopay') { parameter.gopay = { enable_callback: true, callback_url: "https://your-app.com/" }; } if (type === 'shopeepay') { parameter.shopeepay = { callback_url: "https://your-app.com/" }; } try { const response = await midtransCore.getCoreApi().charge(parameter); await paymentLogger.log(response, payload); return response; } catch (error) { throw new Error(`Midtrans Error (${type}): ${error.message}`); } } } module.exports = new EWalletService();