اذهب إلى المحتوى

السؤال

نشر

كيف يمكنني انشاء نظام الوافقه على الطلبات حيث عندما يريد المستخدم اضافة المنتج الى العربه لا يتم طلب الطلب مباشره بل سياتي اشعار في لوحة admin  وهناك نوعان من الadmin في الموقع وهم small admin and big admin فيجب اولا ان يوافق الsmall admin  على الطلب اذا وافق يتم تمرير الطلب الى big admin اذا وافق يتم استكمال طلب المستخدم ولاكن اذا رفض الsmall admin لا ياتي الطلب الى big admin  ويتم ارسال ان المستخدم غير قادر على طلب المنتج

Recommended Posts

  • 0
نشر

السلام عليكم ورحمة الله، 
في حال كان سؤالك متعلقا بأحد الدروس في إحدى الدورات من فضلك قم بنقل سؤالك هناك أسفل الدرس أين ستجد صندوقا للتعليقات مثل الذي تراه هنا، يمكنك إضافته هناك لمساعدتك بشكل أفضل.
يمكنك محاولة إنشاء نظام الموافقة على الطلبات في Laravel عبر تنفيذ الخطوات التالية بداية بتحديد الأدوار التي لديك باستخدام حزمة مثل spatie/laravel-permission لتعيين الأدوار ولتكن: user، small admin و big admin وعلى حسب قاعدة البيانات لديك يمكنك إنشاء جدول للطلبات (orders) يحتوي على حقول كهاته:

  • معرف المستخدم (user_id) ومعرف المنتج (product_id).
  • حالة الطلب (status) بقيم مثل:
  1. pending: عند تقديم الطلب من المستخدم.
  2. pending_big_admin: بعد موافقة المسؤول الصغير.
  3. approved: بعد موافقة المسؤول الكبير.
  4. declined: في حال رفض الطلب.
  • حقول لتخزين معرف المسؤول الذي قام بالموافقة (small_admin_id وbig_admin_id).

في هذه الحالة عند ضغط المستخدم على "إضافة إلى العربة"، سينشئ سجل طلب جديد بحالة pending، وترسل إشعارا للمسؤول الصغير، 

فإذا وافق، نغير حالة الطلب إلى pending_big_admin وسجل معرف المسؤول الصغير، ثم أرسل إشعارا للمسؤول الكبير فإذا رفض تغيّر الحالة إلى declined وتبلغ المستخدم برفض الطلب.

وعند استلام الطلب بحالة pending_big_admin إذا وافق تغيّر الحالة إلى approved وتنفذ الطلب مثلا إضافة المنتج إلى العربة أو متابعة عملية الشراء وإبلاغ المستخدم بالموافقة لكن إذا رفض تغيّر الحالة إلى declined وتبلغ المستخدم برفض الطلب أيضا.

وبالطبع يمكن استخدام Laravel Notifications لإرسال الإشعارات سواء عبر البريد الإلكتروني أو الإشعارات داخل التطبيق لكل من المسؤولين والمستخدم ويمكن تنظيم المسارات (Routes) والتحكم في الوصول من خلال إنشاء مسارات منفصلة لكل مستخدم لديك واستخدام middleware للتحقق من صلاحيات كل دور قبل إرسال الطلبات.

  • 0
نشر

ستحتاج أولاً إلى إنشاء جدول الطلبات Orders من خلال الأمر:

php artisan make:migration create_orders_table

وكتابة الأعمدة التالية:

Schema::create('orders', function (Blueprint $table) {
    $table->id();
    $table->foreignId('user_id')->constrained();
    $table->enum('status', ['pending', 'approved', 'rejected'])->default('pending');
    $table->boolean('small_admin_approved')->nullable();
    $table->boolean('big_admin_approved')->nullable();
    $table->timestamps();
});

ثم إنشاء نموذج Order:

php artisan make:model Order

وكتابة النموذج كالتالي:

protected $fillable = [
    'user_id', 'status', 'small_admin_approved', 'big_admin_approved'
];

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

لإدارة الصلاحيات والأدوار، سنستخدم حزمة Spatie كالتالي:

composer require spatie/laravel-permission
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"

ثم إضافة أدوار المستخدمين في Seeder أو أي مكان مناسب:

use Spatie\Permission\Models\Role;

Role::create(['name' => 'small_admin']);
Role::create(['name' => 'big_admin']);

 

