From 6a0eba853d0b651ad47e5e704c6da8c1320633d9 Mon Sep 17 00:00:00 2001
From: Adhidarma Hadiwinoto <me@adhisimon.org>
Date: Sat, 19 Sep 2020 19:30:03 +0700
Subject: [PATCH] getDetailFromMessage support replace rules

---
 index.js          |  10 +++--
 package-lock.json | 122 +++++++++++-------------------------------------------
 package.json      |   3 +-
 test/main.js      |  32 ++++++++++++++
 4 files changed, 64 insertions(+), 103 deletions(-)

diff --git a/index.js b/index.js
index b36710b..94e0fd9 100644
--- a/index.js
+++ b/index.js
@@ -1,5 +1,6 @@
 "use strict";
 
+const regexLooperReplace = require('tektrans-lib/regex-looper/replace');
 const rcFromMsg = require('komodo-sdk/rc-from-msg');
 const organicRc = require('./rc');
 
@@ -111,16 +112,17 @@ function getBalanceFromMessage(msg, rule) {
     return Number(result.replace(/\./g, ''));
 }
 
-function getDetailFromMessage(msg, rule) {
+function getDetailFromMessage(msg, rule, replacementRules) {
     if (!rule) {
         rule = {
             pattern: " Detail:\\s*(.+?)\\s+Sisa [Ss]aldo",
             match_idx: 1,
         }
     }
-
-    let result = extractFromMessage(msg, rule);
-    return (result || '').trim();
+    
+    return (
+        regexLooperReplace(extractFromMessage(msg, rule), replacementRules) || ''
+    ).trim() || null;
 }
 
 function splitPostpaidDetail(str) {
diff --git a/package-lock.json b/package-lock.json
index bf7607f..468fcab 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -138,7 +138,8 @@
     "arr-union": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+      "optional": true
     },
     "array-flatten": {
       "version": "1.1.1",
@@ -369,23 +370,6 @@
       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
       "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
     },
-    "bytewise": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz",
-      "integrity": "sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4=",
-      "requires": {
-        "bytewise-core": "^1.2.2",
-        "typewise": "^1.0.3"
-      }
-    },
-    "bytewise-core": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz",
-      "integrity": "sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI=",
-      "requires": {
-        "typewise-core": "^1.2"
-      }
-    },
     "cache-base": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
@@ -1839,7 +1823,8 @@
     "get-value": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
-      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+      "optional": true
     },
     "getpass": {
       "version": "0.1.7",
@@ -2093,7 +2078,8 @@
     "is-buffer": {
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+      "optional": true
     },
     "is-data-descriptor": {
       "version": "0.1.4",
@@ -2137,7 +2123,8 @@
     "is-extendable": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+      "optional": true
     },
     "is-extglob": {
       "version": "2.1.1",
@@ -2184,6 +2171,7 @@
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
       "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "optional": true,
       "requires": {
         "isobject": "^3.0.1"
       }
@@ -2220,7 +2208,8 @@
     "isobject": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+      "optional": true
     },
     "isstream": {
       "version": "0.1.2",
@@ -2299,30 +2288,29 @@
         "basic-auth": "^2.0.0",
         "body-parser": "^1.18.2",
         "dot-object": "^1.7.0",
-        "express": "^4.16.3",
+        "express": "^4.17.1",
         "express-session": "^1.15.6",
         "fs-copy-file": "^2.1.2",
         "json-query": "^2.2.2",
         "lru-cache": "^4.1.1",
-        "macaddress": "^0.2.8",
-        "moment": "^2.19.1",
+        "macaddress": "^0.2.9",
+        "moment": "^2.24.0",
         "node-machine-id": "^1.1.10",
         "node-natural-sort": "^0.8.6",
         "numeral": "^2.0.6",
-        "nunjucks": "^3.0.1",
+        "nunjucks": "^3.2.1",
         "pkginfo": "^0.4.1",
         "redis": "^2.8.0",
-        "request": "^2.81.0",
+        "request": "^2.88.0",
         "sha1": "^1.1.1",
         "simple-git": "^1.80.1",
-        "sort-object": "^3.0.2",
         "strftime": "^0.10.0",
         "string-natural-compare": "^2.0.2",
         "uniqid": "^4.1.1",
         "uuid": "^3.1.0",
-        "winston": "^2.3.1",
+        "winston": "^3.3.3",
         "winston-circular-buffer": "^1.0.0",
-        "winston-daily-rotate-file": "^1.4.6"
+        "winston-daily-rotate-file": "^3.10.0"
       }
     },
     "lcid": {
@@ -3324,61 +3312,6 @@
         }
       }
     },
