analytical_force / frontend-react /src /views /Opportunities.jsx
ViniciusKhan's picture
Corrige e-mail, adiciona CC persistido e migra painel para React
197ac2a
Raw
History Blame Contribute Delete
2.51 kB
import SecaoHeader from "../components/SecaoHeader.jsx";
import StatGrid from "../components/StatGrid.jsx";
import HighlightsCards from "../components/HighlightsCards.jsx";
import { moeda, num, pct, pipelineVal } from "../format.js";
export default function Opportunities({ dia }) {
const O = dia.metrics?.opportunities || {};
const porVendedor = O.pipeline_by_owner || {};
const vendedores = Object.keys(porVendedor);
const total = O.open_pipeline_product_value || O.open_pipeline_amount || 0;
return (
<>
<div className="card">
<SecaoHeader icone="πŸ’Ό" titulo={"Oportunidades β€” " + dia.date} cor="#2563eb" />
<StatGrid
itens={[
["πŸ†•", "Novas", num(O.new_opportunities), "blue"],
["πŸ“‚", "Abertas", num(O.open_opportunities), "blue"],
["πŸ†", "Ganhas", num(O.won_opportunities), "green"],
["πŸ“‰", "Perdidas", num(O.lost_opportunities), "red"],
["πŸ’°", "Pipeline aberto", moeda(pipelineVal(O)), "violet"],
["πŸ’΅", "Valor ganho", moeda(O.won_amount), "green"],
["🎯", "Win rate", pct(O.win_rate), "blue"],
["πŸ“Š", "Loss rate", pct(O.loss_rate), "amber"],
["🚧", "Paradas", num(O.stalled_opportunities), "amber"],
["πŸ”΄", "Alto valor paradas", num(O.high_value_stalled_opportunities), "red"],
["πŸ”•", "Sem prΓ³xima tarefa", num(O.opportunities_without_next_task), "amber"],
["πŸ“…", "Fecham no mΓͺs", num(O.opportunities_closing_this_month), "violet"],
]}
/>
</div>
{vendedores.length > 0 && (
<div className="card">
<SecaoHeader
icone="πŸ’°"
titulo="Pipeline por vendedor"
cor="#2563eb"
extra={<span className="chip">Total: {moeda(total)}</span>}
/>
<table className="owners">
<thead>
<tr>
<th>Vendedor</th>
<th style={{ textAlign: "right" }}>Pipeline</th>
</tr>
</thead>
<tbody>
{vendedores.map((k) => (
<tr key={k}>
<td>{k}</td>
<td style={{ textAlign: "right" }}>{moeda(porVendedor[k])}</td>
</tr>
))}
</tbody>
</table>
</div>
)}
<HighlightsCards highlights={dia.highlights} chaves={["oportunidades_travadas", "oportunidades_ganhas"]} />
</>
);
}