Skip to content

Commit 0604e09

Browse files
Merge pull request #3417 from ColoredCow/feature/comment-parsing-logic
#3416 Different parsing logics for different banks.
2 parents 6b491b3 + 34b9e1c commit 0604e09

File tree

3 files changed

+146
-22
lines changed

3 files changed

+146
-22
lines changed

.env.example

+5-1
Original file line numberDiff line numberDiff line change
@@ -115,4 +115,8 @@ CAMPAIGNS_CLIENT_ID=
115115

116116
DB_TEST_DATABASE=portal_test
117117
DB_TEST_USERNAME='root'
118-
DB_TEST_PASSWORD='root'
118+
DB_TEST_PASSWORD='root'
119+
120+
# Add bank statement strings to detect the bank name
121+
CITI_BANK_MESSAGE_PATTERN=
122+
AXIS_BANK_MESSAGE_PATTERN=

Modules/Invoice/Config/config.php

+11
Original file line numberDiff line numberDiff line change
@@ -170,4 +170,15 @@
170170
'projects' => [],
171171
],
172172
],
173+
174+
'bank_message_patterns' => [
175+
'citi' => [
176+
'key' => 'citi',
177+
'value' => env('CITI_BANK_MESSAGE_PATTERN'),
178+
],
179+
'axis' => [
180+
'key' => 'axis',
181+
'value' => env('AXIS_BANK_MESSAGE_PATTERN'),
182+
],
183+
],
173184
];

Modules/Invoice/Resources/views/subviews/edit/invoice-details.blade.php

+130-21
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,12 @@
138138
v-model='bankCharges' required="required">
139139
</div>
140140
</div>
141-
141+
142142
<div class="form-group" v-if="this.client.type !== 'indian'">
143143
<div class="d-flex">
144-
<label for="client_id" class="mr-4 pt-1 field-required">Conversion Rate Diff:</label>
145-
<input type="number" class="form-control w-272 ml-auto" step="0.01"
146-
name="conversion_rate_diff" v-model='conversionRateDiff' required="required">
144+
<label for="conversion_rate" class="mr-4 pt-1">Current Conversion Rate:</label>
145+
<input type="number" id="currentConversionRate" class="form-control w-272 ml-auto" step="0.01"
146+
name="current_conversion_rate" value="{{$currencyService->getCurrentRatesInINR()}}" disabled>
147147
</div>
148148
</div>
149149

@@ -155,10 +155,19 @@
155155
</div>
156156
</div>
157157

158+
<div class="form-group" v-if="this.client.type !== 'indian'">
159+
<div class="d-flex">
160+
<label for="client_id" class="mr-4 pt-1 field-required">Conversion Rate Diff:</label>
161+
<input type="number" class="form-control w-272 ml-auto" step="0.01"
162+
name="conversion_rate_diff" v-model='conversionRateDiff' required="required">
163+
</div>
164+
</div>
165+
158166
<div class="form-group ">
159167
<label for="comments">Comments</label>
160168
<textarea name="comments" id="paidInvoiceComment" rows="5" class="form-control" @keyup="parseComment($event)"
161169
v-model="comments"></textarea>
170+
<div id="bank-not-found" class="text-theme-orange fz-14 leading-20 font-weight-bold"></div>
162171
</div>
163172

164173
</div>
@@ -201,7 +210,9 @@
201210

202211

