Пример #1
0
    def test_4(self):
        """
        импорт из https://proverkacheka.com/check&p=2

        получить все чеки
            получить последний чек загруденный Робо1
            загружать последоватетно страницы из https://proverkacheka.com/check&p=2 до тех пор пока не найдем на странице последний чек
                загрузить страницу
                вытащить из нее чеки
                    преобразовав чеки в формат для сравнения как текст из QR кода
                        параметров всего 5
                попыиаиься найти нужный чек
                если не нашли загрузить следубщую, ограничимся 100 страницами, но первый раз гораничение в 7000
        сохранить их в репозиторий от имени Робо1
             получить список QR кодов скормить его стандартном мехаизму сохранения чеков у пользователей
        потом возможно использовать их для показа похожих товаров в других магазинах и рекомедации цены
        """

        robo1_employee = Employee(title='robo1', key='robo1_123zxc')
        robo1_employee.save()

        company_family = Company(title='family')
        company_family.save()
        company_family.employees.add(robo1_employee)

        last_fns_cheques = FNSCheque.objects.filter(
            company=company_family).order_by('-id')
        has_last_fns_cheques = False
        if last_fns_cheques:
            has_last_fns_cheques = True
            last_fns_cheque = last_fns_cheques[0]
Пример #2
0
 def mutate_and_get_payload(root, info, **input):
     employee = Employee(employee_name=input.get('employee_name'),
                         employee_city=City.objects.get(
                             city_name=input.get('employee_city')),
                         employee_title=Title.objects.get(
                             title_name=input.get('employee_title')))
     employee.save()
     return CreateEmployee(employee=employee)
Пример #3
0
    def dispatch(self, request, *args, **kwargs):
        from company.models import Employee
        # if not request.user.has_perms(self.required_permissions):
        employee = Employee.inRequest(request)
        if not employee.role.mask in self.required_roles:
            from django.conf import settings
            return redirect(settings.LOGIN_URL)

        return super(AccessAuthorizationMixin, self).dispatch(request, *args, **kwargs)
Пример #4
0
    def test_1(self):
        """
        Польователь первый раз пользуется сейрвисом

        Создать пользователя по клиентским данным
        Создать пользовтаелю сомпанию
        """

        pety_employee = Employee(title='Pety', key='123zxc')
        pety_employee.save()

        company_family = Company(title='family')
        company_family.save()
        company_family.employees.add(pety_employee)
        company_family.title = 'test'
        self.assertEqual('test', company_family.title)

        company_family = Company.objects.get(employees__in=[pety_employee])
        self.assertEqual('family', company_family.title)
Пример #5
0
def add_employee(request):
    if request.method == 'GET':
        last_employee_info = Employee.objects.last()
        company_list = Company.objects.all()
        department_list = Department.objects.all()
        return render(request, 'company/add_employee.html', locals())
    else:
        employee_index = request.POST.get('employee_index')
        employee_name = request.POST.get('employee_name')
        employee_gender = request.POST.get('employee_gender')
        employee_telephone = request.POST.get('employee_telephone')
        belong_department = request.POST.get('belong_department')

        department_info = Department.objects.get(id=belong_department)

        new_employee = Employee(employee_index=int(employee_index),
                                employee_name=employee_name,
                                employee_gender=employee_gender,
                                employee_telephone=employee_telephone,
                                belong_department=department_info)
        new_employee.save()
        return redirect('/company/employee/')
