Esempio n. 1
0
def show_bill(request,type,id):
    bill_types={'cash':Cash,'cashless':Cashless}
    bill=bill_types[type].objects.get(id=id)
    payment=bill.payment_set.get()
    assets=payment.asset_set.all()
    for asset in assets:
        asset.place=asset.place_asset_set.latest('installation_date').place.place
    if type=='cashless':
        # если безнал - надо получить пройденные этапы и не пройденные и предоставить возможность их пройти в "пакетном режиме"
        from user_settings.functions import get_stages
        stages = get_stages(";").split(";")
        # Класс для отображения в шаблоне этапов с датами по порядку
        class Stages_info():
            class Stage():
                def __init__(self,n,d):
                    self.name = n
                    self.date = d
                    self.id_name = n.replace(" ","_")
            def __init__(self):
                self.items=[]
                for x in stages:
                    self.items.append(self.Stage(x,""))
                self.items.append(self.Stage("Товар получен",""))
                self.items.append(self.Stage("Документы сданы",""))
            def edit(self,n,d):
                self.items[n].date=d
            def date_of_assets(self,d):
                self.items[-2].date=d
            def date_of_documents(self,d):
                self.items[-1].date=d
        si = Stages_info()
        if bill.dates:
            d=bill.dates.split(";")
            for x in range(len(stages)):
                if not d[x]:
                    pass
                else:
                    si.edit(x,d[x])
        if bill.date_of_assets:
            si.date_of_assets(bill.date_of_assets)
        if bill.date_of_documents:
            si.date_of_documents(bill.date_of_documents)
        return (True,('show_bill.html',{},{'bill':bill,'assets':assets,'cashles':True,'stages_info':si},request,app))



    return (True,('show_bill.html',{},{'bill':bill,'assets':assets},request,app))
Esempio n. 2
0
def all_bills(request):
    # вспомогательный класс для вывода счётов по этапам
    class Bill_Set(object):
        def __init__(self):
            self.name=""
            self.set=[]
            self.id_name = ""
        def __unicode__(self):
            return  self.name+str( self.set)
        def __str__(self):
            return self.name+str(self.set)
        def __repr__(self):
            return self.name+" "+str(self.set)
        def __getattribute__(self,name):
            if name=='id_name':
                name = object.__getattribute__(self,'name')
                if name == 'Получить товар':
                    return 'Товар_получен'
                if name == 'Сдать документы':
                    return 'Документы_сданы'
                return object.__getattribute__(self,'name').replace(" ","_")
            return object.__getattribute__(self,name)
    class Bill_with_title():
        def __init__(self,c,title):
            self.bill=c
            self.title=title
        def __repr__(self):
            return self.title+"; "+str(self.bill.id)
    lang,user,fio,method = get_info(request)
    # выбираем только ещё не закрытые чеки
    cashs_tmp =  Cash.objects.filter(payment__in=Payment.objects.filter(deleted=False)).filter(closed_for=False)
    cashs=[]
    for c in cashs_tmp:
        # Для каждого чека делаем подсказку - что в нём
        title=""
        payment=c.payment_set.get()
        assets=payment.asset_set.all()
        for asset in assets:
            title+=asset.model
            title+="; "
        title=title[:-2]
        cashs.append(Bill_with_title(c,title))
    # выбираем только счета, по которым ещё не сдали документы
    cashlesss = Cashless.objects.filter(payment__in=Payment.objects.filter(deleted=False))
    # сортируем счета по безналу по этапам
    # импортируем функцию для получения количества этапов на счёт
    from user_settings.functions import get_stages
    stages = get_stages(";").split(";")
    stages_number = len(stages)
    cashlesss_sorted=[Bill_Set() for x in range(stages_number+2)]
    for x in range(stages_number):
        cashlesss_sorted[x].name=stages[x]
    cashlesss_sorted[x+1].name = "Получить товар"
    cashlesss_sorted[x+2].name = "Сдать документы"
    # Делаем класс a.name and a.list, делаем из него список по очереди
    # каждый класс - один из этапов
    for cl in cashlesss:
        # Для каждого чека делаем подсказку - что в нём
        title=""
        payment=cl.payment_set.get()
        assets=payment.asset_set.all()
        for asset in assets:
            title+=asset.model
            title+="; "
        title=title[:-2]
        # Старый варинат, проверял cl.dates, но делает логическую ошибку. Заменён
        # if cl.dates:
            # d=cl.dates.split(";")
            # for x in range(stages_number):
                # if not d[x]:
                    # cashlesss_sorted[x].set.append(Bill_with_title(cl,title))
                    # break
        # else:
            # cashlesss_sorted[0].set.append(Bill_with_title(cl,title))
        # if not cl.date_of_assets:
            # cashlesss_sorted[x+1].set.append(Bill_with_title(cl,title))   
            # continue
        # if not cl.date_of_documents:
            # cashlesss_sorted[x+2].set.append(Bill_with_title(cl,title))
            # continue
            
        # Новый вариант:
        d=cl.dates.split(";")
        for x in range(stages_number):
            if not d[x]:
                cashlesss_sorted[x].set.append(Bill_with_title(cl,title))
                break
        else:
            if not cl.date_of_assets:
                cashlesss_sorted[x+1].set.append(Bill_with_title(cl,title))   
                continue
            if not cl.date_of_documents:
                cashlesss_sorted[x+2].set.append(Bill_with_title(cl,title))
                continue
    # raise ImportError
    return (True,('all_bills.html',{},{'title':'Список всех счетов и чеков','cashs':cashs, 'cashlesss':cashlesss_sorted,'stages':stages,'stages_range':range(stages_number)},request,app))
