Commit 14c35798bc345b43403fecd6b6e773f2f67987cb

Authored by Adhidarma Hadiwinoto
1 parent 5d7d942633
Exists in master

reverse trx SUKSES

Showing 1 changed file with 30 additions and 10 deletions Inline Diff

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