مهرداد
3 سال پیش توسط مهرداد مطرح شد
8 پاسخ

اعمال تخفیف رو یک دسته بندی

سلام دوستان من زمانی که روی یک دسته بندی تخفیف اعمال میکنم محصول تخفیف که میخوره کاربر اونو به سبد خریدش توی دیتابیس اضافه میکنه و ممکنه سبدشو تسویه نکنه و بعد از چند روز بخاد این کارو عملی کنه و تو این مدت ممکنه تخفیف منقضی بشه انتظار میره زمانی که تخفیف منقضی شد قیمت محصول به قیمت قبلی خودش برگرده هم توی سایت هم توی سبد خرید توی سایت این اتفاق میفته و قیمت به حالت قبل برمیگرده اما توی سبد خرید خیر همچنان قیمت تخفیف خورده باقی مونده و این یه باگ محسوب میشه از اساتید میخام بپرسم چجوری میتونم این موضوع رو حل کنم من تمام جداول و روابط رو کدهاشو میذارم که دقیق تر متوجه کدهام و روند ساخت جداول و روابط قرار بگیرید
@ali.bayat
@mhyeganeh
@Rp76
@hesammousavi

class Coupon extends Model
{

    public function users()
    {
        return $this->morphedByMany(User::class , 'couponable');
    }

    public function categories()
    {
        return $this->morphedByMany(Category::class , 'couponable');
    }

    public function courses()
    {
        return $this->morphedByMany(Course::class , 'couponable');
    }

    public function userUsedCoupons()
    {
        return $this->belongsToMany(User::class , 'coupon_used');
    }

    public function carts()
    {
        return $this->hasMany(Cart::class);
    }
}
class Course extends Model
{

    public function categories()
    {
        return $this->belongsToMany(Category::class);
    }

    public function coupons()
    {
        return $this->morphToMany(Coupon::class, 'couponable');
    }

    public function carts()
    {
        return $this->belongsToMany(Cart::class, 'cart_course', 'course_id', 'cart_id');
    }

// اینجا عملیات مربوط به تخفیف روی دسته بندی انجام میشه توی مدل کورس
    public function getPriceAfterApplyCoupon()
    {
        foreach ($this->categories as $category) {
            $coupons = $category->validCoupons();
            if ($coupons->isNotEmpty()) {
                $amount = $this->price;
                $discount = ($amount * $coupons[0]->percent) / 100;
                $total = $amount - $discount;
                foreach ($this->carts as  $cart) {
                    $cart->coupon_id = $coupons[0]->id;
                    $cart->final_price  = $total;
                    $cart->save();

                    if ($cart->coupon->expired_at < now()) {
                        $cart->coupon_id  = null;
//اینجا total_price قیمت مجموع سبد خرید  هست و final_price  قیمت مجموع  منهای مقدار تخفیفی که رو  سبد اعمال شده 
                        $cart->final_price  = $cart->total_price;
                        $cart->save();

                    }
                }

                return number_format($total);
            }
        }

        return $this->price;
    }
}
class Category extends Model
{

    public function courses()
    {
        return $this->belongsToMany(Course::class);
    }

    public function coupons()
    {
        return $this->morphToMany(Coupon::class , 'couponable');
    }

    public function validCoupons()
    {
        return $this->coupons->where('expired_at' , '>' , Carbon::now());
    }

}
class Cart extends Model
{
    protected $guarded = [];

    const Active = 'Active';

    public function courses()
    {
        return $this->belongsToMany(Course::class);
    }

    public function user()
    {
        return $this->belongsToMany(User::class);
    }

    public function getPrice()
    {
        return number_format($this->total_price);
    }

    public function coupon()
    {
        return $this->belongsTo(Coupon::class, 'coupon_id');
    }

    public function getDiscountPercent()
    {
        return optional($this->coupon)->percent;
    }

    public function getDiscountAmount()
    {
        return ($this->coupon) ? ($this->total_price * $this->coupon->percent) / 100 : 0;

    }
    public function getFinalPrice()
    {
        return number_format($this->total_price - $this->getDiscountAmount());    
    }

}
        Schema::create('carts', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
            $table->foreignId('coupon_id')->nullable()->constrained('coupons')->cascadeOnDelete();
            $table->string('status');
            $table->integer('total_price')->default(0);
            $table->integer('final_price')->default(0);
            $table->dateTime('expired_at');
            $table->timestamps();
        });

        Schema::create('cart_course', function (Blueprint $table) {

            $table->foreignId('cart_id')->constrained('carts')->cascadeOnDelete();
            $table->foreignId('course_id')->constrained('courses')->cascadeOnDelete();
        });
    public function up()
    {
        Schema::create('coupons', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->string('code')->unique();
            $table->integer('percent');
            $table->bigInteger('limit')->nullable();
            $table->boolean('is_general')->default(0)->nullable();
            $table->unsignedInteger('quantity')->nullable();
            $table->enum('type'  , ['fixed' , 'percent'])->nullable();
            $table->enum('status'  , ['enable' , 'disable'])->default('disable');
            $table->text('description')->nullable();
            $table->dateTime('start_at');
            $table->dateTime('expired_at');
            $table->timestamps();
        });

        Schema::create('couponables', function (Blueprint $table) {
            $table->foreignId('coupon_id')->constrained('coupons')->cascadeOnDelete();
            $table->integer('couponable_id');
            $table->string('couponable_type');
        });

        Schema::create('coupon_used', function (Blueprint $table) {
            $table->foreignId('coupon_id')->constrained('coupons')->cascadeOnDelete();
            $table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
        });
    }
      Schema::create('categories', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('parent_id')->nullable();
            $table->string('name');
            $table->string('slug');
            $table->longText('body')->nullable();
            $table->enum('status' , ['accept' , 'reject' , 'pending'])->default('pending');
            $table->foreign('parent_id')->references('id')->on('categories')->onDelete('SET NULL');
            $table->timestamps();
        });

