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