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.