-    "sort-asc": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.2.0.tgz",
-      "integrity": "sha1-AKSelHvCXVEL/eLLuN/9qfUOsvw="
-    },
-    "sort-desc": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.2.0.tgz",
-      "integrity": "sha1-KAwb2vxld4h87brR7S5BwDeXZkY="
-    },
-    "sort-object": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-3.0.2.tgz",
-      "integrity": "sha1-2vK2k/YR990qIbgrgF5OrCMPdV4=",
-      "requires": {
-        "bytewise": "^1.1.0",
-        "get-value": "^2.0.2",
-        "is-extendable": "^0.1.1",
-        "sort-asc": "^0.2.0",
-        "sort-desc": "^0.2.0",
-        "union-value": "^0.2.3"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "set-value": {
-          "version": "0.4.3",
-          "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
-          "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
-          "requires": {
-            "extend-shallow": "^2.0.1",
-            "is-extendable": "^0.1.1",
-            "is-plain-object": "^2.0.1",
-            "to-object-path": "^0.3.0"
-          }
-        },
-        "union-value": {
-          "version": "0.2.4",
-          "resolved": "https://registry.npmjs.org/union-value/-/union-value-0.2.4.tgz",
-          "integrity": "sha1-c3UVJ4ZnkFfns3qmdug0aPwCdPA=",
-          "requires": {
-            "arr-union": "^3.1.0",
-            "get-value": "^2.0.6",
-            "is-extendable": "^0.1.1",
-            "set-value": "^0.4.3"
-          }
-        }
-      }
-    },
     "source-map": {
       "version": "0.5.7",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
@@ -3559,6 +3492,10 @@
         }
       }
     },
+    "tektrans-lib": {
+      "version": "git+https://github.com/tektrans/tektrans-lib.git#fa043c81e72e10ee1232e1273fd1297c3d50a88d",
+      "from": "git+https://github.com/tektrans/tektrans-lib.git"
+    },
     "text-table": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -3584,6 +3521,7 @@
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
       "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "optional": true,
       "requires": {
         "kind-of": "^3.0.2"
       },
@@ -3592,6 +3530,7 @@
           "version": "3.2.2",
           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
           "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "optional": true,
           "requires": {
             "is-buffer": "^1.1.5"
           }
@@ -3678,19 +3617,6 @@
         "mime-types": "~2.1.24"
       }
     },
-    "typewise": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz",
-      "integrity": "sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE=",
-      "requires": {
-        "typewise-core": "^1.2.0"
-      }
-    },
-    "typewise-core": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz",
-      "integrity": "sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU="
-    },
     "uid-safe": {
       "version": "2.1.5",
       "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
diff --git a/package.json b/package.json
index 974a2b8..c677f37 100644
--- a/package.json
+++ b/package.json
@@ -24,6 +24,7 @@
     "should": "^13.2.3"
   },
   "dependencies": {
-    "komodo-sdk": "git+http://gitlab.kodesumber.com/komodo/komodo-sdk.git"
+    "komodo-sdk": "git+http://gitlab.kodesumber.com/komodo/komodo-sdk.git",
+    "tektrans-lib": "git+https://github.com/tektrans/tektrans-lib.git"
   }
 }
diff --git a/test/main.js b/test/main.js
index da43dff..e7927bb 100644
--- a/test/main.js
+++ b/test/main.js
@@ -105,6 +105,38 @@ describe('#irs', function() {
             irs.getDetailFromMessage('REFF#561744 CEK TAGIHAN PLN25 SUKSES IDPEL:172000147469 Detail: NAMA:MASJID-NURUL-IMAN/DAYA:900/TARIF:S2/JMLBLN:1BLN/PERIODE:201912/METERKINI:19627/METERLALU:19428/TAGIHAN:79340/ADM:2500/DENDA:0/TOTALTAGIHAN:81840  Sisa Saldo: 1.000.000 - 0 = 1.000.000 @2019/12/20 19:41:21')
                 .should.equal('NAMA:MASJID-NURUL-IMAN/DAYA:900/TARIF:S2/JMLBLN:1BLN/PERIODE:201912/METERKINI:19627/METERLALU:19428/TAGIHAN:79340/ADM:2500/DENDA:0/TOTALTAGIHAN:81840');
         });
+
+        it('should return correct result with custom pattern', () => {
+            irs.getDetailFromMessage(
+                'Cek Tagihan PLN SUKSES ke 520550410074, REFID: 520550410074/MASJID.. KATEGORI:S2/900 , PERIODE:092020, JUMLAH:1, TOTAL TAGIHAN : 72.010',
+                {
+                    pattern: '(REFID: .*)$',
+                    match_idx: 1,
+                },
+                [
+                    {
+                        pattern: ' *\\.\\.+ *',
+                        replacement: '/',
+                        flags: 'g',
+                    },
+                    {
+                        pattern: ' *, *',
+                        replacement: '/',
+                        flags: 'g',
+                    },
+                    {
+                        pattern: ' *: *',
+                        replacement: ':',
+                        flags: 'g',
+                    },
+                    {
+                        pattern: 'TOTAL TAGIHAN*',
+                        replacement: 'TOTALTAGIHAN',
+                    },
+                ]
+            )
+                .should.equal('REFID:520550410074/MASJID/KATEGORI:S2/900/PERIODE:092020/JUMLAH:1/TOTALTAGIHAN:72.010', 'TAJIRA PLN POSTPAID');
+        });
     });
 
     describe('#splitPostpaidDetail', () => {
-- 
1.9.0