overview calculated
This commit is contained in:
parent
f2f2100b8c
commit
7d8755aab9
@ -6,164 +6,186 @@ from utils import getParam
|
|||||||
from Cheetah.Template import Template
|
from Cheetah.Template import Template
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
EPSILON = Decimal('0.000000001')
|
||||||
|
|
||||||
def perform(dbh, params):
|
def perform(dbh, params):
|
||||||
year = getParam(params, 'year', datetime.datetime.today().year)
|
year = getParam(params, 'year', datetime.datetime.today().year)
|
||||||
startDate = datetime.datetime(year, 1, 1, 0, 0, 0)
|
startDate = datetime.datetime(year, 1, 1, 0, 0, 0)
|
||||||
endDate = datetime.datetime(year, 12, 31, 23, 59, 59)
|
endDate = datetime.datetime(year, 12, 31, 23, 59, 59)
|
||||||
premises = (1, 2)
|
premises = (1, 2)
|
||||||
|
|
||||||
# get overhead sums by object, category and timespan
|
houses = {}
|
||||||
overheadSums = dbGetMany(
|
|
||||||
dbh,
|
|
||||||
{
|
|
||||||
"statement":
|
|
||||||
"""
|
|
||||||
select sum(ae.amount) as sum,
|
|
||||||
aec.description as category,
|
|
||||||
p.id as house_id,
|
|
||||||
p.description as house,
|
|
||||||
aec.considerminusarea as considerminusarea
|
|
||||||
from account_t a,
|
|
||||||
premise_t p,
|
|
||||||
account_entry_t ae,
|
|
||||||
account_entry_category_t aec
|
|
||||||
where p.account = a.id and
|
|
||||||
ae.account = a.id and
|
|
||||||
aec.overhead_relevant = 't' and
|
|
||||||
ae.account_entry_category = aec.id and
|
|
||||||
ae.fiscal_year = %(year)s and
|
|
||||||
p.id in %(premises)s
|
|
||||||
group by house_id, house, category, considerminusarea
|
|
||||||
union
|
|
||||||
select 0 as sum,
|
|
||||||
aec.description as category,
|
|
||||||
p.id as house_id,
|
|
||||||
p.description as house,
|
|
||||||
aec.considerminusarea as considerminusarea
|
|
||||||
from account_t a,
|
|
||||||
premise_t p,
|
|
||||||
account_entry_t ae,
|
|
||||||
account_entry_category_t aec
|
|
||||||
where p.account = a.id and
|
|
||||||
ae.account = a.id and
|
|
||||||
aec.overhead_relevant = 't' and
|
|
||||||
aec.id not in (select distinct account_entry_category from account_entry_t) and
|
|
||||||
ae.fiscal_year = %(year)s and
|
|
||||||
p.id in %(premises)s
|
|
||||||
group by house_id, house, category, considerminusarea
|
|
||||||
union
|
|
||||||
select 120 as sum,
|
|
||||||
'Waschmaschine' as category,
|
|
||||||
id as house_id,
|
|
||||||
description as house,
|
|
||||||
false as considerminusarea
|
|
||||||
from premise_t
|
|
||||||
where id in %(premises)s
|
|
||||||
order by house_id, category
|
|
||||||
""",
|
|
||||||
"params": {
|
|
||||||
"year": year,
|
|
||||||
"premises": premises
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
# logger.info(f"{overheadSums=}")
|
|
||||||
for overheadSum in overheadSums:
|
|
||||||
logger.info(f"house: {overheadSum['house']}, considerMinusArea: {overheadSum['considerminusarea']}, category: {overheadSum['category']}, sum: {overheadSum['sum']}")
|
|
||||||
|
|
||||||
#subtotal = {}
|
|
||||||
#for premise in premises:
|
|
||||||
# v = [ x['sum'] for x in overheadSums if x['house_id'] == premise ]
|
|
||||||
# logger.info(f"{v=}")
|
|
||||||
# subtotal[premise] = sum(v)
|
|
||||||
# logger.info(f"{subtotal=}")
|
|
||||||
|
|
||||||
# get areas and factors
|
|
||||||
totalAreas = {}
|
|
||||||
flatAreas = dbGetMany(
|
|
||||||
dbh,
|
|
||||||
{
|
|
||||||
"statement":
|
|
||||||
"""
|
|
||||||
select
|
|
||||||
p.id as house_id,
|
|
||||||
p.description as house,
|
|
||||||
sum(f.area) as flat_area
|
|
||||||
from
|
|
||||||
premise_t p,
|
|
||||||
flat_t f
|
|
||||||
where
|
|
||||||
f.premise = p.id and
|
|
||||||
p.id in %(premises)s
|
|
||||||
group by house_id
|
|
||||||
""",
|
|
||||||
"params": {
|
|
||||||
"premises": premises
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
for area in flatAreas:
|
|
||||||
logger.info(f"{area['house']=}, {area['flat_area']=}")
|
|
||||||
totalAreas[area['house_id']] = { 'flat_area': area['flat_area'] }
|
|
||||||
|
|
||||||
commercialAreas = dbGetMany(
|
|
||||||
dbh,
|
|
||||||
{
|
|
||||||
"statement":
|
|
||||||
"""
|
|
||||||
select
|
|
||||||
p.id as house_id,
|
|
||||||
p.description as house,
|
|
||||||
coalesce(sum(c.area), 0) as commercial_area
|
|
||||||
from
|
|
||||||
premise_t p full outer join commercial_premise_t c on c.premise = p.id
|
|
||||||
where
|
|
||||||
p.id in %(premises)s
|
|
||||||
group by house_id
|
|
||||||
""",
|
|
||||||
"params": {
|
|
||||||
"premises": premises
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
for area in commercialAreas:
|
|
||||||
logger.info(f"{area['house']=}, {area['commercial_area']=}")
|
|
||||||
totalAreas[area['house_id']] |= { 'commercial_area': area['commercial_area'] }
|
|
||||||
|
|
||||||
minusAreas = dbGetMany(
|
|
||||||
dbh,
|
|
||||||
{
|
|
||||||
"statement":
|
|
||||||
"""
|
|
||||||
select
|
|
||||||
p.id as house_id,
|
|
||||||
p.description as house,
|
|
||||||
p.minus_area as minus_area
|
|
||||||
from
|
|
||||||
premise_t p
|
|
||||||
where
|
|
||||||
p.id in %(premises)s
|
|
||||||
group by house_id
|
|
||||||
""",
|
|
||||||
"params": {
|
|
||||||
"premises": premises
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
for area in minusAreas:
|
|
||||||
logger.info(f"{area['house']=}, {area['minus_area']=}")
|
|
||||||
totalAreas[area['house_id']] |= { 'minus_area': area['minus_area'] }
|
|
||||||
|
|
||||||
for premise in premises:
|
for premise in premises:
|
||||||
totalAreas[premise]['other_area'] = totalAreas[premise]['commercial_area'] + totalAreas[premise]['minus_area']
|
# get overhead sums by object, category and timespan
|
||||||
totalAreas[premise]['total_area'] = totalAreas[premise]['flat_area'] + totalAreas[premise]['other_area']
|
overheadItems = dbGetMany(
|
||||||
totalAreas[premise]['flat_factor'] = totalAreas[premise]['flat_area'] / totalAreas[premise]['total_area']
|
dbh,
|
||||||
totalAreas[premise]['other_factor'] = totalAreas[premise]['other_area'] / totalAreas[premise]['total_area']
|
{
|
||||||
totalAreas[premise]['factor_check'] = totalAreas[premise]['flat_factor'] + totalAreas[premise]['other_factor']
|
"statement":
|
||||||
logger.info(f"{totalAreas=}")
|
"""
|
||||||
|
select sum(ae.amount) as sum,
|
||||||
|
aec.description as category,
|
||||||
|
aec.considerminusarea as considerminusarea
|
||||||
|
from account_t a,
|
||||||
|
premise_t p,
|
||||||
|
account_entry_t ae,
|
||||||
|
account_entry_category_t aec
|
||||||
|
where p.account = a.id and
|
||||||
|
ae.account = a.id and
|
||||||
|
aec.overhead_relevant = 't' and
|
||||||
|
ae.account_entry_category = aec.id and
|
||||||
|
ae.fiscal_year = %(year)s and
|
||||||
|
p.id = %(premise)s
|
||||||
|
group by category, considerminusarea
|
||||||
|
union
|
||||||
|
select 0 as sum,
|
||||||
|
aec.description as category,
|
||||||
|
aec.considerminusarea as considerminusarea
|
||||||
|
from account_t a,
|
||||||
|
premise_t p,
|
||||||
|
account_entry_t ae,
|
||||||
|
account_entry_category_t aec
|
||||||
|
where p.account = a.id and
|
||||||
|
ae.account = a.id and
|
||||||
|
aec.overhead_relevant = 't' and
|
||||||
|
aec.id not in (select distinct account_entry_category from account_entry_t) and
|
||||||
|
ae.fiscal_year = %(year)s and
|
||||||
|
p.id = %(premise)s
|
||||||
|
group by category, considerminusarea
|
||||||
|
union
|
||||||
|
select 120 as sum,
|
||||||
|
'Waschmaschine' as category,
|
||||||
|
false as considerminusarea
|
||||||
|
from premise_t
|
||||||
|
where id = %(premise)s
|
||||||
|
order by category
|
||||||
|
""",
|
||||||
|
"params": {
|
||||||
|
"year": year,
|
||||||
|
"premise": premise
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# get areas and factors
|
||||||
|
totalArea = {}
|
||||||
|
flatArea = dbGetOne(
|
||||||
|
dbh,
|
||||||
|
{
|
||||||
|
"statement":
|
||||||
|
"""
|
||||||
|
select
|
||||||
|
sum(f.area) as flat_area
|
||||||
|
from
|
||||||
|
premise_t p,
|
||||||
|
flat_t f
|
||||||
|
where
|
||||||
|
f.premise = p.id and
|
||||||
|
p.id = %(premise)s
|
||||||
|
""",
|
||||||
|
"params": {
|
||||||
|
"premise": premise
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
totalArea['flat_area'] = flatArea['flat_area']
|
||||||
|
|
||||||
|
commercialArea = dbGetOne(
|
||||||
|
dbh,
|
||||||
|
{
|
||||||
|
"statement":
|
||||||
|
"""
|
||||||
|
select
|
||||||
|
coalesce(sum(c.area), 0) as commercial_area
|
||||||
|
from
|
||||||
|
premise_t p full outer join commercial_premise_t c on c.premise = p.id
|
||||||
|
where
|
||||||
|
p.id = %(premise)s
|
||||||
|
""",
|
||||||
|
"params": {
|
||||||
|
"premise": premise
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
totalArea['commercial_area'] = commercialArea['commercial_area']
|
||||||
|
|
||||||
|
minusAreaAndDetails = dbGetOne(
|
||||||
|
dbh,
|
||||||
|
{
|
||||||
|
"statement":
|
||||||
|
"""
|
||||||
|
select
|
||||||
|
p.minus_area as minus_area,
|
||||||
|
p.id as house_id,
|
||||||
|
p.description as house
|
||||||
|
from
|
||||||
|
premise_t p
|
||||||
|
where
|
||||||
|
p.id = %(premise)s
|
||||||
|
""",
|
||||||
|
"params": {
|
||||||
|
"premise": premise
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
totalArea['minus_area'] = minusAreaAndDetails['minus_area']
|
||||||
|
details = { 'id': minusAreaAndDetails['house_id'], 'description': minusAreaAndDetails['house'] }
|
||||||
|
|
||||||
|
totalArea['other_area'] = totalArea['commercial_area'] + totalArea['minus_area']
|
||||||
|
totalArea['total_area'] = totalArea['flat_area'] + totalArea['other_area']
|
||||||
|
totalArea['flat_factor'] = totalArea['flat_area'] / totalArea['total_area']
|
||||||
|
totalArea['other_factor'] = totalArea['other_area'] / totalArea['total_area']
|
||||||
|
totalArea['factor_check'] = totalArea['flat_factor'] + totalArea['other_factor']
|
||||||
|
|
||||||
|
totalSum = Decimal('0')
|
||||||
|
flatSum = Decimal('0')
|
||||||
|
otherSum = Decimal('0')
|
||||||
|
for overheadItem in overheadItems:
|
||||||
|
totalSum += overheadItem['sum']
|
||||||
|
overheadItem['flat_part'] = overheadItem['sum'] * totalArea['flat_factor'] if overheadItem['considerminusarea'] else overheadItem['sum']
|
||||||
|
flatSum += overheadItem['flat_part']
|
||||||
|
overheadItem['other_part'] = overheadItem['sum'] * totalArea['other_factor'] if overheadItem['considerminusarea'] else Decimal('0')
|
||||||
|
otherSum += overheadItem['other_part']
|
||||||
|
|
||||||
|
verifyDifference = totalSum - flatSum - otherSum
|
||||||
|
logger.debug(f"{totalSum=}, {verifyDifference=}")
|
||||||
|
if abs(verifyDifference) > EPSILON:
|
||||||
|
raise Exception(f"Verify Difference is too large: {premise=}, {verifyDifference=}")
|
||||||
|
|
||||||
|
umlageAusfallWagnis = flatSum * Decimal('0.02')
|
||||||
|
flatSum2 = flatSum + umlageAusfallWagnis
|
||||||
|
|
||||||
|
partByMonthArea = flatSum2 / Decimal('12') / totalArea['flat_area']
|
||||||
|
|
||||||
|
houses[details['id']] = {
|
||||||
|
'details': details,
|
||||||
|
'areas': totalArea,
|
||||||
|
'overhead_items': overheadItems,
|
||||||
|
'flat_sum': flatSum,
|
||||||
|
'flat_sum_2': flatSum2,
|
||||||
|
'other_sum': otherSum,
|
||||||
|
'total_sum': totalSum,
|
||||||
|
'umlage_ausfall_wagnis': umlageAusfallWagnis,
|
||||||
|
'part_by_montharea': partByMonthArea,
|
||||||
|
'year': year }
|
||||||
|
|
||||||
|
|
||||||
|
logger.info(f"{houses=}")
|
||||||
|
|
||||||
|
|
||||||
|
printOverviews = getParam(params, 'printOverviews', True)
|
||||||
|
if printOverviews:
|
||||||
|
overviewTemplate = getParam(params, 'overviewTemplate', 'betriebskostenuebersicht.tmpl')
|
||||||
|
overviewPrefix = getParam(params, 'overviewPrefix', 'overview')
|
||||||
|
overviewSuffix = getParam(params, 'overviewSuffix', 'tex')
|
||||||
|
|
||||||
|
for house in houses.values():
|
||||||
|
logger.debug(f"Processing item: {house}")
|
||||||
|
outputFile = f"{overviewPrefix}-{house['details']['id']}.{overviewSuffix}"
|
||||||
|
tmpl = Template(file=overviewTemplate, searchList=[ house ])
|
||||||
|
logger.debug(tmpl)
|
||||||
|
with open(outputFile, 'w') as f:
|
||||||
|
f.write(str(tmpl))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
19
cli/betriebskostenuebersicht.tmpl
Normal file
19
cli/betriebskostenuebersicht.tmpl
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
Haus: $details['description']
|
||||||
|
Jahr: $year
|
||||||
|
|
||||||
|
|
||||||
|
Art | Wohnungen | andere Flächen | gesamt
|
||||||
|
|
||||||
|
Fläche | $areas['flat_area'] | $areas['other_area']
|
||||||
|
Faktor | $areas['flat_factor'] | $areas['other_factor']
|
||||||
|
|
||||||
|
|
||||||
|
#for $item in $overhead_items
|
||||||
|
$item['category'] | $item['flat_part'] | $item['other_part'] | $item['sum']
|
||||||
|
#end for
|
||||||
|
|
||||||
|
Zwischensumme | $flat_sum | $other_sum | $total_sum
|
||||||
|
Umlageausfallwagnis | $umlage_ausfall_wagnis
|
||||||
|
Summe | $flat_sum_2
|
||||||
|
|
||||||
|
Anteil / Monat / m2 | $part_by_montharea
|
Loading…
x
Reference in New Issue
Block a user