<?php
namespace App\Controller\Api;
use App\Controller\AbstractController;
use App\Entity\Chantier;
use App\Entity\User;
use App\Entity\Chauffeur;
use App\Model\Enum\AccessControl;
use App\Traits\Autowired\Manager\ChantierManagerTrait;
use GollumSF\RestBundle\Annotation\Serialize;
use GollumSF\RestBundle\Annotation\Unserialize;
use GollumSF\RestBundle\Annotation\Validate;
use GollumSF\RestDocBundle\Annotation\ApiDescribe;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\Routing\Annotation\Route;
use Monolog\DateTimeImmutable;
use App\Traits\Autowired\Vendor\TokenStorageTrait;
use App\Traits\Autowired\Manager\UserManagerTrait;
use App\Traits\Autowired\Vendor\RequestStackTrait;
/**
* @Route("/api/chantiers")
* @ApiDescribe(Chantier::class)
*/
class ChantierController extends AbstractController {
use ChantierManagerTrait;
use TokenStorageTrait;
use UserManagerTrait;
use RequestStackTrait;
/**
* @Route("", methods="GET")
* @IsGranted(AccessControl::API_GET_CHANTIER, subject="current_user")
* @Serialize(groups="chantier_getc")
* @ApiDescribe(
* collection=true,
* request={
* "parameters"={
* "filters"={
* "in"="query",
* "required"=false,
* "type"="string",
* "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}}"
* }
* }
* }
* )
*/
public function list() {
return $this->chantierManager->apiFindBy();
}
/**
* @Route("/{id}", methods="GET", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_GET_CHANTIER, subject="current_user")
* @Serialize(groups="chantier_get")
*/
public function find(Chantier $chantier) {
return $chantier;
}
/**
* @Route("", methods="POST")
* @IsGranted(AccessControl::API_POST_CHANTIER, subject="current_user")
* @Unserialize("chantier", groups="chantier_post")
* @Validate({ "chantier_post" })
* @Serialize(groups="chantier_get")
*
*/
public function post(Chantier $chantier) {
$request = $this->requestStack->getMasterRequest();
$post_data = json_decode($request->getContent(), true);
$name = $post_data['name'];
if ($name == "CH-RAPIDE")
{
// on cré le chantier et la prestation
$this->chantierManager->CreationRapideContrat($chantier);
}
return $chantier;
}
/**
* @Route("/{id}", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
* @Unserialize("chantier", groups="chantier_put")
* @Validate({ "chantier_put" })
* @Serialize(groups="chantier_get")
*
*/
public function put(Chantier $chantier) {
//$this->chantierManager->UpdateFinChantierFromAutres($chantier);
return $chantier;
}
/**
* @Route("/{id}", methods="DELETE", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_DELETE_CHANTIER, subject="current_user")
* @Serialize(groups="chantier_get")
*
*/
public function delete(Chantier $chantier) {
return $this->chantierManager->delete($chantier);
}
/**
* @Route("/{id}/mark-PayPrepared", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
* @Serialize(groups="prestation_get")
*
*/
public function putMarkPayPrepared(Chantier $chantier) {
return $this->chantierManager->MarkPayPrepared($chantier);
}
/**
* @Route("/{id}/mark-paid", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
* @Serialize(groups="prestation_get")
*
*/
public function putMarkPaid(Chantier $chantier) {
return $this->chantierManager->markPaid($chantier);
}
/**
* @Route("/{id}/mark-debut", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
* @Serialize(groups="prestation_get")
*
*/
public function putMarkDebut(Chantier $chantier) {
return $this->chantierManager->markDebut($chantier);
}
/**
* @Route("/{id}/mark-fin", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
* @Serialize(groups="prestation_get")
*
*/
public function putMarkFin(Chantier $chantier) {
return $this->chantierManager->markFin($chantier);
}
/**
* @Route("/{id}/mark-avecgrumes", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
* @Serialize(groups="prestation_get")
*
*/
public function putMarkAvecGrumes(Chantier $chantier) {
return $this->chantierManager->markAvecGrumes($chantier);
}
/**
* @Route("/{id}/mark-avecbillons", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
* @Serialize(groups="prestation_get")
*
*/
public function putMarkAvecBillons(Chantier $chantier) {
return $this->chantierManager->markAvecBillons($chantier);
}
/**
* @Route("/{id}/mark-debardagegrumes", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
* @Serialize(groups="prestation_get")
*
*/
public function putMarkDebardageGrumes(Chantier $chantier) {
return $this->chantierManager->markDebardageGrumes($chantier);
}
/**
* @Route("/{id}/mark-debardagebillons", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
* @Serialize(groups="prestation_get")
*
*/
public function putMarkDebardageBillons(Chantier $chantier) {
return $this->chantierManager->markDebardageBillons($chantier);
}
/**
* @Route("/{id}/mark-fincoupe", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
* @Serialize(groups="prestation_get")
*
*/
public function putMarkFincoupe(Chantier $chantier) {
return $this->chantierManager->markFincoupe($chantier);
}
/**
* @Route("/{id}/mark-boisfini", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
* @Serialize(groups="prestation_get")
*
*/
public function putMarkBoisFini(Chantier $chantier) {
return $this->chantierManager->markBoisFini($chantier);
}
/**
* @Route("/{id}/mark-billonsfini", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
* @Serialize(groups="prestation_get")
*
*/
public function putMarkBillonsFini(Chantier $chantier) {
return $this->chantierManager->markBillonsFini($chantier);
}
/**
* @Route("/{id}/setchauffeurcubages", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
* @Serialize(groups="prestation_get")
*
*/
public function setchauffeurcubages(Chantier $chantier) {
return $this->chantierManager->setchauffeurcubages($chantier);
}
/**
* @Route("/{id}/put-coutm3", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
* @Serialize(groups="prestation_get")
*
*/
public function putCoutM3Defaut(Chantier $chantier) {
return $this->chantierManager->putCoutM3Defaut($chantier);
}
/**
* @Route("/{id}/calcul-bilan", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
* @Serialize(groups="prestation_get")
*
*/
public function calculBilan(Chantier $chantier) {
return $this->chantierManager->calculBilan($chantier);
}
/**
* @Route("/affecter_chauffeur/{id}/{chauffeur}/{pourBillons}/{pourGrumes}", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_CHANTIER, subject="current_user")
* @Serialize(groups="prestation_get")
*
*/
public function affecterChauffeur(Chantier $chantier, int $chauffeur, string $pourBillons, string $pourGrumes) {
return $this->chantierManager->affecterChauffeur($chantier, $chauffeur, $pourBillons, $pourGrumes);
}
/**
* @Route("/fetch", methods="GET")
* @IsGranted(AccessControl::API_GET_CHANTIER, subject="current_user")
* @Serialize(groups="chantier_get")
*
*/
public function fetchAll() {
$host = $this->getParameter('database_host');
$port = $this->getParameter('database_port');
$user = $this->getParameter('database_user');
$pass = $this->getParameter('database_password');
$db = $this->getParameter('database_name');
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset;port=$port";
$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";
$queryWhere = '';
if (isset($_REQUEST['filter'])) {
$queryWhere .= " WHERE ";
if (gettype(json_decode($_REQUEST['filter'], true)[0]) === 'string') {
$filter = json_decode($_REQUEST['filter']);
$queryWhere .= $this->createQuery($filter);
} else {
foreach (json_decode($_REQUEST['filter'], true) as $filter) {
if (gettype($filter[0]) === 'array') {
foreach ($filter as $item) {
$queryWhere .= $this->createQuery($item);
}
} else {
$queryWhere .= $this->createQuery($filter);
}
}
}
}
if ($queryWhere == '') {
$queryWhere = ' WHERE c.financial_close = 0 ';
} else {
$queryWhere .= ' AND c.financial_close = 0 ';
}
$query .= $queryWhere;
if (isset($_REQUEST['sort'])) {
foreach (json_decode($_REQUEST['sort'], true) as $sort) {
if (isset($sort['selector']))
{
$selector = $sort['selector'];
$order = $sort['desc'] === true ? 'DESC' : 'ASC';
if ($selector == "billons_debarde")
{
$query .= " ORDER BY avec_billons " . $order . " , ". $selector . ' ' . $order;
}
else if ($selector == "grumes_debarde")
{
$query .= " ORDER BY avec_grumes " . $order . " , ". $selector . ' ' . $order;
}
else
{
$query .= " ORDER BY " . $selector . ' ' . $order;
}
}
}
} else {
$query .= " ORDER BY c.id DESC";
}
$offset = $_REQUEST['skip'];
$limit = $_REQUEST['take'];
$query .= " LIMIT " . $limit . " OFFSET " . $offset;
$result = [];
$pdo = new \PDO($dsn, $user, $pass);
$stmt = $pdo->prepare($query);
$stmt->execute();
$data = $stmt->fetchAll();
foreach($data as $row) {
$row["AlertePaid"] = 0;
if ($row["payer"] == 0)
{
if ($row["dt_end"])
{
if ($row["dt_end"])
{
$originalTime = date("Y-m-d", strtotime($row["dt_end"]));
$targedTime = date("Y-m-d", strtotime('- 20 days'));
if ($originalTime < $targedTime)
$row["AlertePaid"] = "1";
}
}
}
// On va chercher si il reste des billons ou des grumes
$query = "SELECT SUM(volume) as volume_restant FROM cubage_chantier_restant as cu"
. " INNER JOIN bois_size as bs ON bs.id=cu.bois_size_id"
. " WHERE bs.grume=1 AND chantier_id=" . $row["id"];
$stmt = $pdo->prepare($query);
$stmt->execute();
$datarestant = $stmt->fetchColumn();
if ($datarestant == false)
{
$row["grume_restant"] = "0";
}
else
{
$row["grume_restant"] = $datarestant * 1;
}
$query = "SELECT SUM(volume) as volume_restant FROM cubage_chantier_restant as cu"
. " INNER JOIN bois_size as bs ON bs.id=cu.bois_size_id"
. " WHERE bs.grume=0 AND chantier_id=" . $row["id"];
$stmt = $pdo->prepare($query);
$stmt->execute();
$datarestant = $stmt->fetchColumn();
if ($datarestant == false)
{
$row["billon_restant"] = "0";
}
else
{
$row["billon_restant"] = $datarestant / 0.63;
}
$result[] = $row;
}
$total = null;
if (isset($_REQUEST['requireTotalCount'])) {
if ($_REQUEST['requireTotalCount'] === 'true') {
$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;
$total = $pdo->query($countRequest)->fetchColumn();
}
}
if ($total != null) { $data = array('data' => $result, 'totalCount' => (float)$total); }
else { $data = array('data' => $result); }
return $data;
}
/**
* @Route("/mes_chantiers", methods="GET")
* @IsGranted(AccessControl::API_GET_CHANTIER, subject="current_user")
* @Serialize(groups="chantier_get")
*
*/
public function MesChantiers() {
$host = $this->getParameter('database_host');
$port = $this->getParameter('database_port');
$user = $this->getParameter('database_user');
$pass = $this->getParameter('database_password');
$db = $this->getParameter('database_name');
$charset = 'utf8mb4';
$token = $this->tokenStorage->getToken();
$curent_user = null;
if ($token) {
$curent_user = $token->getUser();
}
if ($curent_user == null)
{
throw new Exception("No user define", 1);
}
$dsn = "mysql:host=$host;dbname=$db;charset=$charset;port=$port";
$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";
$queryWhere = '';
if (isset($_REQUEST['filter'])) {
$queryWhere .= " WHERE ";
if (gettype(json_decode($_REQUEST['filter'], true)[0]) === 'string') {
$filter = json_decode($_REQUEST['filter']);
$queryWhere .= $this->createQuery($filter);
} else {
foreach (json_decode($_REQUEST['filter'], true) as $filter) {
if (gettype($filter[0]) === 'array') {
foreach ($filter as $item) {
$queryWhere .= $this->createQuery($item);
}
} else {
$queryWhere .= $this->createQuery($filter);
}
}
}
}
$id = $this->userManager->get_is_abatteur($curent_user);
if ($id > 0)
{
if ($queryWhere == '') {
$queryWhere .= " WHERE c.abatteur_id = " . $id;
} else {
$queryWhere .= " AND c.abatteur_id = " . $id;
}
}
else
{
$id = $this->userManager->get_is_debardeur($curent_user);
if ($id > 0)
{
if ($queryWhere == '') {
$queryWhere .= " WHERE (c.debardeur_id = " . $id . " OR c.debardeurdeux_id = " . $id . ")";
} else {
$queryWhere .= " AND (c.debardeur_id = " . $id . " OR c.debardeurdeux_id = " . $id . ")";
}
}
else
{
if ($queryWhere == '') {
$queryWhere .= " WHERE 3=2";
} else {
$queryWhere .= " AND 3=2";
}
}
}
$query .= $queryWhere;
if (isset($_REQUEST['sort'])) {
foreach (json_decode($_REQUEST['sort'], true) as $sort) {
if (isset($sort['selector']))
{
$selector = $sort['selector'];
$order = $sort['desc'] === true ? 'DESC' : 'ASC';
$query .= " ORDER BY " . $selector . ' ' . $order;
}
}
} else {
$query .= " ORDER BY c.id DESC";
}
$offset = $_REQUEST['skip'];
$limit = $_REQUEST['take'];
$query .= " LIMIT " . $limit . " OFFSET " . $offset;
$result = [];
$pdo = new \PDO($dsn, $user, $pass);
$stmt = $pdo->prepare($query);
$stmt->execute();
$data = $stmt->fetchAll();
foreach($data as $row) {
$result[] = $row;
}
$total = null;
if (isset($_REQUEST['requireTotalCount'])) {
if ($_REQUEST['requireTotalCount'] === 'true') {
$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;
$total = $pdo->query($countRequest)->fetchColumn();
}
}
if ($total != null) { $data = array('data' => $result, 'totalCount' => (float)$total); }
else { $data = array('data' => $result); }
$data['sql'] = $query;
return $data;
}
private function createQuery($param): string {
$newQuery = "";
if ($param == 'and') {
return $newQuery .= " AND ";
} else if ($param == 'or') {
return $newQuery .= " OR ";
} else {
$selector = $param[0];
$text = $param[2];
$operator = $param[1];
if ($selector == "full_name_debardeur") { $selector = "d.full_name_debardeur"; }
else if ($selector == "full_name_debardeurdeux") { $selector = "d2.full_name_debardeur"; }
$newQuery .= $selector;
if ($operator === "contains") { $operator = 'LIKE'; $text = '%' . $text . '%'; }
else if ($operator === "notcontains") { $operator = 'NOT LIKE'; }
else if ($operator === "startswith") { $operator = 'LIKE'; $text = $text . '%'; }
else if ($operator === "endswith") { $operator = 'LIKE'; $text = '%' . $text; }
else if (strpos($selector, 'date') || strpos($selector, 'Date')) { $text = date_format(date_create($text), 'Y-d-m H:i:s'); }
return $newQuery .= " " . $operator . " '" . $text . "'";
}
}
/**
* @Route("/maps/{contrat}/{commune}/{client}/{avecbillons}/{avecgrumes}/{toutfini}", methods="GET")
* @IsGranted(AccessControl::API_GET_CHANTIER, subject="current_user")
* @Serialize(groups="chantier_get")
*/
public function fetchMaps(string $contrat, string $commune, string $client, string $avecgrumes, string $avecbillons, string $toutfini) {
return $this->chantierManager->findForMap($contrat, $commune, $client, $avecgrumes, $avecbillons, $toutfini);
}
/**
* @Route("/map_boisrestants/{grume}/{billon}/{avectous}/{avecautres}/{chauffeur}/{scierie}/{chantier}/{typebois}/{qualitebois}/{taillebois}/{marquage}/{boisvendu}/{boisnonvendu}", methods="GET")
* @IsGranted(AccessControl::API_GET_CHANTIER, subject="current_user")
* @Serialize(groups="chantier_get")
*/
public function fetchBoisrestants(int $grume, int $billon, int $avectous, int $avecautres, string $chauffeur, string $scierie, string $chantier, string $typebois, string $qualitebois, string $taillebois, string $marquage, string $boisvendu, string $boisnonvendu) {
return $this->chantierManager->fetchBoisrestants($grume, $billon, $avectous, $avecautres, $chauffeur, $scierie, $chantier, $typebois, $qualitebois, $taillebois, $marquage, $boisvendu, $boisnonvendu);
}
}