NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==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) } })();