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

205 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 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:**
```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. |