<?php
namespace App\Controller\Api;
use App\Controller\AbstractController;
use App\Entity\Livraison;
use App\Entity\Facture;
use App\Model\Enum\AccessControl;
use App\Traits\Autowired\Manager\LivraisonManagerTrait;
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\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/api/livraisons")
* @ApiDescribe(Livraison::class)
*/
class LivraisonController extends AbstractController {
use LivraisonManagerTrait;
/**
* @Route("", methods="GET", requirements={"livraison"="\d+"})
* @IsGranted(AccessControl::API_GET_LIVRAISON, subject="current_user")
* @Serialize(groups="livraison_getc")
* @ApiDescribe(
* request={
* "parameters"={
* "filters"={
* "in"="query",
* "required"=false,
* "type"="string",
* "example"="{""boisType"":[],""boisQuality"":[],""boisSize"":[],""marquage"":[],""volumeInner"":{""min"":0,""max"":0},""volumeOutter"":{""min"":0,""max"":0},""coef"":{""min"":0,""max"":0}}"
* }
* }
* }
* )
*/
public function list() {
return $this->livraisonManager->apiFindBy();
}
/**
* @Route("/{id}", methods="GET", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_GET_LIVRAISON, subject="current_user")
* @Serialize(groups="livraison_get")
*/
public function find(Livraison $livraison) {
return $livraison;
}
/**
* @Route("", methods="POST")
* @IsGranted(AccessControl::API_POST_LIVRAISON, subject="current_user")
* @Unserialize("livraison", groups="livraison_post", save=false)
* @Validate({ "livraison_post" })
* @Serialize(groups="livraison_get")
*
*/
public function post(Livraison $livraison) {
/*if ($livraison->getLivraison()->getPurchase()) {
throw new AccessDeniedHttpException();
}*/
return $this->livraisonManager->update($livraison);
}
/**
* @Route("/{id}", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_LIVRAISON, subject="current_user")
* @Unserialize("livraison", groups="livraison_put", save=false)
* @Validate({ "livraison_put" })
* @Serialize(groups="livraison_get")
*
*/
public function put(Livraison $livraison) {
/*if ($livraison->getLivraison()->getPurchase()) {
throw new AccessDeniedHttpException();
}*/
return $this->livraisonManager->update($livraison);
}
/**
* @Route("/{id}", methods="DELETE", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_DELETE_LIVRAISON, subject="current_user")
* @Serialize(groups="livraison_get")
*
*/
public function delete(Livraison $livraison) {
/*if ($livraison->getLivraison()->getPurchase()) {
throw new AccessDeniedHttpException();
}*/
return $this->livraisonManager->delete($livraison);
}
/**
* @Route("/synthese/{datemin}/{datemax}/{chauffeur}/{scierie}/{bl}/{facture}/{boisType}/{boisQuality}/{boisSize}/{marquage}", methods="GET")
* @IsGranted(AccessControl::API_GET_LIVRAISON, subject="current_user")
* @Serialize(groups="livraison_getc")
*/
public function Synthese(String $datemin, String $datemax, String $chauffeur, String $scierie
, String $bl, String $facture
, String $boisType, String $boisQuality, String $boisSize, String $marquage) {
return $this->livraisonManager->getSynthese($datemin, $datemax, $chauffeur, $scierie, $bl, $facture, $boisType, $boisQuality, $boisSize, $marquage);
}
/**
* @Route("/{id}/putFacture/{id_facture}", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_LIVRAISON, subject="current_user")
* @Serialize(groups="livraison_get")
*
*/
public function putFacture(Livraison $livraison, string $id_facture) {
$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 = "UPDATE livraison SET facture_id=" . $id_facture . " WHERE id=" . $livraison->getId();
$pdo = new \PDO($dsn, $user, $pass);
$stmt = $pdo->prepare($query);
$stmt->execute();
$query = "SELECT numfacture from facture WHERE id=" . $id_facture;
$stmt = $pdo->prepare($query);
$stmt->execute();
$numfacture = $stmt->fetchColumn();
if ($numfacture !== false)
{
$query = "UPDATE cubage_livraison SET numfacture='" . $numfacture . "' WHERE livraison_id=" . $livraison->getId();
$stmt = $pdo->prepare($query);
$stmt->execute();
$query = "UPDATE livraison SET numfacture='" . $numfacture . "' WHERE id=" . $livraison->getId();
$stmt = $pdo->prepare($query);
$stmt->execute();
}
return $livraison;
}
/**
* @Route("/resetFacture/{id}", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_LIVRAISON, subject="current_user")
* @Serialize(groups="livraison_get")
*
*/
public function resetFacture(Livraison $livraison) {
$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 = "UPDATE livraison SET facture_id=null WHERE id=" . $livraison->getId();
$pdo = new \PDO($dsn, $user, $pass);
$stmt = $pdo->prepare($query);
$stmt->execute();
return $livraison;
}
/**
* @Route("/repartir_prix_camion/{id}/{prix}/{prixTransport}", methods="PUT", requirements={"id"="\d+"})
* @IsGranted(AccessControl::API_PUT_LIVRAISON, subject="current_user")
* @Serialize(groups="livraison_get")
*
*/
public function RepartirPrixCamion(Livraison $livraison, String $prix, String $prixTransport) {
return $this->livraisonManager->RepartirPrixCamion($livraison, $prix, $prixTransport);
}
/**
* @Route("/fetch_for_facture/{id}", methods="GET")
* @IsGranted(AccessControl::API_GET_FACTURE, subject="current_user")
* @Serialize(groups="facture_get")
*
*/
public function fetch_for_facture(String $id) {
$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 l.id, l.date, l.bl, t.name as scierie_name, c.first_name as chauffeur_prenom, c.last_name as chauffeur_nom
FROM livraison AS l
LEFT OUTER JOIN chauffeur AS c ON l.chauffeur_id = c.id
LEFT OUTER JOIN tiers AS t ON l.scierie_id = t.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 l.facture_id = ' . $id;
} else {
$queryWhere .= ' AND l.facture_id = ' . $id;
}
$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 == "chauffeur_name")
{
$query .= " ORDER BY c.first_name " . $order;
}
else
{
$query .= " ORDER BY " . $selector . ' ' . $order;
}
}
}
} else {
$query .= " ORDER BY l.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) {
// On va chercher les cubages associƩs a la livraison
$query = "SELECT c.id as id, `bois_type_id`, `bois_quality_id`, `bois_size_id`, `marquage_id`, `volume_inner`, `volume_stere`, volume_approximatif as volumeApproximatif,
bt.name as bois_type, bq.name as bois_quality, bs.name as bois_size, bs.grume, ma.color as marquage_color,
ma.name as marquage,
ch.id as chantier_id, ch.name as chantier_name, ch.client as chantier_client, ch.commune as chantier_commune
FROM `cubage_livraison` as c
LEFT JOIN bois_type as bt ON bt.id=c.bois_type_id
LEFT JOIN bois_quality as bq ON bq.id=c.bois_quality_id
LEFT JOIN bois_size as bs ON bs.id=c.bois_size_id
LEFT JOIN marquage as ma ON ma.id=c.marquage_id
LEFT JOIN chantier AS ch ON c.chantier_id = ch.id
WHERE c.livraison_id = " . $row["id"];
$stmt = $pdo->prepare($query);
$stmt->execute();
$datarestant = $stmt->fetchAll();
foreach($datarestant as $rowcubage) {
$rowcubage["livraison_id"] = $row["id"];
$rowcubage["date"] = $row["date"];
$rowcubage["bl"] = $row["bl"];
$rowcubage["scierie_name"] = $row["scierie_name"];
$rowcubage["chauffeur_name"] = $row["chauffeur_prenom"] . " " . $row["chauffeur_nom"];
$rowcubage["from_plateforme"] = 0;
$result[] = $rowcubage;
}
// On va chercher les cubages PLATEFORME associƩs a la livraison
$query = "SELECT c.id as id, `bois_type_id`, `bois_quality_id`, `bois_size_id`, '' as marquage_id, `volume_inner`, `volume_stere`, volume_approximatif as volumeApproximatif,
bt.name as bois_type, bq.name as bois_quality, bs.name as bois_size, bs.grume, '' as marquage_color,
'' as marquage,
0 as chantier_id, plat.name as chantier_name, '' as chantier_client, cas.name as chantier_commune
FROM `cubage_livraison_plateforme` as c
LEFT JOIN bois_type as bt ON bt.id=c.bois_type_id
LEFT JOIN bois_quality as bq ON bq.id=c.bois_quality_id
LEFT JOIN bois_size as bs ON bs.id=c.bois_size_id
LEFT JOIN plateforme as plat ON plat.id=c.plateforme_id
LEFT JOIN plateforme_case as cas ON cas.id=c.case_id
WHERE c.livraison_id = " . $row["id"];
$stmt = $pdo->prepare($query);
$stmt->execute();
$datarestant = $stmt->fetchAll();
foreach($datarestant as $rowcubage) {
$rowcubage["livraison_id"] = $row["id"];
$rowcubage["date"] = $row["date"];
$rowcubage["bl"] = $row["bl"];
$rowcubage["scierie_name"] = $row["scierie_name"];
$rowcubage["chauffeur_name"] = $row["chauffeur_prenom"] . " " . $row["chauffeur_nom"];
$rowcubage["from_plateforme"] = 1;
$result[] = $rowcubage;
}
}
$total = null;
if ($total != null) { $data = array('data' => $result, 'totalCount' => (float)$total); }
else { $data = array('data' => $result); }
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 == "chauffeur_name") { $selector = "first_name"; }
if ($selector == "chantier_name") { $selector = "ch.name"; }
$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 . "'";
}
}
}