From 00d9114ba0f859188467072aa71baedb5f63430f Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Tue, 3 Feb 2026 09:54:08 +0000 Subject: [PATCH] Autosave: 20260203-095407 --- core/__pycache__/models.cpython-311.pyc | Bin 36156 -> 36288 bytes core/__pycache__/urls.cpython-311.pyc | Bin 10630 -> 10759 bytes core/__pycache__/utils.cpython-311.pyc | Bin 4394 -> 5979 bytes core/__pycache__/views.cpython-311.pyc | Bin 123752 -> 127266 bytes .../0019_systemsetting_wablas_secret_key.py | 18 ++ ...msetting_wablas_secret_key.cpython-311.pyc | Bin 0 -> 905 bytes core/models.py | 1 + core/templates/core/barcode_labels.html | 166 +++++++++++++++--- core/templates/core/invoice_create.html | 2 +- core/templates/core/invoice_detail.html | 82 ++++++++- core/templates/core/pos.html | 15 +- core/templates/core/settings.html | 24 ++- core/urls.py | 1 + core/utils.py | 47 ++++- core/views.py | 116 ++++++++---- media/temp_invoices/Invoice_18.pdf | Bin 0 -> 406842 bytes .../pasted-20260203-040015-70bc78c5.jpg | Bin 0 -> 32132 bytes .../vm-shot-2026-02-03T03-59-49-172Z.jpg | Bin 0 -> 32132 bytes 18 files changed, 400 insertions(+), 72 deletions(-) create mode 100644 core/migrations/0019_systemsetting_wablas_secret_key.py create mode 100644 core/migrations/__pycache__/0019_systemsetting_wablas_secret_key.cpython-311.pyc create mode 100644 media/temp_invoices/Invoice_18.pdf create mode 100644 staticfiles/pasted-20260203-040015-70bc78c5.jpg create mode 100644 staticfiles/vm-shot-2026-02-03T03-59-49-172Z.jpg diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index 5a0a5f0127092040d5a7ae063072fa594dd8a4a5..27ce5b1854dc80a131cdbed19b1db881942f3a38 100644 GIT binary patch delta 438 zcmdlpi|N2@Ccfpoyj%=Gz}ME8DH^zuuegkffo1Z;D5=eJ%a$>VFfpVuXR&}3fB=xk znxZ}Vd8IP1e2PvBLzF^_ZZLzU-e&)*w~WG7g5iltIf=yz!KukbsU-^Dsg;x0spwD6 zuCWywn`zH1Ccfpoyj%=Gz}MQCxg%gBUvU}J3FgTUqog*^EnCLSlcL?i5G9|Y6U?Bg zyScsUE#u^MD*BVR)!51uGBPj}a|3lYFx=o5zQV6~fkUxK8p!w4RG93TDLPqSm20zJ ztsLXz_&R0AnVXyInwd81G%_juQ2t<@jKG?jCF=28=OSMc2 zkgv%M7A|T8ns|#XxhOTUBvq58C}T2zs}pNJP(khFu-5O^i9l9S7DzqYE%uDW;>41Y zB80}GY>+fqO$X2%pqUvUfgBK#H@Txtg|!ICY}&lBt&C9<>=cm6MIgZYA4KVobo8 zAO~Z>(S(C0oDidlX%OW`V!Y^uS+j}8n_j$VvL5y1%wtWsIGg?D?fd`Vn>X9-eDB?J z;!{zqw9)nU-tFAjl6a77ECnk>+{4+!>sjH-0MppYyn0c#D%fn#>Aka-xc}ak=X#H?$sgwe$Sc zFxI4=%5mD8qjzx|f0XJu4RdZ6r38$+B^oE)QcUBjd9%`HubAstIJ7wZaCU8gps0?b z28x?;9toaf#%I|g5o-g8z^ob0lm)BrR8ZuZX&TB zf)YAP7${*zz)-(?hfWf|M9`>?Mh(2^L3FA|9yZ~IM^?ez0`3KA*={&OYqtn$(@~p& z+RP}(#~=8de5;0Qz3fCyz@%59@lD_pub0MK5Pt*O6{d!OXMlO&lA`Q^mV+F22b{tX zb$tTm4^Z;4x)Z=Oa31)~$9Dbz@lW7BKXV=f_5o*rkAYi$HqlqVvh(|##dWGn=;k#X zR9V?+mC0kk`;aNAmh~d;R-NT(9;VFTN!2N2X`Lg$>RN#p0<3y2;PruNinrdiZ{@t9 zHgDz$>e5k{fx65ht$YVH-vidcH6AAvr!Yg6NRajE22KVoy+gn!>5J(UH2fyW4*ePU z8(gjstB8fzEF-`>z*XRT;16JRn0Xq*%Fg#RChYzm+R3RAf>Jt487O6r3vi4)?hm_a PCg5SNid|Dz>0jzEaTYW@ delta 802 zcmXxiO=uHA6bJC^?$jo!OAsvBgxzd5-E1P7R>kjFMH&RPt)T&>)(CBFP+Ap5*3ur@ zL#ybe=?E%<_GSc2DXBLRy^7ckET{;A;88Ta>cx5gt_k@u^WK~HX2aeo&h@L$RW%$C zpMlw#%b|+eCT(7^Luzo~{79`okXfyj)Vj)tVja?8Z6S7C=3lg)@R+EV#P8-y-l=CL zhhNlV!b$j0*FugIksHB4Q;5&#Tf-aMu)mdC9KNn=qCOHQcg782FT4ilmfr3uIV0$(1 z?dW=2a#^v?iXJOAb|Jr;SM0Xb9;^?b_OAA*$=jB$PPr^sXE~4M8V8X+#7oI&@-Wsp zzioW6)l2MmyUw_*P-g{?6&gnz{vbiuew8qVpW)v`Laa5DBFEq`oP#gm2l(4Gn=xWg z;!~-pazUKfo1}B+;3Rws-@zZSxt(UF+o|#tyb3FD6@G$$pk~pHj#}m>OzY+MteDa# zJABrn7FDF*!=H#mQhwx`nAHhEEmH+?% diff --git a/core/__pycache__/utils.cpython-311.pyc b/core/__pycache__/utils.cpython-311.pyc index fcfe627d18ccbdbf44d9e5b521d6ccb173273354..a6171c4cc82b7a3a1a744862f0e341a18f04ebd7 100644 GIT binary patch delta 1386 zcmZ{kO>7%Q6vt=0w%1;-KVk<$5|wUBAT=cpX+kI>st8z3K_vv7P=N$tVvq&fI6Q62Hu*4+s#zP+=^$g!hJx;Uyy!6<3(ofWLp-+<=5wzL3 zpZsEo2dQW25YNlgbdtXyf0FOgAYIvYJ-u1cJaMG9>ud_v=<<5{;`9nw_s7<)hGn-cMQ6-r$`-Sm z%4K!aRNc}_w-Cgewx*jdTjuxDMt-P0@NBq);2RBnmoH})QmzcSlQy`LVnCr}{A=8}Adq{&HXD zKV*BA;!>_$Ah(|%0rm<~`JB)@kt@#$y=jW}TnxxihpGSwTLKJx|NROa=}n?hEn<=; z?Fba4;%B9qsi+@iq93hC!zpeAC5E13QPIz@OV?)YJn)o@2`;Spz|66(y zrS~HszR*ehSNw1_Kkg@dQIoz+eF+(SbDTvd3F03WhvX;!w>YFhaXcg76Ut*^GK@*c zBot34rRBWB-+g|HzbB6@r9Mbih*s#pvrXINitrX`)8g=>$Yxu$yVlH({X7s`#_k{`Mn`Zrq4RNR`~GBssWhlx&W(=@8e`Wu%N&sMyeu51~m zUK#{vXCWJQ0dW!WG6GMT%>nlEGpb|ExRAkg7@oZXj-tS@u7X6^8;Dn{s)N=2TNY=( zhNvLc0Bgm_+TM6M+yKP$6t`8aLe+1zOmnw%;iy8_VeATf6Ihgw7LdaQa98Yo47iM_ zAq+$v0Y$w|SOZNHv5IH{T+|;=F>I^^9l^u6rHwWoqUtys;UdffCkAk@Q9|}fU*gg1 z!Qz=a68`pI>c`0gZv@GY91bgog|WUE#ft(MT$G=(E765Jg#|v5dw2UuxG}@z_TmVz zH!PK(6MB#4%JV|6MA4p)0gH4XKrzN%giKf&v5CODImoa}*wbj^R_-Sj;VaNG_48~8 cULkGbzQcpu{Ol9-M4udEm7d1;2VfBIFL-cH>i_@% delta 470 zcmcbuw@Qg`IWI340}yDmHfFl=P2`hcRG6r)z{(uVpvk&1%}Ah9wh zKQZMNM^S2VL4ICwYLVCEk9@{lsX$p5ATF+)tjE7jfKy_I#1%=s56n#bYz^)oxF&z) zKN79%DB!}&aM)BFNFL$kaxr2)A}-*f%X~zg5yaMI1(KR9MNS|)L1q<2f(VewD;bIm pKx{oA@r%O-=+@GlRJ)>dAeRw{i#;ZP6El%fWt9EEfJuP00svDscgX+% diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index b5bcced031c470787d2dd7c5365b88c8842adac6..29bb55f891187291247d550d5dc1091df514d2c0 100644 GIT binary patch delta 27262 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 E1t#CRH2?qr delta 24351 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 NmX2lOSmall Sticker (38mm x 25mm) + + + @@ -153,21 +156,72 @@ @media print { .no-print { display: none !important; } .print-only { display: block; } - body { margin: 0; padding: 0; background: white; } - @page { margin: 0; } + body { margin: 0; padding: 0; background: white; -webkit-print-color-adjust: exact; } + + @page { + size: A4; + margin: 0; + } .label-sheet { display: flex; flex-wrap: wrap; justify-content: flex-start; padding: 5mm; + width: 210mm; + margin: 0 auto; + background: white; } - /* Standard Sticker (50x25) */ + /* Specific A4 Grid Layouts to ensure alignment */ + .sheet-a4-24 { + display: grid !important; + grid-template-columns: repeat(3, 63.5mm); + grid-auto-rows: 33.9mm; + padding: 12.9mm 9.75mm !important; + gap: 0; + } + + .sheet-a4-40 { + display: grid !important; + grid-template-columns: repeat(4, 48.5mm); + grid-auto-rows: 25.4mm; + padding: 21.5mm 8mm !important; + gap: 0; + } + + /* Avery L7651 (5x13) */ + .sheet-l7651 { + display: grid !important; + grid-template-columns: repeat(5, 38.1mm); + grid-auto-rows: 21.2mm; + padding: 10.7mm 9.75mm !important; + gap: 0; + } + + /* Avery L7656 (4x21) */ + .sheet-l7656 { + display: grid !important; + grid-template-columns: repeat(4, 46mm); + grid-auto-rows: 11.1mm; + padding: 31.95mm 13mm !important; + gap: 0; + } + + /* Avery L7156 (3x7) */ + .sheet-l7156 { + display: grid !important; + grid-template-columns: repeat(3, 63.5mm); + grid-auto-rows: 38.1mm; + padding: 15.15mm 9.75mm !important; + gap: 0; + } + + /* Standard Sticker (50x25) - usually for thermal printers */ .label-standard { width: 50mm; height: 25mm; - border: 0.1mm solid #eee; /* Light border for cutting/reference */ + border: 0.1mm solid #eee; margin: 1mm; padding: 2mm; text-align: center; @@ -199,7 +253,6 @@ .label-a4-24 { width: 63.5mm; height: 33.9mm; - margin: 0; padding: 2mm; text-align: center; display: flex; @@ -213,7 +266,6 @@ .label-a4-40 { width: 48.5mm; height: 25.4mm; - margin: 0; padding: 1mm; text-align: center; display: flex; @@ -223,6 +275,54 @@ page-break-inside: avoid; } + /* Avery L7651 (5x13) */ + .label-l7651 { + width: 38.1mm; + height: 21.2mm; + padding: 1mm; + text-align: center; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + page-break-inside: avoid; + } + + /* Avery L7656 (4x21) */ + .label-l7656 { + width: 46mm; + height: 11.1mm; + padding: 0.5mm; + text-align: center; + display: flex; + flex-direction: row; + justify-content: space-around; + align-items: center; + page-break-inside: avoid; + } + .label-l7656 svg { + height: 8mm !important; + width: auto; + } + .label-l7656 .label-text { + font-size: 5pt !important; + width: auto !important; + margin: 0 2px; + } + + /* Avery L7156 (3x7) */ + .label-l7156 { + width: 63.5mm; + height: 38.1mm; + padding: 2mm; + text-align: center; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + page-break-inside: avoid; + } + /* Price Tag */ .label-price-tag { width: 30mm; @@ -244,14 +344,15 @@ .label-text { font-family: Arial, sans-serif; - font-size: 8pt; + font-size: 7pt; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 100%; + line-height: 1.2; } .label-price { - font-size: 10pt; + font-size: 9pt; font-weight: bold; } } @@ -376,6 +477,13 @@ const sheet = document.createElement('div'); sheet.className = 'label-sheet'; + + // Add specific sheet class for grid layouts + if (labelType === 'a4-24') sheet.classList.add('sheet-a4-24'); + else if (labelType === 'a4-40') sheet.classList.add('sheet-a4-40'); + else if (labelType === 'l7651') sheet.classList.add('sheet-l7651'); + else if (labelType === 'l7656') sheet.classList.add('sheet-l7656'); + else if (labelType === 'l7156') sheet.classList.add('sheet-l7156'); queue.forEach(p => { for (let i = 0; i < p.qty; i++) { @@ -383,16 +491,20 @@ label.className = `label-item label-${labelType}`; let content = ''; - if (showName) content += `
${p.name}
`; - - const svgId = `barcode-${p.id}-${i}`; - content += ``; - - if (showSKU || showPrice) { - content += `
`; - if (showSKU) content += `${p.sku}`; - if (showPrice) content += `OMR ${parseFloat(p.price).toFixed(3)}`; - content += `
`; + if (labelType === 'l7656') { + // Horizontal layout for very short labels + if (showName) content += `
${p.name}
`; + content += ``; + if (showPrice) content += `
${parseFloat(p.price).toFixed(3)}
`; + } else { + if (showName) content += `
${p.name}
`; + content += ``; + if (showSKU || showPrice) { + content += `
`; + if (showSKU) content += `${p.sku}`; + if (showPrice) content += `OMR ${parseFloat(p.price).toFixed(3)}`; + content += `
`; + } } label.innerHTML = content; @@ -402,14 +514,22 @@ printArea.appendChild(sheet); - // Generate barcodes for each SVG + // Generate barcodes queue.forEach(p => { for (let i = 0; i < p.qty; i++) { const svgId = `barcode-${p.id}-${i}`; + let bWidth = 1.5; + let bHeight = 30; + + if (labelType === 'l7651') { bWidth = 1.0; bHeight = 20; } + else if (labelType === 'l7656') { bWidth = 0.8; bHeight = 8; } + else if (labelType === 'a4-40') { bWidth = 1.2; bHeight = 25; } + else if (labelType === 'price-tag') { bWidth = 1.0; bHeight = 15; } + JsBarcode(`#${svgId}`, p.sku, { format: "CODE128", - width: 1.5, - height: 35, + width: bWidth, + height: bHeight, displayValue: false, margin: 0 }); @@ -417,13 +537,11 @@ }); } - // Listeners for settings change document.getElementById('labelType').addEventListener('change', preparePrint); document.getElementById('showName').addEventListener('change', () => { updatePreview(); preparePrint(); }); document.getElementById('showPrice').addEventListener('change', () => { updatePreview(); preparePrint(); }); document.getElementById('showSKU').addEventListener('change', () => { updatePreview(); preparePrint(); }); - // Initial Preview updatePreview(); -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/core/templates/core/invoice_create.html b/core/templates/core/invoice_create.html index 56cb8f2..134a336 100644 --- a/core/templates/core/invoice_create.html +++ b/core/templates/core/invoice_create.html @@ -284,7 +284,7 @@ .then(res => res.json()) .then(data => { if (data.success) { - window.location.href = "{% url 'invoices' %}"; + window.location.href = "/invoices/" + data.sale_id + "/?created=true"; } else { alert("Error: " + data.error); this.isProcessing = false; diff --git a/core/templates/core/invoice_detail.html b/core/templates/core/invoice_detail.html index ad255a6..4f96ac3 100644 --- a/core/templates/core/invoice_detail.html +++ b/core/templates/core/invoice_detail.html @@ -1,16 +1,26 @@ {% extends 'base.html' %} {% load i18n %} -{% block title %}{% trans "Sales Invoice" %} #{{ sale.invoice_number|default:sale.id }} | {{ site_settings.business_name }}{% endblock %} +{% block title %}{% trans "Sales Invoice" %} #{{ sale.invoice_number|default:sale.id }} | {{ settings.business_name }}{% endblock %} {% block content %}
-
+
{% trans "Back to Invoices" %} / العودة إلى الفواتير -
+
+ {% if settings.wablas_enabled or site_settings.wablas_enabled %} +
+ + + +
+ {% endif %} @@ -243,6 +253,72 @@ function downloadPDF() { }; html2pdf().set(opt).from(element).save(); } + +async function sendWhatsAppDirect() { + const phone = document.getElementById('whatsappPhoneDirect').value; + const spinner = document.getElementById('whatsappSpinnerDirect'); + const btn = document.getElementById('btnSendWhatsAppDirect'); + + if (!phone) { + alert("{% trans 'Please enter a WhatsApp number.' %}"); + return; + } + + spinner.classList.remove('d-none'); + btn.disabled = true; + + try { + const element = document.getElementById('invoice-card'); + const opt = { + margin: 0, + filename: 'Invoice_{{ sale.invoice_number|default:sale.id }}.pdf', + image: { type: 'jpeg', quality: 0.98 }, + html2canvas: { scale: 2, useCORS: true, letterRendering: true }, + jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' } + }; + + // Generate PDF as base64 + const pdfBlob = await html2pdf().set(opt).from(element).outputPdf('datauristring'); + + const response = await fetch("{% url 'send_invoice_whatsapp' %}", { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRFToken': '{{ csrf_token }}' + }, + body: JSON.stringify({ + sale_id: {{ sale.id }}, + phone: phone, + pdf_data: pdfBlob + }) + }); + + const data = await response.json(); + + if (data.success) { + alert(data.message || "{% trans 'Invoice sent successfully!' %}"); + } else { + alert(data.error || data.message || "{% trans 'Failed to send invoice.' %}"); + } + } catch (error) { + console.error(error); + alert("{% trans 'An error occurred while sending the invoice.' %}"); + } finally { + spinner.classList.add('d-none'); + btn.disabled = false; + } +} + +// Auto-trigger if 'created=true' is in URL +document.addEventListener("DOMContentLoaded", function() { + const urlParams = new URLSearchParams(window.location.search); + if (urlParams.get("created") === "true") { + const phone = document.getElementById('whatsappPhoneDirect').value; + if (phone) { + sendWhatsAppDirect(); + } + } +});