washington1995luiz / Suno

// ==UserScript==
// @name         Suno
// @namespace    http://tampermonkey.net/
// @version      1.5
// @description  try to take over the world!
// @author       You
// @match        https://membros.sunoresearch.com.br/carteira-recomendada-dividendos/
// @match        https://membros.sunoresearch.com.br/carteira-recomendada-valor/
// @match        https://membros.sunoresearch.com.br/carteira-recomendada-fundos-imobiliarios/
// @grant        none
// @require      https://canvasjs.com/assets/script/canvasjs.min.js
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // Your code here...
    let site = {dividendos: 'https://membros.sunoresearch.com.br/carteira-recomendada-dividendos/',
                valor: 'https://membros.sunoresearch.com.br/carteira-recomendada-valor/',
                fii: 'https://membros.sunoresearch.com.br/carteira-recomendada-fundos-imobiliarios/'
               }
    let classKey = { listId:'', ticker: '', price: 0, allocation: '', buy: Boolean }
    let montante = [];
    let portfolio = [];
    let actLength = 0;
    let href = window.location.href

    if(href === site.dividendos){
        classKey.listId = 'table_1'
        classKey.ticker = '.column-ticker'
        classKey.price = '.column-preo-atual'
        classKey.buy = '.column-recomendao'
        classKey.allocation = 'tbody .column-alocao';

    } else if(href === site.valor){
        classKey.listId = 'table_1'
        classKey.ticker = '.column-ticker'
        classKey.price = '.column-preo-atual'
        classKey.buy = '.column-recomendao'
        classKey.allocation = 'tbody .column-alocao';

    } else if(href === site.fii) {
        classKey.listId = 'table_1_wrapper'
        classKey.ticker = '.column-ativo'
        classKey.price = '.column-preo-atual'
        classKey.buy = '.column-recomendao'
        classKey.allocation = 'tbody .column-participao';
    }
    let ativos = document.getElementById(classKey.listId).querySelector('tbody').querySelectorAll('tr');
    let responsiveExpander = document.querySelectorAll('.responsiveExpander')

    if(ativos[ativos.length -1].querySelector(classKey.ticker).innerText.toString().toLowerCase() === 'renda fixa') { actLength = ativos.length - 1;} else { actLength = ativos.length}
    for(let i = 0; i < actLength; i++) {
         responsiveExpander[i].click()}

    if(document.querySelector('.row-detail') !== null){
        if(href !== site.fii){
        classKey.allocation = 'tbody .column-alocao .columnValue'
           } else { classKey.allocation = 'tbody .column-participao .columnValue' }
    }
    for(let i = 0; i < actLength; i++) {
        ativos[i].className += ' detail-show'
        let comprar = ativos[i].querySelector(classKey.buy).querySelector('p').innerText.toString().toLowerCase() === 'comprar' ? true : false
        if(comprar){
            let convertPrice = ativos[i].querySelector(classKey.price).innerText.toString().split(',').join('.');
            let price = parseFloat(convertPrice)


            let ticker = ativos[i].querySelector(classKey.ticker).childNodes.length > 1 ? ativos[i].querySelector(`${classKey.ticker} span`).innerText
            : ativos[i].querySelector(classKey.ticker).innerText
            let alocacao = document.querySelectorAll(classKey.allocation)[i].innerText.toString().split(',').join('.')
           
            portfolio.push({
                valor: price.toFixed(2),
                ticker: ticker,
                allocation: parseFloat(alocacao)
            })
        }
    }

    document.querySelector('.wdtscroll').innerHTML += `<div id="chartContainer" style="height: 300px; width: 100%;"></div>
<div id="calculo_ativos" style="background:white; margin-top: 15px; padding: 15px;">
    <input style="border: 2px solid #8c0b0f; border-radius: 5px; padding: 5px;" type="number" name="valor" id="insert-valor" placeholder="Valor do aporte">
    <button
      style="
        border: 2px solid #8c0b0f;
        border-radius: 5px;
        padding: 5px;
        background: transparent; color: #8c0b0f;
        font-weight: 500;"
      id="btn-calcular" >Calcular</button>
<div style="margin-top: 15px;">
    <span style="border-radius: 5px 0 0 5px;
    border: 1px solid green;
    border-right: none;
    padding: 5px;">Total </span>

   <span style="background: green; border: 1px solid green; padding: 5px; margin-right: 5px; color: white;  border-radius: 0px 5px 5px 0px;" id="total"></span>

   <span style="border-radius: 5px 0 0 5px;
    border: 1px solid blue;
    border-right: none;
    padding: 5px;">Sobra</span><span style="background: blue; padding: 5px; color: white; border-radius: 0px 5px 5px 0px; border: 1px solid blue; " id="sobra">0</span>
</div>
    <ul style="margin-top: 25px;" id="lista-compra-ativos">
    </ul>
</div>`
    
    var chart = new CanvasJS.Chart("chartContainer", {
	animationEnabled: true,
	title: {
		text: "Gráfico de ativos que recomendamos a compra"
	},
	data: [{
		type: "pie",
		startAngle: 240,
		yValueFormatString: "##0.00\"%\"",
		indexLabel: "{label} {y}",
		dataPoints:
             portfolio.map(e=>{
                 return {y: e.allocation, label: e.ticker}
            })

	}]
});
chart.render();
    let empresas = portfolio.sort((a,b) => b.allocation - a.allocation)
    let total = 0;

    empresas.map((e, i)=> { parseFloat(total += parseFloat(e.valor)) ; empresas[i].qtd = 0 })
    document.getElementById('total').innerHTML = total.toFixed(2)
    let aporte = 0;
    let btn = document.getElementById('btn-calcular')
    
    let prices = [];
    let qtd = 0;
    let sobra = 0;
    let zerar = false;
    let percent = 0
    function cal(valor, z) {
        aporte = parseFloat(valor).toFixed(2);
        zerar = z
        empresas.map((e, i) => {
            percent = 0
            qtd = 0
            sobra = 0
            //if (aporte < 1) return
            if (zerar === true) { empresas[i].qtd = 0;
                                 zerar = false; }

            if (parseFloat(aporte) < parseFloat(e.valor)) {return}
            else {

            percent = parseFloat(aporte).toFixed(2) * (e.allocation / 100)
            qtd = parseFloat(percent) / parseFloat(e.valor);
            if (qtd > 0 && qtd < 2) { qtd = 1 }

            sobra = parseFloat(parseInt(qtd) * e.valor).toFixed(2);
            empresas[i].qtd += parseInt(qtd)
            aporte = parseFloat(aporte).toFixed(2) - parseFloat(sobra).toFixed(2)
            parseFloat(aporte).toFixed(2)
                                       }
        })
        prices.map(e => {
            if (parseFloat(aporte) < parseFloat(e)) {

            } else {
                cal(parseFloat(aporte), false)
            }
        })

        render()
        document.getElementById('sobra').innerHTML = parseFloat(aporte).toFixed(2)
    }

    empresas.map(e => {
        document.getElementById('lista-compra-ativos').innerHTML +=
            `<li style="
                  margin-bottom: 5px;
                  padding: 15px;
                  border-radius: 5px;
                  text-align: start;
                  box-shadow: 0px 0px 3px 1px #8c0b0f;"
              id="${e.ticker}">

        <span style="border-radius: 5px;
        margin-right: 5px;
        padding: 5px;
        background-color: #8c0b0f;
        color: white;">${e.ticker}</span>

            <span style="border-radius: 5px;
        margin-right: 5px;
        padding: 5px;
        background-color: #8c0b0f;
        color: white;">Preço: ${e.valor}</span>

        <span style="border-radius: 5px;
        margin-right: 5px;
        padding: 5px;
        background-color: #8c0b0f;
        color: white;">Alocação: ${e.allocation}%</span>
            </li>`
    })

    function render() {
    empresas.map(e=>{
    let total = parseInt(e.qtd) !== 0 ?
        `<span style="border-radius: 5px;
        margin-right: 5px;
        padding: 5px;
        font-weight: bold;
        box-shadow: 0px 0px 9px 1px #1f1f1f;
        color: #8c0b0f;">total: ${parseFloat(e.qtd * e.valor).toFixed(2)} </span>` : ''
    document.getElementById(e.ticker).innerHTML =
                `<span style="border-radius: 5px;
        margin-right: 5px;
        padding: 5px;
        background-color: #8c0b0f;
        color: white;">${e.ticker}</span>
                <span style="border-radius: 5px;
        margin-right: 5px;
        padding: 5px;
        background-color: #8c0b0f;
        color: white;">Preço: ${e.valor}</span>
                <span style="border-radius: 5px;
        margin-right: 5px;
        padding: 5px;
        background-color: #8c0b0f;
        color: white;">Alocação: ${e.allocation}%</span>
       <div style="margin-top: 15px;">
               <span class="price" style="border-radius: 5px;
        margin-right: 5px;
        padding: 5px;
        background-color: #1f1f1f;
        color: #fff;
        font-weight: bold;">qtd: ${parseInt(e.qtd)}</span>
        ${total} </div>`
    })

    }

    btn.addEventListener('click', () => calcular())
    let input = document.getElementById('insert-valor');
    input.addEventListener('keypress', e => { if(e.key === 'Enter'){ calcular() } })
    function calcular(){
        prices = [];
        prices = empresas.map(e => { return e.valor });
        let valor = document.getElementById('insert-valor').value
        empresas = []
        empresas = portfolio.sort((a,b) => b.allocation - a.allocation)
        empresas.map((e, i)=> { parseFloat(total += parseFloat(e.valor)) ; empresas[i].qtd = 0 })
        cal(valor, true)
    }

})();