Files
citrus-cms/resources/views/guide/batch-excel-joint-release-bugfix-27032026.md
T
2026-04-28 21:15:09 +03:00

10 KiB
Raw Blame History

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 9000096594, 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

  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 -- <dosya> 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 filterValuefilter. 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.