from datetime import date from decimal import Decimal from django.http import JsonResponse from django.shortcuts import render, redirect from comandas.models import Comanda, ProductComanda from orders.models import Order from products.models import Product from payments.models import Payments from typePay.models import TypePay from gestaoRaul.decorators import group_required from websocket_client.websocketClient import enviar_mensagem from asgiref.sync import async_to_sync # import asyncio # import websockets # async def enviar_mensagem(msg): # try: # uri = "ws://websocket_server:8765" # async with websockets.connect(uri) as websocket: # await websocket.send(msg) # # print(f"> Enviado: {msg}") # # resposta = await websocket.recv() # # print(f"< Recebido: {resposta}") # except Exception as e: # print(f"Erro ao enviar mensagem via websocket: {e}") def somar(consumo:ProductComanda, comanda:Comanda): parcial = Payments.objects.filter(comanda=comanda) totalParcial = Decimal(0) total:Decimal = Decimal(0) for p in parcial: totalParcial += p.value for produto in consumo: total += Decimal(produto.product.price) valores = { 'total':total, 'parcial':totalParcial, 'taxa': round(total * Decimal(0.1), 2), 'totalSemTaxa':total - totalParcial, 'totalComTaxa': round((total - totalParcial)+(total * Decimal(0.1)),2) } return valores def listProduct(request, comanda_id): product = request.GET.get("search-product") allProducts = Product.objects.filter(name__icontains=product) products = [] for p in allProducts: if p.active == True: products.append(p) return render(request, "htmx_components/comandas/htmx_list_products.html", {"products": products,'comanda_id':comanda_id}) @group_required(groupName='Garçom') def addProduct(request, product_id, comanda_id): config = { 'taxa': False } obs = request.GET.get("obs") product_comanda = ProductComanda(comanda_id=comanda_id, product_id=product_id) product_comanda.save() product = Product.objects.get(id=product_id) comanda = Comanda.objects.get(id=comanda_id) parcial = Payments.objects.filter(comanda=comanda) if product.cuisine == True: order = Order(id_comanda=comanda, id_product=product, productComanda=product_comanda, obs='') order.save() msg = JsonResponse({ 'type': 'broadcast', 'message': f"""

{product.name}

{order.obs}

{comanda.name} - {comanda.mesa.name}

{order.queue.strftime("%d/%m/%Y - %H:%M")}

Atendente: {comanda.user.first_name}

""", 'local':'cozinha', 'tipo':'add', 'id':order.id, 'speak': f'Novo pedido! {product.name}, para {comanda.name}.' }) try: # Chama a função async dentro da view normal async_to_sync(enviar_mensagem)(mensagem) # return JsonResponse({"status": "Mensagem enviada com sucesso"}) except Exception as e: print("Erro add product websocket: ",e) # return JsonResponse({"status": "Erro", "erro": str(e)}, status=500) # asyncio.run(enviar_mensagem(msg)) consumo = ProductComanda.objects.filter(comanda=comanda_id) valores = somar(consumo,comanda) return render(request, "htmx_components/comandas/htmx_list_products_in_comanda.html",{'config':config, 'valores':valores,'parcials':parcial,'consumo': consumo,'comanda':comanda}) @group_required(groupName='Garçom') def removeProductComanda(request, productComanda_id): config = { 'taxa': False } product_comanda = ProductComanda.objects.get(id=productComanda_id) comanda = Comanda.objects.get(id= product_comanda.comanda.id) if comanda.status == 'OPEN': parcial = Payments.objects.filter(comanda=comanda) consumo = ProductComanda.objects.filter(comanda=comanda) valores = somar(consumo,comanda) if product_comanda.product.cuisine == True: order = Order.objects.get(productComanda=product_comanda) product_comanda.delete() msg = JsonResponse({ 'type': 'broadcast', 'message': 'Atenção! Pedido cancelado', 'local':'cozinha', 'tipo':'delete', 'id':order.id, 'speak': f'Pedido cancelado! {order.id_product.name}.' }) asyncio.run(enviar_mensagem(msg)) # order.delete() else: product_comanda.delete() return render(request, "htmx_components/comandas/htmx_list_products_in_comanda.html",{'config':config, 'valores': valores,'parcials':parcial,'consumo': consumo, 'comanda':comanda}) else: pass @group_required(groupName='Gerente') def reopenComanda(request, comanda_id): comanda = Comanda.objects.get(id=comanda_id) if comanda.status == 'CLOSED': pass else: comanda.status = "OPEN" comanda.save() @group_required(groupName='Gerente') def paymentComanda(request, comanda_id): taxa = request.POST.get('taxa',False) typePayment = TypePay.objects.get(id=1) consumo = ProductComanda.objects.filter(comanda=comanda_id) comanda = Comanda.objects.get(id=comanda_id) valores = somar(consumo,comanda) if taxa == 'True': pagamento = Payments(value=valores['totalComTaxa'], comanda=comanda, type_pay=typePayment,description='tipo de pagamento mokado') pagamento.save() else: pagamento = Payments(value=valores['totalSemTaxa'], comanda=comanda, type_pay=typePayment,description='tipo de pagamento mokado') pagamento.save() comanda.status = 'CLOSED' comanda.save() return redirect('/comandas') @group_required(groupName='Gerente') def paymentParcial(request, comanda_id): typePayment = TypePay.objects.get(id=1) comanda = Comanda.objects.get(id=comanda_id) value = Decimal(request.POST.get('value-parcial')) description = request.POST.get('name-parcial') pagamento = Payments(value=value, comanda=comanda, type_pay=typePayment,description=description) pagamento.save() return redirect('/comandas')