From 0ae32328a719783d4ac1305e779d5fbac46583f6 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Mon, 2 Feb 2026 16:45:35 +0000 Subject: [PATCH] Autosave: 20260202-164535 --- core/__pycache__/models.cpython-311.pyc | Bin 25783 -> 26934 bytes core/__pycache__/urls.cpython-311.pyc | Bin 7499 -> 8112 bytes core/__pycache__/views.cpython-311.pyc | Bin 74351 -> 77867 bytes core/migrations/0013_heldsale.py | 28 ++ .../__pycache__/0013_heldsale.cpython-311.pyc | Bin 0 -> 2003 bytes core/models.py | 13 +- core/templates/core/inventory.html | 13 +- core/templates/core/invoice_detail.html | 6 +- core/templates/core/pos.html | 395 ++++++++++++++++-- core/templates/core/purchase_detail.html | 6 +- .../core/purchase_return_detail.html | 4 +- core/templates/core/quotation_detail.html | 4 +- core/templates/core/sale_return_detail.html | 4 +- core/urls.py | 9 +- core/views.py | 71 +++- 15 files changed, 495 insertions(+), 58 deletions(-) create mode 100644 core/migrations/0013_heldsale.py create mode 100644 core/migrations/__pycache__/0013_heldsale.cpython-311.pyc diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index f34b1987568300f1a434e181514df7866cbb4ed6..99981289f5ff94f253c6617eb69593955b355541 100644 GIT binary patch delta 688 zcmdmfl5yK5M!w~|yj%=G@bpqcX1mQqJ_$y>jq2>oTucn^3@O?z3@JL33mB!@Wm9y6 z88r1an=sD`o2+2T$!Iruf~)pqiy-OAe>M3gZ&H(+%;F|8xyD~*^3EV3QO*?3WsD3A ztAQ8-QW)28O-|5Ko~#?BFgYWd-yJBxjjAL{D21nmAxb!f7ibgTEe?;=oRr|ioYat8 zTp2)Sd@+z+Tx1M1uZq(-v8Y7BC9x!NGMkS97aLHF8HhjoOm^^5PF=tRWMhC7W>o8D zGt6ZHTEya4#SOAa0c4eea?v!P#wtG5NL|%jUDXr?RSzpwUrpwsnLy#9L?CgCqqw9f ztt4}DK&*tX0L+bg@$o?6_;_)khl{m=${HAM@Q2O_nG=42KNN^oh^&#nuIYG5)A52+ z&_&JQE1JO&i3=Q|MG`>uewrea<29rvM;h}<-{SNN_V;tk1iGq76l5i5GSIv6DIo8L z``S(pkK^OJ1Gb|9Xb%WZzThi5xypoBQb1t>+Z6$Y1%g0my-;q6+(iL{D*^@$o|7l2 zs7|)@GoC!zR8=vI@dE=RD>f4BmLiVL`yvl8GpbFlkF{bHp1dn|E*C%0V?`iBYI9=T z1V(lc(@#@w@{joQ8elnbpo1W~C4sD895%W6DWy57c17|)l|aN${B!fGgelA>oQxog Wv6CHTJvAS}a$k^Dh)u3bu>=4Z;k0r9 delta 103 zcmdmXiE;Z$M!w~|yj%=GaQjR{rm)pSJ_$ySjq2>oY$@8o44OKdqnKxfZ5D~!z|1H; z`DmgQBhRFyxs&;0`8Kak>S1K(U}RwM)0CZTmvVlxP^u)C1dtCz48=z`o2E`-p8Pk% F5&#Q<9lHPk diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 09e0de8dca1f6e6893a69642bce0fe1a1648cb25..7d3121ccb9bea7843dcd9b2b6b0ab4fa52be649c 100644 GIT binary patch delta 1935 zcmaKsOH3O_7{{^mIjnh>@UnMp$Qwfd6CQ19n*a&s5gX!|XCT;sy$S|{5tuwkB9o*K z(&i94J^0d=URq1dfhreHRgRS^wX^C}inz4b9x825m7+@R?2H%p5OpoD{{Qd)`(|fn zcJ~L@URTN2#l;1A^ho@?75k%Vr^I5cDEQV9G^2pQRQgapvUo{LwIljyXREsOF)dx@ z1zLJfE4@!ky@#a_w9<#P=>r{qaTmt)jvg# z%)dCLxz(8S=2~K7wJ9nm=VI}7rzf_ObgeF3bRLwkAe;@t6n!yX@B~s?&q5*|ZCam; z%g%#hO@}qDA)BQvmb3A?^WfM`IT>D{1;(s1s78a<q+!w`9D=_+G?%!Yo`J2 zG^m}fpwB7-1wkqe^uPWZ{Z-L?Dr6`%z5-#Zcl+4(*wg9sZ47k^)Dfstk7(I%AfT6( z6-HACg(~fa5V~J!KdJ?40eVJ~vnN-#96<}~H;3nW!%UFDj$ChUuq}+j>-57cl=poRfmb1Kq<=A{SV(R+;8MUvz@iM}3=;}W5Ez(HPcY(SmN>mDle6#aFJtg4;3wc$ z*>bB6mT%kBCSq}9?ql#M;342q>sfmP`pF{ZpJTcaiPd6$6VuJeO|_Hh7IcH^^Gvs* z2UNE)eF1%5ZOwm|X&3sA*4<2d(63Z?GJWwAizsw4*=;~4EMlt1z+9gpJ8@fDCN=cl zeYu(Ub7VkAYIaTJcn9_jVHj3mn82_)$dM~L!uIGA9t>lcRbZCDtm@;4Uq{#)de9eQ zu`tA=Ao|fF2_xK$qCYLt@EAAadJ`MB7yBX@q6$O_MAZq7OzKEeW`j6=IJk&mNr5E- zOX_uwOra^OBusNNiylxj$IU$2wMym)Hwy-BAyYB#7WHw(w3pc0vHL29fC2#m0dMnEFYediK-g~+0L&Y}9-_MQTnBDsmyB*|I z`+jHcy%^%euuibKHSSSDe>bmkB7h`G6s~a-M4b}dNNz^atR$tzxEa?6dc$Kj!I2v} za&p&8PQSe$$~}lPoCxVeV@4*;J>QpNm{eerz@!@H#H>y<@0myo-4XO!Dir2;IIrEi z5aDJ4wb-mejGIMt&1Ow4aTC|aXvla;W9LiyvBX-I;7kYSFI02wsa@u^6?*8dcJw|w&-`Y0R2}j44@;9e`v-z(==m(#k{tr=`YSJmJI#VNzC?dCmG6E zTCMU_gU!A(_T0Ja*mGAL4E!AY0{pU3^=jDb+1=hNSC<$BIRpg+r9DFvZHAfiK(*hi z_H~=ryz^_D@01$rqGw&MMz^YU+UL?6iK;zx-mDE(d+CNtANQ%cUCqVpmnwHfXaBo( z2Gbm-1x(8es=pJT#n`tASD^ZYL5M?0KuG#kcYt!2UhYzLcP+|Safl23YmI>f~g zi`-$5<#0MHASp4j<4(*ssDw~W z=&IfjJrOpw%pk`hCm<*BLk^!z2(yVCgFFY?s@obzRKghb=tPTJ6pYgmo%Bo~Oj>GV z)!UA;7>>;g$jcZiQ?%qE_Bg`4<#?^N1X7Y7nYk&1+w?CJ77)_(93itAgvI|%GRfxF z7?e1a1eD|*RF>-s*F>zLy+EsSq2df5djfd zK;s^r^5|L-;r{VEXln>1`h$mbuOn>!f6x{h4^_}M!Xp**6~foYLH2JDzO&FF!>yH( z!gSftwOdxT;-hrO(B~ouW7gV=cT~28e~^tP8KgL*1f*mXmGQdbt=L5Sbv77(zab`2 znY2eZEN%Ac+8n|>?KL5Rkfd{7VoxF5w$fdXUS2@To|xrD%R!bwm_t}VST3RP zNnHq3JAUpvY<~X`pQ5l_7rLuaae3%)hCz};Qb1DX(8$*fV}D!tuD$ayh_!Nv35dxR zR8}eR5v_o5j}DtqM7U2^eB}BXLaCml_U$;ES!Gb*P!Ld%>q^;aK0Y_&<{$50|F@k1 diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 82f9e483e8b1e8d9c47c5f86e05c501f133d89b5..97afd4a3b554c8a17c83b0887bd16736cf5ec1a8 100644 GIT binary patch delta 16116 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 ON?$>?iO(2$+W!HKd@aZT diff --git a/core/migrations/0013_heldsale.py b/core/migrations/0013_heldsale.py new file mode 100644 index 0000000..3850c0a --- /dev/null +++ b/core/migrations/0013_heldsale.py @@ -0,0 +1,28 @@ +# Generated by Django 5.2.7 on 2026-02-02 16:38 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0012_systemsetting_decimal_places'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='HeldSale', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('cart_data', models.JSONField(verbose_name='Cart Data')), + ('total_amount', models.DecimalField(decimal_places=3, max_digits=15, verbose_name='Total Amount')), + ('notes', models.TextField(blank=True, verbose_name='Notes')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='held_sales', to=settings.AUTH_USER_MODEL)), + ('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='held_sales', to='core.customer')), + ], + ), + ] diff --git a/core/migrations/__pycache__/0013_heldsale.cpython-311.pyc b/core/migrations/__pycache__/0013_heldsale.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e6f10fc046d6d40120acca2f46845a0aefe6d3f GIT binary patch literal 2003 zcmbtVO>omj6kf@)A~|+qgCP*Wj%S#HbFfoj`ZLpZ2!s&82_DB`T6a3C?A;hS`Z1CW zB&QsD=#g7<>?v(0K5*oiV~+}>gJ(~j>80Gvz=>1eN|u4btt)Bw?R($8eSf?9EtN_j zX#YIl)r2@gf3r!{U>>wrRTzFj7-3FF4Gu~GcUq%$ z!H^kEUiloei3IjEc+ByL#5zI*h26!7-Us9Xd|_+zjfns&MI6lI7;xlH5DCV`0z7dn z_9ym1Gz`mxO9L^jd23b^pEZHup@k7 z1Jv;VH5GBN(9eFb{T71-lI}#YLLE7hbdHUw;}L~Vz8kIn%s%A(Aj&-g3r_t% z?fCSEI@=Td+4ntdbB!!M19fqh%BxWgKtTvC%Oirt2&{)hU?3ezqM2pXj1LDmeR6`>Jm&RyEZJbx0NljO=XAJnyPC%geD&n zyJl@Dk*@ zriuIDv*Li$PBCtuX7&kYPuHnznGheHxZs;jbmn~M8}C|FYV{n~GKjsCV!4g(HLbk}d0S>?Q2F-y-L;TR zE`>QC3F_pr8v2-QCHSBDixZr zx@2_Y{DEG<_UO&k@_h(Txz~gg_sZlkX@N0z`H^LBIbA5WG7DSz?M+pN>b$J5T(DG> zy4yCp`ht$#GR_0IeRjvsP(<=)1L?xg317PKyX0TIdL%9S(&8{4%Zj^|VG_xCCd&;n zXa35Z@Mh+pJoIPgp9z1S_Zo_4+TM(FG~@U)j+b@^nX_K5w72Q!O3&_ixs{{bil1BY z(zgbgyjQsL>q)!~fB7)$<(H50%YJ^@OWzCx3rw)^)IB`!)xPy>-}|+uU)%C)?hv6R zzRJU}!T-R&W`n_Ib0+^X=z#?^a55GTu6gH5d-wcvrKj~n!K>c$tKa$6AN{K4S8c#t zR)_$Ak6>( literal 0 HcmV?d00001 diff --git a/core/models.py b/core/models.py index 09650ba..71a240b 100644 --- a/core/models.py +++ b/core/models.py @@ -268,6 +268,17 @@ class PurchaseReturnItem(models.Model): def __str__(self): return f"{self.product.name_en} x {self.quantity}" +class HeldSale(models.Model): + customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, null=True, blank=True, related_name="held_sales") + cart_data = models.JSONField(_("Cart Data")) + total_amount = models.DecimalField(_("Total Amount"), max_digits=15, decimal_places=3) + notes = models.TextField(_("Notes"), blank=True) + created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name="held_sales") + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return f"Held Sale #{self.id} - {self.created_at.strftime('%Y-%m-%d %H:%M')}" + class SystemSetting(models.Model): business_name = models.CharField(_("Business Name"), max_length=200, default="Meezan Accounting") address = models.TextField(_("Address"), blank=True) @@ -281,4 +292,4 @@ class SystemSetting(models.Model): registration_number = models.CharField(_("Registration Number"), max_length=50, blank=True) def __str__(self): - return self.business_name + return self.business_name \ No newline at end of file diff --git a/core/templates/core/inventory.html b/core/templates/core/inventory.html index 8f20e80..265af33 100644 --- a/core/templates/core/inventory.html +++ b/core/templates/core/inventory.html @@ -78,7 +78,7 @@ @@ -118,13 +118,14 @@ {% endif %}
-
{% if LANGUAGE_CODE == 'ar' %}{{ product.name_ar }}{% else %}{{ product.name_en }}{% endif %}
- {{ product.unit.name_en|default:"" }} +
{{ product.name_ar }}
+
{{ product.name_en }}
+ {{ product.unit.name_ar|default:"" }} / {{ product.unit.name_en|default:"" }}
{{ product.sku }} - {% if LANGUAGE_CODE == 'ar' %}{{ product.category.name_ar }}{% else %}{{ product.category.name_en }}{% endif %} + {{ product.category.name_ar }} / {{ product.category.name_en }} {{ product.stock_quantity }} {{ product.unit.short_name|default:"" }} @@ -348,7 +349,7 @@ @@ -357,7 +358,7 @@ diff --git a/core/templates/core/invoice_detail.html b/core/templates/core/invoice_detail.html index 36373ff..9cd927a 100644 --- a/core/templates/core/invoice_detail.html +++ b/core/templates/core/invoice_detail.html @@ -112,8 +112,8 @@ {% for item in sale.items.all %} -
{{ item.product.name_en }}
-
{{ item.product.name_ar }}
+
{{ item.product.name_ar }}
+
{{ item.product.name_en }}
{{ settings.currency_symbol }}{{ item.unit_price|floatformat:3 }} {{ item.quantity }} @@ -189,7 +189,7 @@ {{ payment.payment_date|date:"Y-m-d" }} {% if payment.payment_method %} - {% if LANGUAGE_CODE == 'ar' %}{{ payment.payment_method.name_ar }}{% else %}{{ payment.payment_method.name_en }}{% endif %} + {{ payment.payment_method.name_ar }} / {{ payment.payment_method.name_en }} {% else %} {{ payment.payment_method_name }} {% endif %} diff --git a/core/templates/core/pos.html b/core/templates/core/pos.html index ed920ca..7e2d2b4 100644 --- a/core/templates/core/pos.html +++ b/core/templates/core/pos.html @@ -48,11 +48,14 @@ .product-name { font-size: 0.75rem; line-height: 1.2; - height: 2.4em; + height: auto; overflow: hidden; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; + } + + .payment-method-btn.active { + background-color: var(--bs-primary); + color: white; + border-color: var(--bs-primary); } /* Invoice Print Styles */ @@ -127,7 +130,7 @@
{% trans "All" %}
{% for category in categories %}
- {% if LANGUAGE_CODE == 'ar' %}{{ category.name_ar }}{% else %}{{ category.name_en }}{% endif %} + {{ category.name_ar }} / {{ category.name_en }}
{% endfor %} @@ -145,7 +148,8 @@ {% endif %}
- {% if LANGUAGE_CODE == 'ar' %}{{ product.name_ar }}{% else %}{{ product.name_en }}{% endif %} +
{{ product.name_ar }}
+
{{ product.name_en }}

{{ site_settings.currency_symbol }}{{ product.price|floatformat:decimal_places }}

{% trans "Stock" %}: {{ product.stock_quantity }} @@ -161,9 +165,15 @@
{% trans "Current Order" %}
- +
+ + +
@@ -207,18 +217,18 @@ {{ site_settings.currency_symbol }}0.000
-
- - +
+
+ +
+
+ +
- -
@@ -257,6 +267,109 @@ + + + + + +
@@ -336,6 +449,7 @@