• 03-10-2019, 09:52:34
    #1
    Kendi işletmemiz için php ile bir uygulama yazıyorum. Fakat bir noktada takıldım. Stok olayı başlı başına karışık zaten.

    Şimdi mantık şu ürüne ait ayrı ayrı stok tablolarım var.Tek bir tablo yapamıyorum çünkü son kullanım tarihi olması lazım her stokta.

    Tablolarım Alttaki gibi. Satış yapıldığında satış tablosuna kayıt yapılıyor ve üründeki stok değeri düşürülüyor. Buraya kadar sıkıntı yok.

    Benim istediğim satış adedi kadar o ürüne ait 'stok' tablosundan stok_kalan'ı 0 olmayan en düşük id'li stoğu bulup düşmeye başlayacak. Satış adedi o anki stoktan fazla ise de
    diğer stoka geçip oradan düşmeye başlayacak taki satış adet bitene kadar döngü ile yapmayı denedim ama beceremedim. Bu noktada sizden yardım istiyorum. Şimdiden teşekkürler...



    if (isset($_POST['direksatisekle'])) {
    
        islemkontrol();
    
        $sahip_id=$_POST['sahip_id'];
        $urun_id=$_POST['urun_id'];
        $satis_adet=$_POST['satis_adet'];
        $satis_birimfiyat=$_POST['satis_birimfiyat'];
        $satis_toplamfiyat=$_POST['satis_toplamfiyat'];
        $satis_aciklama=$_POST['satis_aciklama'];
        $stok_id=$_POST['stok_id'];
    
    
        $kaydet=$db->prepare("INSERT INTO satis SET
            sahip_id=:sahip_id,
            urun_id=:urun_id,
            satis_adet=:satis_adet,
            satis_birimfiyat=:satis_birimfiyat,
            satis_toplamfiyat=:satis_toplamfiyat,
            satis_aciklama=:satis_aciklama");
        $insert=$kaydet->execute(array(
            'sahip_id' => $sahip_id,
            'urun_id' => $urun_id,
            'satis_adet' => $satis_adet,
            'satis_birimfiyat' => $satis_birimfiyat,
            'satis_toplamfiyat' => $satis_toplamfiyat,
            'satis_aciklama' => tr_strtoupper($satis_aciklama)
        ));
    
        if ($insert) {
    
            $urunstoksor=$db->prepare("SELECT * FROM urun WHERE urun_id=:urun_id");
            $urunstoksor->execute(array('urun_id'=>$urun_id));
            $urunstokcek=$urunstoksor->fetch(PDO::FETCH_ASSOC);
            $eskistok=$urunstokcek['urun_stok'];
            $yenistok=$eskistok-$satis_adet;
    
            $stokguncelle=$db->prepare("UPDATE urun SET
                urun_stok=:urun_stok
                WHERE urun_id={$urun_id}");
            $insert2=$stokguncelle->execute(array(
                'urun_stok' => $yenistok
            ));
    
            if ($insert2) {
    
    
                $stoksor=$db->prepare("SELECT * FROM stok WHERE urun_id=:urun_id AND stok_id=:stok_id");
                $stoksor->execute(array('urun_id'=>$urun_id,'stok_id'=>$stok_id));
                $stokcek=$stoksor->fetch(PDO::FETCH_ASSOC);
                $stok_kalan=$stokcek['stok_kalan'];
    
                
    
                    for ($i=$satis_adet; $i<=0; $i--) {
    
                        
                        ?????????????
    
                        
    
                    }
  • 03-10-2019, 10:38:43
    #2
    Bunun için bir adet fonksiyon yaz fonksiyona iki adet değişken gönder , 1.si ürün id , 2. si stoktan düşecek olan ürün

    fonksiyon içinde ilk olarak stok_id asc ile (en düşük id dediğin sanırım stok_id) limit 1 ile en düşük id li ürünün stoğunu bul

    eğer satılan ürün stoktan fazla ise elindeki kadar düş ve bu fonksiyonu tekrar çalıştır bu sefer kalan düşülecek ürün ile urun id yi tekrar gönder

    düşülecek ürün stoktan az ise zaten problem yok..


    function stokDusur($urun_id , $dusulecekUrun){
          'select count(id) from stok where urun_id = '$urun_id' and stok_kalan != 0 order by stok_id asc limit 1'    //  $stokAdedi en düşük id li stok adedini bul 
    if($stokAdedi >= $dusulecekUrun)
     //Bu bölümde stok düşülecek üründen fazla sorun yok update ile güncelle
    }else{
    // stok adedi düşülecek üründen daha az ise 
    $kalanDusulecek = $dusulecekUrun - $stokAdedi;
    // bu alanda stokAdedi kadar değeri bu satırdan düş zaten sıfırlamış olacaksın
    //tekrar bu fonksiyona değer gönder
      stokDusur($urun_id , $kalanDusulecek);
    }
  • 03-10-2019, 12:50:59
    #3
    Çok teşekkür ederim verdiğiniz fonksiyon mantığı ile işi çözdüm.
    Şimdi silme işleminde aynısını tersten yapmayı deneyeceğim



    En sonunda çözdüm belki diğer arkadaşların işine yarar diye iki fonksiyonu da paylaşıyorum. Tekrardan çok teşekkürler.
    Not: Eğer Fonkiyon içide mysql işlemleri yapcaksanız (SELECT, INSERT, UPDATE, DELETE vb.) mutlaka veritabanı bağlantısı istiyor bilginize...

    // Satıştan Sonra Stok Düşürme Fonksiyonu
    function stokDusur($urun_id , $dusulecekUrun){
    
    include 'baglan.php';
    
    $stokidsor=$db->prepare("SELECT MIN(stok_id) AS stokid FROM stok WHERE urun_id=:urun_id AND stok_kalan > 0 ORDER BY stok_id ASC LIMIT 1");
    $stokidsor->execute(array('urun_id'=>$urun_id));
    $stokidcek=$stokidsor->fetch(PDO::FETCH_ASSOC);
    $stok_id=$stokidcek['stokid'];
    
    $stoksor=$db->prepare("SELECT * FROM stok WHERE stok_id=:stok_id");
    $stoksor->execute(array('stok_id'=>$stok_id));
    $stokcek=$stoksor->fetch(PDO::FETCH_ASSOC);
    $stokAdedi=$stokcek['stok_kalan'];
    
    // $stokAdedi en düşük id li stok adedini bul
    
    if($stokAdedi >= $dusulecekUrun) {
    
    $kalan=$stokAdedi-$dusulecekUrun;
    
    $stokguncelle=$db->prepare("UPDATE stok SET
    stok_kalan=:stok_kalan
    WHERE stok_id={$stok_id}");
    $stokguncelle->execute(array(
    'stok_kalan' => $kalan
    ));
    
    //Bu bölümde stok düşülecek üründen fazla sorun yok update ile güncelle
    
    
    } else {
    
    // stok adedi düşülecek üründen daha az ise
    $kalanDusulecek = $dusulecekUrun - $stokAdedi;
    
    $stokguncelle2=$db->prepare("UPDATE stok SET
    stok_kalan=:stok_kalan
    WHERE stok_id={$stok_id}");
    $stokguncelle2->execute(array(
    'stok_kalan' => 0
    ));
    
    // bu alanda stokAdedi kadar değeri bu satırdan düş zaten sıfırlamış olacaksın
    //tekrar bu fonksiyona değer gönder
    stokDusur($urun_id , $kalanDusulecek);
    }
    
    }
    // Satış Sildikten Sonra Stok Arttırma Fonksiyonu
    function stokArttir($urun_id , $arttirilacakUrun){
    
    include 'baglan.php';
    
    $stokidsor=$db->prepare("SELECT MAX(stok_id) AS stokid FROM stok WHERE urun_id=:urun_id AND stok_adet != stok_kalan AND stok_adet > stok_kalan ORDER BY stok_id DESC LIMIT 1");
    $stokidsor->execute(array('urun_id'=>$urun_id));
    $stokidcek=$stokidsor->fetch(PDO::FETCH_ASSOC);
    $stok_id=$stokidcek['stokid'];
    
    $stoksor=$db->prepare("SELECT * FROM stok WHERE stok_id=:stok_id");
    $stoksor->execute(array('stok_id'=>$stok_id));
    $stokcek=$stoksor->fetch(PDO::FETCH_ASSOC);
    $stok_adet=$stokcek['stok_adet'];
    $stok_kalan=$stokcek['stok_kalan'];
    $fark=$stok_adet-$stok_kalan;
    
    
    if($fark >= $arttirilacakUrun) {
    
    $kalan=$stok_kalan+$arttirilacakUrun;
    
    $stokguncelle=$db->prepare("UPDATE stok SET
    stok_kalan=:stok_kalan
    WHERE stok_id={$stok_id}");
    $stokguncelle->execute(array(
    'stok_kalan' => $kalan
    ));
    
    
    } else {
    
    $kalanArttirilacak = $arttirilacakUrun - $fark;
    
    $stokguncelle2=$db->prepare("UPDATE stok SET
    stok_kalan=:stok_kalan
    WHERE stok_id={$stok_id}");
    $stokguncelle2->execute(array(
    'stok_kalan' => $stok_adet
    ));
    
    stokArttir($urun_id , $kalanArttirilacak);
    }
    
    }