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)
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
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)
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)
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
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
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
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)
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)