Commit 1a3693b932cb2cb673a4e95302c9043d133d5683

Authored by Adhidarma Hadiwinoto
1 parent c2c05bde0e
Exists in master

gagal Nomer salah/Nomer Belum Aktif

Showing 1 changed file with 1 additions and 1 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'] = '40'; 73 value['RESPONSECODE'] = '40';
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 topupRequestHttpGet(task, retry) { 85 function topupRequestHttpGet(task, retry) {
86 86
87 var options = { 87 var options = {
88 method: 'GET', 88 method: 'GET',
89 url: config.h2h_out.partner, 89 url: config.h2h_out.partner,
90 qs: { 90 qs: {
91 id: config.h2h_out.userid, 91 id: config.h2h_out.userid,
92 pin: config.h2h_out.pin, 92 pin: config.h2h_out.pin,
93 user: config.h2h_out.user, 93 user: config.h2h_out.user,
94 pass: config.h2h_put.password, 94 pass: config.h2h_put.password,
95 kodeproduk: task.remoteProduct, 95 kodeproduk: task.remoteProduct,
96 tujuan: task.destination, 96 tujuan: task.destination,
97 idtrx: task.requestId 97 idtrx: task.requestId
98 } 98 }
99 } 99 }
100 100
101 request(options, function(err, res, body) { 101 request(options, function(err, res, body) {
102 }); 102 });
103 } 103 }
104 104
105 function topupRequestXMLRPC(task, retry) { 105 function topupRequestXMLRPC(task, retry) {
106 var partnerUrl = url.parse(config.h2h_out.partner); 106 var partnerUrl = url.parse(config.h2h_out.partner);
107 var clientOptions = { 107 var clientOptions = {
108 host: partnerUrl.hostname 108 host: partnerUrl.hostname
109 , port: partnerUrl.port 109 , port: partnerUrl.port
110 , path: partnerUrl.pathname 110 , path: partnerUrl.pathname
111 }; 111 };
112 logger.info('Preparing XMLRPC client options', {options: clientOptions}); 112 logger.info('Preparing XMLRPC client options', {options: clientOptions});
113 113
114 var client; 114 var client;
115 if (partnerUrl.protocol == 'https:') { 115 if (partnerUrl.protocol == 'https:') {
116 client = xmlrpc.createSecureClient(clientOptions); 116 client = xmlrpc.createSecureClient(clientOptions);
117 } else { 117 } else {
118 client = xmlrpc.createClient(clientOptions); 118 client = xmlrpc.createClient(clientOptions);
119 } 119 }
120 120
121 var params = { 121 var params = {
122 MSISDN: config.h2h_out.userid, 122 MSISDN: config.h2h_out.userid,
123 REQUESTID: task.requestId, 123 REQUESTID: task.requestId,
124 PIN: config.h2h_out.password, 124 PIN: config.h2h_out.password,
125 NOHP: task.destination, 125 NOHP: task.destination,
126 NOM: task.remoteProduct 126 NOM: task.remoteProduct
127 }; 127 };
128 128
129 var methodName = 'topUpRequest'; 129 var methodName = 'topUpRequest';
130 logger.info('Preparing XMLRPC client method', {methodname: methodName, params: params}); 130 logger.info('Preparing XMLRPC client method', {methodname: methodName, params: params});
131 131
132 client.methodCall(methodName, [ params ], function (error, value) { 132 client.methodCall(methodName, [ params ], function (error, value) {
133 // Results of the method response 133 // Results of the method response
134 if (error) { 134 if (error) {
135 135
136 logger.warn('XMLRPC Client Error', {requestId: task['requestId'], errorMessage: error}); 136 logger.warn('XMLRPC Client Error', {requestId: task['requestId'], errorMessage: error});
137 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date()); 137 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date());
138 var dummyValue = { 138 var dummyValue = {
139 MESSAGE: 'GENERATED: XMLRPC Client Error. ' + error, 139 MESSAGE: 'GENERATED: XMLRPC Client Error. ' + error,
140 RESPONSECODE: '68', 140 RESPONSECODE: '68',
141 REQUESTID: task.requestId, 141 REQUESTID: task.requestId,
142 } 142 }
143 143
144 try { 144 try {
145 dummyValue.HTTP_STATUS = error.res && error.res.statusCode; 145 dummyValue.HTTP_STATUS = error.res && error.res.statusCode;
146 dummyValue.RESPONSEBODY = error.body; 146 dummyValue.RESPONSEBODY = error.body;
147 } 147 }
148 catch(errRB) {} 148 catch(errRB) {}
149 149
150 if (retry) { 150 if (retry) {
151 151
152 dummyValue.MESSAGE = dummyValue.MESSAGE + '. Retrying (' + retry + ')'; 152 dummyValue.MESSAGE = dummyValue.MESSAGE + '. Retrying (' + retry + ')';
153 logger.info(dummyValue.MESSAGE); 153 logger.info(dummyValue.MESSAGE);
154 setTimeout(function() { 154 setTimeout(function() {
155 topupRequest(task, retry - 1); 155 topupRequest(task, retry - 1);
156 }, sleep_before_retry); 156 }, sleep_before_retry);
157 157
158 } else { 158 } else {
159 callbackReport(task['requestId'], '68', 'GENERATED: Silahkan resend. Gangguan koneksi ke suplier: ' + error); 159 callbackReport(task['requestId'], '68', 'GENERATED: Silahkan resend. Gangguan koneksi ke suplier: ' + error);
160 } 160 }
161 161
162 pushResponseToMongoDb( 162 pushResponseToMongoDb(
163 task, 163 task,
164 { 164 {
165 ts: responseTs, 165 ts: responseTs,
166 supplier: config.globals.gateway_name, 166 supplier: config.globals.gateway_name,
167 raw: JSON.stringify(dummyValue), 167 raw: JSON.stringify(dummyValue),
168 parsed: dummyValue 168 parsed: dummyValue
169 }, 169 },
170 '68' 170 '68'
171 ); 171 );
172 return; 172 return;
173 } 173 }
174 174
175 logger.info('Got XMLRPC response from partner for', {response_method: methodName, response_message: value}); 175 logger.info('Got XMLRPC response from partner for', {response_method: methodName, response_message: value});
176 176
177 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date()); 177 var responseTs = strftime('%Y-%m-%d %H:%M:%S', new Date());
178 178
179 /* 179 /*
180 if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') { 180 if (value['RESPONSECODE'] == '00' && config.h2h_out.parse_sn == 'YES') {
181 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE']; 181 value['MESSAGE'] = 'SN=' + parseSN(value['MESSAGE']) + '; ' + value['MESSAGE'];
182 } 182 }
183 */ 183 */
184 184
185 if (value['RESPONSECODE'] != '00' && value['RESPONSECODE'] != '68') { 185 if (value['RESPONSECODE'] != '00' && value['RESPONSECODE'] != '68') {
186 186
187 if (value['MESSAGE'].indexOf("Trx XL-AXIS NO SALAH") >= 0) { 187 if (value['MESSAGE'].indexOf("Trx XL-AXIS NO SALAH") >= 0) {
188 value['RESPONSECODE'] = '14'; 188 value['RESPONSECODE'] = '14';
189 } 189 }
190 else if (value['MESSAGE'].indexOf("Nomer salah/Nomer Belum Aktif") >= 0) { 190 else if (value['MESSAGE'].indexOf("gagal Nomer salah/Nomer Belum Aktif") >= 0) {
191 value['RESPONSECODE'] = '14'; 191 value['RESPONSECODE'] = '14';
192 } 192 }
193 else { 193 else {
194 value['RESPONSECODE'] = '40'; 194 value['RESPONSECODE'] = '40';
195 } 195 }
196 196
197 } 197 }
198 198
199 /* 199 /*
200 if (value['RESPONSECODE'] != '00') { 200 if (value['RESPONSECODE'] != '00') {
201 try { 201 try {
202 value['MESSAGE'] = value['MESSAGE'].replace(/\.;/, ';'); 202 value['MESSAGE'] = value['MESSAGE'].replace(/\.;/, ';');
203 } 203 }
204 catch(errReplaceDot) { } 204 catch(errReplaceDot) { }
205 205
206 } 206 }
207 */ 207 */
208 208
209 pushResponseToMongoDb(task, {ts: responseTs, supplier: config.globals.gateway_name, raw: JSON.stringify(value), parsed: value}, value['RESPONSECODE']); 209 pushResponseToMongoDb(task, {ts: responseTs, supplier: config.globals.gateway_name, raw: JSON.stringify(value), parsed: value}, value['RESPONSECODE']);
210 210
211 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']); 211 callbackReport(value['REQUESTID'], value['RESPONSECODE'], value['MESSAGE']);
212 }); 212 });
213 } 213 }
214 214
215 function topupRequest(task, retry) { 215 function topupRequest(task, retry) {
216 if (retry === undefined) { 216 if (retry === undefined) {
217 task.ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss'); 217 task.ts = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss');
218 task.ts_date = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD'); 218 task.ts_date = moment(task.timestamp, 'YYYYMMDDHHmmss').format('YYYY-MM-DD');
219 219
220 retry = max_retry; 220 retry = max_retry;
221 221
222 insertTaskToMongoDb(task); 222 insertTaskToMongoDb(task);
223 } 223 }
224 224
225 topupRequestXMLRPC(task, retry); 225 topupRequestXMLRPC(task, retry);
226 } 226 }
227 227
228 function initMongoClient() { 228 function initMongoClient() {
229 if (!config.mongodb || !config.mongodb.url) { 229 if (!config.mongodb || !config.mongodb.url) {
230 return; 230 return;
231 } 231 }
232 232
233 try { 233 try {
234 var url = config.mongodb.url; 234 var url = config.mongodb.url;
235 235
236 mongoClient.connect(url, function(err, db) { 236 mongoClient.connect(url, function(err, db) {
237 if (err) { 237 if (err) {
238 logger.warn('Failed to connect to mongodb', {err: err}); 238 logger.warn('Failed to connect to mongodb', {err: err});
239 return; 239 return;
240 } 240 }
241 mongodb = db; 241 mongodb = db;
242 logger.info('MongoDB connected'); 242 logger.info('MongoDB connected');
243 }); 243 });
244 } 244 }
245 catch(err) { 245 catch(err) {
246 logger.warn('Exception when connecting to mongodb', {err: err, url: url}); 246 logger.warn('Exception when connecting to mongodb', {err: err, url: url});
247 } 247 }
248 } 248 }
249 249
250 function isMongoReady() { 250 function isMongoReady() {
251 if (!config.mongodb) { return; } 251 if (!config.mongodb) { return; }
252 if (!config.mongodb.collection) { return; } 252 if (!config.mongodb.collection) { return; }
253 if (!mongodb) { return; } 253 if (!mongodb) { return; }
254 254
255 return true; 255 return true;
256 } 256 }
257 257
258 function insertTaskToMongoDb(task) { 258 function insertTaskToMongoDb(task) {
259 if (!isMongoReady()) { return; } 259 if (!isMongoReady()) { return; }
260 260
261 task.supplier = config.globals.gateway_name; 261 task.supplier = config.globals.gateway_name;
262 task.rc = '68'; 262 task.rc = '68';
263 263
264 try { 264 try {
265 mongodb.collection(config.mongodb.collection).insertOne(task); 265 mongodb.collection(config.mongodb.collection).insertOne(task);
266 } 266 }
267 catch(err) { 267 catch(err) {
268 //logger.warn('Exception when inserting document to mongodb', {err: err, task: task}); 268 //logger.warn('Exception when inserting document to mongodb', {err: err, task: task});
269 } 269 }
270 } 270 }
271 271
272 function pushResponseToMongoDb(task, response, rc) { 272 function pushResponseToMongoDb(task, response, rc) {
273 if (!isMongoReady()) { return; } 273 if (!isMongoReady()) { return; }
274 274
275 try { 275 try {
276 mongodb.collection(config.mongodb.collection).updateOne( 276 mongodb.collection(config.mongodb.collection).updateOne(
277 {requestId: task.requestId}, 277 {requestId: task.requestId},
278 { 278 {
279 $set: { 279 $set: {
280 lastResponse: response, 280 lastResponse: response,
281 supplier: config.globals.gateway_name, 281 supplier: config.globals.gateway_name,
282 rc: rc 282 rc: rc
283 }, 283 },
284 $push: { 284 $push: {
285 responses: response 285 responses: response
286 } 286 }
287 }, 287 },
288 function(err, result) { 288 function(err, result) {
289 if (err) { 289 if (err) {
290 logger.warn('Error when pushing response to mongodb', {err: err, task: task, response: response}); 290 logger.warn('Error when pushing response to mongodb', {err: err, task: task, response: response});
291 return; 291 return;
292 } 292 }
293 } 293 }
294 ); 294 );
295 } 295 }
296 catch(err) { 296 catch(err) {
297 logger.warn('Exception when pushing response to mongodb', {err: err, task: task, response: response}); 297 logger.warn('Exception when pushing response to mongodb', {err: err, task: task, response: response});
298 } 298 }
299 } 299 }
300 300
301 exports.start = start; 301 exports.start = start;
302 exports.topupRequest = topupRequest; 302 exports.topupRequest = topupRequest;
303 303