1. Home
  2. গার্মেন্টস ইন্ডাস্ট্রির জ...
  3. ০ ৩ Production Planning ...
  4. ডাটাবেজ ডিজাইন

ডাটাবেজ ডিজাইন

ঠিক আছে! আপনি Production Planning and Inventory Control (PPIC) মডিউলের জন্য production_planning Django অ্যাপ চেয়েছেন, এবং এবার মডেল, অ্যাডমিন ফাইল, এবং Unfold সাইডবারে লেবেল এবং verbose_name ইংরেজিতে হবে। আমি আপনার দেওয়া টেবিল (Line Planning, Machine Allocation, Operator Assignment, Target vs Achievement) এবং গল্পের উপর ভিত্তি করে মডেল তৈরি করব। এছাড়া, settings.py আপডেট করব এবং স্যাম্পল ডেটা পপুলেট করার জন্য ম্যানেজমেন্ট কমান্ড দেব। বাংলায় ব্যাখ্যা এবং কমেন্ট দেব যেন বোঝা সহজ হয়। যেহেতু এটি আগের production_planning মডিউলের আপডেট, আমি পূর্বের artifact_id ব্যবহার করব।


ধাপে ধাপে বাস্তবায়ন

১. নতুন Django অ্যাপ তৈরি (যদি ইতিমধ্যে না থাকে)

প্রোজেক্ট ডিরেক্টরিতে নিচের কমান্ড রান করে production_planning অ্যাপ তৈরি করুন:

python manage.py startapp production_planning

২. Django মডেল তৈরি (ইংরেজিতে)

production_planning/models.py ফাইলে আপনার দেওয়া টেবিলগুলোর উপর ভিত্তি করে মডেল তৈরি করব। সব লেবেল এবং verbose_name ইংরেজিতে হবে। মডেলগুলো order_management.Order এর সাথে সম্পর্কযুক্ত হবে।

from django.db import models
from order_management.models import Order  # Order মডেল ইম্পোর্ট

# লাইন প্ল্যানিং মডেল
class LinePlanning(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE, verbose_name="Order")
    line_no = models.CharField(max_length=50, verbose_name="Line Number")
    start_date = models.DateField(verbose_name="Start Date")
    end_date = models.DateField(verbose_name="End Date")
    planned_quantity = models.PositiveIntegerField(verbose_name="Planned Quantity")

    class Meta:
        verbose_name = "Line Planning"
        verbose_name_plural = "Line Plannings"

    def __str__(self):
        return f"{self.line_no} ({self.order.style_name})"

# মেশিন বরাদ্দ মডেল
class MachineAllocation(models.Model):
    line_no = models.CharField(max_length=50, verbose_name="Line Number")
    machine_type = models.CharField(max_length=100, verbose_name="Machine Type")
    quantity = models.PositiveIntegerField(verbose_name="Quantity")

    class Meta:
        verbose_name = "Machine Allocation"
        verbose_name_plural = "Machine Allocations"

    def __str__(self):
        return f"{self.machine_type} ({self.line_no})"

# অপারেটর নিয়োগ মডেল
class OperatorAssignment(models.Model):
    SHIFT_CHOICES = (
        ('A', 'Shift A'),
        ('B', 'Shift B'),
        ('C', 'Shift C'),
    )

    name = models.CharField(max_length=100, verbose_name="Name")
    skill = models.CharField(max_length=100, verbose_name="Skill")
    assigned_line = models.CharField(max_length=50, verbose_name="Assigned Line")
    shift = models.CharField(max_length=10, choices=SHIFT_CHOICES, verbose_name="Shift")

    class Meta:
        verbose_name = "Operator Assignment"
        verbose_name_plural = "Operator Assignments"

    def __str__(self):
        return f"{self.name} ({self.assigned_line})"

