From 179342ff800dff37f2eb877ed63cf64c28e0a798 Mon Sep 17 00:00:00 2001 From: Welton Moura Date: Sun, 22 Jun 2025 17:19:18 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20conex=C3=A3o=20com=20api=20de=20pagament?= =?UTF-8?q?o=20de=20multiplas=20comandas=20ok?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + .../clients/__pycache__/views.cpython-312.pyc | Bin 3008 -> 5290 bytes gestaoRaul/clients/templates/clients.html | 11 +- gestaoRaul/clients/templates/viewclient.html | 10 +- gestaoRaul/clients/views.py | 60 +++++- .../__pycache__/models.cpython-312.pyc | Bin 2708 -> 2708 bytes .../__pycache__/views.cpython-312.pyc | Bin 9798 -> 8977 bytes gestaoRaul/comandas/models.py | 6 +- gestaoRaul/comandas/views.py | 34 ++-- gestaoRaul/db.sqlite3 | Bin 339968 -> 339968 bytes .../__pycache__/settings.cpython-312.pyc | Bin 4402 -> 4402 bytes .../__pycache__/models.cpython-312.pyc | Bin 1490 -> 2418 bytes gestaoRaul/payments/models.py | 24 ++- .../templates/static/clients/js/clients.js | 172 ++++++++++++++++++ 14 files changed, 281 insertions(+), 38 deletions(-) diff --git a/.gitignore b/.gitignore index 0582183..54687ca 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ dev_home gestaoRaul/static .env gestaoRaul/db.sqlite3 +duplicati_backups + diff --git a/gestaoRaul/clients/__pycache__/views.cpython-312.pyc b/gestaoRaul/clients/__pycache__/views.cpython-312.pyc index c6f6d262ac6e2384a55e7a8e722a35d78c87fded..c41977465ca98b0fba5a3fa992eea6d87b39b12d 100644 GIT binary patch literal 5290 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 F{68)|Syli5 delta 964 zcmZWny=xRv5TAEoZSiIPt>tHcBZ4MYTu2#O?;#O4}VZ#Q9KH<8&j5-iRl ze}Lg3R$^rllP>-NscdWn3*q3fv{j-_DreqaE}AU7VfHsOzxlm+^TF9WUH)7unLyvi zkw41^`ewN=^9eS`t~DZ~W(e@W(?T<{YL@czVKFMzO3E*U<)~7t2*`kMdHRmAEtm(u zGdEy6b)nYfSsPI6K9N)WC#UB`w6xKCL{at1L}9O2oGy7=jLUc8x+R+Wyt^LxD@iQ( z#g;JT+sv@2$i2**S)ty@rnq}1yC8%kqug+#kAS9LUya-q&y5`&`PSIQXm;68n%Q6_ z!22GsGMhfIe3jA_Yg;)bzC{vdx?Wz<{?{O2<&8;1z! z23giZVeh`sZi&VSAvnr;InRHR;CXTn^of)`cC==0er{nA&vF{8Z02Hj%}4IhmVzA$ zRjl+J*HEmZ?6{!HB1jL-%eviUacl{2JdV;WNIx+9ZOZZ)cqW$XrS8L!)ZUF5( zfwNAp-068BA62{aybh?#u-e}+$ZeL}Pjn?(_53hSAE!dxY7q}ni>uTU^3x+vUR_Z& z-vZ=IrfZ_#AfjiXe-oz&W4$qw`I!|$w4nbxjJM$O54hR_W3mN9Eg1c!%PISzxo_vi Hpd$JU`t-y| diff --git a/gestaoRaul/clients/templates/clients.html b/gestaoRaul/clients/templates/clients.html index 7baa309..b756fd0 100644 --- a/gestaoRaul/clients/templates/clients.html +++ b/gestaoRaul/clients/templates/clients.html @@ -51,16 +51,7 @@ Clientes -
- {% csrf_token %} - - -
+ diff --git a/gestaoRaul/clients/templates/viewclient.html b/gestaoRaul/clients/templates/viewclient.html index f4fdeae..44d5b53 100644 --- a/gestaoRaul/clients/templates/viewclient.html +++ b/gestaoRaul/clients/templates/viewclient.html @@ -16,7 +16,12 @@ Comandas

{{client.name}}

-

R$ {{client.id | totalFiado}}

+

R$ {{client.id | totalFiado}}


+

R$

