From c51e7a80865d3363beb2fe50c08d6bf46189d1d5 Mon Sep 17 00:00:00 2001 From: Jeremy Rangel Date: Tue, 6 May 2025 14:50:17 -0700 Subject: [PATCH] Added DocType override for Sales Invoice and Quotation naming --- .../__pycache__/hooks.cpython-313.pyc | Bin 1013 -> 1219 bytes rangeldigital/hooks.py | 6 ++++ .../__pycache__/quotation.cpython-313.pyc | Bin 0 -> 1802 bytes .../__pycache__/sales_invoice.cpython-313.pyc | Bin 0 -> 1824 bytes .../rangel_digital/overrides/quotation.py | 26 ++++++++++++++++++ .../rangel_digital/overrides/sales_invoice.py | 26 ++++++++++++++++++ 6 files changed, 58 insertions(+) create mode 100644 rangeldigital/rangel_digital/overrides/__pycache__/quotation.cpython-313.pyc create mode 100644 rangeldigital/rangel_digital/overrides/__pycache__/sales_invoice.cpython-313.pyc create mode 100644 rangeldigital/rangel_digital/overrides/quotation.py create mode 100644 rangeldigital/rangel_digital/overrides/sales_invoice.py diff --git a/rangeldigital/__pycache__/hooks.cpython-313.pyc b/rangeldigital/__pycache__/hooks.cpython-313.pyc index 16dc493e5b6b04bb5e5bbf084f32f39eaa51c233..df83dd6d795dd315d3780f2af93e06f1ce3ed6c2 100644 GIT binary patch delta 336 zcmey$ewb7JGcPX}0}zN-No825F)%y^abSQM%J^(HQC(Ipm@Sw+m_v`Lh)tg%m@|;E zh#g3C0cnnOZcUzv5qb4hjzx)i>8Uv>ndzA&i8*=@UObGOUzS=_l$nxRtXG_vlUf{~ znOBydnVhN@4B~l0I8|0e8c|r9Uy@jonV+W@2xG}IVV0PKe?o`AT>TYC$YGAvL(P8ev_Xww{h_Ubu$8SvGL?`7B$gNT>L^z4Sb&x P*nJs=nHu?vc!6>NW$_$k diff --git a/rangeldigital/hooks.py b/rangeldigital/hooks.py index e33309a..830f2b6 100644 --- a/rangeldigital/hooks.py +++ b/rangeldigital/hooks.py @@ -5,6 +5,12 @@ app_description = "Addons for rangeldigital" app_email = "jeremy.rangel@rangeldigital.com" app_license = "mit" +override_doctype_class = { + "Sales Invoice": "rangeldigital.rangel_digital.overrides.sales_invoice.SalesInvoice", + "Quotation": "rangeldigital.rangel_digital.overrides.quotation.Quotation" + +} + diff --git a/rangeldigital/rangel_digital/overrides/__pycache__/quotation.cpython-313.pyc b/rangeldigital/rangel_digital/overrides/__pycache__/quotation.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2cac810f7899669edbe8c8a94b0037eac3ff375 GIT binary patch literal 1802 zcmdT^&2Jk;6o32SwUb~Q$IX|igIfsHg4j}`7^#64h0;T<2GxrpQd*WxJa!kYciq`_ zl!^%TRG9;!94bszDICMCLP%WU)T=E^xEiR0#HqI+r{V~2vR<1+aJm1n_il?3Vo%Q zK;bT21->^GRe?&Xm;frP64sZ~0g5MpCkif`ehyFN2Hr>SW0B_2Rbk*gyz`?Gh44|GYpUpHs1kn+OIVNkQN=+u zODu|om~S6)Rra$jaXs$a*H8FTVbYg|9A7S=Dog#d5Avm=7{NC!N)cF;Ecst|Gd;}p zrNRroG~~~|t)lGj6>sS>_Ph4B8SzhAfpl<{g^vK638R!>C==$5Z*L1= zoL`ATI!Z&_rj)5(s}UBe5Lc@bS7*VJz3JXW(+D?}4Pus9(5~^n!eIfYW*RQ#Xl4p^ zTx!&qgbWqkD%n*QFEvD2cDI42t z%&UZU>e4CP$l=gSabkA1h(D{7{RCqw#LTLOOPs8Cgg%?!AlByfEFQ|qdQl~#Vz|2b zOilBh_7}ZnBVGcWvH18z0PujBg9_=KjXz7W|%ixtm&OrxyMKICW9{ zq5Px$z5P?^q4~4f$*JAkwRY}W>!WHXXLWO1?c7#3x6{t;>;rrztcX2;H{KCZxgfqP z{)x&(u@y=lC@?*U~?q&9-9=zH~ob605 zH^v@~Pv4nt#+u8``BwByL&mV^#FxhBMmI9sj?6aQ-JNfC_TKMC7TS@8-xA6D8dW&RX+I^V4Rv6@R^P;UMr|6*`fH{SZvdd@+Lk1Eht+$68G* zETr+tN;Hj)YFgDU)lDuxr)f9py4m+cHG~!d$TTcs*_uX^Sc6Syn!^Y1riP%P#zq~V zSJS=&`XYMiNxtx5c)0NC=kO=E4Nt{*V8)B#?sSmyaYM&&VQ~)~8SI0Y84r3MeqSTB zW|3_-gQ&zdDw#g;GeZOnq{AIq>^+KDvUGER1vY}TboRq*CuwY@j`LxfU`j)4L~O|=Mrxo%p;V#~L3pueZGHt_CV0aq2B7sW`%$tT&0H@&kBU&HMhEdHZ&U zhX)bB%U>pMoY4{bQ!)XBdc^Jm5OnYO534KX8yCeUeQ z>PcjVt{HQhAA^OeO4@iLnWeNM;&qF0f*q?yohs&pQNlrd!nAC{-*MJmS|TOi(?69S zvzr9s4!VY9dZwBR(@Zsqm~Lv2LQjVnG=ZKNaFhZc=_&=Xl--Y2>0d+zDLn>nDCc^T z@*+Yhv;ww16lBz6a9T!@agV`VFK=Psm;zW+IneH3d%s0txSyAtsRkaVCf~zRR$_rw z@gSO`7S+N?AV0*W9(X(IN<5ISj0RL;ET9fCJYL8&=6by!_-jQq3eQ^9qUgNl=tu5m z;?Oss3eN@9A%6C474;xfaQD_SLjRju;g;TodY9j{qd})tlnyV6;l9}x${>>$DwJ9J z!z~5TOA9fSjqJDV#KSe>St49^OWsWo4MZW3(L#L;Hc<$(!B$^>+Sx>!VsH?{xF)?fiN-zuC@j?jZEJvY_rF^x9i0 zFqhT0)xUtbqP8Madj>i=)0(-^8JTYwJHSkQH}&mQlXpg5Y#5*%Pu_cJD|0uqJ%0ae zCwZYWHs2U}baLYMM02D$-<)m5&NXx}izU9HU(s%Kx*eTvdRv>{Z*G6kjpo|X-0#V$ zdzCHcuCx8&{c30WVkdd2vG{20)a~Ww`_0dqwO0I<#^t@xe?{m-b2|}~nEZMG>PIN8 z?7!Jk+7J;ecPznJ3}Re!%WJlzPhkA%nq~JiF$@z1b7WJ8I4;I)3Sx)^#@w?!TEZ|J zjIOT1D`Wg4V$Xw?osx&#iTj6Kf?PhqE%a24hbDa+sZNKP+&XLs4iWcTR(HsTm$6DEcg^v5ruPG6`X`}}+fOY<-(xUaj%6R63pOK@9#kqKulv1UWNA>y j{miG~*wGY4`3()j_ZXdjjL4oos!X=xXP+X#`~Lp|f&7s! literal 0 HcmV?d00001 diff --git a/rangeldigital/rangel_digital/overrides/quotation.py b/rangeldigital/rangel_digital/overrides/quotation.py new file mode 100644 index 0000000..b46811e --- /dev/null +++ b/rangeldigital/rangel_digital/overrides/quotation.py @@ -0,0 +1,26 @@ +import random +import frappe +from frappe.model.naming import parse_naming_series +from erpnext.selling.doctype.quotation.quotation import Quotation as OriginalQuotation + +class Quotation(OriginalQuotation): + def autoname(self): + # Use selected naming series or default from meta + naming_series_pattern = self.naming_series or frappe.get_meta(self.doctype).get_field("naming_series").options.split("\n")[0] + + # Step 1: Resolve dynamic placeholders (like .YYYY.) WITHOUT incrementing the counter + prefix = parse_naming_series(naming_series_pattern) + + # Remove any trailing dash if it exists + prefix = prefix.rstrip("-") + + # Step 2: Append a random 6-digit number + random_part = str(random.randint(100_000, 999_999)) # 6-digit number + name = f"{prefix}-{random_part}" + + # Step 3: Ensure name is unique + while frappe.db.exists(self.doctype, name): + random_part = str(random.randint(100_000, 999_999)) # 6-digit number + name = f"{prefix}-{random_part}" + + self.name = name diff --git a/rangeldigital/rangel_digital/overrides/sales_invoice.py b/rangeldigital/rangel_digital/overrides/sales_invoice.py new file mode 100644 index 0000000..e0be8e8 --- /dev/null +++ b/rangeldigital/rangel_digital/overrides/sales_invoice.py @@ -0,0 +1,26 @@ +import random +import frappe +from frappe.model.naming import parse_naming_series +from erpnext.accounts.doctype.sales_invoice.sales_invoice import SalesInvoice as OriginalSalesInvoice + +class SalesInvoice(OriginalSalesInvoice): + def autoname(self): + # Use selected naming series or default from meta + naming_series_pattern = self.naming_series or frappe.get_meta(self.doctype).get_field("naming_series").options.split("\n")[0] + + # Step 1: Resolve dynamic placeholders (like .YYYY.) WITHOUT incrementing the counter + prefix = parse_naming_series(naming_series_pattern) + + # Remove any trailing dash if it exists + prefix = prefix.rstrip("-") + + # Step 2: Append a random 6-digit number + random_part = str(random.randint(100_000, 999_999)) + name = f"{prefix}-{random_part}" + + # Step 3: Ensure name is unique + while frappe.db.exists(self.doctype, name): + random_part = str(random.randint(100_000, 999_999)) + name = f"{prefix}-{random_part}" + + self.name = name