# টার্গেট বনাম অর্জন মডেল
class TargetVsAchievement(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE, verbose_name="Order")
    date = models.DateField(verbose_name="Date")
    target_qty = models.PositiveIntegerField(verbose_name="Target Quantity")
    actual_qty = models.PositiveIntegerField(verbose_name="Actual Quantity")
    remarks = models.TextField(blank=True, verbose_name="Remarks")

    class Meta:
        verbose_name = "Target vs Achievement"
        verbose_name_plural = "Target vs Achievements"

    def __str__(self):
        return f"{self.order.style_name} - {self.date}"

ব্যাখ্যা:

  • LinePlanning মডেলে order, line_no, start_date, end_date, এবং planned_quantity ফিল্ড যুক্ত।
  • MachineAllocation মডেলে line_no একটি CharField, কারণ এটি সরাসরি Order এর সাথে সম্পর্কিত নয়।
  • OperatorAssignment মডেলে shift ফিল্ডের জন্য ইংরেজি চয়েস যুক্ত।
  • TargetVsAchievement মডেলে দৈনিক টার্গেট এবং বাস্তব উৎপাদন ট্র্যাক করা হয়।
  • সব verbose_name এবং verbose_name_plural ইংরেজিতে।

৩. অ্যাডমিনে মডেল রেজিস্টার (ইংরেজিতে)

production_planning/admin.py ফাইলে মডেলগুলো Unfold অ্যাডমিনে রেজিস্টার করব। লেবেল এবং ডিসপ্লে ইংরেজিতে হবে।

from django.contrib import admin
from unfold.admin import ModelAdmin
from .models import LinePlanning, MachineAllocation, OperatorAssignment, TargetVsAchievement

# লাইন প্ল্যানিং মডেল রেজিস্টার
@admin.register(LinePlanning)
class LinePlanningAdmin(ModelAdmin):
    list_display = ('line_no', 'order', 'start_date', 'end_date', 'planned_quantity')
    search_fields = ('line_no', 'order__style_name')
    list_filter = ('start_date', 'end_date')
    ordering = ('-start_date',)

# মেশিন বরাদ্দ মডেল রেজিস্টার
@admin.register(MachineAllocation)
class MachineAllocationAdmin(ModelAdmin):
    list_display = ('line_no', 'machine_type', 'quantity')
    search_fields = ('line_no', 'machine_type')
    list_filter = ('machine_type',)
    ordering = ('line_no',)

# অপারেটর নিয়োগ মডেল রেজিস্টার
@admin.register(OperatorAssignment)
class OperatorAssignmentAdmin(ModelAdmin):
    list_display = ('name', 'skill', 'assigned_line', 'shift')
    search_fields = ('name', 'skill', 'assigned_line')
    list_filter = ('shift', 'skill')
    ordering = ('name',)

# টার্গেট বনাম অর্জন মডেল রেজিস্টার
@admin.register(TargetVsAchievement)
class TargetVsAchievementAdmin(ModelAdmin):
    list_display = ('order', 'date', 'target_qty', 'actual_qty', 'remarks')
    search_fields = ('order__style_name', 'remarks')
    list_filter = ('date',)
    ordering = ('-date',)

ব্যাখ্যা:

  • প্রতিটি মডেলের জন্য list_display, search_fields, এবং list_filter সেট করা হয়েছে।
  • ইংরেজি লেবেল ব্যবহার করা হয়েছে অ্যাডমিন ইন্টারফেসে।

৪. settings.py আপডেট (ইংরেজি সাইডবার)

settings.py ফাইলে production_planning অ্যাপ যুক্ত করব এবং Unfold সাইডবারে নতুন মডেলগুলোর লিঙ্ক ইংরেজিতে যোগ করব।

from django.templatetags.static import static
from django.urls import reverse_lazy

INSTALLED_APPS = [
    'unfold',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'order_management',
    'sampling_merchandising',
    'production_planning',  # নতুন অ্যাপ যুক্ত
]

MEDIA_URL = '/media/'
MEDIA_ROOT = 'media'

STATIC_URL = '/static/'
STATICFILES_DIRS = ['static']

