import id.co.hanoman.mbplugin.codex.Codex; import id.co.hanoman.mbplugin.codex.CodexContext; import java.util.HashMap; import java.util.Map; import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class ResponseBuilder { public static Map createIsoResponse(Map receivedMessage, String code) { Map responseMessage = new HashMap<>(receivedMessage); String messageType = (String) receivedMessage.get("messageType"); // Handle network management messages dulu (0800/0810) if ("0800".equals(messageType) || "0810".equals(messageType)) { responseMessage.put("responseCode", "00"); // selalu accept responseMessage.put("messageType", messageType.equals("0800") ? "0810" : messageType); return responseMessage; } String kodePemda = (String) receivedMessage.get("kodePemda"); String processingCode = (String) receivedMessage.get("processingCode"); String reservedPrivate3 = (String) receivedMessage.get("reservedPrivate3"); String fromAccount = (String) receivedMessage.get("fromAccount"); String toAccount = (String) receivedMessage.get("toAccount"); if (messageType != null && messageType.matches("\\d{4}")) { try { int messageTypeNumber = Integer.parseInt(messageType); messageTypeNumber += 10; responseMessage.put("messageType", String.format("%04d", messageTypeNumber)); } catch (NumberFormatException e) { responseMessage.put("messageType", messageType); } } responseMessage.put("responseCode", "00"); String additionalDataPrivate = (String) receivedMessage.get("additionalDataPrivate"); switch (code) { // pln nontaglist payment case "0200.18.305111": responseMessage.put("additionalDataPrivate", "30511100000000212001703515404122025085706RAMBAT SUGIYONO 00000122310000000000450022001733982271055179 0000000001"); responseMessage.put("reservedPrivate2", "MIGRASI PRABAYAR 212001703515404DES25RAMBAT SUGIYONO 2120003540341.218.600 22001733982271055179 4.500 1.223.100 21200 "); responseMessage.put("reservedForPrivateUse2", "Informasi Hubungi Call Center 123 Atau Hub PLN Terdekat :"); break; // pln postpaid payment case "0200.18.301211": responseMessage.put("additionalDataPrivate", "3012110535851014157 04122025091631DENY FIRMANSYAH 00000018932100000000300022001745735141055392 1 1457351492"); responseMessage.put("reservedForPrivateUse1", "20251204091613000010550003392514"); responseMessage.put("reservedPrivate2", "535851014157DES25 DENY FIRMANSYAH 00025077-00025211R1M /000000900 0 18932122001745735141055392 3000 192321 0 53585 "); responseMessage.put("reservedForPrivateUse2", "Informasi Hubungi Call Center 123 Atau hubungi PLN Terdekat"); break; // pln prepaid payment case "0200.18.301422": responseMessage.put("reservedForPrivateUse2", "BANK BTN\nInformasi Hubungi Call Center 123 Atau hubungi PLN Terdekat\nDownload PLN Mobile"); responseMessage.put("reservedPrivate2", "32115720610 3.500JUNAIDI 0,00R1 /000002200 0,002BBT1742510913077976 18.182,00 0,00 203.500 181.818,00 125,920905033469869694456 1.444,14613112 "); responseMessage.put("additionalDataPrivate", "3014220000000001310111420930 10082025234420JUNAIDI 0000002000000000000035002BBT1742510913077976 131011142093 "); break; // pln manual advice case 1 case "0220.18.301422": responseMessage.put("reservedForPrivateUse2", "BANK BTN\nInformasi Hubungi Call Center 123 Atau hubungi PLN Terdekat\nDownload PLN Mobile"); responseMessage.put("reservedPrivate2", "32115720610 3.500JUNAIDI 0,00R1 /000002200 0,002BBT1742510913077976 18.182,00 0,00 203.500 181.818,00 125,920905033469869694456 1.444,14613112 "); responseMessage.put("additionalDataPrivate", "3014220"+additionalDataPrivate.substring(7,27)+"0 10082025234420JUNAIDI 0000002000000000000035002BBT1742510913077976 131011142093 "); responseMessage.put("messageType", "0230"); String s1 = additionalDataPrivate.substring(7, 27); String s2 = "00000000056223261220"; boolean stringsMatch = s1.equals(s2); if (!stringsMatch) { responseMessage.put("responseCode", "68"); } break; // pln manual advice case 2 case "0221.18.301422": responseMessage.put("reservedForPrivateUse2", "BANK BTN\nInformasi Hubungi Call Center 123 Atau hubungi PLN Terdekat\nDownload PLN Mobile"); responseMessage.put("reservedPrivate2", "32115720610 3.500JUNAIDI 0,00R1 /000002200 0,002BBT1742510913077976 18.182,00 0,00 203.500 181.818,00 125,920905033469869694456 1.444,14613112 "); if(additionalDataPrivate.substring(7,27).equals("00000000056223261222")) { try { // 1. Get the exact path of the running JAR file Path jarLocation = Paths.get(ResponseBuilder.class.getProtectionDomain().getCodeSource().getLocation().toURI()); // 2. Get the folder that contains the JAR Path jarDirectory = jarLocation.getParent(); // 3. Resolve (attach) "done.txt" to that specific folder Path filePath = jarDirectory.resolve("done.txt"); // --- The rest of your logic remains exactly the same --- if (Files.notExists(filePath)) { Files.createFile(filePath); responseMessage.put("responseCode", "68"); } else { Files.delete(filePath); } } catch (IOException | URISyntaxException e) { System.err.println("An error occurred: " + e.getMessage()); e.printStackTrace(); responseMessage.put("responseCode", "68"); } } else if(!additionalDataPrivate.substring(7,27).equals("00000000056223261221")) { responseMessage.put("responseCode", "68"); } responseMessage.put("additionalDataPrivate", "3014220"+additionalDataPrivate.substring(7,27)+"0 10082025234420JUNAIDI 0000002000000000000035002BBT1742510913077976 131011142093 "); responseMessage.put("messageType", "0230"); break; // pln nontaglist inquiry case "0200.38.305111": responseMessage.put("additionalDataPrivate", "30511100000000212001703515404122025085638RAMBAT SUGIYONO 000001223100000000004500 1339822779"); responseMessage.put("reservedPrivate2", "000000005622331DEC16PENYAMBUNGAN BARU NAMA PELANGGAN DUMMY 999999999999 138.000 5.000 143.000"); responseMessage.put("reservedForPrivateUse1", "52021014609012345678901234567890"); break; // pln postpaid inquiry case "0200.38.301211": responseMessage.put("reservedForPrivateUse1", "20230511205447204973203818072193"); responseMessage.put("additionalDataPrivate", "3012110535851014157 04122025091613DENY FIRMANSYAH 000000189321000000003000 1 1457351492"); responseMessage.put("reservedPrivate2", "562232628760 NAMA PELANGGAN DUMMY 1 DEC16 137000 2000 139000"); break; // pln prepaid inquiry case "0200.38.301422": responseMessage.put("additionalDataPrivate", "3014220000000000562232628760 10082025234421PT.GRAHA DUTA PUTRA JAYA 00000000000000000000350020250810234421000030770008977481545301379058 "); responseMessage.put("reservedPrivate2", "12233368101 PLGN LPB 12233368101 R3 /000002200 0000000000000000000000000000000000"); responseMessage.put("reservedForPrivateUse1", "20230118144146186738850085697412"); break; // pgn payment case "0200.18.212": responseMessage.put("receivingInstitutionIdentificationCode", "20000000001"); responseMessage.put("reservedPrivate1", "BTN4PRO100000000000"); // responseMessage.put("amountTransaction", "181000"); // responseMessage.put("processingCode", "1880113"); // responseMessage.put("transmissionDateTime", "0414092338"); // responseMessage.put("systemsTraceAuditNumber", "015713"); // responseMessage.put("timeLocalTransaction", "162338"); // responseMessage.put("dateLocalTransaction", "0414"); // responseMessage.put("dateSettlement", "0415"); // responseMessage.put("dateCapture", "0414"); // responseMessage.put("merchantType", "6014"); // responseMessage.put("acquiringInstitutionIdentificationCode", "000200"); // responseMessage.put("retrievalReferenceNumber", "ESB607509073"); // responseMessage.put("responseCode", "00"); // responseMessage.put("cardAcceptorIdentificationCode", "000000013000008"); // responseMessage.put("additionalDataPrivate", "210200040793 73053 000001880113"); // responseMessage.put("currencyCodeTransaction", "360"); // responseMessage.put("reservedPrivate3", "212"); // responseMessage.put("receivingInstitutionIdentificationCode", "20000000001"); break; case "0200.38.212": responseMessage.put("additionalDataPrivate", "210200040793 73053 0000018801130000000363MARTHENMINGGU RT20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010326 1"); break; case "0200.312000": if (fromAccount != null) { if (fromAccount.equals("19901510004062")) { responseMessage.put("responseCode", "53"); responseMessage.put("reasonCode", ""); } else { responseMessage.put("additionalDataPrivate", "20230608BTANIDJA5100000028020230608BTANIDJA510O020000028020230608BTANIDJA51000000280NASABAH R286263 01010103 SVGS20230613"); responseMessage.put("processingCode", "312010"); responseMessage.put("reasonCode", "U000"); } } if (toAccount != null) { if (toAccount.equals("19901510004062")) { responseMessage.put("responseCode", "53"); responseMessage.put("reasonCode", ""); } else { responseMessage.put("additionalDataPrivate", "20230608BTANIDJA5100000028020230608BTANIDJA510O020000028020230608BTANIDJA51000000280NASABAH R286263 01010103 SVGS20230613"); responseMessage.put("processingCode", "312010"); responseMessage.put("reasonCode", "U000"); } } break; case "0200.031000": break; case "0400.031000": responseMessage.put("additionalDataPrivate", " MASJID JAMI AL MUNAWWAROH GRAHN"); break; case "0200.010010": break; case "0400.010010": break; case "0200.041000": break; case "0400.041000": responseMessage.put("responseCode", "97"); responseMessage.put("additionalResponseData", "000195953600000271093600"); responseMessage.put("additionalDataPrivate", "HARIS NUGROHO SETIAWAN "); break; case "0200.38.090001": responseMessage.put("responseCode", "00"); responseMessage.put("reservedPrivate1", "0401000899880DEETJE MARENTEK 23042026-22052026000000276400"); break; case "0200.311000.001001BIF": break; case "0200.312000.001001BIF": // responseMessage.put("responseCode", "88"); responseMessage.put("additionalDataPrivate", "20240223FASTIDJA5104908809820240223BTANIDJA510O020003363720240223BTANIDJA51000033637ASIA KARYA MANDIRI CV 9120007592095 02 0291 CACC20240223"); break; case "0200.321000": // inq proxy bifast break; case "0200.322000": // inq proxy bifast responseMessage.put("additionalDataPrivate", "20211229FASTIDJA6100024111220211229BTANIDJA6108000817620211229BTANIDJAO80008176016285696212272 BTANIDJABMRIIDJA0000181345 THERESIA "); break; case "0200.471000": // Posting BiFast Credit Transfer break; case "0200.472000": // Posting BiFast Credit Transfer // responseMessage.put("responseCode", "99"); responseMessage.put("additionalDataPrivate", "20260409FASTIDJA0105640492220260409BTANIDJA0100007400420260409BTANIDJA010O020007400420260409FASTIDJA01056404711MIRA ERIANCE 20260409"); responseMessage.put("reasonCode", "U000"); break; case "0200.480000": // linking inq bin responseMessage.put("additionalDataPrivate", "BIN00001BIN00002BIN00003BIN00004BIN00005BIN00006BIN00007BIN00008BIN00009BIN00010BIN00011BIN00012BIN00013BIN00014BIN00015BIN00016BIN00017BIN00018BIN00019BIN00020BIN00021BIN00022BIN00023BIN00024BIN00025BIN00026BIN00027BIN00028BIN00029BIN00030BIN00031BIN00032BIN00033BIN00034BIN00035BIN00036BIN00037BIN00038BIN00039BIN00040BIN00041BIN00042BIN00043BIN00044BIN00045BIN00046BIN00047BIN00048BIN00049BIN00050BIN00051BIN00052BIN00053BIN00054BIN00055BIN00056BIN00057BIN00058BIN00059BIN00060BIN00061BIN00062BIN00063BIN00064BIN00065BIN00066BIN00067BIN00068BIN00069BIN00070BIN00071BIN00072BIN00073BIN00074BIN00075BIN00076BIN00077BIN00078BIN00079BIN00080BIN00081BIN00082BIN00083BIN00084BIN00085BIN00086BIN00087BIN00088BIN00089BIN00090BIN00091BIN00092BIN00093BIN00094BIN00095BIN00096BIN00097BIN00098BIN00099BIN00100"); break; case "0200.490000": responseMessage.put("additionalDataPrivate", "BIN00001BIN00002BIN00003BIN00004BIN00005BIN00006BIN00007BIN00008BIN00009BIN00010BIN00011BIN00012BIN00013BIN00014BIN00015BIN00016BIN00017BIN00018BIN00019BIN00020BIN00021BIN00022BIN00023BIN00024BIN00025BIN00026BIN00027BIN00028BIN00029BIN00030BIN00031BIN00032BIN00033BIN00034BIN00035BIN00036BIN00037BIN00038BIN00039BIN00040BIN00041BIN00042BIN00043BIN00044BIN00045BIN00046BIN00047BIN00048BIN00049BIN00050BIN00051BIN00052BIN00053BIN00054BIN00055BIN00056BIN00057BIN00058BIN00059BIN00060BIN00061BIN00062BIN00063BIN00064BIN00065BIN00066BIN00067BIN00068BIN00069BIN00070BIN00071BIN00072BIN00073BIN00074BIN00075BIN00076BIN00077BIN00078BIN00079BIN00080BIN00081BIN00082BIN00083BIN00084BIN00085BIN00086BIN00087BIN00088BIN00089BIN00090BIN00091BIN00092BIN00093BIN00094BIN00095BIN00096BIN00097BIN00098BIN00099BIN00100"); responseMessage.put("responseCode", "90"); break; case "0200.701000": break; case "0200.702000": responseMessage.put("additionalResponseData", "4000000990280000000309780"); responseMessage.put("issuerTraceId", "& 0000200372! Q500350 150119184140ATMDATM EDC ALTO SA Ex 000000023000000000000000150119183729ATMDATM Link Acq SA Ex 000000200000000000000000150119183758ATMDATM SA Withdrawal 000000350000000000000000160119161444ATMDATM SA Link Wdr 000000007500000000000000160119161444ATMDATM SA Link Wdr 000000100000000000000000"); break; // case "0800.000101": // key exchange // responseMessage.put("additionalDataPrivate", "11BA2E4B71D512AD62265BFA86D2243E"); // break; case "0200.38.1041": // inq fortuna pdam responseMessage.put("responseCode", "13"); responseMessage.put("amountTransaction", "11084800"); responseMessage.put("additionalDataPrivate", "0101005015 MISLAHUDDIN A JL. M. YAMIN - NN 02120230500000000000000000398560002500000000136-00000024220230600000000000000000209920002500000000160-00000013"); break; case "0200.10.1371": // inq PDAM PADANG responseMessage.put("amountTransaction", "11084800"); responseMessage.put("reservedPrivate3", "01122025000000226137"); responseMessage.put("additionalDataPrivate", "137115502025"); responseMessage.put("reservedPrivate2", "SUWANDI (MBR5-U) Komp. Griya Anak Air Permai Blok F No. 11 082017000000000000000000000000000000036500"); break; case "0200.20.1371": // pay PDAM PADANG responseMessage.put("amountTransaction", "11084800"); responseMessage.put("reservedPrivate2", "20035648YEASY DARMAYANTI. SE. MSI KOMP. CEMARA II BLOK EE.2/1 2CTNA12242317 1220250000000055350000000055610000000000102026-01-0514:45:45K300000000000000000000000000000011700000000000000000000000750000000002443700000013193713000008 K3-2555188"); responseMessage.put("additionalDataPrivate", "137120035648122025000000000000000000000000000000131937"); break; case "0200.471010"://bif responseMessage.put("responseCode", "30"); responseMessage.put("reasonCode", "0041"); break; case "0200.38.612": //inq spp 0019 responseMessage.put("additionalDataPrivate", "6101240635289125126A1B8F4SITI MAULIDINAH APRI;C3+TG+D 100001299975001012020"); break; case "0200.18.612": //payment spp 0019 responseMessage.put("additionalDataPrivate", "6101 25126A1B8F4000000000000"); break; case "0200.3": if (kodePemda != null) { if(kodePemda.equals("4005")) { // inq pemko 4005 responseMessage.put("reservedPrivate1", "3278007007021208302017"); responseMessage.put("reservedPrivate2", "3278007007021208302017ADI AHMAD SAEPULLOH KP BOJONG SALAM SUKAMAJU BARU TAPOS JAWA BARAT 00000000006000000000003620170831000000137050000000002741000000139791"); responseMessage.put("reservedPrivate3", "214"); } else if(kodePemda.equals("PAD")) { // inq pemko 4003 responseMessage.put("reservedPrivate1", "398092017"); responseMessage.put("reservedPrivate2", "2.000299.01.004 MISO SARI RASO MISO SARI RASO JL. DAMAR NO. 1 525000 "); responseMessage.put("reservedForIsoUse3", "C09+925"); } else if(kodePemda.equals("0196")) { // inq pemko 4008 responseMessage.put("amountTransaction", "203500"); responseMessage.put("reservedPrivate2", "3280710004016061602017AYI RIYADHI, M.SI, DRS MELONG ASRI REGENCY MELONG CIMAHI SELATAN JAWA BARAT 00000000011500000000008020170929000000203500000000000000000000203500"); } } else if(processingCode.equals("341019")) { // inq pemko 4014 responseMessage.put("reservedPrivate2", "3271040002004049402017AMIR BALFAS, IR JL CEMPAKA PUTIH TENGAH SINDANG BARANG BOGOR BARAT JAWA BARAT 00000000011800000000007220170929000000386688000000000000000000386688"); } break; case "0200.5": if (kodePemda != null) { if(kodePemda.equals("4005")) { // pay pemko 4005 responseMessage.put("additionalDataNational", "2211030250120002"); responseMessage.put("additionalDataPrivate", "81170919080023"); responseMessage.put("currencyCodeTransaction", "360"); responseMessage.put("transactionType", "PAY"); responseMessage.put("kodePemda", "4005"); responseMessage.put("reservedPrivate1", "3278007007021208302017"); responseMessage.put("reservedPrivate2", "3278007007021208302017ADI AHMAD SAEPULLOH 000000139791"); responseMessage.put("reservedPrivate3", "214"); } else if(kodePemda.equals("PAD")) { // pay pemko 4003 responseMessage.put("additionalDataPrivate", "0009257328"); } else if(kodePemda.equals("0196")) { // pay pemko 4008 responseMessage.put("additionalDataNational", "010197712992"); } } else if(reservedPrivate3 != null) { if(reservedPrivate3.equals("4000")) { // pay pemko 4013 responseMessage.put("additionalDataNational", "010143704282"); } } else if(processingCode.equals("541019")) { // pay pemko 4014 responseMessage.put("processingCode", processingCode); } break; case "0200.50.4000": // pemko pay 4013 responseMessage.put("additionalDataPrivate", "3175031003018407902017PT. TMJ/ DAFICKA PRAC 0000002991469117392102410198"); break; case "0200.402000": //bi-fast responseMessage.put("additionalDataPrivate", "20260224FASTIDJA5100131725420250920FASTIDJA5108047598520250920BTANIDJA510O020005093120250920BTANIDJA01050001076BXXXXXXXXXXXXXXXXXXX 01010300 20260224"); responseMessage.put("reasonCode", "U000"); break; case "0200.311000": responseMessage.put("additionalDataPrivate", "20251112FASTIDJA5108746434520251112BTANIDJA510O995000000820251112BTANIDJA51050000008BXXXXXXXXXXXXXXXXXXX 01010300 SVGS20251112"); responseMessage.put("processingCode", "311010"); responseMessage.put("reasonCode", "U000"); } return responseMessage; } public static byte[] encodeMessage(Map message, Codex codex) throws Exception { CodexContext cc = new CodexContext(); codex.encode(cc, message); return cc.toByteArray(); } }