def sales(request): helper = Helper() sales_helper = SalesHelper() 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.get_all_tickets().filter( created_at__range=[start_day, end_date]) for ticket in tickets_objects: """ Filling in the sales list of the day """ earnings_sale_object = { 'id_ticket': ticket.id, 'datetime': timezone.localtime(ticket.created_at), 'earnings': 0 } for ticket_detail in sales_helper.get_all_tickets_details(): if ticket_detail.ticket == ticket: earnings_sale_object['earnings'] += 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': [], } # Get cartridges details for ticket_detail in sales_helper.get_all_tickets_details(): if ticket_detail.ticket.id == ticket_id: ticket_object[ 'ticket_order'] = ticket_detail.ticket.order_number if ticket_detail.cartridge: cartridge_object = { 'name': ticket_detail.cartridge.name, 'quantity': ticket_detail.quantity, 'total': ticket_detail.price } ticket_object['cartridges'].append(cartridge_object) elif ticket_detail.package_cartridge: cartridges_list = [] package_cartridge_recipe = PackageCartridgeRecipe.objects.filter( package_cartridge=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': ticket_detail.quantity, 'total': ticket_detail.price } ticket_object['packages'].append( package_cartridge_object) return JsonResponse({'ticket_details': ticket_object}) if request.POST['type'] == 'tickets': tickets_objects_list = [] initial_dt = request.POST['dt_week'].split(',')[0] final_dt = request.POST['dt_week'].split(',')[1] initial_dt = helper.naive_to_datetime( datetime.strptime(initial_dt, '%d-%m-%Y').date()) final_dt = helper.naive_to_datetime( datetime.strptime(final_dt, '%d-%m-%Y').date()) for ticket in sales_helper.get_all_tickets().filter( created_at__range=[initial_dt, final_dt]): for ticket_detail in sales_helper.get_all_tickets_details(): if ticket_detail.ticket == ticket: ticket_object = { 'ID': ticket.id, 'Fecha': timezone.localtime(ticket.created_at).date(), 'Hora': timezone.localtime(ticket.created_at).time(), 'Vendedor': ticket.seller.username, } if ticket.payment_type == 'CA': ticket_object['Tipo de Pago'] = 'Efectivo' else: ticket_object['Tipo de Pago'] = 'Crédito' if ticket_detail.cartridge: ticket_object[ 'Producto'] = ticket_detail.cartridge.name else: ticket_object['Producto'] = None if ticket_detail.package_cartridge: ticket_object[ 'Paquete'] = ticket_detail.package_cartridge.name else: ticket_object['Paquete'] = None ticket_object['Cantidad'] = ticket_detail.quantity ticket_object['Total'] = ticket_detail.price ticket_object[ 'Precio Unitario'] = ticket_detail.price / 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) filtered_sales = sales_helper.get_sales_list( initial_date, final_date) tickets = sales_helper.get_tickets(initial_date, final_date) data = { 'sales': filtered_sales, 'tickets': tickets, 'week_number': helper.get_week_number(initial_date) } return JsonResponse(data) template = 'sales/sales.html' title = 'Registro de Ventas' 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_today_list(), 'dates_range': sales_helper.get_dates_range_json(), } return render(request, template, context)
def diners_logs(request): helper = Helper() diners_helper = DinersHelper() all_diners = diners_helper.get_all_diners() if request.method == 'POST': if request.POST['type'] == 'diners_logs_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) diners_entries = diners_helper.get_all_diners_logs_list(initial_date, final_date) entries = diners_helper.get_weeks_entries(initial_date, final_date) data = { 'diners': diners_entries, '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_access_logs().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}) elif request.POST['type'] == 'diners_logs': diners_objects_list = [] initial_dt = request.POST['dt_week'].split(',')[0] final_dt = request.POST['dt_week'].split(',')[1] initial_dt = helper.naive_to_datetime(datetime.strptime(initial_dt, '%d-%m-%Y').date()) final_dt = helper.naive_to_datetime(datetime.strptime(final_dt, '%d-%m-%Y').date() + timedelta(days=1)) print(final_dt) for entry in diners_helper.get_all_access_logs().filter(access_to_room__range=[initial_dt, final_dt]): 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 all_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}) elif request.POST['type'] == 'fill-sap': access_logs = diners_helper.get_all_access_logs() for access_log in access_logs: exist = False if access_log.diner is None: for diner in all_diners: if access_log.RFID == diner.RFID: access_log.diner = diner access_log.save() break without_sap = AccessLog.objects.select_related('diner').filter(diner__isnull=True).count() return JsonResponse({'Sin SAP aun': without_sap}) 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_item 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_item.access_to_room.isocalendar()[1], 'start_date': diner_item.access_to_room.date().strftime("%d-%m-%Y"), 'end_date': diner_item.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 identical 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_item.access_to_room.isocalendar()[1]: # There's a same week number if datetime.strptime(week_object['start_date'], "%d-%m-%Y").date() > diner_item.access_to_room.date(): week_object['start_date'] = diner_item.access_to_room.date().strftime("%d-%m-%Y") elif datetime.strptime(week_object['end_date'], "%d-%m-%Y").date() < diner_item.access_to_room.date(): week_object['end_date'] = diner_item.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_item.access_to_room.isocalendar()[1], 'start_date': diner_item.access_to_room.date().strftime("%d-%m-%Y"), 'end_date': diner_item.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' 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': diners_helper.get_diners_per_hour_json(), 'diners_week': diners_helper.get_diners_actual_week(), 'dates_range': get_dates_range(), } return render(request, template, context)