Commit d7a34173c47ce8edec9bae340d854e9990865c0a
1 parent
418ac78505
Exists in
master
langsung gagal jika dapat reverse report gagal
Showing 1 changed file with 13 additions and 1 deletions Inline Diff
partner-sc.js
1 | var fs = require('fs'); | 1 | var fs = require('fs'); |
2 | var https = require('https'); | 2 | var https = require('https'); |
3 | var http = require('http'); | 3 | var http = require('http'); |
4 | var url = require('url'); | 4 | var url = require('url'); |
5 | var request = require('request'); | 5 | var request = require('request'); |
6 | var xml2js = require('xml2js').parseString; | 6 | var xml2js = require('xml2js').parseString; |
7 | var strftime = require('strftime'); | 7 | var strftime = require('strftime'); |
8 | var math = require('mathjs'); | 8 | var math = require('mathjs'); |
9 | var winston = require('winston'); | 9 | var winston = require('winston'); |
10 | var cekstatus = require('./cekstatus.js'); | 10 | var cekstatus = require('./cekstatus.js'); |
11 | var mongoClient = require('mongodb').MongoClient; | 11 | var mongoClient = require('mongodb').MongoClient; |
12 | var LRU = require('lru-cache'); | 12 | var LRU = require('lru-cache'); |
13 | 13 | ||
14 | var config; | 14 | var config; |
15 | var httpServer; | 15 | var httpServer; |
16 | var aaa; | 16 | var aaa; |
17 | var logger; | 17 | var logger; |
18 | var callbackReport; | 18 | var callbackReport; |
19 | var mongodb; | 19 | var mongodb; |
20 | 20 | ||
21 | var tasks = LRU(10000); | 21 | var tasks = LRU(10000); |
22 | 22 | ||
23 | process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; | 23 | process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; |
24 | 24 | ||
25 | var sleep_before_retry = 30000; | 25 | var sleep_before_retry = 30000; |
26 | var pendingResultCode = ['0005', '0012', '0068', '0090', '0063', '0018', '0096']; | ||
26 | 27 | ||
27 | var logTag = __filename.split('/').reverse()[0]; | 28 | var logTag = __filename.split('/').reverse()[0]; |
28 | 29 | ||
29 | function initMongoClient() { | 30 | function initMongoClient() { |
30 | if (!config.mongodbstruk || !config.mongodbstruk.url) { | 31 | if (!config.mongodbstruk || !config.mongodbstruk.url) { |
31 | return; | 32 | return; |
32 | } | 33 | } |
33 | 34 | ||
34 | try { | 35 | try { |
35 | var url = config.mongodbstruk.url; | 36 | var url = config.mongodbstruk.url; |
36 | 37 | ||
37 | mongoClient.connect(url, function(err, db) { | 38 | mongoClient.connect(url, function(err, db) { |
38 | if (err) { | 39 | if (err) { |
39 | logger.warn('Failed to connect to mongodb', {err: err}); | 40 | logger.warn('Failed to connect to mongodb', {err: err}); |
40 | return; | 41 | return; |
41 | } | 42 | } |
42 | mongodb = db; | 43 | mongodb = db; |
43 | logger.info('MongoDB connected'); | 44 | logger.info('MongoDB connected'); |
44 | }); | 45 | }); |
45 | } | 46 | } |
46 | catch(err) { | 47 | catch(err) { |
47 | logger.warn('Exception when connecting to mongodb', {err: err, url: url}); | 48 | logger.warn('Exception when connecting to mongodb', {err: err, url: url}); |
48 | } | 49 | } |
49 | 50 | ||
50 | } | 51 | } |
51 | 52 | ||
52 | function prepareResultData(result) { | 53 | function prepareResultData(result) { |
53 | var task; | 54 | var task; |
54 | 55 | ||
55 | var data = {}; | 56 | var data = {}; |
56 | data.gateway = config.globals.gateway_name; | 57 | data.gateway = config.globals.gateway_name; |
57 | 58 | ||
58 | try { | 59 | try { |
59 | data.requestId = result.reffid[0].trim(); | 60 | data.requestId = result.reffid[0].trim(); |
60 | 61 | ||
61 | var key = config.globals.gateway_name + '.rid:' + data.requestId; | 62 | var key = config.globals.gateway_name + '.rid:' + data.requestId; |
62 | task = tasks.get(key); | 63 | task = tasks.get(key); |
63 | } | 64 | } |
64 | catch(err) { data.requestId = null; } | 65 | catch(err) { data.requestId = null; } |
65 | 66 | ||
66 | try { | 67 | try { |
67 | data.status = result.ResultCode[0].trim(); | 68 | data.status = result.ResultCode[0].trim(); |
68 | } | 69 | } |
69 | catch(err) { data.status = '68' } | 70 | catch(err) { data.status = '68' } |
70 | 71 | ||
71 | try { | 72 | try { |
72 | data.rcmessage = result.ErrorMsg[0].trim(); | 73 | data.rcmessage = result.ErrorMsg[0].trim(); |
73 | } | 74 | } |
74 | catch(err) { data.rcmessage = ''; } | 75 | catch(err) { data.rcmessage = ''; } |
75 | 76 | ||
76 | try { | 77 | try { |
77 | data.resptext = ''; | 78 | data.resptext = ''; |
78 | } | 79 | } |
79 | catch(err) { data.resptext = ''; } | 80 | catch(err) { data.resptext = ''; } |
80 | 81 | ||
81 | try { | 82 | try { |
82 | var ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss') | 83 | var ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss') |
83 | data.dt = ts; | 84 | data.dt = ts; |
84 | } | 85 | } |
85 | catch(err) { | 86 | catch(err) { |
86 | logger.warn('Exception when getting timestamp data, using current timestamp', {err: err, result: result, task: task}); | 87 | logger.warn('Exception when getting timestamp data, using current timestamp', {err: err, result: result, task: task}); |
87 | data.dt = strftime('%Y-%m-%d %H:%M:%S', new Date()); | 88 | data.dt = strftime('%Y-%m-%d %H:%M:%S', new Date()); |
88 | } | 89 | } |
89 | 90 | ||
90 | try { | 91 | try { |
91 | data.namapel = result.nama_pel[0].trim(); | 92 | data.namapel = result.nama_pel[0].trim(); |
92 | } | 93 | } |
93 | catch(err) { data.namapel = 'UNKNOWN'; } | 94 | catch(err) { data.namapel = 'UNKNOWN'; } |
94 | 95 | ||
95 | try { | 96 | try { |
96 | data.msn = result.nsm[0].trim(); | 97 | data.msn = result.nsm[0].trim(); |
97 | } | 98 | } |
98 | catch(err) { data.msn = 'UNKNOWN'; } | 99 | catch(err) { data.msn = 'UNKNOWN'; } |
99 | 100 | ||
100 | try { | 101 | try { |
101 | data.idpel = result.idpel[0].trim(); | 102 | data.idpel = result.idpel[0].trim(); |
102 | } | 103 | } |
103 | catch(err) { data.idpel = 'UNKNOWN'; } | 104 | catch(err) { data.idpel = 'UNKNOWN'; } |
104 | 105 | ||
105 | try { | 106 | try { |
106 | data.tarifdaya = result.tarif[0].trim(); | 107 | data.tarifdaya = result.tarif[0].trim(); |
107 | } | 108 | } |
108 | catch(err) { data.tarifdaya = 'UNKNOWN'; } | 109 | catch(err) { data.tarifdaya = 'UNKNOWN'; } |
109 | 110 | ||
110 | try { | 111 | try { |
111 | data.admin = parseInt(result.adminfee[0].trim()); | 112 | data.admin = parseInt(result.adminfee[0].trim()); |
112 | } | 113 | } |
113 | catch(err) { data.admin = 0; } | 114 | catch(err) { data.admin = 0; } |
114 | 115 | ||
115 | try { | 116 | try { |
116 | data.adm = parseInt(result.admin_fee[0].trim()); | 117 | data.adm = parseInt(result.admin_fee[0].trim()); |
117 | } | 118 | } |
118 | catch(err) { data.adm = 0; } | 119 | catch(err) { data.adm = 0; } |
119 | 120 | ||
120 | try { | 121 | try { |
121 | data.hargapelanggan = parseInt(result.amount_trx[0].trim()); | 122 | data.hargapelanggan = parseInt(result.amount_trx[0].trim()); |
122 | } | 123 | } |
123 | catch(err) { data.hargapelanggan = 0; } | 124 | catch(err) { data.hargapelanggan = 0; } |
124 | 125 | ||
125 | try { | 126 | try { |
126 | data.jumlahkwh = result.jml_daya[0].trim(); | 127 | data.jumlahkwh = result.jml_daya[0].trim(); |
127 | } | 128 | } |
128 | catch(err) { data.jumlahkwh = 0; } | 129 | catch(err) { data.jumlahkwh = 0; } |
129 | 130 | ||
130 | try { | 131 | try { |
131 | data.token = result.token[0].trim(); | 132 | data.token = result.token[0].trim(); |
132 | } | 133 | } |
133 | catch(err) { data.token = 0; } | 134 | catch(err) { data.token = 0; } |
134 | 135 | ||
135 | try { | 136 | try { |
136 | data.ppn = result.ppn_fee[0].trim(); | 137 | data.ppn = result.ppn_fee[0].trim(); |
137 | } | 138 | } |
138 | catch(err) { data.ppn_fee = 0; } | 139 | catch(err) { data.ppn_fee = 0; } |
139 | 140 | ||
140 | try { | 141 | try { |
141 | data.ppj = result.ppj_fee[0].trim(); | 142 | data.ppj = result.ppj_fee[0].trim(); |
142 | } | 143 | } |
143 | catch(err) { data.ppj = 0; } | 144 | catch(err) { data.ppj = 0; } |
144 | 145 | ||
145 | try { | 146 | try { |
146 | data.angsuran = result.angsuran_fee[0].trim(); | 147 | data.angsuran = result.angsuran_fee[0].trim(); |
147 | } | 148 | } |
148 | catch(err) { data.angsuran = 0; } | 149 | catch(err) { data.angsuran = 0; } |
149 | 150 | ||
150 | try { | 151 | try { |
151 | data.meterai = result.materai_fee[0].trim(); | 152 | data.meterai = result.materai_fee[0].trim(); |
152 | } | 153 | } |
153 | catch(err) { data.materai_fee = 0; } | 154 | catch(err) { data.materai_fee = 0; } |
154 | 155 | ||
155 | return data; | 156 | return data; |
156 | } | 157 | } |
157 | 158 | ||
158 | function saveTokenToMongoDb(result) { | 159 | function saveTokenToMongoDb(result) { |
159 | if (!mongodb) { | 160 | if (!mongodb) { |
160 | return; | 161 | return; |
161 | } | 162 | } |
162 | 163 | ||
163 | if (!config.mongodbstruk) { | 164 | if (!config.mongodbstruk) { |
164 | return; | 165 | return; |
165 | } | 166 | } |
166 | 167 | ||
167 | if (!config.mongodbstruk.collection) { | 168 | if (!config.mongodbstruk.collection) { |
168 | return; | 169 | return; |
169 | } | 170 | } |
170 | 171 | ||
171 | data = prepareResultData(result); | 172 | data = prepareResultData(result); |
172 | 173 | ||
173 | try { | 174 | try { |
174 | mongodb.collection(config.mongodbstruk.collection).insertOne(data); | 175 | mongodb.collection(config.mongodbstruk.collection).insertOne(data); |
175 | } | 176 | } |
176 | catch(err) { | 177 | catch(err) { |
177 | logger.warn('Error when inserting data to mongodb', {err: err, data: data}); | 178 | logger.warn('Error when inserting data to mongodb', {err: err, data: data}); |
178 | } | 179 | } |
179 | } | 180 | } |
180 | 181 | ||
181 | function putTaskToCache(task) { | 182 | function putTaskToCache(task) { |
182 | var key = config.globals.gateway_name + '.rid:' + task.requestId; | 183 | var key = config.globals.gateway_name + '.rid:' + task.requestId; |
183 | 184 | ||
184 | try { | 185 | try { |
185 | tasks.set(key, task); | 186 | tasks.set(key, task); |
186 | } | 187 | } |
187 | catch(err) { | 188 | catch(err) { |
188 | logger.warn('Error writing to task to cache', {err: err, key: key, task: task}); | 189 | logger.warn('Error writing to task to cache', {err: err, key: key, task: task}); |
189 | } | 190 | } |
190 | } | 191 | } |
191 | 192 | ||
192 | function topupRequest(task) { | 193 | function topupRequest(task) { |
193 | aaa.insertTaskToMongoDb(task); | 194 | aaa.insertTaskToMongoDb(task); |
194 | putTaskToCache(task); | 195 | putTaskToCache(task); |
195 | 196 | ||
196 | var ts = strftime('%Y%m%d%H%M%S', new Date()); | 197 | var ts = strftime('%Y%m%d%H%M%S', new Date()); |
197 | 198 | ||
198 | var data = | 199 | var data = |
199 | config.h2h_out.userid | 200 | config.h2h_out.userid |
200 | + '|' + config.h2h_out.password | 201 | + '|' + config.h2h_out.password |
201 | + '|' + task['remoteProduct'] | 202 | + '|' + task['remoteProduct'] |
202 | + '|' + task['destination'] + '|0'; | 203 | + '|' + task['destination'] + '|0'; |
203 | 204 | ||
204 | var options = { | 205 | var options = { |
205 | url: config.h2h_out.partner, | 206 | url: config.h2h_out.partner, |
206 | qs: { | 207 | qs: { |
207 | ts: ts, | 208 | ts: ts, |
208 | data: data, | 209 | data: data, |
209 | reffid: task['requestId'] | 210 | reffid: task['requestId'] |
210 | } | 211 | } |
211 | }; | 212 | }; |
212 | logger.info('Creating http request', {options: options}); | 213 | logger.info('Creating http request', {options: options}); |
213 | 214 | ||
214 | request(options, function (error, response, body) { | 215 | request(options, function (error, response, body) { |
215 | var responseCode = '40'; | 216 | var responseCode = '40'; |
216 | var responseMessage = 'Gateway Error'; | 217 | var responseMessage = 'Gateway Error'; |
217 | 218 | ||
218 | if (error) { | 219 | if (error) { |
219 | 220 | ||
220 | logger.warn('HTTP REQUEST ERROR', error); | 221 | logger.warn('HTTP REQUEST ERROR', error); |
221 | callbackReport(task['requestId'], '89', 'HTTP REQUEST ERROR (' + error + ')'); | 222 | callbackReport(task['requestId'], '89', 'HTTP REQUEST ERROR (' + error + ')'); |
222 | 223 | ||
223 | } else if (response.statusCode != 200) { | 224 | } else if (response.statusCode != 200) { |
224 | 225 | ||
225 | var error_message = 'GATEWAY ERROR (HTTP RESPONSE CODE: ' + response.statusCode + ')'; | 226 | var error_message = 'GATEWAY ERROR (HTTP RESPONSE CODE: ' + response.statusCode + ')'; |
226 | logger.warn(error_message); | 227 | logger.warn(error_message); |
227 | callbackReport(task['requestId'], '91', error_message); | 228 | callbackReport(task['requestId'], '91', error_message); |
228 | 229 | ||
229 | } else { | 230 | } else { |
230 | 231 | ||
231 | logger.info('DIRECT RESPONSE', {body: body}); | 232 | logger.info('DIRECT RESPONSE', {body: body}); |
232 | 233 | ||
233 | xml2js(body, function (err, result) { | 234 | xml2js(body, function (err, result) { |
234 | if (err) { | 235 | if (err) { |
235 | callbackReport(task['requestId'], '40', body); | 236 | callbackReport(task['requestId'], '40', body); |
236 | } else { | 237 | } else { |
237 | var directResponse = result; | 238 | var directResponse = result; |
238 | logger.info(directResponse); | 239 | logger.info(directResponse); |
239 | 240 | ||
240 | saveTokenToMongoDb(directResponse.Result); | 241 | saveTokenToMongoDb(directResponse.Result); |
241 | 242 | ||
242 | try { | 243 | try { |
243 | var result_price; | 244 | var result_price; |
244 | try { | 245 | try { |
245 | result_price = directResponse.Result.Price[0].trim(); | 246 | result_price = directResponse.Result.Price[0].trim(); |
246 | } | 247 | } |
247 | catch(err) { | 248 | catch(err) { |
248 | result_price = 0; | 249 | result_price = 0; |
249 | } | 250 | } |
250 | 251 | ||
251 | var result_error_message; | 252 | var result_error_message; |
252 | try { | 253 | try { |
253 | result_error_message = directResponse.Result.ErrorMsg[0].trim(); | 254 | result_error_message = directResponse.Result.ErrorMsg[0].trim(); |
254 | } | 255 | } |
255 | catch(err) { | 256 | catch(err) { |
256 | result_error_message = ''; | 257 | result_error_message = ''; |
257 | } | 258 | } |
258 | 259 | ||
259 | var resultCode = directResponse.Result.ResultCode[0].trim(); | 260 | var resultCode = directResponse.Result.ResultCode[0].trim(); |
260 | 261 | ||
261 | responseMessage = | 262 | responseMessage = |
262 | 'ResultCode: ' + resultCode | 263 | 'ResultCode: ' + resultCode |
263 | + ' | ErrorMsg: ' + result_error_message | 264 | + ' | ErrorMsg: ' + result_error_message |
264 | + ' | DateTime: ' + directResponse.Result.DateTime[0].trim() | 265 | + ' | DateTime: ' + directResponse.Result.DateTime[0].trim() |
265 | + ' | nsm: ' + directResponse.Result.nsm[0].trim() | 266 | + ' | nsm: ' + directResponse.Result.nsm[0].trim() |
266 | + ' | idpel: ' + directResponse.Result.idpel[0].trim() | 267 | + ' | idpel: ' + directResponse.Result.idpel[0].trim() |
267 | + ' | reffid: ' + directResponse.Result.reffid[0].trim() | 268 | + ' | reffid: ' + directResponse.Result.reffid[0].trim() |
268 | + ' | TransID: ' + directResponse.Result.TransID[0].trim() | 269 | + ' | TransID: ' + directResponse.Result.TransID[0].trim() |
269 | + ' | reff_switching: ' + directResponse.Result.reff_switching[0].trim() | 270 | + ' | reff_switching: ' + directResponse.Result.reff_switching[0].trim() |
270 | + ' | amount_trx: ' + directResponse.Result.amount_trx[0].trim() | 271 | + ' | amount_trx: ' + directResponse.Result.amount_trx[0].trim() |
271 | + ' | token: ' + directResponse.Result.token[0].trim() | 272 | + ' | token: ' + directResponse.Result.token[0].trim() |
272 | + ' | PrevBalance: ' + directResponse.Result.PrevBalance[0].trim() | 273 | + ' | PrevBalance: ' + directResponse.Result.PrevBalance[0].trim() |
273 | + ' | Price: ' + result_price | 274 | + ' | Price: ' + result_price |
274 | + ' | EndBalance: ' + directResponse.Result.EndBalance[0].trim() | 275 | + ' | EndBalance: ' + directResponse.Result.EndBalance[0].trim() |
275 | ; | 276 | ; |
276 | 277 | ||
277 | logger.info('Response message: ' + responseMessage); | 278 | logger.info('Response message: ' + responseMessage); |
278 | 279 | ||
279 | if (aaa) { | 280 | if (aaa) { |
280 | // update balance | 281 | // update balance |
281 | aaa.updateBalance(directResponse.Result.EndBalance[0]); | 282 | aaa.updateBalance(directResponse.Result.EndBalance[0]); |
282 | } | 283 | } |
283 | 284 | ||
284 | if (resultCode == '0000') { | 285 | if (resultCode == '0000') { |
285 | var nama_pelanggan = directResponse.Result.nama_pel[0].trim(); | 286 | var nama_pelanggan = directResponse.Result.nama_pel[0].trim(); |
286 | nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-'); | 287 | nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-'); |
287 | var sn = directResponse.Result.token[0].trim() + '/' + nama_pelanggan + '/' + directResponse.Result.tarif[0].trim() + 'VA/' + directResponse.Result.jml_daya[0].trim(); | 288 | var sn = directResponse.Result.token[0].trim() + '/' + nama_pelanggan + '/' + directResponse.Result.tarif[0].trim() + 'VA/' + directResponse.Result.jml_daya[0].trim(); |
288 | sn = sn.replace(/\s/g, '-'); | 289 | sn = sn.replace(/\s/g, '-'); |
289 | 290 | ||
290 | responseMessage = 'SN=' + sn + '; ' + responseMessage; | 291 | responseMessage = 'SN=' + sn + '; ' + responseMessage; |
291 | logger.info('New response message: ' + responseMessage); | 292 | logger.info('New response message: ' + responseMessage); |
292 | } | 293 | } |
293 | 294 | ||
294 | var pendingResultCode = ['0005', '0012', '0068', '0090', '0063', '0018', '0096']; | ||
295 | if (pendingResultCode.indexOf(resultCode) != -1) { | 295 | if (pendingResultCode.indexOf(resultCode) != -1) { |
296 | callbackReport(task['requestId'], '68', responseMessage); | 296 | callbackReport(task['requestId'], '68', responseMessage); |
297 | 297 | ||
298 | logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms'); | 298 | logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms'); |
299 | setTimeout(function () { | 299 | setTimeout(function () { |
300 | cekstatus.advice({trxid: directResponse.Result.TransID[0].trim()}, callbackFromWebReport); | 300 | cekstatus.advice({trxid: directResponse.Result.TransID[0].trim()}, callbackFromWebReport); |
301 | }, sleep_before_retry); | 301 | }, sleep_before_retry); |
302 | 302 | ||
303 | return; | 303 | return; |
304 | } | 304 | } |
305 | 305 | ||
306 | responseCode = resultCode.replace(/^00/, ""); | 306 | responseCode = resultCode.replace(/^00/, ""); |
307 | 307 | ||
308 | if (result_error_message == 'Inq - APLICATION SERVER RESPONSE TIMEOUT') { | 308 | if (result_error_message == 'Inq - APLICATION SERVER RESPONSE TIMEOUT') { |
309 | responseCode = '91'; | 309 | responseCode = '91'; |
310 | } | 310 | } |
311 | 311 | ||
312 | } | 312 | } |
313 | catch(err) { | 313 | catch(err) { |
314 | responseCode = '40'; | 314 | responseCode = '40'; |
315 | responseMessage = 'Invalid response from gateway'; | 315 | responseMessage = 'Invalid response from gateway'; |
316 | } | 316 | } |
317 | } | 317 | } |
318 | 318 | ||
319 | callbackReport(task['requestId'], responseCode, responseMessage); | 319 | callbackReport(task['requestId'], responseCode, responseMessage); |
320 | }); | 320 | }); |
321 | } | 321 | } |
322 | 322 | ||
323 | //callbackReport(task['requestId'], responseCode, responseMessage); | 323 | //callbackReport(task['requestId'], responseCode, responseMessage); |
324 | }); | 324 | }); |
325 | } | 325 | } |
326 | 326 | ||
327 | function callbackFromWebReport(status) { | 327 | function callbackFromWebReport(status) { |
328 | if (!status) { | 328 | if (!status) { |
329 | logger.warn('Advice from webreport return empty status'); | 329 | logger.warn('Advice from webreport return empty status'); |
330 | return; | 330 | return; |
331 | } | 331 | } |
332 | 332 | ||
333 | logger.info('Got advice result from webreport', {status: status}); | 333 | logger.info('Got advice result from webreport', {status: status}); |
334 | 334 | ||
335 | var responseCode = '68'; | 335 | var responseCode = '68'; |
336 | 336 | ||
337 | var result_price = 0; | 337 | var result_price = 0; |
338 | try { | 338 | try { |
339 | result_price = directResponse.Result.Price[0].trim(); | 339 | result_price = directResponse.Result.Price[0].trim(); |
340 | } | 340 | } |
341 | catch(err) {} | 341 | catch(err) {} |
342 | 342 | ||
343 | var errorMsg = ''; | 343 | var errorMsg = ''; |
344 | try { | 344 | try { |
345 | errorMsg = status.response.errormsg[0]; | 345 | errorMsg = status.response.errormsg[0]; |
346 | } | 346 | } |
347 | catch(err) {} | 347 | catch(err) {} |
348 | 348 | ||
349 | var responseMessage = ''; | 349 | var responseMessage = ''; |
350 | try { | 350 | try { |
351 | responseMessage = | 351 | responseMessage = |
352 | 'Hasil advice dari webreport ' | 352 | 'Hasil advice dari webreport ' |
353 | + 'ResultCode: ' + status.response.resultcode[0] | 353 | + 'ResultCode: ' + status.response.resultcode[0] |
354 | } | 354 | } |
355 | catch(err) { | 355 | catch(err) { |
356 | logger.warn('Error parsing ResultCode from webreport advice.', {err: err}); | 356 | logger.warn('Error parsing ResultCode from webreport advice.', {err: err}); |
357 | } | 357 | } |
358 | 358 | ||
359 | try { | 359 | try { |
360 | responseMessage = | 360 | responseMessage = |
361 | responseMessage | 361 | responseMessage |
362 | + ' | ErrorMsg: ' + errorMsg | 362 | + ' | ErrorMsg: ' + errorMsg |
363 | } | 363 | } |
364 | catch(err) { | 364 | catch(err) { |
365 | logger.warn('Error parsing ErrorMsg from webreport advice.', {err: err}); | 365 | logger.warn('Error parsing ErrorMsg from webreport advice.', {err: err}); |
366 | } | 366 | } |
367 | 367 | ||
368 | try { | 368 | try { |
369 | responseMessage = | 369 | responseMessage = |
370 | responseMessage | 370 | responseMessage |
371 | + ' | TrxDate: ' + status.trxDate; | 371 | + ' | TrxDate: ' + status.trxDate; |
372 | } | 372 | } |
373 | catch(err) { | 373 | catch(err) { |
374 | logger.warn('Error parsing TrxDate from webreport advice.', {err: err}); | 374 | logger.warn('Error parsing TrxDate from webreport advice.', {err: err}); |
375 | } | 375 | } |
376 | 376 | ||
377 | try { | 377 | try { |
378 | responseMessage = | 378 | responseMessage = |
379 | responseMessage | 379 | responseMessage |
380 | + ' | UpdateDate: ' + status.updateDate; | 380 | + ' | UpdateDate: ' + status.updateDate; |
381 | 381 | ||
382 | } | 382 | } |
383 | catch(err) { | 383 | catch(err) { |
384 | logger.warn('Error parsing UpdateDate from webreport advice.', {err: err}); | 384 | logger.warn('Error parsing UpdateDate from webreport advice.', {err: err}); |
385 | } | 385 | } |
386 | 386 | ||
387 | try { | 387 | try { |
388 | responseMessage = | 388 | responseMessage = |
389 | responseMessage | 389 | responseMessage |
390 | + ' | nsm: ' + status.response.nsm[0]; | 390 | + ' | nsm: ' + status.response.nsm[0]; |
391 | } | 391 | } |
392 | catch(err) { | 392 | catch(err) { |
393 | logger.warn('Error parsing nsm from webreport advice.', {err: err}); | 393 | logger.warn('Error parsing nsm from webreport advice.', {err: err}); |
394 | } | 394 | } |
395 | 395 | ||
396 | try { | 396 | try { |
397 | responseMessage = | 397 | responseMessage = |
398 | responseMessage | 398 | responseMessage |
399 | + ' | idpel: ' + status.response.idpel[0]; | 399 | + ' | idpel: ' + status.response.idpel[0]; |
400 | } | 400 | } |
401 | catch(err) { | 401 | catch(err) { |
402 | logger.warn('Error parsing idpel from webreport advice.', {err: err}); | 402 | logger.warn('Error parsing idpel from webreport advice.', {err: err}); |
403 | } | 403 | } |
404 | 404 | ||
405 | try { | 405 | try { |
406 | responseMessage = | 406 | responseMessage = |
407 | responseMessage | 407 | responseMessage |
408 | + ' | reffid: ' + status.response.reffid[0].trim(); | 408 | + ' | reffid: ' + status.response.reffid[0].trim(); |
409 | } | 409 | } |
410 | catch(err) { | 410 | catch(err) { |
411 | logger.warn('Error parsing reffid from webreport advice.', {err: err}); | 411 | logger.warn('Error parsing reffid from webreport advice.', {err: err}); |
412 | } | 412 | } |
413 | 413 | ||
414 | try { | 414 | try { |
415 | responseMessage = | 415 | responseMessage = |
416 | responseMessage | 416 | responseMessage |
417 | + ' | TransID: ' + status.response.transid[0].trim(); | 417 | + ' | TransID: ' + status.response.transid[0].trim(); |
418 | } | 418 | } |
419 | catch(err) { | 419 | catch(err) { |
420 | logger.warn('Error parsing TransID from webreport advice.', {err: err}); | 420 | logger.warn('Error parsing TransID from webreport advice.', {err: err}); |
421 | } | 421 | } |
422 | 422 | ||
423 | try { | 423 | try { |
424 | responseMessage = | 424 | responseMessage = |
425 | responseMessage | 425 | responseMessage |
426 | + ' | reff_switching: ' + status.response.reff_switching[0]; | 426 | + ' | reff_switching: ' + status.response.reff_switching[0]; |
427 | } | 427 | } |
428 | catch(err) { | 428 | catch(err) { |
429 | logger.warn('Error parsing reff_switching from webreport advice.', {err: err}); | 429 | logger.warn('Error parsing reff_switching from webreport advice.', {err: err}); |
430 | } | 430 | } |
431 | 431 | ||
432 | try { | 432 | try { |
433 | responseMessage = | 433 | responseMessage = |
434 | responseMessage | 434 | responseMessage |
435 | + ' | amount_trx: ' + status.response.amount_trx[0]; | 435 | + ' | amount_trx: ' + status.response.amount_trx[0]; |
436 | } | 436 | } |
437 | catch(err) { | 437 | catch(err) { |
438 | logger.warn('Error parsing amount_trx from webreport advice.', {err: err}); | 438 | logger.warn('Error parsing amount_trx from webreport advice.', {err: err}); |
439 | } | 439 | } |
440 | 440 | ||
441 | try { | 441 | try { |
442 | responseMessage = | 442 | responseMessage = |
443 | responseMessage | 443 | responseMessage |
444 | + ' | token: ' + status.response.token[0]; | 444 | + ' | token: ' + status.response.token[0]; |
445 | } | 445 | } |
446 | catch(err) { | 446 | catch(err) { |
447 | logger.warn('Error parsing token from webreport advice.', {err: err}); | 447 | logger.warn('Error parsing token from webreport advice.', {err: err}); |
448 | } | 448 | } |
449 | 449 | ||
450 | try { | 450 | try { |
451 | responseMessage = | 451 | responseMessage = |
452 | responseMessage | 452 | responseMessage |
453 | + ' | PrevBalance: ' + status.response.prevbalance[0]; | 453 | + ' | PrevBalance: ' + status.response.prevbalance[0]; |
454 | } | 454 | } |
455 | catch(err) { | 455 | catch(err) { |
456 | logger.warn('Error parsing PrevBalance from webreport advice.', {err: err}); | 456 | logger.warn('Error parsing PrevBalance from webreport advice.', {err: err}); |
457 | } | 457 | } |
458 | 458 | ||
459 | try { | 459 | try { |
460 | responseMessage = | 460 | responseMessage = |
461 | responseMessage | 461 | responseMessage |
462 | + ' | Price: ' + status.amount; | 462 | + ' | Price: ' + status.amount; |
463 | } | 463 | } |
464 | catch(err) { | 464 | catch(err) { |
465 | logger.warn('Error parsing Price from webreport advice.', {err: err}); | 465 | logger.warn('Error parsing Price from webreport advice.', {err: err}); |
466 | } | 466 | } |
467 | 467 | ||
468 | try { | 468 | try { |
469 | responseMessage = | 469 | responseMessage = |
470 | responseMessage | 470 | responseMessage |
471 | + ' | EndBalance: ' + status.response.endbalance[0]; | 471 | + ' | EndBalance: ' + status.response.endbalance[0]; |
472 | } | 472 | } |
473 | catch(err) { | 473 | catch(err) { |
474 | logger.warn('Error parsing EndBalance from webreport advice.', {err: err}); | 474 | logger.warn('Error parsing EndBalance from webreport advice.', {err: err}); |
475 | } | 475 | } |
476 | 476 | ||
477 | 477 | ||
478 | if ((status.status == 'S') && (status.response.resultcode[0] == '0000')) { | 478 | if ((status.status == 'S') && (status.response.resultcode[0] == '0000')) { |
479 | responseCode = '00'; | 479 | responseCode = '00'; |
480 | 480 | ||
481 | var nama_pelanggan = status.response.nama_pel[0] ; | 481 | var nama_pelanggan = status.response.nama_pel[0] ; |
482 | nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-'); | 482 | nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-'); |
483 | 483 | ||
484 | var sn = status.response.token[0] + '/' + nama_pelanggan + '/' + status.response.tarif[0] + 'VA/' + status.response.jml_daya[0]; | 484 | var sn = status.response.token[0] + '/' + nama_pelanggan + '/' + status.response.tarif[0] + 'VA/' + status.response.jml_daya[0]; |
485 | responseMessage = 'SN=' + sn + '; ' + responseMessage; | 485 | responseMessage = 'SN=' + sn + '; ' + responseMessage; |
486 | 486 | ||
487 | } else if ((status.status == 'P') || (status.status == 'W')) { | 487 | } else if ((status.status == 'P') || (status.status == 'W')) { |
488 | 488 | ||
489 | callbackReport(status.response.reffid[0].trim(), '68', responseMessage); | 489 | callbackReport(status.response.reffid[0].trim(), '68', responseMessage); |
490 | logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms'); | 490 | logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms'); |
491 | 491 | ||
492 | setTimeout(function () { | 492 | setTimeout(function () { |
493 | 493 | ||
494 | cekstatus.advice({trxid: status.trxId,}, callbackFromWebReport); | 494 | cekstatus.advice({trxid: status.trxId,}, callbackFromWebReport); |
495 | 495 | ||
496 | }, sleep_before_retry); | 496 | }, sleep_before_retry); |
497 | return; | 497 | return; |
498 | 498 | ||
499 | } else { | 499 | } else { |
500 | responseCode = status.response.resultcode[0].replace(/^00/, ""); | 500 | responseCode = status.response.resultcode[0].replace(/^00/, ""); |
501 | if (['00', '05', '12', '68', '90', '63', '18', '96'].indexOf(responseCode) >= 0) { | 501 | if (['00', '05', '12', '68', '90', '63', '18', '96'].indexOf(responseCode) >= 0) { |
502 | responseCode = '40'; | 502 | responseCode = '40'; |
503 | } | 503 | } |
504 | } | 504 | } |
505 | 505 | ||
506 | 506 | ||
507 | callbackReport(status.response.reffid[0].trim(), responseCode, responseMessage); | 507 | callbackReport(status.response.reffid[0].trim(), responseCode, responseMessage); |
508 | } | 508 | } |
509 | 509 | ||
510 | function createHttpReportServer() { | 510 | function createHttpReportServer() { |
511 | var httpServer = http.createServer(function(request, response) { | 511 | var httpServer = http.createServer(function(request, response) { |
512 | var qs = url.parse(request.url, true).query; | 512 | var qs = url.parse(request.url, true).query; |
513 | var path = url.parse(request.url).pathname; | 513 | var path = url.parse(request.url).pathname; |
514 | 514 | ||
515 | logger.info('Got reverse report from partner', {path: path, qs: qs}); | 515 | logger.info('Got reverse report from partner', {path: path, qs: qs}); |
516 | response.end('OK'); | 516 | response.end('OK'); |
517 | 517 | ||
518 | var requestId = qs.reffid; | ||
519 | var resultCode = qs.rescode; | ||
520 | |||
521 | if (requestId && resultCode && resulCode != '0') { | ||
522 | if (pendingResultCode.indexOf(resultCode) >= 0) { | ||
523 | callbackReport(requestId, '68', 'Got reverse report: ' + qs.msg); | ||
524 | } else { | ||
525 | callbackReport(requestId, '40', 'Got reverse report: ' + qs.msg); | ||
526 | } | ||
527 | return; | ||
528 | } | ||
529 | |||
518 | var trxid; | 530 | var trxid; |
519 | try { | 531 | try { |
520 | trxid = qs.transid; | 532 | trxid = qs.transid; |
521 | } | 533 | } |
522 | catch(err) { | 534 | catch(err) { |
523 | } | 535 | } |
524 | 536 | ||
525 | if (trxid) { | 537 | if (trxid) { |
526 | logger.info('Requesting advice from webreport', {trxid: trxid}) | 538 | logger.info('Requesting advice from webreport', {trxid: trxid}) |
527 | cekstatus.advice({trxid: trxid}, callbackFromWebReport); | 539 | cekstatus.advice({trxid: trxid}, callbackFromWebReport); |
528 | } | 540 | } |
529 | 541 | ||
530 | }); | 542 | }); |
531 | 543 | ||
532 | httpServer.listen(config.h2h_out.listen_port, function() { | 544 | httpServer.listen(config.h2h_out.listen_port, function() { |
533 | logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port); | 545 | logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port); |
534 | }); | 546 | }); |
535 | } | 547 | } |
536 | 548 | ||
537 | function start(options) { | 549 | function start(options) { |
538 | if (!options) { | 550 | if (!options) { |
539 | console.log('Undefined options, terminating....'); | 551 | console.log('Undefined options, terminating....'); |
540 | process.exit(1); | 552 | process.exit(1); |
541 | } | 553 | } |
542 | 554 | ||
543 | if (options.config) { | 555 | if (options.config) { |
544 | config = options.config; | 556 | config = options.config; |
545 | } else { | 557 | } else { |
546 | console.log('Undefined options.config, terminating....') | 558 | console.log('Undefined options.config, terminating....') |
547 | process.exit(1); | 559 | process.exit(1); |
548 | } | 560 | } |
549 | 561 | ||
550 | if (options.aaa) { | 562 | if (options.aaa) { |
551 | aaa = options.aaa; | 563 | aaa = options.aaa; |
552 | callbackReport = options.aaa.callbackReportWithPushToMongoDb; | 564 | callbackReport = options.aaa.callbackReportWithPushToMongoDb; |
553 | } else { | 565 | } else { |
554 | console.log('Undefined options.aaa, terminating....') | 566 | console.log('Undefined options.aaa, terminating....') |
555 | process.exit(1); | 567 | process.exit(1); |
556 | } | 568 | } |
557 | 569 | ||
558 | if (options && options.logger) { | 570 | if (options && options.logger) { |
559 | logger = options.logger; | 571 | logger = options.logger; |
560 | } else { | 572 | } else { |
561 | logger = new winston.Logger({ | 573 | logger = new winston.Logger({ |
562 | transports: [ | 574 | transports: [ |
563 | new (winston.transports.Console)() | 575 | new (winston.transports.Console)() |
564 | ] | 576 | ] |
565 | }); | 577 | }); |
566 | } | 578 | } |
567 | 579 | ||
568 | createHttpReportServer(); | 580 | createHttpReportServer(); |
569 | initMongoClient(); | 581 | initMongoClient(); |
570 | } | 582 | } |
571 | 583 | ||
572 | exports.start = start; | 584 | exports.start = start; |
573 | exports.topupRequest = topupRequest; | 585 | exports.topupRequest = topupRequest; |