ثبت پرسش جدید
علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
0

درود
باید هنگام پرداخت (checkout) دوباره قیمت ها رو محاسبه کنی
یا حتی بهتر از اون میتونی وقتی کاربر میره داخل سبد خرید دوباره قیمت ها رو محاسبه کنی


مهرداد
@mehrdadroshanraee69 3 سال پیش مطرح شد
0

@ali.bayat
الان زمانی که یک محصول توی یک دسته بندی تخفیف خورده و من به سبد خریدم اضافش میکنم محاسبات قیمت انجام میشه مشکل من اینه زمانی که انقضای کد تخفیف رسید سبد خرید کاربر که محصول تخفیف خورده بهش اضافه شده تخفیف ازش ورداشته بشه توی دیتابیس اپدیت بشه و برگرده به قیمت قبلی خودش
توضیح تصویر رو وارد کنید


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
0

هر بار که کاربر میخواهد صفحه خرید رو باز کنه
و یا اگر توی Home نشون میدی
باید valid بودن تخفیف رو بررسی کنی و قیمت هارو دوباره حساب کنی و مقدار دهی کنی


مهرداد
@mehrdadroshanraee69 3 سال پیش مطرح شد
0

@ali.bayat
اتفاقا ولید بودن تخفیف رو توی مدل کتگوری نوشتم چون تخفیف مربوط به دسته بندی هست ش

    public function validCoupons()
    {
        return $this->coupons->where('expired_at' , '>' , Carbon::now());
    }

وقتی هم قیمت رو مجدد میخام محاسبه کنم این باگ حل میشه ولی تخفیف اختصاصی به یوزر اونموقع میخام وارد کنم از کار میفته نمیدونم راه حل قطعی این مشکل چیه واقعا


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
0

شما یه سری محصول داری ..
که توی دسته بندی های مختلف هستند
و دسته بندی ها هم تخفیف دارند

با رابطه ها میتونی چکشون کنی دیگه

یعنی از به ازای هر محصول اضافه شده به سبد
از اون محصول برس به دسته بندی
و چک کن آیا تخفیف دسته بندی هنوز معتبره یا نه؟
اگر معتبر بود که هیچ
اگر نه باید اون قیمت تخفیف خورده رو حذف ... و قیمت اصلی کالا رو جایگزین کنی


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش مطرح شد
2

کلا شما این نکته رو مدنظر داشته باشید که در سبد خرید فقط آیدی محصول و احیانا تعداد درخواستی و ... قرار می‌گیره و به هیچ وجه نباید قیمت و وضعیت تخفیف و بقیه مواردی که ممکن است تغییر کنند ثبت شود.

هر بار که قصد نمایش سبد خرید و یا ثبت نهایی سفارش رو داشته باشیم باید اطلاعات سبد خرید به یک function ارسال شود که وظیفه استعلام گرفتن جدیدترین شرایط هر محصول رو داره. مثلا ممکنه قیمتش آپدیت شده باشه در این مدت. تخفیف جدید خورده باشه یا تخفیفش حذف شده باشه. موجودیش تمام شده، غیر فعال شده و ...

اینجوری خاطرتون جمع هست که هر سفارش زمان ثبت نهایی با جدیدترین شرایط هر محصول ثبت شده است و تناقضی وجود ندارد.


مهرداد
@mehrdadroshanraee69 3 سال پیش مطرح شد
0

@ali.bayat
همینکارو توی مدل محصئلاتم انجام دادم که با کتگوری رابطه داره ولی اختلال ایجاد میکنه اون بخش دی که کامنت کردم نمیدونم چجوری اون بخش else رو ریفکتور کنم نتیجه مورد نظر بدست بیاد

   public function getPriceAfterApplyCoupon()
    {
        foreach ($this->categories as $category) {
            $coupons = $category->validCoupons();
            if ($coupons->isNotEmpty()) {
                $amount = $this->price;
                $discount = ($amount * $coupons[0]->percent) / 100;
                $total = $amount - $discount;
                foreach ($this->carts as  $cart) {
                    $cart->coupon_id = $coupons[0]->id;
                    $cart->final_price  = $total;
                    $cart->save();
                }

                return number_format($total);
            }else{
                foreach ($this->carts as  $cart) {
                    // $cart->coupon_id  = null;
                    // $cart->final_price  = $cart->total_price;
                    // $cart->save();
                }
                return number_format($this->price);
            }

        }

        return $this->price;

    }

مهرداد
@mehrdadroshanraee69 3 سال پیش مطرح شد
0

@mhyeganeh
منم توی سبد خرید ایدی محصول رو میگیرم مبلغ کل محصولات تو کارت هم میگیرم همین و یک یوزرایدی


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام