src/App/Controller/Api/ChantierController.php line 59

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api;
  3. use App\Controller\AbstractController;
  4. use App\Entity\Chantier;
  5. use App\Entity\User;
  6. use App\Entity\Chauffeur;
  7. use App\Model\Enum\AccessControl;
  8. use App\Traits\Autowired\Manager\ChantierManagerTrait;
  9. use GollumSF\RestBundle\Annotation\Serialize;
  10. use GollumSF\RestBundle\Annotation\Unserialize;
  11. use GollumSF\RestBundle\Annotation\Validate;
  12. use GollumSF\RestDocBundle\Annotation\ApiDescribe;
  13. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Monolog\DateTimeImmutable;
  16. use App\Traits\Autowired\Vendor\TokenStorageTrait;
  17. use App\Traits\Autowired\Manager\UserManagerTrait;
  18. use App\Traits\Autowired\Vendor\RequestStackTrait;
  19. /**
  20.  * @Route("/api/chantiers")
  21.  * @ApiDescribe(Chantier::class)
  22.  */
  23. class ChantierController extends AbstractController {
  24.     use ChantierManagerTrait;
  25.     use TokenStorageTrait;
  26.     use UserManagerTrait;
  27.     use RequestStackTrait;
  28.     /**
  29.      * @Route("", methods="GET")
  30.      * @IsGranted(AccessControl::API_GET_CHANTIER, subject="current_user")
  31.      * @Serialize(groups="chantier_getc")
  32.      * @ApiDescribe(
  33.      *     collection=true,
  34.      *     request={
  35.      *         "parameters"={
  36.      *             "filters"={
  37.      *                 "in"="query",
  38.      *                 "required"=false,
  39.      *                 "type"="string",
  40.      *                 "example"="{""contact"":[],""dtStart"":{""mode"":""equal"",""equal"":null,""start"":null,""end"":null},""dtEnd"":{""mode"":""equal"",""equal"":null,""start"":null,""end"":null},""expectedDtStart"":{""mode"":""equal"",""equal"":null,""start"":null,""end"":null},""expectedDtEnd"":{""mode"":""equal"",""equal"":null,""start"":null,""end"":null}}"
  41.      *             }
  42.      *         }
  43.      *     }
  44.      * )
  45.      */
  46.     public function list() {
  47.         return $this->chantierManager->apiFindBy();
  48.     }
  49.     /**
  50.      * @Route("/{id}", methods="GET", requirements={"id"="\d+"})
  51.      * @IsGranted(AccessControl::API_GET_CHANTIER, subject="current_user")
  52.      * @Serialize(groups="chantier_get")
  53.      */
  54.     public function find(Chantier $chantier) {
  55.         return $chantier;
  56.     }
  57.     /**
  58.      * @Route("", methods="POST")
  59.      * @IsGranted(AccessControl::API_POST_CHANTIER, subject="current_user")
  60.      * @Unserialize("chantier", groups="chantier_post")
  61.      * @Validate({ "chantier_post" })
  62.      * @Serialize(groups="chantier_get")
  63.      *
  64.      */
  65.     public function post(Chantier $chantier) {
  66.         $request $this->requestStack->getMasterRequest();
  67.         $post_data json_decode($request->getContent(), true);
  68.         $name $post_data['name'];
  69.         if ($name == "CH-RAPIDE")
  70.         {
  71.             // on cré le chantier et la prestation
  72.             $this->chantierManager->CreationRapideContrat($chantier);
  73.         }
  74.         return $chantier;
  75.     }
  76.     /**
  77.      * @Route("/{id}", methods="PUT", requirements={"id"="\d+"})
  78.      * @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
  79.      * @Unserialize("chantier", groups="chantier_put")
  80.      * @Validate({ "chantier_put" })
  81.      * @Serialize(groups="chantier_get")
  82.      *
  83.      */
  84.     public function put(Chantier $chantier) {
  85.         //$this->chantierManager->UpdateFinChantierFromAutres($chantier);
  86.         return $chantier;
  87.     }
  88.     /**
  89.      * @Route("/{id}", methods="DELETE", requirements={"id"="\d+"})
  90.      * @IsGranted(AccessControl::API_DELETE_CHANTIER, subject="current_user")
  91.      * @Serialize(groups="chantier_get")
  92.      *
  93.      */
  94.     public function delete(Chantier $chantier) {
  95.         return $this->chantierManager->delete($chantier);
  96.     }
  97.     
  98.     /**
  99.      * @Route("/{id}/mark-PayPrepared", methods="PUT", requirements={"id"="\d+"})
  100.      * @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
  101.      * @Serialize(groups="prestation_get")
  102.      *
  103.      */
  104.     public function putMarkPayPrepared(Chantier $chantier) {
  105.         return $this->chantierManager->MarkPayPrepared($chantier);
  106.     }
  107.     /**
  108.      * @Route("/{id}/mark-paid", methods="PUT", requirements={"id"="\d+"})
  109.      * @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
  110.      * @Serialize(groups="prestation_get")
  111.      *
  112.      */
  113.     public function putMarkPaid(Chantier $chantier) {
  114.         return $this->chantierManager->markPaid($chantier);
  115.     }
  116.     /**
  117.      * @Route("/{id}/mark-debut", methods="PUT", requirements={"id"="\d+"})
  118.      * @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
  119.      * @Serialize(groups="prestation_get")
  120.      *
  121.      */
  122.     public function putMarkDebut(Chantier $chantier) {
  123.         return $this->chantierManager->markDebut($chantier);
  124.     }
  125.     /**
  126.      * @Route("/{id}/mark-fin", methods="PUT", requirements={"id"="\d+"})
  127.      * @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
  128.      * @Serialize(groups="prestation_get")
  129.      *
  130.      */
  131.     public function putMarkFin(Chantier $chantier) {
  132.         return $this->chantierManager->markFin($chantier);
  133.     }
  134.     /**
  135.      * @Route("/{id}/mark-avecgrumes", methods="PUT", requirements={"id"="\d+"})
  136.      * @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
  137.      * @Serialize(groups="prestation_get")
  138.      *
  139.      */
  140.     public function putMarkAvecGrumes(Chantier $chantier) {
  141.         return $this->chantierManager->markAvecGrumes($chantier);
  142.     }
  143.     /**
  144.      * @Route("/{id}/mark-avecbillons", methods="PUT", requirements={"id"="\d+"})
  145.      * @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
  146.      * @Serialize(groups="prestation_get")
  147.      *
  148.      */
  149.     public function putMarkAvecBillons(Chantier $chantier) {
  150.         return $this->chantierManager->markAvecBillons($chantier);
  151.     }
  152.     /**
  153.      * @Route("/{id}/mark-debardagegrumes", methods="PUT", requirements={"id"="\d+"})
  154.      * @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
  155.      * @Serialize(groups="prestation_get")
  156.      *
  157.      */
  158.     public function putMarkDebardageGrumes(Chantier $chantier) {
  159.         return $this->chantierManager->markDebardageGrumes($chantier);
  160.     }
  161.     /**
  162.      * @Route("/{id}/mark-debardagebillons", methods="PUT", requirements={"id"="\d+"})
  163.      * @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
  164.      * @Serialize(groups="prestation_get")
  165.      *
  166.      */
  167.     public function putMarkDebardageBillons(Chantier $chantier) {
  168.         return $this->chantierManager->markDebardageBillons($chantier);
  169.     }
  170.     /**
  171.      * @Route("/{id}/mark-fincoupe", methods="PUT", requirements={"id"="\d+"})
  172.      * @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
  173.      * @Serialize(groups="prestation_get")
  174.      *
  175.      */
  176.     public function putMarkFincoupe(Chantier $chantier) {
  177.         return $this->chantierManager->markFincoupe($chantier);
  178.     }
  179.     /**
  180.      * @Route("/{id}/mark-boisfini", methods="PUT", requirements={"id"="\d+"})
  181.      * @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
  182.      * @Serialize(groups="prestation_get")
  183.      *
  184.      */
  185.     public function putMarkBoisFini(Chantier $chantier) {
  186.         return $this->chantierManager->markBoisFini($chantier);
  187.     }
  188.     /**
  189.      * @Route("/{id}/mark-billonsfini", methods="PUT", requirements={"id"="\d+"})
  190.      * @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
  191.      * @Serialize(groups="prestation_get")
  192.      *
  193.      */
  194.     public function putMarkBillonsFini(Chantier $chantier) {
  195.         return $this->chantierManager->markBillonsFini($chantier);
  196.     }
  197.     /**
  198.      * @Route("/{id}/setchauffeurcubages", methods="PUT", requirements={"id"="\d+"})
  199.      * @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
  200.      * @Serialize(groups="prestation_get")
  201.      *
  202.      */
  203.     public function setchauffeurcubages(Chantier $chantier) {
  204.         return $this->chantierManager->setchauffeurcubages($chantier);
  205.     }
  206.     /**
  207.      * @Route("/{id}/put-coutm3", methods="PUT", requirements={"id"="\d+"})
  208.      * @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
  209.      * @Serialize(groups="prestation_get")
  210.      *
  211.      */
  212.     public function putCoutM3Defaut(Chantier $chantier) {
  213.         return $this->chantierManager->putCoutM3Defaut($chantier);
  214.     }
  215.     /**
  216.      * @Route("/{id}/calcul-bilan", methods="PUT", requirements={"id"="\d+"})
  217.      * @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
  218.      * @Serialize(groups="prestation_get")
  219.      *
  220.      */
  221.     public function calculBilan(Chantier $chantier) {
  222.         return $this->chantierManager->calculBilan($chantier);
  223.     }
  224.     /**
  225.      * @Route("/affecter_chauffeur/{id}/{chauffeur}/{pourBillons}/{pourGrumes}", methods="PUT", requirements={"id"="\d+"})
  226.      * @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
  227.      * @Serialize(groups="prestation_get")
  228.      *
  229.      */
  230.     public function affecterChauffeur(Chantier $chantierint $chauffeurstring $pourBillonsstring $pourGrumes) {
  231.         return $this->chantierManager->affecterChauffeur($chantier$chauffeur$pourBillons$pourGrumes);
  232.     }
  233.     /**
  234.      * @Route("/fetch", methods="GET")
  235.      * @IsGranted(AccessControl::API_GET_CHANTIER, subject="current_user")
  236.      * @Serialize(groups="chantier_get")
  237.      *
  238.      */
  239.     public function fetchAll() {
  240.         $host $this->getParameter('database_host');
  241.         $port $this->getParameter('database_port');
  242.         $user $this->getParameter('database_user');
  243.         $pass $this->getParameter('database_password');
  244.         $db   $this->getParameter('database_name');
  245.         $charset 'utf8mb4';
  246.         $dsn "mysql:host=$host;dbname=$db;charset=$charset;port=$port";
  247.         $query "SELECT c.id, c.bilan, c.name, c.client, c.commune, c.avec_billons, c.billons_debarde, c.avec_grumes, c.grumes_debarde, c.dt_start, c.dt_end, c.lien1, c.lien_vers_drive, a.full_name_abatteur, d.full_name_debardeur, d2.full_name_debardeur AS full_name_debardeurdeux, c.fin_de_coupe, c.bois_fini, c.billons_fini, c.payer, c.paiement_preparer FROM chantier AS c LEFT OUTER JOIN abatteur AS a ON c.abatteur_id = a.id LEFT OUTER JOIN debardeur AS d ON c.debardeur_id = d.id LEFT OUTER JOIN debardeur AS d2 ON c.debardeurdeux_id = d2.id";
  248.         $queryWhere '';
  249.         if (isset($_REQUEST['filter'])) {
  250.             $queryWhere .= " WHERE ";
  251.             if (gettype(json_decode($_REQUEST['filter'], true)[0]) === 'string') {
  252.                 $filter json_decode($_REQUEST['filter']);
  253.                 $queryWhere .= $this->createQuery($filter);
  254.             } else {
  255.                 foreach (json_decode($_REQUEST['filter'], true) as $filter) {
  256.                     if (gettype($filter[0]) === 'array') {
  257.                         foreach ($filter as $item) {
  258.                             $queryWhere .= $this->createQuery($item);
  259.                         }
  260.                     } else {
  261.                         $queryWhere .= $this->createQuery($filter);
  262.                     }
  263.                 }
  264.             }
  265.         }
  266.         if ($queryWhere == '') {
  267.             $queryWhere ' WHERE c.financial_close = 0 ';
  268.         } else {
  269.             $queryWhere .= ' AND c.financial_close = 0 ';
  270.         }
  271.         $query .= $queryWhere;
  272.         if (isset($_REQUEST['sort'])) {
  273.             foreach (json_decode($_REQUEST['sort'], true) as $sort) {
  274.                 if (isset($sort['selector']))
  275.                 {
  276.                     $selector $sort['selector'];
  277.                     $order $sort['desc'] === true 'DESC' 'ASC';
  278.                     if ($selector == "billons_debarde")
  279.                     {
  280.                         $query .= " ORDER BY avec_billons " $order " , "$selector ' ' $order;
  281.                     }
  282.                     else if ($selector == "grumes_debarde")
  283.                     {
  284.                         $query .= " ORDER BY avec_grumes " $order " , "$selector ' ' $order;
  285.                     }
  286.                     else
  287.                     {
  288.                         $query .= " ORDER BY " $selector ' ' $order;
  289.                     }
  290.                 }
  291.             }
  292.         } else {
  293.             $query .= " ORDER BY c.id DESC";
  294.         }
  295.         $offset $_REQUEST['skip'];
  296.         $limit $_REQUEST['take'];
  297.         $query .= " LIMIT " $limit " OFFSET " $offset;
  298.         $result = [];
  299.         $pdo = new \PDO($dsn$user$pass);
  300.         $stmt $pdo->prepare($query);
  301.         $stmt->execute();
  302.         $data $stmt->fetchAll();
  303.         foreach($data as $row) {
  304.             $row["AlertePaid"] = 0;
  305.             if ($row["payer"] == 0)
  306.             {
  307.                 if ($row["dt_end"])
  308.                 {
  309.                     if ($row["dt_end"])
  310.                     {
  311.                         $originalTime date("Y-m-d"strtotime($row["dt_end"]));
  312.                         $targedTime date("Y-m-d"strtotime('- 20 days'));
  313.                         
  314.                         if ($originalTime  $targedTime)
  315.                             $row["AlertePaid"] = "1";
  316.                     }
  317.                 }
  318.             }
  319.             // On va chercher si il reste des billons ou des grumes
  320.             $query "SELECT SUM(volume) as volume_restant FROM cubage_chantier_restant as cu"
  321.             " INNER JOIN bois_size as bs ON bs.id=cu.bois_size_id"
  322.             " WHERE bs.grume=1 AND chantier_id=" $row["id"];
  323.             $stmt $pdo->prepare($query);
  324.             $stmt->execute();
  325.             $datarestant $stmt->fetchColumn();
  326.             if ($datarestant == false)
  327.             {
  328.                 $row["grume_restant"] = "0";
  329.             }
  330.             else
  331.             {
  332.                 $row["grume_restant"] = $datarestant 1;
  333.             }
  334.             $query "SELECT SUM(volume) as volume_restant FROM cubage_chantier_restant as cu"
  335.             " INNER JOIN bois_size as bs ON bs.id=cu.bois_size_id"
  336.             " WHERE bs.grume=0 AND chantier_id=" $row["id"];
  337.             $stmt $pdo->prepare($query);
  338.             $stmt->execute();
  339.             $datarestant $stmt->fetchColumn();
  340.             if ($datarestant == false)
  341.             {
  342.                 $row["billon_restant"] = "0";
  343.             }
  344.             else
  345.             {
  346.                 $row["billon_restant"] = $datarestant 0.63;
  347.             }
  348.     
  349.             $result[] = $row;
  350.         }
  351.         $total null;
  352.         if (isset($_REQUEST['requireTotalCount'])) {
  353.             if ($_REQUEST['requireTotalCount'] === 'true') {
  354.                 $countRequest "SELECT COUNT(c.id) FROM chantier AS c LEFT OUTER JOIN abatteur AS a ON c.abatteur_id = a.id LEFT OUTER JOIN debardeur AS d ON c.debardeur_id = d.id LEFT OUTER JOIN debardeur AS d2 ON c.debardeurdeux_id = d2.id" $queryWhere;
  355.                 $total $pdo->query($countRequest)->fetchColumn();
  356.             }
  357.         }
  358.         if ($total != null) { $data = array('data' => $result'totalCount' => (float)$total); }
  359.         else { $data = array('data' => $result); }
  360.         return $data;
  361.     }
  362.     /**
  363.      * @Route("/mes_chantiers", methods="GET")
  364.      * @IsGranted(AccessControl::API_GET_CHANTIER, subject="current_user")
  365.      * @Serialize(groups="chantier_get")
  366.      *
  367.      */
  368.     public function MesChantiers() {
  369.         $host $this->getParameter('database_host');
  370.         $port $this->getParameter('database_port');
  371.         $user $this->getParameter('database_user');
  372.         $pass $this->getParameter('database_password');
  373.         $db   $this->getParameter('database_name');
  374.         $charset 'utf8mb4';
  375.         $token $this->tokenStorage->getToken();
  376.         $curent_user null;
  377.         if ($token) {
  378.             $curent_user $token->getUser();
  379.         }
  380.         if ($curent_user == null)
  381.         {
  382.             throw new Exception("No user define"1);
  383.         }
  384.         $dsn "mysql:host=$host;dbname=$db;charset=$charset;port=$port";
  385.         $query "SELECT c.id, c.bilan, c.name, c.client, c.commune, c.avec_billons, c.billons_debarde, c.avec_grumes, c.grumes_debarde, c.dt_start, c.dt_end, c.lien1, c.lien_vers_drive, a.full_name_abatteur, d.full_name_debardeur, d2.full_name_debardeur AS full_name_debardeurdeux, c.fin_de_coupe, c.bois_fini, c.billons_fini, c.payer FROM chantier AS c LEFT OUTER JOIN abatteur AS a ON c.abatteur_id = a.id LEFT OUTER JOIN debardeur AS d ON c.debardeur_id = d.id LEFT OUTER JOIN debardeur AS d2 ON c.debardeurdeux_id = d2.id";
  386.         $queryWhere '';
  387.         if (isset($_REQUEST['filter'])) {
  388.             $queryWhere .= " WHERE ";
  389.             if (gettype(json_decode($_REQUEST['filter'], true)[0]) === 'string') {
  390.                 $filter json_decode($_REQUEST['filter']);
  391.                 $queryWhere .= $this->createQuery($filter);
  392.             } else {
  393.                 foreach (json_decode($_REQUEST['filter'], true) as $filter) {
  394.                     if (gettype($filter[0]) === 'array') {
  395.                         foreach ($filter as $item) {
  396.                             $queryWhere .= $this->createQuery($item);
  397.                         }
  398.                     } else {
  399.                         $queryWhere .= $this->createQuery($filter);
  400.                     }
  401.                 }
  402.             }
  403.         }
  404.         $id $this->userManager->get_is_abatteur($curent_user);
  405.         if ($id 0)
  406.         {
  407.             if ($queryWhere == '') {
  408.                 $queryWhere .= " WHERE c.abatteur_id = " $id;
  409.             } else {
  410.                 $queryWhere .= " AND c.abatteur_id = " $id;
  411.             }
  412.         }
  413.         else
  414.         {
  415.             $id $this->userManager->get_is_debardeur($curent_user);
  416.             if ($id 0)
  417.             {
  418.                 if ($queryWhere == '') {
  419.                     $queryWhere .= " WHERE (c.debardeur_id = " $id " OR c.debardeurdeux_id = " $id ")";
  420.                 } else {
  421.                     $queryWhere .= " AND (c.debardeur_id = " $id " OR c.debardeurdeux_id = " $id ")";
  422.                 }
  423.             }
  424.             else
  425.             {
  426.                 if ($queryWhere == '') {
  427.                     $queryWhere .= " WHERE 3=2";
  428.                 } else {
  429.                     $queryWhere .= " AND 3=2";
  430.                 }
  431.             }
  432.         }
  433.         $query .= $queryWhere;
  434.         if (isset($_REQUEST['sort'])) {
  435.             foreach (json_decode($_REQUEST['sort'], true) as $sort) {
  436.                 if (isset($sort['selector']))
  437.                 {
  438.                     $selector $sort['selector'];
  439.                     $order $sort['desc'] === true 'DESC' 'ASC';
  440.                     $query .= " ORDER BY " $selector ' ' $order;
  441.                 }
  442.             }
  443.         } else {
  444.             $query .= " ORDER BY c.id DESC";
  445.         }
  446.         $offset $_REQUEST['skip'];
  447.         $limit $_REQUEST['take'];
  448.         $query .= " LIMIT " $limit " OFFSET " $offset;
  449.         $result = [];
  450.         $pdo = new \PDO($dsn$user$pass);
  451.         $stmt $pdo->prepare($query);
  452.         $stmt->execute();
  453.         $data $stmt->fetchAll();
  454.         foreach($data as $row) {
  455.             $result[] = $row;
  456.         }
  457.         $total null;
  458.         if (isset($_REQUEST['requireTotalCount'])) {
  459.             if ($_REQUEST['requireTotalCount'] === 'true') {
  460.                 $countRequest "SELECT COUNT(c.id) FROM chantier AS c LEFT OUTER JOIN abatteur AS a ON c.abatteur_id = a.id LEFT OUTER JOIN debardeur AS d ON c.debardeur_id = d.id LEFT OUTER JOIN debardeur AS d2 ON c.debardeurdeux_id = d2.id" $queryWhere;
  461.                 $total $pdo->query($countRequest)->fetchColumn();
  462.             }
  463.         }
  464.         if ($total != null) { $data = array('data' => $result'totalCount' => (float)$total); }
  465.         else { $data = array('data' => $result); }
  466.         $data['sql'] = $query;
  467.         return $data;
  468.     }
  469.     private function createQuery($param): string {
  470.         $newQuery "";
  471.         if ($param == 'and') {
  472.             return $newQuery .= " AND ";
  473.         } else if ($param == 'or') {
  474.             return $newQuery .= " OR ";
  475.         } else {
  476.             $selector $param[0];
  477.             $text $param[2];
  478.             $operator $param[1];
  479.             if ($selector == "full_name_debardeur") { $selector "d.full_name_debardeur"; }
  480.             else if ($selector == "full_name_debardeurdeux") { $selector "d2.full_name_debardeur"; }
  481.             $newQuery .= $selector;
  482.             if ($operator === "contains") { $operator 'LIKE'$text '%' $text '%'; }
  483.             else if ($operator === "notcontains") { $operator 'NOT LIKE'; }
  484.             else if ($operator === "startswith") { $operator 'LIKE'$text $text '%'; }
  485.             else if ($operator === "endswith") { $operator 'LIKE'$text =  '%' $text; }
  486.             else if (strpos($selector'date') || strpos($selector'Date')) { $text date_format(date_create($text), 'Y-d-m H:i:s'); }
  487.             return $newQuery .= " " $operator " '" $text "'";
  488.         }
  489.     }
  490.     /**
  491.      * @Route("/maps/{contrat}/{commune}/{client}/{avecbillons}/{avecgrumes}/{toutfini}", methods="GET")
  492.      * @IsGranted(AccessControl::API_GET_CHANTIER, subject="current_user")
  493.      * @Serialize(groups="chantier_get")
  494.      */
  495.     public function fetchMaps(string $contratstring $communestring $clientstring $avecgrumesstring $avecbillonsstring $toutfini) {
  496.         return $this->chantierManager->findForMap($contrat$commune$client$avecgrumes$avecbillons$toutfini);
  497.     }
  498.     /**
  499.      * @Route("/map_boisrestants/{grume}/{billon}/{avectous}/{avecautres}/{chauffeur}/{scierie}/{chantier}/{typebois}/{qualitebois}/{taillebois}/{marquage}/{boisvendu}/{boisnonvendu}", methods="GET")
  500.      * @IsGranted(AccessControl::API_GET_CHANTIER, subject="current_user")
  501.      * @Serialize(groups="chantier_get")
  502.      */
  503.     public function fetchBoisrestants(int $grumeint $billonint $avectousint $avecautresstring $chauffeurstring $scieriestring $chantierstring $typeboisstring $qualiteboisstring $tailleboisstring $marquagestring $boisvendustring $boisnonvendu) {
  504.         return $this->chantierManager->fetchBoisrestants($grume$billon$avectous$avecautres$chauffeur$scierie$chantier$typebois$qualitebois$taillebois$marquage$boisvendu$boisnonvendu);
  505.     }
  506. }