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(); } /** * Return new RichTextWrapper */ public function richText(): RichTextWrapper { return Excell::richText() ->setDefaultFont(FONTS::TIMES_NEW_ROMAN) ->setDefaultSize(10); } /** * 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); $total = 0; $itemCellNumber = 25; $numberFormat = '#,##0.00'; $items->each(function (InvoiceItem $item, int $index) use (&$itemCellNumber, &$total, $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); $total += ($item->quantity * $item->unit_price); $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($this->defaultCellStyles()); // Invoice Name... $this->worksheet->getCell('B'.$itemCellNumber)->getStyle()->applyFromArray($this->cellStyleCenter()); // Bold cells... $this->worksheet->getCell('D'.$itemCellNumber)->getStyle()->applyFromArray($this->cellStyleBold()); $this->worksheet->getCell('E'.$itemCellNumber)->getStyle()->applyFromArray($this->cellStyleBold()); $this->worksheet->getCell('J'.$itemCellNumber)->getStyle()->applyFromArray($this->cellStyleBold()); // Invoice number format... $this->worksheet->getStyle('E'.$itemCellNumber)->getNumberFormat()->setFormatCode($numberFormat); $this->worksheet->getStyle('J'.$itemCellNumber)->getNumberFormat()->setFormatCode($numberFormat); $itemCellNumber++; }); // Set default styles... $this->worksheet->getStyle('A'.$itemCellNumber.':J'.$itemCellNumber)->applyFromArray($this->defaultCellStyles()); $this->worksheet->getCell('B'.$itemCellNumber)->setValue('Jemi tölenmeli:')->getStyle()->applyFromArray([ 'font' => ['size' => 11], 'alignment' => ['horizontal' => Alignment::HORIZONTAL_RIGHT], ]); $lastItemCellNumber = $itemCellNumber - 1; $this->worksheet->getCell('J'.$itemCellNumber)->getStyle()->applyFromArray($this->cellStyleBold()); $this->worksheet->getStyle('J'.$itemCellNumber)->getNumberFormat()->setFormatCode($numberFormat); $this->worksheet->setCellValue('J'.$itemCellNumber, "=SUM(J25:J{$lastItemCellNumber})"); // Next cell.. $itemCellNumber++; $this->worksheet->setCellValue('A'.$itemCellNumber, 'Harydyň (işleriň, hyzmatlaryň) jemi bahasy'); $this->worksheet->getStyle('A'.$itemCellNumber)->applyFromArray(['font' => ['size' => 9, 'name' => 'Times New Roman']]); $this->worksheet->getStyle('C'.$itemCellNumber)->applyFromArray(['font' => ['bold' => true, 'size' => 11, 'name' => 'Times New Roman']]); $this->worksheet->setCellValue('C'.$itemCellNumber, Str::ucfirst(TurkmenNumberFormatter::format(floatval($total)))); $this->worksheet->mergeCells('C'.$itemCellNumber.':J'.$itemCellNumber); // Leave empty one $itemCellNumber++; $itemCellNumber++; $this->worksheet->setCellValue('B'.$itemCellNumber, $this->data->seller_firm_name); $this->worksheet->getStyle('A'.$itemCellNumber)->applyFromArray(['borders' => ['bottom' => ['borderStyle' => Border::BORDER_THIN]]]); $this->worksheet->getStyle('B'.$itemCellNumber)->applyFromArray([ 'font' => ['bold' => true, 'size' => 11, 'name' => 'Times New Roman'], 'borders' => [ 'bottom' => [ 'borderStyle' => Border::BORDER_THIN, ], ], ]); $this->worksheet->getStyle('G'.$itemCellNumber.':I'.$itemCellNumber)->applyFromArray(['borders' => ['bottom' => ['borderStyle' => Border::BORDER_THIN]]]); $itemCellNumber++; $this->worksheet->setCellValue('A'.$itemCellNumber, '(görnüşli tarapyň ýolbaşçysynyň ýa-da hususy telekeçiniň F.A.A.A.)'); $this->worksheet->setCellValue('H'.$itemCellNumber, '(goly)'); $this->worksheet->getStyle('A'.$itemCellNumber)->applyFromArray(['font' => ['bold' => false, 'size' => 9, 'name' => 'Times New Roman']]); $this->worksheet->getStyle('H'.$itemCellNumber)->applyFromArray(['font' => ['bold' => false, 'size' => 9, 'name' => 'Times New Roman']]); $itemCellNumber++; $itemCellNumber++; $itemCellNumber++; $itemCellNumber++; $this->worksheet->setCellValue( 'A'.$itemCellNumber, sprintf( '__________%s____________________________manat_______0________ teňňe möçberde iberilen haryt doly alyndy.', Str::before(Str::ucfirst(moneyFormatInTurkmenLetter(floatval($total))), ' manat') ) ); $this->worksheet->getStyle('A'.$itemCellNumber)->applyFromArray(['font' => ['bold' => false, 'size' => 9, 'name' => 'Times New Roman']]); $itemCellNumber++; $itemCellNumber++; $this->worksheet->setCellValue( 'A'.$itemCellNumber, '_______________________________________________________ ___________________ ' ); $this->worksheet->getStyle('A'.$itemCellNumber)->applyFromArray(['font' => ['bold' => false, 'size' => 9, 'name' => 'Times New Roman']]); $itemCellNumber++; $this->worksheet->setCellValue( 'A'.$itemCellNumber, ' Satyn alyjynyň ýa-da kärhananyň ynam bildiren tarapynyň F.A.A A (goly)' ); $this->worksheet->getStyle('A'.$itemCellNumber)->applyFromArray([ 'font' => ['bold' => false, 'size' => 8, 'name' => 'Times New Roman'], 'alignment' => ['vertical' => Alignment::VERTICAL_TOP], ]); } /** * 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 { return $this->richText() ->add('Satyjynyň şahsy salgyt belgisi: ') ->add($this->data->seller_ssb, bold: true) ->toRichText(); } /** * Satyjy bank maglumatlary */ public function satyjyBanky(): RichText { return $this->richText() ->add(sprintf('Satyjynyň bankynyň ady %s, hasap № ', $this->data->seller_bank_name)) ->add($this->data->seller_bank_hb_1, bold: true) ->toRichText(); } /** * Satyjy bank maglumatlary */ public function satyjyBankyMaglumatlary(): RichText { return $this->richText() ->add('şäherde (etrapda) ') ->add($this->data->seller_bank_city, bold: true) ->add(' BAB ') ->add($this->data->seller_bank_bab, bold: true) ->add(' bankyň kor.hasap ') ->add($this->data->seller_bank_hb_2, bold: true) ->toRichText(); } /** * 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; } /** * Default cell styles * * @return array|bool|int|string>> */ public function defaultCellStyles(): array { return [ 'font' => [ 'bold' => false, 'size' => 10, 'name' => 'Times New Roman', ], 'alignment' => [ 'horizontal' => Alignment::HORIZONTAL_CENTER, 'vertical' => Alignment::VERTICAL_CENTER, ], 'borders' => [ 'allBorders' => [ 'borderStyle' => Border::BORDER_THIN, ], ], ]; } /** * Cell bold style * * @return array> */ public function cellStyleBold(): array { return [ 'font' => [ 'bold' => true, ], ]; } /** * Cell style center * * @return array> */ public function cellStyleCenter(): array { return [ 'alignment' => [ 'horizontal' => Alignment::HORIZONTAL_LEFT, 'vertical' => Alignment::VERTICAL_CENTER, ], ]; } }