Merhaba,
Şöyle bir sorunum var. Şuanda AkaryakitGirdi, AkaryakitCikti şeklinde 2 tablom var.
AkaryakitGirdi tablosu şu şekilde,
ID, Cinsi, Kilogram, Birim Fiyat, Toplam Tutar, Tarih şeklinde.
AkaryakıtCikti tablomda aynı şekilde.
Şimdi mesela 1 numaralı ID ile 25000 kg, 10.58 TL'den girmişim. Stoğa 25000 kilo işletmişim. Sonrada 2 numaralı ID ile 15000 KG x 10.90 tl'den girmişim.
Sonrasında çıkış yapıyorum,
ID 1 ile 30000 kg lık çıktı yapıyorum. İlk girdinin 25000 kg kısmını birim fiyat 10.58' tl den, kalan 5000 kg'yi 2 numaralı id girişinden 10.90 tl'den çıkmasını istiyorum.
Yani 25000x10.58 artı 5000x10.90 olarak toplam tutara işlemek istiyorum. 1 numaralı girdi'nin stoğunu 0'dan 1'e çevirip o girilen stoğun bitmiş olduğunu tespit etmiş olacağım.
Umarım anlatabilmişimdir,
Yardımcı olabileceklere şimdiden çok teşekkürler
Kademeli biten stoktan veri çekme
3
●181
- 28-12-2021, 04:00:14Stok 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. - 29-12-2021, 01:35:53Allah sizden razı olsun hocamghergedan adlı üyeden alıntı: mesajı görüntüle
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 - 29-12-2021, 03:35:07Rica ederim. Maalesef hiçbir şey eskisi gibi değil. "Bilgi paylaştıkça çoğalır" mottosu eskide kaldı, dönem "dm'den iletişime geçilmiştir" dönemi.ercan adlı üyeden alıntı: mesajı görüntüle
Teşekkür etmekten imtina eden insanlar dolu her tarafta. O yüzden asıl ben size bu içten cevabınız için teşekkür ederim. Saygı bizden. Esenlikler.
Mantığını kurdum sayenizde. Kod olarak daha oturtamadım ama biraz deneme yaptıktan sonra netice alacağım.