예제 #1
0
 def get_satisfaction_ratings(self, initial_date: datetime,
                              final_date: datetime):
     helper = Helper()
     initial_date = helper.naive_to_datetime(initial_date)
     final_date = helper.naive_to_datetime(final_date)
     if self.__all_satisfaction_ratings is None:
         self.set_all_satisfaction_ratings()
     return self.__all_satisfaction_ratings.filter(
         creation_date__range=[initial_date, final_date]).order_by(
             '-creation_date')
예제 #2
0
    def get_sales_actual_week(self):
        """
        Gets the following properties for each week's day: Name, Date and Earnings
        """
        helper = Helper()
        week_sales_list = []
        total_earnings = 0
        days_to_count = helper.get_number_day(datetime.now())
        day_limit = days_to_count
        start_date_number = 0

        while start_date_number <= day_limit:
            day_object = {
                'date':
                str(
                    helper.start_datetime(days_to_count).date().strftime(
                        '%d-%m-%Y')),
                'day_name':
                None,
                'earnings':
                None,
                'number_day':
                helper.get_number_day(
                    helper.start_datetime(days_to_count).date()),
            }

            day_tickets = self.tickets_pos.filter(ticket__created_at__range=[
                helper.start_datetime(days_to_count),
                helper.end_datetime(days_to_count)
            ])

            for ticket_item in day_tickets:
                for ticket_cartridge_detail_item in self.get_cartridges_tickets_details(
                ):
                    if ticket_cartridge_detail_item.ticket_base == ticket_item.ticket:
                        total_earnings += ticket_cartridge_detail_item.price
                for ticket_package_detail_item in self.get_packages_tickets_details(
                ):
                    if ticket_package_detail_item.ticket_base == ticket_item.ticket:
                        total_earnings += ticket_package_detail_item.price

            day_object['earnings'] = str(total_earnings)
            day_object['day_name'] = helper.get_name_day(
                helper.start_datetime(days_to_count).date())

            week_sales_list.append(day_object)

            # restarting counters
            days_to_count -= 1
            total_earnings = 0
            start_date_number += 1

        return json.dumps(week_sales_list)
예제 #3
0
    def get_access_logs_today(self):
        """
        :rtype: django.db.models.query.QuerySet
        """
        if self.__all_access_logs is None:
            self.set_all_access_logs()

        helper = Helper()
        year = int(datetime.now().year)
        month = int(datetime.now().month)
        day = int(datetime.now().day)
        initial_date = helper.naive_to_datetime(date(year, month, day))
        final_date = helper.naive_to_datetime(initial_date + timedelta(days=1))
        return self.__all_access_logs. \
            filter(access_to_room__range=(initial_date, final_date)). \
            order_by('-access_to_room')
예제 #4
0
    def get_info_rates_actual_week(self):
        """
        Gets the following properties for each week's day: Day name, Date, number day and total rates
        :rtype: list
        """
        helper = Helper()
        week_suggestions_list = []
        days_to_count = helper.get_number_day(datetime.now())
        day_limit = days_to_count
        start_date_number = 0

        while start_date_number <= day_limit:
            day_object = {
                'date':
                str(
                    helper.start_datetime(days_to_count).date().strftime(
                        '%d-%m-%Y')),
                'day_name':
                None,
                'total_rates':
                None,
                'number_day':
                helper.get_number_day(
                    helper.start_datetime(days_to_count).date()),
            }

            filtered_suggestions = self.satisfaction_ratings.filter(
                creation_date__range=[
                    helper.start_datetime(days_to_count),
                    helper.end_datetime(days_to_count)
                ])

            day_object['total_rates'] = str(filtered_suggestions.count())
            day_object['day_name'] = helper.get_name_day(
                helper.start_datetime(days_to_count).date())

            week_suggestions_list.append(day_object)

            # restarting counters
            days_to_count -= 1
            start_date_number += 1

        return json.dumps(week_suggestions_list)
예제 #5
0
    def get_diners_actual_week(self):
        if self.__all_access_logs is None:
            self.set_all_access_logs()
        helper = Helper()
        week_diners_list = []
        total_entries = 0
        days_to_count = helper.get_number_day(date.today())
        day_limit = days_to_count
        start_date_number = 0

        while start_date_number <= day_limit:
            day_object = {
                'date':
                str(
                    helper.start_datetime(days_to_count).date().strftime(
                        '%d-%m-%Y')),
                'day_name':
                None,
                'entries':
                None,
                'number_day':
                helper.get_number_day(
                    helper.start_datetime(days_to_count).date())
            }

            logs = self.__all_access_logs. \
                filter(access_to_room__range=[helper.start_datetime(days_to_count), helper.end_datetime(days_to_count)])

            for _ in logs:
                total_entries += 1

            day_object['entries'] = str(total_entries)
            day_object['day_name'] = helper.get_name_day(
                helper.start_datetime(days_to_count).date())

            week_diners_list.append(day_object)

            # restarting counters
            days_to_count -= 1
            total_entries = 0
            start_date_number += 1

        return json.dumps(week_diners_list)
