def push_next_fee(cls,date): if cls.check_next_fee(date): from lib.functions import date_formatter month = date_formatter(date)['month'] cls.make_fees(month) instance = cls(timestamp=month) instance.save()
def get_fee(self): from lib.functions import date_formatter s = 0 fees = self.fee_list.filter(ftype=FEE_TYPE_MONTHLY) for fee in fees: s += fee.get_sum(date_formatter()['month'])['fee'] return s
def get_proportion(self,date=None): from lib.functions import date_formatter from calendar import monthrange if not date: date=date_formatter()['day'] month_size=monthrange(date.year,date.month)[1] return round((month_size-date.day+1)/float(month_size),6)
def check_next_fee(cls,date): from lib.functions import date_formatter month = date_formatter(date)['month'] if cls.get_last_fee_date().timestamp < month.date(): return True else: return False
def get_proportion(self, date=None): from lib.functions import date_formatter from calendar import monthrange if not date: date = date_formatter()['day'] month_size = monthrange(date.year, date.month)[1] return round((month_size - date.day + 1) / float(month_size), 6)
def push_next_fee(cls, date): if cls.check_next_fee(date): from lib.functions import date_formatter month = date_formatter(date)['month'] cls.make_fees(month) instance = cls(timestamp=month) instance.save()
def check_next_fee(cls, date): from lib.functions import date_formatter month = date_formatter(date)['month'] if cls.get_last_fee_date().timestamp < month.date(): return True else: return False
def check_fee(self, card, fee_date=None, **kwargs): from lib.functions import date_formatter date = date_formatter(fee_date) my_not_maked_fees = Fee.objects.filter(card__exact=card, tp__exact=self.tp, fee_type__exact=self.fee_type, maked__exact=False, deleted__exact=False, rolled_by__exact=None) my_not_maked_fees.delete() my_maked_fees = Fee.objects.filter(card__exact=card, tp__exact=self.tp, fee_type__exact=self.fee_type, deleted__exact=False, rolled_by__exact=None) if not card.bill: return (False, "This card have not account with bill") if self.fee_type.ftype == FEE_TYPE_ONCE: return self.make_fee(card, date['day'], **kwargs) if self.fee_type.ftype == FEE_TYPE_CUSTOM: c = my_maked_fees.filter(timestamp__gte=date['month'], sum__lt=0) if c.count() > 0: return self.make_fee(card, date['day'], maked_fees=c, **kwargs) else: return self.make_fee(card, date['day'], **kwargs) if self.fee_type.ftype == FEE_TYPE_DAILY: c = my_maked_fees.filter(timestamp__gte=date['day']) if c.count() > 0: return (False, "Fee already maked") else: return self.make_fee(card, date['day'], **kwargs) if self.fee_type.ftype == FEE_TYPE_WEEKLY: c = my_maked_fees.filter(timestamp__gte=date['week']) if c.count() > 0: return (False, "Fee already maked") else: return self.make_fee(card, date['week'], **kwargs) if self.fee_type.ftype == FEE_TYPE_MONTHLY: c = my_maked_fees.filter(timestamp__gte=date['month']) if c.count() > 0: return (False, "Fee already maked") else: return self.make_fee(card, date['month'], **kwargs) if self.fee_type.ftype == FEE_TYPE_YEARLY: c = my_maked_fees.filter(timestamp__gte=date['year']) if c.count() > 0: return (False, "Fee already maked") else: return self.make_fee(card, date['year'], **kwargs)
def check_past_activation(self,activated): from lib.functions import date_formatter, add_months last_fee_date = FeesCalendar.get_last_fee_date().timestamp if not activated: activated = date.today() if activated < last_fee_date: next_fee_date = add_months(date_formatter(activated)['month'].date(),1) self.make_fees(next_fee_date) self.check_past_activation(next_fee_date) else: return True
def check_past_activation(self, activated): from lib.functions import date_formatter, add_months last_fee_date = FeesCalendar.get_last_fee_date().timestamp if not activated: activated = date.today() if activated < last_fee_date: next_fee_date = add_months( date_formatter(activated)['month'].date(), 1) self.make_fees(next_fee_date) self.check_past_activation(next_fee_date) else: return True
def check_fee(self,card,fee_date=None,**kwargs): from lib.functions import date_formatter date = date_formatter(fee_date) my_not_maked_fees = Fee.objects.filter(card__exact=card, tp__exact=self.tp, fee_type__exact=self.fee_type,maked__exact=False, deleted__exact=False, rolled_by__exact=None) my_not_maked_fees.delete() my_maked_fees = Fee.objects.filter(card__exact=card, tp__exact=self.tp, fee_type__exact=self.fee_type, deleted__exact=False, rolled_by__exact=None) if not card.bill: return (False,"This card have not account with bill") if self.fee_type.ftype == FEE_TYPE_ONCE: return self.make_fee(card,date['day'],**kwargs) if self.fee_type.ftype == FEE_TYPE_CUSTOM: c = my_maked_fees.filter(timestamp__gte=date['month'],sum__lt=0) if c.count()>0: return self.make_fee(card,date['day'],maked_fees=c,**kwargs) else: return self.make_fee(card,date['day'],**kwargs) if self.fee_type.ftype == FEE_TYPE_DAILY: c = my_maked_fees.filter(timestamp__gte=date['day']) if c.count()>0: return (False,"Fee already maked") else: return self.make_fee(card,date['day'],**kwargs) if self.fee_type.ftype == FEE_TYPE_WEEKLY: c = my_maked_fees.filter(timestamp__gte=date['week']) if c.count()>0: return (False,"Fee already maked") else: return self.make_fee(card,date['week'],**kwargs) if self.fee_type.ftype == FEE_TYPE_MONTHLY: c = my_maked_fees.filter(timestamp__gte=date['month']) if c.count()>0: return (False,"Fee already maked") else: return self.make_fee(card,date['month'],**kwargs) if self.fee_type.ftype == FEE_TYPE_YEARLY: c = my_maked_fees.filter(timestamp__gte=date['year']) if c.count()>0: return (False,"Fee already maked") else: return self.make_fee(card,date['year'],**kwargs)
def get_sum(self,date=None): from lib.functions import date_formatter sum = 0 ret = 0 full = 0 bonus = self.bonus*self.get_proportion(date) retbonus = self.bonus*(1-self.get_proportion(date)) if not date: date=date_formatter()['day'] day = date.day if not self.ftype == FEE_TYPE_CUSTOM: ranges = self.ranges.filter(interval__start__lte=date).filter(interval__end__gte=date) if not ranges.count(): sum = self.sum for range in ranges: sum += range.sum if self.proportional: sum=round(sum*self.get_proportion(date),2) if self.ftype==FEE_TYPE_ONCE: ret=sum print {'fee':sum,'ret':ret,'full':sum,'bonus':bonus,'retbonus':retbonus} return {'fee':sum,'ret':ret,'full':sum,'bonus':bonus,'retbonus':retbonus} ranges = self.customranges.filter(interval__start__lte=date).filter(interval__end__gte=date).filter(startday__lte=day).filter(endday__gte=day) for range in ranges: sum += range.sum ret += range.ret ranges = self.ranges.filter(interval__start__lte=date).filter(interval__end__gte=date) for range in ranges: full += range.sum if not ranges.count(): full = self.sum print {'fee':sum,'ret':ret,'full':sum,'bonus':bonus,'retbonus':retbonus} return {'fee':sum,'ret':ret,'full':full,'bonus':bonus,'retbonus':retbonus}
def get_sum(self, date=None): from lib.functions import date_formatter sum = 0 ret = 0 full = 0 bonus = self.bonus * self.get_proportion(date) retbonus = self.bonus * (1 - self.get_proportion(date)) if not date: date = date_formatter()['day'] day = date.day if not self.ftype == FEE_TYPE_CUSTOM: ranges = self.ranges.filter(interval__start__lte=date).filter( interval__end__gte=date) if not ranges.count(): sum = self.sum for range in ranges: sum += range.sum if self.proportional: sum = round(sum * self.get_proportion(date), 2) if self.ftype == FEE_TYPE_ONCE: ret = sum print { 'fee': sum, 'ret': ret, 'full': sum, 'bonus': bonus, 'retbonus': retbonus } return { 'fee': sum, 'ret': ret, 'full': sum, 'bonus': bonus, 'retbonus': retbonus } ranges = self.customranges.filter(interval__start__lte=date).filter( interval__end__gte=date).filter(startday__lte=day).filter( endday__gte=day) for range in ranges: sum += range.sum ret += range.ret ranges = self.ranges.filter(interval__start__lte=date).filter( interval__end__gte=date) for range in ranges: full += range.sum if not ranges.count(): full = self.sum print { 'fee': sum, 'ret': ret, 'full': sum, 'bonus': bonus, 'retbonus': retbonus } return { 'fee': sum, 'ret': ret, 'full': full, 'bonus': bonus, 'retbonus': retbonus }
def launch_hamster(self,countdown=True,debug=True): from lib.functions import date_formatter, add_months from tv.models import FeeType, Fee, Payment, TariffPlan from django.db.models import Max from time import sleep import gc gc.enable() if debug: print "Abonent %s" % self if countdown: print " hamster ready to be launched." print " all finance log will be recalculated." print " use only when neccecary." print " -------------------------------------" print " you have 5 sec to cancel... (Ctrl+C)" try: sleep(1) print " 4..." sleep(1) print " 3..." sleep(1) print " 2..." sleep(1) print " 1..." sleep(1) print " hamster launched..." except KeyboardInterrupt: print " hamster launching cancelled..." print " Bye..." return False print " resetting all finance log..." self.bill.balance=0 self.bill.save() Fee.objects.filter(bill=self.bill).delete() self.catv_card.service_log.all().delete() pp = Payment.objects.filter(bill=self.bill) for p in pp: p.maked=False if not p.bank_date: p.bank_date=p.timestamp.date() p.save() if debug: print " Done..." catv = FeeType.objects.get(pk=5) catv_part = FeeType.objects.get(pk=1) tp = TariffPlan.objects.all() tp = tp[0] thismonth = date_formatter(date.today())['month'].date() nextmonth = date_formatter(add_months(thismonth,1))['month'].date() new = True prev_closing_fee = 0 prev_closing_month = date(1970,1,1) for i in self.intervals.all(): if debug: print " processing interval %s-%s" % (i.start,i.finish) if not i.finish: i.finish = thismonth d = i.start for service in self.catv_card.services.all(): service.active=True service.save(sdate=d,descr="%s/%s" % (i.s1,i.s2)) self.catv_card.active = True self.catv_card.save() self.disabled= False self.save() dd = date_formatter(add_months(d,1))['month'].date() if debug: print " starting date %s" % d pp = Payment.objects.filter(bill=self.bill,maked=False,bank_date__lte=d) for p in pp: p.save() p.make() if d > date(2006,2,1) or not new: full = catv.get_sum(date=i.start)['fee'] sum = catv_part.get_sum(date=i.start)['fee'] if debug: print " full fee: %s" % full print " current fee: %s" % sum print " closing fee: %s" % prev_closing_fee print " closing month: %s" % prev_closing_month print " currnet month: %s" % date_formatter(d)['month'].date() print sum+prev_closing_fee>full print date_formatter(d)['month'].date() == prev_closing_month if sum+prev_closing_fee>full and date_formatter(d)['month'].date() == prev_closing_month: print " overpowered fee catched! fixed..." f = Fee(bill=self.bill,card=self.catv_card,sum=full-prev_closing_fee,tp=tp,fee_type=catv_part,timestamp=d, inner_descr=u'Кабельное ТВ | подключение (!)') else: f = Fee(bill=self.bill,card=self.catv_card,sum=sum,tp=tp,fee_type=catv_part,timestamp=d, inner_descr=u'Кабельное ТВ | подключение') f.save() maxid = Fee.objects.aggregate(Max('id'))['id__max'] f = Fee.objects.get(pk=maxid) f.make() else: if debug: print " ignored because before 2006-02-01" f = Fee(bill=self.bill,card=self.catv_card,sum=0,tp=tp,fee_type=catv_part,timestamp=d, inner_descr=u'Кабельное ТВ | подключение (оплачено на месте)') f.save() maxid = Fee.objects.aggregate(Max('id'))['id__max'] f = Fee.objects.get(pk=maxid) f.make() new = False d = dd dd = date_formatter(add_months(d,1))['month'].date() pp = Payment.objects.filter(bill=self.bill,maked=False,bank_date__lte=d) for p in pp: p.save() p.make() while dd < i.finish or dd == nextmonth or dd == thismonth: if debug: print " processing date %s" % d sum = catv.get_sum(date=d)['fee'] f = Fee(bill=self.bill,card=self.catv_card,sum=sum,tp=tp,fee_type=catv,timestamp=d, inner_descr=u'Кабельное ТВ | абонплата') f.save() maxid = Fee.objects.aggregate(Max('id'))['id__max'] f = Fee.objects.get(pk=maxid) f.make() d = dd dd = date_formatter(add_months(d,1))['month'].date() pp = Payment.objects.filter(bill=self.bill,maked=False,bank_date__lte=d) for p in pp: p.save() p.make() if d < thismonth: if debug: print " closing date %s" % d full = catv.get_sum(date=i.finish)['fee'] sum = full - catv_part.get_sum(date=i.finish)['ret'] prev_closing_fee = sum prev_closing_month = date_formatter(i.finish)['month'].date() f = Fee(bill=self.bill,card=self.catv_card,sum=sum,tp=tp,fee_type=catv,timestamp=i.finish, inner_descr=u'Кабельное ТВ | отключение') f.save() maxid = Fee.objects.aggregate(Max('id'))['id__max'] f = Fee.objects.get(pk=maxid) f.make() for service in self.catv_card.services.all(): service.active=False service.save(sdate=d,descr="") self.catv_card.active = False self.catv_card.save() self.disabled= True self.save() pp = Payment.objects.filter(bill=self.bill,maked=False,bank_date__lte=d) for p in pp: p.save() p.make() pp = Payment.objects.filter(bill=self.bill,maked=False) for p in pp: p.save() p.make() if debug: print " hamster finished his work and stopped" print " dont forget donate to WWF ;)" print " Bye..." gc.collect() return True
def launch_hamster(self, countdown=True, debug=True): from lib.functions import date_formatter, add_months from tv.models import FeeType, Fee, Payment, TariffPlan from django.db.models import Max from time import sleep import gc gc.enable() if debug: print "Abonent %s" % self if countdown: print " hamster ready to be launched." print " all finance log will be recalculated." print " use only when neccecary." print " -------------------------------------" print " you have 5 sec to cancel... (Ctrl+C)" try: sleep(1) print " 4..." sleep(1) print " 3..." sleep(1) print " 2..." sleep(1) print " 1..." sleep(1) print " hamster launched..." except KeyboardInterrupt: print " hamster launching cancelled..." print " Bye..." return False print " resetting all finance log..." self.bill.balance = 0 self.bill.save() Fee.objects.filter(bill=self.bill).delete() self.catv_card.service_log.all().delete() pp = Payment.objects.filter(bill=self.bill) for p in pp: p.maked = False if not p.bank_date: p.bank_date = p.timestamp.date() p.save() if debug: print " Done..." catv = FeeType.objects.get(pk=5) catv_part = FeeType.objects.get(pk=1) tp = TariffPlan.objects.all() tp = tp[0] thismonth = date_formatter(date.today())['month'].date() nextmonth = date_formatter(add_months(thismonth, 1))['month'].date() new = True prev_closing_fee = 0 prev_closing_month = date(1970, 1, 1) for i in self.intervals.all(): if debug: print " processing interval %s-%s" % (i.start, i.finish) if not i.finish: i.finish = thismonth d = i.start for service in self.catv_card.services.all(): service.active = True service.save(sdate=d, descr="%s/%s" % (i.s1, i.s2)) self.catv_card.active = True self.catv_card.save() self.disabled = False self.save() dd = date_formatter(add_months(d, 1))['month'].date() if debug: print " starting date %s" % d pp = Payment.objects.filter(bill=self.bill, maked=False, bank_date__lte=d) for p in pp: p.save() p.make() if d > date(2006, 2, 1) or not new: full = catv.get_sum(date=i.start)['fee'] sum = catv_part.get_sum(date=i.start)['fee'] if debug: print " full fee: %s" % full print " current fee: %s" % sum print " closing fee: %s" % prev_closing_fee print " closing month: %s" % prev_closing_month print " currnet month: %s" % date_formatter( d)['month'].date() print sum + prev_closing_fee > full print date_formatter( d)['month'].date() == prev_closing_month if sum + prev_closing_fee > full and date_formatter( d)['month'].date() == prev_closing_month: print " overpowered fee catched! fixed..." f = Fee(bill=self.bill, card=self.catv_card, sum=full - prev_closing_fee, tp=tp, fee_type=catv_part, timestamp=d, inner_descr=u'Кабельное ТВ | подключение (!)') else: f = Fee(bill=self.bill, card=self.catv_card, sum=sum, tp=tp, fee_type=catv_part, timestamp=d, inner_descr=u'Кабельное ТВ | подключение') f.save() maxid = Fee.objects.aggregate(Max('id'))['id__max'] f = Fee.objects.get(pk=maxid) f.make() else: if debug: print " ignored because before 2006-02-01" f = Fee(bill=self.bill, card=self.catv_card, sum=0, tp=tp, fee_type=catv_part, timestamp=d, inner_descr= u'Кабельное ТВ | подключение (оплачено на месте)') f.save() maxid = Fee.objects.aggregate(Max('id'))['id__max'] f = Fee.objects.get(pk=maxid) f.make() new = False d = dd dd = date_formatter(add_months(d, 1))['month'].date() pp = Payment.objects.filter(bill=self.bill, maked=False, bank_date__lte=d) for p in pp: p.save() p.make() while dd < i.finish or dd == nextmonth or dd == thismonth: if debug: print " processing date %s" % d sum = catv.get_sum(date=d)['fee'] f = Fee(bill=self.bill, card=self.catv_card, sum=sum, tp=tp, fee_type=catv, timestamp=d, inner_descr=u'Кабельное ТВ | абонплата') f.save() maxid = Fee.objects.aggregate(Max('id'))['id__max'] f = Fee.objects.get(pk=maxid) f.make() d = dd dd = date_formatter(add_months(d, 1))['month'].date() pp = Payment.objects.filter(bill=self.bill, maked=False, bank_date__lte=d) for p in pp: p.save() p.make() if d < thismonth: if debug: print " closing date %s" % d full = catv.get_sum(date=i.finish)['fee'] sum = full - catv_part.get_sum(date=i.finish)['ret'] prev_closing_fee = sum prev_closing_month = date_formatter(i.finish)['month'].date() f = Fee(bill=self.bill, card=self.catv_card, sum=sum, tp=tp, fee_type=catv, timestamp=i.finish, inner_descr=u'Кабельное ТВ | отключение') f.save() maxid = Fee.objects.aggregate(Max('id'))['id__max'] f = Fee.objects.get(pk=maxid) f.make() for service in self.catv_card.services.all(): service.active = False service.save(sdate=d, descr="") self.catv_card.active = False self.catv_card.save() self.disabled = True self.save() pp = Payment.objects.filter(bill=self.bill, maked=False, bank_date__lte=d) for p in pp: p.save() p.make() pp = Payment.objects.filter(bill=self.bill, maked=False) for p in pp: p.save() p.make() if debug: print " hamster finished his work and stopped" print " dont forget donate to WWF ;)" print " Bye..." gc.collect() return True