XH_Digital_Management/application/fac_mgnt/models.py

327 lines
18 KiB
Python
Raw Normal View History

from django.db import models
from application.pjt_mgnt.models import ProjectLedger
# 费用类型表
class ExpenseType(models.Model):
EXPENSE_TYPE_CHOICES = [
('差旅费', '差旅费'),
('办公费', '办公费'),
('办公费', '办公费')
]
type_id = models.AutoField(primary_key=True, verbose_name='费用类型ID')
expense_type = models.CharField(max_length=255, choices=EXPENSE_TYPE_CHOICES, verbose_name='费用类型')
class Meta:
verbose_name = '费用类型'
verbose_name_plural = '费用类型表'
def __str__(self):
return self.expense_type
# 费用明细表
class ExpenseDetail(models.Model):
EXPENSE_TYPE_CHOICES = [
('工资', '工资'),
('社保', '社保'),
('公积金', '公积金')
]
detail_id = models.AutoField(primary_key=True, verbose_name='明细ID')
type_id = models.ForeignKey(ExpenseType, on_delete=models.CASCADE, verbose_name='费用类型ID')
expense_detail = models.CharField(max_length=255, choices=EXPENSE_TYPE_CHOICES, verbose_name='费用明细')
class Meta:
verbose_name = '费用明细'
verbose_name_plural = '费用明细表'
def __str__(self):
return self.expense_detail
# 集团年度预算表
class GroupAnnualBudget(models.Model):
budget_id = models.AutoField(primary_key=True, verbose_name='记录ID')
primary_department = models.CharField(max_length=255, verbose_name='一级部门')
year = models.IntegerField(verbose_name='年份', null=False, blank=False)
expense_type = models.ForeignKey(ExpenseType, on_delete=models.CASCADE, verbose_name='费用类型', null=False,
blank=False)
expense_detail = models.ForeignKey(ExpenseDetail, on_delete=models.CASCADE, verbose_name='费用明细', null=False,
blank=False)
amount = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='金额(元)')
class Meta:
verbose_name = '集团年度预算表'
verbose_name_plural = '集团年度预算表'
def __str__(self):
return f"{self.primary_department} - {self.year}"
# 人工费明细表
class LaborCostDetail(models.Model):
record_id = models.AutoField(primary_key=True, verbose_name='记录ID')
year_month = models.CharField(max_length=7, verbose_name='年月', help_text='格式为YYYY-MM表示记录的年月')
name = models.CharField(max_length=255, verbose_name='姓名', null=False, blank=False)
primary_department = models.CharField(max_length=255, verbose_name='一级部门', null=False, blank=False)
secondary_department = models.CharField(max_length=255, verbose_name='二级部门', null=False, blank=False)
attendance_days = models.IntegerField(verbose_name='出勤天数', null=False, blank=False)
gross_salary = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='应发工资', null=False,
blank=False)
attendance_reward = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='全勤奖', null=True,
blank=True)
lunch_allowance = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='午餐津贴', null=True,
blank=True)
other_monetary_benefits = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='其他货币性福利',
null=True, blank=True)
social_security_deduction = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='代扣社保', null=True,
blank=True)
housing_fund_deduction = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='代扣公积金', null=True,
blank=True)
net_salary = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='实发工资', null=False, blank=False)
employer_social_security = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='公司承担社保',
null=True, blank=True)
employer_housing_fund = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='公司承担公积金',
null=True, blank=True)
class Meta:
verbose_name = '人工费明细'
verbose_name_plural = '人工费明细表'
def __str__(self):
return f"{self.name} - {self.year_month}"
# 报销明细表
class ReimbursementDetail(models.Model):
record_id = models.AutoField(primary_key=True, verbose_name='记录ID')
year_month = models.DateField(verbose_name='年月', null=False, blank=False)
primary_department = models.CharField(max_length=255, verbose_name='一级部门', null=False, blank=False)
name = models.CharField(max_length=255, verbose_name='姓名', null=False, blank=False)
is_project_based = models.CharField(max_length=3, choices=(('', ''), ('', '')), verbose_name='是否立项',
null=False, blank=False)
project_id = models.ForeignKey(ProjectLedger, on_delete=models.CASCADE, verbose_name='项目编号', null=True,
blank=True)
project_name = models.CharField(max_length=255, verbose_name='项目名称', null=True, blank=True)
expense_type = models.CharField(max_length=255, verbose_name='费用类型', null=False, blank=False)
expense_details = models.CharField(max_length=255, verbose_name='费用明细', null=False, blank=False)
expense_description = models.TextField(verbose_name='费用说明', null=False, blank=False)
expense_date = models.DateField(verbose_name='费用发生时间', null=False, blank=False)
amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='费用金额(元)', null=False, blank=False)
class Meta:
verbose_name = '报销明细'
verbose_name_plural = '报销明细表'
def __str__(self):
return f"{self.name} - {self.year_month}"
# 奖金类别表
class BonusCategory(models.Model):
category_id = models.AutoField(primary_key=True)
category_name = models.CharField(max_length=255, verbose_name='奖金类别')
description = models.TextField(blank=True, verbose_name='描述')
class Meta:
verbose_name = '奖金类别表'
verbose_name_plural = '奖金类别表'
def __str__(self):
return self.category_name
# 奖金分配表
class BonusAllocation(models.Model):
record_id = models.AutoField(primary_key=True, verbose_name='记录ID')
year_month = models.CharField(max_length=7, verbose_name='年月', null=False, blank=False)
primary_department = models.CharField(max_length=255, verbose_name='一级部门', null=False, blank=False)
secondary_department = models.CharField(max_length=255, verbose_name='二级部门', null=False, blank=False)
name = models.CharField(max_length=255, verbose_name='姓名', null=False, blank=False)
bonus_category = models.CharField(max_length=255, verbose_name='奖金类别', null=False, blank=False)
award_amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='奖励金额(元)', null=False,
blank=False)
class Meta:
verbose_name = '奖金分配表'
verbose_name_plural = '奖金分配表'
def __str__(self):
return f"{self.name} - {self.year_month}"
# 纳税记录表
class TaxRecord(models.Model):
TAX_TYPE_CHOICES = [
('增值税', '增值税'),
('消费税', '消费税'),
('企业所得税', '企业所得税'),
('个人所得税', '个人所得税'),
('资源税', '资源税'),
('城市维护建设税', '城市维护建设税'),
('房产税', '房产税'),
('印花税', '印花税'),
('城镇土地使用税', '城镇土地使用税'),
('土地增值税', '土地增值税'),
('车船税', '车船税'),
('船舶吨税', '船舶吨税'),
('车辆购置税', '车辆购置税'),
('烟叶税', '烟叶税'),
('耕地占用税', '耕地占用税'),
('契税', '契税'),
('环境保护税', '环境保护税'),
('关税', '关税'),
]
TAX_PERIOD_CHOICES = [
('月度', '月度'),
('季度', '季度'),
('年度', '年度'),
]
tax_entity = models.CharField(max_length=255, verbose_name='纳税主体', null=False, blank=False)
year = models.IntegerField(verbose_name='年度', null=False, blank=False)
tax_type = models.CharField(max_length=255, choices=TAX_TYPE_CHOICES, verbose_name='纳税税种', null=False,
blank=False)
tax_period = models.CharField(max_length=255, choices=TAX_PERIOD_CHOICES, verbose_name='所属税款期', null=False,
blank=False)
tax_date = models.DateField(verbose_name='纳税日期', null=False, blank=False)
tax_amount = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='纳税金额(元)', null=False,
blank=False)
annual_cumulative = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='当年累计(元)', null=False,
blank=False)
note = models.CharField(max_length=255, verbose_name='备注')
class Meta:
verbose_name = '纳税记录表'
verbose_name_plural = '纳税记录表'
def __str__(self):
return f"{self.tax_entity} - {self.year} - {self.tax_type}"
# 电子发票台账
class ElectronicInvoiceLedger(models.Model):
expense_party = models.CharField(max_length=255, verbose_name='费用当事人', null=False, blank=False)
primary_department = models.CharField(max_length=255, verbose_name='一级部门', null=False, blank=False)
submission_date = models.DateField(verbose_name='提交日期', null=False, blank=False)
invoice_code = models.CharField(max_length=255, verbose_name='发票代码', null=False, blank=False)
invoice_number = models.CharField(max_length=255, verbose_name='发票号码', null=False, blank=False)
invoice_date = models.DateField(verbose_name='开票日期', null=False, blank=False)
buyer_name = models.CharField(max_length=255, verbose_name='购买方名称', null=False, blank=False)
buyer_tax_number = models.CharField(max_length=255, verbose_name='购买方税号', null=False, blank=False)
seller_name = models.CharField(max_length=255, verbose_name='销售方名称', null=False, blank=False)
seller_tax_number = models.CharField(max_length=255, verbose_name='销售方税号', null=False, blank=False)
goods_or_services_name = models.CharField(max_length=255, verbose_name='货物或应税劳务服务名称', null=False,
blank=False)
tax_rate = models.DecimalField(max_digits=5, decimal_places=2, verbose_name='税率', null=False, blank=False)
total_amount_including_tax = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='价税合计(元)',
null=False, blank=False)
class Meta:
verbose_name = '电子发票台账'
verbose_name_plural = '电子发票台账'
unique_together = [['invoice_code', 'invoice_number']] # 设置发票代码和发票号码的联合唯一性约束
def __str__(self):
return f"{self.invoice_code} - {self.invoice_number}"
# 开票记录
class InvoiceRecord(models.Model):
record_id = models.AutoField(primary_key=True, verbose_name='记录编号')
project_id = models.ForeignKey(ProjectLedger, on_delete=models.CASCADE, verbose_name='项目编号')
project_name = models.CharField(max_length=255, verbose_name='项目名称', null=False, blank=False)
primary_department = models.CharField(max_length=255, verbose_name='一级部门', null=False, blank=False)
project_manager = models.CharField(max_length=255, verbose_name='项目负责人', null=False, blank=False)
NATURE_CHOICES = [('新增', '新增'), ('开票', '开票')]
nature = models.CharField(max_length=255, choices=NATURE_CHOICES, verbose_name='性质', null=False, blank=False)
billing_entity = models.CharField(max_length=255, verbose_name='开票主体', blank=True)
invoice_number = models.CharField(max_length=255, verbose_name='发票号码', unique=True, null=False, blank=False)
purchase_info = models.TextField(verbose_name='购票信息', blank=True)
invoice_date = models.DateField(verbose_name='开票时间', null=False, blank=False)
invoice_content = models.TextField(verbose_name='开票内容', blank=True)
total_amount = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='价税合计金额', null=False,
blank=False)
tax_rate = models.DecimalField(max_digits=5, decimal_places=2, verbose_name='税率', null=False, blank=False)
amount_excluding_tax = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='不含税金额', null=False,
blank=False)
tax_amount = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='税额', null=False, blank=False)
INVOICE_TYPE_CHOICES = [('专票', '专票'), ('普票', '普票')]
invoice_type = models.CharField(max_length=255, choices=INVOICE_TYPE_CHOICES, verbose_name='发票类型', null=False,
blank=False)
class Meta:
verbose_name = '开票记录'
verbose_name_plural = '开票记录'
def __str__(self):
return f"Record #{self.record_id} - Invoice Number: {self.invoice_number}"
# 回款记录表
class RepaymentRecord(models.Model):
record_id = models.AutoField(primary_key=True, verbose_name='记录编号')
project_id = models.ForeignKey(ProjectLedger, on_delete=models.CASCADE, verbose_name='项目编号')
project_name = models.CharField(max_length=255, verbose_name='项目名称', null=False, blank=False)
primary_department = models.CharField(max_length=255, verbose_name='一级部门', null=False, blank=False)
project_manager = models.CharField(max_length=255, verbose_name='项目负责人', null=False, blank=False)
invoice = models.ForeignKey(InvoiceRecord, on_delete=models.CASCADE, verbose_name='发票记录')
repayment_amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='回款金额', null=False,
blank=False)
class Meta:
verbose_name = '回款记录表'
verbose_name_plural = '回款记录表'
def __str__(self):
return f"Record #{self.record_id} - Invoice Number: {self.invoice.invoice_number}, Total Amount: {self.invoice.total_amount}"
# 员工提成情况表
class EmployeeCommission(models.Model):
record_id = models.AutoField(primary_key=True, verbose_name='记录编号')
project_id = models.ForeignKey(ProjectLedger, on_delete=models.CASCADE, verbose_name='项目编号')
project_name = models.CharField(max_length=255, verbose_name='项目名称', null=False, blank=False)
year_month = models.DateField(verbose_name='年月', null=False, blank=False)
company_retained = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='公司留存', null=False,
blank=False)
name = models.CharField(max_length=255, verbose_name='姓名', null=False, blank=False)
primary_department = models.CharField(max_length=255, verbose_name='一级部门', null=False, blank=False)
total_commission = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='提成总额', null=False,
blank=False)
amount_paid = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='已发放金额', null=False,
blank=False)
accrued_amount = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='计提金额', null=False,
blank=False)
chairman_fund = models.DecimalField(max_digits=15, decimal_places=2, verbose_name='董事长资金池', null=False,
blank=False)
class Meta:
verbose_name = '员工提成情况表'
verbose_name_plural = '员工提成情况表'
def __str__(self):
return f"Record #{self.record_id} - Project: {self.project_name}, Employee: {self.name}, Year-Month: {self.year_month}"
# 员工提成记录修改表
class CommissionModification(models.Model):
modification_id = models.AutoField(primary_key=True, verbose_name='修改记录ID')
commission_record = models.ForeignKey(EmployeeCommission, on_delete=models.CASCADE, verbose_name='提成记录ID')
modified_field = models.CharField(max_length=255, verbose_name='修改金额字段', null=False, blank=False)
previous_amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='修改前金额', null=False,
blank=False)
modified_amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='修改后金额', null=False,
blank=False)
modified_by = models.CharField(max_length=255, verbose_name='修改人', null=False, blank=False)
modification_date = models.DateTimeField(verbose_name='修改时间', auto_now_add=True)
class Meta:
verbose_name = '员工提成记录修改表'
verbose_name_plural = '员工提成记录修改表'
def __str__(self):
return f"Modification #{self.modification_id} - Commission Record: {self.commission_record}, Modified By: {self.modified_by}, Modification Date: {self.modification_date}"