src/Controller/IaiDefaultController.php line 109

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Period;
  4. use App\Entity\ReporterPartner;
  5. use App\Model\BarChartData;
  6. use App\Model\DataSet;
  7. use Carbon\Carbon;
  8. use Carbon\CarbonPeriod;
  9. use Doctrine\DBAL\Types\TextType;
  10. use Doctrine\Persistence\ManagerRegistry;
  11. use Psr\Log\LoggerInterface;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\Form\Event\PostSubmitEvent;
  14. use Symfony\Component\Form\Event\PreSubmitEvent;
  15. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  16. // use Symfony\Component\Form\Extension\Core\Type\TextType;
  17. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  18. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  19. use Symfony\Component\Form\Extension\Core\Type\DateType;
  20. use Symfony\Component\Form\FormEvents;
  21. use Symfony\Component\Form\FormInterface;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\Routing\Annotation\Route;
  25. use Symfony\Component\Serializer\Encoder\JsonEncode;
  26. use Symfony\Component\Serializer\Encoder\JsonEncoder;
  27. use Symfony\Component\Serializer\Encoder\CsvEncoder;
  28. use Symfony\Component\Serializer\Encoder\XmlEncoder;
  29. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  30. use Symfony\Component\Serializer\Serializer;
  31. class IaiDefaultController extends AbstractController
  32. {
  33.     private ManagerRegistry $managerRegistry;
  34.     private LoggerInterface $logger;
  35.     public function __construct(ManagerRegistry $registryLoggerInterface $logger)
  36.     {
  37.         $this->managerRegistry $registry;
  38.         $this->logger $logger;
  39.     }
  40.     public function testArray()
  41.     {
  42.         $barChartData = new BarChartData();
  43.         for ($i 1$i <= 12; ++$i) {
  44.             $barChartData->addLabel($i.'/2020');
  45.         }
  46.         $dataSet = new DataSet();
  47.         $dataSet->setLabel('Alumina (export)');
  48.         $dataSet->setHsCode(2818);
  49.         $dataSet->setBackgroundColor('#A293AB');
  50.         $dataSet->setIconClass('alumina');
  51.         $dataSet->setOrder(20);
  52.         $dataSet->addData(0);
  53.         $dataSet->addData(-700380);
  54.         $dataSet->addData(0);
  55.         $dataSet->addData(0);
  56.         $dataSet->addData(-1000);
  57.         $dataSet->addData(0);
  58.         $dataSet->addData(-10000000);
  59.         $dataSet->addData(0);
  60.         $dataSet->addData(0);
  61.         $dataSet->addData(0);
  62.         $dataSet->addData(0);
  63.         $dataSet->addData(0);
  64.         $barChartData->addDataset($dataSet);
  65.         $dataSet = new DataSet();
  66.         $dataSet->setLabel('Scrap (export)');
  67.         $dataSet->setHsCode(7602);
  68.         $dataSet->setBackgroundColor('#7DAA9D');
  69.         $dataSet->setIconClass('scrap');
  70.         $dataSet->setOrder(20);
  71.         $barChartData->addDataset($dataSet);
  72.         $dataSet = new DataSet();
  73.         $dataSet->setLabel('Extrusion (export)');
  74.         $dataSet->setHsCode(7604);
  75.         $dataSet->setBackgroundColor('#9C9E9C');
  76.         $dataSet->setIconClass('extrusion');
  77.         $dataSet->setOrder(20);
  78.         $dataSet->addData(-519);
  79.         $dataSet->addData(-8262);
  80.         $dataSet->addData(-2482);
  81.         $dataSet->addData(-684);
  82.         $dataSet->addData(0);
  83.         $dataSet->addData(0);
  84.         $dataSet->addData(-22);
  85.         $dataSet->addData(-6219);
  86.         $dataSet->addData(-5287);
  87.         $dataSet->addData(-4);
  88.         $dataSet->addData(0);
  89.         $dataSet->addData(0);
  90.         $barChartData->addDataset($dataSet);
  91.         return $barChartData;
  92.     }
  93.     /**
  94.      * @Route("/the-global-aluminium-cycle", name="iai_default")
  95.      * @Route("/iai/default", name="iai_default")
  96.      */
  97.     public function index(Request $requestLoggerInterface $logger)
  98.     {
  99.         $formData = [];
  100.         $rpRepo $this->managerRegistry->getRepository(ReporterPartner::class);
  101.         $periodRepo $this->managerRegistry->getRepository(Period::class);
  102.         $countries $rpRepo->getCountries();
  103.         $partners $rpRepo->getPartners();
  104.         $products $rpRepo->getProducts();
  105.         $productsFormValues = [];
  106.         foreach ($products as $k => $v) {
  107.             $productsFormValues[$v['product']] = $v['product'];
  108.             if ('Ingot (7601)' == $v['product']) {
  109.                 $products[$k]['img'] = 'ingot';
  110.             }
  111.             if ('Scrap (7602)' == $v['product']) {
  112.                 $products[$k]['img'] = 'scrap';
  113.             }
  114.         }
  115.         $flows $rpRepo->getFlows();
  116.         $flowFormValues = [];
  117.         $flowFormValues['Import+Export'] = 'Import+Export';
  118.         foreach ($flows as $k => $v) {
  119.             $flowFormValues[$v['flow']] = $v['flow'];
  120.         }
  121.         $monthly_annual = ['Monthly' => 'monthly''Annual' => 'annual'];
  122.         $filterObj $this->createFormBuilder()
  123.             ->add('export'CheckboxType::class, [
  124.                 'label' => 'Exports',
  125.                 'data' => true,
  126.             ])
  127.             ->add('import'CheckboxType::class, [
  128.                 'label' => 'Imports',
  129.                 'data' => true,
  130.             ])
  131.             ->add('nettrade'CheckboxType::class, [
  132.                 'label' => 'Net Trade',
  133.                 'data' => true,
  134.             ])
  135.             ->add('monthly_annual'ChoiceType::class, [
  136.                 'choices' => $monthly_annual,
  137.                 'required' => true,
  138.                 'expanded' => true,
  139.                 'multiple' => false,
  140.                 'placeholder' => false,
  141.                 'data' => 'monthly',
  142.             ])
  143.             ->add('reporter'ChoiceType::class, [
  144.                 'label' => 'Country',
  145.                 'placeholder' => 'Choose an option',
  146.                 'choices' => $countries,
  147.                 'data' => 'China',
  148.             ])
  149.             ->add('tradingpartner'ChoiceType::class, [
  150.                 'label' => 'Trading Partner',
  151.                 'placeholder' => 'Choose an option',
  152.                 'choices' => $partners,
  153.                 'data' => 'USA',
  154.             ])
  155.             ->add('reportingcountry'ChoiceType::class, [
  156.                 'label' => 'Reporting Country',
  157.                 'placeholder' => 'Choose an option',
  158.                 'choices' => ['China' => 'China''USA' => 'USA'],
  159.                 'data' => 'China',
  160.             ])
  161.             ->add('periodFrom'DateType::class, [
  162.                 'widget' => 'single_text',
  163.                 'html5' => false,
  164.                 'format' => 'MM/y',
  165.                 'data' => new \DateTime('01/01/2020'),
  166.                 'attr' => ['class' => 'js-datepicker'],
  167.             ])
  168.             ->add('periodTo'DateType::class, [
  169.                 'widget' => 'single_text',
  170.                 'html5' => false,
  171.                 'format' => 'MM/y',
  172.                 'data' => new \DateTime('12/01/2020'),
  173.                 'attr' => ['class' => 'js-datepicker'],
  174.             ])
  175.             ->add('download'SubmitType::class, [
  176.                 'label' => 'Download Data'
  177.             ]);
  178.         $filterObj->addEventListener(
  179.             FormEvents::PRE_SUBMIT,
  180.             function (PreSubmitEvent $event): void {
  181.                 $fData $event->getData();
  182.                 if (isset($fData['monthly_annual']) && $fData['monthly_annual'] == 'annual') {
  183.                     $form $event->getForm();
  184.                     $form->remove('periodFrom');
  185.                     $form->remove('periodTo');
  186.                     $form->add('periodFrom'DateType::class, [
  187.                         'widget' => 'single_text',
  188.                         'html5' => false,
  189.                         'format' => 'y',
  190.                         'data' => new \DateTime('01/01/2020'),
  191.                         'attr' => ['class' => 'js-datepicker'],
  192.                     ]);
  193.                     $form->add('periodTo'DateType::class, [
  194.                         'widget' => 'single_text',
  195.                         'html5' => false,
  196.                         'format' => 'y',
  197.                         'data' => new \DateTime('12/01/2020'),
  198.                         'attr' => ['class' => 'js-datepicker'],
  199.                     ]);
  200.                 }
  201.             }
  202.         );
  203.         $logger->debug("Blub");
  204.         $logger->debug($products);
  205.             // ->add('from', TextType::class)
  206.             // ->add('to', TextType::class)
  207.         ;
  208.         $filterObj->get('reportingcountry')->resetViewTransformers();
  209.         // $filterObj->get('export')->setData(true);
  210.         $filterForm $filterObj->getForm();
  211.         $data = [];
  212.         $filterForm->handleRequest($request);
  213.         $isFirstRequest true;
  214.         //$logger->debug($filterObj->getForm()->get('periodFrom')->getConfig()->getOptions());
  215.         if ($filterForm->isSubmitted()) { // && $filterForm->isValid()
  216.             $formData $filterForm->getData();
  217.             $isFirstRequest false;
  218.         } else {
  219.             // default values for Chart
  220.             $formData['export'] = 1;
  221.             $formData['import'] = 1;
  222.             $formData['nettrade'] = 1;
  223.             $formData['reporter'] = 'China';
  224.             $formData['tradingpartner'] = 'USA';
  225.             $formData['reportingcountry'] = 'China';
  226.             $formData['monthly_annual'] = 'monthly';
  227.             $formData['periodFrom'] = \DateTime::createFromFormat('m/Y''01/2020');
  228.             $formData['periodTo'] = \DateTime::createFromFormat('m/Y''12/2020');
  229.         }
  230.         if ($formData['monthly_annual'] != 'monthly' && $formData['monthly_annual'] != 'annual') {
  231.             $formData['monthly_annual'] = 'monthly';
  232.         }
  233.         if ($formData['monthly_annual'] == 'monthly') {
  234.             if ($formData['periodFrom'] == null) {
  235.                 $formData['periodFrom'] = \DateTime::createFromFormat('m/Y''01/2020');
  236.             }
  237.             if ($formData['periodTo'] == null) {
  238.                 $formData['periodTo'] = \DateTime::createFromFormat('m/Y''12/2020');;
  239.             }
  240.         }
  241.         if ($formData['monthly_annual'] == 'annual') {
  242.             if ($formData['periodFrom'] == null) {
  243.                 $formData['periodFrom'] = \DateTime::createFromFormat('Y''2008');
  244.             }
  245.             if ($formData['periodTo'] == null) {
  246.                 $formData['periodTo'] = \DateTime::createFromFormat('Y''2020');;
  247.             }
  248.         }
  249.         if ($filterForm->isSubmitted() && $filterForm->get('download')->isClicked()) {
  250.             return $this->provideCSVResponse($formData);
  251.         }
  252.         return $this->providePageResponse($formData$countries$partners$products$flows$isFirstRequest$filterForm);
  253.     }
  254.     /**
  255.      * @param $queryResult
  256.      * @param $periodType
  257.      * @param LoggerInterface $logger
  258.      * @return array
  259.      */
  260.     public function prepareLabels($queryResult$periodTypeLoggerInterface $logger): array
  261.     {
  262.         $axisDates = [];
  263.         $axisDatesUnique = [];
  264.         /** @var ReporterPartner $rp */
  265.         foreach ($queryResult as $rp) {
  266.             foreach ($rp->getPeriods() as $pv) {
  267.                 if ($periodType == 'monthly') {
  268.                     $date Carbon::create($pv->getYear(), $pv->getMonth());
  269.                     $val $date->format('m/Y');
  270.                 }
  271.                 else { // $formData['monthly_annual'] == 'annual'
  272.                     $date Carbon::create($pv->getYear());
  273.                     $val $date->format('Y');
  274.                 }
  275.                 if (!array_key_exists($val$axisDatesUnique)) {
  276.                     $axisDates[] = $date;
  277.                     $axisDatesUnique[$val] = '';
  278.                 }
  279.             }
  280.         }
  281.         usort($axisDates, function ($a$b) {
  282.             if ($a->lessThan($b)) {
  283.                 return -1;
  284.             }
  285.             else {
  286.                 return 1;
  287.             }
  288.         });
  289.         if ($periodType == 'monthly') {
  290.             $dateFormat 'm/Y';
  291.         }
  292.         else { // $formData['monthly_annual'] == 'annual'
  293.             $dateFormat 'Y';
  294.         }
  295.         $axisLabels array_map(function ($a) use ($dateFormat) {
  296.             return $a->format($dateFormat);
  297.         }, $axisDates);
  298.         return $axisLabels;
  299.     }
  300.     private function providePageResponse($formData$countries$partners$products$flows$isFirstRequest$filterForm) {
  301.         $fromDateHeadline $formData['periodFrom']->format('Y');
  302.         $toDateHeadline $formData['periodTo']->format('Y');
  303.         $reporter $formData['reportingcountry'] ?: "-";
  304.         $reverseTradeFlow false;
  305.         if ($formData['reporter'] == $formData['reportingcountry']) {
  306.             $tradingPartner $formData['tradingpartner'] ?: "-";
  307.         }
  308.         else {
  309.             $tradingPartner $formData['reporter'];
  310.             $reverseTradeFlow true;
  311.         }
  312.         $export $qExport = isset($formData['export']) && $formData['export'] == true;
  313.         $import $qImport = isset($formData['import']) && $formData['import'] == true;
  314.         $netTrade = isset($formData['nettrade']) && $formData['nettrade'] == true;
  315.         if ($reverseTradeFlow) {
  316.             $qExport $import;
  317.             $qImport $export;
  318.         }
  319.         $rpRepo $this->managerRegistry->getRepository(ReporterPartner::class);
  320.         $queryResult $rpRepo->getQueryData($formData$reporter$tradingPartner$qExport$qImport$netTrade);
  321.         $axisLabels $this->prepareLabels($queryResult$formData['monthly_annual'], $this->logger);
  322.         //$logger->debug("axl " . print_r($axisLabels, true));
  323.         $barChartData = new BarChartData();
  324.         $barChartData->setLabels(array_values($axisLabels));
  325.         /** @var ReporterPartner $rp */
  326.         foreach ($queryResult as $k => $rp) {
  327.             if ('Net Trade' == $rp->getTradeFlow()) {
  328.                 continue;
  329.             }
  330.             $this->adjustTradeFlow($reverseTradeFlow$rp);
  331.             $dataSet $this->createNewDataSet($rp->getCommodityCode(), $rp->getTradeFlow());
  332.             $dataSet->setType('bar');
  333.             $dataSet->setBorderColor("#0000001a");
  334.             $dataSet->setOrder(20);
  335.             $periodValues array_fill_keys($axisLabels0);
  336.             foreach ($rp->getPeriods() as $pk => $pv) {
  337.                 if ($formData['monthly_annual'] == 'annual') {
  338.                     $lbl Carbon::create($pv->getYear())->format('Y');
  339.                 } else { //$formData['monthly_annual'] == 'monthly'
  340.                     $lbl Carbon::create($pv->getYear(), $pv->getMonth())->format('m/Y');
  341.                 }
  342.                 if ('Exports' == $rp->getTradeFlow()) {
  343.                     $periodValues[$lbl] = -$pv->getValue();
  344.                 } else {
  345.                     $periodValues[$lbl] = $pv->getValue();
  346.                 }
  347.             }
  348.             $dataSet->setData(array_values($periodValues));
  349.             $barChartData->addDataset($dataSet);
  350.         }
  351.         if ($netTrade) {
  352.             $netTradeSet $this->createNetTradeDataSet();
  353.             /** @var ReporterPartner $rp */
  354.             foreach ($queryResult as $k => $rp) {
  355.                 if ('Net Trade' != $rp->getTradeFlow()) {
  356.                     continue;
  357.                 }
  358.                 $periodValues array_fill_keys($axisLabels0);
  359.                 foreach ($rp->getPeriods() as $pk => $pv) {
  360.                     if ($formData['monthly_annual'] == 'annual') {
  361.                         $lbl Carbon::create($pv->getYear())->format('Y');
  362.                     } else { //$formData['monthly_annual'] == 'monthly'
  363.                         $lbl Carbon::create($pv->getYear(), $pv->getMonth())->format('m/Y');
  364.                     }
  365.                     if ($reverseTradeFlow) {
  366.                         $periodValues[$lbl] = -$pv->getValue();
  367.                     } else {
  368.                         $periodValues[$lbl] = $pv->getValue();
  369.                     }
  370.                 }
  371.                 $existingData $netTradeSet->getData();
  372.                 $addValues array_values($periodValues);
  373.                 if (empty($existingData)) {
  374.                     $netTradeSet->setData(array_values($periodValues));
  375.                 } else {
  376.                     foreach ($existingData as $exKey => $exVal) {
  377.                         $existingData[$exKey] += $addValues[$exKey];
  378.                     }
  379.                     $netTradeSet->setData($existingData);
  380.                 }
  381.             }
  382.             $barChartData->addDataset($netTradeSet);
  383.         }
  384.         //$data = $rpRepo->getData($formData);
  385.         $encoders = [new JsonEncoder()];
  386.         $normalizers = [new ObjectNormalizer()];
  387.         $serializer = new Serializer($normalizers$encoders);
  388.         $jsonContent $serializer->serialize($barChartData'json');
  389.         // $jsonContent = $serializer->serialize($test, 'json');
  390.         //$csvContent = $serializer->serialize($data, 'csv');
  391. //        var_dump($csvContent);
  392.         //$response = new Response($serializer->serialize($barChartData, JsonEncoder::FORMAT, [JsonEncode::OPTIONS => JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT]));
  393.         // $response = new Response($serializer->serialize($test, JsonEncoder::FORMAT, [JsonEncode::OPTIONS => JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT]));
  394.         //$response->headers->set('Content-Type', 'application/json');
  395.         // return $response;
  396.         /*
  397.                 echo '<pre>';
  398.                 echo $jsonContent;
  399.                 echo '</pre>';
  400.                 exit;
  401.         */
  402.         // $logger->debug('CUSTOM: '.var_export($data));
  403.         // return $response;
  404.         $prefix '';
  405.         $binder ' to ';
  406.         if ($import) {
  407.             $prefix "Imports to";
  408.             $binder ' from ';
  409.         }
  410.         if ($export) {
  411.             if ($prefix) {
  412.                 $prefix .= "/";
  413.             }
  414.             $prefix .= "Exports from";
  415.             $binder ' to ';
  416.         }
  417.         if ($netTrade) {
  418.             if ($prefix) {
  419.                 $prefix .= "/";
  420.             }
  421.             $prefix .= "Net Imports to";
  422.             $binder ' from ';
  423.         }
  424.         $title $prefix " " . ($formData['reporter'] ?: "-") . $binder . ($formData['tradingpartner'] ?: "-") . " reported by " . ($formData['reportingcountry'] ?: "-");
  425.         return $this->render('iai_default/index.html.twig', [
  426.             'countries' => $countries,
  427.             'partners' => $partners,
  428.             'products' => $products,
  429.             'flows' => $flows,
  430.             'filterForm' => $filterForm->createView(),
  431.             'title' => $title,
  432.             'reporter' => (isset($formData['reporter']) && !empty($formData['reporter']) ? $formData['reporter'] : 'China'),
  433.             'tradingpartner' => (isset($formData['tradingpartner']) && !empty($formData['tradingpartner']) ? $formData['tradingpartner'] : 'USA'),
  434.             'reportingCountry' => (isset($formData['reportingcountry']) && !empty($formData['reportingcountry']) ? $formData['reportingcountry'] : ''),
  435.             'fromDateHeadline' => $fromDateHeadline,
  436.             'toDateHeadline' => $toDateHeadline,
  437.             // 'data' => $data,
  438.             'data' => $jsonContent,
  439.             'isFirstRequest' => ($isFirstRequest 0),
  440.             'defaults' => $formData,
  441.             // 'response' => $jsonData,
  442.         ]);
  443.     }
  444.     private function provideCSVResponse($formData) {
  445.         $reporter $formData['reportingcountry'];
  446.         $reverseTradeFlow false;
  447.         if ($formData['reporter'] == $formData['reportingcountry']) {
  448.             $tradingPartner $formData['tradingpartner'];
  449.         }
  450.         else {
  451.             $tradingPartner $formData['reporter'];
  452.             $reverseTradeFlow true;
  453.         }
  454.         $export = isset($formData['export']) && $formData['export'] == true;
  455.         $import = isset($formData['import']) && $formData['import'] == true;
  456.         $netTrade = isset($formData['nettrade']) && $formData['nettrade'] == true;
  457.         if ($reverseTradeFlow) {
  458.             $exp $import;
  459.             $imp $export;
  460.             $export $exp;
  461.             $import $imp;
  462.         }
  463.         $rpRepo $this->managerRegistry->getRepository(ReporterPartner::class);
  464.         $queryResult $rpRepo->getQueryData($formData$reporter$tradingPartner$export$import$netTrade);
  465.         $data = [];
  466.         /** @var ReporterPartner $rp */
  467.         foreach ($queryResult as $k => $rp) {
  468.             $this->adjustTradeFlow($reverseTradeFlow$rp);
  469.             $row = [
  470.                 'Country' => $formData['reporter'],
  471.                 'Partner' => $formData['tradingpartner'],
  472.                 'Reporter' => $formData['reportingcountry'],
  473.                 'Trade Flow' => $rp->getTradeFlow(),
  474.                 'Commodity Code (HS)' => $rp->getCommodityCode(),
  475.                 'Commodity' => ReporterPartner::COMMODITY_CODE[$rp->getCommodityCode()],
  476.                 'Unit' => 'kg',
  477.                 ];
  478.             foreach ($rp->getPeriods() as $pk => $pv) {
  479.                 if ($formData['monthly_annual'] == 'annual') {
  480.                     $key Carbon::create($pv->getYear())->format('Y');
  481.                 } else { //$formData['monthly_annual'] == 'monthly'
  482.                     $key Carbon::create($pv->getYear(), $pv->getMonth())->format('m/Y');
  483.                 }
  484.                 if ('Exports' == $rp->getTradeFlow()) {
  485.                     $row[$key] = -$pv->getValue();
  486.                 } else {
  487.                     $row[$key] = $pv->getValue();
  488.                 }
  489.             }
  490.             $data[] = $row;
  491.         }
  492.         $encoders = [new CsvEncoder()];
  493.         $normalizers = [new ObjectNormalizer()];
  494.         $serializer = new Serializer($normalizers$encoders);
  495.         $csvContent $serializer->serialize($dataCsvEncoder::FORMAT);
  496. //        var_dump($csvContent);
  497.         $response = new Response($csvContent);
  498.         $response->headers->set('Content-Type''text/csv');
  499.         return $response;
  500.     }
  501.     /**
  502.      * @param bool $reverseTradeFlow
  503.      * @param ReporterPartner $rp
  504.      * @return Period|mixed
  505.      */
  506.     public function adjustTradeFlow(bool $reverseTradeFlowReporterPartner $rp)
  507.     {
  508.         if (!$reverseTradeFlow) {
  509.             return;
  510.         }
  511.         switch ($rp->getTradeFlow()) {
  512.             case 'Exports':
  513.                 $rp->setTradeFlow('Imports');
  514.                 break;
  515.             case 'Imports':
  516.                 $rp->setTradeFlow('Exports');
  517.                 break;
  518.             case 'Net Trade':
  519.                 foreach ($rp->getPeriods() as $pv) {
  520.                     $pv->setValue(-$pv->getValue());
  521.                 }
  522.                 break;
  523.         }
  524.     }
  525.     /**
  526.      * @param string $commodityCode
  527.      * @param string $tradeFlow
  528.      * @return DataSet
  529.      */
  530.     public function createNewDataSet(string $commodityCodestring $tradeFlow): DataSet
  531.     {
  532.         $dataSet = new DataSet();
  533.         $dataSet->setLabel(ReporterPartner::COMMODITY_CODE[$commodityCode] . ' (' $tradeFlow ')');
  534.         $dataSet->setHsCode($commodityCode);
  535.         $dataSet->setBackgroundColor(ReporterPartner::BACKGROUNDCOLOR[$commodityCode]);
  536.         $dataSet->setIconClass(ReporterPartner::ICONCLASS[$commodityCode]);
  537.         return $dataSet;
  538.     }
  539.     public function createNetTradeDataSet(): DataSet
  540.     {
  541.         $dataSet = new DataSet();
  542.         $dataSet->setLabel('Net Trade');
  543.         $dataSet->setType('line');
  544.         $dataSet->setBackgroundColor('#000000');
  545.         $dataSet->setBorderColor('#000000');
  546.         $dataSet->setOrder(10);
  547.         return $dataSet;
  548.     }
  549. }