10 KiB
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.
// 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:
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):
// 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:
$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ı.
// 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:
->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.
// 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:
// 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
- 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 -- <dosya>ile önce fark görülmeliydi. blockGroupmekanizmasını anla.module-block.blade.php'deblockGrouptanımlıysatable_columns()hiç çağrılmaz — kolonlar sadeceblockGroup'tan gelir. Bu mekanizma bilinmeden yapılan müdahale E1047'ye yol açtı.- Saved state sistemleri tüm URL parametrelerini (module dahil) saklamalı.
- FastCGI ortamında
set_time_limit()çalışmaz — timeout Apache config'den yönetilmeli. - Batch işlemlerde insert/update ayrımı net olmalı, kritik tablolar için insert tamamen kısıtlanmalı.
weld_logs'taki release kolonları kasıtlı bırakılmış —joint_release_viewview'ı bu kolonlara göre dinamik oluşturuluyor, drop etmek view'ı bozar.- DevExtreme stateStoring'de
filterValue≠filter.filterPanelstate'ifilterValuekey'i ile saklanır,filterile değil.customLoadiçinde yanlış key temizlenince stale filtre kalır ve E1047 fırlar. - 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_datekolonuna 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. |