예제 #6
0
    def get_sales_list(self, start_dt, final_dt):
        """
        Gets the following properties for each week's day: Name, Date and Earnings
        """
        helper = Helper()
        limit_day = start_dt + timedelta(days=1)
        total_days = (final_dt - start_dt).days
        week_sales_list = []
        count = 1
        total_earnings = 0

        while count <= total_days:
            day_tickets = self.tickets_pos.filter(
                ticket__created_at__range=[start_dt, limit_day])
            day_object = {
                'date': str(start_dt.date().strftime('%d-%m-%Y')),
                'day_name': None,
                'earnings': None,
                'number_day': helper.get_number_day(start_dt),
            }

            for ticket_item in day_tickets:
                for ticket_cartridge_detail_item in self.get_cartridges_tickets_details(
                ):
                    if ticket_cartridge_detail_item.ticket_base == ticket_item.ticket:
                        total_earnings += ticket_cartridge_detail_item.price
                for ticket_package_detail_item in self.get_packages_tickets_details(
                ):
                    if ticket_package_detail_item.ticket_base == ticket_item.ticket:
                        total_earnings += ticket_package_detail_item.price

            day_object['day_name'] = helper.get_name_day(start_dt.date())
            day_object['earnings'] = str(total_earnings)

            week_sales_list.append(day_object)

            # Reset data
            limit_day += timedelta(days=1)
            start_dt += timedelta(days=1)
            total_earnings = 0
            count += 1

        return week_sales_list
예제 #7
0
    def get_info_rates_list(self, initial_date: datetime,
                            final_date: datetime):
        """
        Returns a list with all the rates data for te selected range
        :rtype: list
        """
        helper = Helper()
        week_suggestions_list = []

        while initial_date <= final_date:
            day_object = {
                'date': str(initial_date.strftime('%d-%m-%Y')),
                'day_name': None,
                'total_rates': None,
                'number_day': helper.get_number_day(initial_date),
            }

            filtered_suggestions = self.satisfaction_ratings.filter(
                creation_date__range=[
                    helper.naive_to_datetime(initial_date),
                    helper.naive_to_datetime(initial_date + timedelta(days=1))
                ])

            day_object['total_rates'] = str(filtered_suggestions.count())
            day_object['day_name'] = helper.get_name_day(initial_date)
            week_suggestions_list.append(day_object)

            # restarting counters
            initial_date = initial_date + timedelta(days=1)

        return week_suggestions_list
예제 #8
0
    def get_weeks_entries(self, initial_dt, final_dt):
        """
        Gets the following properties for each week's day: Name, Date and Earnings
        """
        if self.__all_access_logs is None:
            self.set_all_access_logs()

        helper = Helper()
        limit_day = initial_dt + timedelta(days=1)
        weeks_list = []
        count = 1
        total_days = (final_dt - initial_dt).days

        while count <= total_days:
            diners_entries = self.__all_access_logs.filter(
                access_to_room__range=[initial_dt, limit_day])
            day_object = {
                'date':
                str(
                    timezone.localtime(initial_dt).date().strftime(
                        '%d-%m-%Y')),
                'day_name':
                helper.get_name_day(initial_dt.date()),
                'entries':
                diners_entries.count(),
                'number_day':
                helper.get_number_day(initial_dt)
            }

            weeks_list.append(day_object)

            # Reset data
            limit_day += timedelta(days=1)
            initial_dt += timedelta(days=1)
            count += 1

        return weeks_list
예제 #9
0
    def get_all_diners_logs_list(self, initial_date, final_date):
        helper = Helper()
        diners_logs_list = []

        diners_logs_objects = self.get_access_logs(initial_date, final_date)

        for diner_log in diners_logs_objects:
            diner_log_object = {
                'rfid':
                diner_log.RFID,
                'access':
                datetime.strftime(timezone.localtime(diner_log.access_to_room),
                                  "%B %d, %I, %H:%M:%S %p"),
                'number_day':
                helper.get_number_day(diner_log.access_to_room),
            }
            if diner_log.diner:
                diner_log_object['SAP'] = diner_log.diner.employee_number
                diner_log_object['name'] = diner_log.diner.name
            else:
                diner_log_object['SAP'] = ''
                diner_log_object['name'] = ''
            diners_logs_list.append(diner_log_object)
        return diners_logs_list
예제 #10
0
def RFID(request):
    helper = Helper()
    diners_helper = DinersHelper()

    if request.method == 'POST':
        rfid = str(request.body).split('"')[3].replace(" ", "")
        if settings.DEBUG:
            print(rfid)

        if rfid is None:
            if settings.DEBUG:
                print('no se recibio rfid')
            return HttpResponse('No se recibió RFID\n')
        else:
            access_logs = diners_helper.get_access_logs_today()
            exists = False

            for log in access_logs:
                if rfid == log.RFID:
                    exists = True
                    break

            if exists:
                if settings.DEBUG:
                    print('El usuario ya se ha registrado')
                return HttpResponse('El usuario ya se ha registrado')
            else:
                if len(rfid) < 7:
                    try:
                        diner = Diner.objects.get(RFID=rfid)
                        new_access_log = AccessLog(diner=diner, RFID=rfid)
                        new_access_log.save()
                    except Diner.DoesNotExist:
                        new_access_log = AccessLog(diner=None, RFID=rfid)
                        new_access_log.save()
                else:
                    if settings.DEBUG:
                        print('RFID Inválido\n')
                    return HttpResponse('RFID Inválido\n')

        return HttpResponse('Operacion Terminada\n')

    else:
        return redirect('diners:diners')
