src/Controller/UsagesController.php line 753

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\Routing\Annotation\Route;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use App\Service\TrafficTracker;
  8. use Symfony\Contracts\Translation\TranslatorInterface;
  9. use App\Form\Usages\Importusages;
  10. use App\Form\Usages\RequestAcronisReport;
  11. use App\Form\Usages\RequestAzureBillingExport;
  12. use App\Repository\TaskRepository;
  13. use App\Service\Api\MicrosoftCsp\AzureBilledReconciliationService;
  14. use App\Entity\Agreements;
  15. use App\Entity\Apireports;
  16. use App\Entity\Invoicearticle;
  17. use App\Entity\Partner;
  18. use App\Entity\Partnerlevelbyvendor;
  19. use App\Entity\Product;
  20. use App\Entity\License;
  21. use App\Entity\Productbywholesaler;
  22. use App\Entity\Taxes;
  23. use App\Entity\Vendorprogramms;
  24. use App\Repository\AgreementsRepository;
  25. use App\Service\Api\AcronisClient;
  26. use App\Service\CsvDataImporter;
  27. use App\Service\UsageDataImporter;
  28. use App\Service\GenerateInvoiceArticleDescriptionsService;
  29. use App\Service\RegisterEvent;
  30. use DateTime;
  31. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  32. class UsagesController extends AbstractController
  33. {
  34.     /**
  35.      * @Route("/invoice/usages/indexWholesaler", name="invoice_usages_wholesaler")
  36.      */
  37.     public function usagesWholesaler(Request $requestTrafficTracker $trafficTracker): Response
  38.     {
  39.         $trafficId $trafficTracker->registerTraffic();
  40.         $user $this->getUser();
  41.         if (!$user->getWholesaler()) {
  42.             throw new AccessDeniedHttpException();
  43.         }
  44.         /** @var AgreementsRepository */
  45.         $agreementRepository $this->getDoctrine()->getRepository(Agreements::class);
  46.         $ia_qb1 $agreementRepository->MyAgreementsQuery($user);
  47.         $ia_qb1->andWhere('a.wholesaler IS NOT NULL');
  48.         $ia_qb1->andWhere('a.active = TRUE');
  49.         $ia_qb1->innerJoin('\App\Entity\Vendorprogramms''vp''WITH''a.programm = vp.id');
  50.         $ia_qb1->andWhere('vp.vendorapi LIKE :acronis')->setParameter('acronis''%' 'acronis' '%');
  51.         $acronisAgreement $ia_qb1->setMaxResults(1)
  52.             ->getQuery()
  53.             ->getOneOrNullResult();
  54.         $ia_qb2 $agreementRepository->MyAgreementsQuery($user);
  55.         $ia_qb2->andWhere('a.active = TRUE');
  56.         $ia_qb2->innerJoin('\App\Entity\Vendorprogramms''vp''WITH''a.programm = vp.id');
  57.         $ia_qb2->innerJoin('\App\Entity\Vendors''v''WITH''vp.vendor = v.id');
  58.         $ia_qb2->andWhere('v.name LIKE :SolarWinds')->setParameter('SolarWinds''%' 'N-able' '%');
  59.         $solarwindsAgreement $ia_qb2->setMaxResults(1)
  60.             ->getQuery()
  61.             ->getOneOrNullResult();
  62.         $ia_qb3 $agreementRepository->MyAgreementsQuery($user);
  63.         $ia_qb3->andWhere('a.active = TRUE');
  64.         $ia_qb3->innerJoin('\App\Entity\Vendorprogramms''vp''WITH''a.programm = vp.id');
  65.         $ia_qb3->innerJoin('\App\Entity\Vendors''v''WITH''vp.vendor = v.id');
  66.         $ia_qb3->andWhere('v.name LIKE :Hornetsecurity')->setParameter('Hornetsecurity''%' 'Hornetsecurity' '%');
  67.         $hornetAgreement $ia_qb3->setMaxResults(1)
  68.             ->getQuery()
  69.             ->getOneOrNullResult();
  70.         $ia_qb4 $agreementRepository->MyAgreementsQuery($user);
  71.         $ia_qb4->andWhere('a.active = TRUE');
  72.         $ia_qb4->andWhere('a.wholesaler IS NOT NULL');
  73.         $ia_qb4->innerJoin('\App\Entity\Vendorprogramms''vp''WITH''a.programm = vp.id');
  74.         $ia_qb4->andWhere('vp.vendorapi = :azureApi')->setParameter('azureApi''CSP');
  75.         $cspAgreement $ia_qb4->setMaxResults(1)
  76.             ->getQuery()
  77.             ->getOneOrNullResult();
  78.         $listAgreements['Acronis'] = $acronisAgreement;
  79.         $listAgreements['Solarwinds'] = $solarwindsAgreement;
  80.         $listAgreements['Hornet'] = $hornetAgreement;
  81.         $listAgreements['Azure'] = $cspAgreement;
  82.         return $this->render('usages/index_wholesaler.html.twig', [
  83.             'agreements' => $listAgreements
  84.         ]);
  85.     }
  86.     /**
  87.      * @Route("/invoice/usages/hornet", name="usages_hornet")
  88.      */
  89.     public function hornet(Request $requestTrafficTracker $trafficTrackerTranslatorInterface $translatorUsageDataImporter $usageDataImporterGenerateInvoiceArticleDescriptionsService $descriptionServiceRegisterEvent $registerEvent): Response
  90.     {
  91.         $trafficId $trafficTracker->registerTraffic();
  92.         $currentUser $this->getUser();
  93.         $translator->setLocale($request->getLocale());
  94.         $session $this->get('session');
  95.         $entityManager $this->getDoctrine()->getManager();
  96.         $taxRepository $this->getDoctrine()->getRepository(Taxes::class);
  97.         $form $this->createForm(Importusages::class, null, array(
  98.             'translator' => $translator,
  99.         ));
  100.         $mistakes = array();
  101.         if ($request->getMethod('post') == 'POST') {
  102.             $form->handleRequest($request);
  103.             $post $form->getData();
  104.             // If form is valid
  105.             if ($form->isSubmitted() && $form->isValid()) {
  106.                 $inputFileName $form->get('submitFile')->getData()->getPathName();
  107.                 $usages $usageDataImporter->read($inputFileName);
  108.                 $header $usageDataImporter->getHeadersFromUsages($usages);
  109.                 $data $usageDataImporter->getDataFromUsages($usages);
  110.                 $header_control = array(
  111.                     'partner level 1',
  112.                     'partner level 2',
  113.                     'customer domain',
  114.                     'creation date',
  115.                     'MSF',
  116.                     'ATP',
  117.                     'MAS',
  118.                     'MES',
  119.                     'MCS',
  120.                     'ASD',
  121.                     'TPB',
  122.                     'TPE',
  123.                     'SAT1',
  124.                     'TPEB',
  125.                     'facturable'
  126.                 );
  127.                 if ($header !== $header_control) {
  128.                     $session->getFlashBag()->add('danger'$translator->trans('app.Sales&Invoicing.ProcessingTools.WrongHeader'));
  129.                     return $this->redirectToRoute('usages_hornet');
  130.                 }
  131.                 //Process usages
  132.                 foreach ($data as $usage) {
  133.                     $lastPosition array_key_last($header);
  134.                     //Get domain and check if exists in Katy                    
  135.                     $dominio $usage[2];
  136.                     $facturable $usage[$lastPosition] == 'SI' true false;
  137.                     $license $entityManager->createQuery('SELECT l'
  138.                         ' FROM App\Entity\License l'
  139.                         ' WHERE l.cancellationrequestdate is null'
  140.                         ' AND l.cancellationvendordate is null'
  141.                         ' AND l.licenseid = :id')
  142.                         ->setParameter('id'$dominio)
  143.                         ->setMaxResults(1)
  144.                         ->getOneOrNullResult();
  145.                     if ($license) {
  146.                         $end = ($lastPosition 1);
  147.                         for ($i 4$i <= $end$i++) {
  148.                             $numberOfMailBoxes $usage[$i];
  149.                             $sku $header[$i];
  150.                             $product $entityManager->createQuery('SELECT p'
  151.                                 ' FROM App\Entity\Product p'
  152.                                 ' WHERE p.sku like :sku')
  153.                                 ->setParameter('sku'$sku)
  154.                                 ->getOneOrNullResult();
  155.                             $name $license->getCustomer()->getCompany();
  156.                             $wholesaler $license->getCustomer()->getPartner()->getWholesaler();
  157.                             $productByWholesaler $entityManager->createQuery('SELECT pbw'
  158.                                 ' FROM App\Entity\Productbywholesaler pbw'
  159.                                 ' WHERE pbw.product = :product'
  160.                                 ' AND pbw.wholesaler = :wholesaler')
  161.                                 ->setParameter('product'$product)
  162.                                 ->setParameter('wholesaler'$wholesaler)
  163.                                 ->getOneOrNullResult();
  164.                             if ($productByWholesaler && $numberOfMailBoxes 0) {
  165.                                 $productRepository $this->getDoctrine()->getRepository(\App\Entity\Product::class);
  166.                                 $pbwRepository $this->getDoctrine()->getRepository(\App\Entity\Productbywholesaler::class);
  167.                                 $licenseRepository $this->getDoctrine()->getRepository(\App\Entity\License::class);
  168.                                 $partnerRepository $this->getDoctrine()->getRepository(\App\Entity\Partner::class);
  169.                                 $partnerLevel $partnerRepository->getPartnerLevel($license->getCustomer()->getPartner(), $product->getProductline()->getVendor()->getId());
  170.                                 $discount $productRepository->getDiscount($product$wholesaler->getId(), $partnerLevel);
  171.                                 $price $facturable == 'SI' $productByWholesaler->getPrice(False) : 0;
  172.                                 $priceConverted $facturable == 'SI' $productByWholesaler->getPrice() : 0;
  173.                                 if ($productByWholesaler) {
  174.                                     $tax $taxRepository->getTaxForPbw($productByWholesaler);
  175.                                     $taxValue $tax ? ($price $tax->getValue()) / 100 0;
  176.                                     $taxValueConverted $tax ? ($priceConverted $tax->getValue()) / 100 0;
  177.                                 } else {
  178.                                     $taxValue 0;
  179.                                     $taxValueConverted 0;
  180.                                 }
  181.                                 $description $descriptionService->distributeVendorsDescriptions('Hornet', array(
  182.                                     'sku' => $sku,
  183.                                     'client' => $name,
  184.                                     'month' => $post['month'],
  185.                                     'year' => $post['year']
  186.                                 ));
  187.                                 $total = ($price $numberOfMailBoxes) * ((100 $discount) / 100);
  188.                                 $totalPartner number_format($total4'.''');
  189.                                 $totalConverted = ($priceConverted $numberOfMailBoxes) * ((100 $discount) / 100);
  190.                                 $totalConvertedPartner number_format($totalConverted4'.''');
  191.                                 //Create invoiceline to partner
  192.                                 $newInvoiceArticletoPartner = new \App\Entity\Invoicearticle();
  193.                                 $newInvoiceArticletoPartner->setSale($licenseRepository->getActiveSale($license));
  194.                                 $newInvoiceArticletoPartner->setInvoiceTo('partner');
  195.                                 $newInvoiceArticletoPartner->setCustomer($license->getCustomer());
  196.                                 $newInvoiceArticletoPartner->setSku($sku);
  197.                                 $newInvoiceArticletoPartner->setDescription($description);
  198.                                 $newInvoiceArticletoPartner->setQuantity($numberOfMailBoxes);
  199.                                 $newInvoiceArticletoPartner->setPrice($price);
  200.                                 $newInvoiceArticletoPartner->setPriceConverted($priceConverted);
  201.                                 $newInvoiceArticletoPartner->setDiscount($discount);
  202.                                 $newInvoiceArticletoPartner->setImport($totalPartner);
  203.                                 $newInvoiceArticletoPartner->setImportConverted($totalConvertedPartner);
  204.                                 $newInvoiceArticletoPartner->setImportTax($totalPartner + ($taxValue $totalPartner));
  205.                                 $newInvoiceArticletoPartner->setImportConvertedTax($totalConvertedPartner + ($taxValueConverted $totalConvertedPartner));
  206.                                 $newInvoiceArticletoPartner->setExchangeRate($pbwRepository->getExchangeRate($productByWholesaler));
  207.                                 $newInvoiceArticletoPartner->setgeneratedDate(date_timestamp_get(date_create()));
  208.                                 $newInvoiceArticletoPartner->setPayperiod($product->getPayperiod());
  209.                                 $newInvoiceArticletoPartner->setProduct($product);
  210.                                 $newInvoiceArticletoPartner->setMonth($post['month']);
  211.                                 $newInvoiceArticletoPartner->setYear($post['year']);
  212.                                 $newInvoiceArticletoPartner->setPartner($license->getCustomer()->getPartner());
  213.                                 $entityManager->persist($newInvoiceArticletoPartner);
  214.                                 $registerEvent->addCreatedBy($newInvoiceArticletoPartner$currentUser->getId(), false);
  215.                                 $importCustomer $numberOfMailBoxes $price;
  216.                                 $importConvertedCustomer $numberOfMailBoxes $priceConverted;
  217.                                 //Create invoiceline to customer
  218.                                 $newInvoiceArticletoCustomer = new \App\Entity\Invoicearticle();
  219.                                 $newInvoiceArticletoCustomer->setSale($licenseRepository->getActiveSale($license));
  220.                                 $newInvoiceArticletoCustomer->setInvoiceTo('customer');
  221.                                 $newInvoiceArticletoCustomer->setCustomer($license->getCustomer());
  222.                                 $newInvoiceArticletoCustomer->setSku($sku);
  223.                                 $newInvoiceArticletoCustomer->setDescription($description);
  224.                                 $newInvoiceArticletoCustomer->setQuantity($numberOfMailBoxes);
  225.                                 $newInvoiceArticletoCustomer->setPrice($price);
  226.                                 $newInvoiceArticletoCustomer->setPriceConverted($priceConverted);
  227.                                 $newInvoiceArticletoCustomer->setImport($importCustomer);
  228.                                 $newInvoiceArticletoCustomer->setImportConverted($importConvertedCustomer);
  229.                                 $newInvoiceArticletoCustomer->setImportTax($importCustomer + ($taxValue $importCustomer));
  230.                                 $newInvoiceArticletoCustomer->setImportConvertedTax($importConvertedCustomer + ($taxValueConverted $importConvertedCustomer));
  231.                                 $newInvoiceArticletoCustomer->setExchangeRate($pbwRepository->getExchangeRate($productByWholesaler));
  232.                                 $newInvoiceArticletoCustomer->setgeneratedDate(date_timestamp_get(date_create()));
  233.                                 $newInvoiceArticletoCustomer->setPayperiod($product->getPayperiod());
  234.                                 $newInvoiceArticletoCustomer->setDiscount(0); // El cliente no tiene descuento
  235.                                 $newInvoiceArticletoCustomer->setProduct($product);
  236.                                 $newInvoiceArticletoCustomer->setMonth($post['month']);
  237.                                 $newInvoiceArticletoCustomer->setYear($post['year']);
  238.                                 $newInvoiceArticletoCustomer->setPartner($license->getCustomer()->getPartner());
  239.                                 $entityManager->persist($newInvoiceArticletoCustomer);
  240.                                 $registerEvent->addCreatedBy($newInvoiceArticletoCustomer$currentUser->getId(), false);
  241.                             }
  242.                         }
  243.                     } else {
  244.                         $mistakes[] = $dominio;
  245.                     }
  246.                 }
  247.                 $entityManager->flush();
  248.                 if (!$mistakes) {
  249.                     $session->getFlashBag()->add('success'$translator->trans('app.Development.DataImport.DataImportDone'));
  250.                 }
  251.             }
  252.         }
  253.         return $this->render('usages/hornet.html.twig', [
  254.             'form' => $form->createView(),
  255.             'mistakes' => $mistakes,
  256.             'rootInputDescription' => array()
  257.         ]);
  258.     }
  259.     /**
  260.      * @Route("/invoice/usages/acronis/{agreement_id}", name="usages_acronis")
  261.      */
  262.     public function acronisAction(Request $request$agreement_idAcronisClient $acronisClientRegisterEvent $registerEventTrafficTracker $trafficTrackerTranslatorInterface $translator): Response
  263.     {
  264.         $trafficTracker->registerTraffic();
  265.         $session $this->get('session');
  266.         /** @var EntityManager */
  267.         $entityManager $this->getDoctrine()->getManager();
  268.         $user $this->getUser();
  269.         /** @var Form $form */
  270.         $form $this->createForm(RequestAcronisReport::class, null, array(
  271.             'translator' => $translator,
  272.         ));
  273.         $form->handleRequest($request);
  274.         $post $form->getData();
  275.         if ($form->isSubmitted()) {
  276.             if ($request->getMethod('post') == 'POST' && $form->isValid()) {
  277.                 if (!$this->createAcronisReport($post['periodStart'], $post['periodEnd'], $agreement_id$acronisClient$registerEvent)) {
  278.                     $session->getFlashBag()->add('danger''No se ha podido crear el informe.');
  279.                 }
  280.             }
  281.         }
  282.         $reports $entityManager->createQuery('SELECT ap'
  283.             ' FROM App\Entity\Apireports ap '
  284.             ' WHERE ap.vendor = 14'
  285.             ' AND ap.wholesaler = :wholesaler')
  286.             ->setParameter('wholesaler'$user->getWholesaler())
  287.             ->getResult();
  288.         return $this->render('usages/acronis.html.twig', [
  289.             'reports' => $reports,
  290.             'form' => $form->createView(),
  291.             'agreement_id' => $agreement_id
  292.         ]);
  293.     }
  294.     /**
  295.      * @Route("/invoice/usages/validateacronisreport/{id}", name="usages_validate_acronis_report", requirements={"id"="\d+"})
  296.      */
  297.     public function validateacronisreportAction($idTrafficTracker $trafficTrackerCsvDataImporter $csvDataImporter)
  298.     {
  299.         $trafficTracker->registerTraffic();
  300.         /** @var EntityManager */
  301.         $entityManager $this->getDoctrine()->getManager();
  302.         $session $this->get('session');
  303.         $errors[] = array('tenant_id''tenant_name''tenant_kind''error');
  304.         // find report to validate
  305.         $report $entityManager->createQuery("SELECT ap FROM App\Entity\Apireports ap WHERE ap.id = :id")
  306.             ->setParameter("id"$id)
  307.             ->getOneOrNullResult();
  308.         if ($report) {
  309.             $tenants $this->get_tenants_from_report($report'all'$csvDataImporter);
  310.         } else {
  311.             $session->getFlashBag()->add('warning''Informe de consumos no encontrado. No se ha podido validar el informe.');
  312.             return $this->redirect($this->generateUrl('usages_acronis'));
  313.         }
  314.         // Check if tenant exists in Katy
  315.         foreach ($tenants as $key => $value) {
  316.             $agreement $entityManager->createQuery("SELECT a FROM App\Entity\Agreements a 
  317.             JOIN a.programm p
  318.             WHERE p.id = 9
  319.             AND a.parameters like :parameters")
  320.                 ->setParameter("parameters"'{%"tenant_id": "' $key '"%}')
  321.                 ->setMaxResults(1)
  322.                 ->getOneOrNullResult();
  323.             $wholesaler $agreement $agreement->getWholesaler() : NULL;
  324.             $partner $agreement $agreement->getPartner() : NULL;
  325.             $customer $agreement $agreement->getCustomer() : NULL;
  326.             if (!$customer && !$partner && !$wholesaler) {
  327.                 array_push($errors, array($key$value[0], $value[1], 'Not found.'));
  328.             } elseif ($customer) {
  329.                 $license $entityManager->createQuery("SELECT l 
  330.                 FROM App\Entity\License l 
  331.                 WHERE l.licenseid = :tenant_id")
  332.                     ->setParameter("tenant_id"$key)
  333.                     ->setMaxResults(1)
  334.                     ->getOneOrNullResult();
  335.                 if (!$license) {
  336.                     array_push($errors, array($key$value[0], $value[1], 'License not found.'));
  337.                 }
  338.             }
  339.         }
  340.         $this->array_to_csv_download($errors'Acronis_validation_errors_report_' $id '.csv');
  341.         die;
  342.     }
  343.     /**
  344.      * @Route("/invoice/usages/processacronisreport/{id}", name="usages_process_acronis_report", requirements={"id"="\d+"})
  345.      */
  346.     public function processacronisreportAction($idTrafficTracker $trafficTracker,  RegisterEvent $registerEventCsvDataImporter $csvDataImporterGenerateInvoiceArticleDescriptionsService $descriptionService)
  347.     {
  348.         $trafficTracker->registerTraffic();
  349.         /** @var EntityManager */
  350.         $entityManager $this->getDoctrine()->getManager();
  351.         $vendor $entityManager->createQuery("SELECT v FROM App\Entity\Vendors v WHERE v.id = 14")->getOneOrNullResult();
  352.         $session $this->get('session');
  353.         // find report to process
  354.         $report $entityManager->createQuery("SELECT ar FROM App\Entity\Apireports ar
  355.         WHERE ar.id = :id")
  356.             ->setParameter("id"$id)
  357.             ->getOneOrNullResult();
  358.         $user $this->getUser();
  359.         $agreementWholesaler $entityManager->createQuery("SELECT a FROM App\Entity\Agreements a
  360.         JOIN a.programm p
  361.         WHERE p.id = 9
  362.         AND a.wholesaler = :wholesaler")
  363.             ->setParameter("wholesaler"$user->getWholesaler())
  364.             ->getOneOrNullResult();
  365.         if (!$report) {
  366.             $session->getFlashBag()->add('warning''Informe de consumos no encontrado. No se han procesado consumos.');
  367.             return $this->redirect($this->generateUrl('usages_acronis'));
  368.         }
  369.         $this->calculate_acronis_partner_levels($report$csvDataImporter);
  370.         $acronis_products $entityManager->createQuery("SELECT p FROM App\Entity\Product p
  371.         JOIN p.productLine pl
  372.         WHERE pl.vendor = :vendor")
  373.             ->setParameter("vendor"$vendor)
  374.             ->getResult();
  375.         $acronis_skus = array();
  376.         foreach ($acronis_products as $p) {
  377.             $acronis_skus[] = $p->getProductVendorId();
  378.         }
  379.         // Process customer usages
  380.         $linescreated 0;
  381.         $usages $this->pre_pocess_report($report'usages'$csvDataImporter);
  382.         foreach ($usages as $u) {
  383.             if (in_array($u['name'], $acronis_skus)) {
  384.                 $agreement $entityManager->createQuery("SELECT a FROM App\Entity\Agreements a 
  385.                 JOIN a.programm p
  386.                 WHERE p.id = 9 
  387.                 AND a.parameters like :parameters")
  388.                     ->setParameter("parameters"'{%"tenant_id": "' $u['tenant.id'] . '"%}')
  389.                     ->setMaxResults(1)
  390.                     ->getOneOrNullResult();
  391.                 $license $entityManager->createQuery("SELECT l 
  392.                 FROM App\Entity\License l 
  393.                 WHERE l.licenseid = :tenant_id")
  394.                     ->setParameter("tenant_id"$u['tenant.id'])
  395.                     ->setMaxResults(1)
  396.                     ->getOneOrNullResult();
  397.                 $customer $agreement $agreement->getCustomer() : NULL;
  398.                 if ($customer && $license) {
  399.                     // Check unit
  400.                     if ($u['measurement_unit'] == "bytes") {
  401.                         //Convertir bytes en Gb
  402.                         $bytes_production intval($u['usage.effective.production']);
  403.                         $usage_production round($bytes_production pow(10243), 2);
  404.                         $bytes_trial intval($u['usage.effective.trial']);
  405.                         $usage_trial round($bytes_trial pow(10243), 2);
  406.                     } elseif ($u['name'] === 'compute_points') {
  407.                         // compute_points viene en segundos -> convertir a horas y redondear al alza.
  408.                         $usage_production ceil(($u['usage.effective.production'] / 3600));
  409.                         $usage_trial ceil(($u['usage.effective.trial'] / 3600));
  410.                     } else {
  411.                         $usage_production $u['usage.effective.production'];
  412.                         $usage_trial $u['usage.effective.trial'];
  413.                     }
  414.                     //Create invoice article
  415.                     $product $this->getDoctrine()->getRepository(Product::class)->findOneBy(array('productvendorid' => $u['name']));
  416.                     if ($usage_production 0) {
  417.                         $this->generate_invoice_article($usage_production$customer$product$reportfalse$descriptionService$license);
  418.                         $linescreated += 1;
  419.                     }
  420.                     if ($usage_trial 0) {
  421.                         $this->generate_invoice_article($usage_trial$customer$product$reporttrue$descriptionService$license);
  422.                         $linescreated += 1;
  423.                     }
  424.                 }
  425.             }
  426.         }
  427.         $today = new DateTime('now');
  428.         $report->setdateProcessed($today);
  429.         $entityManager->persist($report);
  430.         $entityManager->flush();
  431.         $registerEvent->addModifiedBy($report$user->getId());
  432.         $session->getFlashBag()->add('success''Se han creado ' $linescreated ' lineas de factura');
  433.         return $this->redirect($this->generateUrl('usages_acronis', ['agreement_id' => $agreementWholesaler->getId()]));
  434.     }
  435.     /**
  436.      * @Route("/invoice/usages/downloadacronisreport/{id}/{agreement_id}", name="usages_download_acronis_report", requirements={"id"="\d+","agreement_id"="\d+"})
  437.      */
  438.     public function downloadacronisreportAction($id$agreement_idAcronisClient $acronisClientTrafficTracker $trafficTrackerTranslatorInterface $translator)
  439.     {
  440.         $trafficTracker->registerTraffic();
  441.         /** @var EntityManager */
  442.         $entityManager $this->getDoctrine()->getManager();
  443.         $session $this->get('session');
  444.         $report $entityManager->createQuery("SELECT ar FROM App\Entity\Apireports ar
  445.         WHERE ar.id = :id")
  446.             ->setParameter("id"$id)
  447.             ->getOneOrNullResult();
  448.         $reportStored $acronisClient->save_acronis_usage_report($report$agreement_id);
  449.         if (is_null($reportStored['status'])) {
  450.             $session->getFlashBag()->add('danger''No se ha podido descargar el reporte');
  451.         } elseif ($reportStored['status'] == 'in_progress') {
  452.             $session->getFlashBag()->add('warning',  $translator->trans('app.Sales&Invoicing.ProcessingTools.ProcessingMessageAcronis'));
  453.         } else {
  454.             $session->getFlashBag()->add('success''Guardado con Ã©xito');
  455.         }
  456.         return $this->redirect($this->generateUrl('usages_acronis', array('agreement_id' => $agreement_id)));
  457.     }
  458.     /**
  459.      * @Route("/invoice/usages/katy_manual", name="usages_katy_manual")
  460.      */
  461.     public function manualUsages(Request $requestTrafficTracker $trafficTracker)
  462.     {
  463.         $trafficTracker->registerTraffic();
  464.         $programmsRepository $this->getDoctrine()->getRepository(Vendorprogramms::class);
  465.         $programms['malwarebytes'] = $programmsRepository->findOneBy(['vendorapi' => 'threatdown']);
  466.         return $this->render('usages/index_katy.html.twig', [
  467.             'programms' => $programms,
  468.         ]);
  469.     }
  470.     // PRIVATE FUNCTIONS //
  471.     private function createAcronisReport($periodStart$periodEnd$agreement_idAcronisClient $acronisClientRegisterEvent $registerEvent)
  472.     {
  473.         /** @var EntityManager */
  474.         $entityManager $this->getDoctrine()->getManager();
  475.         $vendor $entityManager->createQuery("SELECT v FROM App\Entity\Vendors v WHERE v.id = 14")->getOneOrNullResult();
  476.         $currentUser $this->getUser();
  477.         // Solicitar Report a Acronis    
  478.         $newReport $acronisClient->acronis_request_usage_report($periodStart$periodEnd$agreement_id);
  479.         // Check if report has been created
  480.         if (isset($newReport['id'])) {
  481.             //Persist report in data base
  482.             $report = new Apireports();
  483.             $report->setIdVendorReport($newReport['id']);
  484.             $report->setPeriodStart(new DateTime($newReport['parameters']['period']['start']));
  485.             $report->setPeriodEnd(new DateTime($newReport['parameters']['period']['end']));
  486.             $report->setGenerationDate(new DateTime($newReport['generation_date']));
  487.             $report->setReportType('acronis_usages');
  488.             $report->setVendor($vendor);
  489.             $report->setWholesaler($currentUser->getWholesaler());
  490.             $entityManager->persist($report);
  491.             $entityManager->flush();
  492.             $registerEvent->addCreatedBy($report$currentUser->getId());
  493.             //Try retrieve report create
  494.             $acronisClient->acronis_usage_report($report$agreement_id);
  495.         } else {
  496.             return false;
  497.         }
  498.         return $report;
  499.     }
  500.     private function array_to_csv_download($array$filename "export.csv"$delimiter ";")
  501.     {
  502.         header('Content-Type: application/csv');
  503.         header('Content-Disposition: attachment; filename="' $filename '";');
  504.         $f fopen('php://output''w');
  505.         foreach ($array as $line) {
  506.             fputcsv($f$line$delimiter);
  507.         }
  508.         fclose($f);
  509.     }
  510.     private function pre_pocess_report($report$typeCsvDataImporter $csvDataImporter)
  511.     {
  512.         $wholesaler $report->getWholesaler()->getId();
  513.         if ($type == 'usages') {
  514.             $tenant_types = array('customer');
  515.         } else if ($type == 'partners') {
  516.             $tenant_types = array('partner');
  517.         }
  518.         $raw_usages $csvDataImporter->processCSV($this->getParameter('private_folder') .  'reports/' .  $wholesaler '/Acronis/' $report->getFile() . '.csv');
  519.         $usages = array();
  520.         foreach ($raw_usages as $item) {
  521.             if (($item['usage.effective.production'] > || $item['usage.effective.trial'] > 0) && (in_array($item['tenant.kind'], $tenant_types))) {
  522.                 array_push($usages$item);
  523.             }
  524.         }
  525.         return $usages;
  526.     }
  527.     private function get_tenants_from_report($report$tenant_typeCsvDataImporter $csvDataImporter)
  528.     {
  529.         $wholesaler $report->getWholesaler()->getId();
  530.         $raw_usages $csvDataImporter->processCSV($this->getParameter('private_folder') . 'reports/' .  $wholesaler '/Acronis/' $report->getFile() . '.csv');
  531.         if ($tenant_type == 'all') {
  532.             $tenant_types = array('partner''customer');
  533.         } else if ($tenant_type == 'partners') {
  534.             $tenant_types = array('partner');
  535.         } else if ($tenant_type == 'customers') {
  536.             $tenant_types = array('customer');
  537.         }
  538.         $tenants = array();
  539.         foreach ($raw_usages as $item) {
  540.             if (($item['usage.effective.production'] > || $item['usage.effective.trial'] > 0) && (in_array($item['tenant.kind'], $tenant_types))) {
  541.                 $tenants[$item['tenant.id']] = array($item['tenant.name'], $item['tenant.kind']);
  542.             }
  543.         }
  544.         return $tenants;
  545.     }
  546.     private function calculate_acronis_partner_levels($reportCsvDataImporter $csvDataImporter)
  547.     {
  548.         /** @var EntityManager */
  549.         $entityManager $this->getDoctrine()->getManager();
  550.         //Antes de empezar el proceso poner todos los partnerlevels del fabricante Acronis a 1
  551.         $partners $this->get_tenants_from_report($report'partners'$csvDataImporter);
  552.         $vendor $entityManager->createQuery("SELECT v FROM App\Entity\Vendors v WHERE v.id = 14")->getOneOrNullResult();
  553.         foreach ($partners as $key => $value) {
  554.             $agreement $entityManager->createQuery("SELECT a FROM App\Entity\Agreements a 
  555.             JOIN a.programm p
  556.             WHERE p.id = 9
  557.             AND a.parameters like :parameters
  558.             AND a.cancellationdate is not null")
  559.                 ->setParameter("parameters"'{%"tenant_id": "' $key '"%}')
  560.                 ->getOneOrNullResult();
  561.             $partner $agreement $agreement->getPartner() : false;
  562.             if ($partner) {
  563.                 $plbv $entityManager->createQuery("SELECT plbv FROM App\Entity\Partnerlevelbyvendor plbv
  564.                 WHERE plbv.vendor = :vendor
  565.                 AND plbv.partner = :partner")
  566.                     ->setParameter("partner"$partner)
  567.                     ->setParameteR("vendor"$vendor)
  568.                     ->getOneOrNullResult();
  569.                 if (!is_null($plbv)) {
  570.                     $plbv->setLevel(0);
  571.                     $entityManager->persist($plbv);
  572.                     $entityManager->flush();
  573.                 }
  574.             }
  575.         }
  576.         $acronis_products $entityManager->createQuery("SELECT p FROM App\Entity\Product p
  577.         JOIN p.productLine pl
  578.         WHERE pl.vendor = :vendor")
  579.             ->setParameter("vendor"$vendor)
  580.             ->getResult();
  581.         $acronis_skus = array();
  582.         foreach ($acronis_products as $p) {
  583.             $acronis_skus[] = $p->getSku();
  584.         }
  585.         //Calculate Partner Levels
  586.         $usages $this->pre_pocess_report($report'partners'$csvDataImporter);
  587.         foreach ($usages as $u) {
  588.             if (in_array($u['name'], $acronis_skus) && $u['usage.effective.production']) {
  589.                 $agreement $entityManager->createQuery("SELECT a FROM App\Entity\Agreements a 
  590.                 JOIN a.programm p
  591.                 WHERE p.id = 9
  592.                 AND a.parameters like :parameters")
  593.                     ->setParameter("parameters"'{%"tenant_id": "' $u['tenant.id'] . '"%}')
  594.                     ->getOneOrNullResult();
  595.                 $partner $agreement $agreement->getPartner() : NULL;
  596.                 if ($partner) {
  597.                     //Check if vendor has partnerLevelByVendor 
  598.                     $partnerLevelByVendor $entityManager->createQuery("SELECT plbv FROM App\Entity\Partnerlevelbyvendor plbv
  599.                     WHERE plbv.vendor = :vendor
  600.                     AND plbv.partner = :partner")
  601.                         ->setParameter("vendor"$vendor)
  602.                         ->setParameter("partner"$partner)
  603.                         ->getOneOrNullResult();
  604.                     //if not we create one for him.
  605.                     if (!$partnerLevelByVendor) {
  606.                         $partnerLevelByVendor = new Partnerlevelbyvendor();
  607.                         $partnerLevelByVendor->setPartner($partner);
  608.                         $partnerLevelByVendor->setVendor($vendor);
  609.                         $partnerLevelByVendor->setLevel(1);
  610.                         $entityManager->persist($partnerLevelByVendor);
  611.                         $entityManager->flush();
  612.                     }
  613.                     // Check unit
  614.                     if ($u['measurement_unit'] == "bytes") {
  615.                         $bytes intval($u['usage.effective.production']);
  616.                     } else {
  617.                         $bytes 0;
  618.                     }
  619.                     // Set partnerLevel according to
  620.                     if ($bytes 2748779069439) {
  621.                         if ($partnerLevelByVendor->getLevel() < 1) {
  622.                             $partnerLevelByVendor->setLevel(1);
  623.                         }
  624.                     } else if ($bytes <= 16492674416639) {
  625.                         if ($partnerLevelByVendor->getLevel() < 2) {
  626.                             $partnerLevelByVendor->setLevel(2);
  627.                         }
  628.                     } else if ($bytes <= 32985348833279) {
  629.                         if ($partnerLevelByVendor->getLevel() < 3) {
  630.                             $partnerLevelByVendor->setLevel(3);
  631.                         }
  632.                     } else if ($bytes 32985348833279) {
  633.                         if ($partnerLevelByVendor->getLevel() < 4) {
  634.                             $partnerLevelByVendor->setLevel(4);
  635.                         }
  636.                     }
  637.                     $entityManager->persist($partnerLevelByVendor);
  638.                     $entityManager->flush();
  639.                 }
  640.             }
  641.         }
  642.     }
  643.     private function generate_invoice_article($usage$customer$product$report$trial falseGenerateInvoiceArticleDescriptionsService $descriptionService$license)
  644.     {
  645.         /** @var EntityManager */
  646.         $entityManager $this->getDoctrine()->getManager();
  647.         /** @var PartnerRepository */
  648.         $partnerRepository $this->getDoctrine()->getRepository(Partner::class);
  649.         /** @var ProductRepository */
  650.         $productRepository $this->getDoctrine()->getRepository(Product::class);
  651.         /** @var ProductRepository */
  652.         $licenseRepository $this->getDoctrine()->getRepository(License::class);
  653.         /** @var ProductbywholesalerRepository */
  654.         $productByWholesalerRepository $this->getDoctrine()->getRepository(Productbywholesaler::class);
  655.         $taxRepository $this->getDoctrine()->getRepository(Taxes::class);
  656.         //Find productByWholesaler and discount.
  657.         $productByWholesaler $entityManager->createQuery("SELECT pbw FROM App\Entity\Productbywholesaler pbw
  658.         WHERE pbw.product = :product
  659.         AND pbw.wholesaler = :wholesaler")
  660.             ->setParameter("product"$product)
  661.             ->setParameter("wholesaler"$customer->getPartner()->getWholesaler())
  662.             ->getOneOrNullResult();
  663.         $partnerLevel $partnerRepository->getPartnerLevel($customer->getPartner(), $product->getProductline()->getVendor());
  664.         $discount $productRepository->getDiscount($product$customer->getPartner()->getWholesaler(), $partnerLevel);
  665.         $price $trial $productByWholesalerRepository->getPrice($productByWholesalerfalse);
  666.         $priceConverted $trial $productByWholesalerRepository->getPrice($productByWholesaler);
  667.         if ($productByWholesaler) {
  668.             $tax $taxRepository->getTaxForPbw($productByWholesaler);
  669.             $taxValue $tax ? ($price $tax->getValue()) / 100 0;
  670.             $taxValueConverted $tax ? ($priceConverted $tax->getValue()) / 100 0;
  671.         } else {
  672.             $taxValue 0;
  673.             $taxValueConverted 0;
  674.         }
  675.         $newInvoiceArticleToPartner = new Invoicearticle();
  676.         $newInvoiceArticleToPartner->setSale($licenseRepository->getActiveSale($license));
  677.         $newInvoiceArticleToPartner->setInvoiceTo('partner');
  678.         $newInvoiceArticleToPartner->setCustomer($customer);
  679.         $newInvoiceArticleToPartner->setPartner($customer->getPartner());
  680.         $newInvoiceArticleToPartner->setSku($product->getSku());
  681.         $description $descriptionService->distributeVendorsDescriptions('Acronis', array(
  682.             'client' => $customer->getCompany(),
  683.             'vendor' => $product->getProductline()->getVendor()->getName(),
  684.             'product' => $product->getName(),
  685.             'period' => $report->getPeriodStart()->format('m-Y')
  686.         ));
  687.         $newInvoiceArticleToPartner->setDescription($description);
  688.         $newInvoiceArticleToPartner->setQuantity($usage);
  689.         $newInvoiceArticleToPartner->setPrice($price);
  690.         $newInvoiceArticleToPartner->setPriceConverted($priceConverted);
  691.         $newInvoiceArticleToPartner->setDiscount($discount);
  692.         $importPartner $usage * ($price * (100 $discount) / 100);
  693.         $importConvertedPartner $usage * ($priceConverted * (100 $discount) / 100);
  694.         $newInvoiceArticleToPartner->setImport($importPartner);
  695.         $newInvoiceArticleToPartner->setImportConverted($importConvertedPartner);
  696.         $newInvoiceArticleToPartner->setImportTax($importPartner + ($taxValue $usage));
  697.         $newInvoiceArticleToPartner->setImportConvertedTax($importConvertedPartner + ($taxValueConverted $usage));
  698.         $newInvoiceArticleToPartner->setExchangeRate($productByWholesalerRepository->getExchangeRate($productByWholesaler) ? $productByWholesalerRepository->getExchangeRate($productByWholesaler) : null);
  699.         $newInvoiceArticleToPartner->setgeneratedDate(date_timestamp_get(date_create()));
  700.         $newInvoiceArticleToPartner->setPayperiod($product->getPayperiod());
  701.         $newInvoiceArticleToPartner->setProduct($product);
  702.         $newInvoiceArticleToPartner->setMonth($report->getperiodstart()->format('m'));
  703.         $newInvoiceArticleToPartner->setYear($report->getperiodstart()->format('Y'));
  704.         $entityManager->persist($newInvoiceArticleToPartner);
  705.         //Create invoice article to customer
  706.         $newInvoiceArticleToCustomer = new Invoicearticle();
  707.         $newInvoiceArticleToCustomer->setSale($licenseRepository->getActiveSale($license));
  708.         $newInvoiceArticleToCustomer->setInvoiceTo('customer');
  709.         $newInvoiceArticleToCustomer->setCustomer($customer);
  710.         $newInvoiceArticleToCustomer->setPartner($customer->getPartner());
  711.         $newInvoiceArticleToCustomer->setSku($product->getSku());
  712.         $description $product->getProductline()->getVendor()->getName() . ' - ' $product->getName() . ' ' $report->getPeriodStart()->format('m-Y');
  713.         $newInvoiceArticleToCustomer->setDescription($description);
  714.         $newInvoiceArticleToCustomer->setQuantity($usage);
  715.         $newInvoiceArticleToCustomer->setPrice($price);
  716.         $newInvoiceArticleToCustomer->setPriceConverted($priceConverted);
  717.         $newInvoiceArticleToCustomer->setDiscount(0);
  718.         $importCustomer $usage $price;
  719.         $importConvertedCustomer $usage * ($priceConverted * (100 $discount) / 100);
  720.         $newInvoiceArticleToCustomer->setImport($importCustomer);
  721.         $newInvoiceArticleToCustomer->setImportConverted($importConvertedCustomer);
  722.         $newInvoiceArticleToCustomer->setImportTax($importCustomer + ($taxValue $usage));
  723.         $newInvoiceArticleToCustomer->setImportConvertedTax($importConvertedCustomer + ($taxValueConverted $usage));
  724.         $newInvoiceArticleToCustomer->setExchangeRate($productByWholesalerRepository->getExchangeRate($productByWholesaler) ? $productByWholesalerRepository->getExchangeRate($productByWholesaler) : null);
  725.         $newInvoiceArticleToCustomer->setgeneratedDate(date_timestamp_get(date_create()));
  726.         $newInvoiceArticleToCustomer->setPayperiod($product->getPayperiod());
  727.         $newInvoiceArticleToCustomer->setProduct($product);
  728.         $newInvoiceArticleToCustomer->setMonth($report->getperiodstart()->format('m'));
  729.         $newInvoiceArticleToCustomer->setYear($report->getperiodstart()->format('Y'));
  730.         $entityManager->persist($newInvoiceArticleToCustomer);
  731.     }
  732.     /**
  733.      * @Route("/invoice/usages/azure-billing/{agreement_id}", name="usages_azure_billing")
  734.      */
  735.     public function azureBillingAction(Request $requestint $agreement_idAzureBilledReconciliationService $reconciliationServiceTrafficTracker $trafficTrackerTaskRepository $taskRepositoryTranslatorInterface $translator): Response
  736.     {
  737.         $trafficTracker->registerTraffic();
  738.         $session $this->get('session');
  739.         $em $this->getDoctrine()->getManager();
  740.         $agreement $em->getRepository(Agreements::class)->find($agreement_id);
  741.         if (!$agreement) {
  742.             throw $this->createNotFoundException('Agreement not found');
  743.         }
  744.         $form $this->createForm(RequestAzureBillingExport::class);
  745.         $form->handleRequest($request);
  746.         if ($form->isSubmitted() && $form->isValid()) {
  747.             try {
  748.                 $invoiceId $form->getData()['invoiceId'];
  749.                 $reconciliationService->requestExport($agreement$invoiceId);
  750.                 $em->flush();
  751.                 $session->getFlashBag()->add('success'$translator->trans('app.General.SystemMessages.RequestSubmitted'));
  752.             } catch (\Exception $e) {
  753.                 $session->getFlashBag()->add('danger'$translator->trans('app.General.SystemMessages.RequestNotSubmitted'));
  754.             }
  755.             return $this->redirectToRoute('usages_azure_billing', ['agreement_id' => $agreement_id]);
  756.         }
  757.         $tasks $taskRepository->findMsBillingTasksByAgreementId($agreement_id);
  758.         return $this->render('usages/azure_billing.html.twig', [
  759.             'form'         => $form->createView(),
  760.             'tasks'        => $tasks,
  761.             'agreement_id' => $agreement_id,
  762.         ]);
  763.     }
  764. }