Commit 855827cf6e1c835a1f2c22ef5ee2af4b1088c106
1 parent
57711acc6a
Exists in
master
insertTaskToMongoDb dan callbackReportWithPushToMongoDb
Showing 2 changed files with 139 additions and 125 deletions Inline Diff
index.js
1 | var fs = require('fs'); | 1 | var fs = require('fs'); |
2 | var ini = require('ini'); | 2 | var ini = require('ini'); |
3 | var expresso = require('sate24-expresso'); | 3 | var expresso = require('sate24-expresso'); |
4 | var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8')); | 4 | var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8')); |
5 | 5 | ||
6 | process.chdir(__dirname); | 6 | process.chdir(__dirname); |
7 | 7 | ||
8 | var logger = require('sate24/logger.js').start(); | 8 | var logger = require('sate24/logger.js').start(); |
9 | var HttpServer = require('sate24/httpserver.js'); | 9 | var HttpServer = require('sate24/httpserver.js'); |
10 | var aaa = require('sate24/aaa.js'); | 10 | var aaa = require('sate24/aaa.js'); |
11 | var partner = require('./partner-sc.js'); | 11 | var partner = require('./partner-sc.js'); |
12 | 12 | ||
13 | var matrix = aaa.prepareMatrix(); | 13 | var matrix = aaa.prepareMatrix(); |
14 | 14 | ||
15 | var options = { | 15 | var options = { |
16 | 'aaa': aaa, | 16 | 'aaa': aaa, |
17 | 'logger': logger, | 17 | 'logger': logger, |
18 | 'config': config, | 18 | 'config': config, |
19 | 'matrix': matrix, | 19 | 'matrix': matrix, |
20 | } | 20 | } |
21 | 21 | ||
22 | var httpServer = HttpServer.start(config, options); | 22 | var httpServer = HttpServer.start(config, options); |
23 | 23 | ||
24 | partner.start(config, aaa.callbackReport, options); | 24 | partner.start(options); |
25 | aaa.start(config, partner, options); | 25 | aaa.start(config, partner, options); |
26 | expresso.start(options); | 26 | expresso.start(options); |
27 | 27 |
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.mongodbstruk || !config.mongodbstruk.url) { |
31 | return; | 31 | return; |
32 | } | 32 | } |
33 | 33 | ||
34 | try { | 34 | try { |
35 | var url = config.mongodb.url; | 35 | var url = config.mongodbstruk.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.admin_fee[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.hargapelanggan = parseInt(result.amount_trx[0].trim()); | 121 | data.hargapelanggan = parseInt(result.amount_trx[0].trim()); |
122 | } | 122 | } |
123 | catch(err) { data.hargapelanggan = 0; } | 123 | catch(err) { data.hargapelanggan = 0; } |
124 | 124 | ||
125 | try { | 125 | try { |
126 | data.jumlahkwh = result.jml_daya[0].trim(); | 126 | data.jumlahkwh = result.jml_daya[0].trim(); |
127 | } | 127 | } |
128 | catch(err) { data.jumlahkwh = 0; } | 128 | catch(err) { data.jumlahkwh = 0; } |
129 | 129 | ||
130 | try { | 130 | try { |
131 | data.token = result.token[0].trim(); | 131 | data.token = result.token[0].trim(); |
132 | } | 132 | } |
133 | catch(err) { data.token = 0; } | 133 | catch(err) { data.token = 0; } |
134 | 134 | ||
135 | try { | 135 | try { |
136 | data.ppn = result.ppn_fee[0].trim(); | 136 | data.ppn = result.ppn_fee[0].trim(); |
137 | } | 137 | } |
138 | catch(err) { data.ppn_fee = 0; } | 138 | catch(err) { data.ppn_fee = 0; } |
139 | 139 | ||
140 | try { | 140 | try { |
141 | data.ppj = result.ppj_fee[0].trim(); | 141 | data.ppj = result.ppj_fee[0].trim(); |
142 | } | 142 | } |
143 | catch(err) { data.ppj = 0; } | 143 | catch(err) { data.ppj = 0; } |
144 | 144 | ||
145 | try { | 145 | try { |
146 | data.angsuran = result.angsuran_fee[0].trim(); | 146 | data.angsuran = result.angsuran_fee[0].trim(); |
147 | } | 147 | } |
148 | catch(err) { data.angsuran = 0; } | 148 | catch(err) { data.angsuran = 0; } |
149 | 149 | ||
150 | try { | 150 | try { |
151 | data.meterai = result.materai_fee[0].trim(); | 151 | data.meterai = result.materai_fee[0].trim(); |
152 | } | 152 | } |
153 | catch(err) { data.materai_fee = 0; } | 153 | catch(err) { data.materai_fee = 0; } |
154 | 154 | ||
155 | return data; | 155 | return data; |
156 | } | 156 | } |
157 | 157 | ||
158 | function saveTokenToMongoDb(result) { | 158 | function saveTokenToMongoDb(result) { |
159 | if (!mongodb) { | 159 | if (!mongodb) { |
160 | return; | 160 | return; |
161 | } | 161 | } |
162 | 162 | ||
163 | if (!config.mongodb) { | 163 | if (!config.mongodbstruk) { |
164 | return; | 164 | return; |
165 | } | 165 | } |
166 | 166 | ||
167 | if (!config.mongodb.collection) { | 167 | if (!config.mongodbstruk.collection) { |
168 | return; | 168 | return; |
169 | } | 169 | } |
170 | 170 | ||
171 | data = prepareResultData(result); | 171 | data = prepareResultData(result); |
172 | 172 | ||
173 | try { | 173 | try { |
174 | mongodb.collection(config.mongodb.collection).insertOne(data); | 174 | mongodb.collection(config.mongodbstruk.collection).insertOne(data); |
175 | } | 175 | } |
176 | catch(err) { | 176 | catch(err) { |
177 | 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}); |
178 | } | 178 | } |
179 | } | 179 | } |
180 | 180 | ||
181 | function putTaskToCache(task) { | 181 | function putTaskToCache(task) { |
182 | var key = config.globals.gateway_name + '.rid:' + task.requestId; | 182 | var key = config.globals.gateway_name + '.rid:' + task.requestId; |
183 | 183 | ||
184 | try { | 184 | try { |
185 | tasks.set(key, task); | 185 | tasks.set(key, task); |
186 | } | 186 | } |
187 | catch(err) { | 187 | catch(err) { |
188 | 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}); |
189 | } | 189 | } |
190 | } | 190 | } |
191 | 191 | ||
192 | function topupRequest(task) { | 192 | function topupRequest(task) { |
193 | aaa.insertTaskToMongoDb(task); | ||
193 | putTaskToCache(task); | 194 | putTaskToCache(task); |
194 | 195 | ||
195 | var ts = strftime('%Y%m%d%H%M%S', new Date()); | 196 | var ts = strftime('%Y%m%d%H%M%S', new Date()); |
196 | 197 | ||
197 | var data = | 198 | var data = |
198 | config.h2h_out.userid | 199 | config.h2h_out.userid |
199 | + '|' + config.h2h_out.password | 200 | + '|' + config.h2h_out.password |
200 | + '|' + task['remoteProduct'] | 201 | + '|' + task['remoteProduct'] |
201 | + '|' + task['destination'] + '|0'; | 202 | + '|' + task['destination'] + '|0'; |
202 | 203 | ||
203 | var options = { | 204 | var options = { |
204 | url: config.h2h_out.partner, | 205 | url: config.h2h_out.partner, |
205 | qs: { | 206 | qs: { |
206 | ts: ts, | 207 | ts: ts, |
207 | data: data, | 208 | data: data, |
208 | reffid: task['requestId'] | 209 | reffid: task['requestId'] |
209 | } | 210 | } |
210 | }; | 211 | }; |
211 | logger.info('Creating http request', {options: options}); | 212 | logger.info('Creating http request', {options: options}); |
212 | 213 | ||
213 | request(options, function (error, response, body) { | 214 | request(options, function (error, response, body) { |
214 | var responseCode = '40'; | 215 | var responseCode = '40'; |
215 | var responseMessage = 'Gateway Error'; | 216 | var responseMessage = 'Gateway Error'; |
216 | 217 | ||
217 | if (error) { | 218 | if (error) { |
218 | 219 | ||
219 | logger.warn('HTTP REQUEST ERROR', error); | 220 | logger.warn('HTTP REQUEST ERROR', error); |
220 | callbackReport(task['requestId'], '89', 'HTTP REQUEST ERROR (' + error + ')'); | 221 | callbackReport(task['requestId'], '89', 'HTTP REQUEST ERROR (' + error + ')'); |
221 | 222 | ||
222 | } else if (response.statusCode != 200) { | 223 | } else if (response.statusCode != 200) { |
223 | 224 | ||
224 | var error_message = 'GATEWAY ERROR (HTTP RESPONSE CODE: ' + response.statusCode + ')'; | 225 | var error_message = 'GATEWAY ERROR (HTTP RESPONSE CODE: ' + response.statusCode + ')'; |
225 | logger.warn(error_message); | 226 | logger.warn(error_message); |
226 | callbackReport(task['requestId'], '91', error_message); | 227 | callbackReport(task['requestId'], '91', error_message); |
227 | 228 | ||
228 | } else { | 229 | } else { |
229 | 230 | ||
230 | logger.info('DIRECT RESPONSE', {body: body}); | 231 | logger.info('DIRECT RESPONSE', {body: body}); |
231 | 232 | ||
232 | xml2js(body, function (err, result) { | 233 | xml2js(body, function (err, result) { |
233 | if (err) { | 234 | if (err) { |
234 | callbackReport(task['requestId'], '40', body); | 235 | callbackReport(task['requestId'], '40', body); |
235 | } else { | 236 | } else { |
236 | var directResponse = result; | 237 | var directResponse = result; |
237 | logger.info(directResponse); | 238 | logger.info(directResponse); |
238 | 239 | ||
239 | saveTokenToMongoDb(directResponse.Result); | 240 | saveTokenToMongoDb(directResponse.Result); |
240 | 241 | ||
241 | try { | 242 | try { |
242 | var result_price; | 243 | var result_price; |
243 | try { | 244 | try { |
244 | result_price = directResponse.Result.Price[0].trim(); | 245 | result_price = directResponse.Result.Price[0].trim(); |
245 | } | 246 | } |
246 | catch(err) { | 247 | catch(err) { |
247 | result_price = 0; | 248 | result_price = 0; |
248 | } | 249 | } |
249 | 250 | ||
250 | var result_error_message; | 251 | var result_error_message; |
251 | try { | 252 | try { |
252 | result_error_message = directResponse.Result.ErrorMsg[0].trim(); | 253 | result_error_message = directResponse.Result.ErrorMsg[0].trim(); |
253 | } | 254 | } |
254 | catch(err) { | 255 | catch(err) { |
255 | result_error_message = ''; | 256 | result_error_message = ''; |
256 | } | 257 | } |
257 | 258 | ||
258 | var resultCode = directResponse.Result.ResultCode[0].trim(); | 259 | var resultCode = directResponse.Result.ResultCode[0].trim(); |
259 | 260 | ||
260 | responseMessage = | 261 | responseMessage = |
261 | 'ResultCode: ' + resultCode | 262 | 'ResultCode: ' + resultCode |
262 | + ' | ErrorMsg: ' + result_error_message | 263 | + ' | ErrorMsg: ' + result_error_message |
263 | + ' | DateTime: ' + directResponse.Result.DateTime[0].trim() | 264 | + ' | DateTime: ' + directResponse.Result.DateTime[0].trim() |
264 | + ' | nsm: ' + directResponse.Result.nsm[0].trim() | 265 | + ' | nsm: ' + directResponse.Result.nsm[0].trim() |
265 | + ' | idpel: ' + directResponse.Result.idpel[0].trim() | 266 | + ' | idpel: ' + directResponse.Result.idpel[0].trim() |
266 | + ' | reffid: ' + directResponse.Result.reffid[0].trim() | 267 | + ' | reffid: ' + directResponse.Result.reffid[0].trim() |
267 | + ' | TransID: ' + directResponse.Result.TransID[0].trim() | 268 | + ' | TransID: ' + directResponse.Result.TransID[0].trim() |
268 | + ' | reff_switching: ' + directResponse.Result.reff_switching[0].trim() | 269 | + ' | reff_switching: ' + directResponse.Result.reff_switching[0].trim() |
269 | + ' | amount_trx: ' + directResponse.Result.amount_trx[0].trim() | 270 | + ' | amount_trx: ' + directResponse.Result.amount_trx[0].trim() |
270 | + ' | token: ' + directResponse.Result.token[0].trim() | 271 | + ' | token: ' + directResponse.Result.token[0].trim() |
271 | + ' | PrevBalance: ' + directResponse.Result.PrevBalance[0].trim() | 272 | + ' | PrevBalance: ' + directResponse.Result.PrevBalance[0].trim() |
272 | + ' | Price: ' + result_price | 273 | + ' | Price: ' + result_price |
273 | + ' | EndBalance: ' + directResponse.Result.EndBalance[0].trim() | 274 | + ' | EndBalance: ' + directResponse.Result.EndBalance[0].trim() |
274 | ; | 275 | ; |
275 | 276 | ||
276 | logger.info('Response message: ' + responseMessage); | 277 | logger.info('Response message: ' + responseMessage); |
277 | 278 | ||
278 | if (aaa) { | 279 | if (aaa) { |
279 | // update balance | 280 | // update balance |
280 | aaa.updateBalance(directResponse.Result.EndBalance[0]); | 281 | aaa.updateBalance(directResponse.Result.EndBalance[0]); |
281 | } | 282 | } |
282 | 283 | ||
283 | if (resultCode == '0000') { | 284 | if (resultCode == '0000') { |
284 | var nama_pelanggan = directResponse.Result.nama_pel[0].trim(); | 285 | var nama_pelanggan = directResponse.Result.nama_pel[0].trim(); |
285 | nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-'); | 286 | nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-'); |
286 | var sn = directResponse.Result.token[0].trim() + '/' + nama_pelanggan + '/' + directResponse.Result.tarif[0].trim() + 'VA/' + directResponse.Result.jml_daya[0].trim(); | 287 | var sn = directResponse.Result.token[0].trim() + '/' + nama_pelanggan + '/' + directResponse.Result.tarif[0].trim() + 'VA/' + directResponse.Result.jml_daya[0].trim(); |
287 | sn = sn.replace(/\s/g, '-'); | 288 | sn = sn.replace(/\s/g, '-'); |
288 | 289 | ||
289 | responseMessage = 'SN=' + sn + '; ' + responseMessage; | 290 | responseMessage = 'SN=' + sn + '; ' + responseMessage; |
290 | logger.info('New response message: ' + responseMessage); | 291 | logger.info('New response message: ' + responseMessage); |
291 | } | 292 | } |
292 | 293 | ||
293 | var pendingResultCode = ['0005', '0012', '0068', '0090', '0063', '0018', '0096']; | 294 | var pendingResultCode = ['0005', '0012', '0068', '0090', '0063', '0018', '0096']; |
294 | if (pendingResultCode.indexOf(resultCode) != -1) { | 295 | if (pendingResultCode.indexOf(resultCode) != -1) { |
295 | callbackReport(task['requestId'], '68', responseMessage); | 296 | callbackReport(task['requestId'], '68', responseMessage); |
296 | 297 | ||
297 | logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms'); | 298 | logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms'); |
298 | setTimeout(function () { | 299 | setTimeout(function () { |
299 | cekstatus.advice({trxid: directResponse.Result.TransID[0].trim()}, callbackFromWebReport); | 300 | cekstatus.advice({trxid: directResponse.Result.TransID[0].trim()}, callbackFromWebReport); |
300 | }, sleep_before_retry); | 301 | }, sleep_before_retry); |
301 | 302 | ||
302 | return; | 303 | return; |
303 | } | 304 | } |
304 | 305 | ||
305 | responseCode = resultCode.replace(/^00/, ""); | 306 | responseCode = resultCode.replace(/^00/, ""); |
306 | 307 | ||
307 | if (result_error_message == 'Inq - APLICATION SERVER RESPONSE TIMEOUT') { | 308 | if (result_error_message == 'Inq - APLICATION SERVER RESPONSE TIMEOUT') { |
308 | responseCode = '91'; | 309 | responseCode = '91'; |
309 | } | 310 | } |
310 | 311 | ||
311 | } | 312 | } |
312 | catch(err) { | 313 | catch(err) { |
313 | responseCode = '40'; | 314 | responseCode = '40'; |
314 | responseMessage = 'Invalid response from gateway'; | 315 | responseMessage = 'Invalid response from gateway'; |
315 | } | 316 | } |
316 | } | 317 | } |
317 | 318 | ||
318 | callbackReport(task['requestId'], responseCode, responseMessage); | 319 | callbackReport(task['requestId'], responseCode, responseMessage); |
319 | }); | 320 | }); |
320 | } | 321 | } |
321 | 322 | ||
322 | //callbackReport(task['requestId'], responseCode, responseMessage); | 323 | //callbackReport(task['requestId'], responseCode, responseMessage); |
323 | }); | 324 | }); |
324 | } | 325 | } |
325 | 326 | ||
326 | function callbackFromWebReport(status) { | 327 | function callbackFromWebReport(status) { |
327 | if (!status) { | 328 | if (!status) { |
328 | logger.warn('Advice from webreport return empty status'); | 329 | logger.warn('Advice from webreport return empty status'); |
329 | return; | 330 | return; |
330 | } | 331 | } |
331 | 332 | ||
332 | logger.info('Got advice result from webreport', {status: status}); | 333 | logger.info('Got advice result from webreport', {status: status}); |
333 | 334 | ||
334 | var responseCode = '68'; | 335 | var responseCode = '68'; |
335 | 336 | ||
336 | var result_price = 0; | 337 | var result_price = 0; |
337 | try { | 338 | try { |
338 | result_price = directResponse.Result.Price[0].trim(); | 339 | result_price = directResponse.Result.Price[0].trim(); |
339 | } | 340 | } |
340 | catch(err) {} | 341 | catch(err) {} |
341 | 342 | ||
342 | var errorMsg = ''; | 343 | var errorMsg = ''; |
343 | try { | 344 | try { |
344 | errorMsg = status.response.errormsg[0]; | 345 | errorMsg = status.response.errormsg[0]; |
345 | } | 346 | } |
346 | catch(err) {} | 347 | catch(err) {} |
347 | 348 | ||
348 | var responseMessage = ''; | 349 | var responseMessage = ''; |
349 | try { | 350 | try { |
350 | responseMessage = | 351 | responseMessage = |
351 | 'Hasil advice dari webreport ' | 352 | 'Hasil advice dari webreport ' |
352 | + 'ResultCode: ' + status.response.resultcode[0] | 353 | + 'ResultCode: ' + status.response.resultcode[0] |
353 | } | 354 | } |
354 | catch(err) { | 355 | catch(err) { |
355 | logger.warn('Error parsing ResultCode from webreport advice.', {err: err}); | 356 | logger.warn('Error parsing ResultCode from webreport advice.', {err: err}); |
356 | } | 357 | } |
357 | 358 | ||
358 | try { | 359 | try { |
359 | responseMessage = | 360 | responseMessage = |
360 | responseMessage | 361 | responseMessage |
361 | + ' | ErrorMsg: ' + errorMsg | 362 | + ' | ErrorMsg: ' + errorMsg |
362 | } | 363 | } |
363 | catch(err) { | 364 | catch(err) { |
364 | logger.warn('Error parsing ErrorMsg from webreport advice.', {err: err}); | 365 | logger.warn('Error parsing ErrorMsg from webreport advice.', {err: err}); |
365 | } | 366 | } |
366 | 367 | ||
367 | try { | 368 | try { |
368 | responseMessage = | 369 | responseMessage = |
369 | responseMessage | 370 | responseMessage |
370 | + ' | TrxDate: ' + status.trxDate; | 371 | + ' | TrxDate: ' + status.trxDate; |
371 | } | 372 | } |
372 | catch(err) { | 373 | catch(err) { |
373 | logger.warn('Error parsing TrxDate from webreport advice.', {err: err}); | 374 | logger.warn('Error parsing TrxDate from webreport advice.', {err: err}); |
374 | } | 375 | } |
375 | 376 | ||
376 | try { | 377 | try { |
377 | responseMessage = | 378 | responseMessage = |
378 | responseMessage | 379 | responseMessage |
379 | + ' | UpdateDate: ' + status.updateDate; | 380 | + ' | UpdateDate: ' + status.updateDate; |
380 | 381 | ||
381 | } | 382 | } |
382 | catch(err) { | 383 | catch(err) { |
383 | logger.warn('Error parsing UpdateDate from webreport advice.', {err: err}); | 384 | logger.warn('Error parsing UpdateDate from webreport advice.', {err: err}); |
384 | } | 385 | } |
385 | 386 | ||
386 | try { | 387 | try { |
387 | responseMessage = | 388 | responseMessage = |
388 | responseMessage | 389 | responseMessage |
389 | + ' | nsm: ' + status.response.nsm[0]; | 390 | + ' | nsm: ' + status.response.nsm[0]; |
390 | } | 391 | } |
391 | catch(err) { | 392 | catch(err) { |
392 | logger.warn('Error parsing nsm from webreport advice.', {err: err}); | 393 | logger.warn('Error parsing nsm from webreport advice.', {err: err}); |
393 | } | 394 | } |
394 | 395 | ||
395 | try { | 396 | try { |
396 | responseMessage = | 397 | responseMessage = |
397 | responseMessage | 398 | responseMessage |
398 | + ' | idpel: ' + status.response.idpel[0]; | 399 | + ' | idpel: ' + status.response.idpel[0]; |
399 | } | 400 | } |
400 | catch(err) { | 401 | catch(err) { |
401 | logger.warn('Error parsing idpel from webreport advice.', {err: err}); | 402 | logger.warn('Error parsing idpel from webreport advice.', {err: err}); |
402 | } | 403 | } |
403 | 404 | ||
404 | try { | 405 | try { |
405 | responseMessage = | 406 | responseMessage = |
406 | responseMessage | 407 | responseMessage |
407 | + ' | reffid: ' + status.response.reffid[0].trim(); | 408 | + ' | reffid: ' + status.response.reffid[0].trim(); |
408 | } | 409 | } |
409 | catch(err) { | 410 | catch(err) { |
410 | logger.warn('Error parsing reffid from webreport advice.', {err: err}); | 411 | logger.warn('Error parsing reffid from webreport advice.', {err: err}); |
411 | } | 412 | } |
412 | 413 | ||
413 | try { | 414 | try { |
414 | responseMessage = | 415 | responseMessage = |
415 | responseMessage | 416 | responseMessage |
416 | + ' | TransID: ' + status.response.transid[0].trim(); | 417 | + ' | TransID: ' + status.response.transid[0].trim(); |
417 | } | 418 | } |
418 | catch(err) { | 419 | catch(err) { |
419 | logger.warn('Error parsing TransID from webreport advice.', {err: err}); | 420 | logger.warn('Error parsing TransID from webreport advice.', {err: err}); |
420 | } | 421 | } |
421 | 422 | ||
422 | try { | 423 | try { |
423 | responseMessage = | 424 | responseMessage = |
424 | responseMessage | 425 | responseMessage |
425 | + ' | reff_switching: ' + status.response.reff_switching[0]; | 426 | + ' | reff_switching: ' + status.response.reff_switching[0]; |
426 | } | 427 | } |
427 | catch(err) { | 428 | catch(err) { |
428 | logger.warn('Error parsing reff_switching from webreport advice.', {err: err}); | 429 | logger.warn('Error parsing reff_switching from webreport advice.', {err: err}); |
429 | } | 430 | } |
430 | 431 | ||
431 | try { | 432 | try { |
432 | responseMessage = | 433 | responseMessage = |
433 | responseMessage | 434 | responseMessage |
434 | + ' | amount_trx: ' + status.response.amount_trx[0]; | 435 | + ' | amount_trx: ' + status.response.amount_trx[0]; |
435 | } | 436 | } |
436 | catch(err) { | 437 | catch(err) { |
437 | logger.warn('Error parsing amount_trx from webreport advice.', {err: err}); | 438 | logger.warn('Error parsing amount_trx from webreport advice.', {err: err}); |
438 | } | 439 | } |
439 | 440 | ||
440 | try { | 441 | try { |
441 | responseMessage = | 442 | responseMessage = |
442 | responseMessage | 443 | responseMessage |
443 | + ' | token: ' + status.response.token[0]; | 444 | + ' | token: ' + status.response.token[0]; |
444 | } | 445 | } |
445 | catch(err) { | 446 | catch(err) { |
446 | logger.warn('Error parsing token from webreport advice.', {err: err}); | 447 | logger.warn('Error parsing token from webreport advice.', {err: err}); |
447 | } | 448 | } |
448 | 449 | ||
449 | try { | 450 | try { |
450 | responseMessage = | 451 | responseMessage = |
451 | responseMessage | 452 | responseMessage |
452 | + ' | PrevBalance: ' + status.response.prevbalance[0]; | 453 | + ' | PrevBalance: ' + status.response.prevbalance[0]; |
453 | } | 454 | } |
454 | catch(err) { | 455 | catch(err) { |
455 | logger.warn('Error parsing PrevBalance from webreport advice.', {err: err}); | 456 | logger.warn('Error parsing PrevBalance from webreport advice.', {err: err}); |
456 | } | 457 | } |
457 | 458 | ||
458 | try { | 459 | try { |
459 | responseMessage = | 460 | responseMessage = |
460 | responseMessage | 461 | responseMessage |
461 | + ' | Price: ' + status.amount; | 462 | + ' | Price: ' + status.amount; |
462 | } | 463 | } |
463 | catch(err) { | 464 | catch(err) { |
464 | logger.warn('Error parsing Price from webreport advice.', {err: err}); | 465 | logger.warn('Error parsing Price from webreport advice.', {err: err}); |
465 | } | 466 | } |
466 | 467 | ||
467 | try { | 468 | try { |
468 | responseMessage = | 469 | responseMessage = |
469 | responseMessage | 470 | responseMessage |
470 | + ' | EndBalance: ' + status.response.endbalance[0]; | 471 | + ' | EndBalance: ' + status.response.endbalance[0]; |
471 | } | 472 | } |
472 | catch(err) { | 473 | catch(err) { |
473 | logger.warn('Error parsing EndBalance from webreport advice.', {err: err}); | 474 | logger.warn('Error parsing EndBalance from webreport advice.', {err: err}); |
474 | } | 475 | } |
475 | 476 | ||
476 | 477 | ||
477 | if ((status.status == 'S') && (status.response.resultcode[0] == '0000')) { | 478 | if ((status.status == 'S') && (status.response.resultcode[0] == '0000')) { |
478 | responseCode = '00'; | 479 | responseCode = '00'; |
479 | 480 | ||
480 | var nama_pelanggan = status.response.nama_pel[0] ; | 481 | var nama_pelanggan = status.response.nama_pel[0] ; |
481 | nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-'); | 482 | nama_pelanggan = nama_pelanggan.replace(/-\/-/g, '-'); |
482 | 483 | ||
483 | var sn = status.response.token[0] + '/' + nama_pelanggan + '/' + status.response.tarif[0] + 'VA/' + status.response.jml_daya[0]; | 484 | var sn = status.response.token[0] + '/' + nama_pelanggan + '/' + status.response.tarif[0] + 'VA/' + status.response.jml_daya[0]; |
484 | responseMessage = 'SN=' + sn + '; ' + responseMessage; | 485 | responseMessage = 'SN=' + sn + '; ' + responseMessage; |
485 | 486 | ||
486 | } else if ((status.status == 'P') || (status.status == 'W')) { | 487 | } else if ((status.status == 'P') || (status.status == 'W')) { |
487 | 488 | ||
488 | callbackReport(status.response.reffid[0].trim(), '68', responseMessage); | 489 | callbackReport(status.response.reffid[0].trim(), '68', responseMessage); |
489 | logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms'); | 490 | logger.info('Got pending status, requesting advice from webreport in ' + sleep_before_retry + 'ms'); |
490 | 491 | ||
491 | setTimeout(function () { | 492 | setTimeout(function () { |
492 | 493 | ||
493 | cekstatus.advice({trxid: status.trxId,}, callbackFromWebReport); | 494 | cekstatus.advice({trxid: status.trxId,}, callbackFromWebReport); |
494 | 495 | ||
495 | }, sleep_before_retry); | 496 | }, sleep_before_retry); |
496 | return; | 497 | return; |
497 | 498 | ||
498 | } else { | 499 | } else { |
499 | responseCode = status.response.resultcode[0].replace(/^00/, ""); | 500 | responseCode = status.response.resultcode[0].replace(/^00/, ""); |
500 | if (['00', '05', '12', '68', '90', '63', '18', '96'].indexOf(responseCode) >= 0) { | 501 | if (['00', '05', '12', '68', '90', '63', '18', '96'].indexOf(responseCode) >= 0) { |
501 | responseCode = '40'; | 502 | responseCode = '40'; |
502 | } | 503 | } |
503 | } | 504 | } |
504 | 505 | ||
505 | 506 | ||
506 | callbackReport(status.response.reffid[0].trim(), responseCode, responseMessage); | 507 | callbackReport(status.response.reffid[0].trim(), responseCode, responseMessage); |
507 | } | 508 | } |
508 | 509 | ||
509 | function createHttpReportServer() { | 510 | function createHttpReportServer() { |
510 | var httpServer = http.createServer(function(request, response) { | 511 | var httpServer = http.createServer(function(request, response) { |
511 | var qs = url.parse(request.url, true).query; | 512 | var qs = url.parse(request.url, true).query; |
512 | var path = url.parse(request.url).pathname; | 513 | var path = url.parse(request.url).pathname; |
513 | 514 | ||
514 | logger.info('Got reverse report from partner', {path: path, qs: qs}); | 515 | logger.info('Got reverse report from partner', {path: path, qs: qs}); |
515 | response.end('OK'); | 516 | response.end('OK'); |
516 | 517 | ||
517 | var trxid; | 518 | var trxid; |
518 | try { | 519 | try { |
519 | trxid = qs.transid; | 520 | trxid = qs.transid; |
520 | } | 521 | } |
521 | catch(err) { | 522 | catch(err) { |
522 | } | 523 | } |
523 | 524 | ||
524 | if (trxid) { | 525 | if (trxid) { |
525 | logger.info('Requesting advice from webreport', {trxid: trxid}) | 526 | logger.info('Requesting advice from webreport', {trxid: trxid}) |
526 | cekstatus.advice({trxid: trxid}, callbackFromWebReport); | 527 | cekstatus.advice({trxid: trxid}, callbackFromWebReport); |
527 | } | 528 | } |
528 | 529 | ||
529 | }); | 530 | }); |
530 | 531 | ||
531 | httpServer.listen(config.h2h_out.listen_port, function() { | 532 | httpServer.listen(config.h2h_out.listen_port, function() { |
532 | logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port); | 533 | logger.info('HTTP Reverse/Report server listen on port ' + config.h2h_out.listen_port); |
533 | }); | 534 | }); |
534 | } | 535 | } |
535 | 536 | ||
536 | function start(_config, _callbackReport, options) { | 537 | function start(options) { |
537 | config = _config; | 538 | if (!options) { |
538 | callbackReport = _callbackReport; | 539 | console.log('Undefined options, terminating....'); |
539 | 540 | process.exit(1); | |
540 | if (options && options.aaa) { | 541 | } |
541 | aaa = options.aaa; | 542 | |
543 | if (options.config) { | ||
544 | config = options.config; | ||
545 | } else { | ||
546 | console.log('Undefined options.config, terminating....') | ||
547 | process.exit(1); | ||
548 | } | ||
549 | |||
550 | if (options.aaa) { | ||
551 | aaa = options.aaa; | ||
552 | callbackReport = options.aaa.callbackReportWithPushToMongoDb; | ||
553 | } else { | ||
554 | console.log('Undefined options.aaa, terminating....') | ||
555 | process.exit(1); | ||
542 | } | 556 | } |
543 | 557 | ||
544 | if (options && options.logger) { | 558 | if (options && options.logger) { |
545 | logger = options.logger; | 559 | logger = options.logger; |
546 | } else { | 560 | } else { |
547 | logger = new winston.Logger({ | 561 | logger = new winston.Logger({ |
548 | transports: [ | 562 | transports: [ |
549 | new (winston.transports.Console)() | 563 | new (winston.transports.Console)() |
550 | ] | 564 | ] |
551 | }); | 565 | }); |
552 | } | 566 | } |
553 | 567 | ||
554 | createHttpReportServer(); | 568 | createHttpReportServer(); |
555 | initMongoClient(); | 569 | initMongoClient(); |
556 | } | 570 | } |
557 | 571 | ||
558 | exports.start = start; | 572 | exports.start = start; |
559 | exports.topupRequest = topupRequest; | 573 | exports.topupRequest = topupRequest; |
560 | 574 |