예제 #11
0
    def get(self, request, *args, **kwargs):
        helpers = Helper()
        sales_helper = TicketPOSHelper()
        products_helper = ProductsHelper()
        workbook = Workbook()
        count = 4

        ws1 = workbook.active
        ws1.title = "Reporte de Ventas"
        ws1['B1'] = 'Reporte General de Ventas'
        ws1['B1'].alignment = Alignment(horizontal='center')
        ws1.merge_cells('B1:R1')
        ws1['A3'] = 'ID'
        ws1['B3'] = 'ID Venta'
        ws1['C3'] = 'Núm. Orden'
        ws1['D3'] = 'Fecha'
        ws1['E3'] = 'Hora'
        ws1['F3'] = 'Horas'
        ws1['G3'] = 'ID Paquete'
        ws1['H3'] = 'Paquete'
        ws1['I3'] = 'Roti'
        ws1['J3'] = 'Ensalada'
        ws1['K3'] = 'Licuados'
        ws1['L3'] = 'Fruta'
        ws1['M3'] = 'Jugo'
        ws1['N3'] = 'Agua'
        ws1['O3'] = 'Cantidad'
        ws1['P3'] = 'Tipo de Pago'
        ws1['Q3'] = 'Precio Unitario'
        ws1['R3'] = 'Total'

        for cartridge_ticket_detail in sales_helper.get_cartridges_tickets_details():
            created_at = helpers.naive_to_datetime(cartridge_ticket_detail.ticket_base.created_at)
            cartridge_name = cartridge_ticket_detail.cartridge.name
            subcategory = cartridge_ticket_detail.cartridge.subcategory
            payment_type = cartridge_ticket_detail.ticket_base.payment_type

            ws1.cell(row=count, column=1, value=cartridge_ticket_detail.id)
            ws1.cell(row=count, column=2, value=cartridge_ticket_detail.ticket_base.id)
            ws1.cell(row=count, column=3, value=cartridge_ticket_detail.ticket_base.order_number)
            ws1.cell(row=count, column=4, value=created_at.date())
            ws1.cell(row=count, column=5, value=created_at.time())
            ws1.cell(row=count, column=5).number_format = 'hh:mm:ss AM/PM'
            ws1.cell(row=count, column=6, value=created_at.time())
            ws1.cell(row=count, column=6).number_format = 'hh AM/PM'
            ws1.cell(row=count, column=9, value=cartridge_name if subcategory == 'RO' else '')
            ws1.cell(row=count, column=10, value=cartridge_name if subcategory == 'SA' else '')
            ws1.cell(row=count, column=11, value=cartridge_name if subcategory == 'SM' else '')
            ws1.cell(row=count, column=12, value=cartridge_name if subcategory == 'FR' else '')
            ws1.cell(row=count, column=13, value=cartridge_name if subcategory == 'JU' else '')
            ws1.cell(row=count, column=14, value=cartridge_name if subcategory == 'WA' else '')
            ws1.cell(row=count, column=15, value=cartridge_ticket_detail.quantity)
            ws1.cell(row=count, column=16, value='Efectivo' if payment_type == 'CA' else 'Tarjeta')
            ws1.cell(row=count, column=17, value=cartridge_ticket_detail.cartridge.price)
            ws1.cell(row=count, column=18, value=cartridge_ticket_detail.cartridge.price * cartridge_ticket_detail.quantity)

            count += 1

        # Only Packages

        for package_ticket_detail in sales_helper.get_packages_tickets_details():
            created_at = helpers.naive_to_datetime(package_ticket_detail.ticket_base.created_at)

            payment_type = package_ticket_detail.ticket_base.payment_type
            ws1.cell(row=count, column=1, value=package_ticket_detail.id)
            ws1.cell(row=count, column=2, value=package_ticket_detail.ticket_base.id)
            ws1.cell(row=count, column=3, value=package_ticket_detail.ticket_base.order_number)
            ws1.cell(row=count, column=4, value=created_at.date())
            ws1.cell(row=count, column=5, value=created_at.time())
            ws1.cell(row=count, column=5).number_format = 'hh:mm:ss AM/PM'
            ws1.cell(row=count, column=6, value=created_at.time())
            ws1.cell(row=count, column=6).number_format = 'HH AM/PM'
            ws1.cell(row=count, column=7, value=package_ticket_detail.package_cartridge.id)
            ws1.cell(row=count, column=8, value=package_ticket_detail.package_cartridge.name)

            # Fill cartridge rows
            packages = products_helper.get_packages_cartridges_recipes().filter(
                package_cartridge=package_ticket_detail.package_cartridge)

            for package in packages:
                subcategory = package.cartridge.subcategory
                cartridge_name = package.cartridge.name
                if subcategory == 'RO':
                    ws1.cell(row=count, column=9, value=cartridge_name)
                if subcategory == 'FR':
                    ws1.cell(row=count, column=12, value=cartridge_name)
                if subcategory == 'JU':
                    ws1.cell(row=count, column=13, value=cartridge_name)
                if subcategory == 'WA':
                    ws1.cell(row=count, column=14, value=cartridge_name)

            ws1.cell(row=count, column=15, value=package_ticket_detail.quantity)
            ws1.cell(row=count, column=16, value='Efectivo' if payment_type == 'CA' else 'Tarjeta')
            ws1.cell(row=count, column=17, value=package_ticket_detail.package_cartridge.price)
            ws1.cell(row=count, column=18, value=package_ticket_detail.price * package_ticket_detail.quantity)

            count += 1

        file_name = 'Reporte_General_De_Ventas_{0}.xlsx'.format(datetime.now().strftime("%I-%M%p_%d-%m-%Y"))
        response = HttpResponse(content_type='application/ms-excel')
        content = 'attachment; filename={0}'.format(file_name)
        response['Content-Disposition'] = content
        workbook.save(response)

        return response
