From fc22ac9ea656028e4ab78f1a4008e7084fb01e9a Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Tue, 23 Dec 2025 18:05:13 +0000 Subject: [PATCH] FINAL --- core/__pycache__/admin.cpython-311.pyc | Bin 212 -> 2025 bytes core/__pycache__/forms.cpython-311.pyc | Bin 0 -> 2742 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 6539 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 2596 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 11318 bytes core/admin.py | 23 +- core/forms.py | 36 +++ core/migrations/0001_initial.py | 25 ++ core/migrations/0002_customer.py | 23 ++ core/migrations/0003_supplier.py | 25 ++ core/migrations/0004_sale_saleitem.py | 33 +++ core/migrations/0005_sale_lote.py | 18 ++ ..._options_alter_product_options_and_more.py | 149 ++++++++++++ .../0007_rename_supplier_to_seller.py | 17 ++ ...s_remove_seller_contact_person_and_more.py | 31 +++ ...on_rate_sale_commission_amount_and_more.py | 29 +++ .../0010_saleitem_commission_rate.py | 18 ++ core/migrations/0011_saleitem_lote.py | 18 ++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 1358 bytes .../__pycache__/0002_customer.cpython-311.pyc | Bin 0 -> 1242 bytes .../__pycache__/0003_supplier.cpython-311.pyc | Bin 0 -> 1420 bytes .../0004_sale_saleitem.cpython-311.pyc | Bin 0 -> 2012 bytes .../0005_sale_lote.cpython-311.pyc | Bin 0 -> 809 bytes ...r_product_options_and_more.cpython-311.pyc | Bin 0 -> 5179 bytes ..._rename_supplier_to_seller.cpython-311.pyc | Bin 0 -> 739 bytes ...er_contact_person_and_more.cpython-311.pyc | Bin 0 -> 1395 bytes ...commission_amount_and_more.cpython-311.pyc | Bin 0 -> 1538 bytes ...0_saleitem_commission_rate.cpython-311.pyc | Bin 0 -> 952 bytes .../0011_saleitem_lote.cpython-311.pyc | Bin 0 -> 853 bytes core/models.py | 76 +++++- core/templates/base.html | 10 +- core/templates/core/article_detail.html | 2 +- .../core/customer_confirm_delete.html | 11 + core/templates/core/customer_form.html | 10 + core/templates/core/customer_list.html | 31 +++ core/templates/core/index.html | 179 +++----------- .../core/product_confirm_delete.html | 11 + core/templates/core/product_form.html | 10 + core/templates/core/product_list.html | 29 +++ core/templates/core/sale_confirm_delete.html | 11 + core/templates/core/sale_create.html | 118 +++++++++ core/templates/core/sale_form.html | 119 +++++++++ core/templates/core/sale_list.html | 49 ++++ .../templates/core/seller_confirm_delete.html | 11 + core/templates/core/seller_form.html | 11 + core/templates/core/seller_list.html | 43 ++++ core/urls.py | 38 ++- core/views.py | 228 +++++++++++++++++- static/css/custom.css | 118 ++++++++- staticfiles/css/custom.css | 125 ++++++++-- 50 files changed, 1514 insertions(+), 171 deletions(-) create mode 100644 core/__pycache__/forms.cpython-311.pyc create mode 100644 core/forms.py create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/0002_customer.py create mode 100644 core/migrations/0003_supplier.py create mode 100644 core/migrations/0004_sale_saleitem.py create mode 100644 core/migrations/0005_sale_lote.py create mode 100644 core/migrations/0006_alter_customer_options_alter_product_options_and_more.py create mode 100644 core/migrations/0007_rename_supplier_to_seller.py create mode 100644 core/migrations/0008_alter_seller_options_remove_seller_contact_person_and_more.py create mode 100644 core/migrations/0009_product_commission_rate_sale_commission_amount_and_more.py create mode 100644 core/migrations/0010_saleitem_commission_rate.py create mode 100644 core/migrations/0011_saleitem_lote.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0002_customer.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0003_supplier.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0004_sale_saleitem.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0005_sale_lote.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0006_alter_customer_options_alter_product_options_and_more.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0007_rename_supplier_to_seller.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0008_alter_seller_options_remove_seller_contact_person_and_more.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0009_product_commission_rate_sale_commission_amount_and_more.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0010_saleitem_commission_rate.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0011_saleitem_lote.cpython-311.pyc create mode 100644 core/templates/core/customer_confirm_delete.html create mode 100644 core/templates/core/customer_form.html create mode 100644 core/templates/core/customer_list.html create mode 100644 core/templates/core/product_confirm_delete.html create mode 100644 core/templates/core/product_form.html create mode 100644 core/templates/core/product_list.html create mode 100644 core/templates/core/sale_confirm_delete.html create mode 100644 core/templates/core/sale_create.html create mode 100644 core/templates/core/sale_form.html create mode 100644 core/templates/core/sale_list.html create mode 100644 core/templates/core/seller_confirm_delete.html create mode 100644 core/templates/core/seller_form.html create mode 100644 core/templates/core/seller_list.html diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index cd6f855b12f4883b1ba9de01c54245c53aacd714..5d4241f5bc39342e85aaab4d3a7a39a5f37088af 100644 GIT binary patch literal 2025 zcmb7EJ8#oa6u#H5xT%vC+Rz7&Ry-s!kW9cpK>}2vqEaCh7B7}-UloHN<=PQ+%fJuF z#==~L;D4~TQikXbs1g%fsxmQgjvXg$lA-mrKl}Qg^PTUUd+e{JQjx&%>*sUtheXJ4 zoaBerdpQ0=3HeN1;!>Xk)TETSk}LaCAe(Zam`b3UYM_}~P%sOWNQBY1dQQURJ@Ebx zS9VC`8F7_Q#8ts+B7eIlgAH8Su?M&B`GlCoAx32kqXvwHGc!&OF{)!2bzq!0Goz8_ zRRo_&@G0fuPv>QphvI5u;u^qFI&<79x4cQJQ-3gEl?v5%126o8)vl_d@RCPv!%2kx zv=Jv!z_`#hneW40*|dEobi}oU1x_v)@A+OGUxdkL!iY&-VoEMGWmke|vM_qYk1-m| zmCz2DPc22;H*K!m>osvI5ZL6V}d@oKc*Nb<2 zd-oeTMkW95)Zc*YdSj~*CXG7#$eczJ@%o2|zl(Qlht-{kvwE6zZD*HHf=>!6Jj62q z&Hgx?xz}9B!7I7dIkPV1RqUnB4ImOK3vADa>_y>taaYh30h@M2+=G+i&}zImOmomFOg0th z7PZ$c<-E(*Lf;D+SHO6qs_|*K^9u;rXdH_pROk){)np$NZV%US3C$4DDaKL_wzp%< zHdi}Fskw?HD?XZz*NeUbz1Z1I*&ZmKK*ha+3dwVY?&KfPL<~!oYbQ(?NtD>WWd{*- z=a_`B|5CZ4;H8`HT5_%6qOKndtqxTYeFJZ__qxNav{0G(^tnL5+ delta 168 zcmaFKe}yq+IWI340}y=Q^((_3NIwQ~V1NnA_$&luOlL@8NMX!j$YqRTWMoKT3TDt` zehE^b$#{!3F(o%M&rg%-7GFwMVqSW_UUGh3Nl|7}5i?N1OYfHWzDHlPe?u3vQIwo-fY%iyI7&hc=zYod2ipmeZTkK{8=s+ z35@l>@9lUxA^+k-I?SU#w%DbdIs z!i<-MnVdc;q{iNY^}pawhBK$MEYPxNXcd)K0kr03Xw56FB52Le&?+gd5@?lYXqDN* z7O5@1M>lI!nvX&eMDHm+nbQ7IgsjzwW#M)!io<{lX>D=ehks+s^SLY_-i>+CNIo+` zuJi&?;? zJt$*lp{0b&LSvYKQIdf6ZGVS1W5~gud6RJ#ikc=qhYiGefX$jc9ZalDv5fE;fV6z? zA@`%{@FEl9900b7s17g+Z+mG4m|H&k`tf1q@}Bii^dukpOk=kj7#G_h;rz}@QvscU*O|ZsVFYd zUnD&G7GRvqDpujuLv;a}YZuzpOYN029os-Y0glHf=CnY-)XMN_BcEC5;#xmPknoA- zPK3|-qXwR#^LQ&0Spr20H7Ph%DGV*x13MyDvnQpk2-wkt%X9M>^IE$0h z2&yyU(uoADlpb{dGh&tT_h*L8Lg$C=C^vPlfePkzCS)pgvj<3S$iBgS5H8|m6f#`e ztSv~3J@J~`p};0BEp_@uLh-3Q#6wZ2)`3OAGU z_LjH-7BKOm%YYr7Qraff!^x{nzB@eL)iHDmhg}x-PaT}^;(C81EZP(cF#~(8-+zN* tq*#opaJhi9EbL!D_`Zwl{gH4byS;L0|I34V#)psTD!Y^Z4n0@-{Q-M~7hwPZ literal 0 HcmV?d00001 diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index 9aa598b9d5171b2bb0d207f045e07f9fbbb95a64..17baa27e048f359f0219028d8845b805687f9403 100644 GIT binary patch literal 6539 zcmb_gO>7&-6<&(JBA37Vu~I7%<0y7y$5vdsY8^PPW6HLyIE-vDPRc0RtT`iz_L57_ zl8&t=01r9n;DZhUA|NdwpoJ5|1gb+0ItoZo=(q&70I`=IdMI?WA-jhhioQ3?A93{; zG#P0>&hEVVd-L8mZ|0j|&@VuG{*Q_5Q&AB9g)fcdu4guN$b2ObfjAT)=SVvoLWgi! zARS)_#7P~uIvN!oItAe|JXT6Oxs(f}+Zg$w3nCr8t=qSJj7e^*;LobrTEgIBVwT8+#%V5oQ7fuw1@M$MrCLE93Oi4stnDG1CCewC%_g} z2M#Wb8i9jLm%i2Xz^Q8Blo2>p9;?L;Egm*vhnC;0#!ecsljXN-;^4w1LmXW8tz2Js z=;B0GoG`?R^2J)u>x(yxp4au0ZGOs`A`qnft6N1nx|5Rl)szX9y;k>ZQ! ze=jc0uDrZTbTLsC6NZ=o{}cPMpnoa7a$%LMck5!ZDkcpv2}PlSg&89>u=K~3q1BWg zx=;;WFhUo~mwzD-!x^+0N7KX3f|>km4|7*MHlMIZEneay?n9+M6=6>A+e%)*HYlv*XucM?7 z{Q3pcGes3;n^!a3nNn;FkiCg;4&nC*Zy{Vj;69yzoaud^-h>T?vMzWlp@%o44#s^f z2%r894^Qj`_-R|vpXTiWYp9m5`)*Jm5u!5F-^kIu+-m z7JH58(DH|?*Vgao>5uiORE|)dK!y^DI7QnLk;Fw&5KV$$2jyVf^KJXZ(14*lBhYZkxVLBc9`QbR36=jacUvD}oXETXX?RC_fDi{`Y*xxEIXTjo8ISviRn$e zHI;a4>>{JkGN&WcH+3;3CEvSx)%3t=3e3kuW1y*Qj@C~n8Z3cC@G!#ZPAsAsNODev zQ=u7ckzf5252;L-f=hn{yBR?kLcl5fkM zRDz0VbB<=nb#zY}B#t&B#0w*^-YwTNI}u@{ZMZ%H5(G=%a;s*)8iMO12*!L6jJ3CG z51%X&Y$r>5=!6$YVW7759xV!N1y~qfg?9+BBD)4yQ66B$>H(Gyo#;xD=1ez4NI8wk zpj&W4kx>OqnD9#vivyAQSUvnf}%-(FVFI!)qRf8^jh0#DTK|2t4p= zGGg0mVr@+OoUR%p=X5t8#7Q(Mc|HWMd9C@r$4Toh^fV67Hu^h^^mk%E`okR&mPpvd zHrlUWfc%gQ8`EhcKTeBSkEhl>CeWhWqD2>8kIe_-`T8yse|Z@0tD4s#-hy@WXC1~| zNIHx_W4oO8n#!v4B}Qo4FaYpntoO^~diWar16xiTuZ&tRYo~uW^TSyyulugmnX_vr z=43P2GbgE8%*`X9X4riMerU{NZWQ4j0&*k!4Z<4;yE0z^OA*e)qiq6gVZJ~=-rMvq zrB=Laqd%O}Kbh47bJf6{5txJPo6sO0{05i3E2H0?(REo_d&i@t^}$xHDPav7r-85vTTf*CZK zUxE~9GTvg#%}+_qDfZK3y2Y82m6(^Fua}Zk#0-?2yo=df>=%a(P(f)d0X Vi)9%m*GfooUto{{q9Qh+5CB8F9>D+r diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 1f807fae1897c89361c99c5e868a26d00799b73f..19644f1b17958960d7e620e684c9ccdf450e71d3 100644 GIT binary patch literal 2596 zcmdUwO>7!R6vt=b@%@cs$FYILB|zOK-X3BXLt2nfA9C^&70Zf*H|o! z*p=4rwSV>_^fx!0Yu>(jf6a@~FGxnR&_RkI2?CNmvbW<=ypmS|2^62?Q~Z)&2}l7Y zC}6jH)cScymxB`QUgm=sguQd~($2_-2dm6ViH(o$NPlja2EL0FIhdu8A6{#R_K z*X(CqrYC?w4!U|m%pZSz$%%f&ZeBYElEbb{gfWSkOw^T$F(x^aiMuih?30tOo)pWL znwc%_%FHn)J(IcQ%FHunZYHzf%3Q{NdC}E#1qb9MSI;sI${ANrmQ@g%SwYT~xr)Q` zHCN9H%NCiL?Gslf&zR^;=DI6WU`%W#Q#{W+OiA-{sex8MeaFwu zwYxHYX2e=UZO~J&de~`e10$m0PRB7qTC;;4o!_=p+#FyQ#EoHJ=0?21jJvpl2Y9cI zpBmA=+LMQ^fyJeEEvs&lW`HBzH~BNtRGM_%u4{^%XjAA!n_`mvI57jrStDa8r23-R;KXFUn>p2RG} zo?H!aZNbvcPpI?k*R6Cl=U;l>hM|R3J^Q@TXLJct0?1s5~bD3&{YrJ+f#)mi` z5`0MVA;pI@ALjVL|0h)bmu3W-+96MGMA&@nVI5$#tNn)FGaveJLwv-ZQ*rpiusaxv z_!({u2R&7M+Ebrs{bmb`t)9x?2vl{bQmC3531vvGOmbh) zTv^XmXs$xGza`Mnp+TWxhZIO@o0K+bXrkgqcSMrkJl>-DO+87Ws=T@>f{oKQJ@#Gc|C7U=a_{H~?cxH`4$B diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 6867ddf286a519cf1754ac97038f9f1e4605fbf2..f08d56bb564efd10bf15131151411e22c372a64f 100644 GIT binary patch literal 11318 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 Vx3U0Kn@K5#k`pM|$fu6%{{dMKtQi0R delta 694 zcmZWnL2DC16n>lRPBux?PNPk0Yjte}laMC22yM}Tpom8iqz6mQPLqaY$Ii~$B9Y|a zMXVCpU*JV6J$Vtl`4f^5Xjl*g|3Dyk$;p{Cdk8*ezIpGP_vXDfGvA-~BFQhYSOkRp zD2>Y7L4ZHf@Fg%&h6VVTOfM^7f~i(RHGM}Hy7mTk!lv>VQpha?5*fuqj94aNDaF(I zL5;kk7AY$JVPcJnDRRK@zPlNGhfK8|;9>VLxHQY<)Y1XuCGA5a;^`&Acgxh~o>rwtgfUIH zdqImHv016m^eKknBZm&LIhz+Yi%CdG*HDpKoE&po zo@huJZRE}i)nun(1hQ3@f;gnY;^Ei53il$WEUqp zINihP=EJ^`I(^nPw%W#4E8R-}TxmY~6^Wl@-eym-&3gj`S8lq?p}URw@EjU|faZh0 zmtiK}y47CEoR&J#d@q`BtNEcw1*r&I5(`@t;32cJXO$?E?{m>VzF@L;nKE8Y+cy$57_(Q_LCch^)^h6KHO+ej{(BU L?E(A`;{^Wz&HAVm diff --git a/core/admin.py b/core/admin.py index 8c38f3f..332ca51 100644 --- a/core/admin.py +++ b/core/admin.py @@ -1,3 +1,24 @@ from django.contrib import admin +from .models import Product, Customer, Seller, Sale, SaleItem -# Register your models here. + +@admin.register(Product) +class ProductAdmin(admin.ModelAdmin): + list_display = ("name", "price", "stock_quantity") + +@admin.register(Customer) +class CustomerAdmin(admin.ModelAdmin): + list_display = ("name", "email", "phone") + +@admin.register(Seller) +class SellerAdmin(admin.ModelAdmin): + list_display = ("name", "email", "phone", "commission") + +class SaleItemInline(admin.TabularInline): + model = SaleItem + extra = 1 + +@admin.register(Sale) +class SaleAdmin(admin.ModelAdmin): + list_display = ("id", "customer", "sale_date", "total_amount") + inlines = [SaleItemInline] diff --git a/core/forms.py b/core/forms.py new file mode 100644 index 0000000..97e224b --- /dev/null +++ b/core/forms.py @@ -0,0 +1,36 @@ +from django import forms +from .models import Product, Customer, Seller, Sale, SaleItem + +class SellerForm(forms.ModelForm): + class Meta: + model = Seller + fields = '__all__' + +class SaleForm(forms.ModelForm): + class Meta: + model = Sale + fields = ['customer', 'seller'] + labels = { + 'customer': 'Cliente', + 'seller': 'Vendedor', + } + +class SaleItemForm(forms.ModelForm): + class Meta: + model = SaleItem + fields = ['product', 'quantity', 'lote'] + labels = { + 'product': 'Produto', + 'quantity': 'Quantidade', + 'lote': 'Lote', + } + +class ProductForm(forms.ModelForm): + class Meta: + model = Product + fields = '__all__' + +class CustomerForm(forms.ModelForm): + class Meta: + model = Customer + fields = '__all__' diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py new file mode 100644 index 0000000..abd8a3b --- /dev/null +++ b/core/migrations/0001_initial.py @@ -0,0 +1,25 @@ +# Generated by Django 5.2.7 on 2025-12-23 14:42 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Product', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200)), + ('description', models.TextField()), + ('price', models.DecimalField(decimal_places=2, max_digits=10)), + ('stock_quantity', models.PositiveIntegerField(default=0)), + ('image_url', models.URLField(blank=True, max_length=1024, null=True)), + ], + ), + ] diff --git a/core/migrations/0002_customer.py b/core/migrations/0002_customer.py new file mode 100644 index 0000000..dfb7f63 --- /dev/null +++ b/core/migrations/0002_customer.py @@ -0,0 +1,23 @@ +# Generated by Django 5.2.7 on 2025-12-23 14:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Customer', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200)), + ('email', models.EmailField(max_length=254, unique=True)), + ('phone', models.CharField(blank=True, max_length=20, null=True)), + ('address', models.TextField(blank=True, null=True)), + ], + ), + ] diff --git a/core/migrations/0003_supplier.py b/core/migrations/0003_supplier.py new file mode 100644 index 0000000..eaf77f7 --- /dev/null +++ b/core/migrations/0003_supplier.py @@ -0,0 +1,25 @@ +# Generated by Django 5.2.7 on 2025-12-23 14:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0002_customer'), + ] + + operations = [ + migrations.CreateModel( + name='Supplier', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200)), + ('contact_person', models.CharField(blank=True, max_length=200, null=True)), + ('email', models.EmailField(max_length=254, unique=True)), + ('phone', models.CharField(blank=True, max_length=20, null=True)), + ('address', models.TextField(blank=True, null=True)), + ('website', models.URLField(blank=True, max_length=1024, null=True)), + ], + ), + ] diff --git a/core/migrations/0004_sale_saleitem.py b/core/migrations/0004_sale_saleitem.py new file mode 100644 index 0000000..87ca521 --- /dev/null +++ b/core/migrations/0004_sale_saleitem.py @@ -0,0 +1,33 @@ +# Generated by Django 5.2.7 on 2025-12-23 14:58 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0003_supplier'), + ] + + operations = [ + migrations.CreateModel( + name='Sale', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sale_date', models.DateTimeField(auto_now_add=True)), + ('total_amount', models.DecimalField(decimal_places=2, default=0.0, max_digits=10)), + ('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.customer')), + ], + ), + migrations.CreateModel( + name='SaleItem', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('quantity', models.PositiveIntegerField(default=1)), + ('price', models.DecimalField(decimal_places=2, max_digits=10)), + ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.product')), + ('sale', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='core.sale')), + ], + ), + ] diff --git a/core/migrations/0005_sale_lote.py b/core/migrations/0005_sale_lote.py new file mode 100644 index 0000000..085eea9 --- /dev/null +++ b/core/migrations/0005_sale_lote.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.7 on 2025-12-23 15:04 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0004_sale_saleitem'), + ] + + operations = [ + migrations.AddField( + model_name='sale', + name='lote', + field=models.CharField(blank=True, max_length=200, null=True), + ), + ] diff --git a/core/migrations/0006_alter_customer_options_alter_product_options_and_more.py b/core/migrations/0006_alter_customer_options_alter_product_options_and_more.py new file mode 100644 index 0000000..a8c8a19 --- /dev/null +++ b/core/migrations/0006_alter_customer_options_alter_product_options_and_more.py @@ -0,0 +1,149 @@ +# Generated by Django 5.2.7 on 2025-12-23 16:43 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0005_sale_lote'), + ] + + operations = [ + migrations.AlterModelOptions( + name='customer', + options={'verbose_name': 'Cliente', 'verbose_name_plural': 'Clientes'}, + ), + migrations.AlterModelOptions( + name='product', + options={'verbose_name': 'Produto', 'verbose_name_plural': 'Produtos'}, + ), + migrations.AlterModelOptions( + name='sale', + options={'verbose_name': 'Venda', 'verbose_name_plural': 'Vendas'}, + ), + migrations.AlterModelOptions( + name='saleitem', + options={'verbose_name': 'Item da Venda', 'verbose_name_plural': 'Itens da Venda'}, + ), + migrations.AlterModelOptions( + name='supplier', + options={'verbose_name': 'Fornecedor', 'verbose_name_plural': 'Fornecedores'}, + ), + migrations.AlterField( + model_name='customer', + name='address', + field=models.TextField(blank=True, null=True, verbose_name='Endereço'), + ), + migrations.AlterField( + model_name='customer', + name='email', + field=models.EmailField(max_length=254, unique=True, verbose_name='Email'), + ), + migrations.AlterField( + model_name='customer', + name='name', + field=models.CharField(max_length=200, verbose_name='Nome'), + ), + migrations.AlterField( + model_name='customer', + name='phone', + field=models.CharField(blank=True, max_length=20, null=True, verbose_name='Telefone'), + ), + migrations.AlterField( + model_name='product', + name='description', + field=models.TextField(verbose_name='Descrição'), + ), + migrations.AlterField( + model_name='product', + name='image_url', + field=models.URLField(blank=True, max_length=1024, null=True, verbose_name='URL da Imagem'), + ), + migrations.AlterField( + model_name='product', + name='name', + field=models.CharField(max_length=200, verbose_name='Nome'), + ), + migrations.AlterField( + model_name='product', + name='price', + field=models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Preço'), + ), + migrations.AlterField( + model_name='product', + name='stock_quantity', + field=models.PositiveIntegerField(default=0, verbose_name='Quantidade em Estoque'), + ), + migrations.AlterField( + model_name='sale', + name='customer', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.customer', verbose_name='Cliente'), + ), + migrations.AlterField( + model_name='sale', + name='lote', + field=models.CharField(blank=True, max_length=200, null=True, verbose_name='Lote'), + ), + migrations.AlterField( + model_name='sale', + name='sale_date', + field=models.DateTimeField(auto_now_add=True, verbose_name='Data da Venda'), + ), + migrations.AlterField( + model_name='sale', + name='total_amount', + field=models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='Valor Total'), + ), + migrations.AlterField( + model_name='saleitem', + name='price', + field=models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Preço'), + ), + migrations.AlterField( + model_name='saleitem', + name='product', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.product', verbose_name='Produto'), + ), + migrations.AlterField( + model_name='saleitem', + name='quantity', + field=models.PositiveIntegerField(default=1, verbose_name='Quantidade'), + ), + migrations.AlterField( + model_name='saleitem', + name='sale', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='core.sale', verbose_name='Venda'), + ), + migrations.AlterField( + model_name='supplier', + name='address', + field=models.TextField(blank=True, null=True, verbose_name='Endereço'), + ), + migrations.AlterField( + model_name='supplier', + name='contact_person', + field=models.CharField(blank=True, max_length=200, null=True, verbose_name='Pessoa de Contato'), + ), + migrations.AlterField( + model_name='supplier', + name='email', + field=models.EmailField(max_length=254, unique=True, verbose_name='Email'), + ), + migrations.AlterField( + model_name='supplier', + name='name', + field=models.CharField(max_length=200, verbose_name='Nome'), + ), + migrations.AlterField( + model_name='supplier', + name='phone', + field=models.CharField(blank=True, max_length=20, null=True, verbose_name='Telefone'), + ), + migrations.AlterField( + model_name='supplier', + name='website', + field=models.URLField(blank=True, max_length=1024, null=True, verbose_name='Website'), + ), + ] diff --git a/core/migrations/0007_rename_supplier_to_seller.py b/core/migrations/0007_rename_supplier_to_seller.py new file mode 100644 index 0000000..2352f45 --- /dev/null +++ b/core/migrations/0007_rename_supplier_to_seller.py @@ -0,0 +1,17 @@ +# Generated by Django 5.2.7 on 2025-12-23 17:08 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0006_alter_customer_options_alter_product_options_and_more'), + ] + + operations = [ + migrations.RenameModel( + old_name='Supplier', + new_name='Seller', + ), + ] \ No newline at end of file diff --git a/core/migrations/0008_alter_seller_options_remove_seller_contact_person_and_more.py b/core/migrations/0008_alter_seller_options_remove_seller_contact_person_and_more.py new file mode 100644 index 0000000..56f5b36 --- /dev/null +++ b/core/migrations/0008_alter_seller_options_remove_seller_contact_person_and_more.py @@ -0,0 +1,31 @@ +# Generated by Django 5.2.7 on 2025-12-23 16:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0007_rename_supplier_to_seller'), + ] + + operations = [ + migrations.AlterModelOptions( + name='seller', + options={'verbose_name': 'Vendedor', 'verbose_name_plural': 'Vendedores'}, + ), + migrations.RemoveField( + model_name='seller', + name='contact_person', + ), + migrations.AddField( + model_name='seller', + name='commission', + field=models.DecimalField(decimal_places=2, default=0.0, max_digits=5, verbose_name='Comissão'), + ), + migrations.AddField( + model_name='seller', + name='description', + field=models.TextField(blank=True, null=True, verbose_name='Descrição'), + ), + ] diff --git a/core/migrations/0009_product_commission_rate_sale_commission_amount_and_more.py b/core/migrations/0009_product_commission_rate_sale_commission_amount_and_more.py new file mode 100644 index 0000000..8dfd72b --- /dev/null +++ b/core/migrations/0009_product_commission_rate_sale_commission_amount_and_more.py @@ -0,0 +1,29 @@ +# Generated by Django 5.2.7 on 2025-12-23 16:55 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0008_alter_seller_options_remove_seller_contact_person_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='product', + name='commission_rate', + field=models.DecimalField(decimal_places=2, default=5.0, max_digits=5, verbose_name='Taxa de Comissão'), + ), + migrations.AddField( + model_name='sale', + name='commission_amount', + field=models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='Valor da Comissão'), + ), + migrations.AddField( + model_name='sale', + name='seller', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='core.seller', verbose_name='Vendedor'), + ), + ] diff --git a/core/migrations/0010_saleitem_commission_rate.py b/core/migrations/0010_saleitem_commission_rate.py new file mode 100644 index 0000000..27e8fc7 --- /dev/null +++ b/core/migrations/0010_saleitem_commission_rate.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.7 on 2025-12-23 17:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0009_product_commission_rate_sale_commission_amount_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='saleitem', + name='commission_rate', + field=models.DecimalField(decimal_places=2, default=0.0, max_digits=5, verbose_name='Taxa de Comissão'), + ), + ] diff --git a/core/migrations/0011_saleitem_lote.py b/core/migrations/0011_saleitem_lote.py new file mode 100644 index 0000000..41dba70 --- /dev/null +++ b/core/migrations/0011_saleitem_lote.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.7 on 2025-12-23 17:48 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0010_saleitem_commission_rate'), + ] + + operations = [ + migrations.AddField( + model_name='saleitem', + name='lote', + field=models.CharField(blank=True, max_length=200, null=True, verbose_name='Lote'), + ), + ] diff --git a/core/migrations/__pycache__/0001_initial.cpython-311.pyc b/core/migrations/__pycache__/0001_initial.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e559e34c97d546bc4ab1c68a9adbf2dc2e7c5b1f GIT binary patch literal 1358 zcmZuwJ#5=X6h2ZC^{+^d5>-N=I#3XlZeyt~P{3{AqK%P2Mxwfnok0sh^G-5tid2rI zYj^U{p<}js=#WW8YYiDQX7oq_9E6(;bn>RanKJbqDJcltBk%G3eDB`9AO4lirVy-e z|Jl%s5rqEb!feH+%;kMx{y-RE!9YEsE%d~;C?F9%LRkC_;Rq4-z&Bh2;7;dKJA$K6 zksQ0=Mp1K6jb5h$FI z4(#cf3TJS3m>Y+G^LCbmZPK5re1!C4x);7MQbYC&Uj zm}qdmq4W(^BX;PE^{(#NEN45Gwy!*QRnyU(Bg*~Y_&6pV)ioTJ1jjB>Tx#eDS|&$W zY{yW|eVPX#T*);IS)_b4nAFjUf$f%jjU|-e%8J5LiUOnL8U*-^!s8e`4UpoxsXLG; z%V5$cCMKq)6Pxn!Wa$S%WuEXMq%c4qNM)eH>o!ojW3mH9?ShB%Evz-oUzY=9M7Ng+`{prNmM9G$B!ool>GGfl%J@M z3zhT24X?EH;=nI0y^fyU@!E=KQmO159Jy}UCnl)SQha?>x%ubz74)lqrXFRyy} zZ^nhHx7c_o`HPLw;)=hx;^n^@7e4VS_fGEmm3yy$I$QB7tx=`rS6W{F$8q7dS6h4e zwO?C%^W3X7N42J3YkK*OapBg9b<+9MdbR#$%iG-Ys@tRLwqM=$^3NvOcriDLrIM+) z2*^85CXvj7biBbI`uQy77L0Wg@2O_jTE;s;AA{C~MOoso0Q&`S?-TdKsaT`SAoBm* oegi(Awl-gXII~ebX|}p=qh=U^7D7za>Kj-u?BJf19BX1*8l(j literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0002_customer.cpython-311.pyc b/core/migrations/__pycache__/0002_customer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f25342858152242fadd8f54c697ea3c2f49c4861 GIT binary patch literal 1242 zcmZuwy>HV%6hAwT8#`%9N=itGK%femP&Eay6jcZalu|)e1Y*cyxw#{C>)7ephL))V z17kP(7Zf2fbYx`gh9h~XPC`Or>SokV6+*mok|GLsx#xH9{ocFxmG^^#DuOlCo-@9R z2z}?5{)+dQgK1#iA&jtKqNY$2nqo~9kcb{2EWSZFMug>9-)I}SkH@!K3`D5BB&-{R1>k#5Na_I5ox&}6g-W&L|z`~ z*&r;zj$^q!uq{ClaJuV-h!YVq(U)MQt!@i|fpd&WMi`|p!6_`Y2e+XpAK@IMhE8~r z@F~Eh|4tiT%tW}TxZIY<)*e3Ttr2gZ{#yolCUF)@Ho}z0{aQicq`FNBOHEErUegTA za1GsLiK^$gc9T#h8u-}^6Cd6yNi3y%uC3K6(OrUBvPF%iPS>>+vd$ETP%t!JgQu5- zF4_*!EWJsX#OeMn#90!cNBWv(606}Zu{de!hPnTXYeYH>A0~U2vFZ^PZ!Ost+0SxS zjKvpC-CF4)B+D~RHlSlniQ|CXS-{YI*GD??@xmY`cIHbdme8UQG>xg61{2|#1o)Ju zt$Mo2!{RqgTExP{svE?ie7IP$8YTFcj}YaZW~sYI;|`=g!(B6_x}?)CtKR21^u*7| zn%fiGEz%ps59k0qprhNBB`9abTl6f~tB^HP2Y3d;P&JKlfMNxksAcvfUvE;D4F~>K(($8=nW=+A%y4A2J@M6@Js1e;7T;{L{I|kfQ xV!GSfTeJ*U{;zYM0|{e-AV6J&l8?sz{e^NykVEt@*;Iq{=nt+q{Es$z_czl>NE!eD literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0003_supplier.cpython-311.pyc b/core/migrations/__pycache__/0003_supplier.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b9a2d539acfc0ae26e44705da994e38e0d878bd GIT binary patch literal 1420 zcmZuxJ#5=X6h2ZEtzTPm_T`p^iD5S;fx&BTVw`OXd`p6A0!B3v3r(RG5)qMh zr-y>AF<+5)XQl*Lf)U1YcjicfL%%?G$~5g?e~p?l>5TP8ror~H6gxQwki)4lp` zEaWYLvrvL-e)Qfn_fQC_VNv2ImzS46RU5ADSS>>RNY!n(4IMO5$J^_^c;~hv`3cQ+ zEVV(2<`C@1+f;99^g!Js2Y%EhRM!msN8%@*5n8uwqMBNZ_!5_=eK@ZoK+&~*)gWfm z+3{x^mg#5>M{N^oTc#57!*xS5_vk!eApeI!I zsjC_M(A>hLO-xM8hE8nCd)bdyg6rSo9ZPv*`H8Rf=2wuIbx!R^D?1t;tFdqR=_kwE zWZxO9k;jiVCjblXKK=&&L}$Q--hNr$fdZ7>x@$Uane3AWFw^pLi|*NNtwGAXTIK(~ zoifyIMYSi@y4gOUGSCEqD|Q6>`tW>=WE8zV3W*u{aB~zx(GPx(d6D;r>Gxix7g)CR z;+dB%9ZUU1R#TZtS=Jt8Z7*xHlrv0cSx)I(^>RwD%5rOi+?tnLW2w)F=?__P<@e9L z;>z)2e}z5%o)v3@V$CboSn7vi`WnkGbw2X)OFjE!mE|`E`3*0>!BTeuSBbkyz0Aq= zJ~+1q`7JNM#ZnK4={zgk=&XB%8@<(I%nFr3q2d)PEOi@Pod=!u-yZZ9PgeWjstyWO zuTW*F?a^E$Gdl{$qp{Zr#2YR~q2#=Lc$W`anx^JHG;|ZG&#T)VJ=qJZn4)@kE5O%Na&N>IA9N{2tn zkxF8tDKd1(n5`Z=xhNtO9Xfc(kTK&4xIwt7Kqqesk||T)QKr+x8QL6q@A&TCz4yNN z-W`8Ur;`%2v%g=mnsG_`TQE@rK5Wm|VE9==5|VAHF2ktUiW95H9JQ{>k|KRBq1aCn zQgLi2+9MsrBrl#lU6U#Blu5lCZa^1(oGHq)Q^VDrj8lI00*K{x}fEEM6j*5J&!1eAJCPF+F zc!6mfrsH+o;7BC96{X}zluaeZ#}ICU5!-0nW)u5-1mSJ7V+U|R%)17%T2|omM6=@u zo`cC=THvTgECACz*MP%=0{{|u0%_=!wryb>!A=2jGr$f{-0GNaUVv6kuwr zlH~~_KGX)HTb&LpHTGjNy<=Za|2vmir|nO+!1T+w!=A8axq(2`(Hyvbu70b!Bax zPkiI~R$$%6n{I$xm>etc+W7ct`b~Nc)}@#0weKPPwN3-_*s0;WxCy?H+8vMF^xKfP znutg3)s}4d_qSPj{)tM<>%HZQ$%=>{76z<`kuBI1%raTNjzJOZY?1Ez8^Q0t^mXni|luFB|BXlh5&-Bg4X1-;bI zgCx#`9wm&2S+~xVZ*xwjFVWZs4lZHfDvb1qt17_hpl%9FGkKy98uJ`rlxd6}=;vEF zXq@MGlfevZ$`t04x*Kebc9WC~yVYvl@iIT;6$Ckt1eH|KFvhE=gEXq_4xv)SECSCQg>3)ypoQYD07f24T`w=X`WzCiR6 TF2bHQzI5YQI!^xMt?K>-mAKAH literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0006_alter_customer_options_alter_product_options_and_more.cpython-311.pyc b/core/migrations/__pycache__/0006_alter_customer_options_alter_product_options_and_more.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ebb783cd8008ecf3b2d91925d1dd6e789ba7136 GIT binary patch literal 5179 zcmd5=O>h%O79NfM$C4vAA|(99KiEOLK>|XuKgl{vY~w({aj;`=T(Ku(bz6)*ni2C8 zKu{G9d&rSPs`j#{O%<@UI&j%4j;^9=i{q$j4ywN9 z&wJl{{odC<<2&iJB*69G|D98hzAgwqvPN)4Tb0L?Q2B>|1su|Zr4amznph4mh0Bqp zNJtQcX#t1-F5n0WuLnB9?XV#H2Oj@gisI0mkc)1y=1fkcQdupTime*DMPp?H6U{2N zWckl%tMT|>ab}xvyGtStl|oBlQ6Q0yB`o4Fj^OA&#aisP2v*_ouczeVIDwP9kdts9 zPVGW2jr;LyyO7J^0gRq27Yn?FaqIz)Y-lnLFly(L#P$5b?i%wNWhihp*9S4;ytMVrQFS;aPJqE)eI zgjuH11)^hx#`up#6RcCUNx7On3*{hI2Kk$6KQwi#-3CFYQUNbbDxEP*ofHW+Oq%M{ ziACcI#wM|>d57(`Q#vLld2q+bg=utEQ}hk+*3mSREi=$3@pBFzoypc*8eLO~hG~?P z6;<2%nRiXGIu};1${Nv2_9Yr~boH`BI1bm`ddOrWGZ4$1XbwYzzoXI0B||4$S@t$D zPc*Uy&0NGhz$CcX!M1E4CRWi@c^n;<_(|S=aOc4fMlR&zCDpQ0BC=y@ssOunHT}iK z^DIJVS$7%CnQD=2vGdjzn^X=vh0F#a=*Of8`Woa;DMGNMGK>hTCDpck^nM^iaYMfB zD7vlM*Gz^}-TOIjVg-{yNY50=z|bM_aZJ_}N3*$ZHO&Z?5BLP}N*cNhr$_>v5^cjb z5aFzgoM+riavEaACe`$$Vk_-LGvX;g99cK6$Sj{MTQp@GHn^^o4M(?2(8I54--4nU z=HNVg331IsuX%zM1y(T4YKnUn&@vH>Zi}5&sMHx9jWQNm)g+f^-T~lACX_OX27Y3n zDenfzw7+QRwoal=MOhZfyjmtco@78&{11wM3y;A!;iq!p5=@YSvkED63gjv& zLYmFO6~o-HDnQ8si+rK;AyRU~*Zqm~0^$*qN^)!j;Kr&q@iQD9=_n#st|3wCm{ zet|Eco9(}5Oh}G2!(uje^L$ehlB3^AUgAh&;6P(Ezgcy&7vXM3!%69p0L2qlG!q@M z{ks#}*BE_g^KWi;2JS9sVDyxGVcE^Dz};Q$#KXLs{SxkHh#h8QIMmoT)EL;`K*P7j zJT!badv9{{x{K!OXwE}(&3J?j35qAIU?bnA^+p4YFs+fh*8NitODT?Z@${@owmJmoHY?INX)6b~s~6bBmvhXciXX%~&x(YS}kyK5Y5 zprKo1-xuyi?q@eA-NiK*mFlSEp;C9fo`(hA!LUYI07vhAzIoD}|H?(nb+qiET6Hg1U39&Uu6yWucgqmtATgWTE+-KL^;u?Dh`a7I;Y=c)7vX2m1@RFtpYXD~ z8!tDTfmQ7}#0e!whr#> literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0007_rename_supplier_to_seller.cpython-311.pyc b/core/migrations/__pycache__/0007_rename_supplier_to_seller.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c47a57c0f16445ffd0194fe44cc25b7eb7c91d51 GIT binary patch literal 739 zcmZuvJ8#rL5T5lbK8HvsByF**!Z!f?0d~&CcVS8TsqVN&qO2e(aLnS z)IdsAKrxv$8Ap7J(hp6X>2Pf^Uh;zRB1w5A^_tZ3JFcC(g7HiRqU7CvzQJ5CRrIN_0=F}m4ngwsBu(iEjt*FCKTtxW%$8(;|#UA(*khpMMq?NkzwWr*Sk`t%CH{J~iWX68;p5NEJ-+O*FGvg9i z7vJ9s|F8)84~6NfPMDpmz`P`kFhh{Y=o*pPH4S2tn}nIq2(!4c2EOIm0`B#m)U{aU zSJJL-qq1%0ZWQ*EpN29{ayycYizJvh>Z3Ukb_!r#5>C1XBVCgjJ)>)xgjd$4mx9y` zg0t$M=D^-EAt}7&(suS#0=wFveuzbFpM?WH^)+Yji_03U$z}$#TNQ{5Z@C6X4wk1g z?T>R*$I+0Y2W!Fh26G3!zKqhVbQ^3QVEQI^Zcp(6uquI6JYQH^TDn3NkNt?#BIW(9bCt+gHx8SnW2jlEEO!GLMPZUaE4LB(9@dL%8#|OCls`x`c=wlVSMpiLgD~<1 zr1S%x!BK!@?!d{pr3cKI7R11zWN%djK1mCilBk(R700lRY2{~{Vl3bX!XglxA@}h$Xk4K_pLSj`R?$+`p^>}JTdY_QLA8J zAiGE~|31%!v3D9hPyaptX8G;!LvQ7Sw=(ipzVtdd=h>ULaI16EO7Fn9Ic&|3d-4)n z)m_!SDzP|=X4>{VaG&Z|%h9-|E`Vsjo7@LdScYK$K1O>;&VT(B_Hn~5$k*hBJ34yi MBPw)nss+~%zl`J zQw|(B_QoH86hO_Pe?ld=aC0RethsUu7aS$0o_MqCb<(t|)Y;uP^WMz7_nY5)v%giV zCc(!4zTy6-5%P~z@>ZA+j<4b17Xkznk8~C6RZsP`uIB4qT_Gy@jDYqN0i9`sd=J@2 zZ};)bTDJho7HJj^rMlTvh3UKf(2iXmM8fbnFfVfEYtybeSB_s%WNenk?W&;km9C}| zrk_Rv6{N)&6mtilLjepZ9+dWVM1fz{4$4oWI_JlPrKkKM zkTNZ810$aqEGFo=4u-x>Z;~Mqd);FLNf5R^8zt6CbUut-VKW zFJ>W)nCD@~hbh-IWIi9U-0JWkww;&`Ss3wv+5u2sIw%f94v7DPIdxwJC zcjHJ@Ml9^{h|$3ISyRI~SqrHqbZHZXJ1+A;=#lL)Q9pyn_IVP-b1;M)N_rCu#kTG7 zumScd8ewEKbbeft1hq0vl(ty_40zZqh(gb^gS!|r@jOw+<01?eGoi*jtfAA*=CUZ! z6d0w#q(~Gb9>Z~k((e=7lVGI=Y$&}3j?1D@UI0=01mLU0|s``=R$>^D5dd{cTw6}@6gTL8ymvpn5gX1{6UV<7kSLv-*KO{lO9r$wAl`G z5(M1-frodaA=2KK=WU-}wlW|H!2Kbw=%tJ6!3Y5mQqb@kp`6YJ`On-8_|S2xGsMq?{}WW^IJ zo)z`7c|=g0NO5-O>(lz`lRIyX?PP3?9$BM_HG2Ne%Tw!$jCtkv)d!u2+kbsMS-(A5 z|7Nn@AA7qqLOxfwRO~Kx)T30Mr1HGaOEt^byCI+Oo&4}kLtM_1)q-9t`+v3ajD@SX zOq3V%X%(co&)929FR80{arC(KK~_p1hAmX_cSoWgikYS;3Nos^F(!@doszf5&w6LZ X%Zf20Pm6ozq_%n_Cr+L*n_~DMLWQIP literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0010_saleitem_commission_rate.cpython-311.pyc b/core/migrations/__pycache__/0010_saleitem_commission_rate.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62f5f20011b4e59094838c40c180ec3a671f6e91 GIT binary patch literal 952 zcmZuwKX21O6u+|_$2KX@2#KLZ6hskO>M$ZzNC*T{1yw5$Lxgm7{jR~m_67fevSnak z?A8x}RD|fjM?m5W1eBq=l_{I6cIw1Cr!Ix^&VKj)-u>=(_NS>ShoH>-TnY+G$S>to zQad&d7SY%yK!AoMq8%D(9gPx=JR+dIC!llM)2pT(w7#5p9UY9Pq*WWMbW4*?6m%0W z3q+hsGZMhV)UP_#T!O**U=7ta;iN->bTpt{+R-(_ja~%`w+0n4dvz==1q`Tx3H4oT z$3PJHPGr~q8x*c(frGHlN&88K2f-P>NVr^Vx7&AEKM|1o8S_OH1!;v>BGqlFf*|9Oyzo!!SVJ`33e#AfBcDd~%-i(lfY03*YNPKTMaz)qf%`$^ zg{&WXK2K#G_=cB<8S>|CG6=dsmdeH(o~()Z=ft@42Pc?>-E1D+=83Z-=q;GtS0QDn--g9)rMBpuP`$9MUe z9AKUtt++2m#NB)yImunV$^ASNiThS0uhKrA#8nKtf4%{?-M-x}IaQRM=2els(0`Yh zxNNDEk-k7RI2naW>{VLm+9h-FxNwL)`@tDmGkce>?M+|bYtC=o95v^^u71;pE33n` zblA*(G_z4NE9!>r>=RUnN)@`tN-2V*ts%K}_9@H;H4Ac9Z8@WhH}+NH@ITpd-{04p1Kt1t literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0011_saleitem_lote.cpython-311.pyc b/core/migrations/__pycache__/0011_saleitem_lote.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..940f226b1bb0637887889879f9199cdfaf0a42ac GIT binary patch literal 853 zcmZuvJ8#rL5Z<+YKHIuTU`0xiM2LV8ZsH4dgoJoWQAh&<$r5LL-r?elABP_hx+^Fs z)8!uo5Gg1rDJc)>gihO1rE_$tQZeg`6QMBcot@d4-TCHQf0~;!2#Wf9Blt!M`6HZK z8fV6I9gTg$2%{m1s6!*kktmVKW5T2lgvmhra((Ckt*_^vBQxbGu^LArY)RaRf?n$7 zK@w+NjS>c7=GQ01T7kiJ`U=%P0pd_b9Es5$b!3Tv(yu{bX(o2meiKtGVG3*DR1cd6 z3WC5nlSA!aPIhfD zB!_25Kd}f`Hqo{e-spy2yn}6eyKV?^FW=@$T!bNSy@j-!WZ=eL1eS~$qWQ|h4BX?5 z*8zlV%hI{#R{O5Y4cEoIA_TNsuKT9&LXj&x1_Ov0#C`x-D){EwJ;ol1J5td(*Y9t8 zY2|Yx8NeCqU&vIDa{AETP9m_2ZV~5&4ZGkMd6L@il5{5fn8<;$4*zM&_Uzo{v%``khji=GEb5X%KzsqcPSNCkxjnR~IJc%HFN9x$=4b`;8wD zMlW8D%+4>fGd4SAQ_+oMg6c%5QdUiMxFJTmR2SPqrghf$;$E`Kx>fg8&oelSBCX0@ zM(b2tpHX->y@oFS<0N~Is+1|E2$5PNa{KaEsx7LP - + - Flatlogic + EletroNorteAr @@ -28,7 +28,7 @@