Files
citrus-cms/resources/views/guide/material-group-map.md
T
2026-04-28 21:15:09 +03:00

28 KiB
Raw Blame History

Material Group Map System

Overview

The Material Group Map system is a critical component that manages qualified material combinations for welder assignments. It defines which material combinations are interchangeable or equivalent based on welding qualification standards.

Purpose

When assigning welders to joints, the system needs to verify that a welder qualified for specific material groups (e.g., 1(M01)+9(M11)) can also work with equivalent or qualified material combinations (e.g., 1(M01)+8(M11), 1(M01)+11(M11)).

Database Structure

Table: material_group_maps

  • material_name: The base material or material combination (e.g., 1(M01)+9(M11) or 9(M11))
  • qualified_materials: Comma-separated list of qualified/equivalent materials (e.g., 1(M01)+8(M11),1(M01)+9(M11),1(M01)+11(M11))

Example Data

material_name qualified_materials
9(M11) 8(M11),11(M11),9(M11),11(M51)
8(M11) 8(M11),11(M11),9(M11)
11(M11) 8(M11),11(M11),9(M11),11(M51)
1(M01) 1(M01)
1(M01)+9(M11) 1(M01)+8(M11),1(M01)+9(M11),1(M01)+11(M11)

Implementation Logic

Correct Approach (Current Implementation)

The system uses exact combination matching to prevent over-qualification:

// Step 1: Check if materials are the same
$isSameMaterial = ($ru1 === $ru2);

if ($isSameMaterial) {
    // Same material on both sides - use single material
    $materialCombination = $ru1; // e.g., "9(M11)"
} else {
    // Different materials - use combination
    $materialCombination = $ru1 . "+" . $ru2; // e.g., "1(M01)+9(M11)"
}

// Step 2: Search for exact match in material_group_maps
$exactMatch = MaterialGroupMap::where("material_name", $materialCombination)->first();

// Step 3: If exact match found, parse its qualified materials
if ($exactMatch && $exactMatch->qualified_materials) {
    $qualifiedMaterialsList = explode(",", $exactMatch->qualified_materials);
    foreach ($qualifiedMaterialsList as $combo) {
        $combo = trim($combo);
        $parts = explode("+", $combo);
        
        if (count($parts) == 2) {
            // Different materials combination
            $qualifiedCombinations[] = [
                'mat1' => trim($parts[0]), 
                'mat2' => trim($parts[1])
            ];
        } elseif (count($parts) == 1) {
            // Single material (same on both sides)
            $qualifiedCombinations[] = [
                'mat1' => trim($parts[0]), 
                'mat2' => trim($parts[0])
            ];
        }
    }
}

// Step 4: Always include original combination
if ($isSameMaterial) {
    // Same material - add only once (no reverse needed)
    $qualifiedCombinations[] = ['mat1' => $ru1, 'mat2' => $ru2];
} else {
    // Different materials - add both original and reverse
    $qualifiedCombinations[] = ['mat1' => $ru1, 'mat2' => $ru2];
    $qualifiedCombinations[] = ['mat1' => $ru2, 'mat2' => $ru1];
}

Key Benefits

  1. Specific Combinations Only: Only checks qualified materials for the exact input combination
  2. Handles Same Materials Correctly: Distinguishes between same materials (single entry) and different materials (combination)
  3. Predictable Results: Returns consistent number of records matching the database
  4. No Exponential Growth: Avoids N² combination explosion
  5. Optimized Queries: Reduces redundant combinations when materials are identical

Example Scenario

Input:

  • ru_1 = "1(M01)"
  • ru_2 = "9(M11)"

Process:

  1. Search for exact match: "1(M01)+9(M11)" in material_group_maps.material_name
  2. Found match with qualified_materials: "1(M01)+8(M11),1(M01)+9(M11),1(M01)+11(M11)"
  3. Create qualified combinations array:
    • 1(M01) + 8(M11)
    • 1(M01) + 9(M11)
    • 1(M01) + 11(M11)
    • 9(M11) + 1(M01) (reverse of original)
    • 1(M01) + 9(M11) (original)

Result: System searches for welders qualified for these 5 specific combinations only.

Common Pitfall: Incorrect Implementation

Wrong Approach (Nested Foreach - N² Problem)