예제 #12
0
    def get_dates_range_json(self):
        """
        Returns a JSON with a years list.
        The years list contains years objects that contains a weeks list
            and the Weeks list contains a weeks objects with two attributes:
            start date and final date. Ranges of each week.
        """
        helper = Helper()
        try:
            min_year = self.tickets_pos.\
                aggregate(Min('ticket__created_at'))['ticket__created_at__min'].year
            max_year = self.tickets_pos.\
                aggregate(Max('ticket__created_at'))['ticket__created_at__max'].year
            years_list = []  # [2015:object, 2016:object, 2017:object, ...]
        except Exception as e:
            min_year = datetime.now().year
            max_year = datetime.now().year
            years_list = []  # [2015:object, 2016:object, 2017:object, ...]

        while max_year >= min_year:
            year_object = {  # 2015:object or 2016:object or 2017:object ...
                'year': max_year,
                'weeks_list': [],
            }

            tickets_per_year = self.tickets_pos.filter(
                ticket__created_at__range=[
                    helper.naive_to_datetime(date(max_year, 1, 1)),
                    helper.naive_to_datetime(date(max_year, 12, 31))
                ])
            for ticket_item in tickets_per_year:
                if len(year_object['weeks_list']) == 0:
                    """
                    Creates a new week_object in the weeks_list of the actual year_object
                    """
                    week_object = {
                        'week_number':
                        ticket_item.ticket.created_at.isocalendar()[1],
                        'start_date':
                        ticket_item.ticket.created_at.date().strftime(
                            "%d-%m-%Y"),
                        'end_date':
                        ticket_item.ticket.created_at.date().strftime(
                            "%d-%m-%Y"),
                    }
                    year_object['weeks_list'].append(week_object)
                    # End if
                else:
                    """
                    Validates if exists some week with an similar week_number of the actual year
                    If exists a same week in the list validates the start_date and the end_date,
                    In each case valid if there is an older start date or a more current end date
                        if it is the case, update the values.
                    Else creates a new week_object with the required week number
                    """
                    existing_week = False
                    for week_object in year_object['weeks_list']:
                        if week_object[
                                'week_number'] == ticket_item.ticket.created_at.isocalendar(
                                )[1]:
                            # There's a same week number
                            if datetime.strptime(
                                    week_object['start_date'], "%d-%m-%Y"
                            ).date() > ticket_item.ticket.created_at.date():
                                week_object[
                                    'start_date'] = ticket_item.ticket.created_at.date(
                                    ).strftime("%d-%m-%Y")
                            elif datetime.strptime(
                                    week_object['end_date'], "%d-%m-%Y").date(
                                    ) < ticket_item.ticket.created_at.date():
                                week_object[
                                    'end_date'] = ticket_item.ticket.created_at.date(
                                    ).strftime("%d-%m-%Y")

                            existing_week = True
                            break

                    if not existing_week:
                        # There's a different week number
                        week_object = {
                            'week_number':
                            ticket_item.ticket.created_at.isocalendar()[1],
                            'start_date':
                            ticket_item.ticket.created_at.date().strftime(
                                "%d-%m-%Y"),
                            'end_date':
                            ticket_item.ticket.created_at.date().strftime(
                                "%d-%m-%Y"),
                        }
                        year_object['weeks_list'].append(week_object)

                        # End else
            years_list.append(year_object)
            max_year -= 1
        # End while
        return json.dumps(years_list)
