Skip to content

Instantly share code, notes, and snippets.

@victorusachev
Last active October 23, 2019 22:26
Show Gist options
  • Save victorusachev/2c695c4d399b1105d48b765e8728a783 to your computer and use it in GitHub Desktop.
Save victorusachev/2c695c4d399b1105d48b765e8728a783 to your computer and use it in GitHub Desktop.
def update_remains_period(actor, start, end, company_object):
"""
Обновить остатки топлива за период.
"""
fuel_infos = FuelInfo.objects.filter(active=True, boiler=company_object)
for date in get_period_dates(start, end):
for fuel_info in fuel_infos:
# Запись, которую нужно обновить
record = None
try:
record, created = FuelRemains.objects.get_or_create(
fuel_info=fuel_info, date=date, boiler=company_object
)
except FuelRemains.MultipleObjectsReturned:
records = FuelRemains.objects.filter(fuel_info=fuel_info, date=date)
if records.exists():
record = records[0]
records[1:].delete()
if record:
update_remain(actor, record)
# 4271a68
def update_remain(actor, record):
"""Обновляет расчётные показатели по остаткам топлива."""
record.editor = actor
fuel_info_id = record.fuel_info.id
record_date = record.date
obj = FuelRemains.objects.get(
date=get_month_day(record_date, 1),
fuel_info__id=fuel_info_id
)
# Остатки на начало месяца
record.first_day_month = obj.first_day_month
fc = FuelConsumption.objects.filter(
date__range=get_range(record_date),
fuel_info__id=fuel_info_id
).aggregate(actual=Sum('actual_day'))
fi = FuelIncome.objects.filter(
date__range=get_range(record_date),
fuel_info__id=fuel_info_id
).aggregate(
income=Sum('today'),
pickup=Sum('pickup')
)
parts = (
record.first_day_month,
fi['income'] or 0.0,
fc['actual'] or 0.0,
fi['pickup'] or 0.0
)
# round реализует не арифметическое, а банковское округление
# remains = record.calc_remain_tonnes(*parts)
# record.tonnes = round(remains, 3)
def get_remain_tonnes():
from decimal import Decimal
initial, income, consumption, pickup = tuple(map(Decimal, parts))
remains = (
(initial + income - consumption - pickup)
.quantize(Decimal('.1111'), rounding='ROUND_HALF_UP')
.quantize(Decimal('.111'), rounding='ROUND_HALF_UP')
)
return float(remains)
record.tonnes = get_remain_tonnes()
fc = FuelConsumption.objects.get(
date=record_date,
fuel_info__id=fuel_info_id
)
if fc.actual_day and fc.actual_day > 0:
record.days = int(record.tonnes / fc.actual_day)
else:
record.days = 0
record.save(force_update=True)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment