Files
api/app/models.py
anhduy-tech f76cd880e1 changes
2026-03-19 11:57:52 +07:00

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'