ঠিক আছে! আপনি 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 অ্যাপের মাইগ্রেশন সম্পন্ন হয়েছে।
৯. টেস্ট করা
- ডেভেলপমেন্ট সার্ভার চালু করুন:
python manage.py runserverhttp://127.0.0.1:8000/admin/এ লগইন করুন।- Unfold সাইডবারে “Production Planning” সেকশন দেখুন, যেখানে Line Planning, Machine Allocation, Operator Assignment, এবং Target vs Achievement এর লিঙ্ক থাকবে।
- স্যাম্পল ডেটা পপুলেট করে ডাটা যুক্ত হয়েছে কিনা চেক করুন।
মন্তব্য
- মডেল সম্পর্ক:
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 নিয়ে গল্প, টেবিল, এবং মডেল তৈরি করব। এটি আপনার ম্যানুফ্যাকচারিং প্রক্রিয়ার সাথে সামঞ্জস্যপূর্ণ হবে।
অনুগ্রহ করে জানান:
- কোয়ালিটি অ্যাসুরেন্স মডিউল তৈরি করব? ইংরেজি লেবেল চান, নাকি বাংলা?
- ড্যাশবোর্ড বা রিপোর্ট (যেমন, প্রোডাকশন রিপোর্ট, ডেলিভারি স্ট্যাটাস) যুক্ত করতে চান?
- অন্য কোনো ফিচার বা কাস্টমাইজেশন প্রয়োজন?
আপনার উত্তরের অপেক্ষায়!