Пример #6
0
    def test_1(self):
        """
        Получений чека от контрагента по тексу из QR кода проверка того что сохранили в базу
        """
        #qr_text = 't=20201205T2206&s=293.90&fn=9288000100159749&i=14492&fp=2104555358&n=1'
        qr_text = 't=20201121T204000&s=390.96&fn=9285000100186911&i=123274&fp=1022052943&n=1'
        qr_text = 't=20201020T151800&s=96.00&fn=9287440300038062&i=44302&fp=1049436108&n=1'
        qr_text = 't=20201107T2058&s=63.00&fn=9288000100192401&i=439&fp=2880362760&n=1'

	robo1_employee = Employee(title='robo1', key='robo1_123zxc')
	robo1_employee.save()

	company_family = Company(title='family')
	company_family.save()
	company_family.employees.add(robo1_employee)

        #TODO временно отключу чтобы не дергать сервис и чтобы не забанили.
        FNSCheque.import_from_proverkacheka_com_format_like_fns(qr_text, company_family)

        for i in FNSCheque.objects.all():
            print i
        for i in FNSChequeElement.objects.all():
            print i

        c = FNSCheque.objects.get(id=1)

        self.assertEqual(c.fns_userInn, '7729532221')
        self.assertEqual(c.fns_fiscalDocumentNumber, '439')
        self.assertEqual(c.fns_fiscalDriveNumber, '9288000100192401')
        self.assertEqual(c.fns_fiscalSign, '2880362760')
        self.assertEqual(c.fns_dateTime, '2020-11-07T20:58:00')
        self.assertEqual(c.fns_totalSum, '6300')

        e = FNSChequeElement.objects.get(id=1)

        self.assertEqual(e.name,  u'\u0427\u0438\u0437\u0431\u0443\u0440\u0433\u0435\u0440 \u0441 \u043b\u0443\u043a\u043e\u043c \u0421\u0411' )
        self.assertEqual(e.price, 6300)
        self.assertEqual(e.quantity, 1.000)
        self.assertEqual(e.sum, 6300)
