from django.db import models from apps.core.models import BaseModel from apps.authorization.models import UserRelations # Create your models here. class ReferenceProduct(BaseModel): """ Reference product - like: rice """ name = models.CharField(max_length=250, default='empty') # noqa type_choices = ( ('F', 'Free'), # free product ('G', 'Governmental') # government product ) type = models.CharField(max_length=3, choices=type_choices) img = models.CharField(max_length=100, default='empty') def __str__(self): return f'name: {self.name} - type: {self.type}' def save(self, *args, **kwargs): super(ReferenceProduct, self).save(*args, **kwargs) class Product(BaseModel): """ Child of reference product - like: brown rice """ name = models.CharField(max_length=250, default='empty') # noqa type_choices = ( ('F', 'Free'), # free product ('G', 'Governmental') # ) type = models.CharField(max_length=3, choices=type_choices) img = models.CharField(max_length=100, default='empty') reference = models.ForeignKey( ReferenceProduct, on_delete=models.CASCADE, related_name='reference_product', null=True ) def __str__(self): return f'name: {self.name} - type: {self.type}' def save(self, *args, **kwargs): super(Product, self).save(*args, **kwargs) class Attribute(BaseModel): """ every reference product have multiple attributes """ reference_product = models.ForeignKey( ReferenceProduct, on_delete=models.CASCADE, related_name='reference_attribute', null=True ) name = models.CharField(max_length=100, default='empty') type_choices = ( ('K', 'Per Kilo'), ('', ''), ) type = models.CharField( max_length=10, choices=type_choices, default='empty', help_text='type of attribute like: calculate product by kilogram' ) def __str__(self): return f'{self.reference_product.name} - {self.name}' def save(self, *args, **kwargs): return super(Attribute, self).save(*args, **kwargs) class AttributeValue(BaseModel): """ every child product should have attribute value for reference product attribute """ product = models.ForeignKey( Product, on_delete=models.CASCADE, related_name='product_attribute_value', null=True ) attribute = models.ForeignKey( Attribute, on_delete=models.CASCADE, related_name='attribute_value', null=True ) value = models.IntegerField(default=0) def __str__(self): return f'{self.product.name} - {self.attribute.name} - {self.value}' def save(self, *args, **kwargs): return super(AttributeValue, self).save(*args, **kwargs) class Broker(BaseModel): """ Broker for product """ reference_product = models.ForeignKey( ReferenceProduct, on_delete=models.CASCADE, related_name='product_broker', null=True ) organization_relations = models.ForeignKey( UserRelations, on_delete=models.CASCADE, related_name='product_organization', null=True ) calculation_choices = ( ('K', 'Per Kilo'), ('', ''), ) calculation_strategy = models.CharField( max_length=3, choices=calculation_choices, default='empty' ) required = models.BooleanField(default=False) def __str__(self): return f'{self.organization_relations.organization.name} - {self.reference_product.name}' def save(self, *args, **kwargs): return super(Broker, self).save(*args, **kwargs) class SaleUnit(BaseModel): """ Units of product for sale """ reference_product = models.ForeignKey( ReferenceProduct, on_delete=models.CASCADE, related_name='sale_unit', null=True ) unit_choices = ( ('10P', '10KG Package'), ('50P', '50KG Package'), ('', ''), ) unit = models.CharField(max_length=10, choices=unit_choices, null=True) variation_coefficient = models.IntegerField(default=0) required = models.BooleanField(default=False) def __str__(self): return f'{self.reference_product} - {self.unit} - {self.variation_coefficient}'