# Joint Release Log — Batch Excel Bugfix Raporu **Tarih:** 2026-03-27 **Branch:** `bugfix/spool-release-web-27032026` --- ## Yapılan Değişiklikler ### 1. `batch-excel.blade.php` — Memory Limit Fix **Sorun:** `weld_logs` tablosu seçilince PHP 128MB memory limiti aşılıyordu. **Neden:** Grid başlangıç datasını PHP döngüsüyle üretiyordu — 10.000 satır × N kolon = PHP'de milyonlarca string ifadesi render ediliyordu. ```php // ESKİ — PHP'de üretim for($row=1;$row<=$rowSize;$row++) { for($cell=1;$cell<=count($columns);$cell++) { echo "''," } } // YENİ — JS'de üretim var emptyRow = new Array({{ count($columns) }}).fill(''); var emptyData = []; for (var i = 0; i < {{ $rowSize }}; i++) emptyData.push(emptyRow.slice()); ``` --- ### 2. `batch-excel-save.blade.php` — Yanlış Tabloya Insert Engeli **Sorun:** `joint-release-log` modülüyle açılan saved state linki `module` parametresini taşımıyordu. `module` boş gelince `joint-release-log` bloğu atlanıyordu, normal weld_logs insert akışına giriyordu → **6595 sahte kayıt eklendi.** **Düzeltmeler:** a) `weld_logs`'a batch excel üzerinden insert tamamen engellendi: ```php if($tableName == "weld_logs") { $errorRows[] = ['error' => "Insert into weld_logs is not allowed via batch excel."]; continue; } ``` b) `welding_date` zorunluluğu kaldırıldı (listedeki tarih sütunu `welding_date` değil `rfi_date`'di): ```php // ESKİ — 3 alan zorunlu if (!isset($row['iso_number']) || !isset($row['no_of_the_joint_as_per_as_built_survey']) || !isset($refactoringRow['welding_date'])) // YENİ — 2 alan yeterli if (!isset($row['iso_number']) || !isset($row['no_of_the_joint_as_per_as_built_survey'])) ``` c) `welding_date` where koşulundan kaldırıldı — `iso_number + joint_no` ile eşleştirme yeterli: ```php $whereData = [ 'no_of_the_joint_as_per_as_built_survey' => $row['no_of_the_joint_as_per_as_built_survey'], 'iso_number' => $row['iso_number'], ]; ``` --- ### 3. `batch-excel.blade.php` — Saved State'e `module` Kaydedilmesi **Sorun:** Save-link AJAX'ı `module` parametresini POST etmiyordu, saved state linki de URL'e `module` eklemiyordu. **Çözüm:** `contents.html` kolonu `module` bilgisini tutmak için kullanıldı. ```php // Kaydetme 'html' => post("module") // Link oluşturma {{ $link->html ? '&module='.urlencode($link->html) : '' }} // AJAX POST module: '{{get("module")}}' ``` --- ### 4. `weldmap/main.blade.php` — Joint Releases JOIN **Sorun:** Joint-release-log sayfası release alanlarını `weld_logs` tablosundan okuyordu. Migration'da `weld_logs`'taki release kolonları drop edilmemişti, `joint_releases` tablosuna JOIN yapılmamıştı. **Çözüm:** Her iki query'ye LEFT JOIN eklendi, release alanları `jr.*` / `jr2.*` prefix'i ile okunuyor: ```php ->leftJoin('joint_releases as jr', 'weld_logs.id', '=', 'jr.weld_log_id') ->leftJoin('joint_releases as jr2', 'deleted_joints.id', '=', 'jr2.deleted_joint_id') ``` --- ### 5. `weldlog.blade.php` — E1047 DevExtreme Hatası **Sorun:** `joint_releases` tablosu oluşturulurken `weld_logs`'taki `*_release_*` kolonları drop edilmemişti. `table_columns()` bunları döndürüyordu → datagrid columns array'ine giriyordu → `blockGroup`'ta tanımlı olmadığı için DevExtreme **E1047** hatası veriyordu → weldlog sayfası açılmıyordu. **İlk uygulanan çözüm (YANLIŞ):** `weldlog.blade.php`'ye `Joint Release` grubu eklendi, 22 release kolonu `blockGroup`'a dahil edildi. **Neden yanlıştı:** `dev` branch'inde weldlog sorunsuz çalışıyor çünkü `module-block.blade.php`'de `$blockGroup` tanımlıysa `table_columns()` hiç çağrılmıyor — `$columns` doğrudan `$blockGroup`'tan üretiliyor. Release kolonları `blockGroup`'ta olmadığı için datagrid'e zaten girmiyor. `weld_logs`'ta fiziksel kolon varlığı `blockGroup` mekanizması sayesinde sorun yaratmıyor. ```php // module-block.blade.php if(!isset($columns)) { if(isset($blockGroupColumns)) { $columns = $blockGroupColumns; // blockGroup varsa table_columns() çağrılmaz } else { $columns = table_columns($tableName); } } ``` **Gerçek sorun:** E1047 hatası weldlog'tan değil, `main.blade.php`'ye eklediğimiz gereksiz JOIN kodundan kaynaklanıyordu. `main.blade.php`'deki `$weldLogsSelectColumns` bloğu `$columns` listesinde olmayan release kolonlarını `jr.*` prefix'iyle SELECT'e ekliyordu — bu kolonlar datagrid'e girince `blockGroup`'ta tanımlı olmadığı için E1047 patladı. **Doğru çözüm:** `weldlog.blade.php`'ye eklenen `Joint Release` bloğu **geri alındı**. `main.blade.php`'deki JOIN kodu dev'de zaten `joint_release_view` DB view'ı üzerinden çözülmüş — bizim eklediğimiz JOIN gereksizdi. --- ### 6. MAMP FastCGI Timeout **Sorun:** `set_time_limit(-1)` FastCGI modunda etkisiz. 30 saniyelik default timeout büyük batch işlemlerini kesiyordu. **Çözüm:** `/Applications/MAMP/conf/apache/httpd.conf`: ``` FastCgiServer /Applications/MAMP/fcgi-bin/php.fcgi -socket httpdFastCGI.sock -idle-timeout 300 ``` --- ### 7. Veri Temizliği (DB) | İşlem | Miktar | Açıklama | |---|---|---| | DELETE | 6.595 kayıt | ID 90000–96594, created_at=null, tüm alanlar null | | UPDATE | 639 kayıt | `general_contractor` alanındaki tarih değerleri → null | --- ## Alternatif / Daha Basit Çözümler ### E1047 Hatası İçin **Gerçek sorun kaynağı:** `main.blade.php`'ye eklenen gereksiz JOIN kodu. `dev` branch'inde bu iş `joint_release_view` DB view'ı üzerinden çözülmüş, manuel JOIN'e gerek yoktu. **Daha basit yol — `main.blade.php`'ye dokunmamak:** `dev` branch'inden farkı incelemeden kod eklemek, çakışma yarattı. Branch farkı önce `git diff dev` ile incelenmeliydi. **Eğer gerçekten migration'da kök çözüm istenseydi:** ```php // create_joint_releases_table migration'ına eklenmeliydi: foreach(['joint_release_rfi_no','joint_release_rfi_date',...] as $col) { Schema::table('weld_logs', fn($t) => $t->dropColumnIfExists($col)); } ``` Ama `joint_release_view` view'ı `weld_logs`'taki kolonlara göre dinamik oluşturuluyor — drop edilseydi view da bozulurdu. Bu nedenle kolonların fiziksel olarak tutulması kasıtlı bir tasarım kararıydı. ### `weld_logs` Insert Engeli İçin **Yapılan:** Sunucu tarafında hard block — hata mesajıyla return. **Daha kullanıcı dostu yol:** `batch-excel.blade.php`'de `weld_logs` tablosu seçilince "Store Data" butonu gizlenmesi ya da disabled yapılması. Kullanıcı göndermeden önce uyarılırdı. ### Saved State `module` Sorunu İçin **Yapılan:** `contents.html` kolonuna module bilgisi yazıldı — mevcut tabloyu şişirmeden çalışıyor. **Daha temiz yol:** `contents` tablosuna `module` adında dedicated bir kolon eklemek. `html` kolonu semantik olarak başka amaçlar için kullanılabilir, `module` bilgisini tutmak için doğru alan değil. --- ## Öğrenilen Dersler 1. **Branch farkını önce incele.** `dev`'de çalışıyorsa neden çalıştığını anlamadan aynı problemi farklı yolla çözmeye çalışmak ikincil hatalar yaratır. `git diff dev -- ` ile önce fark görülmeliydi. 2. **`blockGroup` mekanizmasını anla.** `module-block.blade.php`'de `blockGroup` tanımlıysa `table_columns()` hiç çağrılmaz — kolonlar sadece `blockGroup`'tan gelir. Bu mekanizma bilinmeden yapılan müdahale E1047'ye yol açtı. 3. **Saved state sistemleri** tüm URL parametrelerini (module dahil) saklamalı. 4. **FastCGI ortamında** `set_time_limit()` çalışmaz — timeout Apache config'den yönetilmeli. 5. **Batch işlemlerde** insert/update ayrımı net olmalı, kritik tablolar için insert tamamen kısıtlanmalı. 6. **`weld_logs`'taki release kolonları kasıtlı bırakılmış** — `joint_release_view` view'ı bu kolonlara göre dinamik oluşturuluyor, drop etmek view'ı bozar. 7. **DevExtreme stateStoring'de `filterValue` ≠ `filter`.** `filterPanel` state'i `filterValue` key'i ile saklanır, `filter` ile değil. `customLoad` içinde yanlış key temizlenince stale filtre kalır ve E1047 fırlar. 8. **Geçici yanlış fix bile iz bırakır.** Yanlış blockGroup anlık eklendi-geri alındı, ama kullanıcı o sürede `joint_release_rfi_date` kolonuna filtre koydu — bu filtre localStorage'da kaldı ve sonraki her açılışta E1047 patlattı. --- ## Değişiklik Özeti (git diff) ### Gerekli Değişiklikler | Dosya | Değişiklik | Neden | |---|---|---| | `batch-excel.blade.php` | PHP döngüsü → JS `Array.fill()` ile boş data üretimi | PHP 128MB memory limit aşımı | | `batch-excel.blade.php` | Save-link AJAX'ına `module` eklendi; saved state URL'ine `module` parametresi eklendi | Saved state linki joint-release-log modülünü kaybediyordu | | `batch-excel-save.blade.php` | `joint-release-log` için `welding_date` zorunluluğu kaldırıldı; WHERE'den çıkarıldı | Excel listesindeki tarih kolonu `rfi_date`, `welding_date` değil | | `batch-excel-save.blade.php` | `weld_logs`'a insert hard block eklendi; dead code (ulaşılamaz duplicate kontrol) silindi | 6595 sahte kayıt olayının tekrar yaşanmaması | | `batch-excel-save.blade.php` | `weld_logs` update sırasında release alanlarını `joint_releases`'e sync et | Batch excel'den release alanı güncellenince `joint_releases` tablosu güncellenmiyordu | | `main.blade.php` | `joint-release-log` bloğuna `joint_releases` LEFT JOIN eklendi; release alanları `jr.*`/`jr2.*` prefix'i ile okunuyor | Release alanları `weld_logs`'tan değil `joint_releases` tablosundan okunmalı | | `js-state-storing.blade.php` | `wps_joint_type_ru` tek alan yerine tüm stale release alanları temizleniyor; `filter` yerine `filterValue` key'i temizleniyor | `filterPanel` state'i `filterValue` key'i kullanıyor, `filter` değil | | `js-helpers.blade.php` | weldlog localStorage temizleme bloğu `filterValue`'ya bakacak şekilde güncellendi; stale alan listesi genişletildi | Aynı `filterValue` vs `filter` hatası | ### Dokunulmayan Dosyalar | Dosya | Neden | |---|---| | `weldlog.blade.php` | Yanlış `Joint Release` blockGroup eklendi → geri alındı. Şu an dev ile identik. | | `mobile/*` (Podfile.lock, pubspec.lock, vb.) | `share_plus` paketi eklenmesinden kaynaklanan otomatik değişiklikler — bu bugfix ile ilgisi yok. |