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