Commit 44e20fba3a724d68b6a21bbfd5ef9e7688a1b768

Authored by Adhidarma Hadiwinoto
1 parent 23feb712c5
Exists in master

GAGAL NOMER SALAH

Showing 1 changed file with 3 additions and 0 deletions Inline Diff

1 var winston = require('winston'); 1 var winston = require('winston');
2 var request = require('request'); 2 var request = require('request');
3 var xmlrpc = require('xmlrpc'); 3 var xmlrpc = require('xmlrpc');
4 var url = require('url'); 4 var url = require('url');
5 var http = require('http'); 5 var http = require('http');
6 var mongoClient = require('mongodb').MongoClient; 6 var mongoClient = require('mongodb').MongoClient;
7 var strftime = require('strftime'); 7 var strftime = require('strftime');
8 var moment = require('moment'); 8 var moment = require('moment');
9 9
10 var max_retry = 6; 10 var max_retry = 6;
11 var sleep_before_retry = 10000; 11 var sleep_before_retry = 10000;
12 12
13 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 13 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
14 14
15 var config; 15 var config;
16 var callbackReport; 16 var callbackReport;
17 var aaa; 17 var aaa;
18 var logger; 18 var logger;
19 var options; 19 var options;
20 var mongodb; 20 var mongodb;
21 21
22 function start(_config, _callbackReport, options) { 22 function start(_config, _callbackReport, options) {
23 config = _config; 23 config = _config;
24 callbackReport = _callbackReport 24 callbackReport = _callbackReport
25 25
26 if (options && options.aaa) { 26 if (options && options.aaa) {
27 aaa = options.aaa; 27 aaa = options.aaa;
28 } 28 }
29 29
30 if (options && options.logger) { 30 if (options && options.logger) {
31 logger = options.logger; 31 logger = options.logger;
32 } else { 32 } else {
33 logger = new winston.Logger({ 33 logger = new winston.Logger({
34 transports: [ 34 transports: [
35 new (winston.transports.Console)() 35 new (winston.transports.Console)()
36 ] 36 ]
37 }); 37 });
38 } 38 }
39 39
40 createXMLRPCServer(); 40 createXMLRPCServer();
41 initMongoClient(); 41 initMongoClient();
42 } 42 }
43 43
44 function createXMLRPCServer() { 44 function createXMLRPCServer() {
45 45
46 logger.info('Creating XML-RPC server on port ' + config.h2h_out.listen_port); 46 logger.info('Creating XML-RPC server on port ' + config.h2h_out.listen_port);
47 var serverOptions = { 47 var serverOptions = {
48 port: config.h2h_out.listen_port 48 port: config.h2h_out.listen_port
49 }; 49 };
50 50
51 var server = xmlrpc.createServer(serverOptions); 51 var server = xmlrpc.createServer(serverOptions);
52 52
53 server.on('NotFound', function (method, params) { 53 server.on('NotFound', function (method, params) {
54 logger.warn('Unknown method recevied on XMLRPC server', {xmlrpc_method: method, xmlrpc_params: params}); 54 logger.warn('Unknown method recevied on XMLRPC server', {xmlrpc_method: method, xmlrpc_params: params});
55 }); 55 });
56 56
57 server.on('topUpReport', function (err, params, callback) { 57 server.on('topUpReport', function (err, params, callback) {
58 58
59 logger.info('Got XMLRPC topUpReport request from partner', {xmlrpc_method: 'topUpReport', xmlrpc_params: params}); 59 logger.info('Got XMLRPC topUpReport request from partner', {xmlrpc_method: 'topUpReport', xmlrpc_params: params});
60 60
61 var paramscount = params.length; 61 var paramscount = params.length;
62 for (var i = 0; i < paramscount; i++) { 62 for (var i = 0; i < paramscount; i++) {
63 var value = params[i]; 63 var value = params[i];
64 64
65 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date()); 65 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date());
66 var dummyTask = { requestId: value.REQUESTID }; 66 var dummyTask = { requestId: value.REQUESTID };
67 67
68 if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') { 68 if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') {
69 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE']; 69 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE'];
70 } 70 }
71 71
72 if (value['RESPONSECODE'] != '00' && value['RESPONSECODE'] != '68') { 72 if (value['RESPONSECODE'] != '00' && value['RESPONSECODE'] != '68') {
73 value['RESPONSECODE'] = getResponseCodeByMessage(value['MESSAGE']); 73 value['RESPONSECODE'] = getResponseCodeByMessage(value['MESSAGE']);
74 } 74 }
75 75
76 pushResponseToMongoDb(dummyTask, {ts: responseTs, supplier: config.globals.gateway_name, raw: JSON.stringify(value), parsed: value}, value['RESPONSECODE']); 76 pushResponseToMongoDb(dummyTask, {ts: responseTs, supplier: config.globals.gateway_name, raw: JSON.stringify(value), parsed: value}, value['RESPONSECODE']);
77 77
78 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']); 78 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']);
79 } 79 }
80 80
81 callback(null, 'ACK REPORT OK'); 81 callback(null, 'ACK REPORT OK');
82 }) 82 })
83 } 83 }
84 84
85 function getResponseCodeByMessage(msg) { 85 function getResponseCodeByMessage(msg) {
86 if (msg.indexOf("Trx XL-AXIS NO SALAH") >= 0) { 86 if (msg.indexOf("Trx XL-AXIS NO SALAH") >= 0) {
87 return '14'; 87 return '14';
88 } 88 }
89 else if (msg.indexOf("gagal Nomer salah/Nomer Belum Aktif") >= 0) { 89 else if (msg.indexOf("gagal Nomer salah/Nomer Belum Aktif") >= 0) {
90 return '14'; 90 return '14';
91 } 91 }
92 else if (msg.indexOf("GAGAL NOMER SALAH") >= 0) { 92 else if (msg.indexOf("GAGAL NOMER SALAH") >= 0) {
93 return '14'; 93 return '14';
94 } 94 }
95 else if (msg.indexOf("GAGAL NOMER SALAH") >= 0) {
96 return '14';
97 }
95 else { 98 else {
96 return '40' 99 return '40'
97 } 100 }
98 } 101 }
99 102
100 function topupRequestHttpGet(task, retry) { 103 function topupRequestHttpGet(task, retry) {
101 104
102 var options = { 105 var options = {
103 method: 'GET', 106 method: 'GET',
104 url: config.h2h_out.partner, 107 url: config.h2h_out.partner,
105 qs: { 108 qs: {
106 id: config.h2h_out.userid, 109 id: config.h2h_out.userid,
107 pin: config.h2h_out.pin, 110 pin: config.h2h_out.pin,
108 user: config.h2h_out.user, 111 user: config.h2h_out.user,
109 pass: config.h2h_put.password, 112 pass: config.h2h_put.password,
110 kodeproduk: task.remoteProduct, 113 kodeproduk: task.remoteProduct,
111 tujuan: task.destination, 114 tujuan: task.destination,
112 idtrx: task.requestId 115 idtrx: task.requestId
113 } 116 }
114 } 117 }
115 118
116 request(options, function(err, res, body) { 119 request(options, function(err, res, body) {
117 }); 120 });
118 } 121 }
119 122
120 function topupRequestXMLRPC(task, retry) { 123 function topupRequestXMLRPC(task, retry) {
121 var partnerUrl = url.parse(config.h2h_out.partner); 124 var partnerUrl = url.parse(config.h2h_out.partner);
122 var clientOptions = { 125 var clientOptions = {
123 host: partnerUrl.hostname 126 host: partnerUrl.hostname
124 , port: partnerUrl.port 127 , port: partnerUrl.port
125 , path: partnerUrl.pathname 128 , path: partnerUrl.pathname
126 }; 129 };
127 logger.info('Preparing XMLRPC client options', {options: clientOptions}); 130 logger.info('Preparing XMLRPC client options', {options: clientOptions});
128 131
129 var client; 132 var client;
130 if (partnerUrl.protocol == 'https:') { 133 if (partnerUrl.protocol == 'https:') {
131 client = xmlrpc.createSecureClient(clientOptions); 134 client = xmlrpc.createSecureClient(clientOptions);
132 } else { 135 } else {
133 client = xmlrpc.createClient(clientOptions); 136 client = xmlrpc.createClient(clientOptions);
134 } 137 }
135 138
136 var params = { 139 var params = {
137 MSISDN: config.h2h_out.userid, 140 MSISDN: config.h2h_out.userid,
138 REQUESTID: task.requestId, 141 REQUESTID: task.requestId,
139 PIN: config.h2h_out.password, 142 PIN: config.h2h_out.password,
140 NOHP: task.destination, 143 NOHP: task.destination,
141 NOM: task.remoteProduct 144 NOM: task.remoteProduct
142 }; 145 };
143 146
144 var methodName = 'topUpRequest'; 147 var methodName = 'topUpRequest';
145 logger.info('Preparing XMLRPC client method', {methodname: methodName, params: params}); 148 logger.info('Preparing XMLRPC client method', {methodname: methodName, params: params});
146 149
147 client.methodCall(methodName, [ params ], function (error, value) { 150 client.methodCall(methodName, [ params ], function (error, value) {
148 // Results of the method response 151 // Results of the method response
149 if (error) { 152 if (error) {
150 153
151 logger.warn('XMLRPC Client Error', {requestId: task['requestId'], errorMessage: error}); 154 logger.warn('XMLRPC Client Error', {requestId: task['requestId'], errorMessage: error});
152 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date()); 155 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date());
153 var dummyValue = { 156 var dummyValue = {
154 MESSAGE: 'GENERATED: XMLRPC Client Error. ' + error, 157 MESSAGE: 'GENERATED: XMLRPC Client Error. ' + error,
155 RESPONSECODE: '68', 158 RESPONSECODE: '68',
156 REQUESTID: task.requestId, 159 REQUESTID: task.requestId,
157 } 160 }
158 161
159 try { 162 try {
160 dummyValue.HTTP_STATUS = error.res && error.res.statusCode; 163 dummyValue.HTTP_STATUS = error.res && error.res.statusCode;
161 dummyValue.RESPONSEBODY = error.body; 164 dummyValue.RESPONSEBODY = error.body;
162 } 165 }
163 catch(errRB) {} 166 catch(errRB) {}
164 167
165 if (retry) { 168 if (retry) {
166 169
167 dummyValue.MESSAGE = dummyValue.MESSAGE + '. Retrying (' + retry + ')'; 170 dummyValue.MESSAGE = dummyValue.MESSAGE + '. Retrying (' + retry + ')';
168 logger.info(dummyValue.MESSAGE); 171 logger.info(dummyValue.MESSAGE);
169 setTimeout(function() { 172 setTimeout(function() {
170 topupRequest(task, retry - 1); 173 topupRequest(task, retry - 1);
171 }, sleep_before_retry); 174 }, sleep_before_retry);
172 175
173 } else { 176 } else {
174 callbackReport(task['requestId'], '68', 'GENERATED: Silahkan resend. Gangguan koneksi ke suplier: ' + error); 177 callbackReport(task['requestId'], '68', 'GENERATED: Silahkan resend. Gangguan koneksi ke suplier: ' + error);
175 } 178 }
176 179
177 pushResponseToMongoDb( 180 pushResponseToMongoDb(
178 task, 181 task,
179 { 182 {
180 ts: responseTs, 183 ts: responseTs,
181 supplier: config.globals.gateway_name, 184 supplier: config.globals.gateway_name,
182 raw: JSON.stringify(dummyValue), 185 raw: JSON.stringify(dummyValue),
183 parsed: dummyValue 186 parsed: dummyValue
184 }, 187 },
185 '68' 188 '68'
186 ); 189 );
187 return; 190 return;
188 } 191 }
189 192
190 logger.info('Got XMLRPC response from partner for', {response_method: methodName, response_message: value}); 193 logger.info('Got XMLRPC response from partner for', {response_method: methodName, response_message: value});
191 194
192 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date()); 195 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date());
193 196
194 /* 197 /*
195 if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') { 198 if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') {
196 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE']; 199 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE'];
197 } 200 }
198 */ 201 */
199 202
200 if (value['RESPONSECODE'] != '00' && value['RESPONSECODE'] != '68') { 203 if (value['RESPONSECODE'] != '00' && value['RESPONSECODE'] != '68') {
201 value['RESPONSECODE'] = getResponseCodeByMessage(value['MESSAGE']); 204 value['RESPONSECODE'] = getResponseCodeByMessage(value['MESSAGE']);
202 } 205 }
203 206
204 /* 207 /*
205 if (value['RESPONSECODE'] != '00') { 208 if (value['RESPONSECODE'] != '00') {
206 try { 209 try {
207 value['MESSAGE'] = value['MESSAGE'].replace(/\.;/, ';'); 210 value['MESSAGE'] = value['MESSAGE'].replace(/\.;/, ';');
208 } 211 }
209 catch(errReplaceDot) { } 212 catch(errReplaceDot) { }
210 213
211 } 214 }
212 */ 215 */
213 216
214 pushResponseToMongoDb(task, {ts: responseTs, supplier: config.globals.gateway_name, raw: JSON.stringify(value), parsed: value}, value['RESPONSECODE']); 217 pushResponseToMongoDb(task, {ts: responseTs, supplier: config.globals.gateway_name, raw: JSON.stringify(value), parsed: value}, value['RESPONSECODE']);
215 218
216 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']); 219 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']);
217 }); 220 });
218 } 221 }
219 222
220 function topupRequest(task, retry) { 223 function topupRequest(task, retry) {
221 if (retry === undefined) { 224 if (retry === undefined) {
222 task.ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss'); 225 task.ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss');
223 task.ts_date = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD'); 226 task.ts_date = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD');
224 227
225 retry = max_retry; 228 retry = max_retry;
226 229
227 insertTaskToMongoDb(task); 230 insertTaskToMongoDb(task);
228 } 231 }
229 232
230 topupRequestXMLRPC(task, retry); 233 topupRequestXMLRPC(task, retry);
231 } 234 }
232 235
233 function initMongoClient() { 236 function initMongoClient() {
234 if (!config.mongodb || !config.mongodb.url) { 237 if (!config.mongodb || !config.mongodb.url) {
235 return; 238 return;
236 } 239 }
237 240
238 try { 241 try {
239 var url = config.mongodb.url; 242 var url = config.mongodb.url;
240 243
241 mongoClient.connect(url, function(err, db) { 244 mongoClient.connect(url, function(err, db) {
242 if (err) { 245 if (err) {
243 logger.warn('Failed to connect to mongodb', {err: err}); 246 logger.warn('Failed to connect to mongodb', {err: err});
244 return; 247 return;
245 } 248 }
246 mongodb = db; 249 mongodb = db;
247 logger.info('MongoDB connected'); 250 logger.info('MongoDB connected');
248 }); 251 });
249 } 252 }
250 catch(err) { 253 catch(err) {
251 logger.warn('Exception when connecting to mongodb', {err: err, url: url}); 254 logger.warn('Exception when connecting to mongodb', {err: err, url: url});
252 } 255 }
253 } 256 }
254 257
255 function isMongoReady() { 258 function isMongoReady() {
256 if (!config.mongodb) { return; } 259 if (!config.mongodb) { return; }
257 if (!config.mongodb.collection) { return; } 260 if (!config.mongodb.collection) { return; }
258 if (!mongodb) { return; } 261 if (!mongodb) { return; }
259 262
260 return true; 263 return true;
261 } 264 }
262 265
263 function insertTaskToMongoDb(task) { 266 function insertTaskToMongoDb(task) {
264 if (!isMongoReady()) { return; } 267 if (!isMongoReady()) { return; }
265 268
266 task.supplier = config.globals.gateway_name; 269 task.supplier = config.globals.gateway_name;
267 task.rc = '68'; 270 task.rc = '68';
268 271
269 try { 272 try {
270 mongodb.collection(config.mongodb.collection).insertOne(task); 273 mongodb.collection(config.mongodb.collection).insertOne(task);
271 } 274 }
272 catch(err) { 275 catch(err) {
273 //logger.warn('Exception when inserting document to mongodb', {err: err, task: task}); 276 //logger.warn('Exception when inserting document to mongodb', {err: err, task: task});
274 } 277 }
275 } 278 }
276 279
277 function pushResponseToMongoDb(task, response, rc) { 280 function pushResponseToMongoDb(task, response, rc) {
278 if (!isMongoReady()) { return; } 281 if (!isMongoReady()) { return; }
279 282
280 try { 283 try {
281 mongodb.collection(config.mongodb.collection).updateOne( 284 mongodb.collection(config.mongodb.collection).updateOne(
282 {requestId: task.requestId}, 285 {requestId: task.requestId},
283 { 286 {
284 $set: { 287 $set: {
285 lastResponse: response, 288 lastResponse: response,
286 supplier: config.globals.gateway_name, 289 supplier: config.globals.gateway_name,
287 rc: rc 290 rc: rc
288 }, 291 },
289 $push: { 292 $push: {
290 responses: response 293 responses: response
291 } 294 }
292 }, 295 },
293 function(err, result) { 296 function(err, result) {
294 if (err) { 297 if (err) {
295 logger.warn('Error when pushing response to mongodb', {err: err, task: task, response: response}); 298 logger.warn('Error when pushing response to mongodb', {err: err, task: task, response: response});
296 return; 299 return;
297 } 300 }
298 } 301 }
299 ); 302 );
300 } 303 }
301 catch(err) { 304 catch(err) {
302 logger.warn('Exception when pushing response to mongodb', {err: err, task: task, response: response}); 305 logger.warn('Exception when pushing response to mongodb', {err: err, task: task, response: response});
303 } 306 }
304 } 307 }
305 308
306 exports.start = start; 309 exports.start = start;
307 exports.topupRequest = topupRequest; 310 exports.topupRequest = topupRequest;
308 311