def save(self, save_revision=False, *args, **kwargs): # Если первый день месяца, тогда: # - сумма потребления фактическая и плановая за период # равна текущим значениям # # Количество дней в месяце days_number = get_month_last_day(self.date) if self.date.day == 1: self.energy_value_month = self.energy_value else: # пара значений даты начала и пердыдущего дня месяца actual_month_range = get_range(self.date, -1) # Сумма потребления с начала месяца до вчерашнего дня energy_sum = PowerPerformance.objects.filter(date__range=actual_month_range, boiler__id=self.boiler.id).aggregate(consumption_sum=Sum('energy_value')) if energy_sum['consumption_sum'] == None: energy_sum['consumption_sum']=0 self.energy_value_month = energy_sum['consumption_sum'] + self.energy_value #if save_revision == True: # with reversion.create_revision(): # super(PowerPerformance, self).save( *args, **kwargs) #else: super(PowerPerformance, self).save( *args, **kwargs)
def save(self, save_revision=False, *args, **kwargs): if self.fuel_info == None: raise FuelIncome.DoesNotExist("Информация о топливе не указана.") if self.date.day == 1: self.month = self.today else: date_range = get_range(self.date, -1) aggregation = FuelIncome.objects.filter( date__range=date_range, fuel_info__id=self.fuel_info.id).aggregate( month=Sum('today'), pickup=Sum('pickup')) if aggregation['month'] == None: aggregation['month'] = 0.0 if aggregation['pickup'] == None: aggregation['pickup'] = 0.0 self.month = aggregation['month'] + self.today self.pickup_sum_period = aggregation['pickup'] + self.pickup #if save_revision == True: # with reversion.create_revision(): # super(FuelIncome, self).save( *args, **kwargs) #else: super(FuelIncome, self).save(*args, **kwargs)
def save(self, save_revision=False, *args, **kwargs): # Если первый день месяца, тогда: # - сумма потребления фактическая и плановая за период # равна текущим значениям # # Количество дней в месяце days_number = get_month_last_day(self.date) if self.date.day == 1: self.plan_day = round(self.plan_month / days_number, 3) self.plan_sum_period = self.plan_day self.actual_sum_period = self.actual_day else: # пара значений даты начала и пердыдущего дня месяца actual_month_range = get_range(self.date, -1) # Сумма потребления с начала месяца до вчерашнего дня actual_sum = ElectricityConsumption.objects.filter( date__range=actual_month_range, boiler__id=self.boiler.id).aggregate( consumption_sum=Sum('actual_day')) if actual_sum['consumption_sum'] == None: actual_sum['consumption_sum'] = 0 # среднесуточные значения и плановые месячные month, avg = self.get_month_plan() self.plan_day = avg self.plan_month = month # сумма равна сумме сегоднешнего значения и суммы всех значений с первого дня месяца # по вчерашнее число self.plan_sum_period = round( (self.plan_month / days_number) * self.date.day, 3) self.actual_sum_period = actual_sum[ 'consumption_sum'] + self.actual_day # Вычислить отклонение в процентах планового и фактического значений за период if self.plan_sum_period > 0: delta = ((self.actual_sum_period * 100.0) / self.plan_sum_period) - 100.0 self.diff_period_percent = round(delta, 3) #if save_revision == True: # with reversion.create_revision(): # super(ElectricityConsumption,self).save( *args, **kwargs) #else: super(ElectricityConsumption, self).save(*args, **kwargs)
def save(self, save_revision=False, *args, **kwargs): # количество дней в месяце days = get_month_last_day(self.date) if self.category == None: raise WaterConsumption.DoesNotExist( "Категория расхода воды не указана.") if self.date.day == 1: self.actual_month = self.actual_day self.plan_day = round(self.plan_month / float(days), 3) else: # диапазон дат с начала месяца по текущий день date_range = get_range(self.date, -1) # фактический расход за период total_actual = WaterConsumption.objects.filter( date__range=date_range, boiler__id=self.boiler.id, category__id=self.category.id).aggregate( actual_month=Sum('actual_day')) if total_actual['actual_month'] == None: total_actual['actual_month'] = 0 self.actual_month = total_actual['actual_month'] + self.actual_day # Плановые дневные и месячные значения month_plan, day_plan = self.get_month_plan() self.plan_month = month_plan self.plan_day = day_plan # вычисляем разницы self.diff_day = round(self.actual_day - self.plan_day, 3) self.diff_month = round( self.actual_month - (self.plan_day * self.date.day), 3) self.farward_temperature_diff = self.farward_temperature_actual - self.farward_temperature_estimated self.backward_temperature_diff = self.backward_temperature_actual - self.backward_temperature_estimated #if save_revision == True: # with reversion.create_revision(): # super(WaterConsumption,self).save( *args, **kwargs) #else: super(WaterConsumption, self).save(*args, **kwargs)
def save(self, save_revision=False, *args, **kwargs): # количество дней в месяце start_date, end_date, days = self.get_plan_period() if self.fuel_info == None: raise FuelConsumption.DoesNotExist( "Информация о виде топлива не указана.") # На первое число месячное значение равно дневному if self.date.day == 1: self.actual_month = self.actual_day self.real_plan_sum = self.real_plan_day if days > 0: self.plan_day = round(self.plan_month / float(days), 3) else: self.plan_day = 0.0 self.plan_month_sum = self.plan_day else: # диапазон дат с начала месяца по текущий день date_range = get_range(self.date, -1) aggregation = FuelConsumption.objects.filter( date__range=date_range, fuel_info__id=self.fuel_info.id).aggregate( actual_sum=Sum('actual_day'), real_sum=Sum('real_plan_day'), plan_sum=Sum('plan_day')) for key in aggregation.keys(): if aggregation[key] == None: aggregation[key] = 0 #if aggregation['actual_sum'] == None: # aggregation['actual_sum'] = 0 #if aggregation['real_sum'] == None: # aggregation['real_sum'] = 0 print aggregation self.actual_month = aggregation['actual_sum'] + self.actual_day self.real_plan_sum = aggregation['real_sum'] + self.real_plan_day # Плановые дневные и месячные значения month_plan, day_plan, plan_eqv = self.get_plan(days) self.plan_month = month_plan self.plan_eqv = plan_eqv if days > 0: self.plan_day = day_plan else: self.plan_day = 0.0 self.plan_month_sum = round( aggregation['plan_sum'] + self.plan_day, 3) # Проверка того, что была сделана корректировка self.correct_changed = False if self.pk is not None: orig = FuelConsumption.objects.get(pk=self.pk) if orig.correct != self.correct: self.correct_changed = True elif self.correct != 0.0: self.correct_changed = True # вычисляем разницы self.diff_day = round(self.actual_day - self.real_plan_day, 3) self.diff_month = round( self.actual_month + self.correct - self.real_plan_sum, 3) #if save_revision == True: # with reversion.create_revision(): # super(FuelConsumption, self).save(*args, **kwargs) #else: super(FuelConsumption, self).save(*args, **kwargs) records = FuelConsumption.objects.exclude(date=self.date).filter( fuel_info__id=self.fuel_info.id)
def get_plan_period(self): """ Получить плановый период для текущей даты и количество дней в периоде. - Если ни один период не начинается в текущем месяце, тогда начало периода совпадает с началом месца - Если ни один период не заканчивается в текущем месяце, тогда окончание периода совпадает с окончанием месяца - Если существует несколько периодов, которые пересекаются на текущую дату, первый из них будет удален """ period = None days = 0 start_date = end_date = None try: # Найти период, который включает текущую дату period = self.boiler.periods.get(start__lte=self.date, end__gte=self.date) #print periods.query except Period.DoesNotExist: # Если период не найден, нужно убедиться есть ли период заканчивающийся в этом месяце # или период начинающийся в этом месяце days = get_month_last_day(self.date) # Все периоды, которые начинаются в месяце соответствующем дате s = self.boiler.periods.filter(start__month=self.date.month, start__year=self.date.year) # Все периоды, которые заканчиваются в месяце соответствующем дате e = self.boiler.periods.filter(end__month=self.date.month, end__year=self.date.year) start_date, end_date = get_month_range(self.date.year, self.date.month) # Если есть периоды, которые начинаются в текущем месяце, # тогда дата окончания периода равна 'дата начала' - 1 if len(s) > 0: end_date = get_month_day(self.date, s[0].start.day - 1) days = 0 #end_date.day if len(e) > 0: start_date = e[0].end days = 0 #end_date.day - start_date.day + 1 except Period.MultipleObjectsReturned: items = self.boiler.periods.filter(start__lte=self.date, end__gte=self.date) is_first = True # Удаляем пересекающиеся периоды, кроме первого for item in items: if is_first == True: period = item is_first = False else: item.delete() if period != None: # период первого месяца с даты начала периода, до последнего дня месяца start_period = get_range_revers(period.start) #print start_period # период последнего месяца с даты начала, до даты окончания периода end_period = get_range(period.end) #print end_period # Если дата расхода содержится в первом месячном периоде if contains(start_period, self.date): start_date = start_period[0] end_date = start_period[1] days = start_period[1].day - start_period[0].day + 1 # Если дата расхода содержится в последнем месячном периоде elif contains(end_period, self.date): start_date = end_period[0] end_date = end_period[1] days = end_date.day else: days = get_month_last_day(self.date) start_date, end_date = get_month_range(self.date.year, self.date.month) return (start_date, end_date, days)
def save(self, save_revision=False, *args, **kwargs): if self.fuel_info == None: raise FuelRemains.DoesNotExist("Информация о топливе не указана.") first_day = get_month_day(self.date, 1) range = get_range(self.date) if self.date.day == 1: pass else: try: obj = FuelRemains.objects.get(date=first_day, fuel_info__id=self.fuel_info.id) self.first_day_month = obj.first_day_month except FuelRemains.DoesNotExist: #traceback.print_exc(file=sys.stdout) #obj = FuelRemains() #obj.date = first_day #obj.fuel_info = self.fuel_info #obj.boiler = self.boiler #obj.creator = self.editor #obj.save(save_revision=True, force_insert=True) #self.first_day_month = obj.first_day_month pass except FuelRemains.MultipleObjectsReturned: #traceback.print_exc(file=sys.stdout) items = FuelRemains.objects.filter( date=first_day, fuel_info__id=self.fuel_info.id) is_first = True for item in items: if is_first == True: self.first_day_month = item.first_day_month is_first = False else: item.delete() fc = FuelConsumption.objects.filter( date__range=range, fuel_info__id=self.fuel_info.id).aggregate( actual=Sum('actual_day')) if fc['actual'] == None: fc['actual'] = 0.0 fi = FuelIncome.objects.filter( date__range=range, fuel_info__id=self.fuel_info.id).aggregate(income=Sum('today'), pickup=Sum('pickup')) if fi['income'] == None: fi['income'] = 0.0 if fi['pickup'] == None: fi['pickup'] = 0.0 self.tonnes = round( self.calc_remain_tonnes(self.first_day_month, fi['income'], fc['actual'], fi['pickup']), 3) self.days = 0 #if save_revision == True: # with reversion.create_revision(): # super(FuelRemains, self).save( *args, **kwargs) #else: super(FuelRemains, self).save(*args, **kwargs)