setSpreadsheetFile(); $this->setWorksheetFile(); $this->fillTheCells(); return $this; } /** * Save the invoice */ public function save(): void { $writer = IOFactory::createWriter($this->spreadsheet, 'Xls'); $writer->save('write.xls'); } /** * Set template file path */ public function setTemplateFile(string $file): self { $this->templateFile = $file; return $this; } /** * Set data */ public function setData(InvoiceExcellData $data): self { $this->data = $data; return $this; } /** * Load template to a new spreadsheet */ protected function setSpreadsheetFile(): void { $this->spreadsheet = IOFactory::load($this->templateFile); } /** * Set working spreadsheet */ protected function setWorksheetFile(): void { $this->worksheet = $this->spreadsheet->getActiveSheet(); } /** * Create a RichText object with specified text and font settings. */ protected function addToRichText(RichText $richText, string $text, bool $isBold = false): RichText { $textRun = $richText->createTextRun($text); $font = $textRun->getFont() ?: new Font; $font->setName('Times New Roman')->setSize(10); if ($isBold) { $font->setBold(true); } return $richText; } /** * Fill the cells */ protected function fillTheCells(): void { $data = $this->getTemplateValues(); foreach ($data as $cell => $value) { $this->worksheet->getCell($cell)->setValue($value); } $items = collect($this->data->items); $itemCellNumber = 25; $numberFormat = $this->worksheet->getStyle('E' . 25)->getNumberFormat()->getFormatCode(); $items->each(function (InvoiceItem $item, int $index) use (&$itemCellNumber, $numberFormat) { $this->worksheet->getCell('A' . $itemCellNumber)->setValue($index + 1); $this->worksheet->getCell('B' . $itemCellNumber)->setValue($item->name); $this->worksheet->getCell('C' . $itemCellNumber)->setValue($item->unit); $this->worksheet->getCell('D' . $itemCellNumber)->setValue($item->quantity); $this->worksheet->getCell('E' . $itemCellNumber)->setValue($item->unit_price); $this->worksheet->getCell('F' . $itemCellNumber)->setValue($item->vat); $this->worksheet->getCell('G' . $itemCellNumber)->setValue($item->vat_excluded); $this->worksheet->getCell('H' . $itemCellNumber)->setValue($item->vat_percentage); $this->worksheet->getCell('I' . $itemCellNumber)->setValue($item->vat_tmt); $this->worksheet->setCellValue( 'J' . $itemCellNumber, "=D{$itemCellNumber}*E{$itemCellNumber}" ); // Set font-family, alingment, and borders for all of them... $this->worksheet->getStyle('A' . $itemCellNumber . ':J' . $itemCellNumber)->applyFromArray([ 'font' => [ 'bold' => false, 'size' => 10, 'name' => 'Times New Roman' ], 'alignment' => [ 'horizontal' => Alignment::HORIZONTAL_CENTER, 'vertical' => Alignment::VERTICAL_CENTER, ], 'borders' => [ 'allBorders' => [ 'borderStyle' => Border::BORDER_THIN, ], ], ]); // Invoice Name... $this->worksheet->getCell('B' . $itemCellNumber)->getStyle()->applyFromArray([ 'alignment' => [ 'horizontal' => Alignment::HORIZONTAL_LEFT, 'vertical' => Alignment::VERTICAL_CENTER, ] ]); $this->worksheet->getCell('D' . $itemCellNumber)->getStyle()->applyFromArray([ 'font' => [ 'bold' => true, ], ]); $this->worksheet->getCell('E' . $itemCellNumber)->getStyle()->applyFromArray([ 'font' => [ 'bold' => true, ], ]); $this->worksheet->getCell('J' . $itemCellNumber)->getStyle()->applyFromArray([ 'font' => [ 'bold' => true, ], ]); // Invoice number format... $this->worksheet->getStyle('E' . $itemCellNumber)->getNumberFormat()->setFormatCode($numberFormat); $this->worksheet->getStyle('J' . $itemCellNumber)->getNumberFormat()->setFormatCode($numberFormat); $itemCellNumber++; }); } /** * Get template cells and values * * @return array */ protected function getTemplateValues(): array { return [ 'C6' => $this->hasapFakturaNomeri(), 'C7' => $this->sene(), 'A9' => $this->satyjy(), 'A11' => $this->satyjySalgytBelgi(), 'A12' => $this->satyjyBanky(), 'A13' => $this->satyjyBankyMaglumatlary(), 'A16' => $this->satynAlyjy(), 'A18' => $this->satynAlyjySalgy(), 'A19' => $this->satynAlyjyBanky(), 'A20' => $this->satynAlyjyBankyMaglumatlary(), ]; } /** * Hasap faktura nomeri */ public function hasapFakturaNomeri(): string { return 'Hasap-faktura № '.$this->data->number; } /** * Sene */ public function sene(): string { $date = $this->data->date; $year = $date->year; $day = $date->format('d'); $month_as_string = $date->translatedFormat('F'); return sprintf('%s ýylyň «%s» %s', $year, $day, $month_as_string); } /** * Satyjy */ public function satyjy(): string { return sprintf('Satyjy: %s %s', $this->data->seller_firm_type, $this->data->seller_firm_name); } /** * Satyjy salgyt belgisi */ public function satyjySalgytBelgi(): RichText { $richText = new RichText; $satyjy_salgyt_belgi = $this->addToRichText( richText: $richText, text: 'Satyjynyň şahsy salgyt belgisi: ' ); return $this->addToRichText( richText: $satyjy_salgyt_belgi, text: $this->data->seller_ssb, isBold: true ); } /** * Satyjy bank maglumatlary */ public function satyjyBanky(): RichText { $richText = new RichText; $satyjy_banky = $this->addToRichText( richText: $richText, text: sprintf('Satyjynyň bankynyň ady %s, hasap № ', $this->data->seller_bank_name) ); return $this->addToRichText( richText: $satyjy_banky, text: $this->data->seller_bank_hb_1, isBold: true ); } /** * Satyjy bank maglumatlary */ public function satyjyBankyMaglumatlary(): RichText { $richText = new RichText; $city_label = $this->addToRichText($richText, 'şäherde (etrapda) '); $city = $this->addToRichText($city_label, $this->data->seller_bank_city, isBold: true); $bab_label = $this->addToRichText($city, ' BAB '); $bab = $this->addToRichText($bab_label, $this->data->seller_bank_bab, isBold: true); $hb_2_label = $this->addToRichText($bab, ' bankyň kor.hasap '); return $this->addToRichText($hb_2_label, $this->data->seller_bank_hb_2, isBold: true); } /** * Satyn alyjy */ public function satynAlyjy(): string { return 'Satyn alyjy: '.$this->data->buyer; } /** * Satyn alyjy salgy */ public function satynAlyjySalgy(): string { return $this->data->buyer_address; } /** * Satyn alyjy banky we salgysy */ public function satynAlyjyBanky(): string { return sprintf('Alyjynyň bankynyň ady %s %s', $this->data->buyer_bank, $this->data->buyer_bank_address); } /** * Satyn alyjynyň bank maglumatlary */ public function satynAlyjyBankyMaglumatlary(): string { return 'Satyn alyjynyň '.$this->data->buyer_bank_data; } }