예제 #13
0
    def get_tickets_list(self, initial_date=None, final_date=None):
        """
        :returns: tickets pos details
        :rtype: list
        :param initial_date: datetime
        :param final_date: datetime
        """
        if initial_date is None and final_date is None:
            tickets_pos = self.tickets_pos.order_by('-ticket__created_at')
        else:

            tickets_pos = self.tickets_pos.filter(ticket__created_at__range=(
                initial_date, final_date)).order_by('-ticket__created_at')
        helper = Helper()
        cartridges_tickets_details = self.get_cartridges_tickets_details()
        packages_tickets_details = self.get_packages_tickets_details()

        tickets_list = []

        for ticket_pos in tickets_pos:

            ticket_object = {
                'id':
                ticket_pos.ticket.id,
                'order_number':
                ticket_pos.ticket.order_number,
                'created_at':
                datetime.strftime(
                    helper.naive_to_datetime(ticket_pos.ticket.created_at),
                    "%B %d, %Y, %H:%M:%S %p"),
                'cashier':
                ticket_pos.cashier.username,
                'cartridges': [],
                'packages': [],
                'total':
                Decimal(0.00),
                'is_active':
                ticket_pos.ticket.is_active,
            }
            # Cartridges Tickets Details
            for cartridge_ticket_detail in cartridges_tickets_details:
                if cartridge_ticket_detail.ticket_base == ticket_pos.ticket:
                    ticket_detail_object = {
                        'name': cartridge_ticket_detail.cartridge.name,
                        'quantity': cartridge_ticket_detail.quantity,
                        'price': Decimal(cartridge_ticket_detail.price),
                    }

                    ticket_object['cartridges'].append(ticket_detail_object)
                    ticket_object['total'] += Decimal(
                        cartridge_ticket_detail.price)

            # Packages Tickets Details
            for package_ticket_detail in packages_tickets_details:
                if package_ticket_detail.ticket_base == ticket_pos.ticket:

                    ticket_detail_object = {
                        'name': package_ticket_detail.package_cartridge.name,
                        'quantity': package_ticket_detail.quantity,
                        'price': Decimal(package_ticket_detail.price),
                    }
                    ticket_object['packages'].append(ticket_detail_object)

                    ticket_object['total'] += Decimal(
                        package_ticket_detail.price)

            ticket_object['total'] = str(ticket_object['total'])
            tickets_list.append(ticket_object)

        return tickets_list
예제 #14
0
def analytics(request):
    helper = Helper()
    rates_helper = RatesHelper()

    if request.method == 'POST':
        if request.POST['type'] == 'reactions_day':
            start_date = helper.naive_to_datetime(
                datetime.strptime(request.POST['date'], '%d-%m-%Y').date())
            end_date = helper.naive_to_datetime(start_date + timedelta(days=1))
            today_suggestions = rates_helper.get_satisfaction_ratings(
                start_date, end_date)
            reactions_list = []
            for element_to_evaluate in rates_helper.elements_to_evaluate:
                """ For every element chart """
                element_object = {
                    'id': element_to_evaluate.id,
                    'name': element_to_evaluate.element,
                    'reactions': {
                        0: {
                            'reaction': 'Enojado',
                            'quantity': 0
                        },
                        1: {
                            'reaction': 'Triste',
                            'quantity': 0
                        },
                        2: {
                            'reaction': 'Feliz',
                            'quantity': 0
                        },
                        3: {
                            'reaction': 'Encantado',
                            'quantity': 0
                        },
                    },
                }
                for suggestion in today_suggestions:
                    for element_in_suggestion in suggestion.elements.all():
                        if element_in_suggestion == element_to_evaluate:
                            element_object['reactions'][
                                suggestion.satisfaction_rating -
                                1]['quantity'] += 1

                reactions_list.append(element_object)
            return JsonResponse(reactions_list, safe=False)
        elif request.POST['type'] == 'reactions_week':
            initial_date = helper.parse_to_datetime(
                request.POST['dt_week'].split(',')[0])
            final_date = helper.parse_to_datetime(
                request.POST['dt_week'].split(',')[1])
            data = {
                'week_number':
                helper.get_week_number(initial_date),
                'reactions':
                rates_helper.get_info_rates_list(initial_date, final_date),
            }
            return JsonResponse(data)

    template = 'analytics.html'
    title = 'Analytics'
    context = {
        'title': PAGE_TITLE + ' | ' + title,
        'page_title': title,
        'dates_range': rates_helper.get_dates_range(),
        'reactions_week': rates_helper.get_info_rates_actual_week(),
        'suggestions_week': rates_helper.get_info_suggestions_actual_week(),
        'elements': rates_helper.elements_to_evaluate,
        'total_elements': rates_helper.elements_to_evaluate.count(),
    }
    return render(request, template, context)
