<?php
namespace App\Controller;
use App\Entity\Adresse;
use App\Entity\Document;
use App\Entity\DocumentLigne;
use App\Entity\LdvStatutProjet;
use App\Entity\Projet;
use App\Entity\Societe;
use App\Entity\Souche;
use App\Entity\Tiers;
use App\Model\NoteDeFrais\NDF;
use App\Repository\DocumentRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Tools\JsonRes;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\Persistence\ObjectManager;
use function Symfony\Component\Translation\t;
class NdfController extends AbstractController
{
private ?ObjectManager $em = null;
private ?string $prefixSociete = null;
/**
* Stockage des informations de la société pour affichage sur entête document
* @var object|mixed|null
*/
private ?object $dataSociete = null;
public function __construct(RequestStack $requestStack, ManagerRegistry $doctrine)
{
$request = $requestStack->getCurrentRequest();
//TODO: page erreur subdomain
if(null===$request->getSession()->get('societe')) return $this->render('misc/404.html.twig');
// on récupère le sous-domaine stocké en session pour pointer vers le bon entity manager
$subdomain = $request->getSession()->get('societe')->getBase();
$this->em = $doctrine->getManager($subdomain);
$this->prefixSociete = $request->getSession()->get('societe')->getPrefix();
if(null!==$this->prefixSociete) $this->prefixSociete = strtoupper($this->prefixSociete);
$jsonString = $request->getSession()->get('societe')->getData();
if(null!==$jsonString) {
$this->dataSociete = json_decode($jsonString);
$this->dataSociete->lib_societe = $request->getSession()->get('societe')->getLibSociete();
$this->dataSociete->logo_path = $request->getSession()->get('societe')->getLogoPath();
}
}
/**
* @Route("/ndf/reload-list", methods={"POST"}, name="ndf_reload_list")
*/
public function reloadListByFiltre(Request $request): Response
{
$res = new JsonRes($request->request->all());
$filtre = $res->getData();
$documentRepository = $this->em->getRepository(Document::class);
$doc = new Document();
$ndfList = $doc->groupNdfBySalarie(
$documentRepository->findByFilter($filtre)
);
return $this->render('projet/ndf/document-ndf-list.html.twig', [
'ndfList' => $ndfList,
]);
}
/**
* @Route("/ndf/edit/{id}", methods={"GET"}, name="show_ndf")
*/
public function show($id)
{
$documentRepository = $this->em->getRepository(Document::class);
/** @var Document $document */
$document = $documentRepository->find($id);
$ndf = new NDF($document->getProjet(), $document->getTiers(), $document->getSalarie(), 0, $document->getTypeDocument());
return $this->render('document/ndf/ndf-form.html.twig', [
'ndf' => $document,
'projet' => $document->getProjet(),
'type_charge_ndf' => $document->getTypeDocument(),
'select_option_type_ndf' => $ndf->getSelectOptionTypeNdf($document->getReference()),
]);
}
/**
* @Route("/ndf/insert", methods={"POST"}, name="insert_ndf")
*/
public function insert(Request $request)
{
$res = new JsonRes($request->request->all());
$data = $res->getData();
if(empty($data['type_charge'])) $res->addErrMsg('type_charge obligatoire');
if(empty($data['id_projet'])) $res->addErrMsg('id_projet obligatoire');
if(empty($data['id_salarie'])) $res->addErrMsg('id_salarie obligatoire');
if(empty($data['date_ndf'])) $res->addErrMsg('date_ndf obligatoire');
if(!isset($data['num_piece_ndf'])) $res->addErrMsg('num_piece_ndf obligatoire');
if(empty($data['libelle_ndf'])) $res->addErrMsg('libelle_ndf obligatoire');
if(!isset($data['type_ndf'])) $res->addErrMsg('type_ndf obligatoire');
if(empty($data['montant_ttc'])) $res->addErrMsg('montant_ttc obligatoire');
if(empty($data['ventilation_tva'])) $res->addErrMsg('ventilation_tva obligatoire');
if(!$res->isSuccess()) die($res->returnJson());
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
$tiersRepository = $this->em->getRepository(Tiers::class);
/** @var Tiers $salarie */
$salarie = $tiersRepository->find($data['id_salarie']);
if(null===$salarie) $res->addErrMsg('problème lié au salarié');
if(!$res->isSuccess()) die($res->returnJson());
$societeRepository = $this->em->getRepository(Societe::class);
/** @var Societe $societe */
$societe = $societeRepository->findOneBy(['sigle_societe'=>'@@@']);
if(null===$societe) $res->addErrMsg('problème lié à la société');
if(!$res->isSuccess()) die($res->returnJson());
$projetRepository = $this->em->getRepository(Projet::class);
/** @var Projet $projet */
$projet = null;
if('NDF'===$data['type_charge']){
$projet = $projetRepository->find($data['id_projet']);
} else {
$projet = $this->getProjet($societe);
}
if(null===$projet) $res->addErrMsg('problème lié au projet');
if(!$res->isSuccess()) die($res->returnJson());
$ndf = new NDF($projet, $societe, $salarie, $currentUser, $data['type_charge']);
$ndf->setType($data['type_ndf'])
->setDateNdf($data['date_ndf'])
->setNumPiece($data['num_piece_ndf'])
->setDescription($data['libelle_ndf'])
->setMontantTTC($data['montant_ttc'])
;
foreach ($data['ventilation_tva'] as $tva) $ndf->addTva(floatval($tva['taux']), floatval($tva['montant']));
if(!empty($data['montant_avance'])) $ndf->setMontantAvance(floatval($data['montant_avance']));
$document = $ndf->ndfToDocument();
$document->performMontant();
$this->em->persist($document);
$this->em->flush();
die($res->returnJson());
}
/**
* @Route("/ndf/update", methods={"POST"}, name="update_ndf")
*/
public function update(Request $request)
{
$res = new JsonRes($request->request->all());
$data = $res->getData();
if(empty($data['id_ndf'])) $res->addErrMsg('id_ndf obligatoire');
if(empty($data['id_projet'])) $res->addErrMsg('id_projet obligatoire');
if(empty($data['id_salarie'])) $res->addErrMsg('id_salarie obligatoire');
if(empty($data['date_ndf'])) $res->addErrMsg('date_ndf obligatoire');
if(!isset($data['num_piece_ndf'])) $res->addErrMsg('num_piece_ndf obligatoire');
if(empty($data['libelle_ndf'])) $res->addErrMsg('libelle_ndf obligatoire');
if(!isset($data['type_ndf'])) $res->addErrMsg('type_ndf obligatoire');
if(empty($data['montant_ttc'])) $res->addErrMsg('montant_ttc obligatoire');
if(empty($data['ventilation_tva'])) $res->addErrMsg('ventilation_tva obligatoire');
if(!$res->isSuccess()) die($res->returnJson());
$documentRepository = $this->em->getRepository(Document::class);
/** @var Document $document */
$document = $documentRepository->find($data['id_ndf']);
if(null===$document) $res->addErrMsg('problème lié à la base de donnée');
if(!$res->isSuccess()) die($res->returnJson());
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
$tiersRepository = $this->em->getRepository(Tiers::class);
/** @var Tiers $salarie */
$salarie = $tiersRepository->find($data['id_salarie']);
if(null===$salarie) $res->addErrMsg('problème lié au salarié');
if(!$res->isSuccess()) die($res->returnJson());
$ndf = new NDF($document->getProjet(), $document->getTiers(), $salarie, $currentUser, $document->getTypeDocument());
$ndf->setType($data['type_ndf'])
->setDateNdf($data['date_ndf'])
->setNumPiece($data['num_piece_ndf'])
->setDescription($data['libelle_ndf'])
->setMontantTTC($data['montant_ttc'])
;
foreach ($data['ventilation_tva'] as $tva) $ndf->addTva(floatval($tva['taux']), floatval($tva['montant']));
if(!empty($data['montant_avance'])) $ndf->setMontantAvance(floatval($data['montant_avance']));
$document = $ndf->updateDocument($document, $this->em);
$document->performMontant();
$this->em->persist($document);
$this->em->flush();
die($res->returnJson());
}
/**
* @Route("/ndf/vierge/{type}/{id}", methods={"GET"}, name="init_ndf_vierge")
*/
public function getNdfVierge($type, $id)
{
$projetRepository = $this->em->getRepository(Projet::class);
/** @var Projet $projet */
$projet = $projetRepository->find($id);
if(null===$projet) return $this->render('misc/404.html.twig');
$ndfVierge = new Document();
$ndfVierge->initDocVierge($projet, $type);
$ndf = new NDF($projet, new Societe(), new Tiers(), 0);
return $this->render('document/ndf/ndf-form.html.twig', [
'ndf_vierge' => $ndfVierge,
'projet' => $projet,
'type_charge_ndf' => $type,
'select_option_type_ndf' => $ndf->getSelectOptionTypeNdf(),
]);
}
private function getProjet(Societe $societe): ?Projet
{
if(0<$societe->getProjets()->count()) return $societe->getProjets()->first();
$producteurRepository = $this->em->getRepository(Tiers::class);
$producteur = $producteurRepository->find($societe->getUserCrea());
if(null===$producteur) return null;
$statutProjetRepository = $this->em->getRepository(LdvStatutProjet::class);
$statutAnnule = $statutProjetRepository->find(5);
if(null===$statutAnnule) return null;
$date = new \DateTime();
$projet = new Projet();
$projet->setSociete($societe)
->setProducteur($producteur)
->setLibProjet('NDF INTERNE')
->setTypeProjet('interne')
->setDateDeb($date)
->setDateFin($date)
->setDateCrea($date)
->setUserCrea(1)
->setIsActive(false)
->setStatut($statutAnnule)
->setIsAppelOffre(false)
;
$this->em->persist($projet);
$this->em->flush();
return $projet;
}
}