1. Home
  2. Netherland
  3. Bot Django
  4. বট ম্যানেজমেন্ট সিস্টেম – সম্পূর্ণ টিউটোরিয়াল

বট ম্যানেজমেন্ট সিস্টেম – সম্পূর্ণ টিউটোরিয়াল

সিস্টেম ওভারভিউ

এই বট ম্যানেজমেন্ট সিস্টেম বিভিন্ন সোশ্যাল মিডিয়া প্ল্যাটফর্মে (F2F, OnlyFans, FanCentro ইত্যাদি) অটোমেটেড বট পরিচালনার জন্য ডিজাইন করা হয়েছে। সিস্টেমটি সাবস্ক্রিপশন-ভিত্তিক এবং স্বয়ংক্রিয়ভাবে পেমেন্ট এক্সপায়ার হলে অ্যাক্সেস বন্ধ করে দেয়।


১. অ্যাডমিন কাজের ধাপসমূহ

১.১ অ্যাডমিন লগইন

. Django Admin Panel  যান: /admin/
. সুপারইউজার রেডেনশিযাল দিয লগইন করুন
. যাশবোরডে রবেশ করুন

১.২ বট কনফিগারেশন তৈরি (GlobalConfig)

ধাপ ১: নতুন কনফিগারেশন যোগ করা

. Admin PanelBot Global ConfigAdd New
. নিমনলিখিত তথ পূরণ করুন:
   - Name: "F2F Mass DM Bot" (উদাহরণ)
   - Owner: Admin User সিলেক করুন
   - Platform: "f2f" সিলেক করুন
   - Base URL: "https://f2f.com/"
   - Bot Type: "mass_dm" সিলেক করুন
   - Executable Path: "/usr/bin/chromedriver"
   - Headless: True (চেক করুন)
   - Status: "active" সিলেক করুন
. Save বাটনে লিক করুন

রেকর্ড সেভ হওয়ার প্রক্রিয়া:

  • সিস্টেম স্বয়ংক্রিয়ভাবে created_at এবং updated_at ফিল্ড আপডেট করে
  • unique_together কনস্ট্রেইন্ট চেক করে ডুপ্লিকেট প্রতিরোধ করে
  • ডাটাবেস ইনডেক্স অপটিমাইজেশনের জন্য তৈরি হয়

১.৩ সাবস্ক্রিপশন প্ল্যান তৈরি (SubscriptionPlan)

ধাপ ১: বেসিক প্ল্যান তৈরি

১. Admin Panel → Subscription Plan → Add New
২. তথ্য পূরণ করুন:
   - Name: "বেসিক প্ল্যান"
   - Plan Type: "basic"
   - Description: "মাসিক ১০টি মডেল ব্যবহারের সুবিধা"
   - Price: 1000.00 (টাকা)
   - Duration Days: 30
   - Model Limit: 10
   - Features: ["Mass DM", "Photo Upload"] (JSON ফরম্যাটে)
   - Is Active: True (চেক করুন)
৩. Save করুন

ধাপ ২: প্রিমিয়াম প্ল্যান তৈরি

১. আরেকটি প্ল্যান তৈরি করুন:
   - Name: "প্রিমিয়াম প্ল্যান"
   - Plan Type: "premium"
   - Price: 2500.00
   - Duration Days: 30
   - Model Limit: 50
   - Features: ["Mass DM", "Photo Upload", "Video Upload", "Auto Reply"]

২. ক্লায়েন্ট কাজের ধাপসমূহ

২.১ ইউজার রেজিস্ট্রেশন এবং ক্লায়েন্ট তৈরি

রেজিস্ট্রেশন প্রক্রিয়া:

# views.py তে রেজিস্ট্রেশন ভিউ
from django.contrib.auth.models import User, Group
from .models import Client