UNFOLD = {
    "SITE_TITLE": "Kreatech ERP",
    "SITE_HEADER": "Kreatech ERP",
    "SITE_LOGO": static("path/to/your/custom-logo.svg"),
    "SITE_URL": "/",
    "SHOW_HISTORY": False,
    "SIDEBAR": {
        "show_search": True,
        "show_all_applications": False,
        "navigation": [
            {
                "title": "Data and Analytics",
                "separator": True,
                "collapsible": True,
                "items": [
                    {
                        "title": "Dashboard",
                        "icon": "dashboard",
                        "link": reverse_lazy("admin:index"),
                        "permission": lambda request: request.user.is_superuser,
                    },
                ],
            },
            {
                "title": "Authentication",
                "separator": True,
                "collapsible": True,
                "items": [
                    {
                        "title": "Users",
                        "icon": "people",
                        "link": reverse_lazy("admin:auth_user_changelist"),
                        "permission": lambda request: request.user.is_superuser,
                    },
                    {
                        "title": "Groups",
                        "icon": "group",
                        "link": reverse_lazy("admin:auth_group_changelist"),
                        "permission": lambda request: request.user.is_superuser,
                    },
                    {
                        "title": "Permissions",
                        "icon": "lock",
                        "link": reverse_lazy("admin:auth_permission_changelist"),
                        "permission": lambda request: request.user.is_superuser,
                    },
                ],
            },
            {
                "title": "Order Management",
                "separator": True,
                "collapsible": True,
                "items": [
                    {
                        "title": "Buyers",
                        "icon": "business",
                        "link": reverse_lazy("admin:order_management_buyer_changelist"),
                        "permission": lambda request: request.user.is_superuser,
                    },
                    {
                        "title": "Orders",
                        "icon": "shopping_cart",
                        "link": reverse_lazy("admin:order_management_order_changelist"),
                        "permission": lambda request: request.user.is_superuser,
                    },
                    {
                        "title": "Order Breakdowns",
                        "icon": "list_alt",
                        "link": reverse_lazy("admin:order_management_orderbreakdown_changelist"),
                        "permission": lambda request: request.user.is_superuser,
                    },
                    {
                        "title": "Tech Packs",
                        "icon": "description",
                        "link": reverse_lazy("admin:order_management_techpack_changelist"),
                        "permission": lambda request: request.user.is_superuser,
                    },
                    {
                        "title": "Delivery Schedules",
                        "icon": "local_shipping",
                        "link": reverse_lazy("admin:order_management_deliveryschedule_changelist"),
                        "permission": lambda request: request.user.is_superuser,
                    },
                ],
            },
            {
                "title": "Sampling and Merchandising",
                "separator": True,
                "collapsible": True,
                "items": [
                    {
                        "title": "Samples",
                        "icon": "request_quote",
                        "link": reverse_lazy("admin:sampling_merchandising_sample_changelist"),
                        "permission": lambda request: request.user.is_superuser,
                    },
                    {
                        "title": "Fabric Developments",
                        "icon": "texture",
                        "link": reverse_lazy("admin:sampling_merchandising_fabricdevelopment_changelist"),
                        "permission": lambda request: request.user.is_superuser,
                    },
                    {
                        "title": "Trim Developments",
                        "icon": "category",
                        "link": reverse_lazy("admin:sampling_merchandising_trimdevelopment_changelist"),
                        "permission": lambda request: request.user.is_superuser,
                    },
                    {
                        "title": "Costings",
                        "icon": "calculate",
                        "link": reverse_lazy("admin:sampling_merchandising_costing_changelist"),
                        "permission": lambda request: request.user.is_superuser,
                    },
                ],
            },
            {
                "title": "Production Planning",
                "separator": True,
                "collapsible": True,
                "items": [
                    {
                        "title": "Line Planning",
                        "icon": "view_timeline",
                        "link": reverse_lazy("admin:production_planning_lineplanning_changelist"),
                        "permission": lambda request: request.user.is_superuser,
                    },
                    {
                        "title": "Machine Allocation",
                        "icon": "build",
                        "link": reverse_lazy("admin:production_planning_machineallocation_changelist"),
                        "permission": lambda request: request.user.is_superuser,
                    },
                    {
                        "title": "Operator Assignment",
                        "icon": "engineering",
                        "link": reverse_lazy("admin:production_planning_operatorassignment_changelist"),
                        "permission": lambda request: request.user.is_superuser,
                    },
                    {
                        "title": "Target vs Achievement",
                        "icon": "trending_up",
                        "link": reverse_lazy("admin:production_planning_targetvsachievement_changelist"),
                        "permission": lambda request: request.user.is_superuser,
                    },
                ],
            },
        ],
    },
}