// INCORRECT - DO NOT USE
$qualifiedMaterialsRU1 = materialGroupMap($ru1, $ru2); // Returns array of materials
$qualifiedMaterialsRU2 = materialGroupMap($ru2, $ru1); // Returns array of materials
$allQualifiedMaterials = array_merge($qualifiedMaterialsRU1, $qualifiedMaterialsRU2);

// This creates N² combinations!
foreach ($allQualifiedMaterials as $mat1) {
    foreach ($allQualifiedMaterials as $mat2) {
        // Check material_group_1 = $mat1 AND material_group_2 = $mat2
    }
}

Why This Is Wrong

If allQualifiedMaterials contains 5 elements: ["1(M01)", "8(M11)", "9(M11)", "11(M11)", "11(M51)"]

The nested foreach creates 25 combinations (5×5):

  • 1(M01) + 1(M01)
  • 1(M01) + 8(M11)
  • 1(M01) + 9(M11)
  • 1(M01) + 11(M11)
  • 1(M01) + 11(M51)
  • 8(M11) + 1(M01)
  • ... (20 more combinations)

Problem: Most of these combinations are invalid or unintended, leading to:

  • Too many welder records returned
  • Welders qualified for unrelated material combinations
  • Inconsistent results compared to the database

Usage in Different Modules

1. Welder Assignment (welder_1.php)

File: app/Http/Controllers/AutoCompleteType/welder-assignment/welder_1.php

Purpose: Auto-complete welder selection based on joint requirements

Implementation:

  • Uses exact combination matching
  • Searches welder_tests table with material group criteria
  • Returns list of qualified welders for the specific combination

2. Welder Qualification Table (welder-qualification-table.blade.php)

File: resources/views/admin-ajax/welder-qualification-table.blade.php

Purpose: Display all welder qualifications with their qualified materials

Implementation:

  • Shows each welder's qualification with material groups
  • Displays qualified materials for each combination
  • Used for verification and reference

Query Pattern

Both modules use consistent query pattern:

->where(function ($query) use ($qualifiedCombinations) {
    foreach ($qualifiedCombinations as $combo) {
        $query->orWhere(function($q) use ($combo) {
            $q->where("material_group_1", "like", "%{$combo['mat1']}%")
              ->where("material_group_2", "like", "%{$combo['mat2']}%");
        });
    }
})

Same Material Handling

🇬🇧 English

When both material groups are identical (e.g., ru_1 = "9(M11)" and ru_2 = "9(M11)"), the system must handle this case differently from material combinations.

The Problem

Incorrect Approach:

// Always concatenating with "+"
$materialCombination = $ru1 . "+" . $ru2; 
// Results in: "9(M11)+9(M11)" ❌

This creates issues because:

  • The database stores same materials as single entries: "9(M11)"
  • Searching for "9(M11)+9(M11)" won't find the record
  • No qualified materials are returned
  • Welder assignment fails

The Solution

Correct Approach:

// Check if materials are identical
$isSameMaterial = ($ru1 === $ru2);

if ($isSameMaterial) {
    // Same material on both sides - use single material
    $materialCombination = $ru1; // "9(M11)" ✅
} else {
    // Different materials - use combination
    $materialCombination = $ru1 . "+" . $ru2; // "1(M01)+9(M11)" ✅
}

Implementation Details

1. Material Combination Check (Lines 33-41 in welder_1.php):

$isSameMaterial = ($rowData['ru_1'] === $rowData['ru_2']);

if ($isSameMaterial) {
    // Same material on both sides - use single material
    $materialCombination = $rowData['ru_1'];
} else {
    // Different materials - use combination
    $materialCombination = $rowData['ru_1'] . "+" . $rowData['ru_2'];
}

Log::debug("[$logKey] Material combination check", [
    'ru_1' => $rowData['ru_1'],
    'ru_2' => $rowData['ru_2'],
    'is_same_material' => $isSameMaterial,
    'material_combination' => $materialCombination
]);

2. Parsing Qualified Materials (Lines 56-68):

foreach ($qualifiedMaterialsList as $combo) {
    $combo = trim($combo);
    $parts = explode("+", $combo);
    
    if (count($parts) == 2) {
        // Different materials combination
        $qualifiedCombinations[] = ['mat1' => trim($parts[0]), 'mat2' => trim($parts[1])];
    } elseif (count($parts) == 1) {
        // Single material (same on both sides)
        $qualifiedCombinations[] = ['mat1' => trim($parts[0]), 'mat2' => trim($parts[0])];
    }
}

3. Adding Original Combination (Lines 71-78):

if ($isSameMaterial) {
    // Same material - add only once (no reverse needed)
    $qualifiedCombinations[] = ['mat1' => $rowData['ru_1'], 'mat2' => $rowData['ru_2']];
} else {
    // Different materials - add both original and reverse
    $qualifiedCombinations[] = ['mat1' => $rowData['ru_1'], 'mat2' => $rowData['ru_2']];
    $qualifiedCombinations[] = ['mat1' => $rowData['ru_2'], 'mat2' => $rowData['ru_1']];
}

Example Scenarios

Input ru_1 Input ru_2 Material Combination Qualified Combinations Count Notes
9(M11) 9(M11) "9(M11)" 1 Single material, no reverse needed
8(M11) 8(M11) "8(M11)" 1 Single material, no reverse needed
1(M01) 1(M01) "1(M01)" 1 Single material, no reverse needed
1(M01) 9(M11) "1(M01)+9(M11)" 2+ Combination + reverse + qualified

Database Storage Format

material_group_maps table:

Scenario material_name qualified_materials Description
Same Material 9(M11) 8(M11),11(M11),9(M11),11(M51) Single material entry
Different Materials 1(M01)+9(M11) 1(M01)+8(M11),1(M01)+9(M11),1(M01)+11(M11) Combination entry

Benefits

Correct Database Lookup: Finds records for same materials
No Duplicate Combinations: Single material doesn't add reverse unnecessarily
Proper Qualified Materials: Parses both single materials and combinations
Optimized Queries: Fewer redundant combinations in qualified array


🇹🇷 Türkçe

Her iki malzeme grubu aynı olduğunda (örn: ru_1 = "9(M11)" ve ru_2 = "9(M11)"), sistem bu durumu malzeme kombinasyonlarından farklı şekilde ele almalıdır.

Problem

Yanlış Yaklaşım:

// Her zaman "+" ile birleştirme
$materialCombination = $ru1 . "+" . $ru2; 
// Sonuç: "9(M11)+9(M11)" ❌

Bu şu sorunları yaratır:

  • Veritabanı aynı malzemeleri tek giriş olarak saklar: "9(M11)"
  • "9(M11)+9(M11)" araması kaydı bulamaz
  • Qualified materials döndürülmez
  • Kaynakçı ataması başarısız olur

Çözüm

Doğru Yaklaşım:

// Malzemelerin aynı olup olmadığını kontrol et
$isSameMaterial = ($ru1 === $ru2);

if ($isSameMaterial) {
    // Her iki tarafta aynı malzeme - tek malzeme kullan
    $materialCombination = $ru1; // "9(M11)" ✅
} else {
    // Farklı malzemeler - kombinasyon kullan
    $materialCombination = $ru1 . "+" . $ru2; // "1(M01)+9(M11)" ✅
}

Uygulama Detayları

