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