Commit 8bf3f8ad67d451db665fb10323add079551e8cc6

Authored by Adhidarma Hadiwinoto
1 parent adfd804cea
Exists in master

menggunakan respon.response_code

Showing 1 changed file with 11 additions and 1 deletions Inline Diff

1 var url = require('url'); 1 var url = require('url');
2 var math = require('mathjs'); 2 var math = require('mathjs');
3 var request = require('request'); 3 var request = require('request');
4 var xml = require("xml2js").parseString; 4 var xml = require("xml2js").parseString;
5 var winston = require('winston'); 5 var winston = require('winston');
6 6
7 var logger; 7 var logger;
8 var config; 8 var config;
9 var callbackReport; 9 var callbackReport;
10 var aaa; 10 var aaa;
11 11
12 var max_retry = 15; 12 var max_retry = 15;
13 var sleep_before_retry = 60 * 1000; 13 var sleep_before_retry = 60 * 1000;
14 14
15 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 15 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
16 16
17 function parseSN(message, _config) { 17 function parseSN(message, _config) {
18 18
19 if (!_config) { 19 if (!_config) {
20 _config = config; 20 _config = config;
21 } 21 }
22 22
23 var sn_regex = new RegExp(_config.h2h_out.sn_pattern); 23 var sn_regex = new RegExp(_config.h2h_out.sn_pattern);
24 var sn_match = message.match(sn_regex); 24 var sn_match = message.match(sn_regex);
25 25
26 if (sn_match <= 0) { 26 if (sn_match <= 0) {
27 logger.info('SN Not found: ' + message); 27 logger.info('SN Not found: ' + message);
28 return ''; 28 return '';
29 } 29 }
30 30
31 var sn = sn_match[0]; 31 var sn = sn_match[0];
32 var sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator); 32 var sn_remove_patterns = _config.h2h_out.sn_remove_patterns.split(_config.h2h_out.sn_remove_patterns_separator);
33 33
34 var count = sn_remove_patterns.length; 34 var count = sn_remove_patterns.length;
35 35
36 for(var i = 0; i < count; i++) { 36 for(var i = 0; i < count; i++) {
37 sn = sn.replace(sn_remove_patterns[i], ''); 37 sn = sn.replace(sn_remove_patterns[i], '');
38 } 38 }
39 39
40 return sn.trim(); 40 return sn.trim();
41 } 41 }
42 42
43 function topupRequest(task, retry) { 43 function topupRequest(task, retry) {
44 /* 44 /*
45 if (config.globals.requests_count == undefined) { 45 if (config.globals.requests_count == undefined) {
46 config.globals.requests_count = 1; 46 config.globals.requests_count = 1;
47 } else { 47 } else {
48 config.globals.requests_count++; 48 config.globals.requests_count++;
49 } 49 }
50 50
51 if (config.globals.active_requests_count == undefined) { 51 if (config.globals.active_requests_count == undefined) {
52 config.globals.active_requests_count = 1; 52 config.globals.active_requests_count = 1;
53 } else { 53 } else {
54 config.globals.active_requests_count++; 54 config.globals.active_requests_count++;
55 } 55 }
56 56
57 if (config.globals.max_active_requests_count == undefined) { 57 if (config.globals.max_active_requests_count == undefined) {
58 config.globals.max_active_requests_count = config.globals.active_requests_count; 58 config.globals.max_active_requests_count = config.globals.active_requests_count;
59 } else { 59 } else {
60 config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count); 60 config.globals.max_active_requests_count = math.max(config.globals.max_active_requests_count, config.globals.active_requests_count);
61 } 61 }
62 */ 62 */
63 63
64 64
65 if (retry === undefined) { 65 if (retry === undefined) {
66 retry = max_retry; 66 retry = max_retry;
67 } 67 }
68 68
69 var params = { 69 var params = {
70 userid: config.h2h_out.userid, 70 userid: config.h2h_out.userid,
71 pwd: config.h2h_out.password, 71 pwd: config.h2h_out.password,
72 memberreff: task['requestId'], 72 memberreff: task['requestId'],
73 produk: task['remoteProduct'], 73 produk: task['remoteProduct'],
74 tujuan: task['destination'] 74 tujuan: task['destination']
75 }; 75 };
76 logger.info('Creating http request to gateway', {params: params}); 76 logger.info('Creating http request to gateway', {params: params});
77 77
78 request.post({url: config.h2h_out.partner, form: params}, function(err, httpResponse, httpResponseBody) { 78 request.post({url: config.h2h_out.partner, form: params}, function(err, httpResponse, httpResponseBody) {
79 79
80 /* 80 /*
81 config.globals.active_requests_count--; 81 config.globals.active_requests_count--;
82 */ 82 */
83 83
84 if (err) { 84 if (err) {
85 logger.warn('HTTP Request Error (' + task['requestId'] + '): ' + err); 85 logger.warn('HTTP Request Error (' + task['requestId'] + '): ' + err);
86 86
87 callbackReport(task['requestId'], '91', 'Gangguan koneksi ke suplier. ' + err); 87 callbackReport(task['requestId'], '91', 'Gangguan koneksi ke suplier. ' + err);
88 return; 88 return;
89 } 89 }
90 90
91 logger.verbose('Got response from gateway ', {response_body: httpResponseBody}); 91 logger.verbose('Got response from gateway ', {response_body: httpResponseBody});
92 92
93 if (httpResponseBody.indexOf('502 Proxy Error') >= 0) { 93 if (httpResponseBody.indexOf('502 Proxy Error') >= 0) {
94 logger.warn('Proxy error', {task: task, params: params}); 94 logger.warn('Proxy error', {task: task, params: params});
95 callbackReport(task['requestId'], '91', '502 Proxy error'); 95 callbackReport(task['requestId'], '91', '502 Proxy error');
96 return; 96 return;
97 } 97 }
98 98
99 xml(httpResponseBody, function(err, result) { 99 xml(httpResponseBody, function(err, result) {
100 if (err) { 100 if (err) {
101 logger.warn('Gagal parsing XML respon server', {task: task, params: params}); 101 logger.warn('Gagal parsing XML respon server', {task: task, params: params});
102 //topupRequest(task, retry - 1); 102 //topupRequest(task, retry - 1);
103 callbackReport(task['requestId'], '40', 'Gagal parsing XML pada respon server'); 103 callbackReport(task['requestId'], '40', 'Gagal parsing XML pada respon server');
104 return; 104 return;
105 } 105 }
106 106
107 logger.info('Response Data:', {result: result}); 107 logger.info('Response Data:', {result: result});
108 108
109 var message = result.respon.pesan[0].replace(/\n/g, ' '); 109 var message = result.respon.pesan[0].replace(/\n/g, ' ');
110 var response_code = result.respon.rc[0].replace(/^00/, ''); 110
111 var response_code = '68';
112 try {
113 response_code = result.respon.response_code[0].replace(/^00/, '');
114 }
115 catch(rc_error_on_parse) {
116
117 logger.warn('respon.response_code tidak terdefinisi, gunakan respon.rc');
118 response_code = result.respon.rc[0].replace(/^00/, '');
119
120 }
111 121
112 if (response_code == '54' || response_code == '68') { 122 if (response_code == '54' || response_code == '68') {
113 logger.warn('Mendapat status pending / suspect', {task: task, params: params}); 123 logger.warn('Mendapat status pending / suspect', {task: task, params: params});
114 if (retry) { 124 if (retry) {
115 callbackReport(task['requestId'], '68', message + '. Sistem akan mengirim advise dalam waktu ' + sleep_before_retry + ' ms.'); 125 callbackReport(task['requestId'], '68', message + '. Sistem akan mengirim advise dalam waktu ' + sleep_before_retry + ' ms.');
116 126
117 setTimeout(function() { 127 setTimeout(function() {
118 128
119 logger.info('Sending advice', {task: task}); 129 logger.info('Sending advice', {task: task});
120 130
121 task['remoteProduct'] = 'ADVPLN'; 131 task['remoteProduct'] = 'ADVPLN';
122 topupRequest(task, retry - 1); 132 topupRequest(task, retry - 1);
123 133
124 }, sleep_before_retry); 134 }, sleep_before_retry);
125 135
126 } else { 136 } else {
127 logger.warn('Max retries exceeded', {task: task}); 137 logger.warn('Max retries exceeded', {task: task});
128 callbackReport(task['requestId'], '40', message + '. Max retries exceeded'); 138 callbackReport(task['requestId'], '40', message + '. Max retries exceeded');
129 } 139 }
130 return; 140 return;
131 } 141 }
132 142
133 var token = ''; 143 var token = '';
134 if (result.respon.token) { 144 if (result.respon.token) {
135 token = result.respon.token[0]; 145 token = result.respon.token[0];
136 } 146 }
137 147
138 var data_pelanggan = 'NO-DATA'; 148 var data_pelanggan = 'NO-DATA';
139 if (result.respon.data) { 149 if (result.respon.data) {
140 150
141 try { 151 try {
142 var _data_pelanggan = result.respon.data[0].replace(/ /g, '-'); 152 var _data_pelanggan = result.respon.data[0].replace(/ /g, '-');
143 var fields = _data_pelanggan.split('/'); 153 var fields = _data_pelanggan.split('/');
144 154
145 data_pelanggan = [ 155 data_pelanggan = [
146 fields[0], fields[1], fields[2], fields[3] 156 fields[0], fields[1], fields[2], fields[3]
147 ].join('/'); 157 ].join('/');
148 } 158 }
149 catch(err) { 159 catch(err) {
150 logger.warn('Error parsing data pelanggan', {data_pelanggan: _data_pelanggan}); 160 logger.warn('Error parsing data pelanggan', {data_pelanggan: _data_pelanggan});
151 } 161 }
152 162
153 163
154 } 164 }
155 165
156 if (response_code == '00') { 166 if (response_code == '00') {
157 167
158 var sn = ""; 168 var sn = "";
159 169
160 if (config.h2h_out.parse_sn == 'YES') { 170 if (config.h2h_out.parse_sn == 'YES') {
161 sn = parseSN(message); 171 sn = parseSN(message);
162 } else if (token && data_pelanggan) { 172 } else if (token && data_pelanggan) {
163 sn = token + '/' + data_pelanggan; 173 sn = token + '/' + data_pelanggan;
164 } 174 }
165 175
166 message = 'SN=' + sn + '; ' + message; 176 message = 'SN=' + sn + '; ' + message;
167 } 177 }
168 178
169 callbackReport(task['requestId'], response_code, message); 179 callbackReport(task['requestId'], response_code, message);
170 180
171 }); 181 });
172 }); 182 });
173 } 183 }
174 184
175 function start(_config, _callbackReport, options) { 185 function start(_config, _callbackReport, options) {
176 config = _config; 186 config = _config;
177 callbackReport = _callbackReport; 187 callbackReport = _callbackReport;
178 188
179 if (options && options.aaa) { 189 if (options && options.aaa) {
180 aaa = options.aaa; 190 aaa = options.aaa;
181 } 191 }
182 192
183 if (options && options.logger) { 193 if (options && options.logger) {
184 logger = options.logger; 194 logger = options.logger;
185 } else { 195 } else {
186 logger = new winston.Logger({ 196 logger = new winston.Logger({
187 transports: [ 197 transports: [
188 new (winston.transports.Console)() 198 new (winston.transports.Console)()
189 ] 199 ]
190 }); 200 });
191 } 201 }
192 } 202 }
193 203
194 function parseResult(message) { 204 function parseResult(message) {
195 var data; 205 var data;
196 xml(message, function(err, result) { 206 xml(message, function(err, result) {
197 data = result; 207 data = result;
198 }); 208 });
199 return data; 209 return data;
200 } 210 }
201 211
202 exports.start = start; 212 exports.start = start;
203 exports.topupRequest = topupRequest; 213 exports.topupRequest = topupRequest;
204 exports.parseResult = parseResult; 214 exports.parseResult = parseResult;
205 exports.parseSN = parseSN; 215 exports.parseSN = parseSN;
206 216