Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?
  • Eerselg

      Seviye 4
    • Düzenlendi

    Merhabalar,

    Databaseden çektiğim verileri ödeme tiplerine göre gruplayıp wordde ayrı tablolara basmak istiyorum. Aşağıdaki kod ile deniyorum ancak tabloları ayrı ayrı basmıyor. Bildiğiniz başka bir yöntem varmıdır?

    public function masrafDetayWord($masrafID)
        {
            $masraf = MasrafTakip::where('MASTAKID', $masrafID)->first();
            $masrafDetaylar = MasrafDetay::where('MASRAFID', $masrafID)->get();
    
            $templatePath = storage_path('word_sablonlar/masraf-rapor.docx');
    
            if (!file_exists($templatePath)) {
                return response()->json(['error' => 'Şablon dosyası bulunamadı!'], 404);
            }
    
            $templateProcessor = new TemplateProcessor($templatePath);
    
            $odemeTurleri = [
                'Nakit' => [],
                'Kredi Kartı' => [],
                'Havale/EFT' => []
            ];
    
            foreach ($masrafDetaylar as $detay) {
                if ($detay->ODEMETIP == '1') {
                    $odemeTurleri['Nakit'][] = $detay;
                } elseif ($detay->ODEMETIP == '2') {
                    $odemeTurleri['Kredi Kartı'][] = $detay;
                } elseif ($detay->ODEMETIP == '3') {
                    $odemeTurleri['Havale/EFT'][] = $detay;
                }
            }
    
            $templateProcessor->cloneBlock('TABLE_BLOCK', count($odemeTurleri), true, true);
    
            $tableIndex = 1;
            foreach ($odemeTurleri as $kategori => $detaylar) {
                if (count($detaylar) > 0) {
                    $templateProcessor->setValue("KATEGORI_BASLIK#$tableIndex", "$kategori");
    
                    $rows = [];
                    $sira_no = 1;
                    foreach ($detaylar as $detay) {
                        $rows[] = [
                            'SNO' => $sira_no++,
                            'FATURAUNVAN' => $detay->FIRMAUNVAN,
                            'FISNO' => $detay->FIS_NO,
                            'TARIH' => date('d.m.Y', strtotime($detay->FISTARIH)),
                            'TUTAR' => number_format($detay->TUTAR, 2, ',', '.') . " TL",
                            'ACIKLAMA' => $detay->ACIKLAMA
                        ];
                    }
    
                    if (count($rows) > 0) {
                        $templateProcessor->cloneRowAndSetValues("SNO#$tableIndex", $rows);
                    }
                }
    
                $tableIndex++;
            }
    
            $uid = Uuid::uuid4();
            $fileName = "masraf_rapor_$uid.docx";
            $filePath = "masraflar/$fileName";
    
            Storage::makeDirectory('masraflar'); // Klasör yoksa oluştur
            $templateProcessor->saveAs(storage_path("app/$filePath"));
    
            return response()->json([
                'message' => 'Dosya başarıyla kaydedildi.',
                'file_url' => Storage::url($filePath) // Public URL döndür
            ]);
        }

    verilerim de aşağıdaki gibi geliyor

    {
    "SATIRID": 11985,
    "ACIKLAMA": "MANİSA SATIŞ",
    "BOLGEID": "3",
    "FIRMAUNVAN": "BESOT",
    "FISTARIH": "2014-06-05 00:00:00.000",
    "FIS_NO": "0004",
    "HARCAMA_TUR": "Otopark",
    "KK_ID": "0",
    "MASRAFID": "1625",
    "ODEMETIP": "1",
    "TUR": "1",
    "TUTAR": "3.00000000",
    "HARCAMAID": "5",
    "KISISAYI": null,
    "GUNSAYI": null,
    "KISIGUNORTALAMA": null
    },
    {
    "SATIRID": 11986,
    "ACIKLAMA": "BURSA SATIŞ",
    "BOLGEID": "3",
    "FIRMAUNVAN": "İREM KÖFTE",
    "FISTARIH": "2014-06-13 00:00:00.000",
    "FIS_NO": "0022",
    "HARCAMA_TUR": "Yemek",
    "KK_ID": "7",
    "MASRAFID": "1625",
    "ODEMETIP": "2",
    "TUR": "1",
    "TUTAR": "15.00000000",
    "HARCAMAID": "255",
    "KISISAYI": null,
    "GUNSAYI": null,
    "KISIGUNORTALAMA": null
    },

    Rapor şablonumda aşağıdaki gibi ayarladım

    ${KATEGORI_BASLIK}

    Ödeme Tipi: ${Kategori}
    SNo. Fiş/Fatura Unvanı Fiş No Tarih Tutar Açıklama
    ${SNO} ${FATURAUNVAN} ${FISNO} ${TARIH} ${TUTAR} ${ACIKLAMA}
    ${/KATEGORI_BASLIK}

      erselg Bu sayfaya baktım: https://phpword.readthedocs.io/en/latest/templates-processing.html

      cloneBlock için şöyle bir örnek vermiş:

      ${block_name}
      Customer: ${customer_name}
      Address: ${customer_address}
      ${/block_name}
      $templateProcessor->cloneBlock('block_name', 3, true, true);

      fakat sizin şablonda blok adı KATEGORI_BASLIK iken siz kodda TABLE_BLOCK yazmışsınız.