254 lines
12 KiB
Python
254 lines
12 KiB
Python
|
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
|
|||
|
|
|||
|
@property
|
|||
|
def calculate_total_amount_including_tax(self):
|
|||
|
# 计算价税合计金额
|
|||
|
total_amount = sum(record.total_amount for record in self.invoicerecord_set.all())
|
|||
|
return total_amount
|
|||
|
|
|||
|
@property
|
|||
|
def calculate_repayment_amount(self):
|
|||
|
# 计算回款金额
|
|||
|
repayment_amount = sum(record.repayment_amount for record in self.repaymentrecord_set.all())
|
|||
|
return repayment_amount
|
|||
|
|
|||
|
|
|||
|
# 项目进度表
|
|||
|
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}"
|
|||
|
|
|||
|
|
|||
|
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}"
|