Bonjour,

Voila je rencontre un petit problème avec mon code.

j'essaie d'intégrer google chart pour faire mes statistiques.

j'ai créé deux services

class Chart
{
    const ANIMATION_STARTUP = true;
    const ANIMATION_DURATION = 1000;
    const CHART_AREA_HEIGHT = '80%';
    const CHART_AREA_WIDTH = '80%';

    private $chartData;

    public function __construct(ChartData $chartData)
    {
        $this->chartData = $chartData;
    }

    /**
     * Crée le graphique du montant des bénéfices par année.
     *
     * @return ComboChart
     * @throws \Exception
     */
    public function amountByYear()
    {
        $arrayToDataTable = $this->chartData->dataAmountByYear();

        $chart = new ComboChart();
        $chart->getData()->setArrayToDataTable($arrayToDataTable);
        $chart->getOptions()->getAnimation()->setStartup(self::ANIMATION_STARTUP);
        $chart->getOptions()->getAnimation()->setDuration(self::ANIMATION_DURATION);
        $chart->getOptions()->getChartArea()->setHeight(self::CHART_AREA_HEIGHT);
        $chart->getOptions()->getChartArea()->setWidth(self::CHART_AREA_WIDTH);

        $vAxisAmount = new VAxis();
        $vAxisAmount->setTitle('Montant en €');
        $vAxisEvol = new VAxis();
        $vAxisEvol->setTitle('Evolution en %');
        $chart->getOptions()->setVAxes([$vAxisAmount, $vAxisEvol]);

        $seriesAmount = new \CMEN\GoogleChartsBundle\GoogleCharts\Options\ComboChart\Series();
        $seriesAmount->setType('bars');
        $seriesAmount->setTargetAxisIndex(0);
        $seriesEvol = new \CMEN\GoogleChartsBundle\GoogleCharts\Options\ComboChart\Series();
        $seriesEvol->setType('line');
        $seriesEvol->setTargetAxisIndex(1);
        $chart->getOptions()->setSeries([$seriesAmount, $seriesEvol]);

        $chart->getOptions()->getHAxis()->setTitle('Année');
        $chart->getOptions()->setColors(['##660099', '#759e1a']);

        return $chart;

    }

    class ChartData
{

    private $em;

    public function __construct(ObjectManager $em)
    {
        $this->em = $em;
    }

    private function formatMoney($amount)
    {
        return number_format($amount, 2, ',', ' ');
    }

    /**
     * Récupère et organise les données pour le graphique des chiffre d'affaire par année.
     *
     * @return array
     * @throws \Exception
     */
    public function dataAmountByYear()
    {
        $turnoverInYear=0;
        $stats=array();

        $commandes = $this->em->getRepository('CeCommandeBundle:Commande')->getWithyearUserAndZone();

        foreach($commandes as $cmd){

            $stats[(int)$cmd->getDateCommande()->format('Y') - 1] += 1;
            $turnoverInYear+= $cmd->getTotal();
        }

        $arrayToDataTable[] = ['Année', 'Montant', ['role' => 'tooltip'], 'Evolution', ['role' => 'tooltip']];
        $previousAmount = 0;
        foreach ($stats as $stat) {
            if ($previousAmount != 0) {
                $evolution = round((($stat['amount'] * 100) / $previousAmount) - 100, 2);
            } else {
                $evolution = 0;
            }
            $previousAmount = $stat['amount'];

            $tooltipAmount = $this->formatMoney($stat['amount']) . '€';
            $tooltipEvol = "$evolution %";

            $arrayToDataTable[] = [$stat['date'], floatval($stat['amount']), $tooltipAmount, $evolution, $tooltipEvol];
        }

        return $arrayToDataTable;
    }

    public function getWithyearUserAndZone()
    {
        $qb = $this
            ->createQueryBuilder('c')
            ->leftJoin('c.user', 'usr')
            ->leftJoin('c.zoneLivraison', 'z')
            ->orderBy('c.dateCommande', 'DESC')
            ->addSelect('usr')
            ->addSelect('z')
            ->addSelect('YEAR(c.dateCommande) as year')
            ->addSelect('MONTH(c.dateCommande) as month')
            ->addSelect('DAY(c.dateCommande) as day')
            ->groupBy('year')
            ->addgroupBy('month')
            ->addgroupBy('day')
            ->orderBy('c.dateCommande', 'DESC');
        return $qb
            ->getQuery()
            ->getResult();
    }

     public function chartAction()
    {
        $chart = $this->get('app.chart');

        return $this->render('CeCommandeBundle:Commande:chart.html.twig', ['amountByYear' => $chart->amountByYear()]);
    }

<html>
<head>
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
</head>
<div id="div_graph"></div>
<script type="text/javascript">
    {{ gc_draw(amountByYear, 'div_graph') }}
</script>
</html>

Ce que je veux

mon problème c'est quand j'essaie de passer mes données pour mon chart dans la classe ChartData, je veux calculer le total commandes pour chaque année pour le passer à mon graphe mais je n'arrive pas, merci pour l'aide.

Ce que j'obtiens

Décrivez ici vos erreurs ou ce que vous obtenez à la place de ce que vous attendez :(

Aucune réponse