From a20fa6d583e4f8a029e486737617e230bd71b4aa Mon Sep 17 00:00:00 2001 From: Welton Moura Date: Fri, 18 Jul 2025 18:24:21 -0300 Subject: [PATCH 1/6] feat: gerenciamento quantidade product --- .../__pycache__/htmx_views.cpython-312.pyc | Bin 5158 -> 5674 bytes .../balcao/__pycache__/views.cpython-312.pyc | Bin 1960 -> 1960 bytes gestaoRaul/balcao/htmx_views.py | 5 +++ .../__pycache__/htmx_views.cpython-312.pyc | Bin 5016 -> 5418 bytes .../__pycache__/models.cpython-312.pyc | Bin 3672 -> 3672 bytes .../comandas/__pycache__/urls.cpython-312.pyc | Bin 1872 -> 1872 bytes .../__pycache__/views.cpython-312.pyc | Bin 11972 -> 12078 bytes gestaoRaul/comandas/htmx_views.py | 3 ++ .../comandas/templates/viewcomanda.html | 2 +- .../custom_filter_tag.cpython-312.pyc | Bin 3707 -> 3707 bytes gestaoRaul/comandas/views.py | 2 +- gestaoRaul/db.sqlite3 | Bin 364544 -> 364544 bytes .../__pycache__/settings.cpython-312.pyc | Bin 4405 -> 4405 bytes gestaoRaul/gestaoRaul/settings.py | 34 +++++++++--------- .../orders/__pycache__/models.cpython-312.pyc | Bin 2249 -> 2249 bytes .../__pycache__/models.cpython-312.pyc | Bin 1748 -> 1934 bytes .../products/__pycache__/urls.cpython-312.pyc | Bin 789 -> 789 bytes .../__pycache__/views.cpython-312.pyc | Bin 6028 -> 6695 bytes gestaoRaul/products/models.py | 10 +++++- gestaoRaul/products/views.py | 23 ++++++++++-- .../static/comandas/js/viewcomanda.js | 25 ++++--------- 21 files changed, 63 insertions(+), 41 deletions(-) diff --git a/gestaoRaul/balcao/__pycache__/htmx_views.cpython-312.pyc b/gestaoRaul/balcao/__pycache__/htmx_views.cpython-312.pyc index 27624302a2614ed4bf6932ef6aee236443142a67..8fa7aeb74ee95790f92be3e8e8cb8591a4af6dfb 100644 GIT binary patch delta 1164 zcmd6l-%Aux6vt=o%+Bo0&aRWYlVU4kDDK$$DJ7Tt`gW0l-oxJP2OWJ~aKmn2JEk{zj+8#}^rOF>6=f>XL%wH#K}iZk*`waD3q|3!zh z0*>U!mh^~h3f}H0w=NHvghtu2px&f&*8GG$e#2Vl3k15POJ=ALpy}D`8H&vo#B6#Y zLp8L)?EJM+dv0QyR<~K)AGJ8KHCWTy1maz6cR8#1+t}iLAgrI@VQ7esP(mZ%h)$q{ zMvS3Ry6wZ296jfzpfsa&!fm}hFv4ul_O8A{bOfK`{Zs6P zj=)&7ioXK4qN!n(pXa{`9I5|G&=xB>qCYVA__}>wD-xv?4SOjfu8W8Llpk^Swig05 G7XJ?Vx$+eN delta 765 zcmbu6PiPZC6vk&}cV{=7>^9kSRbrwP4B54*Mr)-g7PJAuLlg=g1kt4%Y3(0jHhPc= zC7!DY@8ZF;SnD68CyyRPrB@Fn2TxuE4+bwDotG7~Cl3zHk8j_+xAXDMv-*?3-F6(C zsP%MvX<^=Z?T#9hz>0O9GMHdx=(+wFd(Ji~_7KwLvDP&uZ<4F~)t4nrY2CEpZMF#a zSP@=kvSTA@Cn1u=y5!P~jmKe2yODah3?FP?+5K$4@l*=B z)PAR6NL?DxV?KOyi)(is6^y=K(MhME{xDp_C^V_>jw0l(4ccdmvB0YYLxhOK3Smaz zyND8EA3_CAM4-^;aeKMlX^VqcX&^A(kP8(X{LK0J6Ie?lMKuK#C$wjjoK!pM!6oMc z-P!u+fR_7;FDp(VYOqkK(zEcOFiit^UpU`rV)-;8gUBL|D)j9eiz4Y8GKDs4laT@)LI${d$dy_^>$unE;ymgkxcNZAEK&PSwkzb-$ yK>D*6Eqa^&&&NC6lqp|& zis-=uUC4+Y%N`UT`WL#qxMVEta}+^H5d^(;ezR=qTOFA1{Lb(9J?DJpH!~00Uv!x7 z3`67C=y^4N{Zw$(Y~jsYBF8=8Fv9#Ky2;a3wTI5~i^2!jq)TES9TM&cAKhInw&=QA zPbIOpVQM$*v2(c5zm{i01AW6=NvtgM6%*pzJyknav4#U!_mn9grJAqYvBC1qG!zI& zT6R`o_L#%w69L!Kd!i%V_JpYjP3zH^YgMiPMkWFo)g?RLUR~&MIOy@7>`7jYC*shO zv@BF=W854UucP;+Zs{vxDf(Lag6io?&4n! zVli?Ess?d#c_(|K;vvUbZj`>%22gTsQw#Dui7Xm9)JOA14Cc2iq0~Vas7Aag}T_`;Xw`vY&w?r$M%ueO!4P zZVKu?+)0RrK+Z5JfO8w#7TKsxCMN9}BBhyQnzn@QvQDmsEYt~~hTmTT)CB6!Ig*6f ne-p~lOb*Y^IQ`@*{arUu8%M@Zf#X}h^DO#tnGT0jBDntm|7hH` delta 707 zcmY+BO=uHA7>0NDFT2~_O`4|ASW}8^Qa4pBQfi=SFvS0=4KxTs5thtCEzJ*;R17R6 zXB9!ei=a|Gs)r(h-o5Hky~L9jr3azn&6D%(QrZse!@KjoeDm(?yX=b@`?F;k0$*GE z)%ES@2YXr+?@2H(evvM>Z8)PW!By#z^sGI`bqcn{QBdUtgKAW#1|9M>C=Mr7YWmv7 z1bmE*j8EdQ5u%&T{use`01(5Nr^5nu6DU#78F%6lpF zR)vn>48yK^9)7F8NF2UJDsqZ@kk=N;G(6O%)EWND((p#>8W*@c#h=zw$m(C=tWocO zGBRZBG)5dmmSZ5d+y|Z`u{qGpRB{2gEao+uUcJ<)xpnHY0^hp@1+z$U{hk>U#XSPg z?M8Qz@Bh=!Rl``zF$Z#aWwjE{wzdG$66J}ik|8a=(~LN7XcBIs*3!_YzDn>=v`cA`H?4ti#?zY|*{hlgD#g)T|q2!v@kgtE_SS0*=5!H?j}=i^Tayr z#-H%JERCedEdHh7h8ebI=)VVi HWlaAEFe{i{ diff --git a/gestaoRaul/comandas/__pycache__/models.cpython-312.pyc b/gestaoRaul/comandas/__pycache__/models.cpython-312.pyc index f02c04aa1f05cd97b03d407ec7856c89a3d5b9b5..6b5b583535164e978ede1c3b2b6f9cb75177cffc 100644 GIT binary patch delta 20 acmca1b3=yvG%qg~0}v>&cY%-lG%qg~0}u!@=4|A4Wd{H?X9PU} delta 20 acmcb>cY%-lG%qg~0}zNxCvW6-Wd{H?@&r-< diff --git a/gestaoRaul/comandas/__pycache__/views.cpython-312.pyc b/gestaoRaul/comandas/__pycache__/views.cpython-312.pyc index b055aa79939e9a29fc84794a39aed496df8b5e45..4ba729169134720ae14c5fbd052fcde0ea8656df 100644 GIT binary patch delta 351 zcmX>SyDpCRG%qg~0}u#rs>=Aek+({YZyE~&!*qre#uTPZ##-jd3pq^`YFSEHL5e`2 zhN*^e4a;gK2(Om4hBb?QG9$OFJSRkifguZQAdCm0OE@O?a~Vo9u3=rx2oXtPgPFm| z0Fh+|%1#cH*PMKwSD2-S3CNi!-^~a%eDWDVuFWnArx+PoCi5%VGn!8JR}yD5pPa5_ z&S*S&zLN3eCrT=eQJYzm9hn(rCi|*Ma^2!6E=>w9$xqInoTfHO>K1E3QD$CAkpR&4 zA`T#-$ycNRVmD6aRSl^8+}Bw|F0zPB37;N6G5)%!#zj$$ z6*DY?x(3Rf5z*?>a!jK-4}Dv2|iPTr|x&d50V zqmr@EErH~W#N7N+1emO%tg_ix*_N3@`W9{lbA?6r0SDjY2kK^%{WT;u2WXsP6hEdR>A}Eof`QXR Wp7{hPkB1cV2`N?&`OSt}e^~&f`BGQ_ diff --git a/gestaoRaul/comandas/htmx_views.py b/gestaoRaul/comandas/htmx_views.py index 1787fee..87451b9 100644 --- a/gestaoRaul/comandas/htmx_views.py +++ b/gestaoRaul/comandas/htmx_views.py @@ -45,6 +45,8 @@ def removeProductComanda(request, productComanda_id): if product_comanda.product.cuisine == True: order = Order.objects.get(productComanda=product_comanda) product_comanda.delete() + Product.addStock(Product.objects.get(id=product_comanda.product.id), 1) + msg = JsonResponse({ 'type': 'broadcast', 'message': 'Atenção! Pedido cancelado', @@ -59,6 +61,7 @@ def removeProductComanda(request, productComanda_id): valores = somar(consumo,comanda) else: product_comanda.delete() + Product.addStock(Product.objects.get(id=product_comanda.product.id), 1) consumo = ProductComanda.objects.filter(comanda=comanda) valores = somar(consumo,comanda) diff --git a/gestaoRaul/comandas/templates/viewcomanda.html b/gestaoRaul/comandas/templates/viewcomanda.html index 8d6ff2b..920a66a 100644 --- a/gestaoRaul/comandas/templates/viewcomanda.html +++ b/gestaoRaul/comandas/templates/viewcomanda.html @@ -50,7 +50,7 @@ Detalhes {{comanda.name}}
- - + Cardápio Digital
- - - - - - - - - - {% for product in products %} +
ProdutoPreçoQuantidadeCategoriaAções
+ + + + + + + + {% for product in products %} + + + - - - - - - - - + {% else %} + + {% endif %} + + + - - - {% endfor %} - -
ProdutoPreçoQuantidadeCategoriaAções
{{product.name}}R$ {{product.price}}
{{product.name}}R$ {{product.price}}{{product.quantity}}{{product.category.name}} -
- - + {% if product.quantity > 20 %} +
{{product.quantity}}{{product.quantity}}{{product.category.name}} +
+ + -
+ {% csrf_token %} - + - {% if product.active == True %} - - {% else %} - - - {% endif %} - -
-
-
+ {% if product.active == True %} + + {% else %} + + {% endif %} + +
+ + + {% endfor %} + + diff --git a/gestaoRaul/templates/htmx_components/products/htmx_search_products.html b/gestaoRaul/templates/htmx_components/products/htmx_search_products.html index 8fe4717..b94740d 100644 --- a/gestaoRaul/templates/htmx_components/products/htmx_search_products.html +++ b/gestaoRaul/templates/htmx_components/products/htmx_search_products.html @@ -1,64 +1,160 @@ {% load static %} - - Produto - Preço - Quantidade - Categoria - Ações - + + Produto + Preço + Quantidade + Categoria + Ações + + {% for product in products %} + + {{product.name}} + R$ {{product.price}} -{% for product in products %} + {% if product.quantity > 20 %} + {{product.quantity}} + {% else %} + {{product.quantity}} + {% endif %} + {{product.image}} + {{product.category.name}} + +
+ + - -{{product.name}} -R$ {{product.price}} -{{product.quantity}} -{{product.category.name}} -{{product.image}} + + + - -
- - - - +
+ {% csrf_token %} + + + {% if product.active == True %} + + {% else %} + + {% endif %} +
+
+ + + {% endfor %} + + + + \ No newline at end of file diff --git a/gestaoRaul/templates/static/products/css/products.css b/gestaoRaul/templates/static/products/css/products.css index 38dbe28..4c63b80 100644 --- a/gestaoRaul/templates/static/products/css/products.css +++ b/gestaoRaul/templates/static/products/css/products.css @@ -50,6 +50,40 @@ background-color: rgba(0, 0, 0, 0.6); } + th { + background-color: #170e4f; + cursor: pointer; + position: relative; + } + + th.sorted-asc::after { + content: " ▲"; + font-size: 0.8em; + vertical-align: super; + } + th.sorted-desc::after { + content: " ▼"; + font-size: 0.8em; + vertical-align: super; + } + + #product-list { + width: 100%; + border-collapse: collapse; +} + +#product-list th, +#product-list td { + padding: 8px; + text-align: left; +} + +#product-list th { + position: sticky; + top: 60px; + z-index: 10; + /* cursor: pointer; */ +} @media (max-width: 768px) { .hide-on-mobile { diff --git a/gestaoRaul/templates/static/products/js/products.js b/gestaoRaul/templates/static/products/js/products.js index 0a18682..171d0d5 100644 --- a/gestaoRaul/templates/static/products/js/products.js +++ b/gestaoRaul/templates/static/products/js/products.js @@ -93,4 +93,95 @@ function editProduct(id) { // closeModal(); // } // ); - \ No newline at end of file + +function listerSortTeable(){ + + + +// document.addEventListener('DOMContentLoaded', function() { + const table = document.getElementById('product-list'); + const headers = table.querySelectorAll('th'); + const tbody = table.querySelector('tbody'); // Seleciona o corpo da tabela + + let currentSortColumn = -1; // Armazena o índice da coluna atualmente ordenada + let sortDirection = 'asc'; // 'asc' para ascendente, 'desc' para descendente + + // Adiciona um ouvinte de evento de clique a cada cabeçalho de coluna + headers.forEach((header, index) => { + if (header.textContent.trim() !== 'Ações') { + header.addEventListener('click', () => { + // Se a mesma coluna for clicada, inverte a direção da ordenação + if (currentSortColumn === index) { + sortDirection = (sortDirection === 'asc') ? 'desc' : 'asc'; + } else { + // Se uma nova coluna for clicada, define como a coluna atual + // e inicia a ordenação ascendente + currentSortColumn = index; + sortDirection = 'asc'; + } + + // Remove as classes de ordenação de todos os cabeçalhos + headers.forEach(h => { + h.classList.remove('sorted-asc', 'sorted-desc'); + }); + + // Adiciona a classe de ordenação ao cabeçalho clicado para visualização + header.classList.add(`sorted-${sortDirection}`); + + // Chama a função de ordenação + sortColumn(index, sortDirection, header.dataset.colType); + }); + } + }) + + function sortColumn(columnIndex, direction, columnType) { + // Converte os NodeList de linhas em um Array para poder usar sort() + const rows = Array.from(tbody.querySelectorAll('tr')); + + rows.sort((rowA, rowB) => { + // Obtém o texto da célula na coluna clicada para ambas as linhas + let valueA = rowA.children[columnIndex].textContent.trim(); + let valueB = rowB.children[columnIndex].textContent.trim(); + + // Trata valores específicos para colunas como "Preço" que têm "R$" + if (columnIndex === 1) { // Índice da coluna "Preço" + valueA = valueA.replace('R$', '').trim(); + valueB = valueB.replace('R$', '').trim(); + } + + // Converte para número se o tipo da coluna for "number" + // ou se for a coluna de "Preço" após remover "R$" + if (columnType === 'number' || columnIndex === 1) { + valueA = parseFloat(valueA); + valueB = parseFloat(valueB); + // Garante que NaN (Not a Number) sejam tratados para evitar problemas de ordenação + valueA = isNaN(valueA) ? -Infinity : valueA; + valueB = isNaN(valueB) ? -Infinity : valueB; + } else { + // Para texto, use localeCompare para ordenação correta com caracteres acentuados + // e torna minúsculo para ordenação case-insensitive + valueA = valueA.toLowerCase(); + valueB = valueB.toLowerCase(); + } + + let comparison = 0; + if (valueA > valueB) { + comparison = 1; + } else if (valueA < valueB) { + comparison = -1; + } + + // Aplica a direção da ordenação + return (direction === 'asc') ? comparison : -comparison; + }); + + // Remove todas as linhas existentes e adiciona as linhas ordenadas de volta ao tbody + while (tbody.firstChild) { + tbody.removeChild(tbody.firstChild); + } + rows.forEach(row => tbody.appendChild(row)); + } +// }); +} + +listerSortTeable(); \ No newline at end of file From b74736f391ea72b2dbce23eef9fef190a43ba310 Mon Sep 17 00:00:00 2001 From: Welton Moura Date: Sat, 19 Jul 2025 18:00:22 -0300 Subject: [PATCH 3/6] style: toast ao add product na comanda --- gestaoRaul/db.sqlite3 | Bin 364544 -> 364544 bytes gestaoRaul/templates/static/base.css | 13 +- gestaoRaul/templates/static/base.js | 181 ++++++++---------- .../static/comandas/js/viewcomanda.js | 1 + .../static/products/css/products.css | 6 +- .../templates/static/products/js/products.js | 11 -- 6 files changed, 92 insertions(+), 120 deletions(-) diff --git a/gestaoRaul/db.sqlite3 b/gestaoRaul/db.sqlite3 index 820daa33ea516b3048ac9e29e700bdf6f873ee96..d6770f152faec413398623e28b6a7ce0a5a7d393 100644 GIT binary patch delta 2097 zcmb7F3vg7`8NTOr-*<0#B*dh|O=6ZH*}M1dZtmS(E4qovL{WrDz@XCvv6`X?=pfF} zHpyx$k06kU2OWigGa@rGfUi3h4J1WHNGc*_%41ThP6tO&N+3vXKW zIsgBC=bZ1J|D3rkojEO?IqUMl+VwxH1Z#IUE;7KQ9fysrAoTPTA@_+8=s2I3t?4WE zv~O5Hr+ue?srPGF^rQNx`a$2N54etHWaZr&vLIe_{Y_q$Rk z6M~ThBzi3fzq!sEY97Qqa6GU*Koo{xJNS@p2tm`0dRJO?MxHLCA6R^dY!e@HTe%M*90+SUeicb9eQ^TEy??w#gr4 zQSmU`h}G%x2ek7rTujG)1}h9D|35c*|4*A%tyQ}%pTR8PK7RzB5PozvA>&L4^7G^i zT<-ehczWstYyvsnsQx63foEv@N%(%oQZe&acM66?wSyDcnQ?C0DY&$fC;dPty{_O# zYrt4?gy;BNUL_aFx8yIRmz<$56{2QP;0B7&Yv=)jI0%dk1~M4rc~16LV@2?|PzK8~ zI3%o&nB;Qg(X5$obMW>9n**+AO7{ zhotFJzSu8zF;6SShs7Gv6gA5Z7=9JsM9z}lDA`U{kcY@UBu>WQ zuW=XNgnx}2@NKvR6V#91Loc9Zs15}X56^-9@K10%e6C|=)@wmh5R(HkAd8c3h8}&QP|zlhw8&{C)gn3SrFg0 z;TJduqMh$NiQ`Cb9h0h1xSPBkTk9o>HiYm5x&Y%vdTUn7{*jr(nB8L;a}43f0OuaZ zc=9*Rd%2l#DW{**-__gog?f!%?7QYW?t9z!oNs}z%IDY8+A-}-ZH@M@R-sK)zgLf_ zJJc2G1M1Cct}>wXDX%L}D-B9q87H5U56G{|zm@Cdh^$Fxq#o%NX_-_jl}Up5H}QS( z1#yWuO)L?95Kaj12y2A}LX|M*dj1OkIlqHn!9U1P<#Wje(nq$DR&qaaSXIyBEv%;Z z!k3uGQ~yt67x@)1y{K&-&m}nk!e+QUXgWbF?hl&@%S=S#hGj=0R@?~|wKe`Xk!?73 zc_eN-#rPxeB3p9G=_1oS?v3v9 zVB-LuM6oyOVDsp2K@eQbG z)gxYNg3pW_wqr%(z?(Cko=jt%DSqWC#?$6}BFK(a9(O!R(}-m15H6>Chwu_w zm&ViR*)+a`7F=d7cQPY%XpoH_9K?6JM~874bk|(Qd%)WS&%iOfDM7^5Y><47*8o=qmOf1cYgn{0{y6O6GmPXGV_ delta 2035 zcmZux3s6+o89wLy=e}Qy@;1_im3M&Mb=hU9u`DZyRH72WpjI5U9cx5QO`AGx2ia&c z;-eVq9Fu7kJBiv(ZAeYLnM}us#hL_durW^5VC*#0X`?pAK@d>Va~C>eI^BQv|L-~9 z_rK16?%mpzytOO2V;WB1`$!b0zrJ!~F<#i&U;Jxa_}u0advgiyyq#`p)(&gTx?|lk zzOepoU9&D*7p)Jh_pLLw+f6PJBANERERsywZ38F})NLo_l8-SlM(i*0h$;x?zmR~~ zcoDggWPJyWgWNh)<%fDoegSP79jgiLfq zOSh#{BpXxhpq9?OJtUZ_)oX_zk~g$TVI4iBoOSh(Dfat41eBy{RxwUBA)T896VkX* zP3TwV;)r2i(4 zv**tdk3)3+cK10_58^p=MD4Yh+)wtiSNh2&qHkk~7f5A++WWs^RDW&fWpz^Qjthih z)^&l`|BJtpD^dzJ187w(Aa0h`lCQW~Tua7H-odwY2?)WJVpP3@T&({Jc?PHKjU=+B ztE3D+&R)Dq{wV346XiC1LQ3Q~KPZ;kyFMX5jEbU(HDS<}+^`#qA`(-DL3TJ3T8$hr zLlgydx~QOR!_LWq!?5aabAO-slawV2N;4!yG2}V*RW()h71oXI8E-ARncAqJX>mXR zL~vnTXUBD(lU0o30x^K7vxEK--_MWl&%(KJTZ(h+;vBf7fTm2bB`@s6_RBt4E_JSS z&4`c6P7cGrMbPAD79^E@{`aUVew#wB_0yT&U%#uc$lKXVj%?tr}3%ln2Un z<+O4@i7DSz<|#gTT<(z%$G z545p8r=gkk_P~4gt<&&JVC{c~=UKv8_>}Vd_Q>8yDl^`NrJ3I-QqfEUE7*|b`STXn zFK{<4oVOqvao1HnvADh}gV=pu)VquW@EPfB+O>l&q0`to#Zu@p9eR)eHNxWZzfyz4m_5uMCZ+o)bosuRrPgM z^J^Bk8y=riY#%!hO@7ji_Q`ZHf$n`PXfmO5-uw{_gA28}VnGdk(N})mT~P1M_3^xVhV0YevoK#y#Uhv0Ypvj)<>G8M;gRT>G*1gr=yUsqd(D zYOWO3dX=}d11d3&X~o71#wuf$k)nU8_vx?dTlHn)Y&|HZ39ZY8px~mPix+7FRpF#? zMCk;8{ZI!#paFnfsRP`U+WbLUL9W{A$9 zw0Clqz(Y|X7GGttV?%U575*}b-Qk#klp0ja9p|#DVVcc;KFqV8AEWcxwlTik!Gp1* z&QtRk51W$J{(aUp!t;MMLQQsv=VzC@$>?)l&8dlLLBpw9>F-BDVH*E82BuWHW-wZPN9&RM0hff1^)sZKBJcxyb;7B( { - console.log('Conectado ao servidor WebSocket'); -}); - -websocket.addEventListener('message', (event) => { - const data = JSON.parse(event.data); - - switch (data.local) { - case 'cozinha': - - if (document.getElementById('Fila') !== null && data.tipo === 'add'){ - var novoElemento = document.createElement('div'); - novoElemento.innerHTML = data.message; - document.getElementById('Fila').appendChild(novoElemento); - let valorAtual = document.cookie.replace(/(?:(?:^|.*;\s*)notificacao\s*\=\s*([^;]*).*$)|^.*$/, "$1"); - if (valorAtual === 'true') { - texto = new SpeechSynthesisUtterance(data.speak); - window.speechSynthesis.speak(texto); - // setTimeout(function() { - // location.reload(); - // }, 6000); - } - } - else if (document.getElementById('obs-'+data.id) !== null && data.tipo === 'edit'){ - const obs = document.getElementById('obs-'+data.id) - const card = obs.parentNode; - card.style.backgroundColor = 'rgb(243, 165, 75)'; - obs.innerHTML = data.message; - let valorAtual = document.cookie.replace(/(?:(?:^|.*;\s*)notificacao\s*\=\s*([^;]*).*$)|^.*$/, "$1"); - if (valorAtual === 'true') { - texto = new SpeechSynthesisUtterance(data.speak); - window.speechSynthesis.speak(texto); - // setTimeout(function() { - // location.reload(); - // }, 6000); - } - } - else if (document.getElementById('m-card-'+data.id) !== null && data.tipo === 'delete'){ - // const card = document.getElementById('m-card-'+data.id) - // card.style.backgroundColor = 'rgb(253, 69, 69)'; - let valorAtual = document.cookie.replace(/(?:(?:^|.*;\s*)notificacao\s*\=\s*([^;]*).*$)|^.*$/, "$1"); - if (valorAtual === 'true') { - texto = new SpeechSynthesisUtterance(data.speak); - window.speechSynthesis.speak(texto); - setTimeout(function() { - location.reload(); - }, 6000); - } - } +// const websocket = new WebSocket('ws://192.168.0.150:8765'); +// const nomeUsuario = document.getElementById('user-info').textContent; + +// websocket.addEventListener('open', (event) => { +// console.log('Conectado ao servidor WebSocket'); +// }); + +// websocket.addEventListener('message', (event) => { +// const data = JSON.parse(event.data); + +// switch (data.local) { +// case 'cozinha': + +// if (document.getElementById('Fila') !== null && data.tipo === 'add'){ + + +// var novoElemento = document.createElement('div'); +// novoElemento.innerHTML = data.message; +// document.getElementById('Fila').appendChild(novoElemento); +// let valorAtual = document.cookie.replace(/(?:(?:^|.*;\s*)notificacao\s*\=\s*([^;]*).*$)|^.*$/, "$1"); +// if (valorAtual === 'true') { +// texto = new SpeechSynthesisUtterance(data.speak); +// window.speechSynthesis.speak(texto); +// // setTimeout(function() { +// // location.reload(); +// // }, 6000); +// } +// } +// else if (document.getElementById('obs-'+data.id) !== null && data.tipo === 'edit'){ +// const obs = document.getElementById('obs-'+data.id) +// const card = obs.parentNode; +// card.style.backgroundColor = 'rgb(243, 165, 75)'; +// obs.innerHTML = data.message; +// let valorAtual = document.cookie.replace(/(?:(?:^|.*;\s*)notificacao\s*\=\s*([^;]*).*$)|^.*$/, "$1"); + +// if (valorAtual === 'true') { +// texto = new SpeechSynthesisUtterance(data.speak); +// window.speechSynthesis.speak(texto); +// // setTimeout(function() { +// // location.reload(); +// // }, 6000); +// } +// } +// else if (document.getElementById('m-card-'+data.id) !== null && data.tipo === 'delete'){ +// // const card = document.getElementById('m-card-'+data.id) +// // card.style.backgroundColor = 'rgb(253, 69, 69)'; +// let valorAtual = document.cookie.replace(/(?:(?:^|.*;\s*)notificacao\s*\=\s*([^;]*).*$)|^.*$/, "$1"); +// if (valorAtual === 'true') { +// texto = new SpeechSynthesisUtterance(data.speak); +// window.speechSynthesis.speak(texto); +// setTimeout(function() { +// location.reload(); +// }, 6000); +// } +// } - break; - case 'praca': - console.log('Mensagem para a praca:', data); - break; - case 'guarita': - console.log('Mensagem para a guarita:', data); - break; - case 'balcao': - console.log('Mensagem para a balcao:', data); - break; - default: - console.log('Local desconhecido:', data); - } +// break; +// case 'praca': +// console.log('Mensagem para a praca:', data); +// break; +// case 'guarita': +// console.log('Mensagem para a guarita:', data); +// break; +// case 'balcao': +// console.log('Mensagem para a balcao:', data); +// break; +// default: +// console.log('Local desconhecido:', data); +// } -}); -websocket.addEventListener('error', (event) => { - console.error('Erro no WebSocket:', event); -}); -websocket.addEventListener('close', (event) => { - console.log("conexão fechada"); -}); +// }); +// websocket.addEventListener('error', (event) => { +// console.error('Erro no WebSocket:', event); +// }); +// websocket.addEventListener('close', (event) => { +// console.log("conexão fechada"); +// }); @@ -154,7 +125,7 @@ function openFullscreen() { } } - function showToast(message, type ,duration = 3000) { + function showToast(message, type ,duration = 2500) { const toast = document.getElementById('toast'); if (type === 'success') { diff --git a/gestaoRaul/templates/static/comandas/js/viewcomanda.js b/gestaoRaul/templates/static/comandas/js/viewcomanda.js index a6ca06f..611bad9 100644 --- a/gestaoRaul/templates/static/comandas/js/viewcomanda.js +++ b/gestaoRaul/templates/static/comandas/js/viewcomanda.js @@ -396,6 +396,7 @@ async function addProductComanda(productId, comandaId, cuisine) { const result = await response.text(); console.log(response); + showToast('Produto adicionado com sucesso!', 'success'); // Atualiza a lista de produtos const listElement = document.getElementById("list-products-comanda"); diff --git a/gestaoRaul/templates/static/products/css/products.css b/gestaoRaul/templates/static/products/css/products.css index 4c63b80..80ab60b 100644 --- a/gestaoRaul/templates/static/products/css/products.css +++ b/gestaoRaul/templates/static/products/css/products.css @@ -82,7 +82,6 @@ position: sticky; top: 60px; z-index: 10; - /* cursor: pointer; */ } @media (max-width: 768px) { @@ -96,4 +95,9 @@ max-width: 100px; width: 80px; } + #product-list th { + position: sticky; + top: 0px; + z-index: 10; +} } \ No newline at end of file diff --git a/gestaoRaul/templates/static/products/js/products.js b/gestaoRaul/templates/static/products/js/products.js index 171d0d5..f9fd4e6 100644 --- a/gestaoRaul/templates/static/products/js/products.js +++ b/gestaoRaul/templates/static/products/js/products.js @@ -81,18 +81,7 @@ function editProduct(id) { // }) } -// document.getElementById('openModal').addEventListener('click', openModal); -// document.getElementById('productForm').addEventListener('submit', function(event) { -// event.preventDefault(); - - // const productName = document.getElementById('productName').value; - // const productPrice = document.getElementById('productPrice').value; - // const productDescription = document.getElementById('productDescription').value; - - // closeModal(); -// } -// ); function listerSortTeable(){ From a9289cb28d8987755e3bb3735d7a3a5a46493a87 Mon Sep 17 00:00:00 2001 From: Welton Moura Date: Tue, 22 Jul 2025 15:39:37 -0300 Subject: [PATCH 4/6] feat: criado tabela no db (UnitOfMeasure, ProductComponent, StockMovementType, StockMovement) add UnitOfMeasure na tabela produtos --- .../__pycache__/models.cpython-312.pyc | Bin 3672 -> 6359 bytes .../0005_stockmovementtype_stockmovement.py | 42 ++++++++++++ ...movementtype_stockmovement.cpython-312.pyc | Bin 0 -> 3344 bytes gestaoRaul/comandas/models.py | 37 ++++++++++- gestaoRaul/db.sqlite3 | Bin 364544 -> 425984 bytes .../__pycache__/models.cpython-312.pyc | Bin 1934 -> 4366 bytes ...ctcomponent_product_components_and_more.py | 44 +++++++++++++ ...roduct_components_and_more.cpython-312.pyc | Bin 0 -> 3038 bytes gestaoRaul/products/models.py | 62 ++++++++++++++++++ 9 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 gestaoRaul/comandas/migrations/0005_stockmovementtype_stockmovement.py create mode 100644 gestaoRaul/comandas/migrations/__pycache__/0005_stockmovementtype_stockmovement.cpython-312.pyc create mode 100644 gestaoRaul/products/migrations/0004_unitofmeasure_productcomponent_product_components_and_more.py create mode 100644 gestaoRaul/products/migrations/__pycache__/0004_unitofmeasure_productcomponent_product_components_and_more.cpython-312.pyc diff --git a/gestaoRaul/comandas/__pycache__/models.cpython-312.pyc b/gestaoRaul/comandas/__pycache__/models.cpython-312.pyc index 6b5b583535164e978ede1c3b2b6f9cb75177cffc..3c572ee514e6a6be879b6ce1759fa9af18d2fd37 100644 GIT binary patch delta 2520 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 F{{b}EKfV9} literal 0 HcmV?d00001 diff --git a/gestaoRaul/comandas/models.py b/gestaoRaul/comandas/models.py index 6e6bf59..56235be 100644 --- a/gestaoRaul/comandas/models.py +++ b/gestaoRaul/comandas/models.py @@ -43,4 +43,39 @@ class ProductComanda(models.Model): for p in products: if p.name == produto['nome'] and p.active == True: products_ordenados.append(p) - return products_ordenados[:15] \ No newline at end of file + return products_ordenados[:15] + + +class StockMovementType(models.Model): + id = models.AutoField(primary_key=True) + name = models.CharField(max_length=100, unique=True, help_text="Ex: 'Entrada por Compra', 'Saída por Venda', 'Ajuste de Estoque'") + observation = models.TextField(null=True, blank=True) + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return self.name + +class StockMovement(models.Model): + id = models.AutoField(primary_key=True) + product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='stock_movements') + user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, help_text="Usuário que realizou a movimentação.") + related_comanda = models.ForeignKey( + Comanda, + on_delete=models.SET_NULL, + null=True, + blank=True, + help_text="Comanda relacionada à movimentação (opcional)." + ) + movement_type = models.ForeignKey(StockMovementType, on_delete=models.PROTECT, help_text="Tipo de movimentação (entrada, saída, ajuste).") + quantity = models.IntegerField(help_text="Quantidade movimentada. Use valores negativos para saídas.") + observation = models.TextField(null=True, blank=True) + movement_date = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return ( + f"Movimentação de {self.quantity} de {self.product.name} " + f"({self.movement_type.name}) em {self.movement_date.strftime('%d/%m/%Y %H:%M')}" + ) + + class Meta: + ordering = ['-movement_date'] \ No newline at end of file diff --git a/gestaoRaul/db.sqlite3 b/gestaoRaul/db.sqlite3 index d6770f152faec413398623e28b6a7ce0a5a7d393..663c5a7481f6e9a8e553d6f2dcfeabacdde234e5 100644 GIT binary patch delta 8739 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 delta 4441 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 ON?8}pT{#4eO8XzhJ7LoR diff --git a/gestaoRaul/products/__pycache__/models.cpython-312.pyc b/gestaoRaul/products/__pycache__/models.cpython-312.pyc index 11aac8f2c290009876b9e415fedae88772c7f40c..a9e6b0de2da7b6d2a23d4ad7fec24753cf0f762d 100644 GIT binary patch literal 4366 zcmb_fT}&I<6`t`Q9{++31VTtAZ% z8jrv3?EfB|O@RnR%nJoEBZ}yI@}7b> zP%6BK zA4rK#pkNT1H^KAWGbw}r(1dEyoWV3|W?zp;5Sr8cHI!}&RLF=#$ap*g^)3ew16`kp zJDwM!>u3BN)n=l^OGM(^@gJTr^w$m<0A$A@WRSpQGg3)Pg`DU;U9;{i-lnQqWORO8 zbiyl4E2ylb+^40z_h1-nr=}i$C=UaWsDuu`BM;xop`FnzW(=piPN<+hRPt2MSxZi! zsA~_3)RC5Genqk9Lu(KBe=W)TDC*eozT12_Tc0GKD*Cv0`zOI{3Xgx@DMSpD<&YqI37| z^{I)m95pS~xT_ZPV=K%c#jItHxm%iEDLEaAVp>d5)_RUCP`X|mgHM@g%7PtF*5Yy{ zF7F2AeH`vAENf6vbhSVg#R(}2^jgfLA5oMCMK$l%Fr2L;jTbFrTBCX5cr@Zj6H6*{ zUwsH;T>xS|V73L;i+(qnj)sxIF>io*EZ9>2dT&kYuSosRNmUvxU$?^p>sM;wfl7Gb zIeU42_xfkmuv(t9ljk+`!GE7jy@<(Yk-=s)Xz1G_(Rg0TRfeTbF+ z;|bpJHP1POE1cd=_cMnroLv#lE_@fCjKp!c2rW+wF3fR#Eg*O$0f>cQv%e_Eooa)V zNN6YA#Kk#IeiKK#VBF{5EZ>PV+a`J2OK)O`v=eQvK+mx#@er!_*m0bIalG5+8?b&P zwiAC*XQ50#@8NPAWGCq&2_li?PInVMKzit@MGxtH?8^+26Tlm%NgvoVrT)}OrvqXN zBWIo=kL?jKDUpTo&*S*?Vm|Nq7xJoppJA-*;U+=_=L@3cG|O~igl2(m^2$nH%~Erk zxfnJCP^W{?MTk!eB3?3d1?ZMq6h1Hvm22nggd`Ix7bpR8l2=rw$`IC6<`Hcf>6DM* zy7TVXIrO4vl3<+9`rs#w!iu2-M{IkXt}MQonnjg5Db$OwzF8F4Ooan^sj-;yIUUv# zGm5z-CsucqMGR`w37e%tfm%$0?1>bW=ng?-pr6Noq z<6znfs-Y9QSx|G-t?)x=<){;xbc3v32m+sl!kao|E7VmRhU0KT(*~njPQOJ<4C%t@ zm>8d%7@wSSf>}4UDLIkrhLNYL?)KG@Eo!EwQzxKiEp3%@WpaXZQ}fE~y_p#&4(WiU z7>i25O)#AJZB;ML8))4gLd`%j9WO{O7d!SLPVHf%2VK2_bQ5qqo*IT%Kv9@@-wjB5 z4>Q!_H87uY`onx0P$*c!rE`oe`N46QifX_b4 z!|QD(V#ZtYq`cqtw2EH(HnmhX0_a%~%cJDO!xxrJv5XwGmMCk9M#sk+-^0f6Gciqs za6CErB<`NVpFzP9c|%s=(y|85aq_l&Sd0LN&sT6a1bL~SJGacWP~(A`#`!)})xMwK z_~(R_cXll(GYWHK@|q8K3MM}aZC!5dYRHp<7>!ZF-oeVYI@|ZglGZN?pF$J!8kn;1 zSG*)#sKhVS;v<##$Zl+O>nguEVA*c$;&ZZfxi&gp86B^UPFF^!cSml#@`}-$;w!IL z3e~kC+Oj>aHca8bWHi%g_#|+!PWLC6$N(uHA^M*q2=~P$+7^1nIO4(d5jf^57}(Fg z)U!aXFIDMF*}*u{Rr+b#?isNY*AFCre_+?w^C}|rkF*1gwty}p=>1CH`*vrSotQuH zdwKhRheZFB_zxhmDRDpG^Sd+V1Hs#rM3z-OXQau3ducjZf6p2iHq)$ delta 599 zcmYLGzi$&U7`5+L?yhapq}L`PX%or-UV=bE;z!j5Q3gbW5JI8|9oO1TLoav5mq>&G zI%I&QaPmO^g|5KFUx35{8?pov14Fio05hKx5SH%U=jZpnXY1Qv-p^$}%*?n5*5LKy z?JIhkE#bBFletJ%-rBH?QM2%L6fOn-tGjv@9(hwkU|UK+)nVw z4_VaeZWB!!Q7;Uoxe*4@&d?Q(bsD?kf>kwUK`kno)#*dr1eXy79YzGz?vdQzfQIiU zUGDn@P$pS`J@mP-@QS45W#yy2I6~ryeNlYPoW-8V+oi$+NTmL-OA`&MdYu==CA)^_ z#a(+Dmq8pBJviVM1xo<`b=axp%Zfg(Kvhjr5x=#|8lM-potuR!P|{tCIcv9~Ypl-= z@yIW^vJ;G(!tya!S9Eqncm0-7{`tc zO=3xhJ_w>#+@Kp=2dm6)23^*Qd7CAT$>g{in>4ShF-~&MtFZAiRJOENK-de}Dqn#u ihA&Z1KdR{%<1eWC9i94Vd)Rxn^&)&8{z6cW-G2bjPLlcn diff --git a/gestaoRaul/products/migrations/0004_unitofmeasure_productcomponent_product_components_and_more.py b/gestaoRaul/products/migrations/0004_unitofmeasure_productcomponent_product_components_and_more.py new file mode 100644 index 0000000..c8c7a3a --- /dev/null +++ b/gestaoRaul/products/migrations/0004_unitofmeasure_productcomponent_product_components_and_more.py @@ -0,0 +1,44 @@ +# Generated by Django 5.1.4 on 2025-07-22 18:36 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('products', '0003_product_cuisine'), + ] + + operations = [ + migrations.CreateModel( + name='UnitOfMeasure', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(help_text="Ex: 'Unidade', 'Kg', 'Litro'", max_length=50, unique=True)), + ('abbreviation', models.CharField(help_text="Ex: 'un', 'kg', 'L'", max_length=10, unique=True)), + ], + ), + migrations.CreateModel( + name='ProductComponent', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('quantity_required', models.PositiveIntegerField(default=1, help_text='Quantidade deste componente necessária para o produto composto.')), + ('component_product', models.ForeignKey(help_text='Um produto que é componente de outro produto.', on_delete=django.db.models.deletion.CASCADE, related_name='used_as_component_in', to='products.product')), + ('composite_product', models.ForeignKey(help_text='O produto que é composto por outros produtos.', on_delete=django.db.models.deletion.CASCADE, related_name='composition_entries', to='products.product')), + ], + options={ + 'unique_together': {('composite_product', 'component_product')}, + }, + ), + migrations.AddField( + model_name='product', + name='components', + field=models.ManyToManyField(related_name='is_component_of', through='products.ProductComponent', to='products.product'), + ), + migrations.AddField( + model_name='product', + name='unit_of_measure', + field=models.ForeignKey(blank=True, help_text='Unidade de medida para este produto.', null=True, on_delete=django.db.models.deletion.SET_NULL, to='products.unitofmeasure'), + ), + ] diff --git a/gestaoRaul/products/migrations/__pycache__/0004_unitofmeasure_productcomponent_product_components_and_more.cpython-312.pyc b/gestaoRaul/products/migrations/__pycache__/0004_unitofmeasure_productcomponent_product_components_and_more.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ada42cc81b00e2cd2f3f939fd0df8e454b506e7 GIT binary patch literal 3038 zcmcImOKclO7~Wm4pLx_y+?e#0O=IG?fYU;u2vw+V;zFNkN-I^Su-#-P_NMlZJG|25;E z1_n|J{4TPO>#GSx`IQUdFWQ|vy8x5N3Q~~TP^v17T0?6_s*$E%)m24P-ceBGGX?25 zvMj8H2IRONkz+NwsurV9xp1whu~gHpQOmQ5zpY{w=?Vd4%Z=ppY5SNjI!;6As#Rt5t<`CG;_Fr`OrVt zm-~CH9qF-l?4N7s1vJ_|w1?;6=b|6^AJC8PN3ZGV7#gdqw%Rtr+=&brJ(!Q94zIpce3>P$hW!Q2 zmS|Ce{6)`Y*^?(vzGiksbJ4e5+rez$mScN!OINYw`V=$GMmI0OvA!0yn-*O)@8MOJ zbTPH9hP{TF?pRH{cBHcMmQjF{$U?aAvQfBPdiH7|}jBLV0zw{s)*Y5Eq-AILqAkEyuIHRg>cTzD+TD zs)Ck(4nFf@i+f}s?0VQ(3?Z=L;6?1ZKYRsYFj^M13}T2tdPHiu9w|Z8;s`HUe#4^& zICN&mKp1tu1nak&J7*yd#t+}@1p;v5Lli@m63hB7MyBPOyVh)HEghz{)SVP{37RC1 z2{$VCAi@+kcr>Kznn${fT-(F@7|n%f#$H0;lhGnn@^M2Ix5S186R-j|xCt4cHg?$o znO4&yHSEt<6Y(~wc{C>vG+Pkmexjh9KHUx#Dmo_ zVbH5n;@9fb5KvHT{7Df`%hHL8(h&?jlPsA{S?g>0ZUIBOjV4A=%rdtk`2rTQx;C;y z06g@_QulN*%AyMm%eg1Rt~-9CLHRu?Xk061S;74&)C5odaqEc#6-3F1yex|T7Y+_-VRGBaI+ zs9NL(bjNfU(COX(0n>0doi_IcIIPf};s_UZ8^JX#2SI2lF11!^4CshY944*}ul;Ar zR!m90vK7&?u}`jSrIh5@=c$dvu}b1=vi9zEE|6*{@Xx3k|@p5!hC>C2m$ zTrgVvVq{~q*cmMbr*8zN6)ZbXMoExvZDz)T@l#)pY>c1kjGqe5&Icdf4eaKVaVJQV zt+<{Y+>XYRsjc)rtON1s{YYLbw8v6wv^-Q+p^N zSGtg|j}65>y+q4l?G$(?=C@S?|M@t)&WgsJmfF>zMj s8gJ7Ii2R*$`GvO?QC0O>Oi{;wR;IRNFRHOesf~2Llg|IHfFKO~1$$W$u>b%7 literal 0 HcmV?d00001 diff --git a/gestaoRaul/products/models.py b/gestaoRaul/products/models.py index 93e978b..7d3c312 100644 --- a/gestaoRaul/products/models.py +++ b/gestaoRaul/products/models.py @@ -1,6 +1,18 @@ from django.db import models +from django.contrib.auth.models import User from categories.models import Categories +# from comandas.models import Comanda + + + +class UnitOfMeasure(models.Model): + id = models.AutoField(primary_key=True) + name = models.CharField(max_length=50, unique=True, help_text="Ex: 'Unidade', 'Kg', 'Litro'") + abbreviation = models.CharField(max_length=10, unique=True, help_text="Ex: 'un', 'kg', 'L'") + + def __str__(self): + return self.abbreviation # Create your models here. @@ -14,6 +26,23 @@ class Product(models.Model): category = models.ForeignKey(Categories, on_delete=models.CASCADE) cuisine = models.BooleanField(default=False) active = models.BooleanField(default=True) + unit_of_measure = models.ForeignKey( + UnitOfMeasure, + on_delete=models.SET_NULL, # Define como NULL se a unidade de medida for excluída + null=True, + blank=True, + help_text="Unidade de medida para este produto." + ) + + # Campo de composição (mantido da resposta anterior) + components = models.ManyToManyField( + 'self', + through='ProductComponent', + through_fields=('composite_product', 'component_product'), + symmetrical=False, + related_name='is_component_of' + ) + def __str__(self) -> str: return f"{self.name}" @@ -25,3 +54,36 @@ class Product(models.Model): def addStock(self, qtd): self.quantity += qtd self.save() + + + +class ProductComponent(models.Model): + composite_product = models.ForeignKey( + Product, + on_delete=models.CASCADE, + related_name='composition_entries', + help_text="O produto que é composto por outros produtos." + ) + component_product = models.ForeignKey( + Product, + on_delete=models.CASCADE, + related_name='used_as_component_in', + help_text="Um produto que é componente de outro produto." + ) + quantity_required = models.PositiveIntegerField( + default=1, + help_text="Quantidade deste componente necessária para o produto composto." + ) + + class Meta: + unique_together = ('composite_product', 'component_product') + + def __str__(self): + return ( + f"{self.composite_product.name} requer " + f"{self.quantity_required} de {self.component_product.name}" + ) + + + + From 37428e8cc72df042cb41ba418991d075cc42a123 Mon Sep 17 00:00:00 2001 From: Welton Moura Date: Tue, 22 Jul 2025 18:22:41 -0300 Subject: [PATCH 5/6] =?UTF-8?q?feat:=20criado=20func=C3=A7=C3=B5es=20de=20?= =?UTF-8?q?movimenta=C3=A7=C3=A3o=20de=20estoque?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__pycache__/htmx_views.cpython-312.pyc | Bin 5674 -> 6878 bytes gestaoRaul/balcao/htmx_views.py | 47 +++++++++++- .../__pycache__/admin.cpython-312.pyc | Bin 444 -> 644 bytes .../__pycache__/htmx_views.cpython-312.pyc | Bin 5418 -> 5609 bytes .../__pycache__/models.cpython-312.pyc | Bin 6359 -> 8765 bytes .../__pycache__/views.cpython-312.pyc | Bin 12078 -> 12525 bytes gestaoRaul/comandas/admin.py | 4 +- gestaoRaul/comandas/htmx_views.py | 29 ++++++- gestaoRaul/comandas/models.py | 72 +++++++++++++++++- gestaoRaul/comandas/views.py | 19 ++++- gestaoRaul/db.sqlite3 | Bin 425984 -> 425984 bytes .../__pycache__/admin.cpython-312.pyc | Bin 349 -> 548 bytes .../__pycache__/models.cpython-312.pyc | Bin 4366 -> 3948 bytes gestaoRaul/products/admin.py | 7 +- gestaoRaul/products/models.py | 9 --- 15 files changed, 164 insertions(+), 23 deletions(-) diff --git a/gestaoRaul/balcao/__pycache__/htmx_views.cpython-312.pyc b/gestaoRaul/balcao/__pycache__/htmx_views.cpython-312.pyc index 8fa7aeb74ee95790f92be3e8e8cb8591a4af6dfb..47e273384ef50ef489a9edcc4b84dd4002ce67b3 100644 GIT binary patch delta 2888 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 diff --git a/gestaoRaul/balcao/htmx_views.py b/gestaoRaul/balcao/htmx_views.py index 8fa028e..5ab531a 100644 --- a/gestaoRaul/balcao/htmx_views.py +++ b/gestaoRaul/balcao/htmx_views.py @@ -6,7 +6,7 @@ from django.contrib.auth.models import User -from comandas.models import Comanda, ProductComanda +from comandas.models import Comanda, ProductComanda, StockMovementType, StockMovement from mesas.models import Mesa from products.models import Product from payments.models import Payments @@ -30,7 +30,19 @@ def addProductBalcao(request, product_id, comanda_id, qtd): for i in range(qtd): product_comanda = ProductComanda(comanda_id=comanda_id, product_id=product_id) product_comanda.save() - Product.subStock(Product.objects.get(id=product_id), qtd) + product = Product.objects.get(id=product_id) + comanda = Comanda.objects.get(id=comanda_id) + user = User.objects.get(id=request.user.id) + typeMovement = StockMovementType.objects.get(name="Venda - Balcao") + + StockMovement.subTransactionStock( + product=product, + movement_type=typeMovement, + comanda=comanda, + user=user, + qtd=1, + obs= "Vendido no balcão" + ) consumo = ProductComanda.objects.filter(comanda=comanda_id) total = 0 @@ -44,7 +56,20 @@ def addProductBalcaoTeclado(request, product_id, comanda_id, qtd): for i in range(qtd): product_comanda = ProductComanda(comanda_id=comanda_id, product_id=product_id) product_comanda.save() - Product.subStock(Product.objects.get(id=product_id), qtd) + product = Product.objects.get(id=product_id) + comanda = Comanda.objects.get(id=comanda_id) + user = User.objects.get(id=request.user.id) + typeMovement = StockMovementType.objects.get(name="Venda - Balcao") + + StockMovement.subTransactionStock( + product=product, + movement_type=typeMovement, + comanda=comanda, + user=user, + qtd=1, + obs= "Vendido no balcão" + ) + consumo = ProductComanda.objects.filter(comanda=comanda_id) total = 0 for produto in consumo: @@ -54,9 +79,23 @@ def addProductBalcaoTeclado(request, product_id, comanda_id, qtd): @group_required(groupName='Garçom') def removeProductBalcao(request, productComanda_id): product_comanda = ProductComanda.objects.get(id=productComanda_id) + comanda = product_comanda.comanda + product = product_comanda.product + user = User.objects.get(id=request.user.id) + typeMovement = StockMovementType.objects.get(name="Estorno") + consumo = ProductComanda.objects.filter(comanda=product_comanda.comanda) + StockMovement.sumTransactionStock( + product=product, + movement_type=typeMovement, + comanda=comanda, + user=user, + qtd=1, + obs= "Excluido do balcão" + ) + + product_comanda.delete() - Product.addStock(Product.objects.get(id=product_comanda.product.id), 1) total = 0 for produto in consumo: diff --git a/gestaoRaul/comandas/__pycache__/admin.cpython-312.pyc b/gestaoRaul/comandas/__pycache__/admin.cpython-312.pyc index ac25a4db9c1e16af3461b512c2ec7e42dd047ca2..30aaef4981b506fac5b130f25e472722f243bb2f 100644 GIT binary patch delta 350 zcmdnP+``ItnwOW00SJEHuFqg)oX97^#K1UFLry7|HHtNtEsBkiA(b(U52OMWWC>18 zP!z>3F-4AW(b`;nNd;q3WM?u2G(}2My~4&!WS8YFNmmKVNgR6n&5ktL8*urs2>2J C$U?{f delta 143 zcmZo+-NVdxnwOW00SLAze@&msFp*D!sfS^rhMW{5Ln>nySOz4E09m{fGZaO!OU#p- ztidSE$TZo8QIgqDlYMd(qrv1YjOh}*K>dtBT&xcyJ}@&fGTvoSc+Oxv*^Eh%<0^x4 I5jRjA0B=(k{r~^~ diff --git a/gestaoRaul/comandas/__pycache__/htmx_views.cpython-312.pyc b/gestaoRaul/comandas/__pycache__/htmx_views.cpython-312.pyc index 63744908534697844750cd62726e2ab346de32e3..c57a7db3ec8cbe46268eb234d682597310464855 100644 GIT binary patch delta 2382 zcmbtWU1%It6rS0go&B4c{h8e~o83(|f34Fbn_#OCHI~+-sg?eOCat;%VX}9cZo0D* z@66UlCu|;k5dZ2(5BEB?KNEo`*f(k{1776gZOe-7Yc$d7DQbtNP46Y zarORkRF4&6E*~hzb-5tBe6XC*lZB+-R%mnOP;C5 zIjeUTI$6fUXdOsejjXT~O^yCg^j&5JpwU(6a?P=(nQBmcn>F`@Ro-Upe!`mAX6;!_ zDs2xSh{8G?QZ0?{WSSisr{XD7!wTp4#|&MqAk~p3v4N^Zt0l*#ETeetm~mdywTd;p zxS%=WV=8imy~OS#dpyTHwwK%&5}75=_Ra?&-s5Y@XNAb1FH2@T2`@7*kguXLD-nUu za7(-uZJOi}#I5?=8qwoRew&+*KYkBLh(GrX!+gl%cdP^)?B4ODkIk+6H}46M1D>uI z|II6CrCRscL7Q9gG^C{vWCVEA9WDFTjsk!MuaZe_@5E|wGi2E6YB|m4THMxd`)rz= z&7%+suL>)C!@@E&R4=(NX7W~l%NdDCLJ<_T!}C&0x3!}f)$as!yC{x-t}C>Wu6dDs zmEQy=KrL!dU5m=APoLNpI`Xp^Cwuw-fx{YT-DWc=VSDV59e}Tfl2?5z-iB?8S!9&9 z;|^!37u1Oxtm7#m$A8GQ3|ui_94cN_*T~nrGXA!F=t8kvEg>U^)LgMK4+`)27a9}c zhwuPI)<4}?&&o--xnmehoPq_x2Z z!75_SSkNlXHx?hEI*sfX4zgpnmW8k<2BSHFbChC;jLIb%ig%1MQ*5)BR{cYWLZevx*2_g<#TYhoy6kZwPV1Zq(lkg zEu3!sT!;I+ z{bQ6nuJn>4^3iMunpZ1xM!sm!bW5{&wQ8Ns>ju)wCJvB`a~4Xo0)$i#8dlh|34!9!5Z zxf0gSwwIB+S+p(qE$oeOY@)gY%&Y)q$Ug)EKE!{|eErsI&xLNuow)PX;Q5N~&-gJSh`0)p9>@d)b{Awlm@RfaotaL7r9zi}By$8K8`9z=uqAI|NR1E) z-b9-Xh%(*WI~6CPHn-B|?h%{Yz2P=*!t%0S9CIFBi>6}iWju~;>{Hyu?&FW}+w67Q z6}GONVQEJk``Cy*;dGQ8d5QIgqrT5eb!TWp~*Ly(h|s zbJO1NEub}&3eVLYruwFO@eZ!ra-{A^&ri>B?9P^SmF>H_*;%)N#V zOWj?%me;bTQMWH?CiQR=1viD+sk;nQHCGKP3FUgOU}}^GKyk0o5?Rff{QT9Nkt=Ex z+Dc(ws2>76Dj^GIDZ5Oap!#xT(b^(8imI+r7q_Q;>>E#F;y8o^oBl;$TqLUC!4s)8 zn^Oyvk1e7D5a=vXqS3ltH@%1(Qiea~_L6J-3xzVM#ze;~&`D7{mv$;qmm{Jc~f z7_SbD*9Io51Cu*)@}4}kerb>O`OL9Bsk*ZJA>!t@2& z!IhM=(S{Vq^aO~L5aKY@H?)+UJ`IYmS);`q5oI!96ncAm=?MEuiZ~~^HqXA3rtm0B zDqY+Cfj_VUUxM-V~qDv o*FNgrNBuvcCx1a_SU#2vrEuU+JF*>rWaH@f3}&}ummP52UpD@z4FCWD diff --git a/gestaoRaul/comandas/__pycache__/models.cpython-312.pyc b/gestaoRaul/comandas/__pycache__/models.cpython-312.pyc index 3c572ee514e6a6be879b6ce1759fa9af18d2fd37..793c12ed56734817ee32a06d5016d583b54c2fb0 100644 GIT binary patch delta 3561 zcmcImU2Gf25#Hs`@%Vd3@mCT_(fSQ5MTrt7mK@t?V#7%rTXA9sa8;xN#XCEs`6KTg z9V?~F0P%wzIJJc}Vj~YhUV>Jzkv!-n4+)U>Jj6_E@NjM5w#bXo7q)iVqCaSN_DDyP zBRfu!1^M0V?A*@m+|2B>ras;s_|)(BAU5{?tMT$bqRW9e7MI6%O_aTJUW^o^2qjD~7{# z0zcAkGhO>hRjK85Q|=JEs^!IMMXjtJ!IQSWAhXhRRBEM?>0Bt~Dn~Om0zA?~Kd?uI z9w0;XQ~Lmpum0ISgt3Q8&J_02N#_fh0eD%^^qgMPOuMENGQ>D5h>XB%g8+UGbjA6l zhcjWGUk*lAuL#3?2?UlYX^cr{dIC5|pXvFb zY{fNOAt8W6^imHIIP(ydLwmf3fNQyWH5cl|0{^-L^tJFrFwNH1JNx7CFB;s>go}YA zcx0IN>Vifl+0?Wj)0MoysP1qx0%GgtQ_TE}NbmAdv2&c;3`P{4YiAZ+M_2G=h8cJ#1ft~a`h%;2#aD?$Z* zX`ZOZY6YSyrbEjeR|)LD;@%Lg?f~W zjbwildG55w@J3qRMAMu2tvB_%7lkC#j`h&D;_=XXv-)Vx#(VYU+@}oZ%ZC;%Hu6L`?;L` z(A}Co&}2XPz%@C$X7S;s{O~pTk#-EF9=O$qIeLOFUG6uSNA+-KZpy@n{Y#Q5i8{L-$bIB-pjGsZdJ8Q+@$UaY^lO6>ghRRa9^ z^;lmf?olNuuM)q!OO@Drw<_`d*9dm4+<%QYf7cpupGI$9AvW5!d4)iz!7BtQu;5yO%$zYS5YTR#9b%WbTj<%B1&E)j|mr#cx-M)238Oii_ zODDQL@{`8;hRzhLL{Ukha%4j{W;*t%dXD^@Iqfa*9(3)ekP#lf8X7qxT3y>o#>?1d zZ@{&iN!_ET;;o{{J~bk|SLD5cgS|-}0^o&~cale8$~&qTfPx#q^!=!!t4CC_r=XS; zUa!d>j$4%o*Vv_Y7|g~0(DPpypUJJIWnb`*tT zh8+BhH|>nQ`*a(zhY=lX+u8FEa;)uS&$fX4a@z%zhyp!rH&7nNy9qC~XYqI6B4zFI z_uUvfNB@c#SgrAZO0gYff8S!@#|>hD^Wmr@H%>oo{djO UUcz|v{GN+@m-l{!fab>j53HN*UH||9 delta 1439 zcmah}OKcNI7~b)7z25cum4-mDVdiFVEiGk-A|Rnj)UxZm+IXjc#faiFCKkY$uAX*fA&B)T_F*Deow@ zdQPzul$w-3(rn8bx3EF%@C)gx;EkSsE0a|va-aAVs zLQ`oG8jrXg$Klas$8t|sLVz4(1e_;aw>o~S=C(erS+;#XBx%U9-@`@H-y@L`GL*m_ z;xqe>&Fq_fn@5_|vmhdO?RXSGW3$osDg`8Bo^SabkB2=UU>NsTpe$ZcLeM3!E73nS zN#eZT&Ghwtij~QjfnF0KhwzesN*Mal#z-NHu$k#9E6TItZJDGGMd9#>fT7@+VfLeX zh?IL;;yXg7*+p$k_r z*oF{B*p5&^co{)vGLF_Bgh_T;-@1Pq&7A^x!fLmjM%{9Km_iaO0q-Kbj_{-+yK#yz zAcl9A{bg=qUly~hZN%BUu@ICA{a7Y;$+$rb_Ic`P0jt7e9k=mehw{V6JNI;TqV7B`UkRKirExmPJbT?eAR(ZGLG{@2v`Jlm z5l|%D^pLDI*I5q*%`Rm3rXR~X5X%z#Hw!UIE-}c>C6~n4>ow|K%MFm2Y*~T*k$)xg ze3goQpOP|*6^^eys|c>Pz^2e}Pi|-@kIYlwf)B(g3u1WqS2(BK%9nr6jeem9ZC?@G zk;>*5R9uQo6-xm{whA)N2+k)EUPV9+aucW{TTyQ{E!Va{*8V8^m(i~uaD94`!d!zo zHdx3XN2nrTGXWbDbP+?_kP*C(oQC*@7~b7=g`BFI*xn4|_0lCe3yH zMR*gy``X4HAId1>} diff --git a/gestaoRaul/comandas/__pycache__/views.cpython-312.pyc b/gestaoRaul/comandas/__pycache__/views.cpython-312.pyc index 4ba729169134720ae14c5fbd052fcde0ea8656df..53182cc2b132f502c5b275befc38db193ea912bc 100644 GIT binary patch delta 3585 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 delta 3226 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 str: return f"{self.name}" - def subStock(self, qtd): - self.quantity -= qtd - self.save() - - def addStock(self, qtd): - self.quantity += qtd - self.save() - class ProductComponent(models.Model): From 4ccd77466e50729b36743c7aaa2d0431d69b90ee Mon Sep 17 00:00:00 2001 From: Welton Moura Date: Sat, 9 Aug 2025 16:01:59 -0300 Subject: [PATCH 6/6] troca de db para pr --- gestaoRaul/db.sqlite3 | Bin 425984 -> 425984 bytes gestaoRaul/gestaoRaul/settings.py | 34 +++++++++++++++--------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/gestaoRaul/db.sqlite3 b/gestaoRaul/db.sqlite3 index 5164701a25ff0306c683557a0d5a10da1cc32471..56d388711a012d86dcfb4b9c5607ec852756db23 100644 GIT binary patch delta 1147 zcma))U1%It6vywKd(YgtGdpv4jS;e&kJ&7#LYwXEY<4#rgmk-A$V=!)Vr?amq}gI9 zZQ5;*4#h= zFA648jxmwWu5Fjxwe7@b;RXk~NgI``zJ>dE+!u(v^!>_abNIY;23xJR= zwtsSu{~4;42tX*ooVvXa$f#n7hX@cQ2ulbd`YENm$=|%!WxMGe%=&pRKh2N3%X{cC z=KP@(8t_ZuQjdPgEFA%<&OLpAj$9;LKz)-zR+SIPCftD`P`!$msor0Va3oT=AM;Gy znO=rUCw!8Gp6)!>f65#br)AyO?d+iAF2cXxpY8Yl$aY?0B>}6>Cn# zj~44aOluhvbH1I2sxqea|6yWH(Pk@^NL#65*uzxttzI{Y&h}l-0E1BNW-ZH##uJHj zJf19?o+wZjHDx=>nwpX((bANRrmVDOCr=dXR3y$oS!9QtoTB>;hiwXCU;nV#WaATP=)t0eLa0SZ%BhuR1?Vd zdbu%PkNS{NGynT zabGNno2AA3MhHeKuvY|R62RFG>MTt|mA9OCON)EAq?s3-Nq{isj}v$GdkFYnnL=pJ zxPhjOY2$t4jL~CcjIhD*o=cFH$1pAD= z#fDfX+ZksjljWb}%knw-h}gj#@Bb}0D`VJkUFVGCFB!7j8 rhEh7`Tvs?Q|E?ci-GY6nRmYqcIaaV+T1`Jux;#LH@qW^ delta 658 zcmW;HPe>F|00!{)=KYy@GxO%HVu9AHWWtj;r1(m`~JtV>}*lmBrK59^xrQerA_n!NtVA3)MsWbxhewQK<(t zLAz-XyW^d{y|8p7>XT6)9Q{F|$O4f~6ujCHH?lQ~%+?^Y7FO6Kf&zBK1L%?c5wr?r z@FDDj*i0zr<=i>crPz_P*pih!C>3xz@<8OBj_*PNK<4KVb2*p;BKIF5khwHcT@(O# zUG0`?Eiq7{-4(*J`xlC77DfP~f1w}**b9t9D947R8p3N34#}-{+^;$pOYBXKu)KT* z-t1+J^J0L)s; zR>Hb(U9%!qqvf>#U*m81V}6tO@gT3}*jzW?nUBn2vloTUHsh@^W85>M#(>df_)(p) z+rWBSpVz1LF?~??>k3<83+xHI&H7j;+s}%$-`ZzwUYpb|Xs5M9$}_DhQ!O1QTTUDcdc$o;d~$h%>>K|J Db+*C~ diff --git a/gestaoRaul/gestaoRaul/settings.py b/gestaoRaul/gestaoRaul/settings.py index acdb7e7..4b28d17 100644 --- a/gestaoRaul/gestaoRaul/settings.py +++ b/gestaoRaul/gestaoRaul/settings.py @@ -106,24 +106,24 @@ WSGI_APPLICATION = 'gestaoRaul.wsgi.application' # Database # https://docs.djangoproject.com/en/5.1/ref/settings/#databases -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', - } -} - - # DATABASES = { -# 'default': { -# 'ENGINE': DB_ENGINE, -# 'NAME': DB_NAME, -# 'USER': DB_USER, -# 'PASSWORD': DB_PASSWORD, -# 'HOST': DB_HOST, -# 'PORT': DB_PORT, -# } -# } +# 'default': { +# 'ENGINE': 'django.db.backends.sqlite3', +# 'NAME': BASE_DIR / 'db.sqlite3', +# } +# } + + +DATABASES = { + 'default': { + 'ENGINE': DB_ENGINE, + 'NAME': DB_NAME, + 'USER': DB_USER, + 'PASSWORD': DB_PASSWORD, + 'HOST': DB_HOST, + 'PORT': DB_PORT, + } + } # Password validation