Notes![what is notes.io? What is notes.io?](/theme/images/whatisnotesio.png)
![]() ![]() Notes - notes.io |
/* istanbul ignore next */
const Controller = require('../../lib/controller');
const logger = require('../../lib/common/log').logger;
const AdditionalInputHandler = require('./additional_input.handler.js');
const PuppeteerHelper = require('../../lib/helper/puppeteer.helper');
const EVENTS = require('../../lib/common/constants').tlevents;
const _ = require('lodash');
/**
* Charles Schwab Corporation - Additional Input Handler
*/
class Brk_1valb6wCJL0dwFehho2x4Oz3G3q_Additional_Input_Handler extends AdditionalInputHandler {
constructor(session_id) {
super(session_id);
this.session = global.session_mgr.get_session(session_id);
this.ph = new PuppeteerHelper(this.session.page);
}
async chk_identifier(page) {
logger.debug(`Brk_1valb6wCJL0dwFehho2x4Oz3G3q_Additional_Input_Handler -> chk_identifier - ${this.session_id}`);
const tax_center_url = 'https://client.schwab.com/app/accounts/statements/#/';
const elements = ['#account-selector', '//*[contains(text(), "All Brokerage Accounts")]', '#date-range-select-id', 'button[id*="taxforms"]', 'div[class*="search-button"] button', 'button[id*="statements"]', '//table//button[contains(@aria-label, "1099 Consolidated") and not(contains(text(), "PDF"))]', '//table//button[text()[contains(., "1099 Composite and Year-End Summary")]]'];
await this.retry_goto(page, tax_center_url);
//click on account-selector dropdown
await this.ph.waitForSelector(elements[0], page);
await this.ph.performClick(elements[0], page);
// click on All Brokerage accounts
await this.ph.waitForXPath(elements[1], page);
let eh = await this.ph.getElementHandler(elements[1], page);
if (typeof eh === 'object' && eh.length === 0) {
throw new Error('Expand All EH is not available');
}
await this.ph.performXPathHiddenClick(eh[0], page);
await this.ph.performSingleSelect(elements[2], 'Last10Years', page);
// select Tax forms
await this.ph.waitForSelector(elements[3], page);
if (await this.ph.isElementExist('button[id*="taxforms"][aria-pressed="false"]', page)) {
logger.info('Brk_1valb6wCJL0dwFehho2x4Oz3G3q_Additional_Input_Handler -> chk_identifier - selecting tax forms filter');
await this.ph.performClick(elements[3], page);
}
// deselect Statements, assuming it is by default selected.
try {
if (await this.ph.isElementExist('button[id*="statements"][aria-pressed="true"]', page)) {
logger.info('Brk_1valb6wCJL0dwFehho2x4Oz3G3q_Additional_Input_Handler -> chk_identifier - deselecting statements filter');
await this.ph.performClick(elements[5], page);
}
} catch (e) {
logger.warn(e);
}
// click on Search
await this.ph.waitForSelector(elements[4], page);
await this.ph.performClick(elements[4], page);
//await this.ph.once(page, 'load');
await this.wait_for_xhr(page);
await this.wait_for_xpath_retry(page);
if (await this.ph.isXpathExist(elements[6], page)) {
logger.info('Brk_1valb6wCJL0dwFehho2x4Oz3G3q_Additional_Input_Handler -> chk_identifier - 1099 Consolidated Options Matched!!');
this.session.data.xpath_type = 'type1';
return true;
}
if (await this.ph.isXpathExist(elements[7], page)) {
logger.info('Brk_1valb6wCJL0dwFehho2x4Oz3G3q_Additional_Input_Handler -> chk_identifier - 1099 Composite and Year-End Summary Matched!');
this.session.data.xpath_type = 'type2';
return true;
}
return false;
}
async wait_for_xhr(page) {
logger.info(`Brk_1valb6wCJL0dwFehho2x4Oz3G3q_Additional_Input_Handler -> wait_for_xhr -> started`);
try {
let res = await Promise.race([page.waitForResponse((response) => {
return (response.url().includes('documents?isNonAllianceAccountAvailable=true&documentTypes=TAXFORMS&timeFrame=Last10Years'));
}), this.ph.waitFor(5000)]);
if (res) logger.info(`Brk_1valb6wCJL0dwFehho2x4Oz3G3q_AI_Handler api Response Status -> ${res.status()}`);
if (!res || (res && res.status() != 200)) {
logger.info('Not getting status 200 or response is null');
return;
}
} catch (e) {
logger.warn(e);
logger.info(`Brk_1valb6wCJL0dwFehho2x4Oz3G3q_Additional_Input_Handler -> wait_for_xhr -> failed!!`);
}
}
async wait_for_xpath_retry(page, retry_limit = 4) {
logger.debug(`Brk_1valb6wCJL0dwFehho2x4Oz3G3q_Additional_Input_Handler -> wait_for_xpath_retry -> started`);
const tax_elements = ['//table//button[contains(@aria-label, "1099 Consolidated") and not(contains(text(), "PDF"))] | //table//button[text()[contains(., "1099 Composite and Year-End Summary")]]'];
while (retry_limit > 0) {
logger.info(`Brk_1valb6wCJL0dwFehho2x4Oz3G3q_Additional_Input_Handler -> wait_for_xpath_retry - retry_limit - ${retry_limit}`);
await this.pu.debugger(page, this.session_id);
try {
if (await this.ph.isXpathExist(tax_elements[0], page)) {
logger.info('Brk_1valb6wCJL0dwFehho2x4Oz3G3q_Additional_Input_Handler -> wait_for_xpath_retry -> xpath matched');
return;
}
} catch (e) {
logger.warn(e);
}
await this.ph.waitFor(5000);
retry_limit--;
}
logger.info('Brk_1valb6wCJL0dwFehho2x4Oz3G3q_Additional_Input_Handler -> wait_for_xpath_retry -> xpath failed!!');
}
async retry_goto(page, page_url, timeout = 20000, retryLimit = 2) {
logger.info(`Brk_1valb6wCJL0dwFehho2x4Oz3G3q_Additional_Input_Handler -> retry_goto -> started -> retryLimit -> ${retryLimit}`);
if (retryLimit == 0) return;
try {
await this.ph.goto(page_url, page, ['load'], timeout);
await this.pu.debugger(page, this.session_id);
} catch (e) {
logger.warn(e);
return await this.retry_goto(page, page_url, timeout + 20000, retryLimit - 1);
}
}
async has_additional_input(page) {
logger.info('Brk_1valb6wCJL0dwFehho2x4Oz3G3q_AI_Handler -> has_additional_input - started');
if (!await this.chk_identifier(page)) {
return false;
}
let session = global.session_mgr.get_session(this.session_id);
session.additional_input = this;
session.additional_input.filepath = __filename.split('additional_input/')[1] || "";
return true;
}
async get_additional_input_details(page) {
logger.debug('Brk_1valb6wCJL0dwFehho2x4Oz3G3q_Additional_Input_Handler -> get_mfa_details - started');
let session = global.session_mgr.get_session(this.session_id);
let tax_year_list = await this.get_tax_years(page);
if (!tax_year_list || tax_year_list.length === 0) {
return session.event_emitter.emit('error', Controller.getError('general', 'internalError', 'Tax Years are not available'));
}
return session.additional_input.details = {
"mfa_type": 'BROKERAGE',
"mfa_method": 'TAX_YEAR',
"tax_year_list": tax_year_list
};
}
async get_tax_years(page) {
logger.debug('Brk_1valb6wCJL0dwFehho2x4Oz3G3q_Additional_Input_Handler -> get_tax_years - started');
const elements = ['table sdps-button[sdps-aria-label*="View PDF"] button[aria-label*="1099 Consolidated"]', 'table sdps-button[sdps-aria-label*="View PDF"] button[aria-label*="1099 Composite"]'];
let options = [];
if (this.session.data.xpath_type === 'type1') {
options = await this.tax_year_options(elements[0], page);
}
if (this.session.data.xpath_type === 'type2') {
options = await this.tax_year_options_type2(elements[1], page);
}
logger.info(`Brk_1valb6wCJL0dwFehho2x4Oz3G3q_Additional_Input_Handler -> get_tax_years -> options - ${JSON.stringify(options)}`);
options = Array.from(options.map((o) => {
return {
value: `${o.value}`,
label: `${o.text} 1099-B`,
logo_uri: 'm1://calendar_icon_2.png'
};
}));
return options;
}
async tax_year_options_type2(selector, page) {
let yearOptions = [];
yearOptions = await page.evaluate(selector => {
let options = [];
options = Array.from(document.querySelectorAll(selector)).map(o => {
let tax_year = o.getAttribute('aria-label');
tax_year = tax_year.split("Download PDF 1099 Composite and Year-End Summary - ")[1].trim();
tax_year = tax_year.split('for')[0].trim();
return {
value: tax_year,
text: tax_year
};
});
return options;
}, selector);
return yearOptions;
}
async tax_year_options(selector, page) {
let yearOptions = [];
yearOptions = await page.evaluate(selector => {
let options = [];
options = Array.from(document.querySelectorAll(selector)).map(o => {
let tax_year = o.getAttribute('aria-label');
tax_year = tax_year.split('1099 Consolidated -')[1].trim();
tax_year = tax_year.split('for')[0].trim();
return {
value: tax_year,
text: tax_year
};
});
return options;
}, selector);
return yearOptions;
}
async tax_year_handler(field_value, page) {
logger.info(`Brk_1valb6wCJL0dwFehho2x4Oz3G3q_Additional_Input_Handler -> tax_year_handler - ${this.session_id}`);
let session = global.session_mgr.get_session(this.session_id);
session.data.tax_year = field_value;
return session.event_emitter.emit(EVENTS.mfa.success, {
session_id: this.session_id
});
}
async handler(field_name) {
let session = global.session_mgr.get_session(this.session_id);
logger.info(`Brk_1valb6wCJL0dwFehho2x4Oz3G3q_Additional_Input_Handler -> handler -> started -> Session Id: ${this.session_id}, field_name :${field_name}`);
let field_value = session.credentials[field_name];
if (field_name === 'tax_year') {
return await this.tax_year_handler(field_value, session.page);
}
return session.event_emitter.emit(EVENTS.mfa.success, {
session_id: this.session_id
});
}
}
module.exports = Brk_1valb6wCJL0dwFehho2x4Oz3G3q_Additional_Input_Handler;
![]() |
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