예제 #15
0
def diners_logs(request):
    helper = Helper()
    diners_helper = DinersHelper()

    def get_diners_per_hour():
        hours_list = []
        hours_to_count = 12
        start_hour = 5
        customter_count = 0
        logs = diners_helper.get_access_logs_today()

        while start_hour <= hours_to_count:

            hour = {
                'count': None,
            }

            for log in logs:
                datetime = str(log.access_to_room)
                date, time = datetime.split(" ")
                if (time.startswith("0" + str(start_hour))):
                    customter_count += 1
                hour['count'] = customter_count

            hours_list.append(hour)
            customter_count = 0
            start_hour += 1
            total_entries = 0

        return json.dumps(hours_list)

    if request.method == 'POST':
        if request.POST['type'] == 'diners_logs_week':
            dt_year = request.POST['dt_year']
            initial_date = request.POST['dt_week'].split(',')[0]
            final_date = request.POST['dt_week'].split(',')[1]
            initial_date = helper.parse_to_datetime(initial_date)
            final_date = helper.parse_to_datetime(final_date) + timedelta(
                days=1)

            diners_logs = diners_helper.get_all_diners_logs_list(
                initial_date, final_date)
            entries = diners_helper.get_access_logs(initial_date, final_date)
            data = {
                'diners': diners_logs,
                'entries': entries,
            }
            return JsonResponse(data)

        elif request.POST['type'] == 'diners_logs_day':
            """
            Returns a list with objects:
            Each object has the following characteristics
            """
            access_logs_day_list = []
            start_date = helper.naive_to_datetime(
                datetime.strptime(request.POST['date'], '%d-%m-%Y').date())
            end_date = helper.naive_to_datetime(start_date + timedelta(days=1))
            access_logs = diners_helper.get_all_diners().filter(
                access_to_room__range=[start_date, end_date])

            for access_log in access_logs:
                """
                Filling in the sales list of the day
                """
                earnings_sale_object = {
                    'access_id': access_log.id,
                    'datetime': timezone.localtime(access_log.access_to_room),
                    'number_day': helper.get_number_day(start_date),
                }

                access_logs_day_list.append(earnings_sale_object)
            return JsonResponse({'access_logs_day_list': access_logs_day_list})

        if request.POST['type'] == 'diners_logs':
            diners_objects_list = []

            for entry in diners_helper.get_all_access_logs():
                diner_object = {
                    'id':
                    entry.id,
                    'Nombre':
                    '',
                    'RFID':
                    entry.RFID,
                    'SAP':
                    '',
                    'Fecha de Acceso':
                    timezone.localtime(entry.access_to_room).date(),
                    'Hora de Acceso':
                    timezone.localtime(entry.access_to_room).time(),
                }
                for diner in diners:
                    if entry.RFID == diner.RFID:
                        diner_object['SAP'] = diner.employee_number
                        diner_object['Nombre'] = diner.name

                diners_objects_list.append(diner_object)

            return JsonResponse({'diner_logs': diners_objects_list})

    else:
        all_diners_objects = diners_helper.get_all_access_logs()
        today_diners_objects = diners_helper.get_access_logs_today()
        total_diners = all_diners_objects.count()
        total_diners_today = today_diners_objects.count()

        def get_dates_range():
            """
            Returns a JSON with a years list.
            The years list contains years objects that contains a weeks list
                and the Weeks list contains a weeks objects with two attributes:
                start date and final date. Ranges of each week.
            """
            try:
                min_year = all_diners_objects.aggregate(
                    Min('access_to_room'))['access_to_room__min'].year
                max_year = all_diners_objects.aggregate(
                    Max('access_to_room'))['access_to_room__max'].year
                years_list = []  # [2015:object, 2016:object, 2017:object, ...]
            except Exception as e:
                if settings.DEBUG:
                    print('Error:', e)
                return HttpResponse('No hay registros')

            while max_year >= min_year:
                year_object = {  # 2015:object or 2016:object or 2017:object ...
                    'year': max_year,
                    'weeks_list': []
                }

                diners_per_year = all_diners_objects.filter(
                    access_to_room__range=[
                        helper.naive_to_datetime(date(max_year, 1, 1)),
                        helper.naive_to_datetime(date(max_year, 12, 31))
                    ])

                for diner in diners_per_year:
                    if len(year_object['weeks_list']) == 0:
                        """
                        Creates a new week_object in the weeks_list of the actual year_object
                        """
                        week_object = {
                            'week_number':
                            diner.access_to_room.isocalendar()[1],
                            'start_date':
                            diner.access_to_room.date().strftime("%d-%m-%Y"),
                            'end_date':
                            diner.access_to_room.date().strftime("%d-%m-%Y"),
                        }
                        year_object['weeks_list'].append(week_object)

                        # End if
                    else:
                        """
                        Validates if exists some week with an indentical week_number of the actual year
                        If exists a same week in the list validates the start_date and the end_date,
                        In each case valid if there is an older start date or a more current end date
                            if it is the case, update the values.
                        Else creates a new week_object with the required week number
                        """
                        existing_week = False
                        for week_object in year_object['weeks_list']:
                            if week_object[
                                    'week_number'] == diner.access_to_room.isocalendar(
                                    )[1]:
                                # There's a same week number
                                existing_week = True
                                if datetime.strptime(
                                        week_object['start_date'], "%d-%m-%Y"
                                ).date() > diner.access_to_room.date():
                                    exists = True
                                    week_object[
                                        'start_date'] = diner.access_to_room.date(
                                        ).strftime("%d-%m-%Y")
                                elif datetime.strptime(
                                        week_object['end_date'], "%d-%m-%Y"
                                ).date() < diner.access_to_room.date():
                                    week_object[
                                        'end_date'] = diner.access_to_room.date(
                                        ).strftime("%d-%m-%Y")
                                existing_week = True
                                break

                        if not existing_week:
                            # There's a different week number
                            week_object = {
                                'week_number':
                                diner.access_to_room.isocalendar()[1],
                                'start_date':
                                diner.access_to_room.date().strftime(
                                    "%d-%m-%Y"),
                                'end_date':
                                diner.access_to_room.date().strftime(
                                    "%d-%m-%Y"),
                            }
                            year_object['weeks_list'].append(week_object)

                        #End else
                years_list.append(year_object)
                max_year -= 1
            # End while
            return json.dumps(years_list)

        pag = diners_paginator(request, all_diners_objects, 50)
        template = 'diners_logs.html'
        title = 'Registro de comensales'
        page_title = PAGE_TITLE

        context = {
            'title': PAGE_TITLE + ' | ' + title,
            'page_title': title,
            'diners': pag['queryset'],
            'paginator': pag,
            'total_diners': total_diners,
            'total_diners_today': total_diners_today,
            'diners_hour': get_diners_per_hour(),
            'diners_week': diners_helper.get_diners_actual_week(),
            'dates_range': get_dates_range(),
        }
        return render(request, template, context)
