Skip to content

Instantly share code, notes, and snippets.

@knopki
Last active April 26, 2024 12:49
Show Gist options
  • Select an option

  • Save knopki/f73f451cba16f2ef1f59de32cbed36dc to your computer and use it in GitHub Desktop.

Select an option

Save knopki/f73f451cba16f2ef1f59de32cbed36dc to your computer and use it in GitHub Desktop.
Формировании декларации с дивидендами от иностранных бумаг за 2023 год

Формировании декларации с дивидендами от иностранных бумаг за 2023 год

Здравствуй, мой маленький мамки инвестор. Сейчас я расскажу тебе как заполнить 105 событий получения дивидендов от иностранных бумаг в декларации о доходах физического лица не заполняя 105 форм.

Для начала надо получить от брокера налоговый отчёт. Отчёт каким-то образом надо преобразовать в такой вид:

let data = [
    {
    "date": "20.01.2023",
    "name": "Valero Energy Corporation_ORD SHS",
    "country_out_code": "840",
    "country_in_code": "643",
    "total": "2.94",
    "tax": "0.29",
    "currency_code": "840"
  },
];

Т.е. массив элементов, где каждый элемент получается из строчки налового отчёта. Например, я получил налоговый отчёт в pdf от брокера, загнал его через какой-то pdf2xlxs сервис в таблицу, подредактировал её, сохранил в csv и первым попавшимся конвертировал преобразовал в json. Страны/валюты надо заменить на коды стран согласно классификатору. Например, 840 для США, 643 для России. Поля:

  • date - дата начисления дохода (и исчисления налога)
  • name - имя эмитента
  • country_code_out - где был начислен доход
  • country_code_in - куда был начислен доход (страна брокера)
  • total - общая сумма начисления (не вычитая налог)
  • tax - уже заплаченный налог (сколько налоговая страны источника уже откусила)
  • currency_code - код страны в валюте которой произошло начисления; в этом году необычно - часть дивидендов начислены в рублях

Полученный json надо вставить в переменную data в прилогаемом скрипте.

Надо открыть сайт налоговой и начать в личном кабинете заполнять декларацию. На шаге "Доходы" надо переключиться на вкладку "За пределами РФ".

Надо открыть инструменты разработчика браузера - это обычно CTRL+SHIFT+I. Найти вкладку Console и скопипастить туда прилагаемый скрипт с вашими данными. Возможно, надо будет разрешить вставлять скрипт, написав allow pasting, а потом ещё раз вставить скрипт. Возможно, с первого раза что-то не получится. Тогда надо удалить добавленное в форму и запустить ещё раз, написав run(). Откиньтесь на спинку кресла и отдоните, пока Windows 98 устанавливается на ваш компьютер.

// вставь свои данные сюда
let data = [
{
"date": "20.01.2023",
"name": "Valero Energy Corporation_ORD SHS",
"country_out_code": "840",
"country_in_code": "643",
"total": "2.94",
"tax": "0.29",
"currency_code": "840"
},
];
async function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function setInputValue(selector, newValue) {
const el = document.querySelector(selector)
const nativeInputValueSetter = Object.getOwnPropertyDescriptor(
window.HTMLInputElement.prototype,
'value',
).set;
nativeInputValueSetter.call(el, newValue);
el.dispatchEvent(new Event('input', { bubbles: true, cancellable: false}));
el.dispatchEvent(new KeyboardEvent('keydown', {
code: 'Enter',
key: 'Enter',
charCode: 13,
keyCode: 13,
view: window,
bubbles: true
}));
}
async function processItem(item) {
console.log(`Processing item ${item.name} at ${item.date}: ${item.total}`);
// модалка
document.querySelector(".m-tabPanel button").click();
await sleep(200);
setInputValue("input[name='incomeSourceName']", item.name);
document.querySelector("div[aria-labelledby*='oksmIst'] > span").click();
document.querySelector(`.m-popover li[title*='${item.country_out_code}']`).click()
document.querySelector("div[aria-labelledby*='oksmZach'] > span").click();
document.querySelector(`.m-popover li[title*='${item.country_in_code}']`).click()
document.querySelector("button[type='submit']").click();
await sleep(100);
// если почему-то рабочая область не развёрнута, то разверни
if (!document.querySelector(".bg-base-black-10 input")) {
document.querySelector(".m-tabPanels > div > div > div > div > div > div > div:last-of-type").click()
await sleep(500);
}
// работа в основном теле
document.querySelector(".bg-base-black-10 input[id*='incomeTypeCode']").click();
document.querySelector(`.m-popover li[title*='1010']`).click();
await sleep(100);
document.querySelector(".bg-base-black-10 input[id*='taxDeductionCode']").click()
document.querySelector(`.m-popover li[title*='Не предоставлять']`).click()
setInputValue(".bg-base-black-10 input[id*='incomeAmountCurrency'", item.total);
setInputValue(".bg-base-black-10 input[id*='incomeDate'", item.date);
setInputValue(".bg-base-black-10 input[id*='taxPaymentDate'", item.date);
document.querySelector(".bg-base-black-10 input[id*='currencyCode']").click();
document.querySelector(`.m-popover li[title*='${item.currency_code}']`).click();
document.querySelector(`.bg-base-black-10 input[type='checkbox']`).click();
setInputValue(".bg-base-black-10 input[id*='paymentAmountCurrency'", item.tax);
}
async function run() {
for (const item of data) {
await processItem(item);
await sleep(100);
}
console.log("Done.");
}
await run();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment