ghergedan adlı üyeden alıntı: mesajı görüntüle
Stok akaryakıt olunca epey kafa karıştırıcı olmuş.

Verdiğiniz örnek üzerinden gidersek; biri 25.000 Kg, diğeri 15.000 Kg olmak üzere iki giriş kaydı var. İki girişin de fiyatları farklı. 30.000 Kg'lık bir çıkış yapılacak. Tek bir çıkış yapacağınızı, bunu da 2 farklı fiyat üzerinden hesaplayarak yapmak istediğinizi yazmışsınız ancak fiyatlar farklı olduğu için 2 farklı çıkış yapmak (10.58'lik ayrı, 10.90'lık ayrı) daha mantıklı gibi görünüyor. İleride çıkış tablosunda yapacağınız hiçbir hesabı tutturamazsınız. Ayrıca giriş-çıkış tablo yapınıza bakılırsa, ilişkili başka bir tablo daha kullanıyor olmanız lazım ancak belirtmemişsiniz; o yüzden her çıkıştan sonra giriş kaydındaki stok değerini güncellediğinizi varsayıyorum. Çıkış yapılacak ürün 30.000 litre Mazot olsun. Kurguladığınız yapı üzerinden ben şu şekilde bir yol izlerdim;

Önce cinsi Mazot olan ve aktif olarak stokta mevcut olan kayıtları getirir, daha sonra dizi içinde gezinirdim;

$stokListesi = SELECT * FROM AkaryakitGirdi WHERE stokDurumu = ? AND cinsi = ?
Mevcut stok durumunu nasıl hesaplıyorsunuz bilmiyorum, sql sorgusunu örnek olarak yazdım.
$cikilanKg         = 30000; // Çıkılacak miktar
$stoktakiToplamKg  = array_sum(array_column($stokListesi, 'kilogram')); // Stoktaki toplam miktar
$etkilenenKayitlar = []; // Etkilenen kayıtların yazılacağı dizi

// Yeterli miktar yoksa
if ($cikilanKg > $stoktakiToplamKg) {

    // İşlemler

// Yeterli miktar varsa
} else {

    foreach ($stokListesi as $stok) {

        $stokYeterliMi = ($stok->kilogram > $cikilanKg);
    
        if (!$stokYeterliMi)
            $cikilanKg -= $stok->kilogram;

        $etkilenenKayitlar[] = [
            'kayitId'     => $stok->id,
            'birimFiyat'  => $stok->birim_fiyat,
            'cikilanKg'   => ($stokYeterliMi ? $cikilanKg : $stok->kilogram),
            'kalanKg'     => ($stokYeterliMi ? ($stok->kilogram - $cikilanKg) : 0),
            'toplamTutar' => ($stok->birim_fiyat * ($stokYeterliMi ? $cikilanKg : $stok->kilogram)),
            'stokTukendi' => !$stokYeterliMi
        ];

        if ($stokYeterliMi) break;
    }
}
$etkilenenSatirlar dizisi şöyle döner;
Array
(
    [0] => Array
    (
        [kayitId ] => 1
        [birimFiyat] => 10.58
        [cikilanKg] => 25000
        [kalanKg] => 0
        [toplamTutar] => 264500
        [stokTukendi] => 1
    )

    [1] => Array
    (
        [kayitId] => 2
        [birimFiyat] => 10.90
        [cikilanKg] => 5000
        [kalanKg] => 10000
        [toplamTutar] => 54500
        [stokTukendi] =>
    )
)

// Stoktan çıkış işlemleri
foreach ($etkilenenKayitlar as $kayit) {

    // AkaryakitCikti tablosuna yeni çıkışlar ekle veya mevcut stok durumunu değiştir

}
Yalnızca stok miktarı tükenen kayıtlara ulaşmak için;
// Stoğu biten kayıtlar
$stoguBitenKayitlar = array_filter($etkilenenKayitlar, function($stok) {
    return $stok['stokTukendi'];
});
Yine de toplam tutara ihtiyaç varsa;
// Toplam Tutar
$toplamTutar = array_reduce($etkilenenKayitlar, function($prev, $current) {
    $prev += $current['toplamTutar'];
    return $prev;
});
Kolay gelsin.
Allah sizden razı olsun hocam Mantığını kurdum sayenizde. Kod olarak daha oturtamadım ama biraz deneme yaptıktan sonra netice alacağım.

Ayrıca, her konuma istisnasız, hiçbir menfaatiniz olmadan bir hoca edasıyla yanıt verdiğiniz için çok teşekkür ederim. Bu forum eskiden ciddi bir paylaşım platformuydu. Şuan bu ruhu yaşatan üyelere bakıyorum hep sizin gibi eski üyeler. Yeni nesil ticaret ahlak'ında yalnızca menfi değerler doğrultusunda yardımlar söz konusu.

Umarım birgün benimde size yardımcı olabileceğim bir konu olur php olmasada

Edirne'ye yolunuz düşer, bir işiniz düşer, yapabileceğim birşey olur herzaman yardımcı olmak isterim.

Saygılarımla