From 607a916cff415d24227b3402d15870263bf1f7a9 Mon Sep 17 00:00:00 2001 From: Nurmuhammet Allanov Date: Sun, 10 Nov 2024 15:32:54 +0500 Subject: [PATCH] invoice items so far getting better --- app/Http/Controllers/HomeController.php | 43 +++++++++-- app/Modules/Invoice/.DS_Store | Bin 8196 -> 8196 bytes .../Invoice/Actions/GenerateInvoiceExcell.php | 69 ++++++++++++++++++ app/Modules/Invoice/Data/InvoiceItem.php | 13 ++-- .../Resources/Docs/invoice-original.xls | Bin 0 -> 34816 bytes .../Invoice/Resources/Docs/invoice.xls | Bin 34816 -> 32256 bytes public/write.xls | Bin 15872 -> 12800 bytes 7 files changed, 115 insertions(+), 10 deletions(-) create mode 100755 app/Modules/Invoice/Resources/Docs/invoice-original.xls diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index eb51776..914663d 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -33,16 +33,49 @@ class HomeController extends Controller items: [ new InvoiceItem( - name: 'Programma üpjünçiligini işläp taýýarlamak barada', + name: 'Programma üpjünçiligini hyzmat etmek barada', unit: 'ay', - quantity: 1, - unit_price: 25000, + quantity: 2, + unit_price: 100000, vat: null, - excludingVat: null, + vat_excluded: null, vat_percentage: null, vat_tmt: null, - total: 25000, + total: 200000, ), + new InvoiceItem( + name: 'Programma üpjünçiligini hyzmat etmek barada', + unit: 'ay', + quantity: 2, + unit_price: 100000, + vat: null, + vat_excluded: null, + vat_percentage: null, + vat_tmt: null, + total: 200000, + ), + new InvoiceItem( + name: 'Programma üpjünçiligini hyzmat etmek barada', + unit: 'ay', + quantity: 2, + unit_price: 100000, + vat: null, + vat_excluded: null, + vat_percentage: null, + vat_tmt: null, + total: 200000, + ), + new InvoiceItem( + name: 'Programma üpjünçiligini işäň taýýarlamak barada', + unit: 'ay', + quantity: 2, + unit_price: 100000, + vat: null, + vat_excluded: null, + vat_percentage: null, + vat_tmt: null, + total: 200000, + ) ] )) ->handle() diff --git a/app/Modules/Invoice/.DS_Store b/app/Modules/Invoice/.DS_Store index 352e2a84405c18e6aeb867700a6d56e90d2688ef..3f56ecdfa71432fb2b50d7c8c33970dd8e74d377 100644 GIT binary patch delta 116 zcmZp1XmOa}&nUDpU^hRb&}JTi(=3ua3_%R33&)S^xk5 diff --git a/app/Modules/Invoice/Actions/GenerateInvoiceExcell.php b/app/Modules/Invoice/Actions/GenerateInvoiceExcell.php index 259a616..cb05627 100644 --- a/app/Modules/Invoice/Actions/GenerateInvoiceExcell.php +++ b/app/Modules/Invoice/Actions/GenerateInvoiceExcell.php @@ -3,11 +3,14 @@ namespace App\Modules\Invoice\Actions; use App\Modules\Invoice\Data\InvoiceExcellData; +use App\Modules\Invoice\Data\InvoiceItem; use App\Modules\Makeable; use Illuminate\Support\Carbon; use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\RichText\RichText; use PhpOffice\PhpSpreadsheet\Spreadsheet; +use PhpOffice\PhpSpreadsheet\Style\Alignment; +use PhpOffice\PhpSpreadsheet\Style\Border; use PhpOffice\PhpSpreadsheet\Style\Font; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; @@ -120,6 +123,72 @@ class GenerateInvoiceExcell 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->getCell('J' . $itemCellNumber)->setValue($item->total); + + // 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++; + }); } /** diff --git a/app/Modules/Invoice/Data/InvoiceItem.php b/app/Modules/Invoice/Data/InvoiceItem.php index 22037c8..1a629a6 100644 --- a/app/Modules/Invoice/Data/InvoiceItem.php +++ b/app/Modules/Invoice/Data/InvoiceItem.php @@ -9,12 +9,15 @@ class InvoiceItem public int|string $unit, public int $quantity, public int|float $unit_price, - public null|int|float $vat, - public null|int|float $excludingVat, - public null|int|float $vat_percentage, - public null|int|float $vat_tmt, + public null|int|float|string $vat, + public null|int|float|string $vat_excluded, + public null|int|float|string $vat_percentage, + public null|int|float|string $vat_tmt, public int|float|string $total, ) { - // ... + $this->vat = $vat ?: 'x'; + $this->vat_excluded = $vat_excluded ?: 'x'; + $this->vat_percentage = $vat_percentage ?: 'x'; + $this->vat_tmt = $vat_tmt ?: 'x'; } } diff --git a/app/Modules/Invoice/Resources/Docs/invoice-original.xls b/app/Modules/Invoice/Resources/Docs/invoice-original.xls new file mode 100755 index 0000000000000000000000000000000000000000..139ae31fec0e43b1eedf07fd22cd1d79ec1b31a7 GIT binary patch literal 34816 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 delta 4805 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 boS9*TA%K|?^C4zIn literal 15872 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