XH_Digital_Management/application/pjt_mgnt/models.py

242 lines
12 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from django.db import models
# 项目台账
class ProjectLedger(models.Model):
project_id = models.AutoField(primary_key=True, verbose_name='项目编号')
project_name = models.CharField(max_length=255, verbose_name='项目名称')
start_date = models.DateField(verbose_name='开始日期')
end_date = models.DateField(verbose_name='结束日期')
primary_department = models.CharField(max_length=255, verbose_name='一级部门')
customer_name = models.CharField(max_length=255, verbose_name='客户名称')
province = models.CharField(max_length=255, verbose_name='')
city = models.CharField(max_length=255, verbose_name='')
district = models.CharField(max_length=255, verbose_name='区县')
project_leader = models.CharField(max_length=255, verbose_name='负责人')
project_members = models.TextField(verbose_name='项目组员')
project_status = models.CharField(max_length=100,
choices=[('进行中', '进行中'), ('暂停', '暂停'), ('待收款', '待收款'),
('完成', '完成')], verbose_name='项目状态')
resource_type = models.CharField(max_length=50, choices=[('公司', '公司'), ('个人', '个人')],
verbose_name='资源类型')
project_nature = models.CharField(max_length=100,
choices=[('新增', '新增'), ('存量', '存量'), ('新增及存量', '新增及存量'),
('老客户新业务', '老客户新业务')], verbose_name='项目性质')
project_progress = models.CharField(max_length=255, verbose_name='项目进度')
contract_date = models.DateField(verbose_name='签约时间')
contract_amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='标的金额(元)')
contract_rate = models.DecimalField(max_digits=5, decimal_places=2, verbose_name='合同费率')
revenue = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='收入(元)')
cost_rate = models.DecimalField(max_digits=5, decimal_places=2, verbose_name='成本费率')
cost = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='成本(元)')
net_income = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='净收入(元)')
total_amount_including_tax = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='价税合计金额(元)')
repayment_amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='回款金额(元)')
receivable_net_income = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='应收净收入(元)')
actual_net_income = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='实收净收入(元)')
outstanding_net_income = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='待收净收入(元)')
notes = models.TextField(verbose_name='备注')
class Meta:
verbose_name = '项目台账'
verbose_name_plural = '项目台账'
def __str__(self):
return self.project_name
# 项目进度表
class ProjectProgress(models.Model):
record_id = models.AutoField(primary_key=True, verbose_name='记录ID')
project_id = models.ForeignKey(ProjectLedger, on_delete=models.CASCADE, verbose_name='项目编号')
flow_nodes = models.JSONField(verbose_name='进度点')
class Meta:
verbose_name = '项目进度表'
verbose_name_plural = '项目进度表'
def __str__(self):
return f"Record #{self.record_id} - Project: {self.project_id}"
# 项目进度设置表
class ProjectProgressSettings(models.Model):
config_id = models.AutoField(primary_key=True, verbose_name='配置ID')
project_type = models.CharField(max_length=255, verbose_name='项目类型', null=False, blank=False)
flow_nodes_setting = models.CharField(max_length=255, verbose_name='项目进度设置', null=False, blank=False,
help_text="项目进度设置示例:买菜;洗菜;切菜;烧菜;")
class Meta:
verbose_name = '项目进度设置表'
verbose_name_plural = '项目进度设置表'
def __str__(self):
return f"Config #{self.config_id} - Project Type: {self.project_type}"
# 项目问题记录表
class ProjectIssuesLog(models.Model):
issue_id = models.AutoField(primary_key=True, verbose_name='问题ID')
project_id = models.ForeignKey(ProjectLedger, on_delete=models.CASCADE, verbose_name='项目ID')
record_date = models.DateTimeField(verbose_name='记录时间', null=False, blank=False)
description = models.TextField(verbose_name='问题描述', null=False, blank=False)
handler = models.CharField(max_length=255, verbose_name='经办人', null=False, blank=False)
reference = models.TextField(verbose_name='参考依据', blank=True)
solution = models.TextField(verbose_name='解决方案', blank=True)
decision_maker = models.CharField(max_length=255, verbose_name='决策人', blank=True)
STATUS_CHOICES = [
('解决', '解决'),
('未解决', '未解决')
]
status = models.CharField(max_length=255, choices=STATUS_CHOICES, verbose_name='状态', null=False, blank=False)
class Meta:
verbose_name = '项目问题记录表'
verbose_name_plural = '项目问题记录表'
def __str__(self):
return f"Issue #{self.issue_id} - Project: {self.project_id.project_name}"
# 项目台账续表A
class ChildProjectLedgerA(models.Model):
project_id = models.OneToOneField(ProjectLedger, primary_key=True, on_delete=models.CASCADE,
verbose_name='项目编号')
PROJECT_TYPE_CHOICES = [
('cbc', 'cbc'),
('债拍', '债拍'),
('其他', '其他')
]
project_type = models.CharField(max_length=255, choices=PROJECT_TYPE_CHOICES, verbose_name='项目类型')
resource_party = models.CharField(max_length=255, verbose_name='资源方')
cooperation_party = models.CharField(max_length=255, verbose_name='合作方')
transaction_amount = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='成交金额(元)')
target_amount = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='标的金额(元)')
@property
def contract_completion_rate(self):
if self.target_amount != 0:
return round((self.transaction_amount / self.target_amount) * 100, 2)
else:
return None
class Meta:
verbose_name = '项目台账续表A'
verbose_name_plural = '项目台账续表A'
def __str__(self):
return f"Project #{self.project_id} - Type: {self.project_type}"
# 项目台账续表B
class ChildProjectLedgerB(models.Model):
project_id = models.OneToOneField(ProjectLedger, primary_key=True, on_delete=models.CASCADE,
verbose_name='项目编号')
PROJECT_TYPE_CHOICES = [
('承销', '承销'),
('贸易', '贸易'),
('其他', '其他')
]
project_type = models.CharField(max_length=255, choices=PROJECT_TYPE_CHOICES, verbose_name='项目类型')
partner = models.CharField(max_length=255, verbose_name='合作方')
start_interest_date = models.DateField(verbose_name='起息日期')
interest_payment_date = models.DateField(verbose_name='付息日期')
number_of_people = models.IntegerField(verbose_name='人数')
amount = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='金额')
class Meta:
verbose_name = '项目台账续表B'
verbose_name_plural = '项目台账续表B'
def __str__(self):
return f"Project #{self.project_id} - Type: {self.project_type}"
# 项目台账续表C
class ChildProjectLedgerC(models.Model):
project_id = models.OneToOneField(ProjectLedger, primary_key=True, on_delete=models.CASCADE,
verbose_name='项目编号')
PROJECT_TYPE_CHOICES = [
('咨询', '咨询'),
('科技', '科技'),
('新媒体', '新媒体'),
('其他', '其他')
]
project_type = models.CharField(max_length=100, choices=PROJECT_TYPE_CHOICES, verbose_name='项目类型')
resource_party = models.CharField(max_length=255, verbose_name='资源方')
cooperation_party = models.CharField(max_length=255, verbose_name='合作方')
service_period = models.CharField(max_length=100, verbose_name='服务周期')
class Meta:
verbose_name = '项目台账续表C'
verbose_name_plural = '项目台账续表C'
def __str__(self):
return f"Project #{self.project_id} - Type: {self.project_type}"
# 项目台账续表D
class ChildProjectLedgerD(models.Model):
project_id = models.OneToOneField(ProjectLedger, primary_key=True, on_delete=models.CASCADE,
verbose_name='项目编号')
PROJECT_TYPE_CHOICES = [
('非标', '非标'),
('贸易', '贸易'),
('其他', '其他')
]
project_type = models.CharField(max_length=50, choices=PROJECT_TYPE_CHOICES, verbose_name='项目类型')
capital_demand_party = models.CharField(max_length=255, verbose_name='资金需求方', blank=True)
capital_provider = models.CharField(max_length=255, verbose_name='资金提供方', blank=True)
financing_method = models.CharField(max_length=255, verbose_name='融资方式', blank=True)
target_amount = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='标的金额(元)', blank=True, null=True)
term = models.CharField(max_length=100, verbose_name='期限', blank=True)
nominal_rate = models.DecimalField(max_digits=5, decimal_places=2, verbose_name='票面利率', blank=True, null=True)
total_cost = models.DecimalField(max_digits=5, decimal_places=2, verbose_name='综合成本(元)', blank=True, null=True)
TRADE_TYPE_CHOICES = [
('带量', '带量'),
('取信', '取信'),
('补票', '补票')
]
trade_type = models.CharField(max_length=50, choices=TRADE_TYPE_CHOICES, verbose_name='贸易类型', blank=True)
trade_entity = models.CharField(max_length=255, verbose_name='贸易主体', blank=True)
trade_service_provider = models.CharField(max_length=255, verbose_name='贸易服务商', blank=True)
trade_variety = models.CharField(max_length=255, verbose_name='贸易品种', blank=True)
demand_party = models.CharField(max_length=255, verbose_name='需求方', blank=True)
supply_party = models.CharField(max_length=255, verbose_name='供给方', blank=True)
class Meta:
verbose_name = '项目台账续表D'
verbose_name_plural = '项目台账续表D'
def __str__(self):
return f"Project #{self.project_id} - Type: {self.project_type}"
# 项目组员收入结算表
class EmployeeProjectIncomeSettlement(models.Model):
record_id = models.AutoField(primary_key=True, verbose_name='记录ID')
project_name = models.ForeignKey(ProjectLedger, on_delete=models.CASCADE, verbose_name='项目名称')
year_month = models.CharField(max_length=7, verbose_name='年月', help_text='格式为 YYYY-MM从开票记录中关联')
class Meta:
verbose_name = '项目组员收入结算表'
verbose_name_plural = '项目组员收入结算表'
def __str__(self):
return f"Record #{self.record_id} - Project: {self.project_name}, Year-Month: {self.year_month}"
# 项目组员收入详情表
class EmployeeIncome(models.Model):
employee_settlement = models.ForeignKey(EmployeeProjectIncomeSettlement, on_delete=models.CASCADE,
related_name='employee_income_settlements', verbose_name='员工收入结算')
name = models.CharField(max_length=255, verbose_name='姓名')
contribution_rate = models.DecimalField(max_digits=5, decimal_places=2, verbose_name='贡献率')
sales_income = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='销售收入(元)')
class Meta:
verbose_name = '项目组员收入详情表'
verbose_name_plural = '项目组员收入详情表'
def __str__(self):
return f"Employee: {self.name} - Sales Income: {self.sales_income}"