from __future__ import absolute_import, unicode_literals import logging import billard.utils as utils from celery import shared_task from billard.models import LocationData, Client, Accounting log = logging.getLogger(__name__) @shared_task def process_location_data(): data = LocationData.objects.filter(processed=False).order_by('tst') for ld in data: cli = Client.objects.filter(uuid=ld.client_id, desks__desk_no=ld.desk_no) if cli.count() < 1: ld.processed = True ld.error_msg = 'No client object found. Stopp processing! {}, {}'.format(ld.client_id, ld.desk_no) ld.save() log.error(ld.error_msg) else: cli = cli[0] desk = cli.desks.filter(desk_no=ld.desk_no, enabled=True) if desk.count() != 1: ld.processed = True ld.error_msg = 'No desk object found. Stopp processing! {}, {}'.format(ld.client_id, ld.desk_no) ld.save() log.error(ld.error_msg) desk = desk[0] ac = desk.accounting_set.order_by('time_from').reverse() if ld.on_off: acc = None if ac.count() > 0 and ac[0].time_to is None: log.error('Vorheriges Accounting nicht abgeschlossen: Desk_id {}, Accounting_id {}' .format(desk.id, ac[0].id)) acc = ac[0] if acc is None: acc = Accounting( desk=desk, time_from=ld.tst, ) acc.save() ld.delete() else: if len(ac) > 0: acc = ac[0] acc.time_to = ld.tst acc.prize, acc.prize_normal, acc.prize_hh = utils.get_prize_for( start=acc.time_from, end=ld.tst, pph=desk.prize, hh_start=cli.location.happy_hour_start, hh_end=cli.location.happy_hour_end, pphh=desk.prize_hh, ) acc.reporter_uuid = cli.uuid acc.save() ld.delete() else: ld.processed = True ld.error_msg = 'No existing accountings found. Stopp processing! {}, {}'.format(ld.client_id, ld.desk_no) ld.save() log.error(ld.error_msg)