Esempio n. 3
0
def bill_cashless_add(request):
    # def what_to_people_friendly(a):
    #     b=list(set(a.split(';')))
    #     c = ''
    #     for word in b:
    #         count=a.split(';').count(word)
    #         c = c + word + ' - ' + str(count) + u' шт; '
    #     return c
    lang,user,fio,method = get_info(request)
    # Получаем настройки из файла:
    import ConfigParser
    config=ConfigParser.RawConfigParser()
    config.read(config_file)
    # stages = ";".join([a[1] for a in config.items("cashless_stages")])
    from user_settings.functions import get_stages
    stages = get_stages(";")

    if request.method == 'POST':
        # Порядок действия таков:
        # 1) Создаём Cashless c этапами из файла настройки
        # 2) Создаём Payment с этим Cash
        # 3) Создаём Garanty - если её ещё нет. Если есть - добавляем к имеющейся
        # 4) Итерируем по элементам в форме от 1 до макс добавляя активы в список активов
        # 5) Если всё прошло хорошо - активы из списка сохраняем
        bill_date = request.POST.get('date','')
        if bill_date:
            a=[int(a) for a in bill_date.split(bill_date[2])]
            a.reverse()
            bill_date=datetime.datetime(*a)
        else:
            bill_date = datetime.datetime.now()
        cashless = Cashless(date_of_invoice = bill_date,
                stages=stages,
                # нужно для более простой обработки в дальнейшем
                dates = ';'.join(map(lambda x: '',range(len(stages.split(';'))))),
                contractor = Contractor.objects.get(id=request.POST.get('contractor_id')),
                bill_number = request.POST.get('bill_number'),
                )
        cashless.save()
        payment = Payment(cashless = cashless,
                )
        payment.save()
        try:
            garanty = Garanty.objects.get(number = request.POST.get('garanty'))
        except Garanty.DoesNotExist:
            garanty = Garanty(number = request.POST.get('garanty'))
            garanty.save()
        # Для записки сопровождения счёта
        places = ''
        what = ''
        price = 0
        for item_number in range(1,int(request.POST.get('max_asset_form_number'))+1):
            sitem_number = str(item_number)
            if sitem_number+'_model' in request.POST:
                for count in range(0,int(request.POST.get('count_of_asset'+sitem_number))):
                    a=Asset(asset_type = Asset_type.objects.get(id=request.POST.get(sitem_number+'_asset_type')),
                        payment = payment,
                        garanty = garanty,
                        model = request.POST.get(sitem_number+'_model'),
                        status = Status.objects.get(id=request.POST.get(sitem_number+'_status')),
                        guarantee_period = request.POST.get(sitem_number+'_guarantee_period'),
                        note = request.POST.get(sitem_number+'_note'),
                        price = request.POST.get(sitem_number+'_price'),
                        )
                    a.save()
                    cur_place=Place_Asset(installation_date = bill_date,
                        asset = a,
                        place = Place.objects.get(id=request.POST.get(sitem_number+'_current_place')),
                        )
                    cur_place.save()
                    # a_TMP = cur_place.place.place
                    if cur_place.place.place + u';' not in places:
                        places = places+ cur_place.place.place + u';'
                    # if a.model + u';' not in what:    
                        # what = what + a.model + u';'
                    what = what + a.model + u';'
                    price += float(a.price)
        places = places[:-1]
        # Приводим к человеческому виду "кот - 5шт"
        what = what_to_people_friendly(what[:-1])
        # Теперь надо выдать штуку для распечатки сопровождения счёта
        text = config.get('cashless','text')
        text=text.decode('utf8').format({'number':cashless.bill_number,'where':places,'date':str(cashless.date_of_invoice),'price':price,'what':what,'who':fio.fio,'phones':fio.tel,'date2':str(datetime.datetime.now()).split('.')[0]}).replace('\n','<p>')
        # window.open("http://mylink.net", "windowName");
        # window.localStorage.setItem('text',text)
        # document.body.innerHTML=window.localStorage.getItem('text')        
        # return (False,HttpResponseRedirect('/all_bills/'))
        # Открывается окно с сопровождающей запиской, из него уже открывается окно списка счетов
        show_cashless_maintain = config.get('cashless','show_text')
        if show_cashless_maintain=='True':
            return (True,('cashless_redirect.html', {},{'text':text,'cashless':cashless},request,app))
        return (False,HttpResponseRedirect('/all_bills/'))
    # Создаём новый счёт, значит теперь надо номер новой гарантии
    try:
        garanty_number = int(Garanty.objects.all().order_by('-number')[0].number)+1
    except IndexError:
        # значит, гарантий ещё в базе нет
        garanty_number = 0

    contractors_list = assets.api.get_contractors_list(request,internal=True)
    asset_types_list = assets.api.get_asset_type_list(request,internal=True)
    return (True,
            ('new_bill.html',
             {'NewCashBillForm':{'garanty':garanty_number}},
             {'stages':stages,'contractors_list':contractors_list,
              'asset_types_list':asset_types_list,
              'method':method},
             request,
             app))