XH_Digital_Management/application/busi_tbl/service/data_cleaning.py

170 lines
9.8 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.

import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'XH_Digital_Management.settings')
django.setup()
from django.db.models import Sum, F, Value, DecimalField
from django.db.models.functions import Coalesce
from application.fac_mgnt.models import *
from application.perf_mgnt.models import *
from application.pjt_mgnt.models import *
def calculate_annual_business_targets(year, primary_department):
"""
视图数据-你们负责人查看数据-年度总体经营目标
字段:
年份
年度营业收入(万元)(=28.21价税合计金额按一级部门和年份筛选完后的累计值)及完成率(=前一个数据/1.5收入总目标)【项目台账-价税合计金额, 集团经营目标-收入总目标】
年度新增收入(万元)(=28.21价税合计金额按一级部门、年份、性质筛选完后的累计值)及完成率(=前一个数据/1.6新增收入目标)【项目台账-价税合计金额, 集团经营目标-新增收入总目标】
年度存量收入(万元) =28.21价税合计金额按一级部门、年份、性质筛选完后的累计值)及完成率(=前一个数据/1.7存量收入目标)【项目台账-价税合计金额, 集团经营目标-存量收入目标】
年度营业成本(万元) =28.21价税合计金额累计-28.23应收净收入累计)及占用率(=前一个数据/1.8成本限额)【项目台账-价税合计金额,项目台账-应收净收入, 集团经营目标-存量收入目标, 集团经营目标表-成本限额 】
年度费用开销(万元) =19.10费用金额累计+18.7全勤奖+18.8午餐津贴+18.9其他货币性福利+18.12实发工资+18.13公司承担社保+18.14公司承担公积金)及占用率(=前一个数据/1.10费用限额)【报销明细-费用金额 ,人工费用明细-全勤奖、午餐津贴、其他货币型福利、实发工资、公司承担社保、公司承担公积金, 集团经营目标-费用限额 】
营业利润(万元) =年度营业收入-年度营业成本-年度费用开销-开票税金(=25.12税额按部门按年累计*1.121.12是一个固定的数值)))【回款记录-不含税金额】
"""
annual_revenue = ProjectLedger.objects.filter(
primary_department=primary_department,
contract_date__year=year
).aggregate(total_amount=Coalesce(Sum('total_amount_including_tax', output_field=DecimalField()),
Value(0, output_field=DecimalField())))['total_amount'] / 10000 # 转换为万元
revenue_target = GroupBusinessTarget.objects.filter(
primary_department=primary_department,
year=year
).aggregate(total_revenue_target=Coalesce(Sum('total_revenue_target', output_field=DecimalField()),
Value(0, output_field=DecimalField())))[
'total_revenue_target'] / 10000 # 转换为万元
revenue_completion_rate = annual_revenue / revenue_target if revenue_target != 0 else 0
# 年度新增收入(万元)及完成率
annual_new_revenue = ProjectLedger.objects.filter(
primary_department=primary_department,
contract_date__year=year,
project_nature='新增'
).aggregate(total_amount=Coalesce(Sum('total_amount_including_tax', output_field=DecimalField()),
Value(0, output_field=DecimalField())))['total_amount'] / 10000 # 转换为万元
new_revenue_target = GroupBusinessTarget.objects.filter(
primary_department=primary_department,
year=year
).aggregate(new_revenue_target=Coalesce(Sum('new_revenue_target', output_field=DecimalField()),
Value(0, output_field=DecimalField())))[
'new_revenue_target'] / 10000 # 转换为万元
new_revenue_completion_rate = annual_new_revenue / new_revenue_target if new_revenue_target != 0 else 0
# 年度存量收入(万元)及完成率
annual_existing_revenue = ProjectLedger.objects.filter(
primary_department=primary_department,
contract_date__year=year,
project_nature='存量'
).aggregate(total_amount=Coalesce(Sum('total_amount_including_tax', output_field=DecimalField()),
Value(0, output_field=DecimalField())))['total_amount'] / 10000 # 转换为万元
existing_revenue_target = GroupBusinessTarget.objects.filter(
primary_department=primary_department,
year=year
).aggregate(existing_revenue_target=Coalesce(Sum('existing_revenue_target', output_field=DecimalField()),
Value(0, output_field=DecimalField())))[
'existing_revenue_target'] / 10000 # 转换为万元
existing_revenue_completion_rate = annual_existing_revenue / existing_revenue_target if existing_revenue_target != 0 else 0
# 年度营业成本(万元)及占用率
total_amount = ProjectLedger.objects.filter(
primary_department=primary_department,
contract_date__year=year
).aggregate(total_amount=Coalesce(Sum('total_amount_including_tax', output_field=DecimalField()),
Value(0, output_field=DecimalField())))['total_amount'] / 10000 # 转换为万元
receivable_net_income = ProjectLedger.objects.filter(
primary_department=primary_department,
contract_date__year=year
).aggregate(receivable_net_income=Coalesce(Sum('receivable_net_income', output_field=DecimalField()),
Value(0, output_field=DecimalField())))[
'receivable_net_income'] / 10000 # 转换为万元
annual_cost = total_amount - receivable_net_income
cost_limit = GroupBusinessTarget.objects.filter(
primary_department=primary_department,
year=year
).aggregate(
cost_limit=Coalesce(Sum('cost_limit', output_field=DecimalField()), Value(0, output_field=DecimalField())))[
'cost_limit'] / 10000 # 转换为万元
cost_occupancy_rate = annual_cost / cost_limit if cost_limit != 0 else 0
# 年度费用开销(万元)及占用率
reimbursement_amount = ReimbursementDetail.objects.filter(
primary_department=primary_department,
year_month__year=year
).aggregate(
total_amount=Coalesce(Sum('amount', output_field=DecimalField()), Value(0, output_field=DecimalField())))[
'total_amount'] / 10000 # 转换为万元
labor_cost_details = LaborCostDetail.objects.filter(
primary_department=primary_department,
year_month__year=year
).aggregate(
total_attendance_reward=Coalesce(Sum('attendance_reward', output_field=DecimalField()),
Value(0, output_field=DecimalField())),
total_lunch_allowance=Coalesce(Sum('lunch_allowance', output_field=DecimalField()),
Value(0, output_field=DecimalField())),
total_other_monetary_benefits=Coalesce(Sum('other_monetary_benefits', output_field=DecimalField()),
Value(0, output_field=DecimalField())),
total_net_salary=Coalesce(Sum('net_salary', output_field=DecimalField()),
Value(0, output_field=DecimalField())),
total_employer_social_security=Coalesce(Sum('employer_social_security', output_field=DecimalField()),
Value(0, output_field=DecimalField())),
total_employer_housing_fund=Coalesce(Sum('employer_housing_fund', output_field=DecimalField()),
Value(0, output_field=DecimalField())),
)
annual_expense = reimbursement_amount + labor_cost_details['total_attendance_reward'] / 10000 + \
labor_cost_details['total_lunch_allowance'] / 10000 + \
labor_cost_details['total_other_monetary_benefits'] / 10000 + \
labor_cost_details['total_net_salary'] / 10000 + \
labor_cost_details['total_employer_social_security'] / 10000 + \
labor_cost_details['total_employer_housing_fund'] / 10000 # 转换为万元
expense_limit = GroupBusinessTarget.objects.filter(
primary_department=primary_department,
year=year
).aggregate(expense_limit=Coalesce(Sum('expense_limit', output_field=DecimalField()),
Value(0, output_field=DecimalField())))['expense_limit'] / 10000 # 转换为万元
expense_occupancy_rate = annual_expense / expense_limit if expense_limit != 0 else 0
# 营业利润(万元)
tax_amount = TaxRecord.objects.filter(
tax_entity=primary_department,
year=year
).aggregate(
tax_amount=Coalesce(Sum('tax_amount', output_field=DecimalField()), Value(0, output_field=DecimalField())))[
'tax_amount'] * 1.12 / 10000 # 转换为万元
operating_profit = annual_revenue - annual_cost - annual_expense - tax_amount
return {
'year': year,
'primary_department': primary_department,
'annual_revenue': annual_revenue,
'revenue_completion_rate': revenue_completion_rate,
'annual_new_revenue': annual_new_revenue,
'new_revenue_completion_rate': new_revenue_completion_rate,
'annual_existing_revenue': annual_existing_revenue,
'existing_revenue_completion_rate': existing_revenue_completion_rate,
'annual_cost': annual_cost,
'cost_occupancy_rate': cost_occupancy_rate,
'annual_expense': annual_expense,
'expense_occupancy_rate': expense_occupancy_rate,
'operating_profit': operating_profit
}
data = calculate_annual_business_targets(2023, '星河')
print(data)