Пример #7
0
    def test_8(self):
        #TODO не указал что при подученни и функций можем брать только функции в компании котрую мы просчитываем
        #	слежует релатзовать интерфейс у класа репоитория функций когда:
        #		1. всегда укзаывается компания для коророй подучается функция
        #		2. или фуннкции можно получать только через когмпанию где компания является агрегатом функции чеков
        #			агрегат предпочтительнее так как явно видно его границы,
        #			а при работе с репозиторием не понятно почему нельзя создать метеод получения функции без компании.
        #				и это надо коментариями указывать в описании репозитория
        #для быстроты МВП делаем так
        """
	Сгенерить функции на основе имеющихся чеков в указанной компании.
	    не все клиенты пьют молоко а знаит функция молока им не нужна.
		создадим ее только когда пользователь попросит
	"""
        print 'test 8'
        #Берем все чеки на основе которых хотим понять что за функции нам нужны.
        pety_employee = Employee(title='Pety', key='123zxc')
        pety_employee.save()

        company_family = Company(title='family')
        company_family.save()
        company_family.employees.add(pety_employee)

        #добавляем чеки в компанию
        for i in Base.list_buy_milk():
            fns_cheque = FNSCheque(is_manual=False,
                                   company=company_family,
                                   fns_dateTime=i['dateTime'])
            fns_cheque.save()
            for j in i['items']:
                print j['name'].encode('utf8')
                e = FNSChequeElement(fns_cheque=fns_cheque,
                                     name=j['name'],
                                     quantity=j['quantity'],
                                     volume=j['volume'],
                                     sum=j['sum'])
                e.save()

        for i in Base.list_buy_cheese():
            fns_cheque = FNSCheque(is_manual=False,
                                   company=company_family,
                                   fns_dateTime=i['dateTime'])
            fns_cheque.save()
            for j in i['items']:
                print j['name'].encode('utf8')
                e = FNSChequeElement(fns_cheque=fns_cheque,
                                     name=j['name'],
                                     quantity=j['quantity'],
                                     volume=j['volume'],
                                     sum=j['sum'])
                e.save()

        print 'Base:'
        print FNSCheque.objects.all().count()
        print FNSChequeElement.objects.all().count()
        print '---'

        #function = PredictionLinearFunction.objects.get(base_type=u'МОЛОКО')
        #print function

        #для каждого элемента чек пробуем определить под какие из заложенных функций он подходит.
        #по содерибмому элемента - в назавние есть надпись МОЛОКО 3.2%
        #по привязке карточки продуката - в назавании карточки продукат есть надпись МОЛОКО 3.2%
        #по если в чеке есть не определнный товар Х и еще есть СМЕТАНА и ТВОРОГ,
        #	а также есть много чеков также с теремя товарами СМЕТАНА ТВОРОГО "МОЛОКО" - принимаем рещенеи что это МОЛОКО и добавляем его в функцию

        fns_cheques = FNSCheque.objects.filter(company=company_family)

        ##получем все типы базвых функий которые возможны
        #base_function_types = set()
        #for fns_cheque in fns_cheques:
        #    #for fns_cheque_element in fns_cheque.elements():
        #    for fns_cheque_element in FNSChequeElement.objects.filter(fns_cheque=fns_cheque):
        #	for base_function_type in PredictionLinear.base_function_types(fns_cheque_element):
        #	    base_function_types.add(base_function_type)
        #for base_function_type in base_function_types:
        #   print base_function_type.encode('utf8')
        #print
        base_function_types = PredictionLinear.auto_find_available_base_function_type(
            fns_cheques)

        ##создаем недостающие базовые функции
        #for base_function_type in base_function_types:
        #    if not PredictionLinearFunction.objects.filter(base_type=base_function_type).count():
        #	f = PredictionLinearFunction(base_type=base_function_type)
        #	f.save()
        PredictionLinear.save_functions_with_base_function_types(
            base_function_types)

        ##получаем базовые функции
        #functions = PredictionLinearFunction.objects.filter(base_type__in=base_function_types)
        #for f in functions:
        #    print f

        ##наполняем функции чеками которые им подходят
        #print len(fns_cheques)
        #for fns_cheque in fns_cheques:
        #    #for fns_cheque_element in fns_cheque.elements():
        #    for fns_cheque_element in FNSChequeElement.objects.filter(fns_cheque=fns_cheque):
        #	print '--->'
        #	print fns_cheque_element.get_title().encode('utf8')
        #	for base_function_type in PredictionLinear.base_function_types(fns_cheque_element):
        #	    function = PredictionLinearFunction.objects.get(base_type=base_function_type)
        #	    function.cheque_elements.add(fns_cheque_element)
        PredictionLinear.auto_add_cheque_elements_to_functions(fns_cheques)

        function = PredictionLinearFunction.objects.get(base_type=u'МОЛОКО')
        print function
        print '----'

        for f in PredictionLinearFunction.objects.all():
            print f

        elements = set()

        ##найдем чеки с 100% совпадением названия и связанных чеков, и на основе них рассчитам предложение за килограм
        #elements = set()
        #for e in function.cheque_elements.all():
        #    for en in FNSChequeElement.objects.filter(name=e.name):
        #	elements.add(en)
        elements.update(
            function.cheque_have_name_like_name_from_contains_cheques())

        ##взять ключевые слова у функции которые могут содержаться в чеках
        #for word in function.allow_key_words():
        #    qs = FNSChequeElement.objects.filter(name__icontains=word)
        #    for e_word in function.disallow_key_words():
        #	qs = qs.exclude(name__icontains=e_word)
        #    for e in qs:
        #	elements.add(e)
        elements.update(function.cheque_contains_key_words())

        for e in elements:
            print e.offer_element_params()

        #offers = []
        #for e in elements:
        #    offers.append(e.offer_element_params())

        #for o in offers:
        #    print o

        print 'end'
