From 9b52b2f660839ee41699d16663b0a8ac4b913e32 Mon Sep 17 00:00:00 2001 From: VolkovaV Date: Thu, 29 Oct 2026 10:38:30 +0400 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=205:?= =?UTF-8?q?=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20product=5Fcalculator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logic/__init__.py | 0 logic/__pycache__/__init__.cpython-314.pyc | Bin 0 -> 173 bytes .../product_calculator.cpython-314.pyc | Bin 0 -> 2679 bytes logic/product_calculator.py | 44 ++++++++++++++++++ tests/__init__.py | 0 tests/__pycache__/__init__.cpython-314.pyc | Bin 0 -> 173 bytes ...ct_calculator.cpython-314-pytest-9.1.1.pyc | Bin 0 -> 3796 bytes tests/test_product_calculator.py | 31 ++++++++++++ 8 files changed, 75 insertions(+) create mode 100644 logic/__init__.py create mode 100644 logic/__pycache__/__init__.cpython-314.pyc create mode 100644 logic/__pycache__/product_calculator.cpython-314.pyc create mode 100644 logic/product_calculator.py create mode 100644 tests/__init__.py create mode 100644 tests/__pycache__/__init__.cpython-314.pyc create mode 100644 tests/__pycache__/test_product_calculator.cpython-314-pytest-9.1.1.pyc create mode 100644 tests/test_product_calculator.py diff --git a/logic/__init__.py b/logic/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/logic/__pycache__/__init__.cpython-314.pyc b/logic/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd7f64d9ce152afd38239cb7c7516ca1a98364d3 GIT binary patch literal 173 zcmdPq5CH>>P{wCAAftgHh(Vb_lhJP_LlF~@{~08C%gfm+CbT%U zs5mCLq%ZiGZ83KoROazUtE%3l#0yE$xqKrj){-Y%*!l^ lkJl@xyv1RYo1apelWJGQ3N#vIc`=CbiJ6g+v4|PS0s!LXEkghR literal 0 HcmV?d00001 diff --git a/logic/__pycache__/product_calculator.cpython-314.pyc b/logic/__pycache__/product_calculator.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b207a7efb25907ddbc491eb45c86db3219e3788 GIT binary patch literal 2679 zcma)8TTB#J7(TN*%Pxx|sE978V^MT1q6Lf;sKEe6R8SY(lw`wXx;v4z>&|*+rj<94 zUNoB6G)-grQrjjqOvv{nSFpBq$j+SWfBpXN z=jGC+L4v2p`sw(aenNicllJrS{zqykZ)j5N8&_QLAT?)VsNtR@Fa2w6uWzMhI={w?Y$-|(-u z^B!irQEy&K!jTdsH6&J?w*@gu#0q{a^r)`jGr^fU=*~Zbo+cL#NU+}=!i0T@1YKw2 zJbBhxB#bB8dJl=6w#F8x)*6+pu^bd|XG*e0k>yDw9Pj#IkbPE|W~GLmn*bLGoxuJK z5X7-C&Y{5-V1A)a!e|uun3ULf;jDFzU4xRdxHsj1$idh&gm8FGJ9^m^ziD0IRtC2~ z`f0uaS(6w6l-7AZ=STzut#gv&nu}qU4LdMi;2GS+`3Z?#fpWlA;_&A9#TU4SXDu0p zDkr22O~%z0H#mSgv@O8>IP_R!>42XrAXnFr;Tx z1Y4+Tm^8i6%m2taEP^YJ-&fs4O+!4&A4%uwn}Nd<_`4Z2Ujqo)ml)%O8}R3OgKWaY zN#xe0m|Qm54bC9mgffheh>spGumS{&_%-4;e;BVe&r7Jz5z&u>1p*e zg8^HGLQSEnc@_70no$Nl9us7Eij4TylLKoBaq1NHw$qyw!b0y?BrMvV`W<%gX+rH4 zag$OtZOA9Iv@s;>hC&T{WrnJ6B{frDxTodc4aoaI9t)9xz-S)Qpjw&aT zdR#NphMJHaywkG%%z!*J@*I&OPN{@+mbJ35XO=tE$_LAbYmxA{K?Q?;4 zwyhllE71OZXwwrtfYW2kYlV-?YK8v2;UYU2RZ^zfMX5$@KUFg+C9YD=Ew)!l58FNp z8xnR|XLn!6p`*S1^5L#XM^|q@Zu%Uv?2@N})a|mo{dvIJ)kBIdJ4bXmnT9J1gGxE= zQO;{Rr{>z)TB*IAf^~@<%1ioZB@Way8Y|ZPlr2{N5 z@F=wPUZ}weHDph+P{VBKRVG&6uikzw{B8MML&x3fj(b%Ht*V3UNQ6}#oUQ6(;_4r2 zYQJdw!wuuS58=Grc)9WO#Y^+VyRnFg(w{*R*m!^0$}>wImXv)^aj|Aj+Hp6u<8JvY z*^ayAyC%zLOIn%OIu8@cB8c;5ho3m#iNOoDND_1Do{;8`&`zB;67kfKh!+h&G{1wW z=Qe;lUxR8m+g@cecWy1D>f5Nx5pX5;K(y8wPMo*Fc&FJUj!p9F<}E^UBslH=&aI~u zYG{U%l24j|dD0jLEpduK3vjv$ZxZ92H*z|_Qe&`UiYw%{Wc?ED=c!vmk=rT<0%AP&F1M-ohdwTo3`v>Iy zeUYxdeTNQqf}%T8>#sS#?nw*`0On_w7MPbgr#(`#H zwp3*S^}fGiZuRy#|MmyVsveY7P+rHqVZZH{<%AZOWjm1X7fvP871*a>K;j_Z(Lw!u z$}i?@3ACL6wWQSDRKglJQs02rW3M0x56Gck$ht=>Di|rdAF5)c^0%T&q3!pkVqujd F;%^*91}Xpm literal 0 HcmV?d00001 diff --git a/logic/product_calculator.py b/logic/product_calculator.py new file mode 100644 index 0000000..0b244b2 --- /dev/null +++ b/logic/product_calculator.py @@ -0,0 +1,44 @@ +"""Расчет показателей товара для каталога.""" + +from datetime import timedelta + +DISCOUNT_PERCENT = 25 +MANY_QUANTITY_THRESHOLD = 5 + + +def calculate_discounted_price(price, order_dates, calculation_date): + """Возвращает цену товара с учетом скидки. + + Скидка 25% предоставляется, если в предыдущем календарном месяце + (относительно даты расчета) по товару не было заказов. + + :param price: цена товара в рублях + :param order_dates: список дат заказов товара (datetime.date), может быть пустым + :param calculation_date: дата расчета (datetime.date) + :return: цена с учетом скидки, округленная до копеек + """ + if price < 0: + raise ValueError("Цена не может быть отрицательной.") + + current_month_start = calculation_date.replace(day=1) + previous_month_start = (current_month_start - timedelta(days=1)).replace(day=1) + has_orders_in_previous_month = any( + previous_month_start <= order_date < current_month_start + for order_date in order_dates + ) + + if has_orders_in_previous_month: + return price + return round(price * (100 - DISCOUNT_PERCENT) / 100, 2) + + +def get_quantity_label(total_quantity): + """Возвращает «много», если пар больше пяти, иначе «мало». + + :param total_quantity: количество пар суммарно по всем размерам + """ + if total_quantity < 0: + raise ValueError("Количество не может быть отрицательным.") + if total_quantity > MANY_QUANTITY_THRESHOLD: + return "много" + return "мало" diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/__pycache__/__init__.cpython-314.pyc b/tests/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a4dc5b7d3e36411fcdf453acec4d2370e4fe763 GIT binary patch literal 173 zcmdPq5CH>>P{wCAAftgHh(Vb_lhJP_LlF~@{~08C%gfm+CbT%U zs5mCLq%ZiGZ83KoROazUtE%3l#0wONi8lZj){-Y%*!l^ lkJl@xyv1RYo1apelWJGQ3N#vIc`=CbiJ6g+v4|PS0s!o5Eo=Y) literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_product_calculator.cpython-314-pytest-9.1.1.pyc b/tests/__pycache__/test_product_calculator.cpython-314-pytest-9.1.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..128624ebfad57e4ad4c64f042f93eff535e1fefa GIT binary patch literal 3796 zcmeHK-ES0C6u+}O``s<21%)MvMxnJ}9 zopbv9U_MKr{r26Dmp_dYQo}*mVnOG@Ip{2tIig4>2$#e&HWPPZMKUAvL=oS_P9$ei zJSF<^6X}@@&&*_bwn!9tl<=IA06Cx}LFSbd$U#NgNy_OpT;fbw^5nY4^>WPHUenB) zW5PhK8?0tIO|I8fn;JFU8(z@4y69+4Ztx}5)Gq2~&wf)d7o34S_(sD0D#Rue#FnZs z@|z;fCFeFxp$#-URtH;Fp5NmelZDR-*+HsuFeJ0du-AE( zh?1!!CM6|%VQMlq71%0qMXshpt66d1;mCiM$W)+s6`l*v^sO||YmK84sl=y(bA>ys zkM{Wu{<+_2Ns*OA*NHZ^m&0}T$6n|*ni`z>Fyd>3`V{#l!J{;5-(?N)fVtOD*#mFhOFSq)pG zx;Fr?)r*c{a-+$-q-lW#^R}t%lI56nVX7{e)RIm8^(L<#v#vHxORKYLMWY6gstPC5RmLrIQ-lvb4X=w4Ue@>71#Ckgk+sdoPK z@>@S_Ex2;w`neBZzbhB~Ut2DGa3~r@oi5$&j>R2xj%>O+VDtbs(i<58lYXSR7e$($ zD3h4WhS6j~dZGwKo;U)fMFh(9M4*@w|Bpr>jE$X``nVA&p(OwI2$T{LCYm&VjqDB zII=o2dPBaUtqiwEcDcj5*YjoIxfRDfe6l@o>L2C{-3hy@!C%xOzI-hB(&5TnB8>eu zR2Pdw6-i{>@jZcSkafdKgv>@*iROk}sH7_~$hw&eQdibR%t!fZHp;)N>x-=A6K9_wPH)wx&Kp;B)z%EkqEs@kU#0uN71v;wK`fKid~ro; z=f@H5MOQ9ff9F=NcvlX7ZMlfKpri2nUAo&Hi#zDO-WW7s^f-7=hPVDd-r*Ys4N&>- z;T>aygJcK1f9>9Mzj!pn)4kwA%OLs@Tiyt<%(&JAShb-wm*|V&z5}ON57?3`m#$ZD z