def register_user(request):
    if request.method == 'POST':
        # ১. User তৈরি করা
        user = User.objects.create_user(
            username=request.POST['username'],
            email=request.POST['email'],
            password=request.POST['password']
        )

        # ২. স্বয়ংক্রিয়ভাবে Client তৈরি
        client = Client.objects.create(
            user=user,
            email=request.POST['email'],
            company_name=request.POST.get('company_name', ''),
            phone_number=request.POST.get('phone_number', ''),
            timezone='Asia/Dhaka'
        )

        # ৩. ডিফল্ট গ্রুপে যোগ করা
        basic_group, created = Group.objects.get_or_create(name='Basic Users')
        user.groups.add(basic_group)

        return redirect('login')

রেজিস্ট্রেশনের সময় যা ঘটে:

  • User মডেলে নতুন ইউজার তৈরি হয়
  • Client মডেলে স্বয়ংক্রিয়ভাবে রেকর্ড তৈরি হয়
  • created_at এবং updated_at ফিল্ড অটো-সেট হয়
  • is_active ডিফল্ট True সেট হয়
  • ইউজারকে ডিফল্ট গ্রুপে যোগ করা হয়

২.২ ক্লায়েন্ট লগইন

লগইন প্রক্রিয়া:

from django.contrib.auth import authenticate, login

