override async protected void ProceedToStatement(IScrapedAccount Acct) { DisplayMessage("Waiting for " + Acct.Nickname + "..."); string id = (Acct as ScrapedAccount).referenceId; //Wait for the account block to click on await PollForJavaScript("var f = function(){var e = document.getElementById('account-" + id + "');" + "if(e != null)e.click();" + "return e != null;}; f()"); //Wait for transactions string s = await PollForJavaScript("window._FF_trans"); ScrapedXacts Statement = JSON.Parse <ScrapedXacts>(Unwrap(s)); Xact[] Pending = Statement.pending == null ? new Xact[0] : Statement.pending.Select(ToXact).ToArray(), Posted = Statement.posted == null ? new Xact[0] : Statement.posted.Select(ToXact).ToArray(); if (Posted.Length > 0 && Pending.Length > 0) { Account.RunBalanceForward(Posted[0].Balance, Pending); } m_Account.OnDownloadedTransactions(Pending.ArrayConcat(Posted)); Task _t = Navigation.PopModalAsync(); }
protected void ListAccounts(IScrapedAccount [] ScrapedAccounts) { if (ScrapedAccounts == null || ScrapedAccounts.Length == 0) { DisplayMessage("No accounts found, sorry. Probably app/website miscommunication, please contact support."); return; } if (m_Account == null) //The scraper is trying to connect to an account { MessageOff(); if (ScrapedAccounts.Length == 1) //Exactly one { OnAccountSelection(ToAccountReference(ScrapedAccounts[0])); } else { Task t = Navigation.PushModalAsync(new AccountSelectionPage(ScrapedAccounts.Select(ToAccountReference), OnAccountSelection)); } } else //Getting a statement for an existing account { IScrapedAccount TheAcct = ScrapedAccounts.FirstOrDefault(sa => sa.AccountNumber == m_Account.Ref.AccountNumber); if (TheAcct == null) { m_ScraperPage.DisplayMessage("The selected account was not found on the page. This could be a bank/scraper miscommunication, please contact support."); } else { ProceedToStatement(TheAcct); } } }
protected AccountReference ToAccountReference(IScrapedAccount ScrapedAcct) { return(new AccountReference() { Bank = m_Bank, AccountNumber = ScrapedAcct.AccountNumber, Nickname = ScrapedAcct.Nickname, ExtraData = ScrapedAcct }); }
protected void OnAccountSelection(AccountReference Ref) { if (Ref == null) //Cancel { Navigation.PopModalAsync(); } else { IScrapedAccount TheAcct = Ref.ExtraData as IScrapedAccount; m_Account = App.The.RegisterAccount(Ref); ProceedToStatement(TheAcct); } }
protected override async void ProceedToStatement(IScrapedAccount Acct) { ScrapedAccount sa = Acct as ScrapedAccount; m_ScraperPage.BrowseTo(sa.url + "&" + sa.additionalParam); //Wait for the transaction list to become available await PollForJavaScript("document.getElementsByClassName('transaction-records').length > 0"); string s = await RunJS("[].slice.call(document.getElementsByClassName('transaction-records').item(0).rows)" + ".filter(function(r){return r.id;})" + ".map(function(r){return {" + "When: r.cells[0].innerText.substr(0, 10) == 'Processing' ? '' : r.cells[0].getElementsByTagName('span').item(1).innerText," + "Desc: r.cells[1].getElementsByClassName('transTitleForEditDesc').length > 0 ? r.cells[1].getElementsByClassName('transTitleForEditDesc').item(0).innerText : r.cells[1].innerText," + "Amount: r.cells[4].innerText," + "Balance: r.cells[5].innerText" + "};})"); ScrapedXact[] Statement = JSON.Parse <List <ScrapedXact> >(s).ToArray(); m_Account.OnDownloadedTransactions(Statement.Select(ToXact).ToArray()); Task t = Navigation.PopModalAsync(); }
abstract protected void ProceedToStatement(IScrapedAccount Acct);