Пример #8
0
    def test_7(self):
        """
	создадим работника 
	Создать или выбрать компанию из имеющихся.
	    создать может рботник
	Добавить часть чеко в хранилище 
	досьать их из хранилища
	создать фунуцию предсказания
	укзать у нужных позиций в чеках созданную функцию
	спрогнозировать на 4 дня
	"""

        pety_employee = Employee(title='Pety', key='123zxc')
        pety_employee.save()

        #company_family = Company(owner=pety_employee, title='family')
        company_family = Company(title='family')
        company_family.save()
        company_family.employees.add(pety_employee)

        company_family = None
        company_family = Company.objects.filter(
            employees__in=[pety_employee])[0]

        function_title = 'Мilk'
        plf_milk = PredictionLinearFunction(title=function_title)
        plf_milk.save()
        for i in Base.list_buy_milk()[:5]:
            #for i in Base.list_buy_milk():
            fns_cheque = FNSCheque(is_manual=False,
                                   company=company_family,
                                   fns_dateTime=i['dateTime'])
            fns_cheque.save()
            for j in i['items']:
                e = FNSChequeElement(fns_cheque=fns_cheque,
                                     name=j['name'],
                                     quantity=j['quantity'],
                                     volume=j['volume'],
                                     sum=j['sum'])
                e.save()
                plf_milk.cheque_elements.add(e)

        plf_cheese = PredictionLinearFunction(title='Cheese')
        plf_cheese.save()
        for i in Base.list_buy_cheese():
            fns_cheque = FNSCheque(is_manual=False,
                                   company=company_family,
                                   fns_dateTime=i['dateTime'])
            fns_cheque.save()
            for j in i['items']:
                e = FNSChequeElement(fns_cheque=fns_cheque,
                                     name=j['name'],
                                     quantity=j['quantity'],
                                     volume=j['volume'],
                                     sum=j['sum'])
                e.save()
                plf_cheese.cheque_elements.add(e)

        #проверить авто определение веса
        good_count = 0
        for e in FNSChequeElement.objects.all():
            if e.has_weight_from_title() and float(
                    e.get_weight_from_title()) == float(e.volume):
                #if float(e.get_weight()) == float(e.volume * e.quantity):
                good_count += 1
                if not e.get_title() in [
                        u'СЫР МАСКАР.80% 250ГР', u'СЫР ПЛ С ЛУКОМ 90Г',
                        u'СЫР ПЛ ВОЛНА 45% 90Г', u'СЫР ПЛ ФЕТАКСА 400Г',
                        u'СЫР ПЛ ВОЛНА 45% 90Г', u'СЫР ПЛ ВОЛНА 45% 90Г'
                ]:
                    print e.get_title().encode('utf8')
                    assert False
        self.assertEqual(6, good_count)

        #fetch

        milk_function = PredictionLinear([])
        for element in PredictionLinearFunction.objects.filter(
                title=function_title):
            for i in element.elements():
                milk_function.append(i)

        cheese_function = PredictionLinear([])
        for element in PredictionLinearFunction.objects.filter(title='Cheese'):
            for i in element.elements():
                cheese_function.append(i)

        self.assertEqual(
            0.396, milk_function.average_weight_per_day_in_during_period())
        delta_days_future = milk_function.days_future()
        self.assertEqual(10.135, delta_days_future)

        self.assertEqual(
            0.097, cheese_function.average_weight_per_day_in_during_period())

        self.assertEqual(
            0.088,
            cheese_function.average_weight_per_day_from_first_buy_to_this_date(
                datetime.strptime("2020-06-02T10:00:00", '%Y-%m-%dT%H:%M:%S')))
        self.assertEqual(
            0.104,
            cheese_function.average_weight_per_day_from_first_buy_to_this_date(
                datetime.strptime("2020-06-03T10:00:00", '%Y-%m-%dT%H:%M:%S')))
        self.assertEqual(
            0.102,
            cheese_function.average_weight_per_day_from_first_buy_to_this_date(
                datetime.strptime("2020-06-04T10:00:00", '%Y-%m-%dT%H:%M:%S')))

        delta_days_future = cheese_function.days_future()
        self.assertEqual(9.0, delta_days_future)

        ##
        for i in Base.list_buy_milk()[5:]:
            fns_cheque = FNSCheque(is_manual=False,
                                   company=company_family,
                                   fns_dateTime=i['dateTime'])
            fns_cheque.save()
            for j in i['items']:
                e = FNSChequeElement(fns_cheque=fns_cheque,
                                     name=j['name'],
                                     quantity=j['quantity'],
                                     volume=j['volume'],
                                     sum=j['sum'])
                e.save()
                plf_milk.cheque_elements.add(e)
        #fetch
        milk_function = PredictionLinear([])
        for element in PredictionLinearFunction.objects.filter(
                title=function_title):
            for i in element.elements():
                milk_function.append(i)

        self.assertEqual(
            0.424, milk_function.average_weight_per_day_in_during_period())
        delta_days_future = milk_function.days_future()
        self.assertEqual(8.333, delta_days_future)