Crowdestor Investments Single View

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

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 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"};
        }
})();