1. Malzeme Kombinasyon Kontrolü (welder_1.php'de 33-41. satırlar):

$isSameMaterial = ($rowData['ru_1'] === $rowData['ru_2']);

if ($isSameMaterial) {
    // Her iki tarafta aynı malzeme - tek malzeme kullan
    $materialCombination = $rowData['ru_1'];
} else {
    // Farklı malzemeler - kombinasyon kullan
    $materialCombination = $rowData['ru_1'] . "+" . $rowData['ru_2'];
}

Log::debug("[$logKey] Material combination check", [
    'ru_1' => $rowData['ru_1'],
    'ru_2' => $rowData['ru_2'],
    'is_same_material' => $isSameMaterial,
    'material_combination' => $materialCombination
]);

2. Qualified Materials Parse Etme (56-68. satırlar):

foreach ($qualifiedMaterialsList as $combo) {
    $combo = trim($combo);
    $parts = explode("+", $combo);
    
    if (count($parts) == 2) {
        // Farklı malzeme kombinasyonu
        $qualifiedCombinations[] = ['mat1' => trim($parts[0]), 'mat2' => trim($parts[1])];
    } elseif (count($parts) == 1) {
        // Tek malzeme (her iki tarafta aynı)
        $qualifiedCombinations[] = ['mat1' => trim($parts[0]), 'mat2' => trim($parts[0])];
    }
}

3. Orijinal Kombinasyonu Ekleme (71-78. satırlar):

if ($isSameMaterial) {
    // Aynı malzeme - sadece bir kez ekle (reverse gerekli değil)
    $qualifiedCombinations[] = ['mat1' => $rowData['ru_1'], 'mat2' => $rowData['ru_2']];
} else {
    // Farklı malzemeler - hem orijinal hem reverse ekle
    $qualifiedCombinations[] = ['mat1' => $rowData['ru_1'], 'mat2' => $rowData['ru_2']];
    $qualifiedCombinations[] = ['mat1' => $rowData['ru_2'], 'mat2' => $rowData['ru_1']];
}

Örnek Senaryolar

Giriş ru_1 Giriş ru_2 Malzeme Kombinasyonu Qualified Kombinasyon Sayısı Notlar
9(M11) 9(M11) "9(M11)" 1 Tek malzeme, reverse gerekli değil
8(M11) 8(M11) "8(M11)" 1 Tek malzeme, reverse gerekli değil
1(M01) 1(M01) "1(M01)" 1 Tek malzeme, reverse gerekli değil
1(M01) 9(M11) "1(M01)+9(M11)" 2+ Kombinasyon + reverse + qualified

Veritabanı Saklama Formatı

material_group_maps tablosu:

Senaryo material_name qualified_materials Açıklama
Aynı Malzeme 9(M11) 8(M11),11(M11),9(M11),11(M51) Tek malzeme girişi
Farklı Malzemeler 1(M01)+9(M11) 1(M01)+8(M11),1(M01)+9(M11),1(M01)+11(M11) Kombinasyon girişi

Faydaları

Doğru Veritabanı Sorgusu: Aynı malzemeler için kayıtları bulur
Gereksiz Tekrar Yok: Tek malzeme için reverse eklenmez
Doğru Qualified Materials: Hem tek malzeme hem kombinasyonları parse eder
Optimize Sorgular: Qualified array'de daha az gereksiz kombinasyon


Best Practices

  1. Always Check for Exact Combination First

    • Use the full combination string (e.g., "1(M01)+9(M11)")
    • Don't separate into individual materials first
  2. Handle Same Materials Correctly

    • Check if both materials are identical before concatenating
    • Use single material name for same materials (e.g., "9(M11)")
    • Use combination format only for different materials (e.g., "1(M01)+9(M11)")
  3. Parse Qualified Materials Correctly

    • Split by comma for multiple combinations
    • Split each combination by + for material pairs
    • Handle both single materials (count($parts) == 1) and combinations (count($parts) == 2)
    • Validate the structure of each qualified material
  4. Include Original Combination

    • Always add the input combination to qualified list
    • For different materials: include both forward and reverse (ru1+ru2 and ru2+ru1)
    • For same materials: include only once (no reverse needed)
  5. Avoid Nested Loops

    • Never use nested foreach over material arrays
    • Use specific combination matching only
  6. Log for Debugging

    • Log qualified combinations found
    • Log number of combinations (should be reasonable, not N²)
    • Compare results with expected database records

Troubleshooting

Problem: Too Many Welders Returned

Symptom: Welder dropdown shows 20+ options when database only has 9 records

Cause: Nested foreach creating N² combinations

Solution:

  • Check if exact combination matching is being used
  • Verify no nested loops over material arrays
  • Log the qualifiedCombinations array count

Problem: No Welders Found

Symptom: Welder dropdown is empty or shows error

Possible Causes:

  1. Material combination not in material_group_maps table
  2. Typo in material names
  3. Wrong separator (should be + for combinations)

Solution:

  • Check if combination exists in database
  • Verify the query includes original combination as fallback
  • Review log output for material matching

Problem: Inconsistent Results

Symptom: Different results between welder assignment and qualification table

Cause: Different query logic between modules

Solution:

  • Ensure both use same qualifiedCombinations approach
  • Verify both include same criteria (diameter, thickness, etc.)
  • Check groupBy clauses match

Migration Notes

When updating existing code from old to new approach:

  1. Remove nested foreach loops over materials
  2. Add exact combination matching logic
  3. Update query to use qualifiedCombinations array
  4. Test with known material combinations
  5. Compare results with database record counts
  6. Verify log output shows reasonable combination counts
  • app/Functions/material-group-map.php - Helper function (legacy, consider deprecating)
  • app/Http/Controllers/AutoCompleteType/welder-assignment/welder_1.php - Welder autocomplete
  • resources/views/admin-ajax/welder-qualification-table.blade.php - Qualification table display
  • resources/views/admin/type/welder-qualification-table.blade.php - Main qualification page

Conclusion

The Material Group Map system is critical for accurate welder assignment. The key is to use exact combination matching rather than generating all possible combinations from individual materials. This ensures predictable, accurate results that match the database and welding qualification standards.


User Guide: Material Group Map System Issue & Solution

🇬🇧 English Version

What Was the Problem?

When using the Welder Assignment feature in the system, users experienced an inconsistency where the dropdown list showed significantly more welders than actually existed in the database.

Observed Symptoms

Scenario:

  • Material Group 1: 1(M01)
  • Material Group 2: 9(M11)

In Welder Qualification Table:

  • Shows 9 welder records

In Welder Assignment Dropdown:

  • Shows 26+ welder records

This discrepancy caused:

  • Confusion about which welders are actually qualified
  • Incorrect welder suggestions
  • System reliability concerns
  • Difficulty in selecting the correct welder

Why Did This Happen?

Technical Explanation

The system was using an incorrect method called "nested foreach loop" which created what we call an N² combination explosion.

The Wrong Logic:

  1. System would take materials from both groups separately
  2. Example: ["1(M01)", "8(M11)", "9(M11)", "11(M11)", "11(M51)"] (5 materials)
  3. Then create ALL possible combinations by matching each material with every other material
  4. This created: 5 × 5 = 25 different combinations

Why This Was Wrong: Most of these 25 combinations were invalid or unintended. For example:

  • 8(M11) + 8(M11) (same material twice)
  • 1(M01) + 11(M51) (unrelated combination)
  • 8(M11) + 11(M51) (not a valid qualification)

However, the system would search for welders qualified for ALL these combinations, resulting in too many results.

The Solution

We implemented Exact Combination Matching approach:

How It Works Now

  1. Check for Exact Combination

    • System looks for the specific combination: "1(M01)+9(M11)"
    • Searches in the Material Group Map table
  2. Get Qualified Materials for That Specific Combination

    • If found, retrieves only the qualified materials listed for that exact combination
    • Example: "1(M01)+8(M11), 1(M01)+9(M11), 1(M01)+11(M11)" (3 combinations)
  3. Search Only for These Specific Combinations

    • Plus the reverse of the original combination
    • Total: 5 specific combinations (not 25!)

Benefits

Accurate Results: Now returns correct 9 records
Consistent: Matches the Welder Qualification Table
Faster: Fewer database queries
Reliable: Only shows welders who are actually qualified

Comparison

Aspect Old Method (Wrong) New Method (Correct)
Combinations Created 25 (5×5) 5 (specific only)
Welders Returned 26+ records 9 records
Logic Try all possible pairs Only valid combinations
Consistency Different from qualification table Same as qualification table
Performance Excessive queries Optimized

What This Means for Users

Before Fix:

  • Welder dropdown showed too many options
  • Difficult to find the right welder
  • Some shown welders might not actually be qualified

After Fix:

  • Welder dropdown shows only qualified welders
  • Easy to select the correct welder
  • System is consistent across all modules
  • Better performance and reliability

🇹🇷 Türkçe Versiyon

Sorun Neydi?

Sistemdeki Kaynakçı Ataması (Welder Assignment) özelliğini kullanırken, açılır listede veritabanında gerçekte var olandan çok daha fazla kaynakçı görüntüleniyordu.

Gözlemlenen Belirtiler

Senaryo:

  • Material Group 1: 1(M01)
  • Material Group 2: 9(M11)

Kaynakçı Yeterlilik Tablosunda (Welder Qualification Table):

  • 9 kaynakçı kaydı gösteriliyor

Kaynakçı Atama Açılır Listesinde (Welder Assignment Dropdown):

  • 26+ kaynakçı kaydı gösteriliyor

Bu tutarsızlık şu sorunlara neden oluyordu:

  • Hangi kaynakçıların gerçekten yeterli olduğu konusunda kafa karışıklığı
  • Yanlış kaynakçı önerileri
  • Sistem güvenilirliği endişeleri
  • Doğru kaynakçıyı seçmekte zorluk

Neden Oldu?

Teknik Açıklama

Sistem, N² kombinasyon patlaması dediğimiz durumu yaratan "iç içe foreach döngüsü" adlı yanlış bir yöntem kullanıyordu.

Yanlış Mantık:

  1. Sistem, her iki gruptan malzemeleri ayrı ayrı alıyordu
  2. Örnek: ["1(M01)", "8(M11)", "9(M11)", "11(M11)", "11(M51)"] (5 malzeme)
  3. Sonra her malzemeyi diğer her malzeme ile eşleştirerek TÜM olası kombinasyonları oluşturuyordu
  4. Bu şunu üretiyordu: 5 × 5 = 25 farklı kombinasyon

Neden Yanlıştı: Bu 25 kombinasyonun çoğu geçersiz veya istenmeyen kombinasyonlardı. Örneğin:

  • 8(M11) + 8(M11) (aynı malzeme iki kez)
  • 1(M01) + 11(M51) (ilgisiz kombinasyon)
  • 8(M11) + 11(M51) (geçerli bir yeterlilik değil)

Ancak sistem TÜM bu kombinasyonlar için yeterli kaynakçıları arıyordu, bu da çok fazla sonuç döndürülmesine yol açıyordu.

Çözüm

Tam Kombinasyon Eşleştirme (Exact Combination Matching) yaklaşımını uyguladık:

Şimdi Nasıl Çalışıyor

  1. Tam Kombinasyonu Kontrol Et

    • Sistem spesifik kombinasyonu arar: "1(M01)+9(M11)"
    • Material Group Map tablosunda arama yapar
  2. Bu Spesifik Kombinasyon İçin Yeterli Malzemeleri Al

    • Bulunursa, sadece o tam kombinasyon için listelenen yeterli malzemeleri alır
    • Örnek: "1(M01)+8(M11), 1(M01)+9(M11), 1(M01)+11(M11)" (3 kombinasyon)
  3. Sadece Bu Spesifik Kombinasyonları Ara

    • Artı orijinal kombinasyonun tersi
    • Toplam: 5 spesifik kombinasyon (25 değil!)

Faydaları

Doğru Sonuçlar: Artık doğru 9 kayıt döndürüyor
Tutarlı: Kaynakçı Yeterlilik Tablosu ile eşleşiyor
Daha Hızlı: Daha az veritabanı sorgusu
Güvenilir: Sadece gerçekten yeterli olan kaynakçıları gösteriyor

Karşılaştırma

Özellik Eski Yöntem (Yanlış) Yeni Yöntem (Doğru)
Oluşturulan Kombinasyonlar 25 (5×5) 5 (sadece spesifik)
Dönen Kaynakçı Sayısı 26+ kayıt 9 kayıt
Mantık Tüm olası çiftleri dene Sadece geçerli kombinasyonlar
Tutarlılık Yeterlilik tablosundan farklı Yeterlilik tablosu ile aynı
Performans Aşırı sorgu Optimize edilmiş

Kullanıcılar İçin Ne Anlama Geliyor

Düzeltme Öncesi:

  • Kaynakçı açılır listesi çok fazla seçenek gösteriyordu
  • Doğru kaynakçıyı bulmak zordu
  • Gösterilen bazı kaynakçılar aslında yeterli olmayabiliyordu

Düzeltme Sonrası:

  • Kaynakçı açılır listesi sadece yeterli kaynakçıları gösteriyor
  • Doğru kaynakçıyı seçmek kolay
  • Sistem tüm modüllerde tutarlı
  • Daha iyi performans ve güvenilirlik

Özet

Bu düzeltme, sistemin kaynakçı atama işlevini daha doğru, daha hızlı ve kullanıcılar için daha güvenilir hale getirdi. Artık sadece gerçekten o iş için yeterli olan kaynakçıları göreceksiniz!


🔧 Same Material Issue & Solution

🇬🇧 English Version

What Was the Problem?

When both material groups were identical (e.g., Material 1: 9(M11), Material 2: 9(M11)), the system was incorrectly creating a combination string "9(M11)+9(M11)" which didn't exist in the database. The database stores same materials as single entries like "9(M11)".

Impact

Before Fix:

  • Searching for "9(M11)+9(M11)"No match found
  • No qualified materials returned
  • Welder assignment failed for same-material joints
  • Users couldn't select welders for identical material combinations

Example Affected Cases:

  • 9(M11) + 9(M11) → No welders shown
  • 8(M11) + 8(M11) → No welders shown
  • 1(M01) + 1(M01) → No welders shown

The Solution

Added material identity check before creating the search string:

// Check if materials are identical
if ($ru1 === $ru2) {
    $materialCombination = $ru1; // Single material: "9(M11)"
} else {
    $materialCombination = $ru1 . "+" . $ru2; // Combination: "1(M01)+9(M11)"
}

Benefits

Works for Same Materials: Now correctly finds records when both materials are identical
Works for Different Materials: Still works correctly for material combinations
Correct Database Lookup: Searches with the right format in both cases
No Redundant Combinations: Doesn't add reverse for same materials (no need for 9(M11)+9(M11) reverse)
Complete Coverage: All material scenarios now work correctly

Comparison Table

Scenario Material 1 Material 2 Old Search String New Search String Result
Same Material 9(M11) 9(M11) "9(M11)+9(M11)" "9(M11)" Fixed
Same Material 8(M11) 8(M11) "8(M11)+8(M11)" "8(M11)" Fixed
Different Materials 1(M01) 9(M11) "1(M01)+9(M11)" "1(M01)+9(M11)" Still Works

🇹🇷 Türkçe Versiyon

Problem Neydi?

Her iki malzeme grubu aynı olduğunda (örn: Malzeme 1: 9(M11), Malzeme 2: 9(M11)), sistem yanlış şekilde "9(M11)+9(M11)" kombinasyon stringi oluşturuyordu. Bu string veritabanında mevcut değil. Veritabanı aynı malzemeleri "9(M11)" gibi tek giriş olarak saklar.

Etki

Düzeltme Öncesi:

  • "9(M11)+9(M11)" aramasıEşleşme bulunamadı
  • Qualified materials döndürülmedi
  • Aynı malzemeli kaynak noktaları için kaynakçı ataması başarısız oldu
  • Kullanıcılar aynı malzeme kombinasyonları için kaynakçı seçemedi

Etkilenen Örnek Durumlar:

  • 9(M11) + 9(M11) → Hiç kaynakçı gösterilmedi
  • 8(M11) + 8(M11) → Hiç kaynakçı gösterilmedi
  • 1(M01) + 1(M01) → Hiç kaynakçı gösterilmedi

Çözüm

Arama string'i oluşturmadan önce malzeme kimlik kontrolü eklendi:

// Malzemelerin aynı olup olmadığını kontrol et
if ($ru1 === $ru2) {
    $materialCombination = $ru1; // Tek malzeme: "9(M11)"
} else {
    $materialCombination = $ru1 . "+" . $ru2; // Kombinasyon: "1(M01)+9(M11)"
}

Faydaları

Aynı Malzemeler İçin Çalışır: Artık her iki malzeme aynı olduğunda kayıtları doğru buluyor
Farklı Malzemeler İçin Çalışır: Malzeme kombinasyonları için hala doğru çalışıyor
Doğru Veritabanı Sorgusu: Her iki durumda da doğru formatla arama yapıyor
Gereksiz Kombinasyon Yok: Aynı malzemeler için reverse eklemiyor (9(M11)+9(M11) reverse'üne gerek yok)
Tam Kapsama: Tüm malzeme senaryoları artık doğru çalışıyor

Karşılaştırma Tablosu

Senaryo Malzeme 1 Malzeme 2 Eski Arama String'i Yeni Arama String'i Sonuç
Aynı Malzeme 9(M11) 9(M11) "9(M11)+9(M11)" "9(M11)" Düzeltildi
Aynı Malzeme 8(M11) 8(M11) "8(M11)+8(M11)" "8(M11)" Düzeltildi
Farklı Malzemeler 1(M01) 9(M11) "1(M01)+9(M11)" "1(M01)+9(M11)" Hala Çalışıyor

Date: 2025-10-29
File: app/Http/Controllers/AutoCompleteType/welder-assignment/welder_1.php
Lines Modified: 30-88
Status: Resolved