ثم معالجة الطلب من خلال متحكم  OrderController:

use App\Models\Order;
use App\Notifications\NewOrderNotification;

class OrderController extends Controller {
    public function store(Request $request) {
        $order = Order::create([
            'user_id' => auth()->id(),
            'status' => 'pending'
        ]);

        $smallAdmins = User::role('small_admin')->get();
        foreach ($smallAdmins as $admin) {
            $admin->notify(new NewOrderNotification($order));
        }

        return to_route('orders.index')->with('success', 'تم إرسال الطلب للمراجعة');
    }
}

ثم إنشاء إشعار NewOrderNotification:

php artisan make:notification NewOrderNotification

وضع التالي به:

public function via($notifiable)
{
    return ['database'];
}

public function toArray($notifiable)
{
    return [
        'order_id' => $this->order->id,
        'message' => 'طلب جديد يحتاج إلى موافقتك'
    ];
}

وعليك استخدام السمة HasDatabaseNotifications في نموذج الـ User:

use Illuminate\Notifications\HasDatabaseNotifications;

class User extends Authenticatable {
    use HasDatabaseNotifications;
}

وبعد ذلك عليك  إنشاء واجهة الموافقة ومعالجتها من خلال إنشاء ApprovalController:

php artisan make:controller ApprovalController

ثم كتابة الدوال المسؤولة عن المعالجة، أولاً نُرسل إشعار إلى Big Admin بكتابة التالي:

public function approveBySmallAdmin(Order $order)
{
    if (!auth()->user()->hasRole('small_admin')) {
        abort(403);
    }

    $order->update([
        'small_admin_approved' => true
    ]);

    $bigAdmins = User::role('big_admin')->get();
    foreach ($bigAdmins as $admin) {
        $admin->notify(new OrderApprovedNotification($order));
    }

    return redirect()->back();
}

ثم معالجة الموافقة من خلال Big Admin وإرسال إشعار إلى المستخدم:

public function approveByBigAdmin(Order $order)
{
    if (!auth()->user()->hasRole('big_admin')) {
        abort(403);
    }

    $order->update([
        'big_admin_approved' => true,
        'status' => 'approved'
    ]);

    $order->user->notify(new OrderCompletedNotification($order));

    return redirect()->back();
}

وأيضًا علينا  معالجة الرفض وإرسال إشعار الرفض:

public function rejectOrder(Order $order)
{
    $user = auth()->user();

    if ($user->hasRole('small_admin')) {
        $order->update([
            'small_admin_approved' => false,
            'status' => 'rejected'
        ]);
    } elseif ($user->hasRole('big_admin')) {
        $order->update([
            'big_admin_approved' => false,
            'status' => 'rejected'
        ]);
    }

    $order->user->notify(new OrderRejectedNotification($order));

    return redirect()->back();
}

وبالطبع عليك  حماية المسارات routes بإنشاء Middleware للصلاحيات:

php artisan make:middleware CheckSmallAdmin

وكتابة التالي به:

public function handle($request, Closure $next)
{
    if (!auth()->user()->hasRole('small_admin')) {
        abort(403);
    }
    return $next($request);
}

ثم  تسجيل الـ Middleware في bootstrap/app.php 

->withMiddleware(function (Middleware $middleware) {
    $middleware->alias([
        'check.small_admin' => \App\Http\Middleware\CheckSmallAdmin::class,
        'check.big_admin' => \App\Http\Middleware\CheckBigAdmin::class,
    ]);
})

بالنسبة لواجهة المستخدم فأنشيء القالب resources/views/admin/orders/index.blade.php

@foreach ($orders as $order)
    <div>
        Order #{{ $order->id }}
        @if($order->status === 'pending')
            <a href="{{ route('approve.small', $order) }}">موافقة</a>
            <a href="{{ route('reject.order', $order) }}">رفض</a>
        @endif
    </div>
@endforeach

 

  • 0
نشر (معدل)
بتاريخ 2 ساعة قال Mustafa Suleiman:

أرجو توضيح ما المشكلة وما قمت بتطبيقه؟

قمت بعمل ما طلبته مني لاكنني لا اجد اي نتيجه ملموسه
هل يمكنك ان تساعدنني قليلا وهنا مرفق العمل
وشكرا

وهناك خطا في الاسامي 

small admin —-> admin

big admin —> super admin

 

project-copy.zip

تم التعديل في بواسطة Mohammed Sultan2

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...