|
| 1 | +<?php |
| 2 | + |
| 3 | +declare(strict_types=1); |
| 4 | + |
| 5 | +namespace AppBundle\Accounting; |
| 6 | + |
| 7 | +use AppBundle\Accounting\Model\InvoicingPeriod; |
| 8 | +use DatePeriod; |
| 9 | +use PhpOffice\PhpSpreadsheet\Spreadsheet; |
| 10 | +use PhpOffice\PhpSpreadsheet\Style\Alignment; |
| 11 | +use PhpOffice\PhpSpreadsheet\Style\Border; |
| 12 | +use PhpOffice\PhpSpreadsheet\Style\NumberFormat; |
| 13 | +use PhpOffice\PhpSpreadsheet\Worksheet\Drawing; |
| 14 | +use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup; |
| 15 | + |
| 16 | +class SpreadsheetGenerator |
| 17 | +{ |
| 18 | + public function generate(array $statements, array $subTotal, InvoicingPeriod $period): Spreadsheet |
| 19 | + { |
| 20 | + $formater = new \IntlDateFormatter('fr_FR', \IntlDateFormatter::MEDIUM, \IntlDateFormatter::NONE); |
| 21 | + $formater->setPattern('MMMM yyyy'); |
| 22 | + |
| 23 | + $monthsOfYear = new DatePeriod($period->getStartDate(), new \DateInterval('P1M'), $period->getEndDate()); |
| 24 | + $compteurLigne = []; |
| 25 | + $workbook = new Spreadsheet(); |
| 26 | + /** @var \DateTime $month */ |
| 27 | + foreach ($monthsOfYear as $month) { |
| 28 | + $currentMonth = (int) $month->format('n'); |
| 29 | + $compteurLigne[$currentMonth] = 4; |
| 30 | + $sheet = $workbook->createSheet($currentMonth); |
| 31 | + $sheet->setTitle('Mois de ' . $formater->format($month)); |
| 32 | + $sheet->setCellValue('A1', 'Mois de ' . $formater->format($month)); |
| 33 | + $sheet->setCellValue('A3', 'Date'); |
| 34 | + $sheet->setCellValue('B3', 'Opération'); |
| 35 | + $sheet->setCellValue('C3', 'Description'); |
| 36 | + $sheet->setCellValue('D3', 'Événement'); |
| 37 | + $sheet->setCellValue('E3', 'Catégorie'); |
| 38 | + $sheet->setCellValue('F3', 'Dépense'); |
| 39 | + $sheet->setCellValue('G3', 'Recette'); |
| 40 | + $sheet->setCellValue('H3', 'Commentaire'); |
| 41 | + $sheet->setCellValue('I3', 'Justificatif'); |
| 42 | + $sheet->setCellValue('J3', 'Nom du justificatif'); |
| 43 | + $sheet->setCellValue('K3', 'Nom du compte'); |
| 44 | + } |
| 45 | + |
| 46 | + foreach ($statements as $ecriture) { |
| 47 | + $sheet = $workbook->getSheet($ecriture['mois']); |
| 48 | + $sheet->setCellValue('A' . $compteurLigne[$ecriture['mois']], date('d/m/Y', strtotime((string) $ecriture['date_regl']))); |
| 49 | + $sheet->setCellValue('B' . $compteurLigne[$ecriture['mois']], $ecriture['reglement']); |
| 50 | + $sheet->setCellValue('C' . $compteurLigne[$ecriture['mois']], $ecriture['description']); |
| 51 | + $sheet->setCellValue('D' . $compteurLigne[$ecriture['mois']], $ecriture['evenement']); |
| 52 | + $sheet->setCellValue('E' . $compteurLigne[$ecriture['mois']], $ecriture['categorie']); |
| 53 | + if ($ecriture['idoperation'] == 1) { |
| 54 | + $sheet->setCellValue('F' . $compteurLigne[$ecriture['mois']], $ecriture['montant']); |
| 55 | + } else { |
| 56 | + $sheet->setCellValue('G' . $compteurLigne[$ecriture['mois']], $ecriture['montant']); |
| 57 | + } |
| 58 | + $sheet->setCellValue('H' . $compteurLigne[$ecriture['mois']], $ecriture['comment']); |
| 59 | + $sheet->setCellValue('I' . $compteurLigne[$ecriture['mois']], $ecriture['attachment_required'] ? 'Oui' : 'Non'); |
| 60 | + $sheet->setCellValue('J' . $compteurLigne[$ecriture['mois']], $ecriture['attachment_filename']); |
| 61 | + $sheet->setCellValue('K' . $compteurLigne[$ecriture['mois']], $ecriture['compta_compte_nom_compte']); |
| 62 | + $compteurLigne[$ecriture['mois']]++; |
| 63 | + } |
| 64 | + for ($i = 1; $i < 13; $i++) { |
| 65 | + $sheet = $workbook->getSheet($i); |
| 66 | + |
| 67 | + $sheet->getStyle('A1')->applyFromArray([ |
| 68 | + 'font' => [ |
| 69 | + 'size' => 12, |
| 70 | + 'bold' => true, |
| 71 | + 'name' => 'Ubuntu', |
| 72 | + ], |
| 73 | + ]); |
| 74 | + $sheet->getStyle('A3:K3')->applyFromArray([ |
| 75 | + 'font' => [ |
| 76 | + 'size' => 10, |
| 77 | + 'bold' => true, |
| 78 | + 'name' => 'Ubuntu', |
| 79 | + ], |
| 80 | + 'alignment' => ['horizontal' => Alignment::HORIZONTAL_CENTER], |
| 81 | + 'borders' => [ |
| 82 | + 'allborders' => [ |
| 83 | + 'style' => Border::BORDER_THIN, |
| 84 | + 'color' => ['rgb' => 'FF666666'], |
| 85 | + ], |
| 86 | + ], |
| 87 | + ]); |
| 88 | + $sheet->getStyle('A4:K' . ($compteurLigne[$i] + 1))->applyFromArray([ |
| 89 | + 'font' => [ |
| 90 | + 'size' => 10, |
| 91 | + 'name' => 'Ubuntu', |
| 92 | + ], |
| 93 | + 'borders' => [ |
| 94 | + 'allborders' => [ |
| 95 | + 'style' => Border::BORDER_THIN, |
| 96 | + 'color' => ['rgb' => 'FF666666'], |
| 97 | + ], |
| 98 | + ], |
| 99 | + ]); |
| 100 | + $sheet->getStyle('J3:I200')->applyFromArray(['alignment' => ['horizontal' => Alignment::HORIZONTAL_CENTER]]); |
| 101 | + |
| 102 | + $sheet->setCellValue('E' . $compteurLigne[$i], 'TOTAL'); |
| 103 | + $sheet->setCellValue('F' . $compteurLigne[$i], $subTotal[$i]['debit']); |
| 104 | + $sheet->setCellValue('G' . $compteurLigne[$i], $subTotal[$i]['credit']); |
| 105 | + $sheet->setCellValue('E' . ($compteurLigne[$i] + 1), 'SOLDE'); |
| 106 | + $sheet->setCellValue('F' . ($compteurLigne[$i] + 1), $subTotal[$i]['dif']); |
| 107 | + $sheet->mergeCells('F' . ($compteurLigne[$i] + 1) . ':G' . ($compteurLigne[$i] + 1)); |
| 108 | + |
| 109 | + $sheet->getStyle('A' . $compteurLigne[$i] . ':J' . ($compteurLigne[$i] + 1))->applyFromArray([ |
| 110 | + 'font' => [ |
| 111 | + 'size' => 10, |
| 112 | + 'bold' => true, |
| 113 | + 'name' => 'Ubuntu', |
| 114 | + ], |
| 115 | + ]); |
| 116 | + $sheet->getStyle('F' . ($compteurLigne[$i] + 1))->getAlignment()->applyFromArray(['horizontal' => Alignment::HORIZONTAL_CENTER]); |
| 117 | + |
| 118 | + $sheet->getStyle('F4:G200')->applyFromArray(['numberformat' => ['code' => NumberFormat::FORMAT_NUMBER_00]]); |
| 119 | + |
| 120 | + $sheet->getColumnDimension('A')->setWidth(8); |
| 121 | + $sheet->getColumnDimension('C')->setWidth(36); |
| 122 | + $sheet->getColumnDimension('D')->setWidth(12); |
| 123 | + $sheet->getColumnDimension('E')->setWidth(12); |
| 124 | + $sheet->getPageSetup()->setPaperSize(PageSetup::PAPERSIZE_A4); |
| 125 | + $sheet->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE); |
| 126 | + $sheet->getPageSetup()->setRowsToRepeatAtTopByStartAndEnd(1, 3); |
| 127 | + $sheet->getHeaderFooter()->setOddFooter('&CPage &P de &N'); |
| 128 | + |
| 129 | + $objDrawing = new Drawing(); |
| 130 | + $objDrawing->setName('Logo_AFUP'); |
| 131 | + $objDrawing->setDescription('Logo_AFUP'); |
| 132 | + $objDrawing->setPath(__DIR__ . '/../../../htdocs/templates/administration/images/logo_afup.png'); |
| 133 | + $objDrawing->setCoordinates('H1'); |
| 134 | + $objDrawing->setHeight(35); |
| 135 | + $objDrawing->setWidth(70); |
| 136 | + $objDrawing->setWorksheet($sheet); |
| 137 | + } |
| 138 | + |
| 139 | + return $workbook; |
| 140 | + } |
| 141 | +} |
0 commit comments