def client_login(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']

        user = authenticate(username=username, password=password)
        if user:
            login(request, user)

            # লগইন অ্যাক্টিভিটি রেকর্ড করা
            ClientActivityLogs.objects.create(
                client=user.client,
                action='login',
                description=f'User {username} logged in successfully'
            )

            return redirect('dashboard')

২.৩ সাবস্ক্রিপশন কেনা

সাবস্ক্রিপশন ক্রয় প্রক্রিয়া:

from datetime import date, timedelta
from .models import Subscription, SubscriptionPlan

def buy_subscription(request, plan_id):
    plan = SubscriptionPlan.objects.get(id=plan_id)
    client = request.user.client

    # ১. পেমেন্ট প্রসেসিং (এখানে সিমুলেট করা হয়েছে)
    payment_successful = process_payment(client, plan.price)

    if payment_successful:
        # ২. সাবস্ক্রিপশন তৈরি
        end_date = date.today() + timedelta(days=plan.duration_days)

        subscription = Subscription.objects.create(
            client=client,
            plan=plan,
            end_date=end_date,
            status='active',
            amount_paid=plan.price,
            payment_method='card'
        )

        # ৩. ইউজার গ্রুপ আপডেট
        update_user_group_based_on_subscription(client.user, plan)

        # ৪. অ্যাক্টিভিটি লগ
        ClientActivityLogs.objects.create(
            client=client,
            action='subscription_purchased',
            description=f'Purchased {plan.name} subscription'
        )

        return redirect('subscription_success')

গ্রুপ আপডেট ফাংশন:

def update_user_group_based_on_subscription(user, plan):
    # পুরাতন গ্রুপ থেকে সরানো
    user.groups.clear()

    # নতুন গ্রুপে যোগ করা
    if plan.plan_type == 'basic':
        group_name = 'Basic Subscribers'
    elif plan.plan_type == 'premium':
        group_name = 'Premium Subscribers'
    else:
        group_name = 'Enterprise Subscribers'

    group, created = Group.objects.get_or_create(name=group_name)
    user.groups.add(group)

২.৪ মডেল তৈরি করা

মডেল প্রোফাইল তৈরির প্রক্রিয়া:

def create_model_profile(request):
    if request.method == 'POST':
        client = request.user.client

        # ১. সাবস্ক্রিপশন চেক করা
        if not client.can_use_models():
            return JsonResponse({
                'error': 'আপনার সাবস্ক্রিপশন মেয়াদ শেষ হয়ে গেছে'
            })

        # ২. মডেল লিমিট চেক করা
        active_subscription = client.subscriptions.filter(status='active').first()
        current_model_count = client.user.owned_models.filter(status='active').count()

        if current_model_count >= active_subscription.plan.model_limit:
            return JsonResponse({
                'error': f'আপনি সর্বোচ্চ {active_subscription.plan.model_limit}টি মডেল ব্যবহার করতে পারবেন'
            })

        # ৩. মডেল তৈরি করা
        model = ModelProfile.objects.create(
            name=request.POST['name'],
            platform=request.POST['platform'],
            username=request.POST['username'],
            profile_url=request.POST.get('profile_url', ''),
            owner=request.user,
            notes=request.POST.get('notes', '')
        )

        # ৪. অ্যাক্টিভিটি লগ
        ClientActivityLogs.objects.create(
            client=client,
            action='model_created',
            description=f'Created model profile: {model.name}'
        )

        return JsonResponse({'success': True, 'model_id': model.id})

২.৫ ফেজ তৈরি এবং কনফিগারেশন

ফেজ তৈরির প্রক্রিয়া:

def create_phase(request):
    if request.method == 'POST':
        client = request.user.client

        # ১. অ্যাক্সেস চেক
        if not client.can_use_models():
            return JsonResponse({'error': 'সাবস্ক্রিপশন মেয়াদ শেষ'})

        # ২. কনফিগ সিলেক্ট করা
        config = GlobalConfig.objects.get(
            id=request.POST['config_id'],
            owner=request.user
        )

        # ৩. ফেজ তৈরি
        phase = Phase.objects.create(
            config=config,
            client=client,
            name=request.POST['name'],
            schedule_type=request.POST['schedule_type'],
            media=request.POST['media'],
            priority=request.POST.get('priority', 'normal')
        )

        # ৪. মডেল যোগ করা
        selected_models = request.POST.getlist('models')
        for model_id in selected_models:
            model = ModelProfile.objects.get(id=model_id, owner=request.user)
            if model.can_be_used():
                phase.models_list.add(model)

        # ৫. ফাইল আপলোড হ্যান্ডলিং
        if 'message_file' in request.FILES:
            phase.message_file = request.FILES['message_file']

        if 'cookie_file' in request.FILES:
            phase.cookie_jsonfile = request.FILES['cookie_file']

        phase.save()

        return JsonResponse({'success': True, 'phase_id': phase.id})

৩. বট ওয়ার্কিং প্রসেস

৩.১ বট এক্সিকিউশন শুরু

এক্সিকিউশন শুরুর প্রক্রিয়া:

def start_bot_execution(phase_id):
    phase = Phase.objects.get(id=phase_id)

    # ১. প্রি-চেক
    if not phase.can_run():
        return {'error': 'ফেজ চালানো যাবে না - সাবস্ক্রিপশন সমস্যা'}

    # ২. এক্সিকিউশন রেকর্ড তৈরি
    execution = Execution.objects.create(
        phase=phase,
        phase_version=phase.version,
        status='pending',
        start_time=timezone.now()
    )

    # ৩. সাবস্ক্রিপশন চেক
    if not execution.can_execute():
        return {'error': 'এক্সিকিউশন বন্ধ - সাবস্ক্রিপশন মেয়াদ শেষ'}

    # ৪. স্ট্যাটাস আপডেট
    execution.status = 'running'
    execution.save()

    phase.is_running = True
    phase.last_run = timezone.now()
    phase.run_count += 1
    phase.save()

    # ৫. বট লজিক চালানো
    try:
        result = run_bot_logic(phase, execution)

        # ৬. সফল সমাপ্তি
        execution.status = 'completed'
        execution.end_time = timezone.now()
        execution.logs = result['logs']
        execution.save()

        # ৭. স্ট্যাটিস্টিক্স তৈরি
        ExecutionStats.objects.create(
            execution=execution,
            total_models=result['total_models'],
            success_count=result['success_count'],
            failed_count=result['failed_count']
        )

    except Exception as e:
        # ৮. এরর হ্যান্ডলিং
        execution.status = 'failed'
        execution.end_time = timezone.now()
        execution.error_message = str(e)
        execution.save()

        # ৯. এরর রেকর্ড
        PhaseErrorRecord.objects.create(
            phase=phase,
            execution=execution,
            error_type=type(e).__name__,
            message=str(e)
        )

    finally:
        # ১০. ক্লিনআপ
        phase.is_running = False
        phase.save()

    return {'success': True, 'execution_id': execution.id}

৩.২ এরর রেকর্ডিং সিস্টেম

এরর হ্যান্ডলিং প্রক্রিয়া:

def handle_bot_error(phase, execution, error):
    # ১. এরর টাইপ নির্ধারণ
    error_type = type(error).__name__

    # ২. এরর রেকর্ড তৈরি
    error_record = PhaseErrorRecord.objects.create(
        phase=phase,
        execution=execution,
        error_type=error_type,
        message=str(error)
    )

    # ৩. ক্রিটিক্যাল এরর চেক
    critical_errors = ['AuthenticationError', 'SubscriptionExpiredError']

    if error_type in critical_errors:
        # ৪. ফেজ ডিসেবল করা
        phase.enabled = False
        phase.save()

        # ৫. ক্লায়েন্ট নোটিফিকেশন
        ClientActivityLogs.objects.create(
            client=phase.client,
            action='phase_disabled_due_to_error',
            description=f'Phase {phase.name} disabled due to {error_type}'
        )

    return error_record

৩.৩ ফাইল চেঞ্জ ট্র্যাকিং

ফাইল পরিবর্তন ট্র্যাকিং প্রক্রিয়া:

# Phase মডেলের save() মেথডে অন্তর্ভুক্ত
def track_file_changes(self, previous_phase):
    tracked_files = {
        "message_file": self.message_file,
        "used_file": self.used_file,
        "folder_map": self.folder_map,
        "cookie_jsonfile": self.cookie_jsonfile,
    }

    for field_name, new_file in tracked_files.items():
        old_file = getattr(previous_phase, field_name)

        if old_file != new_file and new_file:
            # ফাইল চেঞ্জ লগ তৈরি
            FileChangeLog.objects.create(
                client=self.client,
                phase=self,
                file_type=field_name,
                old_version=self.version,
                new_version=self.version + 1,
                description=f"{field_name} updated in phase '{self.name}'"
            )

            # ভার্সন আপডেট
            self.version += 1

৪. সাবস্ক্রিপশন ম্যানেজমেন্ট

৪.১ স্বয়ংক্রিয় ডিসেবল সিস্টেম

সাবস্ক্রিপশন চেক প্রক্রিয়া:

# Client মডেলের can_use_models() মেথড
def can_use_models(self):
    # ১. ক্লায়েন্ট অ্যাক্টিভ কিনা চেক
    if not self.is_active:
        return False

    # ২. অ্যাক্টিভ সাবস্ক্রিপশন খোঁজা
    active_subscription = self.subscriptions.filter(
        status='active',
        end_date__gte=timezone.now().date()
    ).first()

    # ৩. সাবস্ক্রিপশন না থাকলে অটো-ডিসেবল
    if not active_subscription:
        self.auto_disable_access()
        return False

    return True

def auto_disable_access(self):
    # ১. সব ফেজ ডিসেবল করা
    disabled_phases = self.phases.filter(enabled=True).update(enabled=False)

    # ২. চলমান এক্সিকিউশন বন্ধ করা
    running_executions = Execution.objects.filter(
        phase__client=self,
        status='running'
    ).update(status='stopped')

    # ৩. মডেল স্ট্যাটাস আপডেট
    self.user.owned_models.filter(status='active').update(
        status='payment_expired'
    )

    # ৪. লগ রেকর্ড
    ClientActivityLogs.objects.create(
        client=self,
        action='auto_disabled',
        description='Client access auto-disabled due to expired subscription'
    )

৪.২ সাবস্ক্রিপশন রিনিউয়াল

রিনিউয়াল প্রক্রিয়া:

def renew_subscription(client, plan):
    # ১. পুরাতন সাবস্ক্রিপশন খোঁজা
    old_subscription = client.subscriptions.filter(status='active').first()

    if old_subscription:
        # ২. পুরাতন সাবস্ক্রিপশন বাতিল
        old_subscription.status = 'cancelled'
        old_subscription.cancelled_at = timezone.now()
        old_subscription.save()

    # ৩. নতুন সাবস্ক্রিপশন তৈরি
    new_end_date = date.today() + timedelta(days=plan.duration_days)

    new_subscription = Subscription.objects.create(
        client=client,
        plan=plan,
        end_date=new_end_date,
        status='active',
        amount_paid=plan.price
    )

    # ৪. অ্যাক্সেস পুনরায় সক্রিয় করা
    client.phases.filter(enabled=False).update(enabled=True)
    client.user.owned_models.filter(status='payment_expired').update(
        status='active'
    )

    # ৫. লগ রেকর্ড
    ClientActivityLogs.objects.create(
        client=client,
        action='subscription_renewed',
        description=f'Subscription renewed with {plan.name}'
    )

    return new_subscription

৫. রিফান্ড সিস্টেম

৫.১ রিফান্ড রিকোয়েস্ট

রিফান্ড আবেদন প্রক্রিয়া:

def request_refund(request, subscription_id):
    subscription = Subscription.objects.get(
        id=subscription_id,
        client=request.user.client
    )

    # ১. রিফান্ড যোগ্যতা চেক
    days_used = (date.today() - subscription.start_date).days
    if days_used > 7:  # ৭ দিনের মধ্যে রিফান্ড
        return JsonResponse({'error': 'রিফান্ডের সময় শেষ'})

    # ২. রিফান্ড রেকর্ড তৈরি
    refund = Refund.objects.create(
        subscription=subscription,
        amount=subscription.amount_paid,
        reason=request.POST['reason'],
        status='pending'
    )

    # ৩. সাবস্ক্রিপশন সাসপেন্ড
    subscription.status = 'suspended'
    subscription.save()

    # ৪. অ্যাক্সেস ডিসেবল
    subscription.client.auto_disable_access()

    # ৫. লগ রেকর্ড
    ClientActivityLogs.objects.create(
        client=subscription.client,
        action='refund_requested',
        description=f'Refund requested for subscription {subscription.id}'
    )

    return JsonResponse({'success': True, 'refund_id': refund.id})

৫.২ রিফান্ড প্রসেসিং (অ্যাডমিন)

অ্যাডমিন রিফান্ড অনুমোদন:

def process_refund(request, refund_id):
    refund = Refund.objects.get(id=refund_id)
    action = request.POST['action']  # 'approve' or 'reject'

    if action == 'approve':
        # ১. রিফান্ড অনুমোদন
        refund.status = 'approved'
        refund.processed_by = request.user
        refund.processed_at = timezone.now()
        refund.admin_notes = request.POST.get('admin_notes', '')
        refund.save()

        # ২. পেমেন্ট রিফান্ড (এখানে সিমুলেট)
        process_payment_refund(refund.amount)

        # ৩. সাবস্ক্রিপশন বাতিল
        refund.subscription.status = 'cancelled'
        refund.subscription.save()

    else:
        # ৪. রিফান্ড প্রত্যাখ্যান
        refund.status = 'rejected'
        refund.processed_by = request.user
        refund.processed_at = timezone.now()
        refund.admin_notes = request.POST.get('admin_notes', '')
        refund.save()

        # ৫. সাবস্ক্রিপশন পুনরায় সক্রিয়
        refund.subscription.status = 'active'
        refund.subscription.save()

    return JsonResponse({'success': True})

৬. মনিটরিং এবং রিপোর্টিং

৬.১ ড্যাশবোর্ড ডেটা

ক্লায়েন্ট ড্যাশবোর্ড ডেটা:

def get_dashboard_data(client):
    # ১. সাবস্ক্রিপশন তথ্য
    active_subscription = client.subscriptions.filter(status='active').first()

    # ২. মডেল স্ট্যাটিস্টিক্স
    total_models = client.user.owned_models.count()
    active_models = client.user.owned_models.filter(status='active').count()

    # ৩. ফেজ স্ট্যাটিস্টিক্স
    total_phases = client.phases.count()
    active_phases = client.phases.filter(enabled=True).count()

    # ৪. এক্সিকিউশন স্ট্যাটিস্টিক্স
    total_executions = Execution.objects.filter(phase__client=client).count()
    successful_executions = Execution.objects.filter(
        phase__client=client,
        status='completed'
    ).count()

    # ৫. সাম্প্রতিক অ্যাক্টিভিটি
    recent_activities = client.activity_logs.order_by('-timestamp')[:10]

    return {
        'subscription': active_subscription,
        'models': {
            'total': total_models,
            'active': active_models,
            'limit': active_subscription.plan.model_limit if active_subscription else 0
        },
        'phases': {
            'total': total_phases,
            'active': active_phases
        },
        'executions': {
            'total': total_executions,
            'successful': successful_executions,
            'success_rate': (successful_executions/total_executions*100) if total_executions > 0 else 0
        },
        'recent_activities': recent_activities
    }

৬.২ অ্যাডমিন রিপোর্ট

সিস্টেম রিপোর্ট জেনারেশন:

def generate_system_report():
    # ১. সাবস্ক্রিপশন রিপোর্ট
    total_subscriptions = Subscription.objects.count()
    active_subscriptions = Subscription.objects.filter(status='active').count()
    expired_subscriptions = Subscription.objects.filter(status='expired').count()

    # ২. রেভিনিউ রিপোর্ট
    total_revenue = Subscription.objects.aggregate(
        total=models.Sum('amount_paid')
    )['total'] or 0

    # ৩. ইউজার অ্যাক্টিভিটি
    total_users = Client.objects.count()
    active_users = Client.objects.filter(is_active=True).count()

    # ৪. বট পারফরমেন্স
    total_executions = Execution.objects.count()
    successful_executions = Execution.objects.filter(status='completed').count()

    return {
        'subscriptions': {
            'total': total_subscriptions,
            'active': active_subscriptions,
            'expired': expired_subscriptions
        },
        'revenue': {
            'total': total_revenue,
            'monthly': calculate_monthly_revenue()
        },
        'users': {
            'total': total_users,
            'active': active_users
        },
        'performance': {
            'total_executions': total_executions,
            'success_rate': (successful_executions/total_executions*100) if total_executions > 0 else 0
        }
    }

৭. ট্রাবলশুটিং এবং সাধারণ সমস্যা

৭.১ সাধারণ সমস্যা এবং সমাধান

সমস্যা ১: সাবস্ক্রিপশন এক্সপায়ার হওয়ার পরও বট চলছে

সমাধান:
১. client.can_use_models() মেথড চেক করুন
২. Subscription.check_and_auto_disable() কল করুন
৩. ম্যানুয়ালি AutoDisableManager.check_all_subscriptions() রান করুন

সমস্যা ২: ফাইল আপলোডের পর ভার্সন আপডেট হচ্ছে না

সমাধান:
১. Phase.save() মেথডে file tracking লজিক চেক করুন
২. FileChangeLog রেকর্ড তৈরি হচ্ছে কিনা দেখুন
৩. version ফিল্ড ম্যানুয়ালি আপডেট করুন

সমস্যা ৩: এক্সিকিউশন স্ট্যাটাস আপডেট হচ্ছে না

সমাধান:
১. execution.save() কল করা হচ্ছে কিনা চেক করুন
২. start_time এবং end_time সেট করা হচ্ছে কিনা দেখুন
৩. duration_seconds অটো-ক্যালকুলেশন চেক করুন

৭.২ ডেটাবেস মেইনটেনেন্স

নিয়মিত মেইনটেনেন্স কাজ:

def daily_maintenance():
    # ১. এক্সপায়ার্ড সাবস্ক্রিপশন চেক
    expired_count = AutoDisableManager.check_all_subscriptions()

    # ২. পুরাতন লগ ক্লিনআপ (৩০ দিনের বেশি পুরাতন)
    old_logs = ClientActivityLogs.objects.filter(
        timestamp__lt=timezone.now() - timedelta(days=30)
    )
    old_logs.delete()

    # ৩. অসম্পূর্ণ এক্সিকিউশন ক্লিনআপ
    stuck_executions = Execution.objects.filter(
        status='running',
        start_time__lt=timezone.now() - timedelta(hours=2)
    )
    stuck_executions.update(status='failed', error_message='Execution timeout')

    return {
        'expired_subscriptions': expired_count,
        'cleaned_logs': old_logs.count(),
        'stuck_executions': stuck_executions.count()
    }

৮. সিকিউরিটি এবং বেস্ট প্র্যাকটিস

৮.১ সিকিউরিটি ব্যবস্থা

ডেটা প্রোটেকশন:

# ভিউতে পারমিশন চেক
from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied

@login_required
def phase_detail(request, phase_id):
    phase = Phase.objects.get(id=phase_id)

    # ওনারশিপ চেক
    if phase.client.user != request.user:
        raise PermissionDenied("আপনার এই ফেজে অ্যাক্সেস নেই")

    # সাবস্ক্রিপশন চেক
    if not phase.client.can_use_models():
        return redirect('subscription_expired')

    return render(request, 'phase_detail.html', {'phase': phase})

৮.২ পারফরমেন্স অপটিমাইজেশন

ডেটাবেস কোয়েরি অপটিমাইজেশন:

# Efficient queries with select_related and prefetch_related
def get_client_phases(client):
    return Phase.objects.filter(client=client)\
        .select_related('config', 'client')\
        .prefetch_related('models_list')\
        .order_by('-created_at')

# Bulk operations for better performance
def bulk_disable_expired_models():
    expired_clients = Client.objects.filter(
        subscriptions__status='expired'
    ).distinct()

    ModelProfile.objects.filter(
        owner__in=[c.user for c in expired_clients],
        status='active'
    ).update(status='payment_expired')

সারসংক্ষেপ

এই বট ম্যানেজমেন্ট সিস্টেম একটি সম্পূর্ণ সাবস্ক্রিপশন-ভিত্তিক প্ল্যাটফর্ম যা:

অ্যাডমিন ফিচার: বট কনফিগারেশন এবং সাবস্ক্রিপশন প্ল্যান ম্যানেজমেন্ট
ক্লায়েন্ট ফিচার: রেজিস্ট্রেশন, সাবস্ক্রিপশন, মডেল এবং ফেজ ম্যানেজমেন্ট
অটোমেশন: স্বয়ংক্রিয় সাবস্ক্রিপশন চেক এবং অ্যাক্সেস কন্ট্রোল
মনিটরিং: সম্পূর্ণ লগিং এবং এরর ট্র্যাকিং সিস্টেম
সিকিউরিটি: রোল-বেসড অ্যাক্সেস কন্ট্রোল এবং ডেটা প্রোটেকশন

সিস্টেমটি সম্পূর্ণভাবে স্বয়ংক্রিয় এবং কোনো ম্যানুয়াল ইন্টারভেনশন ছাড়াই সাবস্ক্রিপশন ম্যানেজমেন্ট এবং অ্যাক্সেস কন্ট্রোল পরিচালনা করে।

How can we help?