2162 lines
90 KiB
Python
2162 lines
90 KiB
Python
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 — lookup tables không liên quan BĐS
|
|
# ====================================================================================
|
|
|
|
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'
|
|
|
|
|
|
# GIỮ NGUYÊN — hệ thống messaging/notification
|
|
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')
|
|
|
|
|
|
# GIỮ NGUYÊN — task/schedule/alert
|
|
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)
|
|
# Field mới cho cloud: tài khoản portal + nhân viên phụ trách
|
|
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)
|
|
# Cloud: thay product → subscription
|
|
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')
|
|
|
|
|
|
# GIỮ NGUYÊN — Invoice gốc (liên kết với payment_schedule BĐS, giữ để không break data cũ)
|
|
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)
|
|
# Cloud: thêm fields mới (nullable để không break data cũ)
|
|
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'
|
|
|
|
|
|
# GIỮ NGUYÊN — Workflow engine
|
|
class Workflow(models.Model):
|
|
code = models.CharField(max_length=50, unique=True)
|
|
name = models.CharField(max_length=200)
|
|
description = models.TextField(blank=True)
|
|
is_active = models.BooleanField(default=True)
|
|
initial_step = models.ForeignKey('StepAction', null=True, blank=True, on_delete=models.SET_NULL,
|
|
related_name='initial_workflows')
|
|
create_time = models.DateTimeField(auto_now_add=True)
|
|
update_time = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = 'workflow'
|
|
|
|
|
|
class StepAction(models.Model):
|
|
workflow = models.ForeignKey(Workflow, on_delete=models.CASCADE, related_name='steps')
|
|
step_code = models.CharField(max_length=50, unique=True)
|
|
name = models.CharField(max_length=200)
|
|
description = models.TextField(blank=True)
|
|
order = models.PositiveIntegerField(default=0)
|
|
trigger_event = models.CharField(max_length=50, choices=[
|
|
('create', 'Create'), ('update', 'Update'), ('approve', 'Approve'),
|
|
('advance', 'Advance'), ('confirm', 'Confirm'), ('custom', 'Custom')
|
|
])
|
|
target_model = models.CharField(max_length=100, blank=True)
|
|
actions = JSONField(default=list, blank=True)
|
|
config = JSONField(default=dict, blank=True)
|
|
is_active = models.BooleanField(default=True)
|
|
create_time = models.DateTimeField(auto_now_add=True)
|
|
update_time = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = 'step_action'
|
|
ordering = ['order']
|
|
unique_together = ('workflow', 'step_code')
|
|
|
|
|
|
class Utility(models.Model):
|
|
code = models.CharField(max_length=50, unique=True)
|
|
name = models.CharField(max_length=200)
|
|
description = models.TextField(blank=True)
|
|
utility_type = models.CharField(max_length=50, choices=[
|
|
('email', 'Email API'), ('crud', 'Data CRUD'), ('payment', 'Payment API'),
|
|
('document', 'Document Gen'), ('notification', 'Notification'), ('custom', 'Custom')
|
|
])
|
|
api_config = JSONField(default=dict, blank=True)
|
|
params_template = JSONField(default=dict, blank=True)
|
|
integration_module = models.CharField(max_length=100, blank=True)
|
|
is_active = models.BooleanField(default=True)
|
|
create_time = models.DateTimeField(auto_now_add=True)
|
|
update_time = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = 'utility'
|
|
|
|
|
|
class Rule(models.Model):
|
|
step_action = models.ForeignKey(StepAction, on_delete=models.CASCADE, related_name='rules')
|
|
rule_code = models.CharField(max_length=50, unique=True)
|
|
name = models.CharField(max_length=200)
|
|
description = models.TextField(blank=True)
|
|
conditions = JSONField(default=list, blank=True)
|
|
constraints = JSONField(default=list, blank=True)
|
|
utility = models.ForeignKey(Utility, null=True, blank=True, on_delete=models.SET_NULL, related_name='rules')
|
|
is_active = models.BooleanField(default=True)
|
|
create_time = models.DateTimeField(auto_now_add=True)
|
|
update_time = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = 'rule'
|
|
unique_together = ('step_action', 'rule_code')
|
|
|
|
|
|
# ====================================================================================
|
|
# 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' |