ব্যাখ্যা:

  • INSTALLED_APPS-এ production_planning যুক্ত।
  • Unfold সাইডবারে নতুন সেকশন “Production Planning” ইংরেজিতে যুক্ত করা হয়েছে।
  • gettext_lazy ব্যবহার বাদ দেওয়া হয়েছে, কারণ ইংরেজি লেবেল চাওয়া হয়েছে।

৫. URLs কনফিগারেশন

urls.py ইতিমধ্যে সঠিকভাবে কনফিগার করা আছে:

from django.contrib import admin
from django.urls import path
from django.conf import settings
from django.conf.urls.static import static
from django.shortcuts import redirect

def redirect_to_admin(request):
    return redirect('admin:index')

urlpatterns = [
    path('', redirect_to_admin, name='home'),
    path('admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

৬. মিডিয়া ডিরেক্টরি

order_management.TechPack এর জন্য media/techpacks/ ডিরেক্টরি নিশ্চিত করুন:

mkdir -p media/techpacks

৭. মাইগ্রেশন রান করা

নতুন মডেলগুলোর জন্য ডাটাবেস টেবিল তৈরি করতে:

python manage.py makemigrations
python manage.py migrate

৮. স্যাম্পল ডেটা পপুলেট করা

আপনার গল্পের ডেটা (Zara, ORD001, ZARA-TSHIRT-RED-2025) ডাটাবেসে যুক্ত করার জন্য ম্যানেজমেন্ট কমান্ড তৈরি করছি। লেবেল এবং মেসেজ ইংরেজিতে হবে।

from django.core.management.base import BaseCommand
from order_management.models import Buyer, Order
from production_planning.models import LinePlanning, MachineAllocation, OperatorAssignment, TargetVsAchievement

class Command(BaseCommand):
    help = 'Populates sample data for Production Planning module'

    def handle(self, *args, **kwargs):
        # Create Buyer
        buyer, _ = Buyer.objects.get_or_create(
            name="Zara",
            country="Spain",
            contact_person="Maria Lopez",
            phone="+3467890",
            email="maria@zara.com"
        )

        # Create Order
        order, _ = Order.objects.get_or_create(
            buyer=buyer,
            style_name="ZARA-TSHIRT-RED-2025",
            quantity=10000,
            sizes="S,M,L,XL",
            colors="Red",
            delivery_date="2025-09-30",
            order_date="2025-08-01",
            status="received",
            remarks="Urgent order"
        )

        # Create Line Planning
        LinePlanning.objects.get_or_create(
            order=order,
            line_no="Line 3",
            start_date="2025-09-01",
            end_date="2025-09-20",
            planned_quantity=10000
        )

        # Create Machine Allocation
        MachineAllocation.objects.get_or_create(
            line_no="Line 3",
            machine_type="Single Needle",
            quantity=5
        )
        MachineAllocation.objects.get_or_create(
            line_no="Line 3",
            machine_type="Overlock",
            quantity=2
        )
        MachineAllocation.objects.get_or_create(
            line_no="Line 3",
            machine_type="Flatlock",
            quantity=1
        )

        # Create Operator Assignment
        OperatorAssignment.objects.get_or_create(
            name="Salma",
            skill="Single Needle",
            assigned_line="Line 3",
            shift="A"
        )
        OperatorAssignment.objects.get_or_create(
            name="Raju",
            skill="Overlock",
            assigned_line="Line 3",
            shift="A"
        )
        OperatorAssignment.objects.get_or_create(
            name="Mariam",
            skill="Flatlock",
            assigned_line="Line 3",
            shift="A"
        )
        OperatorAssignment.objects.get_or_create(
            name="Jabbar",
            skill="Helper",
            assigned_line="Line 3",
            shift="A"
        )

        # Create Target vs Achievement
        TargetVsAchievement.objects.get_or_create(
            order=order,
            date="2025-09-01",
            target_qty=1000,
            actual_qty=900,
            remarks="Machine issue"
        )
        TargetVsAchievement.objects.get_or_create(
            order=order,
            date="2025-09-02",
            target_qty=1000,
            actual_qty=1050,
            remarks="Good performance"
        )
        TargetVsAchievement.objects.get_or_create(
            order=order,
            date="2025-09-03",
            target_qty=1000,
            actual_qty=970,
            remarks=""
        )

        self.stdout.write(self.style.SUCCESS('Sample data populated successfully!'))

এই কমান্ড রান করতে:

python manage.py populate_sample_data

নোট: এই কমান্ড রান করার আগে নিশ্চিত করুন যে order_management এবং sampling_merchandising অ্যাপের মাইগ্রেশন সম্পন্ন হয়েছে।

৯. টেস্ট করা

  1. ডেভেলপমেন্ট সার্ভার চালু করুন:
   python manage.py runserver
  1. http://127.0.0.1:8000/admin/ এ লগইন করুন।
  2. Unfold সাইডবারে “Production Planning” সেকশন দেখুন, যেখানে Line Planning, Machine Allocation, Operator Assignment, এবং Target vs Achievement এর লিঙ্ক থাকবে।
  3. স্যাম্পল ডেটা পপুলেট করে ডাটা যুক্ত হয়েছে কিনা চেক করুন।

মন্তব্য

  • মডেল সম্পর্ক: LinePlanning এবং TargetVsAchievement মডেলগুলো order_management.Order এর সাথে ForeignKey দিয়ে সংযুক্ত। MachineAllocation এবং OperatorAssignment লাইন নম্বরের উপর নির্ভর করে।
  • ইংরেজি লেবেল: সব verbose_name, verbose_name_plural, এবং সাইডবার লেবেল ইংরেজিতে রাখা হয়েছে।
  • Unfold সাইডবার: “Production Planning” সেকশন ইংরেজিতে যুক্ত করা হয়েছে।
  • স্যাম্পল ডেটা: আপনার গল্পের ডেটা (Zara, ORD001, ZARA-TSHIRT-RED-2025) ইংরেজি লেবেল সহ পপুলেট করা হয়েছে।
  • মিডিয়া: order_management.TechPack এর জন্য media/techpacks/ ডিরেক্টরি প্রয়োজন।

পরবর্তী ধাপ

আপনার গল্পে উল্লেখিত Quality Assurance মডিউলের দিকে এগোতে পারি। আমি একটি নতুন অ্যাপ তৈরি করতে পারি (যেমন, quality_assurance), যেখানে Inline Inspection, Final Inspection, এবং Defect Report নিয়ে গল্প, টেবিল, এবং মডেল তৈরি করব। এটি আপনার ম্যানুফ্যাকচারিং প্রক্রিয়ার সাথে সামঞ্জস্যপূর্ণ হবে।

অনুগ্রহ করে জানান:

  • কোয়ালিটি অ্যাসুরেন্স মডিউল তৈরি করব? ইংরেজি লেবেল চান, নাকি বাংলা?
  • ড্যাশবোর্ড বা রিপোর্ট (যেমন, প্রোডাকশন রিপোর্ট, ডেলিভারি স্ট্যাটাস) যুক্ত করতে চান?
  • অন্য কোনো ফিচার বা কাস্টমাইজেশন প্রয়োজন?

আপনার উত্তরের অপেক্ষায়!

How can we help?