Exemplo n.º 1
0
 /**
  * @Route("/pdf/{id}", name="facture_pdf")
  * @ParamConverter("etablissement", class="AppBundle:Facture")
  */
 public function pdfAction(Request $request, Facture $facture)
 {
     $fm = $this->get('facture.manager');
     $pages = array();
     $nbLigneMaxPourPageVierge = 50;
     $nbLigneMaxPourDernierePage = 30;
     $nbPage = 1;
     $nbMaxCharByLigne = 60;
     $nbCurrentLigne = 0;
     $nbCurrentPage = 1;
     $nbLigneParLigneFacture = array();
     $nbLigneParPage = array(1 => $nbLigneMaxPourDernierePage);
     foreach ($facture->getLignes() as $key => $ligne) {
         $nbCurrentLigne += 2;
         if ($ligne->getReferenceClient()) {
             $nbCurrentLigne += 1;
         }
         if ($ligne->isOrigineContrat()) {
             $nbCurrentLigne += 4;
             $nbCurrentLigne += count($ligne->getOrigineDocument()->getPrestations());
             $nbCurrentLigne += count($ligne->getOrigineDocument()->getContratPassages());
         }
         $nbLigneParLigneFacture[$key] = $nbCurrentLigne;
         if ($nbCurrentPage == $nbPage && $nbCurrentLigne > $nbLigneMaxPourDernierePage) {
             $nbLigneParPage[$nbCurrentPage] = $nbLigneMaxPourDernierePage;
             $nbPage += 1;
             $nbLigneParPage[$nbPage] = $nbLigneMaxPourDernierePage;
         }
         if ($nbCurrentPage < $nbPage && $nbCurrentLigne > $nbLigneMaxPourPageVierge) {
             $nbLigneParPage[$nbCurrentPage] = $nbLigneMaxPourPageVierge;
             $nbCurrentPage += 1;
             $nbCurrentLigne = 0;
         }
     }
     $nbCurrentPage = 1;
     $nbCurrentLigne = 0;
     foreach ($facture->getLignes() as $key => $ligneFacture) {
         $ligne = $this->buildLignePDFFacture($ligneFacture);
         // La ligne ne tient pas sur une page complète
         if ($nbLigneParLigneFacture[$key] > $nbLigneParPage[$nbCurrentPage]) {
             $nbLignes2Keep = (int) (0.8 * $nbLigneParPage[$nbCurrentPage]);
             $lignesSplitted = $this->splitLigne($ligne, $nbLignes2Keep);
             $pages[$nbCurrentPage][] = $lignesSplitted[0];
             $pages[$nbCurrentPage + 1][] = $lignesSplitted[1];
             $nbCurrentLigne = 0;
             $nbCurrentPage += 1;
             continue;
         }
         // La ligne tient sur la page
         if ($nbCurrentLigne + $nbLigneParLigneFacture[$key] < $nbLigneParPage[$nbCurrentPage]) {
             $pages[$nbCurrentPage][] = $ligne;
             continue;
         }
         // La ligne ne tient plus sur la page
         if ($nbCurrentLigne + $nbLigneParLigneFacture[$key] > $nbLigneParPage[$nbCurrentPage]) {
             $nbCurrentLigne = 0;
             $nbCurrentPage += 1;
             $pages[$nbCurrentPage][] = $ligne;
             continue;
         }
     }
     $html = $this->renderView('facture/pdf.html.twig', array('facture' => $facture, 'pages' => $pages, 'parameters' => $fm->getParameters()));
     if ($request->get('output') == 'html') {
         return new Response($html, 200);
     }
     if ($facture->isDevis() && $facture->getNumeroDevis()) {
         $filename = "devis_" . $facture->getSociete()->getIdentifiant() . "_" . $facture->getDateDevis()->format('Ymd') . "_N" . $facture->getNumeroDevis() . ".pdf";
     } elseif ($facture->isFacture() && $facture->getNumeroFacture()) {
         $prefix = $facture->isAvoir() ? 'avoir' : 'facture';
         $filename = $prefix . "_" . $facture->getSociete()->getIdentifiant() . "_" . $facture->getDateFacturation()->format('Ymd') . "_N" . $facture->getNumeroFacture() . ".pdf";
     } elseif ($facture->isDevis()) {
         $filename = "devis_" . $facture->getSociete()->getIdentifiant() . "_" . $facture->getDateDevis()->format('Ymd') . "_brouillon.pdf";
     } else {
         $prefix = $facture->isAvoir() ? 'avoir' : 'facture';
         $filename = $prefix . "_" . $facture->getSociete()->getIdentifiant() . "_" . $facture->getDateFacturation()->format('Ymd') . "_brouillon.pdf";
     }
     return new Response($this->get('knp_snappy.pdf')->getOutputFromHtml($html, $this->getPdfGenerationOptions()), 200, array('Content-Type' => 'application/pdf', 'Content-Disposition' => 'attachment; filename="' . $filename . '"'));
 }