205 lines
10 KiB
Markdown
205 lines
10 KiB
Markdown
# 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 -- <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 `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. |
|