Exemple #1
0
 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()    
Exemple #2
0
 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
Exemple #3
0
 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)
Exemple #4
0
 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
Exemple #5
0
 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
Exemple #6
0
 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)
Exemple #7
0
 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()
Exemple #8
0
 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
Exemple #9
0
    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)
Exemple #10
0
 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
Exemple #11
0
 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
Exemple #12
0
    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)
Exemple #13
0
 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}
Exemple #14
0
    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
        }
Exemple #15
0
 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
Exemple #16
0
    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