const midtransCore = require('../../../core/midtrans.service'); const paymentLogger = require('../../../helpers/payment_logger.helper'); const db = require('../../../../models/migration'); class SnapService { async createTransaction(payload) { let { order_id, external_id, amount, customer_details, item_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 = { transaction_details: { order_id: midtransOrderId, gross_amount: amount }, customer_details: customer_details, item_details: item_details, usage_limit: 1, expiry: { duration: parseInt(process.env.MIDTRANS_EXPIRY_DURATION || 24), unit: process.env.MIDTRANS_EXPIRY_UNIT || 'hour' } }; try { const response = await midtransCore.getSnap().createTransaction(parameter); await paymentLogger.log(response, payload); return response; } catch (error) { throw new Error(`Midtrans Snap Error: ${error.message}`); } } } module.exports = new SnapService();