from django.db import models import uuid from django.db.models import JSONField # ==================================================================================== def generate_increment_code(model_class, prefix="CODE", padding=4, code_field="code"): last = model_class.objects.order_by('-id').first() next_id = (last.id + 1) if last else 1 return f"{prefix}{next_id:0{padding}d}" class AutoCodeModel(models.Model): code_prefix = "CODE" code_padding = 5 class Meta: abstract = True def save(self, *args, **kwargs): if not self.code: self.code = generate_increment_code( model_class=self.__class__, prefix=self.code_prefix, padding=self.code_padding ) super().save(*args, **kwargs) # ==================================================================================== # GIỮ NGUYÊN TỪ FILE GỐC # ==================================================================================== class Money_Unit(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) detail = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'money_unit' class Block_Reason(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'block_reason' class User_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'user_type' class Auth_Status(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'auth_status' class Auth_Method(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'auth_method' class Register_Method(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'register_method' class Customer_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'customer_type' class Customer_Segment(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'customer_segment' class Payment_Method(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'payment_method' class Value_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'value_type' class Discount_Method(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'discount_method' class Discount_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) value = models.IntegerField() type = models.ForeignKey(Value_Type, null=False, related_name='+', on_delete=models.PROTECT) method = models.ForeignKey(Discount_Method, null=False, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'discount_type' class User(models.Model): username = models.CharField(max_length=50, null=False, unique=True) password = models.CharField(max_length=100, null=False) email = models.CharField(max_length=100, null=True, unique=True) avatar = models.CharField(max_length=100, null=True) fullname = models.CharField(max_length=50, null=False) display_name = models.CharField(max_length=50, null=True) type = models.ForeignKey(User_Type, null=True, related_name='+', on_delete=models.PROTECT, default=1) blocked = models.BooleanField(default=False) block_reason = models.ForeignKey(Block_Reason, null=True, related_name='+', on_delete=models.PROTECT) blocked_by = models.PositiveIntegerField(null=True) last_login = models.DateTimeField(null=True) auth_method = models.ForeignKey(Auth_Method, null=False, related_name='+', on_delete=models.PROTECT) auth_status = models.ForeignKey(Auth_Status, null=False, related_name='+', on_delete=models.PROTECT) register_method = models.ForeignKey(Register_Method, null=False, related_name='+', on_delete=models.PROTECT) pin = models.CharField(max_length=100, null=True) is_admin = models.BooleanField(null=True, default=False) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'user' class Token(models.Model): token = models.CharField(max_length=100, null=False, unique=True) fcmtoken = models.CharField(max_length=200, null=True) browser = models.TextField(null=False) browser_version = models.CharField(max_length=100, null=False) os = models.CharField(max_length=100, null=False) ip = models.CharField(max_length=100, null=False) platform = models.CharField(max_length=100, null=False) expiry = models.BooleanField(default=False) city = models.CharField(max_length=100, null=True) region = models.CharField(max_length=100, null=True) country = models.CharField(max_length=100, null=True) loc = models.CharField(max_length=100, null=True) org = models.CharField(max_length=100, null=True) postal = models.CharField(max_length=100, null=True) timezone = models.CharField(max_length=100, null=True) user = models.ForeignKey(User, null=True, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'token' class Setting_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'setting_type' # GIỮ NGUYÊN — không thêm field 'type' vào Setting_Choice (file gốc không có) class Setting_Choice(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'setting_choice' class Setting_Class(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'setting_class' class Currency(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) rate = models.FloatField(null=False) decimal = models.IntegerField(null=False, default=0) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'currency' class Bank(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'bank' class User_Setting(models.Model): name = models.CharField(max_length=200, null=False, unique=True) detail = models.JSONField(null=False) user = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) type = models.ForeignKey(Setting_Type, null=False, related_name='+', on_delete=models.PROTECT) classify = models.ForeignKey(Setting_Class, null=False, related_name='+', on_delete=models.PROTECT) note = models.TextField(null=True) default = models.BooleanField(default=False) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) view = models.PositiveIntegerField(null=True) like = models.PositiveIntegerField(null=True) share = models.PositiveIntegerField(null=True) on_menu = models.BooleanField(default=False) my_menu = models.BooleanField(default=False) deleted = models.BooleanField(default=False) class Meta: db_table = 'user_setting' class Filter_Choice(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) detail = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'filter_choice' class Color_Choice(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) detail = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'color_choice' class Data_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'data_type' class Text_Align(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'text_align' class Placement(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) detail = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'placement' class Color_Scheme(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) detail = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'color_scheme' class Text_Color(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) detail = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'text_color' class Filter_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'filter_type' class Sort_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'sort_type' class Table_Setting(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) detail = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'table_setting' class Share_Choice(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'share_choice' class Menu_Choice(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'menu_choice' class Lang_Choice(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) detail = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'lang_choice' class Common(models.Model): category = models.CharField(max_length=100, null=False) classify = models.CharField(max_length=100, null=False) code = models.CharField(max_length=100, null=False) vi = models.TextField(null=False) en = models.TextField(null=True) image = models.TextField(null=True) icon = models.TextField(null=True) link = models.TextField(null=True) detail = models.JSONField(null=True) index = models.IntegerField(null=True, default=0) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'common' unique_together = ('category', 'classify', 'code') class System_Setting(models.Model): category = models.CharField(max_length=100, null=False) classify = models.CharField(max_length=100, null=False) code = models.CharField(max_length=100, null=False) vi = models.TextField(null=False) en = models.TextField(null=True) image = models.TextField(null=True) icon = models.TextField(null=True) link = models.TextField(null=True) detail = models.JSONField(null=True) detail_en = models.JSONField(null=True) index = models.IntegerField(null=True, default=0) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'system_setting' unique_together = ('category', 'classify', 'code') class User_Auth(models.Model): user = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) code = models.CharField(max_length=30, null=False, unique=True) expiry = models.BooleanField(default=False) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True) class Meta: db_table = 'user_auth' class Account_Recovery(models.Model): user = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) code = models.CharField(max_length=30, null=False, unique=True) expiry = models.BooleanField(default=False) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'account_recovery' class File_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'file_type' class Document_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'document_type' class File(AutoCodeModel): code_prefix = "FILE" code_padding = 5 code = models.CharField(max_length=20, null=True, unique=True) user = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) type = models.ForeignKey(File_Type, null=False, related_name='+', on_delete=models.PROTECT) doc_type = models.ForeignKey(Document_Type, null=True, related_name='+', on_delete=models.PROTECT) name = models.CharField(max_length=200, null=False) file = models.CharField(max_length=200, null=False) hashtag = models.CharField(max_length=200, null=True) size = models.IntegerField(null=False) caption = models.CharField(max_length=200, null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True) class Meta: db_table = 'file' class Sex(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'sex' class Legal_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'legal_type' class Notification_Status(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'notification_status' class Approve_Status(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) color = models.CharField(max_length=20, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'approve_status' class Category(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'category' class Display_Status(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'display_status' class Payment_Status(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'payment_status' class News(models.Model): title = models.CharField(max_length=200, null=False) subtitle = models.CharField(max_length=500, null=False) image = models.CharField(max_length=300, null=False) header = models.JSONField(null=True) content = models.JSONField(null=True) link = models.CharField(max_length=200, null=True) canonical = models.CharField(max_length=200, null=True) category = models.ForeignKey(Category, null=False, related_name='+', on_delete=models.PROTECT) status = models.ForeignKey(Display_Status, null=False, related_name='+', on_delete=models.PROTECT) language = models.ForeignKey(Lang_Choice, null=False, related_name='+', on_delete=models.PROTECT) valid_from = models.DateTimeField(null=True) valid_to = models.DateTimeField(null=True) user = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'news' class Message_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) title = models.CharField(max_length=200, null=True) title_en = models.CharField(max_length=200, null=True) content = models.TextField(null=False) content_en = models.TextField(null=False) category = models.CharField(max_length=50, null=False) link = models.TextField(null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'message_type' class Message(models.Model): code = models.CharField(max_length=30, null=False, unique=True) ref_code = models.CharField(max_length=20, null=False) type = models.ForeignKey(Message_Type, null=False, related_name='+', on_delete=models.PROTECT) title = models.CharField(max_length=200, null=True) title_en = models.CharField(max_length=200, null=True) content = models.TextField(null=False) content_en = models.TextField(null=False) link = models.TextField(null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'message' class Message_Receiver(models.Model): message = models.ForeignKey(Message, null=False, related_name='msgrecv', on_delete=models.PROTECT) user = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) status = models.ForeignKey(Notification_Status, null=False, related_name='+', on_delete=models.PROTECT, default=1) seen = models.BooleanField(default=False) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'message_receiver' unique_together = ('message', 'user') class Schedule_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'schedule_type' class Cycle_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'cycle_type' class Task_Category(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'task_category' class Task_Result(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'task_result' class Alert_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'alert_type' class Script_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'script_type' class Noti_Theme(models.Model): title = models.TextField(null=True) content = models.TextField(null=True) image = models.CharField(max_length=200, null=True) link = models.TextField(null=True) receiver = models.JSONField(null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True) class Meta: db_table = 'noti_theme' class Group(models.Model): creator = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) name = models.CharField(max_length=100, null=False) note = models.TextField(null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'group' unique_together = ('creator', 'name') class User_Group(models.Model): group = models.ForeignKey(Group, null=False, related_name='grus', on_delete=models.PROTECT) user = models.ForeignKey(User, null=False, related_name='usgr', on_delete=models.PROTECT) deleted = models.BooleanField(default=False) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'user_group' unique_together = ('group', 'user') class User_Session(models.Model): token = models.ForeignKey(Token, null=False, related_name='userlog', on_delete=models.PROTECT) session = models.BigIntegerField(null=False) start_time = models.DateTimeField(null=False) end_time = models.DateTimeField(null=True) duration = models.IntegerField(null=True) click_count = models.IntegerField(null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'user_session' class User_Log(models.Model): session = models.ForeignKey(User_Session, null=False, related_name='+', on_delete=models.PROTECT) link = models.TextField(null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'user_log' class Biz_Setting(models.Model): category = models.CharField(max_length=100, null=False) classify = models.CharField(max_length=100, null=False) code = models.CharField(max_length=100, null=False) vi = models.TextField(null=False) en = models.TextField(null=True) image = models.TextField(null=True) icon = models.TextField(null=True) link = models.TextField(null=True) detail = models.JSONField(null=True) detail_en = models.JSONField(null=True) index = models.IntegerField(null=True, default=0) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'biz_setting' unique_together = ('category', 'classify', 'code') class Info_Setting(models.Model): category = models.CharField(max_length=100, null=False) classify = models.CharField(max_length=100, null=False) code = models.CharField(max_length=100, null=False) vi = models.TextField(null=False) en = models.TextField(null=True) image = models.TextField(null=True) icon = models.TextField(null=True) link = models.TextField(null=True) detail = models.JSONField(null=True) detail_en = models.JSONField(null=True) index = models.IntegerField(null=True, default=0) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'info_setting' unique_together = ('category', 'classify', 'code') class Biz_Rights(models.Model): setting = models.ForeignKey(Biz_Setting, null=False, related_name='+', on_delete=models.PROTECT) user = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'biz_rights' unique_together = ('setting', 'user') class Group_Rights(models.Model): setting = models.ForeignKey(Biz_Setting, null=False, related_name='+', on_delete=models.PROTECT) group = models.ForeignKey(User_Type, null=False, related_name='+', on_delete=models.PROTECT) is_edit = models.BooleanField(null=True, default=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'group_rights' unique_together = ('setting', 'group') class Account_Setting(models.Model): category = models.CharField(max_length=100, null=False) classify = models.CharField(max_length=100, null=False) code = models.CharField(max_length=100, null=False) vi = models.TextField(null=False) en = models.TextField(null=True) image = models.TextField(null=True) icon = models.TextField(null=True) link = models.TextField(null=True) detail = models.JSONField(null=True) detail_en = models.JSONField(null=True) index = models.IntegerField(null=True, default=0) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'account_setting' unique_together = ('category', 'classify', 'code') class Relation(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'relation' class Branch_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'branch_type' class Country(models.Model): code = models.CharField(max_length=30, null=False, unique=False) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'country' class Issued_Place(models.Model): code = models.CharField(max_length=30, null=True, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'issued_place' class Company(AutoCodeModel): code_prefix = "CP" code_padding = 5 code = models.CharField(max_length=20, null=True, unique=True, db_index=True) tax_code = models.CharField(max_length=20, null=True, unique=True) fullname = models.CharField(max_length=300, null=False, db_index=True) shortname = models.CharField(max_length=50, null=True, db_index=True) phone = models.CharField(max_length=20, null=True, db_index=True) email = models.CharField(max_length=50, null=True) website = models.CharField(max_length=100, null=True) country = models.ForeignKey(Country, null=True, related_name='+', on_delete=models.PROTECT, default=1) address = models.CharField(max_length=200, null=True) contact_address = models.CharField(max_length=200, null=True) note = models.TextField(null=True) creator = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) updater = models.ForeignKey(User, null=True, related_name='+', on_delete=models.PROTECT) deleted = models.BooleanField(null=False, default=False, db_index=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'company' class People(AutoCodeModel): code_prefix = "RE" code_padding = 5 code = models.CharField(max_length=20, null=True, unique=True, db_index=True) fullname = models.CharField(max_length=50, null=False) phone = models.CharField(max_length=20, null=False) email = models.CharField(max_length=100, null=True) dob = models.DateField(null=True) sex = models.ForeignKey(Sex, null=True, related_name='+', on_delete=models.PROTECT) legal_type = models.ForeignKey(Legal_Type, null=True, related_name='+', on_delete=models.PROTECT) legal_code = models.CharField(max_length=20, null=True) issued_date = models.DateField(null=True) issued_place = models.ForeignKey(Issued_Place, null=True, related_name='+', on_delete=models.PROTECT) address = models.CharField(max_length=200, null=True) contact_address = models.CharField(max_length=200, null=True) taxcode = models.CharField(max_length=100, null=True) note = models.TextField(null=True) country = models.ForeignKey(Country, null=True, related_name='+', on_delete=models.PROTECT, default=1) company = models.ForeignKey(Company, null=True, related_name='+', on_delete=models.PROTECT) creator = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) updater = models.ForeignKey(User, null=True, related_name='+', on_delete=models.PROTECT) deleted = models.BooleanField(null=False, default=False) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'people' class Branch(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) address = models.CharField(max_length=300, null=False) logo = models.CharField(max_length=300, null=True) phone = models.CharField(max_length=20, null=False) email = models.CharField(max_length=100, null=True) note = models.TextField(null=True) type = models.ForeignKey(Branch_Type, null=False, related_name='+', on_delete=models.PROTECT) manager = models.ForeignKey(People, null=True, related_name='+', on_delete=models.PROTECT) signature = models.ForeignKey(People, null=True, related_name='+', on_delete=models.PROTECT) start_date = models.DateField(null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'branch' class Document_Audit(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'document_audit' class Customer(AutoCodeModel): code_prefix = "KH" code_padding = 5 code = models.CharField(max_length=20, null=True, unique=True, db_index=True) fullname = models.CharField(max_length=200, null=False, db_index=True) phone = models.CharField(max_length=20, null=False, unique=True, db_index=True) email = models.CharField(max_length=50, null=True, unique=True) legal_type = models.ForeignKey(Legal_Type, null=True, related_name='+', on_delete=models.PROTECT) legal_code = models.CharField(max_length=20, null=True, unique=True) issued_place = models.ForeignKey(Issued_Place, null=True, related_name='+', on_delete=models.PROTECT) issued_date = models.DateField(null=True) country = models.ForeignKey(Country, null=False, related_name='+', on_delete=models.PROTECT) address = models.CharField(max_length=200, null=True) contact_address = models.CharField(max_length=200, null=True) note = models.TextField(null=True) type = models.ForeignKey(Customer_Type, null=False, related_name='+', on_delete=models.PROTECT) segment = models.ForeignKey(Customer_Segment, null=True, related_name='+', on_delete=models.PROTECT) user = models.OneToOneField(User, null=True, related_name='customer_profile', on_delete=models.SET_NULL) sale_staff = models.ForeignKey('Staff', null=True, related_name='+', on_delete=models.PROTECT) creator = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) updater = models.ForeignKey(User, null=True, related_name='+', on_delete=models.PROTECT) deleted = models.BooleanField(null=False, default=False, db_index=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'customer' class Individual(models.Model): customer = models.ForeignKey(Customer, null=False, related_name='indvcust', on_delete=models.PROTECT) dob = models.DateField(null=True) sex = models.ForeignKey(Sex, null=True, related_name='+', on_delete=models.PROTECT) zalo = models.CharField(max_length=20, null=True) facebook = models.CharField(max_length=200, null=True) company = models.ForeignKey(Company, null=True, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'individual' class Organization(models.Model): customer = models.ForeignKey(Customer, null=False, related_name='orgncust', on_delete=models.PROTECT) shortname = models.CharField(max_length=50, null=True) established_date = models.DateField(null=True) website = models.CharField(max_length=200, null=True) bank_account = models.CharField(max_length=50, null=True) bank_name = models.CharField(max_length=100, null=True) type = models.ForeignKey('Company_Type', null=True, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'organization' class Company_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'company_type' class Legal_Rep(models.Model): organization = models.ForeignKey(Organization, null=False, related_name='orgrep', on_delete=models.PROTECT) people = models.ForeignKey(People, null=False, related_name='+', on_delete=models.PROTECT) relation = models.ForeignKey(Relation, null=False, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'legal_rep' class Customer_File(models.Model): ref = models.ForeignKey(Customer, null=False, related_name='custfile', on_delete=models.PROTECT) file = models.ForeignKey(File, null=False, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'customer_file' unique_together = ('ref', 'file') class Customer_Note(models.Model): ref = models.ForeignKey(Customer, null=False, related_name='custnote', on_delete=models.PROTECT) detail = models.JSONField(null=False) user = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'customer_note' class People_File(models.Model): ref = models.ForeignKey(People, null=False, related_name='+', on_delete=models.PROTECT) file = models.ForeignKey(File, null=False, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'people_file' unique_together = ('ref', 'file') class Customer_People(models.Model): customer = models.ForeignKey(Customer, null=False, related_name='custpeople', on_delete=models.PROTECT) people = models.ForeignKey(People, null=False, related_name='+', on_delete=models.PROTECT) relation = models.ForeignKey(Relation, null=False, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'customer_people' unique_together = ('customer', 'people') class Payment_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'payment_type' class Fee_Method(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'fee_method' class Fee_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) type = models.ForeignKey(Value_Type, null=False, related_name='+', on_delete=models.PROTECT) value = models.FloatField(null=False) method = models.ForeignKey(Fee_Method, null=True, related_name='+', on_delete=models.PROTECT) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'fee_type' class Account_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'account_type' class Internal_Account(models.Model): code = models.CharField(max_length=30, null=False, unique=True) balance = models.FloatField(null=False) type = models.ForeignKey(Account_Type, null=False, related_name='+', on_delete=models.PROTECT) currency = models.ForeignKey(Currency, null=False, related_name='+', on_delete=models.PROTECT) branch = models.ForeignKey(Branch, null=False, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'internal_account' unique_together = ('branch', 'type', 'currency') class Account_Book(models.Model): system_date = models.DateField(null=False) account = models.ForeignKey(Internal_Account, null=False, related_name='+', on_delete=models.PROTECT) current_date = models.DateField(null=False) start_balance = models.FloatField(null=True) end_balance = models.FloatField(null=True) credit = models.FloatField(null=True) debit = models.FloatField(null=True) number_credit = models.IntegerField(null=True) number_debit = models.IntegerField(null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'account_book' unique_together = ('system_date', 'account') class Interest_Base(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=200, null=True) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) detail = models.TextField(null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'interest_base' class Entry_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'entry_type' class Entry_Category(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'entry_category' class Internal_Entry(AutoCodeModel): code_prefix = "BT" code_padding = 6 code = models.CharField(max_length=30, null=True, unique=True, db_index=True) content = models.TextField(null=False) amount = models.FloatField(null=False) type = models.ForeignKey(Entry_Type, null=False, related_name='+', on_delete=models.PROTECT) category = models.ForeignKey(Entry_Category, null=False, related_name='entrycate', on_delete=models.PROTECT) balance_before = models.FloatField(null=True) balance_after = models.FloatField(null=False) approver = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) inputer = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) account = models.ForeignKey(Internal_Account, null=False, related_name='+', on_delete=models.PROTECT) date = models.DateField(null=False) ref = models.CharField(max_length=30, null=True, unique=True) customer = models.ForeignKey(Customer, null=True, related_name='entrycus', on_delete=models.PROTECT) subscription = models.ForeignKey('Subscription', null=True, related_name='+', on_delete=models.PROTECT) invoice = models.ForeignKey('Invoice', null=True, related_name='+', on_delete=models.PROTECT) provider_invoice = models.ForeignKey('Provider_Invoice', null=True, related_name='+', on_delete=models.PROTECT) allocation_amount = models.DecimalField(null=True, max_digits=35, decimal_places=2) allocation_remain = models.DecimalField(null=True, max_digits=35, decimal_places=2) allocation_detail = models.JSONField(null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'internal_entry' class Entry_File(models.Model): ref = models.ForeignKey(Internal_Entry, null=False, related_name='entryfile', on_delete=models.PROTECT) file = models.ForeignKey(File, null=False, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'entry_file' unique_together = ('ref', 'file') class Invoice(models.Model): link = models.CharField(max_length=100, null=True) ref_code = models.CharField(max_length=30, null=False) amount = models.DecimalField(max_digits=35, decimal_places=2) note = models.CharField(max_length=100, null=True) customer = models.ForeignKey(Customer, null=True, related_name='invoices', on_delete=models.PROTECT) issue_date = models.DateField(null=True) due_date = models.DateField(null=True) paid_amount = models.DecimalField(max_digits=20, decimal_places=2, null=True, default=0) remain_amount = models.DecimalField(max_digits=20, decimal_places=2, null=True) currency = models.ForeignKey(Currency, null=True, related_name='+', on_delete=models.PROTECT) payment_method = models.ForeignKey(Payment_Method, null=True, related_name='+', on_delete=models.PROTECT) status = models.ForeignKey(Payment_Status, null=True, related_name='+', on_delete=models.PROTECT) creator = models.ForeignKey(User, null=True, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'invoice' class Phone_Otp(models.Model): code = models.CharField(max_length=30, null=False, unique=True) phone = models.CharField(max_length=10, null=False) otp = models.CharField(max_length=10, null=False) valid_to = models.DateTimeField(null=True) expiry = models.BooleanField(default=False) sms_content = models.TextField(null=True) sms_fee = models.IntegerField(null=True) sms_info = models.JSONField(null=True) result = models.ForeignKey(Task_Result, null=True, related_name='+', on_delete=models.PROTECT) status = models.ForeignKey(Auth_Status, null=False, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'phone_otp' class Apps(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) logo = models.CharField(max_length=500, null=True) link = models.CharField(max_length=500, null=True) active = models.BooleanField(default=True) detail = models.TextField(null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'apps' class User_Apps(models.Model): apps = models.ForeignKey(Apps, null=False, related_name='+', on_delete=models.PROTECT) user = models.ForeignKey(User, null=False, related_name='userapps', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'user_apps' unique_together = ('apps', 'user') class Staff_Status(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'staff_status' class Staff(models.Model): code = models.CharField(max_length=20, null=False, unique=True, db_index=True) fullname = models.CharField(max_length=50, null=False, db_index=True) phone = models.CharField(max_length=20, null=False, unique=True, db_index=True) email = models.CharField(max_length=50, null=True, unique=True) dob = models.DateField(null=True) sex = models.ForeignKey(Sex, null=True, related_name='+', on_delete=models.PROTECT) legal_type = models.ForeignKey(Legal_Type, null=True, related_name='+', on_delete=models.PROTECT) legal_code = models.CharField(max_length=20, null=True, unique=True) issued_place = models.CharField(max_length=200, null=True) issued_date = models.DateField(null=True) country = models.ForeignKey(Country, null=False, related_name='+', on_delete=models.PROTECT) province = models.CharField(max_length=200, null=True) district = models.CharField(max_length=200, null=True) address = models.CharField(max_length=200, null=True) note = models.TextField(null=True) zalo = models.CharField(max_length=20, null=True) facebook = models.CharField(max_length=100, null=True) branch = models.ForeignKey(Branch, null=True, related_name='+', on_delete=models.PROTECT) creator = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) deleted = models.BooleanField(null=False, default=False, db_index=True) updater = models.ForeignKey(User, null=True, related_name='+', on_delete=models.PROTECT) status = models.ForeignKey(Staff_Status, null=False, related_name='+', on_delete=models.PROTECT) user = models.ForeignKey(User, null=True, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'staff' class Staff_File(models.Model): ref = models.ForeignKey(Staff, null=False, related_name='stafffile', on_delete=models.PROTECT) file = models.ForeignKey(File, null=False, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'staff_file' unique_together = ('ref', 'file') class Task_Status(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'task_status' class Batch_Log(models.Model): system_date = models.DateField(null=False) start_time = models.DateTimeField(null=False) end_time = models.DateTimeField(null=True) duration = models.IntegerField(null=True) log = models.JSONField(null=True) status = models.ForeignKey(Task_Status, null=False, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'batch_log' class Sms(models.Model): session_id = models.CharField(max_length=300, null=False) request_id = models.CharField(max_length=300, null=False) brandname = models.CharField(max_length=20, null=False) phone = models.CharField(max_length=11, null=False) message = models.CharField(max_length=300, null=False) type = models.CharField(max_length=30, null=False) agent = models.CharField(max_length=30, null=False) telco = models.CharField(max_length=30, null=False) status = models.CharField(max_length=30, null=False) price = models.IntegerField(null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'sms' class Customer_Sms(models.Model): ref = models.ForeignKey(Customer, null=False, related_name='custsms', on_delete=models.PROTECT) sms = models.ForeignKey(Sms, null=False, related_name='+', on_delete=models.PROTECT) user = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'customer_sms' class Backup(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=200, null=False) file = models.CharField(max_length=200, null=True) status = models.ForeignKey(Task_Status, null=False, related_name='+', on_delete=models.PROTECT) note = models.TextField(null=True) start_time = models.DateTimeField(null=True) end_time = models.DateTimeField(null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'backup' class Ssh(models.Model): name = models.CharField(max_length=300, null=False) host = models.CharField(max_length=30, null=False) port = models.IntegerField(null=False) username = models.CharField(max_length=50, null=False) password = models.CharField(max_length=50, null=False) path = models.CharField(max_length=300, null=False) deleted = models.BooleanField(default=False) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True) class Meta: db_table = 'ssh' class Document_Configuration(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=200, null=False) template_path = models.CharField(max_length=200, null=False) mappings = models.JSONField(default=list) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'document_configuration' class Import_Setting(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) detail = models.JSONField(null=False) note = models.TextField(null=True) template = models.TextField(null=True) api = models.CharField(max_length=100, null=False) call_api = models.CharField(max_length=100, null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'import_setting' class Layer_Setting(AutoCodeModel): code_prefix = "LS" code_padding = 4 code = models.CharField(max_length=20, null=True, unique=True) name = models.CharField(max_length=200, null=False) detail = models.JSONField(null=False) user = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'layer_setting' class Send_Status(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'send_status' class Email_Setup(models.Model): email = models.CharField(max_length=100, null=False, unique=True) password = models.CharField(max_length=30, null=False) smtp = models.CharField(max_length=100, null=False) port = models.IntegerField(null=False) display_name = models.CharField(max_length=100, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'email_setup' class Email_Sent(models.Model): receiver = models.TextField(null=False) subject = models.TextField(null=False) content = models.TextField(null=False) status = models.ForeignKey(Send_Status, null=False, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True) class Meta: db_table = 'email_sent' class Email_List(models.Model): name = models.CharField(max_length=200, null=False, unique=True) email = models.TextField(null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True) class Meta: db_table = 'email_list' class Email_Template(models.Model): name = models.CharField(max_length=200, null=False, unique=True) content = models.JSONField(null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True) class Meta: db_table = 'email_template' class Email_Job(models.Model): name = models.CharField(max_length=200, null=False) model_name = models.CharField(max_length=100, null=False, help_text="e.g., app.Subscription") template = models.ForeignKey(Email_Template, null=False, related_name='+', on_delete=models.PROTECT) trigger_on_create = models.BooleanField(default=False) trigger_on_update = models.BooleanField(default=False) active = models.BooleanField(default=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'email_job' # ==================================================================================== # CLOUD DOMAIN — PROVIDER (NHÀ CUNG CẤP HẠ TẦNG) # ==================================================================================== class Provider(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) website = models.URLField(null=True) api_endpoint = models.CharField(max_length=200, null=True) partner_id = models.CharField(max_length=100, null=True) contact_email = models.CharField(max_length=100, null=True) note = models.TextField(null=True) active = models.BooleanField(default=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'provider' class Provider_Credential(models.Model): provider = models.ForeignKey(Provider, null=False, related_name='credentials', on_delete=models.PROTECT) label = models.CharField(max_length=100, null=False) api_key = models.CharField(max_length=500, null=False) api_secret = models.CharField(max_length=500, null=True) active = models.BooleanField(default=True) note = models.TextField(null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'provider_credential' class Datacenter(models.Model): provider = models.ForeignKey(Provider, null=False, related_name='datacenters', on_delete=models.PROTECT) code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) region = models.CharField(max_length=100, null=True) country = models.ForeignKey(Country, null=True, related_name='+', on_delete=models.PROTECT) provider_location_id = models.CharField(max_length=50, null=True) active = models.BooleanField(default=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'datacenter' # ==================================================================================== # CLOUD DOMAIN — SERVICE CATALOG # ==================================================================================== class Service_Category(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) icon = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'service_category' class Service_Plan(models.Model): BILLING_SUBSCRIPTION = 'SUBSCRIPTION' BILLING_PAYG = 'PAYG' BILLING_BOTH = 'BOTH' BILLING_TYPE_CHOICES = [ (BILLING_SUBSCRIPTION, 'Subscription'), (BILLING_PAYG, 'Pay-as-you-go'), (BILLING_BOTH, 'Cả hai'), ] code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=200, null=False) category = models.ForeignKey(Service_Category, null=False, related_name='plans', on_delete=models.PROTECT) provider = models.ForeignKey(Provider, null=False, related_name='plans', on_delete=models.PROTECT) billing_type = models.CharField(max_length=20, choices=BILLING_TYPE_CHOICES, default=BILLING_SUBSCRIPTION) cpu = models.IntegerField(null=True) ram_gb = models.IntegerField(null=True) disk_gb = models.IntegerField(null=True) bandwidth_tb = models.DecimalField(max_digits=8, decimal_places=2, null=True) storage_gb = models.IntegerField(null=True) extra_specs = models.JSONField(null=True) provider_price = models.DecimalField(max_digits=20, decimal_places=4, null=False) provider_currency = models.ForeignKey(Currency, null=False, related_name='+', on_delete=models.PROTECT) provider_plan_id = models.CharField(max_length=100, null=True) sell_price = models.DecimalField(max_digits=20, decimal_places=2, null=False) sell_price_hourly = models.DecimalField(max_digits=20, decimal_places=6, null=True) sell_currency = models.ForeignKey(Currency, null=False, related_name='+', on_delete=models.PROTECT) active = models.BooleanField(default=True) index = models.IntegerField(null=True, default=1) note = models.TextField(null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'service_plan' class Plan_Datacenter(models.Model): plan = models.ForeignKey(Service_Plan, null=False, related_name='plan_dcs', on_delete=models.PROTECT) datacenter = models.ForeignKey(Datacenter, null=False, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'plan_datacenter' unique_together = ('plan', 'datacenter') class Pricing_Tier(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) months = models.IntegerField(null=False) discount_percent = models.DecimalField(max_digits=5, decimal_places=2, default=0) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'pricing_tier' # ==================================================================================== # CLOUD DOMAIN — SUBSCRIPTION # ==================================================================================== class Subscription_Status(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) color = models.CharField(max_length=20, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'subscription_status' class Subscription(AutoCodeModel): BILLING_SUBSCRIPTION = 'SUBSCRIPTION' BILLING_PAYG = 'PAYG' BILLING_TYPE_CHOICES = [ (BILLING_SUBSCRIPTION, 'Subscription'), (BILLING_PAYG, 'Pay-as-you-go'), ] code_prefix = "SUB" code_padding = 6 code = models.CharField(max_length=20, null=True, unique=True, db_index=True) customer = models.ForeignKey(Customer, null=False, related_name='subscriptions', on_delete=models.PROTECT) plan = models.ForeignKey(Service_Plan, null=False, related_name='subscriptions', on_delete=models.PROTECT) datacenter = models.ForeignKey(Datacenter, null=False, related_name='+', on_delete=models.PROTECT) billing_type = models.CharField(max_length=20, choices=BILLING_TYPE_CHOICES, default=BILLING_SUBSCRIPTION) pricing_tier = models.ForeignKey(Pricing_Tier, null=True, related_name='+', on_delete=models.PROTECT) payment_method = models.ForeignKey(Payment_Method, null=True, related_name='+', on_delete=models.PROTECT) unit_price = models.DecimalField(max_digits=20, decimal_places=2, null=True) unit_price_hourly = models.DecimalField(max_digits=20, decimal_places=6, null=True) discount_amount = models.DecimalField(max_digits=20, decimal_places=2, null=True, default=0) final_price = models.DecimalField(max_digits=20, decimal_places=2, null=True) currency = models.ForeignKey(Currency, null=False, related_name='+', on_delete=models.PROTECT) start_date = models.DateField(null=False) end_date = models.DateField(null=True) next_billing_date = models.DateField(null=True) auto_renew = models.BooleanField(default=True) status = models.ForeignKey(Subscription_Status, null=False, related_name='+', on_delete=models.PROTECT) note = models.TextField(null=True) creator = models.ForeignKey(User, null=True, related_name='+', on_delete=models.PROTECT) updater = models.ForeignKey(User, null=True, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'subscription' class Subscription_Discount(models.Model): subscription = models.ForeignKey(Subscription, null=False, related_name='discounts', on_delete=models.PROTECT) discount = models.ForeignKey(Discount_Type, null=False, related_name='+', on_delete=models.PROTECT) type = models.ForeignKey(Value_Type, null=False, related_name='+', on_delete=models.PROTECT) value = models.DecimalField(max_digits=20, decimal_places=2, null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'subscription_discount' class Subscription_File(models.Model): ref = models.ForeignKey(Subscription, null=False, related_name='subfile', on_delete=models.PROTECT) file = models.ForeignKey(File, null=False, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'subscription_file' unique_together = ('ref', 'file') class Subscription_Note(models.Model): ref = models.ForeignKey(Subscription, null=False, related_name='subnote', on_delete=models.PROTECT) detail = models.TextField(null=False) files = models.JSONField(null=True) user = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) deleted = models.BooleanField(null=True, default=False) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'subscription_note' # ==================================================================================== # CLOUD DOMAIN — WALLET (PAYG) # ==================================================================================== class Wallet_Transaction_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'wallet_transaction_type' class Customer_Wallet(models.Model): PREPAID = 'PREPAID' POSTPAID = 'POSTPAID' BILLING_MODE_CHOICES = [ (PREPAID, 'Prepaid — Nạp trước'), (POSTPAID, 'Postpaid — Trả sau cuối tháng'), ] customer = models.OneToOneField(Customer, null=False, related_name='wallet', on_delete=models.PROTECT) billing_mode = models.CharField(max_length=20, choices=BILLING_MODE_CHOICES, default=PREPAID) balance = models.DecimalField(max_digits=20, decimal_places=2, null=False, default=0) currency = models.ForeignKey(Currency, null=False, related_name='+', on_delete=models.PROTECT) low_balance_threshold = models.DecimalField(max_digits=20, decimal_places=2, null=True) credit_limit = models.DecimalField(max_digits=20, decimal_places=2, null=True) billing_day = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'customer_wallet' class Wallet_Transaction(AutoCodeModel): code_prefix = "WT" code_padding = 7 code = models.CharField(max_length=20, null=True, unique=True, db_index=True) wallet = models.ForeignKey(Customer_Wallet, null=False, related_name='transactions', on_delete=models.PROTECT) type = models.ForeignKey(Wallet_Transaction_Type, null=False, related_name='+', on_delete=models.PROTECT) amount = models.DecimalField(max_digits=20, decimal_places=2, null=False) balance_before = models.DecimalField(max_digits=20, decimal_places=2, null=False) balance_after = models.DecimalField(max_digits=20, decimal_places=2, null=False) description = models.CharField(max_length=300, null=False) subscription = models.ForeignKey(Subscription, null=True, related_name='wallet_txns', on_delete=models.PROTECT) invoice = models.ForeignKey(Invoice, null=True, related_name='wallet_txns', on_delete=models.PROTECT) ref_code = models.CharField(max_length=100, null=True) performed_by = models.ForeignKey(User, null=True, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'wallet_transaction' # ==================================================================================== # CLOUD DOMAIN — CLOUD INSTANCE # ==================================================================================== class Instance_Status(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) color = models.CharField(max_length=20, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'instance_status' class Cloud_Instance(AutoCodeModel): code_prefix = "INS" code_padding = 6 code = models.CharField(max_length=20, null=True, unique=True, db_index=True) subscription = models.ForeignKey(Subscription, null=False, related_name='instances', on_delete=models.PROTECT) provider = models.ForeignKey(Provider, null=False, related_name='+', on_delete=models.PROTECT) datacenter = models.ForeignKey(Datacenter, null=False, related_name='+', on_delete=models.PROTECT) provider_instance_id = models.CharField(max_length=100, null=True, db_index=True) provider_instance_name = models.CharField(max_length=200, null=True) ip_address = models.GenericIPAddressField(null=True) ipv6_address = models.CharField(max_length=50, null=True) hostname = models.CharField(max_length=200, null=True) cpu = models.IntegerField(null=True) ram_gb = models.IntegerField(null=True) disk_gb = models.IntegerField(null=True) status = models.ForeignKey(Instance_Status, null=False, related_name='+', on_delete=models.PROTECT) provisioned_at = models.DateTimeField(null=True) terminated_at = models.DateTimeField(null=True) root_password = models.CharField(max_length=300, null=True) ssh_key = models.TextField(null=True) note = models.TextField(null=True) extra_info = models.JSONField(null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'cloud_instance' class Instance_Log(models.Model): instance = models.ForeignKey(Cloud_Instance, null=False, related_name='logs', on_delete=models.PROTECT) action = models.CharField(max_length=50, null=False) status = models.CharField(max_length=30, null=False) performed_by = models.ForeignKey(User, null=True, related_name='+', on_delete=models.PROTECT) detail = models.JSONField(null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'instance_log' # ==================================================================================== # CLOUD DOMAIN — USAGE RECORD (PAYG) # ==================================================================================== class Usage_Record(models.Model): subscription = models.ForeignKey(Subscription, null=False, related_name='usage_records', on_delete=models.PROTECT) instance = models.ForeignKey(Cloud_Instance, null=True, related_name='usage_records', on_delete=models.PROTECT) period_from = models.DateTimeField(null=False) period_to = models.DateTimeField(null=False) hours = models.DecimalField(max_digits=10, decimal_places=4, null=False) unit_price_hourly = models.DecimalField(max_digits=20, decimal_places=6, null=False) amount = models.DecimalField(max_digits=20, decimal_places=4, null=False) currency = models.ForeignKey(Currency, null=False, related_name='+', on_delete=models.PROTECT) charged = models.BooleanField(default=False) wallet_transaction = models.ForeignKey(Wallet_Transaction, null=True, related_name='usage_records', on_delete=models.PROTECT) postpaid_invoice = models.ForeignKey(Invoice, null=True, related_name='usage_records', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'usage_record' indexes = [ models.Index(fields=['subscription', 'period_from']), ] # ==================================================================================== # CLOUD DOMAIN — INVOICE LINES & RECEIPTS # ==================================================================================== class Invoice_Line(models.Model): invoice = models.ForeignKey(Invoice, null=False, related_name='lines', on_delete=models.PROTECT) subscription = models.ForeignKey(Subscription, null=False, related_name='invoice_lines', on_delete=models.PROTECT) description = models.CharField(max_length=300, null=False) period_from = models.DateField(null=False) period_to = models.DateField(null=False) unit_price = models.DecimalField(max_digits=20, decimal_places=2, null=False) quantity = models.DecimalField(max_digits=10, decimal_places=2, default=1) discount_amount = models.DecimalField(max_digits=20, decimal_places=2, null=True, default=0) line_total = models.DecimalField(max_digits=20, decimal_places=2, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'invoice_line' class Payment_Receipt(AutoCodeModel): code_prefix = "PT" code_padding = 6 code = models.CharField(max_length=20, null=True, unique=True, db_index=True) invoice = models.ForeignKey(Invoice, null=False, related_name='receipts', on_delete=models.PROTECT) customer = models.ForeignKey(Customer, null=False, related_name='receipts', on_delete=models.PROTECT) amount = models.DecimalField(max_digits=20, decimal_places=2, null=False) currency = models.ForeignKey(Currency, null=False, related_name='+', on_delete=models.PROTECT) payment_method = models.ForeignKey(Payment_Method, null=False, related_name='+', on_delete=models.PROTECT) payment_date = models.DateField(null=False) ref_code = models.CharField(max_length=100, null=True) note = models.TextField(null=True) status = models.ForeignKey(Payment_Status, null=False, related_name='+', on_delete=models.PROTECT) approver = models.ForeignKey(User, null=True, related_name='+', on_delete=models.PROTECT) approve_time = models.DateTimeField(null=True) creator = models.ForeignKey(User, null=True, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'payment_receipt' # ==================================================================================== # CLOUD DOMAIN — POSTPAID BILLING CYCLE # ==================================================================================== class Postpaid_Billing_Cycle(AutoCodeModel): OPEN = 'OPEN' INVOICED = 'INVOICED' PAID = 'PAID' STATUS_CHOICES = [ (OPEN, 'Đang tích lũy usage'), (INVOICED, 'Đã xuất Invoice'), (PAID, 'Đã thanh toán'), ] code_prefix = "PBC" code_padding = 6 code = models.CharField(max_length=20, null=True, unique=True, db_index=True) customer = models.ForeignKey(Customer, null=False, related_name='billing_cycles', on_delete=models.PROTECT) period_from = models.DateField(null=False) period_to = models.DateField(null=False) total_usage_amount = models.DecimalField(max_digits=20, decimal_places=2, null=True) currency = models.ForeignKey(Currency, null=False, related_name='+', on_delete=models.PROTECT) status = models.CharField(max_length=20, choices=STATUS_CHOICES, default=OPEN) invoice = models.OneToOneField(Invoice, null=True, related_name='billing_cycle', on_delete=models.PROTECT) closed_at = models.DateTimeField(null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'postpaid_billing_cycle' unique_together = ('customer', 'period_from') # ==================================================================================== # CLOUD DOMAIN — PROVIDER COST # ==================================================================================== class Provider_Invoice(AutoCodeModel): code_prefix = "PVI" code_padding = 5 code = models.CharField(max_length=20, null=True, unique=True) provider = models.ForeignKey(Provider, null=False, related_name='provider_invoices', on_delete=models.PROTECT) period_from = models.DateField(null=False) period_to = models.DateField(null=False) total_amount = models.DecimalField(max_digits=20, decimal_places=2, null=False) currency = models.ForeignKey(Currency, null=False, related_name='+', on_delete=models.PROTECT) document = models.ForeignKey(File, null=True, related_name='+', on_delete=models.PROTECT) note = models.TextField(null=True) status = models.ForeignKey(Payment_Status, null=False, related_name='+', on_delete=models.PROTECT) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'provider_invoice' class Provider_Invoice_Line(models.Model): provider_invoice = models.ForeignKey(Provider_Invoice, null=False, related_name='lines', on_delete=models.PROTECT) instance = models.ForeignKey(Cloud_Instance, null=True, related_name='+', on_delete=models.PROTECT) description = models.CharField(max_length=300, null=False) amount = models.DecimalField(max_digits=20, decimal_places=2, null=False) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'provider_invoice_line' # ==================================================================================== # CLOUD DOMAIN — SUPPORT TICKET # ==================================================================================== class Ticket_Priority(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) color = models.CharField(max_length=20, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'ticket_priority' class Ticket_Status(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) en = models.CharField(max_length=100, null=True) color = models.CharField(max_length=20, null=True) index = models.IntegerField(null=True, default=1) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'ticket_status' class Support_Ticket(AutoCodeModel): code_prefix = "TK" code_padding = 6 code = models.CharField(max_length=20, null=True, unique=True, db_index=True) customer = models.ForeignKey(Customer, null=False, related_name='tickets', on_delete=models.PROTECT) subscription = models.ForeignKey(Subscription, null=True, related_name='tickets', on_delete=models.PROTECT) instance = models.ForeignKey(Cloud_Instance, null=True, related_name='tickets', on_delete=models.PROTECT) title = models.CharField(max_length=300, null=False) description = models.TextField(null=False) priority = models.ForeignKey(Ticket_Priority, null=False, related_name='+', on_delete=models.PROTECT) status = models.ForeignKey(Ticket_Status, null=False, related_name='+', on_delete=models.PROTECT) assignee = models.ForeignKey(Staff, null=True, related_name='+', on_delete=models.PROTECT) resolved_at = models.DateTimeField(null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) update_time = models.DateTimeField(null=True, auto_now=True) class Meta: db_table = 'support_ticket' class Ticket_Reply(models.Model): ticket = models.ForeignKey(Support_Ticket, null=False, related_name='replies', on_delete=models.PROTECT) content = models.TextField(null=False) is_internal = models.BooleanField(default=False) user = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT) files = models.JSONField(null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) class Meta: db_table = 'ticket_reply'