+
@@ -26,6 +31,7 @@ Comandas Atendente Data abertura Data fechamento + Detalhes Valor @@ -35,6 +41,7 @@ Comandas {{comanda.user.first_name}} {{comanda.user.last_name}} {{comanda.dt_open}} {{comanda.dt_close}} + @@ -57,6 +64,7 @@ Comandas + {% endblock %} \ No newline at end of file diff --git a/gestaoRaul/clients/views.py b/gestaoRaul/clients/views.py index 97d513c..bc29762 100644 --- a/gestaoRaul/clients/views.py +++ b/gestaoRaul/clients/views.py @@ -1,11 +1,19 @@ from decimal import Decimal from django.shortcuts import render, redirect from django.contrib.auth.models import User +from django.http import JsonResponse +from django.views.decorators.http import require_POST +from django.views.decorators.csrf import csrf_exempt +import json from comandas.models import Comanda, ProductComanda from gestaoRaul.decorators import group_required from clients.models import Client -from payments.models import Payments +from payments.models import Payments, somar +from typePay.models import TypePay + +# Create your views here. + @@ -56,10 +64,48 @@ def editClient(request): client.save() return redirect('/clients') + +@csrf_exempt +@require_POST def payDebt(request): - # id = request.POST.get('id-client') - # client_id = int(id) - # client = Client.objects.get(id=client_id) - # client.debt = client.debt - 1 - # client.save() - return redirect('/clients') \ No newline at end of file + try: + # Verifica se é uma requisição AJAX + if not request.headers.get('X-Requested-With') == 'XMLHttpRequest': + return JsonResponse({'error': 'Requisição inválida'}, status=400) + + # Obter os IDs do corpo da requisição (não mais da URL) + try: + data = json.loads(request.body) + comanda_ids = data.get('ids', []) + except json.JSONDecodeError: + return JsonResponse({'error': 'JSON inválido'}, status=400) + + for comanda_id in comanda_ids: + try: + comanda = Comanda.objects.get(id=comanda_id) + comanda.status = 'CLOSED' + comanda.save() + + typePayment = TypePay.objects.get(id=1) + consumo = ProductComanda.objects.filter(comanda=comanda_id) + value = somar(consumo,comanda) + print(value["totalSemTaxa"]) + description = 'PAGAMENTO DE FIADO' + pagamento = Payments(value=value["totalSemTaxa"], comanda=comanda, type_pay=typePayment,description=description,client=comanda.client) + pagamento.save() + except Comanda.DoesNotExist: + return JsonResponse({'error': f'Comanda com ID {comanda_id} não encontrada'}, status=404) + + return redirect(f'/clients/viewClient/{comanda.client.id}') + + # return JsonResponse({ + # 'success': True, + # 'message': f'{len(comanda_ids)} comandas processadas', + # 'ids': comanda_ids + # }, status=200) + + except Exception as e: + return JsonResponse({ + 'success': False, + 'error': str(e) + }, status=500) \ No newline at end of file diff --git a/gestaoRaul/comandas/__pycache__/models.cpython-312.pyc b/gestaoRaul/comandas/__pycache__/models.cpython-312.pyc index 64eac19d3c87f642c76bfdef398fb1d88d1875d8..ccdf436c665825bf29f0860b7b8dd82fd73292e5 100644 GIT binary patch delta 68 zcmbOtIz^QCG%qg~0}#B9jmU7_$g9u7C^p%a7%g5Z?9rCvohgc77ZuPU0k_>8ir0tq3Xw1ag}awQ6VyP`QHe>U|BX?0T(v z>(Fv>ky=q9)Do@4Asl*uODJ%$IB_UQh)dNXAx=+7Ie^3&^~MEe-a4^qR`TcBnfGSC z`LlmMySX_3Ae~NX_>|tc_}+t@ru{)LyN}Tp9)Geq-+bO3sf_5FrCCWQ=Z;oJmE7m# z-LcA;l2gvOTc{M2oOUMM$;zazMKnIS`Fp-OMS|7;^}szn^lD{pX!qIyD#d-)Y?pO< zpLMXyI-{&ZU7m-#th3h04XyIj%llm9x(?0lvyOII4_?cgW5G{)kd4Tm*Vr|e*L)#k z!gCq4E=S(h^}*l=BOf2fY@iVA80SNAJXnan(fTp5ZagQWKD){mWpAAUbGZ-Rwk{*K zW$H3fML#u*t)LudRo~v=GEoQ5YE=E;V&4({>EPqOsisV9FvkNfWDokN+RPDn)v<{S z9Ky)ts3sb&hX=yj0t%=%bJ93{YDF4r+?R%3^C3k%CkWC6lLP|nD=Jc3NNvs<+-#S)H^HqlN&5riY8 z8d0QuPprDk7ONZR*S0(X$HH17-tN&c2K&`Sr#Yv>13!nK70S8fM8gL?rW{x(W#TQ5rLOGaOfp7m0-PXQ!sUWd;;)jKdL&{9ifYI(T?Nj3zRU3(TIsBK6nvNY6}jHZ zKGd7U3l<58wV8x7BrAfQPId^YU=$zD5)d^r+F=!TK}Dg=h)la$+_L>$Cg;(#f*)~P z3w|5gL@HN?|IrT-6&YJxdgbJDNG2Ut=1E4ut=wGpG#>8afRzdE=kkZC4)7-Vexeuy z%(BW}&1Ypb)f_Gb#^_fV`rFZLG(C(rOdV8W7lMa{d557!#(mpwIG&7EJ*eZ?72FGM zM!=#dbizCU6bIg-)4jg!a*I1YgA6HEGu8a7X2#dRYt)5|^Q$=dxL@Vv1F9>oVf4Z%2S?A`S1d zFnhZgs9t_ZPE^a{B+*@{5m4CnT**v3bh}S9Ty#&yJg_)O!xd|tvJQrgO;Tf*$u8h# zurqx}p9#E~Z^F6CQ-mhM2ffNg3Aw>_e8=QE)1?S@`bh+FQ;PTnFA`8s1^rv>O;f7s zcw%p`KSI-&bmln1b?wjo;X7XN`Rp-d^2_X_ruqSqX+=PkTn{@WRC(k;JKsI6`Uy(W zV(qDDE#>eU$2ImYu!d8zI1U5zJGkn$YBmN3b&J~Rv?QpO*Hy`=C6nrsvH%d4D1EYn%7ytkO delta 2465 zcmZ`(TWl0%6#i#-W_R1}Zo8LuySv?Pw@}K6l#~i6B3fH6B9|gy$ST2cXId9_cbb2u z2xQ4Nkp~d8tiKNhG4Q|xSc%3aMn$7f#>7Zmd7v5Fc)^7DR>B)kp7YQ4BIqP@=A8fB zzH|Afy!rd>oj>|~wFI6`dEXmXB81#QVeS#D%>D6lXKAfKRHD}An(~o!g!6T|=6p0A z<-9i+%g57k&iisL`9wM)5C_o`<=>;FRyCjn)S%WdD5{~8VmgTm)&Ft*gkWb-!zal^ zHCejt5pCllZR!zi(;{s<*G3jaZazr{=0h)0qbEsv=_4Uxi$ZifqKz-oE<4sDC)gJP zs}n5GfO0Ia6-;CDfa8E51lbK|)D?p=Xq;Kj-8LIz-Qqska%c2{F_PDj$twj_$vCR@ z;-?N?C%pF$v5A)cryZsnPw`P5b3HoY{LfRd=;$X00)(89iq4|+o)lhs+y|2LY)B+U z0=lIjxr*X~chPmImZiKQHsuYK=E8F)@$52i5{pi=-cCy2Y(}#r zs*e;@aB4?Wj$=96+ZhJzth5u4gyE{U33G*TI@Jur1Ddw#L)*|yGGOGCJ^?&#hw(X( zQ8Mjsy6tZ*Rs5~D{T&s5$JL>q{T;XbYe%2Q3!mu(x}^s6s?N|^G5 z$AwGo^X`f#dD=VcB>u)bq1Y++l*jjeWIS>yc|LhN+Es~m-3qL#cvhX3z$6@>b&){R zRIqirq4At{ap-d9gIuNQv8%ne8oH(;E#uwAN@T@!b7FktanGmO=uVoNd`m1iAEz=DvDvDDDJXf(r1~|%a%5H70mpk~ z!Ez}XGkZj%D?w(9|vmi8pOXb;Gir#d?WZbL4MH^}ZYb{v%UJPf!+pLk+1J~r6s z>g@O^gDAGLJDxRrVe^S4761f&3R#yjJggN|-ffDrkn3p@&7VQ?B%0J#ui!zz%je4{ zjYFn!B+s(pnik!F_9m#5M!p7mX`4oS=v=0fdl()c(;vOKD zXeiLx8kDgfS+WbRCbrq$iT|5Z#I@XP0gBfNL~Te zUbK0au+IWzfYKj)AS_2HmbCeW-u_)S7@yslhY_*Ca7S=A7%##Aonaq_qbvB7U&GiB zHKSfp)jqvoDt&wpHL9^c!XH8EvyDN~7X}YmpuDhG*+jH+=V3UpTxQlB$?2Aq(djUJ z29=zl$qrfoB}EIlfnpx2pmmLz&1O68lyFY~_{1Zpbx@GVz(6!61Az zF67Xc9z}v_tNUXGs;R5tly`Tg)_a=J0Us%21Jf!Dx`K1%-b zH;(D-SX&Pux!!g&VEK4%qbsjNyA9gF%BjY10BkKU-imoekbRYkmqMW63uXT*cA&T) z3GN})knpyTA&0525sDYu-dxWH$TE`CHqy&*2A7%`4}i=%1woi0@fnhwA*s7${av#1 vH_~yJ^nf@+mh$r@GbAy?cC{xOXT9}8=v>z>`}n!n&I;|9_^;z1@KZZH diff --git a/gestaoRaul/comandas/models.py b/gestaoRaul/comandas/models.py index ee79a2d..4b853c0 100644 --- a/gestaoRaul/comandas/models.py +++ b/gestaoRaul/comandas/models.py @@ -2,10 +2,12 @@ from django.db import models from django.contrib.auth.models import User + from clients.models import Client from products.models import Product from mesas.models import Mesa from typePay.models import TypePay +# from payments.models import Payments class Comanda(models.Model): id = models.AutoField(primary_key=True) @@ -27,4 +29,6 @@ class ProductComanda(models.Model): product = models.ForeignKey(Product, on_delete=models.PROTECT) applicant = models.CharField(max_length=255, null=True, blank=True) def __str__(self) -> str: - return self.comanda.name + " - " + self.product.name \ No newline at end of file + return self.comanda.name + " - " + self.product.name + + diff --git a/gestaoRaul/comandas/views.py b/gestaoRaul/comandas/views.py index 57b065e..b2329b9 100644 --- a/gestaoRaul/comandas/views.py +++ b/gestaoRaul/comandas/views.py @@ -9,7 +9,7 @@ from django.db.models import Count, F from comandas.models import Comanda, ProductComanda from clients.models import Client -from payments.models import Payments +from payments.models import Payments, somar from orders.models import Order from products.models import Product from mesas.models import Mesa @@ -23,22 +23,22 @@ def comandas(request): return render(request, 'comandas.html', {'comandas': comandas, 'mesas': mesas}) -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 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 @group_required(groupName='Garçom') def viewComanda(request): diff --git a/gestaoRaul/db.sqlite3 b/gestaoRaul/db.sqlite3 index c5ed3191cb9cb0b0b7e9b52d86d144949ee3ad6b..9c8c9f3bcb6e5f00f4abc6e030fd819ef218028d 100644 GIT binary patch delta 1338 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 delta 358 zcmew)bcvhqG%qg~0}yOc{+iy!G?7n&F>a!|u>d0j6N5WL3Tq2P3R@~;mcZmdHsOiA z9Lk)P?3x@eK^im}Z?Wa(r=;c-16k}Ll?AB*iIpJc#>dYY8TlrkX8On|IC(E~jWP>R z^)2>*Apa0o=a5?*B|xR|1&NhKtU&Q15fH&PIflhnS^~&i$xtK-5)lUx958}?@)njQ z^ugLfw))^NPJ*sWMsU{Aaj>N c=`MrvT?WN3Y}|~B9cBGBoi$$>fK0F%0Kf`d`Tzg` diff --git a/gestaoRaul/payments/models.py b/gestaoRaul/payments/models.py index c5b4d0d..c9832e1 100644 --- a/gestaoRaul/payments/models.py +++ b/gestaoRaul/payments/models.py @@ -1,6 +1,8 @@ from django.db import models +from decimal import Decimal + from typePay.models import TypePay -from comandas.models import Comanda +from comandas.models import Comanda, ProductComanda from clients.models import Client @@ -15,4 +17,22 @@ class Payments(models.Model): def __str__(self): - return self.comanda.name \ No newline at end of file + return self.comanda.name + + +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 \ No newline at end of file diff --git a/gestaoRaul/templates/static/clients/js/clients.js b/gestaoRaul/templates/static/clients/js/clients.js index 151e59e..38ca6c5 100644 --- a/gestaoRaul/templates/static/clients/js/clients.js +++ b/gestaoRaul/templates/static/clients/js/clients.js @@ -51,3 +51,175 @@ function editclient(id) { } + + + + + +function calcularTotalSelecionado() { + let total = 0; + // Seleciona todos os checkboxes marcados (exceto o "selectAll") + const checkboxes = document.querySelectorAll('input[type="checkbox"]:checked:not(#selectAll)'); + + checkboxes.forEach(checkbox => { + const row = checkbox.closest('tr'); + const valorCell = row.querySelector('td:nth-child(7)'); // 7ª coluna é o valor + if (valorCell) { + const valorText = valorCell.textContent.trim(); + // Remove possíveis formatações de moeda e converte para número + const valor = parseFloat( + valorText + .replace('.',',') + .replace(/[^\d,]/g, '') + .replace(',', '.') + + ); + if (!isNaN(valor)) { + total += valor; + } + } + }); + console.log(total) + + // Exibe o total na tela (você pode ajustar onde mostrar) + const totalElement = document.getElementById('total-selecionado'); + if (totalElement) { + totalElement.textContent = total.toLocaleString('pt-BR', {style: 'currency', currency: 'BRL'}); + } else { + // Cria um elemento para mostrar o total se não existir + const display = document.createElement('div'); + display.id = 'total-selecionado'; + display.style.margin = '10px'; + display.style.fontWeight = 'bold'; + display.textContent = `Total selecionado: ${total.toLocaleString()}`; + document.querySelector('table').insertAdjacentElement('afterend', display); + } + + return total; +} + +// Adiciona evento de change a todos os checkboxes +document.addEventListener('DOMContentLoaded', function() { + + const checkboxes = document.querySelectorAll('input[type="checkbox"]'); + checkboxes.forEach(checkbox => { + checkbox.addEventListener('change', calcularTotalSelecionado); + }); +}); + + + + + +document.addEventListener('DOMContentLoaded', function() { + const selectAll = document.getElementById('selectAll'); + if (selectAll) { + selectAll.addEventListener('change', function() { + const isChecked = this.checked; + const checkboxes = document.querySelectorAll('input[type="checkbox"]:not(#selectAll)'); + + checkboxes.forEach(checkbox => { + checkbox.checked = isChecked; + }); + + // Dispara o evento para calcular o total + calcularTotalSelecionado(); + }); + } + + // Adiciona evento para desmarcar "selectAll" se algum checkbox for desmarcado + const checkboxes = document.querySelectorAll('input[type="checkbox"]:not(#selectAll)'); + checkboxes.forEach(checkbox => { + checkbox.addEventListener('change', function() { + if (!this.checked && selectAll.checked) { + selectAll.checked = false; + } + }); + }); +}); + + + + +async function enviarComandasSelecionadas() { + const btn = document.getElementById('btn-fechar-comandas'); + const feedback = document.getElementById('api-feedback'); + + btn.disabled = true; + btn.innerHTML = ' Processando...'; + + try { + const checkboxes = document.querySelectorAll('input[type="checkbox"]:checked:not(#selectAll)'); + const ids = []; + + checkboxes.forEach(checkbox => { + const id = checkbox.id; + if (/^\d+$/.test(id)) { + ids.push(parseInt(id)); + } + }); + + if (ids.length === 0) { + feedback.textContent = 'Nenhuma comanda válida selecionada.'; + feedback.className = 'feedback-message error'; + return; + } + + const response = await fetch('http://192.168.1.150:8001/clients/payDebt', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-Requested-With': 'XMLHttpRequest', + 'X-CSRFToken': getCookie('csrftoken'), + }, + body: JSON.stringify({ ids: ids }) + }); + + // Verifica se a resposta é JSON válido + const text = await response.text(); + let data; + try { + data = JSON.parse(text); + } catch (e) { + throw new Error(`Resposta inválida do servidor: ${text.substring(0, 100)}...`); + } + + if (!response.ok) { + throw new Error(data.error || `Erro HTTP: ${response.status}`); + } + + feedback.textContent = data.message || `${ids.length} comandas processadas com sucesso!`; + feedback.className = 'feedback-message success'; + + setTimeout(() => { + window.location.reload(); + }, 2000); + + } catch (error) { + console.error('Erro:', error); + feedback.textContent = error.message || 'Erro ao processar comandas. Verifique o console para mais detalhes.'; + feedback.className = 'feedback-message error'; + } finally { + btn.disabled = false; + btn.innerHTML = ' Fechar Comandas Selecionadas'; + } +} + +// Função auxiliar para pegar o token CSRF +function getCookie(name) { + let cookieValue = null; + if (document.cookie && document.cookie !== '') { + const cookies = document.cookie.split(';'); + for (let i = 0; i < cookies.length; i++) { + const cookie = cookies[i].trim(); + if (cookie.substring(0, name.length + 1) === (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; +} + +// Exemplo de como chamar a função (pode ser vinculada a um botão) +// document.getElementById('btn-fechar-comandas').addEventListener('click', enviarComandasSelecionadas); \ No newline at end of file