NotesWhat is notes.io?

Notes brand slogan

Notes - notes.io

package com.scraper.agents.claim.web;

import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.highradius.common.util.HRCLog;
import com.highradius.common.util.HRCLogFactory;
import com.highradius.util.cpa.StringConstants;
import com.scraper.agents.base.BaseAgent;
import com.scraper.agents.base.ClaimAgent;
import com.scraper.agents.base.PDFtoTEXTConverter2;
import com.scraper.agents.base.Util;
import com.scraper.cpa.AgentException;
import com.scraper.cpa.Browser;
import com.scraper.cpa.FieldValuesSet;
import com.scraper.cpa.FormField;
import com.scraper.cpa.Node;
import com.scraper.cpa.PostNavigation;
import com.scraper.cpa.Request;
import com.scraper.cpa.Response;

/**
* @author anshuman.raut
*
*/
/*
* Navigation
* Login-> click on Supplier Support -> Login Again -> Click on Invoices -> Search for invoice Number ->
* Click on Invoice Number -> Click on View -> Click on attachment link to download.
*
*/

public class ClaimLCBONewAgent extends ClaimAgent{

protected static final String SUPPLIERPORTAL="supplierPortal";
protected static final String PAYMENTS="payments";
protected static final HRCLog LOG = HRCLogFactory.getLog(ClaimLCBOAgent.class);
protected static final String BASEURL="https://www.lcbonet.com";
protected static final String LOGIN2="login2";
protected static final String ACCESSIBILITY="ACCESSIBILITY";
protected static final String FORMSUBMITBUTTON="FORMSUBMITBUTTON";
protected static final String USERNAMEFIELD="USERNAMEFIELD";
protected static final String PASSKEYFIELD="PASSWORDFIELD";
protected static final String FORMEVENT="FORMEVENT";
protected static final String INVOICESEARCH="invoiceSearch";
protected static final String SEARCHINVOICENUM="SEARCHINVOICENUM";
protected static final String ATTACHMENT="attachment";
protected static final String SERVERVALIDATE="SERVERVALIDATE";
protected static final String INVOICEID="INVOICEID";
protected static final String ATTACHSTYLE="ATTACHSTYLE";
protected static final String INVOICECLICK="invoiceClick";
protected static final String VIEWCLICK="clickView";
protected static final String FORMDATASTR="FORMDATASTR";
protected static final String POSTFIXSID="POSTFIXSID";
protected static final String POSTLOGIN1="postlogin1";
protected static final String POSTLOGIN="postlogin";
protected static final String DOWNLOAD="download";
protected static final String ATTACHKEY="ATTACHKEY";
protected static final String OADOWNLOAD="OADOWNLOAD";
protected static final String SOURCE1="SOURCE1";
protected Map<String, String> invoiceNoCheckNumberMap = new HashMap<>();
protected Map<String, String> checkNoCheckDateMap = new HashMap<>();
protected DecimalFormat numberDecimalFormat = new DecimalFormat("0.00");

@Override
protected void login(Browser browser, FieldValuesSet fieldValuesSet)
throws AgentException {
try {
this.navigate(browser, fieldValuesSet, PRELOGIN);
try {
this.navigate(browser, fieldValuesSet, LOGIN);
}catch(Exception e) {
Matcher matcher=getMatches(browser, "You have reached the maximum number of open user", null);
if(matcher.find()) {
matcher=getMatches(browser, "FormDataStr"\s*value="([^"]+)", null);
if(matcher.find()) {
fieldValuesSet.getFieldValues(POSTLOGIN1).setField(FORMDATASTR, getMatcherGroupData(matcher, 1));
}
matcher=getMatches(browser, "postfixSID\"\s*value=\"([^\"]+)", null);
if(matcher.find()) {
fieldValuesSet.getFieldValues(POSTLOGIN1).setField(POSTFIXSID, getMatcherGroupData(matcher, 1));
}
this.navigate(browser, fieldValuesSet, POSTLOGIN1);
}
}
Matcher matcher=getMatches(browser, "There are already other user sessions in progress", null);
if(matcher.find()) {
matcher=getMatches(browser, "FormDataStr"\s*value="([^"]+)", null);
if(matcher.find()) {
fieldValuesSet.getFieldValues(POSTLOGIN).setField(FORMDATASTR, getMatcherGroupData(matcher, 1));
}
this.navigate(browser, fieldValuesSet, POSTLOGIN);
}
}catch(Exception e) {
LOG.debug("Exeption occurred while logging into the portal"+e.getMessage(),e);
}
}

