2094 lines
86 KiB
Python
2094 lines
86 KiB
Python
from django.db import models
|
|
import uuid
|
|
from django.db.models import JSONField
|
|
|
|
# Create your models here.
|
|
|
|
#====================================================================================
|
|
def generate_increment_code(model_class, prefix="CODE", padding=4, code_field="code"):
|
|
"""
|
|
model_class: Model sẽ sinh mã (ví dụ Customer, Product,...)
|
|
prefix: tiền tố (CUS, PRD...)
|
|
padding: số lượng chữ số (0001, 0010...)
|
|
code_field: tên trường lưu mã
|
|
"""
|
|
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)
|
|
|
|
|
|
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 Duration(models.Model):
|
|
code = models.CharField(max_length=30, null=False, unique=True)
|
|
name = models.CharField(max_length=100, null=False)
|
|
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 = 'duration'
|
|
|
|
|
|
class Ownership_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 = 'ownership_type'
|
|
|
|
|
|
class Transaction_Type(models.Model):
|
|
code = models.CharField(max_length=30, null=False, unique=True)
|
|
name = models.CharField(max_length=100, null=False)
|
|
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 = 'transaction_type'
|
|
|
|
|
|
class Transaction_Status(models.Model):
|
|
code = models.CharField(max_length=30, null=False, unique=True)
|
|
name = models.CharField(max_length=100, null=False)
|
|
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 = 'transaction_status'
|
|
|
|
|
|
class Project_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)
|
|
update_time = models.DateTimeField(null=True, auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = 'project_status'
|
|
|
|
|
|
class Sale_Status(models.Model):
|
|
code = models.CharField(max_length=30, null=False, unique=True)
|
|
name = models.CharField(max_length=100, null=False)
|
|
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)
|
|
update_time = models.DateTimeField(null=True, auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = 'sale_status'
|
|
|
|
|
|
class Product_Status(models.Model):
|
|
code = models.CharField(max_length=30, null=False, unique=True)
|
|
name = models.CharField(max_length=100, null=False)
|
|
color = models.CharField(max_length=20, null=True)
|
|
index = models.IntegerField(null=True, default=1)
|
|
sale_status = models.ForeignKey(Sale_Status, 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 = 'product_status'
|
|
|
|
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 Investor(models.Model):
|
|
name = models.CharField(max_length=255)
|
|
tax_code = models.CharField(max_length=20, null=False)
|
|
address = models.TextField(null=False)
|
|
phone = models.CharField(max_length=15, null=True)
|
|
email = models.CharField(max_length=50, null=True)
|
|
bank_account = models.CharField(max_length=20, null=True)
|
|
bank_name = models.CharField(max_length=100, null=True)
|
|
representative = models.CharField(max_length=100, null=True)
|
|
website = models.URLField(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 = 'investor'
|
|
|
|
|
|
class Project(models.Model):
|
|
code = models.CharField(max_length=20, unique=True)
|
|
name = models.CharField(max_length=255)
|
|
investor = models.ForeignKey(Investor, null=False, related_name='+', on_delete=models.PROTECT)
|
|
status = models.ForeignKey(Project_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 = 'project'
|
|
|
|
|
|
class Zone_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 = 'zone_type'
|
|
|
|
|
|
class Product_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 = 'product_type'
|
|
|
|
|
|
class Land_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 = 'land_type'
|
|
|
|
|
|
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 Direction(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 = 'direction'
|
|
|
|
|
|
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_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)
|
|
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 Sale_Policy(models.Model):
|
|
code = models.CharField(max_length=30, null=False, unique=True)
|
|
name = models.CharField(max_length=100, null=False)
|
|
deposit = models.DecimalField(max_digits=15, decimal_places=2)
|
|
method = models.ForeignKey(Payment_Method, null=False, related_name='+', on_delete=models.PROTECT)
|
|
enable = models.BooleanField(default=True)
|
|
contract_allocation_percentage = models.IntegerField(null=True,blank=True,default=100)
|
|
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 = 'sale_policy'
|
|
|
|
|
|
class Payment_Plan(models.Model):
|
|
policy = models.ForeignKey(Sale_Policy, null=False, related_name='+', on_delete=models.PROTECT)
|
|
cycle = models.IntegerField()
|
|
value = models.IntegerField()
|
|
type = models.ForeignKey(Value_Type, null=False, related_name='+', on_delete=models.PROTECT)
|
|
days = models.IntegerField()
|
|
payment_note = models.TextField()
|
|
due_note = models.TextField()
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
update_time = models.DateTimeField(null=True, auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = 'payment_plan'
|
|
unique_together = ('policy', 'cycle')
|
|
|
|
|
|
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)
|
|
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'
|
|
|
|
|
|
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 Dealer(AutoCodeModel):
|
|
code_prefix = "DL"
|
|
code_padding = 2
|
|
code = models.CharField(max_length=20, null=True, unique=True)
|
|
user = models.OneToOneField(User, null=True, related_name='dealer_profile', on_delete=models.SET_NULL)
|
|
name = models.CharField(max_length=100, null=False)
|
|
phone = models.CharField(max_length=20, null=True, db_index=True)
|
|
email = models.CharField(max_length=50, null=True)
|
|
address = models.CharField(max_length=255, 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 = 'dealer'
|
|
|
|
|
|
class Cart(AutoCodeModel):
|
|
code_prefix = "GH"
|
|
code_padding = 3
|
|
code = models.CharField(max_length=20, null=True, unique=True)
|
|
name = models.CharField(max_length=255)
|
|
dealer = models.ForeignKey(Dealer, 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 = 'cart'
|
|
|
|
|
|
class Product(AutoCodeModel):
|
|
code_prefix = "SP"
|
|
code_padding = 5
|
|
code = models.CharField(max_length=20, null=True, unique=True)
|
|
land_lot_code = models.CharField(max_length=255)
|
|
zone_code = models.CharField(max_length=255)
|
|
trade_code = models.CharField(max_length=20, null=True)
|
|
zone_type = models.ForeignKey(Zone_Type, null=False, related_name='+', on_delete=models.PROTECT)
|
|
lot_area = models.DecimalField(max_digits=15, decimal_places=2)
|
|
building_area = models.DecimalField(max_digits=15, decimal_places=2)
|
|
total_built_area = models.DecimalField(max_digits=15, decimal_places=2)
|
|
number_of_floors = models.IntegerField()
|
|
land_lot_size = models.CharField(max_length=255)
|
|
direction = models.ForeignKey(Direction, null=False, related_name='+', on_delete=models.PROTECT)
|
|
villa_model = models.CharField(max_length=255, null=True)
|
|
type = models.ForeignKey(Product_Type, null=False, related_name='+', on_delete=models.PROTECT)
|
|
project = models.ForeignKey(Project, null=False, related_name='+', on_delete=models.PROTECT)
|
|
status = models.ForeignKey(Product_Status, null=False, related_name='+', on_delete=models.PROTECT)
|
|
cart = models.ForeignKey(Cart, null=True, related_name='prdcart', on_delete=models.PROTECT)
|
|
dealer = models.ForeignKey(Dealer, null=True, related_name='+', on_delete=models.PROTECT)
|
|
policy = models.ForeignKey(Sale_Policy, null=True, related_name='+', on_delete=models.PROTECT)
|
|
note = models.TextField(null=True)
|
|
origin_price = models.DecimalField(max_digits=15, decimal_places=2, null=True)
|
|
product_type = models.CharField(max_length=255, null=True)
|
|
template_name = models.CharField(max_length=255, null=True)
|
|
link = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, null=True)
|
|
locked_until = 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 = 'product'
|
|
|
|
|
|
class Product_File(models.Model):
|
|
product = models.ForeignKey(Product, null=False, related_name='prdfile', 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 = 'product_file'
|
|
unique_together = ('product', 'file')
|
|
|
|
|
|
class Project_File(models.Model):
|
|
project = models.ForeignKey(Project, null=False, related_name='prjfile', 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 = 'project_file'
|
|
unique_together = ('project', 'file')
|
|
|
|
|
|
class Product_Note(models.Model):
|
|
ref = models.ForeignKey(Product, null=False, related_name='prdnote', on_delete=models.PROTECT)
|
|
detail = models.TextField()
|
|
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 = 'product_note'
|
|
|
|
|
|
class News(models.Model):
|
|
title = models.CharField(max_length=200, null=False)
|
|
subtitle = models.CharField(max_length=500, null=False)
|
|
image = models.CharField(max_length=300, null=False)
|
|
header = models.JSONField(null=True)
|
|
content = models.JSONField(null=True)
|
|
link = models.CharField(max_length=200, null=True)
|
|
canonical = models.CharField(max_length=200, null=True)
|
|
category = models.ForeignKey(Category, null=False, related_name='+', on_delete=models.PROTECT)
|
|
status = models.ForeignKey(Display_Status, null=False, related_name='+', on_delete=models.PROTECT)
|
|
language = models.ForeignKey(Lang_Choice, null=False, related_name='+', on_delete=models.PROTECT)
|
|
valid_from = models.DateTimeField(null=True)
|
|
valid_to = models.DateTimeField(null=True)
|
|
user = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT)
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
update_time = models.DateTimeField(null=True, auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = 'news'
|
|
|
|
|
|
class Message_Type(models.Model):
|
|
code = models.CharField(max_length=30, null=False, unique=True)
|
|
title = models.CharField(max_length=200, null=True)
|
|
title_en = models.CharField(max_length=200, null=True)
|
|
content = models.TextField(null=False)
|
|
content_en = models.TextField(null=False)
|
|
category = models.CharField(max_length=50, null=False)
|
|
link = models.TextField(null=True)
|
|
index = models.IntegerField(null=True, default=1)
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
update_time = models.DateTimeField(null=True, auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = 'message_type'
|
|
|
|
|
|
class Message(models.Model):
|
|
code = models.CharField(max_length=30, null=False, unique=True)
|
|
ref_code = models.CharField(max_length=20, null=False)
|
|
type = models.ForeignKey(Message_Type, null=False, related_name='+', on_delete=models.PROTECT)
|
|
title = models.CharField(max_length=200, null=True)
|
|
title_en = models.CharField(max_length=200, null=True)
|
|
content = models.TextField(null=False)
|
|
content_en = models.TextField(null=False)
|
|
link = models.TextField(null=True)
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
update_time = models.DateTimeField(null=True, auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = 'message'
|
|
|
|
|
|
class Message_Receiver(models.Model):
|
|
message = models.ForeignKey(Message, null=False, related_name='msgrecv', on_delete=models.PROTECT)
|
|
user = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT)
|
|
status = models.ForeignKey(Notification_Status, null=False, related_name='+', on_delete=models.PROTECT, default=1)
|
|
seen = models.BooleanField(default=False)
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
update_time = models.DateTimeField(null=True, auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = 'message_receiver'
|
|
unique_together = ('message', 'user')
|
|
|
|
|
|
class Schedule_Type(models.Model):
|
|
code = models.CharField(max_length=30, null=False, unique=True)
|
|
name = models.CharField(max_length=100, null=False)
|
|
en = models.CharField(max_length=100, null=True)
|
|
index = models.IntegerField(null=True, default=1)
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
|
|
class Meta:
|
|
db_table = 'schedule_type'
|
|
|
|
|
|
class Cycle_Type(models.Model):
|
|
code = models.CharField(max_length=30, null=False, unique=True)
|
|
name = models.CharField(max_length=100, null=False)
|
|
en = models.CharField(max_length=100, null=True)
|
|
index = models.IntegerField(null=True, default=1)
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
|
|
class Meta:
|
|
db_table = 'cycle_type'
|
|
|
|
|
|
class Task_Category(models.Model):
|
|
code = models.CharField(max_length=30, null=False, unique=True)
|
|
name = models.CharField(max_length=100, null=False)
|
|
en = models.CharField(max_length=100, null=True)
|
|
index = models.IntegerField(null=True, default=1)
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
|
|
class Meta:
|
|
db_table = 'task_category'
|
|
|
|
|
|
class Task_Result(models.Model):
|
|
code = models.CharField(max_length=30, null=False, unique=True)
|
|
name = models.CharField(max_length=100, null=False)
|
|
en = models.CharField(max_length=100, null=True)
|
|
index = models.IntegerField(null=True, default=1)
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
|
|
class Meta:
|
|
db_table = 'task_result'
|
|
|
|
|
|
class Alert_Type(models.Model):
|
|
code = models.CharField(max_length=30, null=False, unique=True)
|
|
name = models.CharField(max_length=100, null=False)
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
|
|
class Meta:
|
|
db_table = 'alert_type'
|
|
|
|
|
|
class Script_Type(models.Model):
|
|
code = models.CharField(max_length=30, null=False, unique=True)
|
|
name = models.CharField(max_length=100, null=False)
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
|
|
class Meta:
|
|
db_table = 'script_type'
|
|
|
|
|
|
class Noti_Theme(models.Model):
|
|
title = models.TextField(null=True)
|
|
content = models.TextField(null=True)
|
|
image = models.CharField(max_length=200, null=True)
|
|
link = models.TextField(null=True)
|
|
receiver = models.JSONField(null=True)
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
update_time = models.DateTimeField(null=True)
|
|
|
|
class Meta:
|
|
db_table = 'noti_theme'
|
|
|
|
|
|
class Group(models.Model):
|
|
creator = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT)
|
|
name = models.CharField(max_length=100, null=False)
|
|
note = models.TextField(null=True)
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
update_time = models.DateTimeField(null=True, auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = 'group'
|
|
unique_together = ('creator', 'name')
|
|
|
|
|
|
class User_Group(models.Model):
|
|
group = models.ForeignKey(Group, null=False, related_name='grus', on_delete=models.PROTECT)
|
|
user = models.ForeignKey(User, null=False, related_name='usgr', on_delete=models.PROTECT)
|
|
deleted = models.BooleanField(default=False)
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
update_time = models.DateTimeField(null=True, auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = 'user_group'
|
|
unique_together = ('group', 'user')
|
|
|
|
|
|
#===================================================================
|
|
class User_Session(models.Model):
|
|
token = models.ForeignKey(Token, null=False, related_name='userlog', on_delete=models.PROTECT)
|
|
session = models.BigIntegerField(null=False)
|
|
start_time = models.DateTimeField(null=False)
|
|
end_time = models.DateTimeField(null=True)
|
|
duration = models.IntegerField(null=True)
|
|
click_count = models.IntegerField(null=True)
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
update_time = models.DateTimeField(null=True, auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = 'user_session'
|
|
|
|
|
|
#===================================================================
|
|
class User_Log(models.Model):
|
|
session = models.ForeignKey(User_Session, null=False, related_name='+', on_delete=models.PROTECT)
|
|
link = models.TextField(null=False)
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
|
|
class Meta:
|
|
db_table = 'user_log'
|
|
|
|
|
|
class Biz_Setting(models.Model):
|
|
category = models.CharField(max_length=100, null=False)
|
|
classify = models.CharField(max_length=100, null=False)
|
|
code = models.CharField(max_length=100, null = False)
|
|
vi = models.TextField(null=False)
|
|
en = models.TextField(null=True)
|
|
image = models.TextField(null=True)
|
|
icon = models.TextField(null=True)
|
|
link = models.TextField(null=True)
|
|
detail = models.JSONField(null=True)
|
|
detail_en = models.JSONField(null=True)
|
|
index = models.IntegerField(null=True, default=0)
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
|
|
class Meta:
|
|
db_table = 'biz_setting'
|
|
unique_together = ('category', 'classify', 'code')
|
|
|
|
class Dealer_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 = 'dealer_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 Dealer_Rights(models.Model):
|
|
setting = models.ForeignKey(Dealer_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 = 'dealer_rights'
|
|
unique_together = ('setting', 'user')
|
|
|
|
|
|
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 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)
|
|
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 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 Transaction_Phase(models.Model):
|
|
code = models.CharField(max_length=30, null=True, unique=True)
|
|
name = models.CharField(max_length=100, null=False)
|
|
color = models.IntegerField(null=True)
|
|
index = models.IntegerField(null=True, default=1)
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
|
|
class Meta:
|
|
db_table = 'transaction_phase'
|
|
|
|
|
|
class Phase_Doctype(models.Model):
|
|
phase = models.ForeignKey(Transaction_Phase, null=False, related_name='phasedoc', on_delete=models.PROTECT)
|
|
doctype = models.ForeignKey(Document_Type, 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 = 'phase_doctype'
|
|
|
|
|
|
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)
|
|
dealer = models.ForeignKey(Dealer, 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=False)
|
|
established_date = models.DateField()
|
|
tax_code = models.CharField(max_length=20, 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 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 Transaction(AutoCodeModel):
|
|
code_prefix = "GD"
|
|
code_padding = 5
|
|
code = models.CharField(max_length=30, null=True, unique=True)
|
|
customer = models.ForeignKey(Customer, null=False, related_name='txncust', on_delete=models.PROTECT)
|
|
product = models.ForeignKey(Product, null=False, related_name='txnprd', on_delete=models.PROTECT)
|
|
policy = models.ForeignKey(Sale_Policy, null=False, related_name='txnplc', on_delete=models.PROTECT)
|
|
phase = models.ForeignKey(Transaction_Phase, null=False, related_name='+', on_delete=models.PROTECT)
|
|
date = models.DateField()
|
|
origin_price = models.DecimalField(max_digits=15, decimal_places=2, null=True)
|
|
discount_amount = models.DecimalField(max_digits=15, decimal_places=2, null=True)
|
|
sale_price = models.DecimalField(max_digits=15, decimal_places=2, null=True)
|
|
deposit_amount = models.DecimalField(max_digits=15, decimal_places=2, null=True)
|
|
deposit_received = models.DecimalField(max_digits=15, decimal_places=2, null=True)
|
|
deposit_remaining = models.DecimalField(max_digits=15, decimal_places=2, null=True)
|
|
amount_received = models.DecimalField(max_digits=15, decimal_places=2, null=True)
|
|
amount_remain = models.DecimalField(max_digits=15, decimal_places=2, null=True)
|
|
ovd_days = models.IntegerField(null=True)
|
|
penalty_amount = models.DecimalField(null=True, max_digits=15, decimal_places=2)
|
|
payment_plan = 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 = 'transaction'
|
|
|
|
|
|
class Transaction_Detail(AutoCodeModel):
|
|
code_prefix = "CT"
|
|
code_padding = 5
|
|
code = models.CharField(max_length=30, null=True, unique=True)
|
|
date = models.DateField()
|
|
amount = models.DecimalField(max_digits=15, decimal_places=2, null=True)
|
|
amount_remaining = models.DecimalField(max_digits=15, decimal_places=2, null=True)
|
|
amount_received = models.DecimalField(max_digits=15, decimal_places=2, null=True)
|
|
due_date = models.DateField(null=True)
|
|
transaction = models.ForeignKey(Transaction, null=False, related_name='resvtxn', on_delete=models.PROTECT)
|
|
phase = models.ForeignKey(Transaction_Phase, null=False, related_name='+', on_delete=models.PROTECT)
|
|
creator = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT)
|
|
status = models.ForeignKey(Transaction_Status, null=True, related_name='+', on_delete=models.PROTECT, default=1)
|
|
approver = models.ForeignKey(User, null=True, related_name='+', on_delete=models.PROTECT)
|
|
approve_time = models.DateTimeField(null=True)
|
|
amount_recived = models.DecimalField(max_digits=15, decimal_places=2, 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 = 'transaction_detail'
|
|
|
|
|
|
class Transaction_File(models.Model):
|
|
txn_detail = models.ForeignKey(Transaction_Detail, null=False, related_name='txnfile', 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 = 'transaction_file'
|
|
unique_together = ('txn_detail', 'file')
|
|
|
|
|
|
class Product_Booked(models.Model):
|
|
product = models.OneToOneField(Product, null=False, related_name='prdbk', on_delete=models.PROTECT)
|
|
transaction = models.ForeignKey(Transaction, 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 = 'product_booked'
|
|
unique_together = ('product', 'transaction')
|
|
|
|
|
|
class Contract_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)
|
|
update_time = models.DateTimeField(null=True, auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = 'contract_status'
|
|
|
|
|
|
class Contract(models.Model):
|
|
transaction = models.ForeignKey(Transaction, null=False, related_name='+', on_delete=models.PROTECT)
|
|
signature = models.ForeignKey(File, null=True, related_name='+', on_delete=models.PROTECT)
|
|
status = models.ForeignKey(Contract_Status, null=True, related_name='+', on_delete=models.PROTECT, default=1)
|
|
user = models.ForeignKey(User, null=True, related_name='+', on_delete=models.PROTECT)
|
|
link = models.UUIDField(default=uuid.uuid4, editable=False, unique=False, null=True)
|
|
document = 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 = 'contract'
|
|
|
|
|
|
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 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)
|
|
customer = models.ForeignKey(Customer, null=True, related_name='+', on_delete=models.PROTECT)
|
|
product = models.ForeignKey(Product, 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 = 'internal_entry'
|
|
|
|
|
|
class Entry_File(models.Model):
|
|
ref = models.ForeignKey(Internal_Entry, null=False, related_name='entryfile', on_delete=models.PROTECT)
|
|
file = models.ForeignKey(File, null=False, related_name='+', on_delete=models.PROTECT)
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
|
|
class Meta:
|
|
db_table = 'entry_file'
|
|
unique_together = ('ref', 'file')
|
|
|
|
|
|
class Payment_Schedule(AutoCodeModel):
|
|
code_prefix = "SH"
|
|
code_padding = 5
|
|
code = models.CharField(max_length=30, null=True, unique=True)
|
|
from_date = models.DateField(null=False)
|
|
to_date = models.DateField(null=False)
|
|
amount = models.DecimalField(max_digits=15, decimal_places=2)
|
|
paid_amount = models.DecimalField(null=True, max_digits=15, decimal_places=2)
|
|
remain_amount = models.DecimalField(null=True, max_digits=15, decimal_places=2)
|
|
cycle = models.IntegerField(null=False)
|
|
cycle_days = models.IntegerField(null=False)
|
|
txn_detail = models.ForeignKey(Transaction_Detail, null=False, related_name='psh', on_delete=models.PROTECT)
|
|
type = models.ForeignKey(Payment_Type, null=False, related_name='+', on_delete=models.PROTECT)
|
|
status = models.ForeignKey(Payment_Status, null=False, related_name='+', on_delete=models.PROTECT)
|
|
updater = models.ForeignKey(User, null=False, related_name='+', on_delete=models.PROTECT)
|
|
entry = models.ForeignKey(Internal_Entry, null=True, related_name='+', on_delete=models.PROTECT)
|
|
detail = models.JSONField(null=True)
|
|
ovd_days = models.IntegerField(null=True)
|
|
penalty_amount = models.DecimalField(null=True, max_digits=15, decimal_places=2)
|
|
create_time = models.DateTimeField(null=True, auto_now_add=True)
|
|
update_time = models.DateTimeField(null=True, auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = 'payment_schedule'
|
|
|
|
|
|
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 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 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.Transaction_Detail")
|
|
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'
|
|
|
|
class Transaction_Discount(models.Model):
|
|
transaction = models.ForeignKey(Transaction, null=False, related_name='txndiscount', 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=15, decimal_places=2, 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 = 'transaction_discount'
|
|
unique_together = ('transaction', 'discount')
|
|
|
|
|
|
class Co_Ownership(models.Model):
|
|
transaction = models.ForeignKey(Transaction, null=False, related_name='co_op', on_delete=models.PROTECT)
|
|
people = models.ForeignKey(People, 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 = 'co_ownership'
|
|
unique_together = ('transaction', 'people')
|
|
|
|
class Workflow(models.Model):
|
|
"""
|
|
Bảng Workflow: Quản lý các luồng chính (multi-flow cho dự án).
|
|
Ví dụ: 'RESERVATION' cho giữ chỗ, 'LOAN_APPROVAL' cho duyệt vay.
|
|
"""
|
|
code = models.CharField(max_length=50, unique=True) # e.g., 'RESERVATION'
|
|
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'
|
|
verbose_name = 'Workflow'
|
|
verbose_name_plural = 'Workflows'
|
|
|
|
def __str__(self):
|
|
return f"{self.name} ({self.code})"
|
|
|
|
class StepAction(models.Model):
|
|
"""
|
|
Bảng Step/Action: Định nghĩa các bước/hành động trong Workflow.
|
|
Liên kết với Workflow, lưu chi tiết actions (JSON: list of dicts).
|
|
Ví dụ: Step 'create_reservation' có actions: [{'type': 'create_record', 'model': 'app.Transaction', 'fields': {...}}]
|
|
"""
|
|
workflow = models.ForeignKey(Workflow, on_delete=models.CASCADE, related_name='steps')
|
|
step_code = models.CharField(max_length=50, unique=True) # e.g., 'create_reservation', 'approve_detail'
|
|
name = models.CharField(max_length=200)
|
|
description = models.TextField(blank=True)
|
|
order = models.PositiveIntegerField(default=0) # Thứ tự chạy trong workflow
|
|
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, help_text="Model chính, e.g., 'app.Transaction'")
|
|
# Actions: List chi tiết hành động (dynamic, multi-model)
|
|
actions = JSONField(default=list, blank=True) # e.g., [{'type': 'create_record', 'model': 'app.Product', 'fields': {'status': 'reserved'}}]
|
|
# Config extra: e.g., {'auto_advance': True, 'required_fields': ['customer_id']}
|
|
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')
|
|
verbose_name = 'Step/Action'
|
|
verbose_name_plural = 'Steps/Actions'
|
|
|
|
def __str__(self):
|
|
return f"{self.workflow.name} - {self.name} ({self.step_code})"
|
|
|
|
class Rule(models.Model):
|
|
"""
|
|
Bảng Rule: Định nghĩa điều kiện (conditions) và quy luật ràng buộc cho Step/Action.
|
|
Liên kết với StepAction, dùng cho validation/constraints.
|
|
Ví dụ: Condition: {'field': 'a_a', 'operator': '==', 'value': 'specific_value'} → Chỉ thực hiện nếu match.
|
|
Constraint: {'after_action': 'create_record', 'must_update': {'model': 'app.Product', 'field': 'status', 'to': 'reserved'}}
|
|
"""
|
|
step_action = models.ForeignKey(StepAction, on_delete=models.CASCADE, related_name='rules')
|
|
rule_code = models.CharField(max_length=50, unique=True) # e.g., 'validate_customer_vip'
|
|
name = models.CharField(max_length=200)
|
|
description = models.TextField(blank=True)
|
|
# Conditions: List conditions để check trước action
|
|
conditions = JSONField(default=list, blank=True) # e.g., [
|
|
# {'field': 'customer__segment__code', 'operator': '==', 'value': 'VIP', 'related_model': 'app.Customer'},
|
|
# {'field': 'amount', 'operator': '>=', 'value': 1000000}]
|
|
# Constraints: Quy luật sau/before action (ràng buộc)
|
|
constraints = JSONField(default=list, blank=True) # e.g., [
|
|
# {'trigger': 'after_create', 'type': 'must_update', 'model': 'app.Transaction_Detail', 'fields': {'status': 'new'}},
|
|
# {'trigger': 'before_approve', 'type': 'require_approval', 'min_count': 2}]
|
|
# Utility linkage: Liên kết với Utility nếu cần reuse
|
|
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')
|
|
verbose_name = 'Rule'
|
|
verbose_name_plural = 'Rules'
|
|
|
|
def __str__(self):
|
|
return f"{self.step_action.name} - {self.name} ({self.rule_code})"
|
|
|
|
class Utility(models.Model):
|
|
"""
|
|
Bảng Utility: Chứa các action có sẵn, liên kết với hệ thống khác (e.g., API mail, CRUD data).
|
|
Dùng để reuse trong StepAction/Rule (e.g., gửi mail → gọi send_email API; create record → gọi /data/ endpoint).
|
|
"""
|
|
code = models.CharField(max_length=50, unique=True) # e.g., 'SEND_EMAIL', 'CRUD_DATA'
|
|
name = models.CharField(max_length=200)
|
|
description = models.TextField(blank=True)
|
|
# Type: Phân loại utility (e.g., 'email', 'crud', 'payment')
|
|
utility_type = models.CharField(max_length=50, choices=[
|
|
('email', 'Email API'), ('crud', 'Data CRUD'), ('payment', 'Payment API'),
|
|
('document', 'Document Gen'), ('notification', 'Notification'), ('custom', 'Custom')
|
|
])
|
|
# Endpoint/API linkage: e.g., {'url': '/send-email/', 'method': 'POST', 'params': {'template': '[template]'}}
|
|
api_config = JSONField(default=dict, blank=True) # Config gọi API (dynamic placeholders như [user_id])
|
|
# Params template: Mẫu params khi gọi
|
|
params_template = JSONField(default=dict, blank=True) # e.g., {'receiver': '[customer_email]', 'subject': 'Approval'}
|
|
# External integration: e.g., liên kết với Email_Job hoặc account_entry_api
|
|
integration_module = models.CharField(max_length=100, blank=True, help_text="e.g., 'app.email.send_email'")
|
|
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'
|
|
verbose_name = 'Utility'
|
|
verbose_name_plural = 'Utilities'
|
|
|
|
def __str__(self):
|
|
return f"{self.name} ({self.code}) - Type: {self.utility_type}" |