Crowdestor Investments Single View

Basic script for displaying all payments schedules, delays and updates in Crowdestor investments page

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Crowdestor Investments Single View
// @namespace    http://tampermonkey.net/
// @version      0.14
// @description  Basic script for displaying all payments schedules, delays and updates in Crowdestor investments page
// @author       Juanvi -- Telegram @Juanvi78
// @match        https://crowdestor.com/*/clients/investments
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    var grace_period_days=7; //You can change for choosing another grace period duration (salmon payments)
    var color=["tomato","lightsalmon","lawngreen","gray"];
    var hoy = new Date();
    var recovery = new Date(2020,5,12);
    var resumen=document.createElement("div");
    resumen.id="resumen";
    var crono=document.createElement("tbody");
    crono.id="crono";
    crono.style.display = "none";
    var esp=window.location.href.toString().includes("/es/");
    document.getElementsByClassName("grid-x grid-margin-x")[2].style.display = "none";
    $("#investments-list").hide();
    $(".clients--box.clients--box-small-mr.clients--box-small-pdd").append(esp?"<p><b>Código de pagos:</b></p><p><span style='background-color:tomato;margin: 6px;'> Retrasado > 7 días </span> <span style='background-color:lightsalmon;margin: 6px;'> Retrasado < 7 días </span><span style='background-color:lawngreen;margin: 6px;'> Cobrado después de la prórroga COVID (i.e. después del 12 de junio)</span></p><p><b>Código de proyectos:</b></p><div class='col_estado_0'></div>Al menos un pago retrasado > 7 días<div class='col_estado_1'></div>Solo pagos retrasados < 7 días</p><p><div class='col_estado_2'></div>Al día con pagos después de la prórroga <div class='col_estado_3'></div>Al día sin pagos después de la prórroga":"<p><b>Payments code:</b></p><p><span style='background-color:tomato;margin: 6px;'>Delayed > 7 days </span><span style='background-color:lightsalmon;margin: 6px;'>Delayed < 7 days</span>  <span style='background-color:lawngreen;margin: 6px;'>Collected after the COVID extension (i.e. after June 12)</span></p><p><b>Projects code:</b></p><div class='col_estado_0'></div>At least 1 payment delayed > 7 days<div class='col_estado_1'></div>Only delayed < 7 days payments</p><p><div class='col_estado_2'></div>On time with payments after Covid <div class='col_estado_3'></div>On time, no payments after Covid");
    for (var c=0;c<4;c++) $(".col_estado_"+c).css(bolita(c));
    $("#investments_length_change").html("<option value='-1'/>");
    $("#investments_filter-transactions").click();
    $("#resumen").html("<p align=center>"+(esp?"Esperando datos":"Waiting for data")+"</p>");
    setTimeout(cartera,10000);
    function cartera(){
         if (document.getElementsByClassName("cell medium-shrink clients--side sticky-container")[0].style.height=="0px")
             $(".clients--box.clients--box-small-mr.clients--box-small-pdd").append(resumen)
        else $(".clients--box").first().after(resumen);
        $(".clients--box.clients--box-small-mr.clients--box-small-pdd").after(crono);
        $(".clients--box.clients--box-small-mr.clients--box-small-pdd").after("<div style='background-color: white;padding: 10px;margin: 5px;'><div style='width: 25%;float: left;' id='estado_0'><b>"+((esp)?"Retrasado":"Delayed")+"</b><div class='col_estado_0'></div></div><div style='width: 25%;float: left;' id='estado_1'><b>"+((esp)?"Periodo de gracia":"Grace Period")+"</b><div class='col_estado_1'></div></div><div style='width: 25%;float: left;' id='estado_2'><b>"+((esp)?"Al día después de COVID":"On time after COVID")+"</b><div class='col_estado_2'></div></div><div style='width: 25%;float: left;' id='estado_3'><b>"+((esp)?"Al día antes de COVID":"On time before COVID")+"</b><div class='col_estado_3'></div></div><div style='clear: both;'></div></div>");
        $(".grid-x.clients--pagination").hide();
        for (c=0;c<4;c++) $(".col_estado_"+c).css(bolita(c));
        var cabecera = document.getElementsByTagName("thead")[0];
        cabecera.parentNode.removeChild(cabecera);
        var proyectos =document.getElementsByTagName("tbody")[1].rows;
        var i=0;
        var pagos_retrasados=0;
        var retrasados=0;
        var pagos_masretrasados=0;
        var masretrasados=0;
        var completados=0;
        var principal=0;
        function bucle(){
            setTimeout(function(){
                if (proyectos[i].cells[2].childNodes.length==2) {
                    proyectos[i].style.display = "none";
                    completados++;
                }else {
                    var aux = document.createElement('td');
                    aux.id = i+"_aux_id";
                    proyectos[i].appendChild(aux);
                    var marca_proy=document.createElement("a");
                    marca_proy.name="proj_"+i;
                    marca_proy.style="top: -200px;position: relative";
                    proyectos[i].cells[0].appendChild(marca_proy);
                    var url = proyectos[i].getElementsByClassName("transactions--subinfo-more transactions--repayment has-tip")[0].href;
                    proyectos[i].getElementsByClassName("transactions--subinfo")[2].style.display="none";
                    //proyectos[i].getElementsByClassName("transactions--subinfo")[3].style.display="none";
                    $("#"+i+"_aux_id").load(url+" tbody", function(){
                        var pagos = this.firstElementChild.rows;
                        var i=parseInt(this.id);
                        var retrasado = false;
                        var masretrasado = false;
                        var verde = false;
                        var nombre=proyectos[i].getElementsByClassName("transactions--name")[0].innerText;
                        var principal_proy=limpiaeuro(proyectos[i].getElementsByClassName("transactions--amount")[0]);
                        for (var j=2; j<pagos.length-1; j=j+2){
                            var fecha_str=pagos[j].cells[1].innerText;
                            var fecha=new Date(fecha_str.substring(0,4),fecha_str.substring(5,7)-1,fecha_str.substring(8,10),23,59,59);
                            var dias=(hoy.getTime()-fecha.getTime())/86400000;
                            var pagado=(pagos[j].cells[6].childNodes.length==1);
                            if (pagado) principal_proy-=limpiaeuro(pagos[j].cells[2]);
                            if (dias>0 && !pagado) {
                                var cantidad=limpiaeuro(pagos[j].cells[5]);
                                pagos_retrasados+=cantidad;
                                retrasado=true;
                                if (dias>grace_period_days){
                                    pagos[j].style.backgroundColor=color[0];
                                    pagos_masretrasados+=cantidad;
                                    masretrasado=true;
                                } else pagos[j].style.backgroundColor=color[1];
                            } else if (fecha>recovery && pagado) {
                                pagos[j].style.backgroundColor=color[2];
                                verde=true;
                            }
                            var copia_fila=pagos[j].cloneNode(true);
                            copia_fila.deleteCell(0);
                            copia_fila.cells[3].innerHTML="<a style=color:darkslategray; onclick=$('#crono,#investments-list').toggle();window.location.href='#proj_"+i+"'>"+nombre+"</a><div class='proj_class_"+i+"'/>";
                            crono.insertBefore(copia_fila,busca_sitio(fecha_str));
                        }
                        pagos[pagos.length-1].remove();
                        if (retrasado){
                            retrasados++;
                            /*var aux_update = document.createElement('div');
                            aux_update.id = this.id+"_update";
                            aux_update.style.paddingTop = "30px";
                            proyectos[i].getElementsByClassName("transactions--info")[0].appendChild(aux_update);
                            var url= proyectos[i].getElementsByClassName("transactions--subinfo-more has-tip")[1].href.replace("/es/","/en/").replace("/de/","/en/");
                            $("#"+aux_update.id).load(url+" .single-project--inner > p");*/
                        }
                        principal+=principal_proy;
                        var estado=3;
                        if (masretrasado) {
                            masretrasados++;
                            estado=0;
                        } else if (retrasado) estado=1;
                        else if (verde) estado=2;
                        $(".proj_class_"+i).css(bolita(estado));
                        $("#estado_"+estado).append("<p>"+"<a style=color:darkslategray; onclick=$('#investments-list').show();$('#crono').hide();window.location.href='#proj_"+i+"'>"+nombre+" ("+parseFloat(principal_proy).toFixed(2)+"€)</a></p>");
                    });
                }
                $("#resumen").html("<p align=center>"+(esp?"Cargando proyecto "+i+" de "+proyectos.length:"Loading project "+i+" of "+proyectos.length)+"</p>");
                i++;
                if (i<proyectos.length) bucle();
                //if (i<5) bucle();
                else {
                    var marca_tiempo=document.createElement("a");
                    marca_tiempo.name="lastweek";
                    var fecha_marca=new Date(hoy.getTime() - 1209600000);
                    crono.insertBefore(marca_tiempo,busca_sitio(fecha_marca.getFullYear()+"-"+(fecha_marca.getMonth()+ 101).toString().substring(1, 3)+"-"+(fecha_marca.getDate()+ 100).toString().substring(1, 3)));
                    setTimeout(function(){
                          $("#resumen").html("<p align=center><a onclick=$('#crono,#investments-list').toggle();window.location.href='#lastweek' class='header-main--button'>"+(esp?"Cambiar vista préstamos/tiempo":"Toggle loans/timeline view")+"</a></p>"+(esp?"<div><ul><li>Principal:<b> "+parseFloat(principal).toFixed(2)+"€ </b></li><li> Proyectos completados:<b> "+completados+" </b></li><li> Proyectos activos:<b> "+(i-completados)+"</b></li><li> Proyectos retrasados: <b>"+retrasados+" </b>(<b>"+parseFloat(100*retrasados/(i-completados)).toFixed(2)+"% </b> de activos)</li><li>Proyectos con retrasos > 7 días: <b>"+masretrasados+" </b>(<b>"+parseFloat(100*masretrasados/(i-completados)).toFixed(2)+"%</b> de activos)</li><li>Cantidad retrasada: <b>"+parseFloat(pagos_retrasados).toFixed(2)+"€ </b>(<b>"+parseFloat(100*pagos_retrasados/principal).toFixed(2)+"% </b> del principal)</li><li>Retrasado > días:<b> "+parseFloat(pagos_masretrasados).toFixed(2)+"€</b> (<b>"+parseFloat(100*pagos_masretrasados/principal).toFixed(2)+"% </b> del principal)</li></ul></div>":"<div><ul><li>Principal:<b> "+parseFloat(principal).toFixed(2)+"€ </b></li><li> Repaid projects:<b> "+completados+" </b></li><li> Active projects:<b> "+(i-completados)+"</b></li><li> Delayed projects: <b>"+retrasados+" </b>(<b>"+parseFloat(100*retrasados/(i-completados)).toFixed(2)+"% </b> of active)</li><li>Projects w/ payment(s) delayed > 7 days: <b>"+masretrasados+" </b>(<b>"+parseFloat(100*masretrasados/(i-completados)).toFixed(2)+"%</b> of active)</li><li>Due amount: <b>"+parseFloat(pagos_retrasados).toFixed(2)+"€ </b>(<b>"+parseFloat(100*pagos_retrasados/principal).toFixed(2)+"% </b> of principal)</li><li>Due > 7 days:<b> "+parseFloat(pagos_masretrasados).toFixed(2)+"€</b> (<b>"+parseFloat(100*pagos_masretrasados/principal).toFixed(2)+"% </b> of principal)</li></ul></div>"));
                          $("#investments-list").show();
                    },2000);
                }
              },1000)
        }
        bucle();
        function limpiaeuro(d){
         return parseFloat(d.innerText.replace("€",""));
        }
        function busca_sitio(fecha_str){
            for (var k=0; k<crono.rows.length; k++)
                if (crono.rows[k].cells[0].innerText>fecha_str) return crono.rows[k];
        }
    }
        function bolita(estado){
         return {"background":color[estado],"border-radius":"50%","margin-left":"6px","margin-right":"6px","width":"12px","height":"12px","display":"inline-block"};
        }
})();