@Override
protected String processClaimRequest(Browser browser,FieldValuesSet fieldValuesSet, Request request, Node claimResponseNode, Response claimResponse){
String processingStatus = FAILED;
String url=null;
String invoiceNumber=null;
String randomNum = Util.getRandomNum(request, CLAIM_FILE);
String filePdfNameConvention = StringConstants.UNDERSCORE + randomNum + this.pdfNameConvention;
String username=fieldValuesSet.getFieldValues(LOGIN).getField("LOGIN");
String passkey=fieldValuesSet.getFieldValues(LOGIN).getField("PASSWORD");
Node claimItems=null;
this.fullyQualifiedClaimFileName=null;
try {
invoiceNumber = request.getRequestMetaData().getDataKeyValue();
String claimCost= request.getRequestAttributes().get(CLAIM_COST);
String claimDate= request.getRequestAttributes().get(CLAIM_DATE);
String currency= request.getRequestAttributes().get(CURRENCY);
String dealId= request.getRequestAttributes().get(DEAL_ID);

this.navigate(browser, fieldValuesSet, SUPPLIERPORTAL);
Matcher matcher = getMatches(browser, "FORM_SUBMIT_BUTTON':'([^']+)'.*?Login</button>", null);
if(matcher.find()) {
fieldValuesSet.getFieldValues(LOGIN2).setField(FORMSUBMITBUTTON, getMatcherGroupData(matcher, 1));
}
matcher = getMatches(browser, "name="Accessibility"><option selected value="([^"]+)"", null);
if(matcher.find()) {
fieldValuesSet.getFieldValues(LOGIN2).setField(ACCESSIBILITY, getMatcherGroupData(matcher, 1));
}
fieldValuesSet.getFieldValues(LOGIN2).setField(USERNAMEFIELD, username);
fieldValuesSet.getFieldValues(LOGIN2).setField(PASSKEYFIELD, passkey);
dynamicFormFields(browser,LOGIN2);
matcher = getMatches(browser, "action="([^"]+)"", null);
if(matcher.find()) {
url=BASEURL+getMatcherGroupData(matcher, 1);
}
this.navigate(browser, fieldValuesSet, LOGIN2, url);
matcher = getMatches(browser, "Invoices" href="([^"]+)">Invoices", null);
if(matcher.find()) {
url=BASEURL+"/OA_HTML/"+getMatcherGroupData(matcher, 1);
}
this.navigate(browser, fieldValuesSet, PAYMENTS, url);
fieldValuesSet.getFieldValues(INVOICESEARCH).setField(SEARCHINVOICENUM, invoiceNumber);
matcher=getMatches(browser, "FORM_SUBMIT_BUTTON':'([^']+)'}\);return\s*false"\s*type="submit">Go</button>", null);
if(matcher.find()) {
fieldValuesSet.getFieldValues(INVOICESEARCH).setField(FORMSUBMITBUTTON, getMatcherGroupData(matcher, 1));
}
dynamicFormFields(browser,INVOICESEARCH);
matcher=getMatches(browser, "action="([^"]+)", null);
if(matcher.find()) {
url=BASEURL+getMatcherGroupData(matcher,1);
}
this.navigate(browser, fieldValuesSet, INVOICESEARCH, url);
String invoiceSearchResp=browser.getDocument();
matcher=getMatches(browser, "title=""+invoiceNumber+""\s*href="([^"]+)", null);
if(matcher.find()) {
url=BASEURL+"/OA_HTML/"+getMatcherGroupData(matcher, 1);
}
this.navigate(browser, fieldValuesSet, INVOICECLICK, url);
matcher=getMatches(browser, "View\s*</a>", null);
if(!matcher.find()) {
aggregateData(ClaimAgent.INVOICE_NUMBER, invoiceNumber, claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CLAIM_NUMBER, invoiceNumber, claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CLAIM_DATE, claimDate, claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CLAIM_COST, claimCost, claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CURRENCY, currency, claimResponseNode, claimResponse);
aggregateData(ClaimAgent.DEAL_ID, dealId, claimResponseNode, claimResponse);
return CLAIM_DOC_NOT_EXISTS;
}else {
matcher=getMatches(browser, "href="#"\s*onclick="submitForm.*?INVOICE_ID':'([^']+).*?>View\s*</a>", null);
if(matcher.find()) {
fieldValuesSet.getFieldValues(VIEWCLICK).setField(INVOICEID, getMatcherGroupData(matcher, 1));
}
matcher=getMatches(browser, "href="#"\s*onclick="submitForm.*?_FORMEVENT':'([^']+).*?>View\s*</a>", null);
if(matcher.find()) {
String temp=getMatcherGroupData(matcher, 1);
temp=temp.replaceAll("&amp;", StringConstants.AMPERSAND);
fieldValuesSet.getFieldValues(VIEWCLICK).setField(FORMEVENT, temp);
}
matcher=getMatches(browser, "href="#"\s*onclick="submitForm.*?attachStyleParam':'([^']+).*?>View\s*</a>", null);
if(matcher.find()) {
fieldValuesSet.getFieldValues(VIEWCLICK).setField(ATTACHSTYLE, getMatcherGroupData(matcher, 1));
}

matcher=getMatches(browser, "href="#"\s*onclick="submitForm.*?serverValidate':'([^']+).*?>View\s*</a>", null);
if(matcher.find()) {
fieldValuesSet.getFieldValues(VIEWCLICK).setField(SERVERVALIDATE, getMatcherGroupData(matcher, 1));
}
dynamicFormFields2(browser, VIEWCLICK);
matcher=getMatches(browser, "action="([^"]+)", null);
if(matcher.find()) {
url=BASEURL+getMatcherGroupData(matcher, 1);
}
this.navigate(browser, fieldValuesSet, VIEWCLICK, url);

matcher=getMatches(browser, "href="#"\s*onclick="submitForm.*?_FORMEVENT':'([^']+).*?>", null);
if(matcher.find()) {
String temp=getMatcherGroupData(matcher, 1);
temp=temp.replaceAll("&amp;", StringConstants.AMPERSAND);
fieldValuesSet.getFieldValues(DOWNLOAD).setField(FORMEVENT, temp);
}
matcher=getMatches(browser, "href="#"\s*onclick="submitForm.*?serverValidate':'([^']+).*?>", null);
if(matcher.find()) {
fieldValuesSet.getFieldValues(DOWNLOAD).setField(SERVERVALIDATE, getMatcherGroupData(matcher, 1));
}
matcher=getMatches(browser, "href="#"\s*onclick="submitForm.*?source:'([^']+).*?>", null);
if(matcher.find()) {
fieldValuesSet.getFieldValues(DOWNLOAD).setField(SOURCE1, getMatcherGroupData(matcher, 1));
}
matcher=getMatches(browser, "href="#"\s*onclick="submitForm.*?AttachRegKeyNext':'([^']+).*?>", null);
if(matcher.find()) {
fieldValuesSet.getFieldValues(DOWNLOAD).setField(ATTACHKEY, getMatcherGroupData(matcher, 1));
}
matcher=getMatches(browser, "href="#"\s*onclick="submitForm.*?oaDownloadBeanExists':'([^']+).*?>", null);
if(matcher.find()) {
fieldValuesSet.getFieldValues(DOWNLOAD).setField(OADOWNLOAD, getMatcherGroupData(matcher, 1));
}
dynamicFormFields2(browser, DOWNLOAD);
matcher=getMatches(browser, "action="([^"]+)", null);
if(matcher.find()) {
url=BASEURL+getMatcherGroupData(matcher, 1);
}
this.navigate(browser, fieldValuesSet, DOWNLOAD, url);
String response=browser.getDocument();

if(response.startsWith(StringConstants.PDF_IDENTIFIER)){
this.saveClaimDocument(browser, this.physicalDIRPathLocal, invoiceNumber+StringConstants.UNDERSCORE + filePdfNameConvention, null);
this.fullyQualifiedClaimFileName=this.virtualDIRPath+invoiceNumber+StringConstants.UNDERSCORE + filePdfNameConvention;
aggregateData(ClaimAgent.CLAIM_FILE, this.fullyQualifiedClaimFileName, claimResponseNode, claimResponse);
processingStatus=SUCCESS;
String pdfText=PDFtoTEXTConverter2.getTextFromPdf(this.physicalDIRPathLocal+invoiceNumber+StringConstants.UNDERSCORE + filePdfNameConvention);
Matcher Format4Matcher=getMatches(null,"(OVER\s*\/\s*SHORT\s*LANDED\s*RECEIPTS)",pdfText);
if(invoiceNumber.startsWith("015") || invoiceNumber.startsWith("DVS")) {
parseClaimAttributesForFormat_2(request,pdfText,claimResponseNode, claimResponse, claimItems, invoiceNumber);
}else if(invoiceNumber.startsWith("QA")) {
parseClaimAttributesForFormat_3(request,pdfText,claimResponseNode, claimResponse, claimItems, invoiceNumber);
}else if(invoiceNumber.startsWith("LF")) {
parseClaimAttributesForFormat_6(request,pdfText,claimResponseNode, claimResponse, claimItems, invoiceNumber,invoiceSearchResp);
}else if(invoiceNumber.startsWith("PA")) {
parseClaimAttributesForFormat_1(request,pdfText,claimResponseNode, claimResponse, claimItems, invoiceNumber);
}else if(Format4Matcher.find()) {
parseClaimAttributesForFormat_4(request,pdfText,claimResponseNode, claimResponse, claimItems, invoiceNumber);
}
claimItems = new Node(CLAIM_ITEMS);
}
}
}catch(Exception e) {
LOG.debug("Exeption occured while processing status of "+invoiceNumber+":"+e.getMessage(),e);
}
return processingStatus;
}

protected void parseClaimAttributesForFormat_1(Request request, String pdfText, Node claimResponseNode, Response claimResponse, Node claimItems, String invoiceNumber) {
aggregateData(ClaimAgent.INVOICE_NUMBER, invoiceNumber, claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CLAIM_NUMBER, invoiceNumber, claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CLAIM_DATE, request.getRequestAttributes().get(CLAIM_DATE), claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CLAIM_COST, request.getRequestAttributes().get(CLAIM_COST), claimResponseNode, claimResponse);
Matcher netAmountMatcher = getMatches(null,"SUBTOTAL[:]*\s*([^\n]+)",pdfText);
if(netAmountMatcher.find()) {
aggregateData(ClaimAgent.NET_AMOUNT,getMatcherGroupData(netAmountMatcher,1), claimResponseNode, claimResponse);
}
Matcher taxAmountMatcher = getMatches(null,"HST\s*:.*?(\$[\d\.\,]+)",pdfText);
if(taxAmountMatcher.find()) {
aggregateData(ClaimAgent.TAX_AMOUNT,getMatcherGroupData(taxAmountMatcher,1), claimResponseNode, claimResponse);
}
aggregateData(ClaimAgent.CLAIMAINT_NAME,"LCBO", claimResponseNode, claimResponse);
Matcher fomat1EntifierMatcher = getMatches(null,"(Exchange\s*Rate\s*\-\s*Rebate)",pdfText);

Matcher vendorIDMatcher = getMatches(null,"Vendor\s*\#*\:*\s*(\d+)",pdfText);
if(vendorIDMatcher.find()) {
aggregateData(ClaimAgent.VENDOR_ID,getMatcherGroupData(vendorIDMatcher,1), claimResponseNode, claimResponse);
}
Matcher vendorNameMatcher = getMatches(null,"Vendor.*?Invoice\s*Date[^\n]+\s*(.*?)Invoice\s*Number",pdfText);
if(vendorNameMatcher.find()) {
aggregateData(ClaimAgent.VENDOR_NAME,getMatcherGroupData(vendorNameMatcher,1).trim(), claimResponseNode, claimResponse);
}
if(fomat1EntifierMatcher.find()) {
aggregateData(ClaimAgent.REASON_DESC, "REBATE DEBIT NOTE", claimResponseNode, claimResponse);
aggregateData(ClaimAgent.DOCUMENT_TYPE,"Rebate Debit Note", claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CLAIM_FORMAT,"LCBO_Format1.1", claimResponseNode, claimResponse);
}else {
aggregateData(ClaimAgent.REASON_DESC, "SUPPLIER DELIST SALE", claimResponseNode, claimResponse);
aggregateData(ClaimAgent.DOCUMENT_TYPE,"Debit Note", claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CLAIM_FORMAT,"LCBO_Format1", claimResponseNode, claimResponse);
}
Matcher notesMatcher = getMatches(null,"Invoice\s*Terms.*?(As\s*authorized.*?)\n",pdfText);
if(notesMatcher.find()) {
aggregateData(ClaimAgent.VENDOR_NAME,getMatcherGroupData(notesMatcher,1).trim(), claimResponseNode, claimResponse);
}
aggregateData(ClaimAgent.CURRENCY, request.getRequestAttributes().get(CURRENCY), claimResponseNode, claimResponse);

Matcher invoiceDateMatcher = getMatches(null,"Invoice\s*Date:\s*([^\n]+)",pdfText);
if(invoiceDateMatcher.find()) {
aggregateData(ClaimAgent.INVOICE_DATE,getMatcherGroupData(invoiceDateMatcher,1), claimResponseNode, claimResponse);
}
Matcher parentItemMatcherFormat1=getMatches(null,"LCBO\s*Item.*?Total\s*(.*?)subtotal\s*[:]",pdfText);
if(parentItemMatcherFormat1.find()) {
Node claimItem = null;
int slNum = 0;
String itemRegex="(\d+)\s*(\d+\.\d+)\s*([\$\.\d]+)\s*([\$\.\d]+)\s*([\$\.\,\d]+)";
Matcher itemMatcher = getMatches(pdfText, itemRegex);
while(itemMatcher.find()) {
claimItem = new Node(ClaimAgent.CLAIM_ITEM);
aggregateData(ClaimAgent.CLAIMITEM_SL_NUM, String.valueOf(++slNum), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_CUSTOMER_ITEM_NUMBER,BaseAgent.getMatcherGroupData(itemMatcher, 1), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_CLAIM_QUANTITY,BaseAgent.getMatcherGroupData(itemMatcher, 2), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_UNIT_COST,BaseAgent.getMatcherGroupData(itemMatcher, 4), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_NET_AMOUNT,BaseAgent.getMatcherGroupData(itemMatcher, 5), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_EXTENDED_COST,BaseAgent.getMatcherGroupData(itemMatcher, 5), claimItem, claimResponse);
claimItems.addChild(claimItem);
}

}else {
Node claimItem = null;
int slNum = 0;
String itemRegex="\s*(\d+\-\d+)\s*([\d\.]+)\s*([\d\.]+)\s*([\$\d\.]+)\s*([\d\.]+)\s*(\d+)\s*([\$\d\.\,]+)";
Matcher itemMatcher = getMatches(pdfText, itemRegex);
while(itemMatcher.find()) {
claimItem = new Node(ClaimAgent.CLAIM_ITEM);
aggregateData(ClaimAgent.CLAIMITEM_SL_NUM, String.valueOf(++slNum), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_PO_NUMBER,BaseAgent.getMatcherGroupData(itemMatcher, 1), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_CLAIM_QUANTITY,BaseAgent.getMatcherGroupData(itemMatcher, 6), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_UNIT_COST,BaseAgent.getMatcherGroupData(itemMatcher, 5), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_NET_AMOUNT,BaseAgent.getMatcherGroupData(itemMatcher, 7), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_EXTENDED_COST,BaseAgent.getMatcherGroupData(itemMatcher, 7), claimItem, claimResponse);
claimItems.addChild(claimItem);
}
}
}

protected void parseClaimAttributesForFormat_2(Request request, String pdfText, Node claimResponseNode, Response claimResponse, Node claimItems, String invoiceNumber) {
Matcher netAmountMatcher = getMatches(null,"SUB\s*TOTAL.*?([\d\,\.]+)",pdfText);
Matcher taxAmountMatcher = getMatches(null,"HST\s*:.*?([\d\.\,]+)",pdfText);
Matcher docTypeMatcher = getMatches(null,"([\w]+).*?Date",pdfText);
Matcher vendorNameMatcher = getMatches(null,"Invoice\s*Terms[^\n]+\s*([^\n]+)",pdfText);
Matcher invoiceDateMatcher = getMatches(null,"Invoice\s*Date:\s*([^\n]+)",pdfText);
aggregateData(ClaimAgent.INVOICE_NUMBER, invoiceNumber, claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CLAIM_NUMBER, invoiceNumber, claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CLAIM_DATE, request.getRequestAttributes().get(CLAIM_DATE), claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CLAIM_COST, request.getRequestAttributes().get(CLAIM_COST), claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CURRENCY, request.getRequestAttributes().get(CURRENCY), claimResponseNode, claimResponse);
aggregateData(ClaimAgent.DEAL_ID, request.getRequestAttributes().get(DEAL_ID), claimResponseNode, claimResponse);

if(netAmountMatcher.find()) {
aggregateData(ClaimAgent.NET_AMOUNT,getMatcherGroupData(netAmountMatcher,1), claimResponseNode, claimResponse);
}
if(taxAmountMatcher.find()) {
aggregateData(ClaimAgent.TAX_AMOUNT,getMatcherGroupData(taxAmountMatcher,1), claimResponseNode, claimResponse);
}
aggregateData(ClaimAgent.CLAIMAINT_NAME,"LCBO", claimResponseNode, claimResponse);
if(docTypeMatcher.find()) {
aggregateData(ClaimAgent.DOCUMENT_TYPE,getMatcherGroupData(docTypeMatcher,1), claimResponseNode, claimResponse);
}

if(vendorNameMatcher.find()) {
aggregateData(ClaimAgent.VENDOR_NAME,getMatcherGroupData(vendorNameMatcher,1), claimResponseNode, claimResponse);
}
aggregateData(ClaimAgent.CLAIM_FORMAT,"LCBO_Format2", claimResponseNode, claimResponse);
if(invoiceDateMatcher.find()) {
aggregateData(ClaimAgent.INVOICE_DATE,getMatcherGroupData(invoiceDateMatcher,1), claimResponseNode, claimResponse);
}

Node claimItem = null;
int slNum = 0;
String itemRegex="\n\s*\d+\s+([\w\s\']+)\s{10}\s*(\d+)\s+([\d.,]+)\s+([\d.,]+)";
Matcher itemMatcher = getMatches(pdfText, itemRegex);
while(itemMatcher.find()) {
claimItem = new Node(ClaimAgent.CLAIM_ITEM);
aggregateData(ClaimAgent.CLAIMITEM_SL_NUM, String.valueOf(++slNum), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_ITEM_DESCRIPTION, BaseAgent.getMatcherGroupData(itemMatcher, 1).replaceAll("(.*?\d+)", ""), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_CLAIM_QUANTITY, BaseAgent.getMatcherGroupData(itemMatcher, 2), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_UNIT_COST, BaseAgent.getMatcherGroupData(itemMatcher, 3), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_EXTENDED_COST, BaseAgent.getMatcherGroupData(itemMatcher, 4), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_NET_AMOUNT, BaseAgent.getMatcherGroupData(itemMatcher, 4), claimItem, claimResponse);
claimItems.addChild(claimItem);
}
}

protected void parseClaimAttributesForFormat_3(Request request, String pdfText, Node claimResponseNode, Response claimResponse, Node claimItems, String invoiceNumber) {
Matcher netAmountMatcher = getMatches(null,"SUB\s*TOTAL.*?([\d\,\.]+)",pdfText);
Matcher taxAmountMatcher = getMatches(null,"HST\s*:.*?([\d\.\,]+)",pdfText);
Matcher reasonDescMatcher = getMatches(null,"(Quality\s*ASSURANCE)",pdfText);
Matcher docTypeMatcher = getMatches(null,"(Quality\s*ASSURANCE\s*INVOICE)",pdfText);
Matcher vendorIDMatcher = getMatches(null,"Invoice\s*Terms:.*?\(#\s*([\d\.\,]+)",pdfText);
Matcher vendorNameMatcher = getMatches(null,"Invoice\s*Terms:[^\n]+\s*(.*?)\(",pdfText);
Matcher invoiceDateMatcher = getMatches(null,"Invoice\s*Date:\s*([^\n]+)",pdfText);
aggregateData(ClaimAgent.INVOICE_NUMBER, invoiceNumber, claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CLAIM_NUMBER, invoiceNumber, claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CLAIM_DATE, request.getRequestAttributes().get(CLAIM_DATE), claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CLAIM_COST, request.getRequestAttributes().get(CLAIM_COST), claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CURRENCY, request.getRequestAttributes().get(CURRENCY), claimResponseNode, claimResponse);
aggregateData(ClaimAgent.DEAL_ID, request.getRequestAttributes().get(DEAL_ID), claimResponseNode, claimResponse);

if(netAmountMatcher.find()) {
aggregateData(ClaimAgent.NET_AMOUNT,getMatcherGroupData(netAmountMatcher,1), claimResponseNode, claimResponse);
}
if(taxAmountMatcher.find()) {
aggregateData(ClaimAgent.TAX_AMOUNT,getMatcherGroupData(taxAmountMatcher,1), claimResponseNode, claimResponse);
}
if(reasonDescMatcher.find()) {
aggregateData(ClaimAgent.REASON_DESC,getMatcherGroupData(reasonDescMatcher,1), claimResponseNode, claimResponse);
}
aggregateData(ClaimAgent.CLAIMAINT_NAME,"LCBO", claimResponseNode, claimResponse);

if(docTypeMatcher.find()) {
aggregateData(ClaimAgent.DOCUMENT_TYPE,getMatcherGroupData(docTypeMatcher,1), claimResponseNode, claimResponse);
}
if(vendorIDMatcher.find()) {
aggregateData(ClaimAgent.VENDOR_ID,getMatcherGroupData(vendorIDMatcher,1), claimResponseNode, claimResponse);
}
if(vendorNameMatcher.find()) {
aggregateData(ClaimAgent.VENDOR_NAME,getMatcherGroupData(vendorNameMatcher,1), claimResponseNode, claimResponse);
}
aggregateData(ClaimAgent.CLAIM_FORMAT,"LCBO_Format3", claimResponseNode, claimResponse);
if(invoiceDateMatcher.find()) {
aggregateData(ClaimAgent.INVOICE_DATE,getMatcherGroupData(invoiceDateMatcher,1), claimResponseNode, claimResponse);
}

Node claimItem = null;
int slNum = 0;
String itemRegex="\n\s*([^\s]+)\s+([\w-]+)\s+([^\s]+)\s+(\d+)\s+(\d+-\w+-\d+)\s+(.*?)\s{5}\s+([\d,.]+)\s+([\d.,]+)\s+([\d.,]+)";
Matcher itemMatcher = getMatches(pdfText, itemRegex);
while(itemMatcher.find()) {
claimItem = new Node(ClaimAgent.CLAIM_ITEM);
aggregateData(ClaimAgent.CLAIMITEM_SL_NUM, String.valueOf(++slNum), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_ITEM_NUMBER,BaseAgent.getMatcherGroupData(itemMatcher, 2), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_ITEM_DESCRIPTION,BaseAgent.getMatcherGroupData(itemMatcher, 3), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_REASON_CODE,BaseAgent.getMatcherGroupData(itemMatcher, 1), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_REASON_DESC,BaseAgent.getMatcherGroupData(itemMatcher, 6), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_CLAIM_QUANTITY,BaseAgent.getMatcherGroupData(itemMatcher, 7), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_UNIT_COST,BaseAgent.getMatcherGroupData(itemMatcher, 8), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_NET_AMOUNT,BaseAgent.getMatcherGroupData(itemMatcher, 9), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_EXTENDED_COST,BaseAgent.getMatcherGroupData(itemMatcher, 9), claimItem, claimResponse);
claimItems.addChild(claimItem);
}
}
protected void parseClaimAttributesForFormat_4(Request request, String pdfText, Node claimResponseNode, Response claimResponse, Node claimItems, String invoiceNumber) {
aggregateData(ClaimAgent.INVOICE_NUMBER, invoiceNumber, claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CLAIM_NUMBER, invoiceNumber, claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CLAIM_DATE, request.getRequestAttributes().get(CLAIM_DATE), claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CLAIM_COST, request.getRequestAttributes().get(CLAIM_COST), claimResponseNode, claimResponse);

Matcher netAmountMatcher = getMatches(null,"Cost\s*of\s*Goods\s*([\$\.\,\d\(\)]+).*?Freight\s*([\$\.\,\d\(\)]+).*?Bottle\s*Deposit\s*([\$\.\,\d\(\)]+)",pdfText);
if(netAmountMatcher.find()) {
Double netAmount=Double.parseDouble(cleanAmount(getMatcherGroupData(netAmountMatcher,1)))+Double.parseDouble(cleanAmount(getMatcherGroupData(netAmountMatcher,2)))+Double.parseDouble(cleanAmount(getMatcherGroupData(netAmountMatcher,3)));
aggregateData(ClaimAgent.NET_AMOUNT,Util.getDecimalFormattedNumber(numberDecimalFormat,netAmount), claimResponseNode, claimResponse);
}

Matcher taxAmountMatcher = getMatches(null,"Duties\s*([\$\.\d\(\)]+).*?Excise\s*([\$\.\d\(\)]+).*?HST\/GST\s*([\$\.\d\(\)]+)",pdfText);
if(taxAmountMatcher.find()) {
Double taxAmount=Double.parseDouble(cleanAmount(getMatcherGroupData(taxAmountMatcher,1)))+Double.parseDouble(cleanAmount(getMatcherGroupData(taxAmountMatcher,2)))+Double.parseDouble(cleanAmount(getMatcherGroupData(taxAmountMatcher,3)));
aggregateData(ClaimAgent.TAX_AMOUNT,Util.getDecimalFormattedNumber(numberDecimalFormat,taxAmount), claimResponseNode, claimResponse);
}
Matcher reasonDescMatcher = getMatches(null,"(OVER\s*\/\s*SHORT\s*LANDED\s*RECEIPTS)",pdfText);
if(reasonDescMatcher.find()) {
aggregateData(ClaimAgent.REASON_DESC,getMatcherGroupData(reasonDescMatcher,1), claimResponseNode, claimResponse);
}
aggregateData(ClaimAgent.CLAIMAINT_NAME,"LCBO", claimResponseNode, claimResponse);

Matcher docTypeMatcher = getMatches(null,"Date\s*\w+\s*.*?\s{20,}(.*?)\s{3,}",pdfText);
if(docTypeMatcher.find()) {
aggregateData(ClaimAgent.DOCUMENT_TYPE,getMatcherGroupData(docTypeMatcher,1), claimResponseNode, claimResponse);
}
Matcher vendorIDNameMatcher = getMatches(null,"vendor\s*(\d+)\s*\-*\s*(.*?)\s{10,}",pdfText);
if(vendorIDNameMatcher.find()) {
aggregateData(ClaimAgent.VENDOR_ID,getMatcherGroupData(vendorIDNameMatcher,1), claimResponseNode, claimResponse);
aggregateData(ClaimAgent.VENDOR_NAME,getMatcherGroupData(vendorIDNameMatcher,2), claimResponseNode, claimResponse);
}
Matcher notesMatcher = getMatches(null,"notes\s*\:\s*(.*?)^\n",pdfText);
if(notesMatcher.find()) {
aggregateData(ClaimAgent.NOTES,getMatcherGroupData(notesMatcher,1), claimResponseNode, claimResponse);
}
Matcher taxRateMatcher = getMatches(null,"tax\s*Rate\:\s*([\d\.\,]+)\s*\%\s*Receiving\s*Date",pdfText);
if(taxRateMatcher.find()) {
aggregateData(ClaimAgent.TAX_RATE,getMatcherGroupData(taxRateMatcher,1), claimResponseNode, claimResponse);
}
Matcher poNumberMatcher = getMatches(null,"Po\s*No\#*\:*\s*(\d+)",pdfText);
if(poNumberMatcher.find()) {
aggregateData(ClaimAgent.PO_NUMBER,getMatcherGroupData(poNumberMatcher,1), claimResponseNode, claimResponse);
}
aggregateData(ClaimAgent.CLAIM_FORMAT,"LCBO_Format4", claimResponseNode, claimResponse);
Matcher allowanceMatcher = getMatches(null,"Freight\s*([\$\.\,\d\(\)]+)",pdfText);
if(allowanceMatcher.find()) {
aggregateData(ClaimAgent.ALLOWANCE,getMatcherGroupData(allowanceMatcher,1), claimResponseNode, claimResponse);
}
Matcher allowance1Matcher = getMatches(null,"Bottle\s*Deposit\s*([\$\.\,\d\(\)]+)",pdfText);
if(allowance1Matcher.find()) {
aggregateData(ClaimAgent.ALLOWANCE1,getMatcherGroupData(allowance1Matcher,1), claimResponseNode, claimResponse);
}
aggregateData(ClaimAgent.CURRENCY, request.getRequestAttributes().get(CURRENCY), claimResponseNode, claimResponse);
Matcher itemParentMatcher = getMatches(pdfText, "HST(.*?)For\s*LCBO\s*A\/P");
if(itemParentMatcher.find()) {
Node claimItem = null;
int slNum = 0;
String itemRegex="([\d]+)\s*([\d]+)\s*([\d]+)\s*([\-,\d]+)\s*([\$\.\,\d\(\)]+)\s*([\$\.\d\(\)]+)\s*([\$\.\d\(\)]+)\s*([\$\.\d\(\)]+)\s*([\$\.\d\(\)]+)\s*([\$\.\d\(\)]+)";
Matcher itemMatcher = getMatches(getMatcherGroupData(itemParentMatcher,1), itemRegex);
while(itemMatcher.find()) {
claimItem = new Node(ClaimAgent.CLAIM_ITEM);
aggregateData(ClaimAgent.CLAIMITEM_SL_NUM, String.valueOf(++slNum), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_ITEM_NUMBER,BaseAgent.getMatcherGroupData(itemMatcher, 1), claimItem, claimResponse);
if(BaseAgent.getMatcherGroupData(itemMatcher, 3).equalsIgnoreCase(BaseAgent.getMatcherGroupData(itemMatcher, 2))) {
aggregateData(ClaimAgent.CLAIMITEM_CLAIM_QUANTITY,BaseAgent.getMatcherGroupData(itemMatcher, 3), claimItem, claimResponse);
}else {
aggregateData(ClaimAgent.CLAIMITEM_CLAIM_QUANTITY,BaseAgent.getMatcherGroupData(itemMatcher, 4).replace("-", ""), claimItem, claimResponse);
}
aggregateData(ClaimAgent.CLAIMITEM_RECIEVED_QTY,BaseAgent.getMatcherGroupData(itemMatcher, 3), claimItem, claimResponse);
aggregateData(ClaimAgent.CLAIMITEM_INVOICE_QTY,BaseAgent.getMatcherGroupData(itemMatcher, 2), claimItem, claimResponse);
Double claimItemNetAmount=Double.parseDouble(cleanAmount(BaseAgent.getMatcherGroupData(itemMatcher, 6)))+Double.parseDouble(cleanAmount(BaseAgent.getMatcherGroupData(itemMatcher, 5)))+Double.parseDouble(cleanAmount(BaseAgent.getMatcherGroupData(itemMatcher, 7)));
aggregateData(ClaimAgent.CLAIMITEM_NET_AMOUNT,Util.getDecimalFormattedNumber(numberDecimalFormat,claimItemNetAmount), claimItem, claimResponse);
Double claimItemTaxAmount=Double.parseDouble(cleanAmount(BaseAgent.getMatcherGroupData(itemMatcher, 8)))+Double.parseDouble(cleanAmount(BaseAgent.getMatcherGroupData(itemMatcher, 9)))+Double.parseDouble(cleanAmount(BaseAgent.getMatcherGroupData(itemMatcher, 10)));
aggregateData(ClaimAgent.CLAIMITEM_ITEM_TAX_AMOUNT,Util.getDecimalFormattedNumber(numberDecimalFormat,claimItemTaxAmount), claimItem, claimResponse);
Double extendedCost=claimItemNetAmount+claimItemTaxAmount;
aggregateData(ClaimAgent.CLAIMITEM_EXTENDED_COST,Util.getDecimalFormattedNumber(numberDecimalFormat,extendedCost), claimItem, claimResponse);
claimItems.addChild(claimItem);
}
}
}
protected void parseClaimAttributesForFormat_6(Request request, String pdfText, Node claimResponseNode, Response claimResponse, Node claimItems, String invoiceNumber,String invoiceSearchResp) {

Matcher claimCostMatcher=getMatches(null,"Analysis\s*cost\:*\s*\$*\s*([\d\,\.]+)",pdfText);
Matcher docTypeMatcher = getMatches(null,"INVOICE\#.*?\n\s*([^\n]+)",pdfText);
Matcher notesMatcher = getMatches(null,"Description[:]*\d*\s*([^\n]+)",pdfText);
Matcher poNumberMatcher = getMatches(null,"P.O.\/Reference[:]*\s*([^\n]+)",pdfText);
Matcher checkNumberMatcher = getMatches(null,"Payment\s*Status\"\>Paid.*?title\=\"(\d+)",invoiceSearchResp);
Matcher vendorIDMatcher = getMatches(null,"Vendor\s*Number[:]*\s*([^\n]+)",pdfText);
aggregateData(ClaimAgent.INVOICE_NUMBER, invoiceNumber, claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CLAIM_NUMBER, invoiceNumber, claimResponseNode, claimResponse);
aggregateData(ClaimAgent.CLAIM_DATE, request.getRequestAttributes().get(CLAIM_DATE), claimResponseNode, claimResponse);
aggregateData(ClaimAgent.REASON_DESC, request.getRequestAttributes().get(REASON_DESC), claimResponseNode, claimResponse);

if(docTypeMatcher.find()) {
aggregateData(ClaimAgent.DOCUMENT_TYPE,getMatcherGroupData(docTypeMatcher,1), claimResponseNode, claimResponse);
}
if(vendorIDMatcher.find()) {
aggregateData(ClaimAgent.VENDOR_ID,getMatcherGroupData(vendorIDMatcher,1), claimResponseNode, claimResponse);
}
if(checkNumberMatcher.find()) {
aggregateData(ClaimAgent.CHECK_NUMBER,getMatcherGroupData(checkNumberMatcher,1), claimResponseNode, claimResponse);
}
aggregateData(ClaimAgent.CLAIMAINT_NAME,"LCBO", claimResponseNode, claimResponse);
if(notesMatcher.find()) {
aggregateData(ClaimAgent.NOTES,getMatcherGroupData(notesMatcher,1), claimResponseNode, claimResponse);
}
if(poNumberMatcher.find()) {
aggregateData(ClaimAgent.PO_NUMBER,getMatcherGroupData(poNumberMatcher,1), claimResponseNode, claimResponse);
}
aggregateData(ClaimAgent.CLAIM_FORMAT,"LCBO_Format6", claimResponseNode, claimResponse);
if(claimCostMatcher.find()) {
aggregateData(ClaimAgent.CLAIM_COST,getMatcherGroupData(claimCostMatcher,1), claimResponseNode, claimResponse);
}
}
protected void dynamicFormFields(Browser browser,String navigationName){
String formfieldRegex1 = "<input\s*id="([^"]+)"\s*type="hidden"\s*value="([^"]+)"";
Matcher formfieldRegexMatcher = getMatches(browser, formfieldRegex1, null);
PostNavigation navigation = (PostNavigation) this.navigationSet.getNavigation(navigationName);
String fieldName = null;
String fieldValue = null;
while(formfieldRegexMatcher.find()){
FormField temp1 = new FormField();
fieldName = getMatcherGroupData(formfieldRegexMatcher, 1);
fieldValue = getMatcherGroupData(formfieldRegexMatcher, 2);
temp1.setName(fieldName);
temp1.setValue(fieldValue);
navigation.addFormFieldOnDuplicate(temp1);
}
}

protected void dynamicFormFields2(Browser browser,String navigationName){
String formfieldRegex1 = "value="([^"]+)"\s*name="([^"]+)";
Matcher formfieldRegexMatcher1 = getMatches(browser, formfieldRegex1, null);
PostNavigation navigation = (PostNavigation) this.navigationSet.getNavigation(navigationName);
String fieldName = null;
String fieldValue = null;
while(formfieldRegexMatcher1.find()){
FormField temp1 = new FormField();
fieldName = getMatcherGroupData(formfieldRegexMatcher1, 2);
fieldValue = getMatcherGroupData(formfieldRegexMatcher1, 1);
temp1.setName(fieldName);
temp1.setValue(fieldValue);
navigation.addFormFieldOnDuplicate(temp1);
}
String formfieldRegex2 = "name="([^"]+)"\s*value="(\d+)";
Matcher formfieldRegexMatcher2 = getMatches(browser, formfieldRegex2, null);
while(formfieldRegexMatcher2.find()){
FormField temp1 = new FormField();
fieldName = getMatcherGroupData(formfieldRegexMatcher2, 1);
fieldValue = getMatcherGroupData(formfieldRegexMatcher2, 2);
temp1.setName(fieldName);
temp1.setValue(fieldValue);
navigation.addFormFieldOnDuplicate(temp1);
}
}

protected String getattributeValue(String txt, String regex, int index) {
String claimAttributeValue = null;
Matcher dataMatcher = this.getMatches(txt, regex);
if (dataMatcher.find()) {
claimAttributeValue = Util.cleanSpaces(dataMatcher.group(index));
claimAttributeValue = Util.cleanMemoSplChars(claimAttributeValue);
claimAttributeValue = Util.cleanHTML(claimAttributeValue);
}
return claimAttributeValue;
}

protected Matcher getMatches(String txt, String regex) {
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.DOTALL);
return pattern.matcher(txt);
}
protected String cleanAmount(String str) {
String result = str.replace("(","").replace(")","").replace("$","").replace(",","").replaceAll("\s","");
return result;
}

}
     
 
what is notes.io
 

Notes.io is a web-based application for taking notes. You can take your notes and share with others people. If you like taking long notes, notes.io is designed for you. To date, over 8,000,000,000 notes created and continuing...

With notes.io;

  • * You can take a note from anywhere and any device with internet connection.
  • * You can share the notes in social platforms (YouTube, Facebook, Twitter, instagram etc.).
  • * You can quickly share your contents without website, blog and e-mail.
  • * You don't need to create any Account to share a note. As you wish you can use quick, easy and best shortened notes with sms, websites, e-mail, or messaging services (WhatsApp, iMessage, Telegram, Signal).
  • * Notes.io has fabulous infrastructure design for a short link and allows you to share the note as an easy and understandable link.

Fast: Notes.io is built for speed and performance. You can take a notes quickly and browse your archive.

Easy: Notes.io doesn’t require installation. Just write and share note!

Short: Notes.io’s url just 8 character. You’ll get shorten link of your note when you want to share. (Ex: notes.io/q )

Free: Notes.io works for 12 years and has been free since the day it was started.


You immediately create your first note and start sharing with the ones you wish. If you want to contact us, you can use the following communication channels;


Email: [email protected]

Twitter: http://twitter.com/notesio

Instagram: http://instagram.com/notes.io

Facebook: http://facebook.com/notesio



Regards;
Notes.io Team

     
 
Shortened Note Link
 
 
Looding Image
 
     
 
Long File
 
 

For written notes was greater than 18KB Unable to shorten.

To be smaller than 18KB, please organize your notes, or sign in.