<?php
namespace App\Controller;
use App\Entity\Adresse;
use App\Entity\Document;
use App\Entity\DocumentLigne;
use App\Entity\Projet;
use App\Entity\Societe;
use App\Entity\Souche;
use App\Entity\Tiers;
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;
class DocumentController 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("/document/update-societe", methods={"POST"}, name="update_doc_societe")
*/
public function updateSociete(Request $request): Response
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
// Initialisation du retour Json
$res = new JsonRes($request->request->all());
if($res->isSuccess()) {
$data = $res->getData();
if(!isset($data['id_document'])) $res->addErrMsg('champs id_document inconnu');
if(!isset($data['id_societe'])) $res->addErrMsg('champs id_societe inconnu');
if($res->isSuccess()) {
if(''===$data['id_document']) $res->addErrMsg('champs id_document obligatoire');
if(''===$data['id_societe']) $res->addErrMsg('champs id_societe obligatoire');
if($res->isSuccess()) {
$adresseRepository = $this->em->getRepository(Societe::class);
/** @var Societe $societe */
$societe = $adresseRepository->find($data['id_societe']);
if(null===$societe) $res->addErrMsg('Societe introuvable');
if($res->isSuccess()) {
if(0===$societe->getAdresses()->count()) $res->addErrMsg('Cette société n\'a pas d\'adresse, ajouter une adresse');
if($res->isSuccess()) {
$documentRepository = $this->em->getRepository(Document::class);
/** @var Document $document */
$document = $documentRepository->find($data['id_document']);
if(!null==$document) {
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
$document->setTiers($societe)
->setAdresse($societe->getAdresses()->first())
->setUserModif($currentUser)
->setDateModif(new \DateTime())
;
$this->em->persist($document);
$this->em->flush();
}
$res->setData($data);
}
}
}
}
}
die($res->returnJson());
}
/**
* @Route("/document/update-adresse", methods={"POST"}, name="update_doc_adresse")
*/
public function updateAdresse(Request $request): Response
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
// Initialisation du retour Json
$res = new JsonRes($request->request->all());
if($res->isSuccess()) {
$data = $res->getData();
if(!isset($data['id_document'])) $res->addErrMsg('champs id_document inconnu');
if(!isset($data['id_adresse'])) $res->addErrMsg('champs id_adresse inconnu');
if($res->isSuccess()) {
if(''===$data['id_document']) $res->addErrMsg('champs id_document obligatoire');
if(''===$data['id_adresse']) $res->addErrMsg('champs id_adresse obligatoire');
if($res->isSuccess()) {
$adresseRepository = $this->em->getRepository(Adresse::class);
/** @var Adresse $adresse */
$adresse = $adresseRepository->find($data['id_adresse']);
if(null===$adresse) $res->addErrMsg('Adresse introuvable');
if($res->isSuccess()) {
$res->setHtml('
<p>' . $adresse->getLigne1() . '</p>
<p>' . $adresse->getLigne2() . '</p>
<p>' . $adresse->getCodePostal() . ' ' . $adresse->getVille() . '</p>
<p>' . $adresse->getPays() . '</p>
');
}
$documentRepository = $this->em->getRepository(Document::class);
/** @var Document $document */
$document = $documentRepository->find($data['id_document']);
if(!null==$document) {
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
$document->setAdresse($adresse)
->setUserModif($currentUser)
->setDateModif(new \DateTime())
;
$this->em->persist($document);
$this->em->flush();
}
$res->setData($data);
}
}
}
die($res->returnJson());
}
/**
* @Route("/document/update-lib-projet", methods={"POST"}, name="update_doc_lib_projet")
*/
public function updateLibProjet(Request $request): Response
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
// Initialisation du retour Json
$res = new JsonRes($request->request->all());
if($res->isSuccess()) {
$data = $res->getData();
if(!isset($data['id_document'])) $res->addErrMsg('champs id_document inconnu');
if(!isset($data['lib_projet_document'])) $res->addErrMsg('champs lib_projet_document inconnu');
if($res->isSuccess()) {
if(''===$data['id_document']) $res->addErrMsg('champs id_document obligatoire');
if($res->isSuccess()) {
$documentRepository = $this->em->getRepository(Document::class);
/** @var Document $document */
$document = $documentRepository->find($data['id_document']);
if(!null==$document) {
if(''===$data['lib_projet_document']) $data['lib_projet_document'] = $document->getProjet()->getLibProjet();
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
$document->setLibProjet($data['lib_projet_document'])
->setUserModif($currentUser)
->setDateModif(new \DateTime())
;
$this->em->persist($document);
$this->em->flush();
}
$res->setData($data);
}
}
}
die($res->returnJson());
}
/**
* @Route("/document/update-date-bdc", methods={"POST"}, name="update_doc_date_bdc")
*/
public function updateDateBdc(Request $request): Response
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
// Initialisation du retour Json
$res = new JsonRes($request->request->all());
if($res->isSuccess()) {
$data = $res->getData();
if(!isset($data['id_document'])) $res->addErrMsg('champs id_document inconnu');
if(!isset($data['date_bdc_document'])) $res->addErrMsg('champs date_bdc_document inconnu');
if($res->isSuccess()) {
if(''===$data['id_document']) $res->addErrMsg('champs id_document obligatoire');
$dateBdc = date_create_from_format('Y-m-d', $data['date_bdc_document']);
if(!$dateBdc) $res->addErrMsg('Le format de la date est incorrect');
if($res->isSuccess()) {
$documentRepository = $this->em->getRepository(Document::class);
/** @var Document $document */
$document = $documentRepository->find($data['id_document']);
if(!null==$document) {
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
$document->setDateBdc($dateBdc)
->setUserModif($currentUser)
->setDateModif(new \DateTime())
;
$this->em->persist($document);
$this->em->flush();
}
$res->setData($data);
}
}
}
die($res->returnJson());
}
/**
* @Route("/document/update-date-budget", methods={"POST"}, name="update_doc_date_budget")
*/
public function updateDateBudget(Request $request): Response
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
// Initialisation du retour Json
$res = new JsonRes($request->request->all());
$data = $res->getData();
if(!$this->isGranted('ROLE_ADMIN')) $res->addErrMsg('Vous n\'avez pas les droits pour effectuer cette action');
if(empty($data['id_document'])) $res->addErrMsg('erreur id_document');
if(empty($data['date_budget'])) $res->addErrMsg('erreur date_budget');
if(!$res->isSuccess()) die($res->returnJson());
$dateBudget = date_create_from_format('Y-m-d', $data['date_budget']);
if(!$dateBudget) $res->addErrMsg('Le format de la date est incorrect');
if(!$res->isSuccess()) die($res->returnJson());
$documentRepository = $this->em->getRepository(Document::class);
/** @var Document $document */
$document = $documentRepository->find($data['id_document']);
if(empty($document)) $res->addErrMsg('Document non trouvé dans la base de donnée');
if(!$res->isSuccess()) die($res->returnJson());
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
$document->setDateCrea($dateBudget)
->setUserModif($currentUser)
->setDateModif(new \DateTime())
;
$this->em->persist($document);
$this->em->flush();
$res->setData($data);
die($res->returnJson());
}
/**
* @Route("/document/update-reference", methods={"POST"}, name="update_doc_reference")
*/
public function updateReference(Request $request): Response
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
// Initialisation du retour Json
$res = new JsonRes($request->request->all());
if($res->isSuccess()) {
$data = $res->getData();
if(!isset($data['id_document'])) $res->addErrMsg('champs id_document inconnu');
if(!isset($data['reference_document'])) $res->addErrMsg('champs reference_document inconnu');
if($res->isSuccess()) {
if(''===$data['id_document']) $res->addErrMsg('champs id_document obligatoire');
if($res->isSuccess()) {
$documentRepository = $this->em->getRepository(Document::class);
/** @var Document $document */
$document = $documentRepository->find($data['id_document']);
if(!null==$document) {
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
$document->setReference($data['reference_document'])
->setUserModif($currentUser)
->setDateModif(new \DateTime())
;
$this->em->persist($document);
$this->em->flush();
}
$res->setData($data);
}
}
}
die($res->returnJson());
}
/**
* @Route("/document/update-contact", methods={"POST"}, name="update_doc_contact")
*/
public function updateContact(Request $request): Response
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
// Initialisation du retour Json
$res = new JsonRes($request->request->all());
if($res->isSuccess()) {
$data = $res->getData();
if(!isset($data['id_document'])) $res->addErrMsg('champs id_document inconnu');
if(!isset($data['contact_document'])) $res->addErrMsg('champs contact_document inconnu');
if($res->isSuccess()) {
if(''===$data['id_document']) $res->addErrMsg('champs id_document obligatoire');
if($res->isSuccess()) {
$documentRepository = $this->em->getRepository(Document::class);
/** @var Document $document */
$document = $documentRepository->find($data['id_document']);
if(!null==$document) {
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
$document->setContact($data['contact_document'])
->setUserModif($currentUser)
->setDateModif(new \DateTime())
;
$this->em->persist($document);
$this->em->flush();
}
$res->setData($data);
}
}
}
die($res->returnJson());
}
/**
* @Route("/document/update-condition-reglement", methods={"POST"}, name="update_doc_condition_reglement")
*/
public function updateConditionReglement(Request $request): Response
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
// Initialisation du retour Json
$res = new JsonRes($request->request->all());
if($res->isSuccess()) {
$data = $res->getData();
if(!isset($data['id_document'])) $res->addErrMsg('champs id_document inconnu');
if(!isset($data['condition_reglement_document'])) $res->addErrMsg('champs condition_reglement_document inconnu');
if($res->isSuccess()) {
if(''===$data['id_document']) $res->addErrMsg('champs id_document obligatoire');
if($res->isSuccess()) {
if(empty($data['condition_reglement_document'])) $data['condition_reglement_document'] = null;
$documentRepository = $this->em->getRepository(Document::class);
/** @var Document $document */
$document = $documentRepository->find($data['id_document']);
if(!null==$document) {
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
$document->setConditionReglement($data['condition_reglement_document'])
->setUserModif($currentUser)
->setDateModif(new \DateTime())
;
$this->em->persist($document);
$this->em->flush();
}
$res->setData($data);
}
}
}
die($res->returnJson());
}
/**
* @Route("/document/update-statut", methods={"POST"}, name="update_doc_statut")
*/
public function updateStatut(Request $request): Response
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
// Initialisation du retour Json
$res = new JsonRes($request->request->all());
if($res->isSuccess()) {
$data = $res->getData();
if(!isset($data['id_document'])) $res->addErrMsg('champs id_document inconnu');
if($res->isSuccess()) {
if(''===$data['id_document']) $res->addErrMsg('champs id_document obligatoire');
if($res->isSuccess()) {
$documentRepository = $this->em->getRepository(Document::class);
/** @var Document $document */
$document = $documentRepository->find($data['id_document']);
if(!null==$document) {
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
$document->setStatut('payé')
->setDatePaiement(new \DateTime())
->setUserModif($currentUser)
->setDateModif(new \DateTime())
;
$this->em->persist($document);
$this->em->flush();
}
$res->setData($data);
}
}
}
die($res->returnJson());
}
/**
* @Route("/document/insert-ligne", methods={"POST"}, name="insert_ligne")
*/
public function insertLigne(Request $request): Response
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
// Initialisation du retour Json
$res = new JsonRes($request->request->all());
if($res->isSuccess()) {
$data = $res->getData();
if(!isset($data['id_document'])) $res->addErrMsg('champs id_document inconnu');
if(!isset($data['id_projet'])) $res->addErrMsg('champs id_projet inconnu');
if(!isset($data['type_document'])) $res->addErrMsg('champs type_document inconnu');
if(!isset($data['id_adresse'])) $res->addErrMsg('champs id_adresse inconnu');
if(!isset($data['lib_projet_document'])) $res->addErrMsg('champs lib_projet_document inconnu');
if(!isset($data['date_bdc_document'])) $res->addErrMsg('champs date_bdc_document inconnu');
if(!isset($data['reference_document'])) $res->addErrMsg('champs reference_document inconnu');
if(!isset($data['contact_document'])) $res->addErrMsg('champs contact_document inconnu');
if(!isset($data['nouvelle_ligne'])) $res->addErrMsg('champs nouvelle_ligne inconnu');
if(empty($data['date_budget'])) $res->addErrMsg('erreur date_budget');
if(!$res->isSuccess()) die($res->returnJson());
if($res->isSuccess()) {
if(''===$data['id_document']) $res->addErrMsg('champs id_document obligatoire');
if(''===$data['id_projet']) $res->addErrMsg('champs id_projet obligatoire');
if(''===$data['type_document']) $res->addErrMsg('champs type_document obligatoire');
if(empty($data['nouvelle_ligne'])) $res->addErrMsg('champs nouvelle_ligne vide');
if($res->isSuccess()) {
if(!isset($data['nouvelle_ligne']['libelle'])) $res->addErrMsg('champs libelle inconnu');
if(!isset($data['nouvelle_ligne']['description'])) $res->addErrMsg('champs description inconnu');
if(!isset($data['nouvelle_ligne']['qte'])) $res->addErrMsg('champs qte inconnu');
if(!isset($data['nouvelle_ligne']['puht'])) $res->addErrMsg('champs puht inconnu');
if(!isset($data['nouvelle_ligne']['taux_tva'])) $res->addErrMsg('champs taux_tva inconnu');
if('COMMANDE PRESTATAIRE'===$data['type_document']){
if(!isset($data['id_prestataire'])) $res->addErrMsg('champs id_prestataire inconnu');
}
if($res->isSuccess()) {
if(''===$data['nouvelle_ligne']['libelle']) $res->addErrMsg('champs libelle obligatoire');
if(''===$data['nouvelle_ligne']['qte']) $res->addErrMsg('champs qte obligatoire');
if(''===$data['nouvelle_ligne']['puht']) $res->addErrMsg('champs puht obligatoire');
if(''===$data['nouvelle_ligne']['taux_tva']) $res->addErrMsg('champs taux_tva obligatoire');
if('COMMANDE PRESTATAIRE'===$data['type_document']){
if(''===$data['id_prestataire']) $res->addErrMsg('champs id_prestataire obligatoire');
}
}
}
$dateBudget = date_create_from_format('Y-m-d', $data['date_budget']);
if(!$dateBudget) $res->addErrMsg('Le format de la date est incorrect');
$dateBdc = date_create_from_format('Y-m-d', $data['date_bdc_document']);
if(!$dateBdc) $res->addErrMsg('Le format de la date est incorrect');
if($res->isSuccess()) {
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
/** @var Document $document */
$document = null;
if(0===intval($data['id_document'])){ // si id_document = 0 alors création du document
$projetRepository = $this->em->getRepository(Projet::class);
/** @var Projet $projet */
$projet = $projetRepository->find($data['id_projet']);
if(!null==$projet){
$document = new Document();
$document->setProjet($projet)
->setTiers($projet->getSociete())
->setTypeDocument($data['type_document'])
->setDateCrea($dateBudget)
->setUserCrea($currentUser)
->setMontantHt(0)
->setMontantTva(0)
->setReference($data['reference_document'])
->setContact($data['contact_document'])
// ->setLibProjet($data['lib_projet_document']) // pas obligatoire
->setDateBdc($dateBdc)
;
$adresseRepository = $this->em->getRepository(Adresse::class);
/** @var Adresse $adresse */
$adresse = $adresseRepository->find($data['id_adresse']);
if(null!==$adresse) $document->setAdresse($adresse);
$this->em->persist($document);
$this->em->flush();
$numPiece = 'undefined';
if('FACTURE PROFORMA'===$data['type_document']) $numPiece = $projet->getNumProd() .'-'. $document->getId();
if('COMMANDE PRESTATAIRE'===$data['type_document']) {
$numPiece = 'BDC-' . $document->getId();
$tiersRepository = $this->em->getRepository(Tiers::class);
$prestataire = $tiersRepository->find($data['id_prestataire']);
if(null!==$prestataire) $document->setTiers($prestataire);
}
$document->setNumPiece($numPiece);
$this->em->persist($document);
$this->em->flush();
$data['id_document'] = $document->getId();
} else {
$res->addErrMsg('Projet non identifié');
}
} else { // sinon update du document
$documentRepository = $this->em->getRepository(Document::class);
$document = $documentRepository->find($data['id_document']);
if(null===$document) $res->addErrMsg('Document non identifié');
}
if($res->isSuccess()) {
$newLigne = $data['nouvelle_ligne'];
$ligne = new DocumentLigne();
$ligne->setDocument($document)
->setLibelle($newLigne['libelle'])
->setDescription($newLigne['description'])
->setDateCrea(new \DateTime())
->setUserCrea($currentUser)
->setQte($newLigne['qte'])
->setPuht($newLigne['puht'])
->setTauxTva($newLigne['taux_tva'])
->performMontant()
;
$document->addDocumentLigne($ligne)
->performMontant()
->setDateModif(new \DateTime())
->setUserModif($currentUser)
;
$this->em->persist($document);
$this->em->flush();
$res->setData($data);
}
}
}
}
die($res->returnJson());
}
/**
* @Route("/document/update-ligne", methods={"POST"}, name="update_ligne")
*/
public function updateLigne(Request $request): Response
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
// Initialisation du retour Json
$res = new JsonRes($request->request->all());
if(!$res->isSuccess()) die($res->returnJson());
$data = $res->getData();
if(empty($data['id_ligne'])) $res->addErrMsg('champs id_ligne obligatoire');
if(empty($data['libelle'])) $res->addErrMsg('champs libelle obligatoire');
if(empty($data['qte'])) $res->addErrMsg('champs qte obligatoire');
if(empty($data['puht'])) $res->addErrMsg('champs puht obligatoire');
if(empty($data['taux_tva'])) $res->addErrMsg('champs taux_tva obligatoire');
if(!$res->isSuccess()) die($res->returnJson());
$docLigneRepository = $this->em->getRepository(DocumentLigne::class);
$ligne = $docLigneRepository->find($data['id_ligne']);
if(null===$ligne) $res->addErrMsg('Ligne document non identifiée');
if(!$res->isSuccess()) die($res->returnJson());
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
$ligne->setLibelle($data['libelle'])
->setDescription($data['description'])
->setDateModif(new \DateTime())
->setUserModif($currentUser)
->setQte($data['qte'])
->setPuht($data['puht'])
->setTauxTva($data['taux_tva'])
->performMontant()
;
$this->em->persist($ligne);
$this->em->flush();
$document = $ligne->getDocument();
$document->performMontant()
->setDateModif(new \DateTime())
->setUserModif($currentUser)
;
$this->em->persist($document);
$this->em->flush();
$data['id_document'] = $document->getId();
$res->setData($data);
die($res->returnJson());
}
/**
* @Route("/document/delete-ligne", methods={"POST"}, name="delete_ligne")
*/
public function deleteLigne(Request $request): Response
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
// Initialisation du retour Json
$res = new JsonRes($request->request->all());
if($res->isSuccess()) {
$data = $res->getData();
if(!isset($data['id_document'])) $res->addErrMsg('champs id_document inconnu');
if(!isset($data['id_ligne'])) $res->addErrMsg('champs id_ligne inconnu');
if($res->isSuccess()) {
if(''===$data['id_document']) $res->addErrMsg('champs id_document obligatoire');
if(''===$data['id_ligne']) $res->addErrMsg('champs id_ligne obligatoire');
if($res->isSuccess()) {
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
$docLigneRepository = $this->em->getRepository(DocumentLigne::class);
/** @var DocumentLigne $docLigne */
$docLigne = $docLigneRepository->find($data['id_ligne']);
if(null===$docLigne) $res->addErrMsg('Ligne document non identifiée');
if($res->isSuccess()) {
$docLigneRepository->remove($docLigne);
$document = $docLigne->getDocument()
->performMontant()
->setDateModif(new \DateTime())
->setUserModif($currentUser)
;
$this->em->persist($document);
$this->em->flush();
$res->setData($data);
}
}
}
}
die($res->returnJson());
}
/**
* @Route("/document/edit/{id}", methods={"GET"}, name="edit_document")
*/
public function getDocumentForEdit($id)
{
$documentRepository = $this->em->getRepository(Document::class);
$document = $documentRepository->find($id);
return $this->render('projet/document/document-form.html.twig', [
'societe' => $this->dataSociete,
'document' => $document,
'label_btn_cancel' => 'Supprimer',
]);
}
/**
* @Route("/document/vierge/{id}", methods={"GET"}, name="init_document_vierge")
*/
public function getDocumentVierge($id)
{
$projetRepository = $this->em->getRepository(Projet::class);
/** @var Projet $projet */
$projet = $projetRepository->find($id);
if(null===$projet) return $this->render('misc/404.html.twig');
$documentVierge = new Document();
$documentVierge->initDocVierge($projet, 'FACTURE PROFORMA');
return $this->render('projet/document/document-form.html.twig', [
'societe' => $this->dataSociete,
'document_vierge' => $documentVierge,
'label_btn_cancel' => 'Annuler',
]);
}
/**
* @Route("/document/reload-list/{typeDocument}/{idProjet}", methods={"GET"}, name="document_reload_list")
*/
public function documentReloadList($typeDocument, $idProjet)
{
$projetRepository = $this->em->getRepository(Projet::class);
/** @var Projet $projet */
$projet = $projetRepository->find($idProjet);
$docList = array();
switch ($typeDocument){
case 'FACTURE PROFORMA':
$docList = $projet->getDocuments()->filter(function (Document $document){
return $document->getTypeDocument() === 'FACTURE PROFORMA';
});
$typeDocument = 'devis';
break;
case 'FACTURE':
$docList = $projet->getDocuments()->filter(function (Document $document){
return in_array($document->getTypeDocument(), ['FACTURE', 'AVOIR']);
});
break;
default:
$docList = array();
break;
}
return $this->render('projet/document/document-'. strtolower($typeDocument) .'-list.html.twig', [
strtolower($typeDocument) .'List' => $docList,
]);
}
/**
* @Route("/document/delete-document", methods={"POST"}, name="delete_document")
*/
public function deleteDocument(Request $request): Response
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
// Initialisation du retour Json
$res = new JsonRes($request->request->all());
if($res->isSuccess()) {
$data = $res->getData();
if(!isset($data['id_document'])) $res->addErrMsg('champs id_document inconnu');
if($res->isSuccess()) {
if(''===$data['id_document']) $res->addErrMsg('champs id_document obligatoire');
if($res->isSuccess()) {
$documentRepository = $this->em->getRepository(Document::class);
/** @var Document $document */
$document = $documentRepository->find($data['id_document']);
if(null===$document) $res->addErrMsg('Document non identifiée');
if($res->isSuccess()) {
$docLigneRepository = $this->em->getRepository(DocumentLigne::class);
foreach ($document->getDocumentLignes()->toArray() as $documentLigne) {
$docLigneRepository->remove($documentLigne);
}
$documentRepository->remove($document);
$res->setData($data);
}
}
}
}
die($res->returnJson());
}
/**
* @Route("/document/update-tva", methods={"POST"}, name="update_doc_tva")
*/
public function updateTvaDocument(Request $request): Response
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
// Initialisation du retour Json
$res = new JsonRes($request->request->all());
if(!$res->isSuccess()) die($res->returnJson());
$data = $res->getData();
if(empty($data['id_document'])) $res->addErrMsg('champs id_document obligatoire');
if(!isset($data['taux_tva'])) $res->addErrMsg('champs taux_tva obligatoire');
if(!$res->isSuccess()) die($res->returnJson());
$documentRepository = $this->em->getRepository(Document::class);
/** @var Document $document */
$document = $documentRepository->find($data['id_document']);
if(null===$document) $res->addErrMsg('Document non identifiée');
if(!$res->isSuccess()) die($res->returnJson());
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
foreach ($document->getDocumentLignes() as $documentLigne){
$documentLigne->setTauxTva(floatval($data['taux_tva']));
$documentLigne->performMontant();
$documentLigne->setDateModif(new \DateTime());
$documentLigne->setUserModif($currentUser);
$this->em->persist($documentLigne);
$this->em->flush();
}
$document->performMontant();
$document->setDateModif(new \DateTime());
$document->setUserModif($currentUser);
$this->em->persist($document);
$this->em->flush();
$res->setData($data);
die($res->returnJson());
}
/**
* @Route("/document/transform-document", methods={"POST"}, name="transform_document")
*/
public function transformDocument(Request $request): Response
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
// Initialisation du retour Json
$res = new JsonRes($request->request->all());
if($res->isSuccess()) {
$data = $res->getData();
if(!isset($data['id_document'])) $res->addErrMsg('champs id_document inconnu');
if($res->isSuccess()) {
if(''===$data['id_document']) $res->addErrMsg('champs id_document obligatoire');
if($res->isSuccess()) {
$documentRepository = $this->em->getRepository(Document::class);
/** @var Document $devis */
$devis = $documentRepository->find($data['id_document']);
if(null===$devis) $res->addErrMsg('Document non identifiée');
if($res->isSuccess()) {
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
$soucheRepository = $this->em->getRepository(Souche::class);
$numSouche = $soucheRepository->generateNumSouche();
$numPiece = $devis->getProjet()->getNumProd() .'-'. $numSouche;
$facture = new Document();
$facture->setProjet( $devis->getProjet() )
->setTiers( $devis->getTiers() )
->setAdresse( $devis->getAdresse() )
->setTypeDocument('FACTURE')
->setReference( $devis->getReference() )
->setNumPiece($numPiece)
->setStatut('envoyé')
->setDateEnvoi(new \DateTime())
->setDateCrea(new \DateTime())
->setUserCrea($currentUser)
->setMontantHt( $devis->getMontantHt() )
->setMontantTva( $devis->getMontantTva() )
->setContact( $devis->getContact() )
->setIdDocOrigine( $devis->getId() )
->setDateBdc( $devis->getDateBdc() )
->setLibProjet( $devis->getLibProjet() )
->setConditionReglement( $devis->getConditionReglement() )
;
$this->em->persist($facture);
$this->em->flush();
foreach ($devis->getDocumentLignes() as $ligne) {
$newLigne = new DocumentLigne();
$newLigne->setLibelle( $ligne->getLibelle() )
->setDescription( $ligne->getDescription() )
->setMontantHt( $ligne->getMontantHt() )
->setTauxTva( $ligne->getTauxTva() )
->setMontantTva( $ligne->getMontantTva() )
->setDateCrea(new \DateTime())
->setUserCrea($currentUser)
->setQte( $ligne->getQte() )
->setPuht( $ligne->getPuht() )
;
$facture->addDocumentLigne($newLigne);
}
$this->em->persist($facture);
$this->em->flush();
$devis->setIdDocOrigine( $facture->getId() );
$this->em->persist($devis);
$this->em->flush();
$res->setData($data);
}
}
}
}
die($res->returnJson());
}
/**
* @Route("/document/create-avoir", methods={"POST"}, name="create_avoir")
*/
public function createAvoir(Request $request): Response
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
// Initialisation du retour Json
$res = new JsonRes($request->request->all());
if(!$res->isSuccess()) die($res->returnJson());
$data = $res->getData();
if(!isset($data['id_document'])) $res->addErrMsg('champs id_document inconnu');
if(!isset($data['montant_ttc'])) $res->addErrMsg('champs montant_ttc inconnu');
if(!$res->isSuccess()) die($res->returnJson());
$documentRepository = $this->em->getRepository(Document::class);
/** @var Document $facture */
$facture = $documentRepository->find($data['id_document']);
if(null===$facture) $res->addErrMsg('Facture non identifiée');
if(!$res->isSuccess()) die($res->returnJson());
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
$soucheRepository = $this->em->getRepository(Souche::class);
$numSouche = $soucheRepository->generateNumSouche();
$numPiece = $facture->getProjet()->getNumProd() .'-'. $numSouche;
$montantAvoir = round(floatval($data['montant_ttc']) * 100)/100;
$montantHt = $montantAvoir/1.2;
$montantTva = $montantAvoir-$montantHt;
$avoir = new Document();
$avoir->setProjet( $facture->getProjet() )
->setTiers( $facture->getTiers() )
->setAdresse( $facture->getAdresse() )
->setTypeDocument('AVOIR')
->setReference( $facture->getReference() )
->setNumPiece($numPiece)
->setStatut('avoir')
->setDateEnvoi(new \DateTime())
->setDateCrea(new \DateTime())
->setUserCrea($currentUser)
->setMontantHt($montantHt)
->setMontantTva($montantTva)
->setContact( $facture->getContact() )
->setIdDocOrigine( $facture->getId() )
->setDateBdc( $facture->getDateBdc() )
->setLibProjet( $facture->getLibProjet() )
;
$this->em->persist($avoir);
$this->em->flush();
$newLigne = new DocumentLigne();
$newLigne->setLibelle( 'AVOIR' )
->setDescription( 'Facture : '. $facture->getNumPiece())
->setMontantHt($montantHt)
->setTauxTva(0.2)
->setMontantTva($montantTva)
->setDateCrea(new \DateTime())
->setUserCrea($currentUser)
->setQte(1)
->setPuht($montantHt)
;
$avoir->addDocumentLigne($newLigne);
$this->em->persist($avoir);
$this->em->flush();
$facture->setStatut('annulé')
->setDateModif(new \DateTime())
->setUserModif($currentUser)
;
$this->em->persist($facture);
$this->em->flush();
$docOrigine = $documentRepository->find($facture->getIdDocOrigine());
$docOrigine->setIdDocOrigine(null)
->setDateModif(new \DateTime())
->setUserModif($currentUser)
;
$this->em->persist($docOrigine);
$this->em->flush();
$res->setData($data);
die($res->returnJson());
}
/**
* @Route("/document/facture-retard", methods={"GET"}, name="document_facture_retard")
*/
public function factureRetard(): Response
{
$documentRepository = $this->em->getRepository(Document::class);
$factureList = $documentRepository->getFactureNonEchue();
$montantEncours = array_reduce($factureList, function ($sum, Document $facture){
return $sum+= $facture->getMontantHt();
}, 0);
$parameters = [
'facture_count' => count($factureList),
'facture_list' => $this->render('module/module-facture-retard-list.html.twig',['facture_list'=>$factureList])->getContent(),
'montant_encours' => $montantEncours,
];
return $this->json($parameters);
}
}