203212
@section('js_scripts')
204-
<script>
213+
@php $bank_message_patterns = (config('invoice.bank_message_patterns')); @endphp
214+
<script>
215+
let bank_message_patterns = @json($bank_message_patterns);
205216
new Vue({
206217
el: '#edit_invoice_details_form',
207218
@@ -247,26 +258,126 @@
247258
this.show_on_select = false
248259
}
249260
},
261+
262+
// Comment parsing logic for different banks.
263+
citiBankParser(comment) {
264+
extractedNumberList = comment.split(" ").map(function(word) {
265+
var number = word.trim().replaceAll(",", "")
266+
if (number == 0 || isNaN(number)) {
267+
return null;
268+
}
269+
return Number(number);
270+
});
271+
272+
var filteredNumberList = extractedNumberList.filter(function(number) {
273+
return number != null
274+
});
275+
276+
this.updatePaymentAmountDetails(filteredNumberList, bank = bank_message_patterns.citi.key);
277+
},
278+
279+
axisBankParser(comment) {
280+
extractedNumberList = comment.split(/[\/\s]/g).map(function(word) {
281+
var number = word.trim().replace(/,\s/, "")
282+
if (number == 0 || isNaN(number)) {
283+
return null;
284+
}
285+
return Number(number);
286+
});
287+
288+
var filteredNumberList = extractedNumberList.filter(function(number) {
289+
return number != null
290+
});
291+
292+
this.updatePaymentAmountDetails(filteredNumberList, bank = bank_message_patterns.axis.key);
293+
294+
},
295+
296+
//Calculate percentage of matching string
297+
showMatchingPercentage(comment, bankPattern){
298+
var tmpValue = 0;
299+
var maxLength = comment.length;
300+
var minLength = bankPattern.length;
301+
if(comment.length > bankPattern.length){
302+
var minLength = bankPattern.length;
303+
}
304+
for(var i = 0; i < minLength; i++) {
305+
if(comment[i] == bankPattern[i]) {
306+
tmpValue++;
307+
}
308+
}
309+
var percent = (tmpValue / maxLength) * 100;
310+
return (percent);
311+
},
312+
313+
defaultParser(comment, bank_message_patterns) {
314+
let bankWithMaxSimilarityPercentages = {}
315+
for(let bankName in bank_message_patterns) {
316+
let result = this.showMatchingPercentage(comment, bank_message_patterns[bankName].value)
317+
bankWithMaxSimilarityPercentages[bank_message_patterns[bankName].key] = result;
318+
}
319+
bankWithMaxSimilarityPercentages = Object.keys(bankWithMaxSimilarityPercentages).reduce((a, b) => bankWithMaxSimilarityPercentages[a] > bankWithMaxSimilarityPercentages[b] ? a : b);
320+
321+
switch (bankWithMaxSimilarityPercentages) {
322+
case bank_message_patterns.citi.key:
323+
this.citiBankParser(comment);
324+
break;
325+
case bank_message_patterns.axis.key:
326+
this.axisBankParser(comment);
327+
break;
328+
}
329+
},
250330
251331
parseComment($event) {
252332
let comment = event.target.value
253-
254-
extractedNumberList = comment.split(" ").map(function(word) {
255-
var number = Number(word.trim().replaceAll(",", ""))
256-
if (isNaN(number)) {
257-
return null;
333+
formattedComment = comment.replace(/\s/g, ""); // Variable for storing the formatted comment string so that we can match it with the stored bank patterns
334+
335+
// Extracting the paid amount according to the bank transaction pattern string.
336+
var bank = null;
337+
for(let bankName in bank_message_patterns) {
338+
if (formattedComment.includes(bank_message_patterns[bankName].value)) {
339+
bank = bank_message_patterns[bankName].key;
340+
}
341+
}
342+
// Showing message if bank statement does not match any exising bank pattern
343+
if (bank || !comment) {
344+
document.getElementById("bank-not-found").innerHTML = null ;
345+
} else {
346+
document.getElementById("bank-not-found").innerHTML = 'The bank statement does not match existing patterns. Trying to give the best possible result.' ;
258347
}
259-
return number;
260-
});
261348
262-
var filteredNumberList = extractedNumberList.filter(function(number) {
263-
return number != null;
264-
});
349+
switch (bank) {
350+
case bank_message_patterns.citi.key:
351+
this.citiBankParser(comment);
352+
break;
353+
354+
case bank_message_patterns.axis.key:
355+
this.axisBankParser(comment);
356+
break;
357+
358+
default:
359+
this.defaultParser(comment, bank_message_patterns);
360+
break;
361+
}
362+
363+
},
265364
266-
this.updatePaymentAmountDetails(filteredNumberList)
365+
setBankConversionRate(filtered_number_list, index, bank) {
366+
conversionRate = filtered_number_list[index]
367+
switch (bank) {
368+
case bank_message_patterns.axis.key:
369+
this.conversionRate = conversionRate / this.amountPaid;
370+
this.conversionRateDiff = Math.abs(this.currentExchangeRate - this.conversionRate).toFixed(2)
371+
break;
372+
373+
default:
374+
this.conversionRate = conversionRate;
375+
this.conversionRateDiff = Math.abs(this.currentExchangeRate - this.conversionRate).toFixed(2)
376+
break;
377+
}
267378
},
268379
269-
updatePaymentAmountDetails(filtered_number_list) {
380+
updatePaymentAmountDetails(filtered_number_list, bank) {
270381
let totalNumbersInList = filtered_number_list.length
271382
var emailBody = $("#emailBody").text();
272383
@@ -286,10 +397,8 @@
286397
$('#amountPaid').val(this.amountPaid)
287398
emailBody = emailBody.replace(this.amountPaidText, this.amountPaid);
288399
this.calculateTaxes()
289-
} else if (index == 1) {
290-
conversionRate = filtered_number_list[index]
291-
this.conversionRate = conversionRate
292-
this.conversionRateDiff = Math.abs(this.currentExchangeRate - conversionRate).toFixed(2)
400+
} else if (index == totalNumbersInList-1) {
401+
this.setBankConversionRate(filtered_number_list, index, bank);
293402
}
294403
}
295404

0 commit comments

Comments
 (0)