예제 #16
0
def new_sale(request):
    helper = Helper()
    sales_helper = TicketPOSHelper()
    products_helper = ProductsHelper()
    if request.method == 'POST':
        if request.POST['ticket']:
            username = request.user
            user_profile_object = get_object_or_404(UserProfile, username=username)
            ticket_detail_json_object = json.loads(request.POST.get('ticket'))
            payment_type = ticket_detail_json_object['payment_type']
            new_ticket_base = TicketBase(
                order_number=sales_helper.get_new_order_number(),
                payment_type=payment_type,
            )
            new_ticket_base.save()
            new_ticket_pos = TicketPOS(
                ticket=new_ticket_base,
                cashier=user_profile_object,
            )
            new_ticket_pos.save()

            """
            Saves the tickets details for cartridges
            """
            for ticket_detail in ticket_detail_json_object['cartridges']:
                cartridge = get_object_or_404(Cartridge, id=ticket_detail['id'])
                quantity = ticket_detail['quantity']
                price = ticket_detail['price']
                new_cartridge_ticket_detail = CartridgeTicketDetail(
                    ticket_base=new_ticket_base,
                    cartridge=cartridge,
                    quantity=quantity,
                    price=price
                )
                new_cartridge_ticket_detail.save()

            """
            Saves the tickets details for packages
            """
            for ticket_detail_packages in ticket_detail_json_object['packages']:
                quantity = ticket_detail_packages['quantity']
                price = ticket_detail_packages['price']
                packages_id_list = ticket_detail_packages['id_list']
                package_id = None
                is_new_package = True
                packages_recipes = PackageCartridge.objects.all()

                for package_recipe in packages_recipes:
                    """
                    Gets the cartridges for each package cartridge and compares
                    each package recipe cartridges if is equal that packages_id_list
                    """
                    cartridges_per_recipe = PackageCartridgeRecipe.objects.select_related(
                        'package_cartridge', 'cartridge').filter(package_cartridge=package_recipe)
                    cartridges_in_package_recipe = []

                    for cartridge_recipe in cartridges_per_recipe:
                        cartridges_in_package_recipe.append(cartridge_recipe.cartridge.id)

                    if helper.are_equal_lists(cartridges_in_package_recipe, packages_id_list):
                        is_new_package = False
                        package_id = package_recipe.id

                if is_new_package:
                    package_name = ticket_detail_packages['name']
                    package_price = ticket_detail_packages['price']
                    new_package_cartridge = PackageCartridge(name=package_name, price=package_price, is_active=True)
                    new_package_cartridge.save()

                    """
                    Creates a new package
                    """
                    for id_cartridge in packages_id_list:
                        cartridge = get_object_or_404(Cartridge, id=id_cartridge)
                        new_package_recipe_object = PackageCartridgeRecipe(
                            package_cartridge=new_package_cartridge,
                            cartridge=cartridge,
                            quantity=1
                        )
                        new_package_recipe_object.save()

                    """
                    Creates the ticket detail
                    """
                    new_cartridge_ticket_detail = PackageCartridgeTicketDetail(
                        ticket_base=new_ticket_base,
                        package_cartridge=new_package_cartridge,
                        quantity=quantity,
                        price=price
                    )
                    new_cartridge_ticket_detail.save()

                else:
                    """
                    Uses an existent package
                    """
                    package_cartridge = get_object_or_404(PackageCartridge, id=package_id)
                    new_cartridge_ticket_detail = PackageCartridgeTicketDetail(
                        ticket_base=new_ticket_base,
                        package_cartridge=package_cartridge,
                        quantity=quantity,
                        price=price,
                    )
                    new_cartridge_ticket_detail.save()

            json_response = {
                'status': 'ready',
                'ticket_id': new_ticket_base.id,
                'ticket_order': new_ticket_base.order_number,
            }
            return JsonResponse(json_response)

        return JsonResponse({'status': 'error'})

    else:
        cartridges_list = products_helper.cartridges
        package_cartridges = PackageCartridge.objects.all()
        template = 'sales/new_sale.html'
        title = 'Nueva venta'
        context = {
            'page_title': PAGE_TITLE,
            'title': title,
            'cartridges': cartridges_list,
            'package_cartridges': package_cartridges
        }
        return render(request, template, context)
