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