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}"