예제 #17
0
def sales(request):
    sales_helper = TicketPOSHelper()
    helper = Helper()

    if request.method == 'POST':
        if request.POST['type'] == 'sales_day':
            """
            Returns a list with objects:
            Each object has the following characteristics
            """
            sales_day_list = []
            start_day = helper.naive_to_datetime(datetime.strptime(request.POST['date'], '%d-%m-%Y').date())
            end_date = helper.naive_to_datetime(start_day + timedelta(days=1))
            tickets_objects = sales_helper.tickets_pos.filter(ticket__created_at__range=[start_day, end_date])

            for ticket_pos in tickets_objects:
                """
                Filling in the sales list of the day
                """
                earnings_sale_object = {
                    'id_ticket': ticket_pos.ticket.id,
                    'datetime': timezone.localtime(ticket_pos.ticket.created_at),
                    'earnings': 0
                }

                # Cartridge Ticket Detail
                for cartridge_ticket_detail in sales_helper.get_cartridges_tickets_details():
                    if cartridge_ticket_detail.ticket_base == ticket_pos.ticket:
                        earnings_sale_object['earnings'] += cartridge_ticket_detail.price

                # Package Ticket Detail
                for package_ticket_detail in sales_helper.get_packages_tickets_details():
                    if package_ticket_detail.ticket_base == ticket_pos.ticket:
                        earnings_sale_object['earnings'] += package_ticket_detail.price

                sales_day_list.append(earnings_sale_object)
            return JsonResponse({'sales_day_list': sales_day_list})

        if request.POST['type'] == 'ticket_details':
            ticket_id = int(request.POST['ticket_id'])
            ticket_object = {
                'ticket_id': ticket_id,
                'ticket_order': '',
                'cartridges': [],
                'packages': [],
            }

            # Cartridge Ticket Details
            for cartridge_ticket_detail in sales_helper.get_cartridges_tickets_details():
                if cartridge_ticket_detail.ticket_base.id == ticket_id:
                    ticket_object['ticket_order'] = cartridge_ticket_detail.ticket_base.order_number

                    cartridge_object = {
                        'name': cartridge_ticket_detail.cartridge.name,
                        'quantity': cartridge_ticket_detail.quantity,
                        'total': cartridge_ticket_detail.price
                    }

                    ticket_object['cartridges'].append(cartridge_object)

            # Package Ticket Details
            for package_ticket_detail in sales_helper.get_packages_tickets_details():
                if package_ticket_detail.ticket_base.id == ticket_id:
                    ticket_object['ticket_order'] = package_ticket_detail.ticket_base.order_number
                    cartridges_list = []

                    package_cartridge_recipe = PackageCartridgeRecipe.objects.filter(
                        package_cartridge=package_ticket_detail.package_cartridge)

                    for cartridge_recipe in package_cartridge_recipe:
                        cartridges_list.append(cartridge_recipe.cartridge.name)

                    package_cartridge_object = {
                        'cartridges': cartridges_list,
                        'quantity': package_ticket_detail.quantity,
                        'total': package_ticket_detail.price
                    }

                    ticket_object['packages'].append(package_cartridge_object)

            return JsonResponse({'ticket_details': ticket_object})

        if request.POST['type'] == 'tickets':
            tickets_objects_list = []

            for ticket_pos in sales_helper.tickets_pos:
                for cartridge_ticket_detail in sales_helper.get_cartridges_tickets_details():
                    if cartridge_ticket_detail.ticket == ticket_pos.ticket:
                        ticket_object = {
                            'ID': ticket_pos.ticket.id,
                            'Fecha': timezone.localtime(ticket_pos.ticket.created_at).date(),
                            'Hora': timezone.localtime(ticket_pos.ticket.created_at).time(),
                            'Vendedor': ticket_pos.cashier.username,
                        }
                        if ticket_pos.ticket.payment_type == 'CA':
                            ticket_object['Tipo de Pago'] = 'Efectivo'
                        else:
                            ticket_object['Tipo de Pago'] = 'Crédito'
                        if cartridge_ticket_detail.cartridge:
                            ticket_object['Producto'] = cartridge_ticket_detail.cartridge.name
                        else:
                            ticket_object['Producto'] = None
                        if cartridge_ticket_detail.package_cartridge:
                            ticket_object['Paquete'] = cartridge_ticket_detail.package_cartridge.name
                        else:
                            ticket_object['Paquete'] = None
                        ticket_object['Cantidad'] = cartridge_ticket_detail.quantity
                        ticket_object['Total'] = cartridge_ticket_detail.price
                        ticket_object[
                            'Precio Unitario'] = cartridge_ticket_detail.price / cartridge_ticket_detail.quantity

                        tickets_objects_list.append(ticket_object)

            return JsonResponse({'ticket': tickets_objects_list})

        if request.POST['type'] == 'sales_week':
            initial_date = request.POST['dt_week'].split(',')[0]
            final_date = request.POST['dt_week'].split(',')[1]
            initial_date = helper.parse_to_datetime(initial_date)
            final_date = helper.parse_to_datetime(final_date) + timedelta(days=1)
            week_sales = sales_helper.get_sales_list(initial_date, final_date)
            tickets = sales_helper.get_tickets_list(initial_date, final_date)
            data = {
                'sales': week_sales,
                'tickets': tickets,
                'week_number': helper.get_week_number(initial_date)
            }
            return JsonResponse(data)

    # Any other request method:
    template = 'sales/sales.html'
    title = 'Registro de Ventas'

    initial_date, final_date = helper.get_initial_final_week_datetime()

    context = {
        'title': PAGE_TITLE + ' | ' + title,
        'page_title': title,
        'actual_year': datetime.now().year,
        'sales_week': sales_helper.get_sales_actual_week(),
        'today_name': helper.get_name_day(datetime.now()),
        'today_number': helper.get_number_day(datetime.now()),
        'week_number': helper.get_week_number(date.today()),
        'tickets': sales_helper.get_tickets_list(initial_date, final_date),
        'dates_range': sales_helper.get_dates_range_json(),
    }

    return render(request, template, context)