This commit is contained in:
@@ -49,10 +49,35 @@ class Material(models.Model):
|
||||
class Meta:
|
||||
verbose_name = "Материал"; verbose_name_plural = "Материалы"
|
||||
|
||||
class ProductionTask(models.Model):
|
||||
"""
|
||||
Основание для производства. Определяет ЧТО делать.
|
||||
Создается технологом или мастером на основе заказа.
|
||||
"""
|
||||
deal = models.ForeignKey(Deal, on_delete=models.CASCADE, verbose_name="Сделка")
|
||||
|
||||
drawing_name = models.CharField("Название детали", max_length=255, blank=True, default="Б/ч")
|
||||
size_value = models.FloatField("Размер детали", help_text="Длина (мм) или Толщина (мм)")
|
||||
|
||||
drawing_file = models.FileField("Исходник (DXF/IGES)", upload_to="drawings/%Y/%m/", blank=True, null=True)
|
||||
extra_drawing = models.FileField("Доп. чертеж (PDF)", upload_to="extra_drawings/%Y/%m/", blank=True, null=True)
|
||||
|
||||
material = models.ForeignKey(Material, on_delete=models.PROTECT, verbose_name="Материал")
|
||||
quantity_ordered = models.PositiveIntegerField("Заказано всего, шт")
|
||||
is_bend = models.BooleanField("Гибка", default=False)
|
||||
|
||||
created_at = models.DateTimeField("Дата создания", auto_now_add=True)
|
||||
|
||||
class Meta:
|
||||
verbose_name = "Задание на деталь"; verbose_name_plural = "Задания на детали"
|
||||
ordering = ['-created_at']
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.drawing_name} (Заказ {self.deal.number})"
|
||||
|
||||
class Item(models.Model):
|
||||
"""
|
||||
Единица сменного задания. Основная рабочая сущность.
|
||||
Статус по умолчанию 'work' (В работе).
|
||||
Единица сменного задания. Определяет КТО, КОГДА и СКОЛЬКО сделал.
|
||||
"""
|
||||
STATUS_CHOICES = [
|
||||
('work', 'В работе'),
|
||||
@@ -61,23 +86,15 @@ class Item(models.Model):
|
||||
('leftover', 'Недодел'),
|
||||
]
|
||||
|
||||
# --- База (заполняет начальник) ---
|
||||
date = models.DateField("Дата задания", default=timezone.now)
|
||||
# --- Ссылка на основу (временно null=True для миграции старых данных) ---
|
||||
task = models.ForeignKey(ProductionTask, on_delete=models.CASCADE, related_name='items', verbose_name="Задание", null=True, blank=True)
|
||||
|
||||
# --- Смена (заполняет мастер) ---
|
||||
date = models.DateField("Дата смены", default=timezone.now)
|
||||
machine = models.ForeignKey(Machine, on_delete=models.PROTECT, verbose_name="Станок")
|
||||
deal = models.ForeignKey(Deal, on_delete=models.CASCADE, verbose_name="Сделка")
|
||||
quantity_plan = models.PositiveIntegerField("План на смену, шт")
|
||||
|
||||
drawing_name = models.CharField("Название детали", max_length=255, blank=True, default="Б/ч")
|
||||
size_value = models.FloatField("Размер детали", help_text="Длина (мм) или Толщина (мм)")
|
||||
|
||||
drawing_file = models.FileField("Исходник (DXF/STEP)", upload_to="drawings/%Y/%m/", blank=True, null=True)
|
||||
extra_drawing = models.FileField("Доп. чертеж (PDF)", upload_to="extra_drawings/%Y/%m/", blank=True, null=True)
|
||||
|
||||
material = models.ForeignKey(Material, on_delete=models.PROTECT, verbose_name="Материал")
|
||||
quantity_plan = models.PositiveIntegerField("План, шт")
|
||||
is_bend = models.BooleanField("Гибка", default=False)
|
||||
|
||||
# --- Исполнение (заполняет оператор/мастер) ---
|
||||
operator = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="Исполнитель")
|
||||
# --- Исполнение (заполняет оператор) ---
|
||||
quantity_fact = models.PositiveIntegerField("Факт, шт", default=0)
|
||||
|
||||
material_taken = models.TextField("Взятый материал", blank=True, help_text="Напр: 3 трубы по 12м")
|
||||
@@ -89,11 +106,11 @@ class Item(models.Model):
|
||||
is_synced_1c = models.BooleanField("Учтено в 1С", default=False)
|
||||
|
||||
class Meta:
|
||||
verbose_name = "Позиция"; verbose_name_plural = "Сменное задание"
|
||||
ordering = ['-date', 'deal']
|
||||
verbose_name = "Позиция сменки"; verbose_name_plural = "Реестр сменных заданий"
|
||||
ordering = ['-date', 'task__deal']
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.drawing_name} ({self.quantity_plan} шт.)"
|
||||
return f"{self.task.drawing_name} - {self.date}"
|
||||
|
||||
|
||||
class EmployeeProfile(models.Model):
|
||||
|
||||
Reference in New Issue
Block a user