niedziela, lipca 10, 2022

Bookmarklet do robienia CSV z obligacjami i ich oprocentowaniem ;-)

[Update]
Niestety złe ludzie od strony z obligacjami mieszkają z IDkami, więc mój piękny skrypt na jakiś czas przestał działać ;-) Najpierw go zupdatowałem przez poprawienie po prostu ręcznie na nowe IDki, teraz dodałem "mechanizm" do znajdowania IDików ;-)
Do tego dodałem nowy bookmarklet do pobierania ważonego oprocentowania ;-) [czyli zbieramy procent ze wszystkich emisji, później liczymy średnią ważoną oprocentowania, gdzie wagą jest kwota zakupu, dzięki temu mamy takie pi razy oko pojęcie ile w roku zarobimy]
[Koniec update]

Jeśli ktoś kupuje polskie obligacje to wie, że strona do tego ssie od strony usability ;-)
Jest tam np. możliwość pobrania pliku Excela, ale po pierwsze to Excel ;-) po drugie, nie ma tam w ogóle informacji o oprocentowaniu.
Żeby zobaczyć oprocentowanie trzeba zaś wykonywać karkołomne operacje i próbować najeżdżać na nazwę emisji by może zobaczyć oprocentowanie:


I normalnie chcąc zobaczyć jakie mam "średnie" oprocentowanie, najpierw pobierałem plik Excela, później przechodziłem przez kolejne emisje i sobie przepisywałem ostatni numerek...
Strasznie to było męczące.

Stąd dziś prezentuję ten oto bookmarklet ;-)
(przeciągnij go do bookmarków, wejdź na stronę od obligacji, zaloguj się, zmień może liczbę wyświetlanych obligacji i kliknij na ten bookmark, powinna Ci przeglądarka zaproponować pobranie pliku CSV z nazwą obligacje.csv, aha w tym CSV za separator dziesiętny robi kropka, nie przecinek, więc niektóre programy mogą mieć problem, np. Numbers na macOS upiera się, że ponieważ to Polska to ma być przecinek... więc zmieniłem sobie w całym systemie bo ja uznaję tylko kropkę ;-))

Którego kod wygląda mniej więcej tak:

// sadly this part is only for hacky way of finding what are Ids
function findIdLambda(elem,list,func) {
var id = elem.id;
if (id && func(id)) {
list.push(id);
}
for (var i=0; i<elem.childNodes.length; i++) {
var child = elem.childNodes[i];
findIdLambda(child,list,func);
}
}

function findId(elem,idStart,list) {
findIdLambda(elem,list,x => x.startsWith(idStart));
}

var list = [];
findId(document,"stanRachunku",list);
var id = list.filter(x => x.endsWith("data")).filter(x => x.indexOf("idt")!=-1)[0];
var no = id.split("idt")[1].split("_")[0]*1;
var idxNo = no;

function findQtipId(pattern) {
var list = [];
findIdLambda(document,list,x => x.startsWith(pattern));
return list[0];
}
//end of hacky way for finding proper Ids

const mouseoverEvent = new Event('mouseover');
function amount2number(s) {
var nbrsp=String.fromCharCode(160);
return s.replace(nbrsp,"").replace(',',".").replace(nbrsp+"PLN","");
}
function getPercents(idx) {
var id = findQtipId("qtip-stanRachunku:j_idt"+idxNo+":"+idx+":j_idt");
console.log(id);
var element=document.getElementById(id);
var data=element.innerText.split("%");
var res = [];
for (var i=0; i<data.length; i++) {
var line=data[i];
line=line.trim();
if (line.length==0) continue;
var l=line.split(" ");
res.push(l[l.length-1]);
}
return res;
}
var table=document.getElementById("stanRachunku:j_idt"+idxNo+"_data");
var data=table.childNodes;
var content="id,number,value,actual value,cycle,%,redemption date\n";
for (var i=0; i<data.length; i++) {
var line = data[i].childNodes;
// ugly hack... but without this it will not be visible, and we would not be able to get percents
line[0].firstChild.dispatchEvent(mouseoverEvent);
var emId=line[0].innerText;
var number=line[1].innerText;
var value=line[3].innerText;
var actual=line[4].innerText;
var redemption=line[5].innerText;
var percents=getPercents(i);
var cycle = percents.length;
var percentage = percents[percents.length-1];
var l=[emId,number,amount2number(value),amount2number(actual),cycle,percentage,redemption];
var cl = "";
for (var j=0; j<l.length; j++) cl+=l[j]+",";
cl=cl.substring(0,cl.length-1);
content+=cl+"\n";
}
console.log(content);
var blob = new Blob([[content]],{type: "text/csv"});
console.log(blob);
var downloadObj = window.URL.createObjectURL(blob);
console.log(downloadObj);
var a = window.document.createElement('a');
a.href = downloadObj;
a.text = "obligacje.csv";
a.download = "obligacje.csv";
a.click();

Jak działa? ;-)
Prosto ;-)
Najpierw szuka tabelki z danymi, dziwnie na wszystkich kontach na jakich sprawdzałem (dokładnie 2 ;-)) tabelka zawsze nazywa się "stanRachunku:j_idt138_data". Później idzie przez jej linie i zbiera dane, czyli nazwę emisji, liczbę obligacji, ich wartość nominalną, wartość w chwili obecnej, datę wykupu i numer roku, oraz oprocentowanie.
Te dwie ostatnie wartości bierze hackiem ;-) okazuje się, że trzeba najechać na nazwę emisji by w ogóle pojawił się tooltip który pokaże interesujące nas wartości, po to jest linia:
  line[0].firstChild.dispatchEvent(mouseoverEvent);
która to linia wysyła event mouseover do elementu i wtedy pojawia się odpowiedni tooltip, który sobie pobieramy w getPercents ;-) 
Na końcu tworzony jest plik CSV i link do jego pobrania, który się sam z siebie klika ;-)
Wtedy przeglądarka proponuje nam pobranie danych :-)
Jedna uwaga, to są zawsze dane z aktualnej strony... więc jak ktoś ma więcej niż 20 emisji to dobrze zmienić liczbę widocznych na danej stronie na 50, a jak ktoś ma więcej niż 50 to trzeba niestety się bawić w klikanie bookmarkletu na każdej podstronie.
Nadal to jednak prostsze niż "stara" metoda ;-)


Bookmarklet by policzyć Procent z obligacji, zrobiony przy pomocy Bookmarklet Makera


Podobne postybeta
[Updated] Czytanie Pocketa ;-)
Ściana, czyli rozbijam się na onclick ;-)
Go dla Java'owca ;-) odcinek 2 "kontenery dwa ;-)"
Ile Ci brakuje by zostać kapitalistą? ;-)
AppInventor - pierwsze wrażenia i pierwsze programy :-)