From af49bdf6ec6737d67cec93daece599a10930e4a8 Mon Sep 17 00:00:00 2001 From: Gitea Date: Thu, 28 Apr 2022 12:38:12 +0900 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20API=20=D0=9A=D0=B2=D0=B0=D1=80=D1=82=D0=BF=D0=BB=D0=B0?= =?UTF-8?q?=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Atol_check.bat | 2 + Atol_token.bat | 1 + kv/general/__init__.py => __init__.py | 0 __pycache__/main.cpython-39.pyc | Bin 1125 -> 1268 bytes infosys/__pycache__/ismain.cpython-39.pyc | Bin 0 -> 463 bytes .../models => infosys/general}/__init__.py | 0 .../general/models}/__init__.py | 0 {kv => infosys}/general/models/general.py | 0 .../general/repository}/__init__.py | 0 infosys/general/schemas/__init__.py | 0 {kv => infosys}/general/schemas/general.py | 0 infosys/ismain.py | 11 + .../__pycache__/general.cpython-39.pyc | Bin 0 -> 1459 bytes {kv => infosys}/routers/general.py | 0 kassa/__pycache__/atol.cpython-39.pyc | Bin 1875 -> 1875 bytes kassa/__pycache__/database.cpython-39.pyc | Bin 0 -> 689 bytes kassa/__pycache__/kassa.cpython-39.pyc | Bin 665 -> 663 bytes kassa/__pycache__/models.cpython-39.pyc | Bin 2812 -> 2826 bytes kassa/__pycache__/new.cpython-39.pyc | Bin 10683 -> 11953 bytes kassa/__pycache__/sber_db.cpython-39.pyc | Bin 0 -> 714 bytes kassa/__pycache__/schemas.cpython-39.pyc | Bin 10125 -> 10159 bytes kassa/atol.py | 2 +- kassa/atol_token.py | 12 + kassa/cruds/__pycache__/doc.cpython-39.pyc | Bin 1487 -> 1487 bytes kassa/cruds/doc.py | 3 +- kassa/{databases.py => database.py} | 0 kassa/kassa.py | 6 +- kassa/models.py | 6 +- kassa/new.py | 78 +- kassa/sber_db.py | 23 + kassa/schemas.py | 14 +- kv/__pycache__/crud.cpython-39.pyc | Bin 0 -> 20689 bytes kv/__pycache__/database.cpython-39.pyc | Bin 0 -> 2036 bytes kv/__pycache__/isapi.cpython-39.pyc | Bin 0 -> 2126 bytes kv/__pycache__/kv.cpython-39.pyc | Bin 362 -> 437 bytes kv/__pycache__/schemas.cpython-39.pyc | Bin 0 -> 26368 bytes kv/crud.py | 423 ++++++++++ kv/database.py | 61 ++ kv/isapi.py | 53 ++ kv/kv.py | 9 +- .../__pycache__/__init__.cpython-39.pyc | Bin 137 -> 137 bytes kv/routers/__pycache__/accrual.cpython-39.pyc | Bin 0 -> 557 bytes kv/routers/__pycache__/address.cpython-39.pyc | Bin 0 -> 2490 bytes kv/routers/__pycache__/general.cpython-39.pyc | Bin 1454 -> 1454 bytes .../__pycache__/objectvs.cpython-39.pyc | Bin 0 -> 2483 bytes kv/routers/__pycache__/payment.cpython-39.pyc | Bin 0 -> 2281 bytes .../personalaccount.cpython-39.pyc | Bin 0 -> 2146 bytes .../__pycache__/reference.cpython-39.pyc | Bin 0 -> 8089 bytes kv/routers/__pycache__/report.cpython-39.pyc | Bin 0 -> 696 bytes .../__pycache__/reportfilter.cpython-39.pyc | Bin 0 -> 1185 bytes .../__pycache__/turnover.cpython-39.pyc | Bin 0 -> 809 bytes .../__pycache__/withdrawing.cpython-39.pyc | Bin 0 -> 1413 bytes kv/routers/accrual.py | 13 + kv/routers/address.py | 65 ++ kv/routers/objectvs.py | 62 ++ kv/routers/payment.py | 56 ++ kv/routers/personalaccount.py | 50 ++ kv/routers/reference.py | 213 +++++ kv/routers/report.py | 15 + kv/routers/reportfilter.py | 24 + kv/routers/turnover.py | 19 + kv/routers/withdrawing.py | 33 + kv/schemas.py | 797 ++++++++++++++++++ kv/settings | 12 + main.py | 15 +- settings | 12 + Новый текстовый документ.txt | 3 +- 67 files changed, 2035 insertions(+), 58 deletions(-) create mode 100644 Atol_check.bat create mode 100644 Atol_token.bat rename kv/general/__init__.py => __init__.py (100%) create mode 100644 infosys/__pycache__/ismain.cpython-39.pyc rename {kv/general/models => infosys/general}/__init__.py (100%) rename {kv/general/repository => infosys/general/models}/__init__.py (100%) rename {kv => infosys}/general/models/general.py (100%) rename {kv/general/schemas => infosys/general/repository}/__init__.py (100%) create mode 100644 infosys/general/schemas/__init__.py rename {kv => infosys}/general/schemas/general.py (100%) create mode 100644 infosys/ismain.py create mode 100644 infosys/routers/__pycache__/general.cpython-39.pyc rename {kv => infosys}/routers/general.py (100%) create mode 100644 kassa/__pycache__/database.cpython-39.pyc create mode 100644 kassa/__pycache__/sber_db.cpython-39.pyc create mode 100644 kassa/atol_token.py rename kassa/{databases.py => database.py} (100%) create mode 100644 kassa/sber_db.py create mode 100644 kv/__pycache__/crud.cpython-39.pyc create mode 100644 kv/__pycache__/database.cpython-39.pyc create mode 100644 kv/__pycache__/isapi.cpython-39.pyc create mode 100644 kv/__pycache__/schemas.cpython-39.pyc create mode 100644 kv/crud.py create mode 100644 kv/database.py create mode 100644 kv/isapi.py create mode 100644 kv/routers/__pycache__/accrual.cpython-39.pyc create mode 100644 kv/routers/__pycache__/address.cpython-39.pyc create mode 100644 kv/routers/__pycache__/objectvs.cpython-39.pyc create mode 100644 kv/routers/__pycache__/payment.cpython-39.pyc create mode 100644 kv/routers/__pycache__/personalaccount.cpython-39.pyc create mode 100644 kv/routers/__pycache__/reference.cpython-39.pyc create mode 100644 kv/routers/__pycache__/report.cpython-39.pyc create mode 100644 kv/routers/__pycache__/reportfilter.cpython-39.pyc create mode 100644 kv/routers/__pycache__/turnover.cpython-39.pyc create mode 100644 kv/routers/__pycache__/withdrawing.cpython-39.pyc create mode 100644 kv/routers/accrual.py create mode 100644 kv/routers/address.py create mode 100644 kv/routers/objectvs.py create mode 100644 kv/routers/payment.py create mode 100644 kv/routers/personalaccount.py create mode 100644 kv/routers/reference.py create mode 100644 kv/routers/report.py create mode 100644 kv/routers/reportfilter.py create mode 100644 kv/routers/turnover.py create mode 100644 kv/routers/withdrawing.py create mode 100644 kv/schemas.py create mode 100644 kv/settings create mode 100644 settings diff --git a/Atol_check.bat b/Atol_check.bat new file mode 100644 index 0000000..f173c97 --- /dev/null +++ b/Atol_check.bat @@ -0,0 +1,2 @@ +CD %CD% +py -3.9 check_start.py \ No newline at end of file diff --git a/Atol_token.bat b/Atol_token.bat new file mode 100644 index 0000000..9b47a04 --- /dev/null +++ b/Atol_token.bat @@ -0,0 +1 @@ +py -3.9 C:\projects\service-app\kassa\atol_token.py \ No newline at end of file diff --git a/kv/general/__init__.py b/__init__.py similarity index 100% rename from kv/general/__init__.py rename to __init__.py diff --git a/__pycache__/main.cpython-39.pyc b/__pycache__/main.cpython-39.pyc index 50c0bd57a07cf907c5f7a9e20f9e553f8e00091e..ad65dbe0536e70bc218cc567e6b48831d4b84964 100644 GIT binary patch delta 541 zcmZvYy-wRu6vusRlQ>T7B;>;sXd5Ji6fqz%bU=s>6)!*~21}J?IG5lwv7_r4i76x? zwx}QvFg9g~K=POyf>|Ji-$m3$fI8-{giA0N zNugOHYO{<5Eb<$RSi-Uc4q#;{gD|5RPOE6Vq1GI0953OAH+W97oG#YU6vlIsYt8?rNm^sA?#02Ot8{R36x;$5g6A4r+a%nyf|H=G0m~g+6?_FB z!DkS%JGlD*-lUFthL3a3@B28MZ|zgHW6RPdQKs`1kI2d%fWF#4yA4g+qAIEhpw?*J z>E%WOp+$jOXp|7z)P8QG`2uL6{UF^#=umswq59OtHaa5FK^MIVOaT3ofYeY;&@T4= zp@yJaI12v29&TUBkHA{goch?u9US0psepu=r_ykbUqHe?;K^{sJ8UidMn157F&A?E zq|AK&Cg1Uya@3Y9a+wv2isTtv47>bYp~3Qca-Ol2Il@~hah_L7LKh-*Li};BUaC=) p#&a4)mBNoo!3|n=NT?%bPQrDj)eqZ0)Hh#Xz_~le*lUlSeF0* diff --git a/infosys/__pycache__/ismain.cpython-39.pyc b/infosys/__pycache__/ismain.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..992d97642ae9ace79dc4fc4e0053c77462566eb3 GIT binary patch literal 463 zcmYjN%SyyB6ixb^c4pL>FPLo?4(L)u6y3NH(T$V=sm-04lr{;ut*Beq?)(Y=!tcn| zmA@beCLIND$l;vJ$<0ZM@i-;6-oxr{j}r3X#Q%z{IJO&aEHJ`oO&Xe0>bO^Xji38X zkO#f?>#&LPsOLc)H-kK(1pH@`r;t`dpjFC37O|KOIOUWjFTVAr*CZQ$+UX>tCSHL6 zUDTOpl9S8xE7`T6O?(Cl1Vd|xWYM+jeapgHuDCFSzuMep$N)>tRm-J#nsBj{GmbMM z+u2fff@Qvm^k!J3G%WdpNi?960s$|wQNHbt;3LjAF4Ue4Wa4FkZK1gKt!HI5q_rbMryqXzDF# z=UM)=K+{t~4VpR8j!CDr!Fz4Q&#X;ocjcb-0M1*4F0Y20N)=2KB6GUWyX z#|I}JSfg-%6Fg(Ue8w#o+yYfV=GzVv=cI1qS@EI6;xkN<0YeGZ9Re{EyE5U4!NlMy z-t{w$V=3n5e6w-0GvvVmvqRAlj2}8S+pvbij^p0gC1FHJ&WPPvssM&aCI`oEb zdCa`mdh*!3ALXD%dqM3mI`>SM27AS9NTJO1S!nNDu6stLPJ44@JP$Es4#;$E#Rl13 zFfD^WG3QL{oDH17-*D*G>&Wdo^bO=a`(tG*k?|ITTPJOjUt*`CNILlRh=)xgD;_(*G`Gc%*2gLuz4X3*-WmXv>i%06QU0C z$4VJGGhN2a|36jh%@@taPnDU6Gq-0)#}usmPC*_OSP@SIU5Hpk5qT8RQib{FR;vCz z@3WItmN{nd*Yv91iK=lq#%&G!-D*V|eM^Ma(Baq&99vtK@#falMXm{ZpLv$x*d{XV z1(dl$CK15#|E|4At^6*dxxFA9hD@A7whaXEFgh>W0ZQVxZNr ziDkm^Lyk4)m@|&#VmegAM7?qwD2!Zo2k)V{3Z_H~_|waJhU5|%Qh|9T2@{^*0f=W^ AY5)KL literal 0 HcmV?d00001 diff --git a/kv/routers/general.py b/infosys/routers/general.py similarity index 100% rename from kv/routers/general.py rename to infosys/routers/general.py diff --git a/kassa/__pycache__/atol.cpython-39.pyc b/kassa/__pycache__/atol.cpython-39.pyc index 2004e676c7422190133aec2296b22e5e724224e7..f7f09b4d624ed12bc638d952ab857780c96255c2 100644 GIT binary patch delta 45 xcmcc2cbShjk(ZZ?0SFeXb4q%+yi9zvk#`m=9)B>+yJ4#fZf diff --git a/kassa/__pycache__/database.cpython-39.pyc b/kassa/__pycache__/database.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2e04b13f162861bb1204682828c200bb40d8fec GIT binary patch literal 689 zcmYjP%We}f6t(A-$utS2OBSqHFsevEsHz(AXj+O`q?KTJjv|d5+ayEmnP5AJRAp7R z{Rdd`OWv~TFR+2@R28|Fug*O)x<2>Vq}@&sM6h{D?sy3OcEx&xQ0&9j?;$b7us{;$ z7(46i~e2(&n1$l#qyum^im6$ayygcSUi&(^C7GL;zlQmiL9pwqz z$WYq4gzhNCc9U@`h$5!^!izD{9JrR|T9nO+nN|r@l?d!ql{uvNX2o@JF%GQyYxSiczQgIxv73wj=djNCuswZ|HRE4827d zy+dc{2mT4DO0Lm;@Db+6C#h#!+0~rGni63{D(cnv9vlBcstxV_q=)^{T-BdIoE~YI zp``pCna@WvqBR*YVuaBu^Q@(g>lHteHCqVKl#Ahj?oFT#P-{x|YE{y+RewdVi; literal 0 HcmV?d00001 diff --git a/kassa/__pycache__/kassa.cpython-39.pyc b/kassa/__pycache__/kassa.cpython-39.pyc index b298ff4f90714e3e7c576832e218a9a6f776c80a..729ace0aff8bfb62bf4edd25d946ad8043a2a6b1 100644 GIT binary patch delta 52 zcmbQqI-Qj_k(ZZ?0SKhKoRYR}}@oHJRT#bWXVR`H+|))cN@<|xiomK5$())eLx zmR?4v7#C2C2PW3c6vYkX^CIzifP6kAK5q(tFoUMRd6D?MDSW{Un*5W0vbs+8Vv7?n09sWf2qFwYgwf;+%o39? zu!%DZFbYh5#kNNB7DrxbPEKM{PHK@ZT&)q1HF+Mh(&RJj{ET2dlEy$GeIPCdxt@cO zg;9(VXar-C@nl98+09xU#Y_VH*@?x)iFzrCC5cIi#i_-U*KkR(f%Fxb0<9IF{FqA} E0GOgZ$^ZZW diff --git a/kassa/__pycache__/new.cpython-39.pyc b/kassa/__pycache__/new.cpython-39.pyc index 14e0183db0d5deb67fc1fc1e28acb22296956c4f..89271e4863e4463cbb4f202f69024dfe3bb2694f 100644 GIT binary patch delta 6294 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 delta 5040 zcmb6cYj9ju`JQ|4?%sW7oA+b$P9NJmnl?>K+ca$`R1ipo)B!HmRlI2QPCN&9u$QL$p}hk7zFC5RL9|me_dUbGTg-BGQsui{)dc@Xr&5r6(!3$Y2 zJFdqC9<~y8Qcv0`J!RMFb#_`$3x34fVb|;R0@thtyHRhnoAf3@N3CYNMQ^cN^;Wx0 zZ?oI=cDqCGurqo_$YWL~;N1ZchXuOyF1uUrwtMs*yI1cON{Op~+gGWx_S%E`V8F13 z^dU38Ea}7M@c9varrz&Ri|QNd}a9l#kAoKZ7MGb<|Xq+JzY9yB%Dy+UXY?FDLFxa|YC{d556 zLsjWcx(leoW~0#EP4@tGi+O}*!E!Gh1nOv2HbjSkI##7d=sut(%;R(vH22d3KurQQ z2Gl|Nz&Ma6syjafJ3mZs0nSN!gdV*j=~HI^`CI8RP@SO1fq#ll(i6bHjh>`a@O?W? z%t+Z=Kfv5)i63%H7tA6cWQsp6-ylub&nRt#^zedusy7ZgYzF{eE>KpFNZh>SnyhG8 zIp8$%x79Y%#NStY!$YV$#8aWYp-wAZe_h>+nil#L?TkKh1;Kp(MT0KS&X z6^aEnmmA=ZhkrM@rMG1pMdbv5tjxv{Pa(M34?76FLH=yyy>ZlJSmI*k4V$AMweh3# zrkit(S<4*dZ)m$(P{)ttOV*-Ybo{Vo%$k1FOebst?16aDbxrFlVAhl46zBT z;JEpcy)b!`pG3qEY@9^m>3vp8QU_L;f7WjIb= z2HwUe0tha33jUq@_?v-< zQ9-C~0+?b%CF23fm1|Y!8Ag0syL^oD_dDv9HpM?1R`28`;0v1FS?h_2}x1URTk03WD`S-i8s zA-nk1hW1LfjXelFU2_&^FD{yFDL8;QEOuHDh1(FDMUY285ts<(5I6wzkh5sp25Uve zXOW>4ia9-I%wt;Jr3I5QN=YKU+@gxF^goI`+13VU6B)Nmd4Fwi)2go}@xY6fU8&dH!}&=OfroSPc#?Ixl(Bx#lwQ2$k9-fTT^L@``*_zNpS%r(kO^3qV%( zRdMKfe zBG4!?(oE_JdmJ6Wu;Bk}?u;owpj&4b?`>(QK;O%2Qdw~oPg#Z;Kw%O<aZR#2p`vQt9SuMbhcsbd z2Rx6t*!ZLY!9{~efMi}OL-xutmCH&&y8cRQJ*jxg9L~MQ=^%}`C%;<%Sd;7`0+CNq zA6WXA6N873?BDo^MqnPQxd;{kKq9a`n1KL000tL+ZE0+56w6qWF!cXN&9Tpeeh`}S zCMF_ONyHtn!EU@$=tUKT3`ie`zK(PhyTq_5-=Qtr{LfDE&s!= zyDFnm3vGK!tV(#+z!HuV^t|E1s-32EJQXnFj1rl0ZM0%5f>7`3q<@D*( zkfRZ_z(9zfCl&GRWnV%15&~>)_8I_RoqqbCR$;$AN(}VB-?;jU-iN`f;~CH z$zW4g3g%J@=5m_AY!VYX{I7600iD`R*qi)tHdhIrO-kT@v&bMsZ{k`i0<04DBLKh^ z+uBrP?I^0*kcyi*ibQYUPU}glFnho)jg2hKkDA2;qO5(HnM?sW zJm6pqiRdws|lx#9eh97o9}V zi9l58S;R!KJ&2g7Pke@o+7r()aig+tAP;YCaoGhWEUFdn8F4oRb^EdeHv#(@GDXrw z4Per?<#?;|v_NhX01;D diff --git a/kassa/__pycache__/sber_db.cpython-39.pyc b/kassa/__pycache__/sber_db.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28908d00f645264a87cc394e7cfcd24285bb0cf4 GIT binary patch literal 714 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 Ui$Ljew!BhaC>L<$WJdD;0FNst+yDRo literal 10125 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: - server = 'Sanctuary' - user = 'sa' - password = '159357' - db_dicts_name = 'fz54' - db = Session(autocommit=False, autoflush=False, bind=db.engine) - db_dicts = DBEngine(server, db_dicts_name, user, password) - token = get_token(db, db_dicts) + sleep(0.2) uuid, ext_id = atols.pop() + token = get_actual_token() check = get_check(session, uuid, ext_id, token) print(check) \ No newline at end of file diff --git a/kassa/sber_db.py b/kassa/sber_db.py new file mode 100644 index 0000000..f592058 --- /dev/null +++ b/kassa/sber_db.py @@ -0,0 +1,23 @@ +from sqlalchemy import create_engine +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker + + +SQL_ALCHEMY_DATABASE_URL_MSSQL = "mssql+pyodbc://sa:gjghj,eqgjl,thb@172.16.4.58:1433/acquiring_sber?driver=SQL+Server" + + +engine = create_engine( + SQL_ALCHEMY_DATABASE_URL_MSSQL, connect_args={"check_same_thread": False} +) + +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + +Base = declarative_base() + + +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() diff --git a/kassa/schemas.py b/kassa/schemas.py index 13181c8..c749c90 100644 --- a/kassa/schemas.py +++ b/kassa/schemas.py @@ -6,11 +6,11 @@ from sqlalchemy.sql.sqltypes import DateTime class SumNumberTwoFormat(BaseModel): - __root__: Optional[confloat(ge=0.0, le=100000000.0, multiple_of=0.01)] + __root__: Optional[confloat(ge=0.0, le=100000000.0)]#, multiple_of=0.01)] class NumberPrice(BaseModel): - __root__: confloat(ge=0.0, le=42949673.0, multiple_of=0.01) + __root__: confloat(ge=0.0, le=42949673.0)#, multiple_of=0.01) class PhoneNumber(BaseModel): @@ -18,7 +18,7 @@ class PhoneNumber(BaseModel): class NumberTwoFormat(BaseModel): - __root__: confloat(ge=0.0, le=100000000.0, multiple_of=0.01) + __root__: confloat(ge=0.0, le=100000000.0)#, multiple_of=0.01) class NumberThreeFormat(BaseModel): @@ -182,11 +182,11 @@ class Correction(BaseModel): class Doc(BaseModel): - uuid: str + uuid: Optional[str] = None timestamp: str - group_code: str - daemon_code: str - device_code: str + group_code:Optional[str] = None + daemon_code: Optional[str] = None + device_code: Optional[str] = None external_id: Optional[str] = None callback_url: Optional[str] = None status: Optional[str] = None diff --git a/kv/__pycache__/crud.cpython-39.pyc b/kv/__pycache__/crud.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18ac7459fb2a3969b03adacb5584d513e4d00de0 GIT binary patch literal 20689 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 literal 0 HcmV?d00001 diff --git a/kv/__pycache__/database.cpython-39.pyc b/kv/__pycache__/database.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9caf2bf898d24c600d395ffbede4b4f357604b02 GIT binary patch literal 2036 zcmZWq-EZ7P5Z_&|eZI@x<&q{%TcAP}s(J!0=?fnrElryO4`~pjrK%NV`MjINi9fEp zzLZ9nr{pytB;E>Af_ULy+Ei**r z@)u6d4<9CX;MOle2qI`oG8)i~1&rdHrB22JZfz%ZGcWM0&C^Qe2Yyx!s&?+CwQM4o zu(p@hgSwpfl8B1%kBIOO*&z)Y2??5VQdC9lko|NmXvx;e)F}z3W&PxWoIa&N^Dz+~ zC!8EQl;o|OME|ltsJ)(ml#NZ25ZOGL5fi8M5BehwX65Y3Mc89bQaLB;qLEP1JZ8Zq z>4}DD$V+1K*aDNSt&{e}zaa;t%}gU! zGAd;#^Q|P8#(fxdQ`x4bC1jjNDk_sb8FnL$&+1xgofLT%?MemT`d{}-m`17LD@k0! zimHgp2)@&LEk+0DhXa#4aO*V?k_1$cfITA8kzCNFk!EMwIn(@1yGxL+z?Gh?Tqdx- z0&`zfAspX^Q#1Ywct)JYI}3&9Q6>%FE_7*lUrS~D9sqk*D6wWLg@vwT3ShEL3*3Ewb%Py%s{tfy4&a=S0Yd=j@@Mvx!$xdK zZw=}DP!7IRB)M^QFHOp}V_0WFO~5|J-HXz`{FA6Tm<_MrTiocWVn@cM-hiy^C9(W4 z>h(5u_cpM4n8Qx*xv4Fsi7w+J>)oD3NF0Pmy;uA1jWgZZl4aOeX=f=d;waU(!5Dus zq@NGz^?he?ett+7hxE>n&bNIvY4Ieb%(S`yw!(C)28t$%Itm00__>zpW>6ayD%7Pi z4%jw`k+=lwOyvy3G)y$^K`5tyllreb)};HbH_^7M#t%c}Mi`n}7-og&r)by1@M%9v z&)zuba54;|JTFSofF9Gwthb!@Ef? z;B^&>m`cljPjp9G$+EBVm;t8oK(=EPmhB&bQIZ{`8rxx|Bj_=uz*a$anR>V6JMIB3 zf!hP5A_FQqu!bMIKtOk`P1QVnzt20OTRa2=o`yKG$oL2@Eh1qWV=H`?l-uo!;dilD z{Y;h-MsF%gZl(~UWrSg(YiXbmWZO{-pwvwiAES7ka?61#a=-@Nfw$WJ1%Lr{$h*hX zB0P)X{%>H*Kha8Tz{62}3LCu%%tK(J`w2Qij|5OL>N9l9lbmicxsTcXM_9o7Hf6_1;(aA3OT@dt<9Uvb7pG) E0(8Lc2mk;8 literal 0 HcmV?d00001 diff --git a/kv/__pycache__/isapi.cpython-39.pyc b/kv/__pycache__/isapi.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cec1059cdd9f76c8a1d42d3b98a8b3ebaa6e433f GIT binary patch literal 2126 zcmZ8iTW{Mo6ee}|J#pNm_j>Kt!oU)Dz@E0YXpm-Dfg%l(q8r!*hAh&F63J3Y*=-yf z7?8g9VbAM;4OD~(G-N91=7k9f$BpWRBOh@k!W$6oh_gV5h< zaIu*%cnpvD1tUZe#Q_R2!J$Sptj1cPhXygyz8;vNMXb;!cIXf%ERaH2B*m~qN@1Cl z!wRW{RZ(=>v_=tfC6Vd##!HE(&8+Rcmnf1j}P2HmNTH|2k;H) zBm>@$hR`d$@soYZ-8X)J4;EzYv7|%0vY_6H+YK13$9U$8M6FAB`z&3pJH=<{2|B@N-~+!o*7>&->~Dx#zv~l| z+6UU$9OJP;o%j00O7yXHf-xGSQ)6tM;ZySr!6p_qB>ITI_JGjmO^2QZ&o(^bI+#6} zwcFUyCU~Mzbc!IWcBcKRy*3~N9yyPX?@t~ce=~uKtX{-JH)-ioTe&Zdz8f-W4&7kD z{zUvLpl**{iZ$Tt)DzgBF6vgYHljY<$&jF|hXqp~IX0CxtR%bU>387Hug|Gp? zBJ91Rsa_cyhV`#yI+))B@2JvNBo{16AgKTbRNWTk ziI4^hUxpDZe5wk|e!mxy`f8>TPhs%VXK&!U>L$ma2L4-VB<`LV+3id}NacB|Bh$E% z)1ImcscvSnl6&Ucxx6e-^@S{MP6cN*6P!G>*gh8?GPjj$Q0}$CtF(wzw$gWwSEhI- zNn|1O{*Ve(9#d%NLPcsXfd9`yvT|R!eL=cN{ijblmPa`4srr#BtXRq5)YHNnt((&B zxgvpE%hjoJb*$3i3=T;of~#vQi-*G%o~p9oO4hj27Oq5&!=EhT1!WZ9cuASEGV0Rv zDi~6N*||#cnu1drSjkbWSUeAi)DDNdt~yrs9jODyQ+i4rSU~DIiMAQ{-M}9)o^n7| z{k|6rDC=bNE>K8OpQjhYc>p{f1niNLNO2d;99)9?SlO~};kiZ~Up5-r=fD2}VU$Yt literal 0 HcmV?d00001 diff --git a/kv/__pycache__/kv.cpython-39.pyc b/kv/__pycache__/kv.cpython-39.pyc index 21a6afb93207f86826091fb0cda36ac33ff15558..932cf0300b4a1aa6d3c978e105789afc1fdb4d46 100644 GIT binary patch delta 228 zcmaFGw3S&qk(ZZ?0SLm`vXWF785kaeILLqv$Z-JT;)sdb_HtR=shn9{DXb}MDeNg6 znT(l?DV)8`j0`DU!3>(*6RQk8STlspWKIE^c8fbDwK%ybv!En1Kd*}4Ggu+B zSivv9L?JD|G%rPy`4(GIerZW+(Ji)uqSUm^id&pTsl^5PdBv&46E{1n-(t!xD*`#7 zh!aTM;>*lS&M8evjfZGj$xtK+k`tV)!Du2T1Y`;@@-Xr+@i4J5u`seQGBI-f1puZH BI86Wm delta 154 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 Table: + metadata = Base.metadata + metadata.reflect(bind=engine) + + if dbname == None: + dbname = db.name + + return Table(tablename, metadata, schema=dbname+'.dbo', autoload=True, autoload_with=engine) + + +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() diff --git a/kv/isapi.py b/kv/isapi.py new file mode 100644 index 0000000..6917be5 --- /dev/null +++ b/kv/isapi.py @@ -0,0 +1,53 @@ +from fastapi import Depends, APIRouter +from requests import Session +from kv.routers import address, objectvs, payment, personalaccount, reference, report, accrual, reportfilter, turnover, withdrawing +from kv.database import get_db, get_table +from typing import List +from kv import schemas + + +router = APIRouter() +def exec_procedure(session, proc_name, params, database: str = None): + sql_params = "" + if params: + sql_params = ",".join(["@{0}={1}".format(name, value) + for name, value in params.items()]) + dbstr = "" + if database: + dbstr = f"[{database}]." + sql_string = """ + DECLARE @return_value int; + EXEC @return_value = {dbstr}[dbo].[{proc_name}] {params}; + SELECT 'Return Value' = @return_value; + """.format(dbstr=dbstr, proc_name=proc_name, params=sql_params) + print(sql_string) + return session.execute(sql_string).fetchall() + + + + + +@router.get("/get_settings", response_model=List[schemas.SettingsSerializer]) +async def get_settings(db: Session = Depends(get_db)): + table = get_table("vSettings") + return db.query(table).all() + +router.include_router(address.router,prefix="/address-info", tags=["AddressInfoViewSet"] ) + +router.include_router(objectvs.router, prefix="/object", tags=["ObjectViewSet"]) + +router.include_router(payment.router, prefix="/payment", tags=["PaymentViewSet"]) + +router.include_router(personalaccount.router, prefix="/personal-account", tags=["PersonalAccountViewSet"]) + +router.include_router(reference.router, prefix="/reference", tags=["ReferenceViewSet"]) + +router.include_router(report.router, prefix="/report", tags=["ReportViewSet"]) + +router.include_router(reportfilter.router, prefix="/reportfilter", tags=["ReportFilterViewSet"]) + +router.include_router(turnover.router, prefix="/turnover", tags=["TurnOverViewSet"]) + +router.include_router(withdrawing.router, prefix="/withdrawing", tags=["WithdrawingViewSet"]) + +router.include_router(accrual.router,prefix="/accrual", tags=["AccrualViewSet"]) diff --git a/kv/kv.py b/kv/kv.py index 6443189..d3dd2e4 100644 --- a/kv/kv.py +++ b/kv/kv.py @@ -1,9 +1,14 @@ from fastapi import APIRouter, Depends from auth import oauth2 from auth.login.schemas import login as schemas -from kv.routers import general + +from kv import isapi router = APIRouter() -router.include_router(general.router) +router.include_router( + router=isapi.router, + prefix="", + responses={404: {"description": "IS is Not found"}} +) diff --git a/kv/routers/__pycache__/__init__.cpython-39.pyc b/kv/routers/__pycache__/__init__.cpython-39.pyc index 64fe67bb6a7263129b88d3348f3c72c33f8961b4..178249a3676f044c4343747faafbe1817a3421ce 100644 GIT binary patch delta 20 ZcmeBV>}2Fg}2FgJ{l#AL1fKET22Py}y)F(xax0t`g>0wNOebFhMZBw)g_{uk9_ zCmGmig2q(!Jo9Y-;Pm*cUbLufbc7Agg&~LV8rw@Tecae~L@nl3Sv6dm53rt?mNeC` zIPQ}klA0kw%VzNEJ+U`e6HYSU_Da1FHa#fm=JLG4`w6x-{hwNg6#K#SfUfVY!=0kh z^$g3_6bALODshW9O>w&{bl0sZ_&VLVdC+d(F3xxa%7IKUP?X>;pK|KPeV`53eORBy=n8h7{{goP X8}F)GEF|u^HJOxP2<~i>hCvKJn_P(8 literal 0 HcmV?d00001 diff --git a/kv/routers/__pycache__/address.cpython-39.pyc b/kv/routers/__pycache__/address.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52801bf6d7e01ea4b88f778839be24131f04d667 GIT binary patch literal 2490 zcmbtW&2HO95av=8sejwDEm{6|8x&B{*uC@;6m1Q=2Lo*oR6q}e0E5=99V(>A>{2eQ z+NbnZ@qS~)Un1-(Ve5o#%)u^$-W9$|*d}2cgk771MSGikjj%1kwg|gE z2a9^w`37M(MD@)k-+asN*|Yu@@ZSQ=Hs2x4Heq%rFgqz`kAFm%-T%ORe23wzqqQIX zg;9RmX0dr8qEmhbBda5na)UuzkBf)TPJRf6k&v-It>IYnSph9>3XRkB8Y9VQhnR*!s$k%Fr%taI z3Kv)VQUp_y;m%e>9k#| zAX|qv_AW|BpJr{ErHfupttz-ND%nq=Kn6*V#?@unTQW3MHf3 zffSK+#igK=@!|e0-071w&_C_k7RWxCumUBcJ#wut;QYFSi&HKz|0(Ks9{q5`R?vUb zTgbIJMq=zgn=le3qx^y3Zgi{1mJ~0CLPfKI#oBRSFOYw>UUanCY&1}%+yLaXr?x=$ z1vEwVNS8PtHOPdS=ubH3U2K4C$(&xaVMga%qjtcECmEw~{@$C*ZCLf7`me|8+k1BD z#pS;0Jr};CVk;fk76`H45{I}9Gc2WN4%AH~AJ^1N&+%~8)qWs-iB&wd&K(swp(`;y z68|Q|W^@%ox=E8JNtumvkS6w8ns&#@rO|=3bUb$iw@c0)L{x0;*0Z$E9wudW45AWd zFQ+<$%6!2>VmH$-Qwo&C6KQWu?2T7RW<8!3yOAQkPtVJ7a$F>4X>5dnitO6A5Yxl- zGJ*`l?6G&JHk@H6F`k)3qU%|gBO??hsg(bg5R?*FTovmXt)A!xH KP+*%z(*6aY5G_mq literal 0 HcmV?d00001 diff --git a/kv/routers/__pycache__/general.cpython-39.pyc b/kv/routers/__pycache__/general.cpython-39.pyc index abab309efb4b131fc2e2d76abb5b7412d5b3ec24..92e0ff4aba15fc09a77715f35912aa673ff16fed 100644 GIT binary patch delta 21 bcmZ3-y^fnFk(ZZ?0SFGPPEXp%vxpS{IPe9W delta 21 bcmZ3-y^fnFk(ZZ?0SMMb{7Tr!vxpS{IfDhr diff --git a/kv/routers/__pycache__/objectvs.cpython-39.pyc b/kv/routers/__pycache__/objectvs.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3686721b1b10f21a0e4bca464c7153fdd7eea73 GIT binary patch literal 2483 zcmbtWOK;mo5avs7QGQ1czn%1;L+qlL0!2_XuzE1iq(xQqKnM^h?Z%};O3W_h!m52r zul)x-IENnm4|?v;*lSPy3q5sas0S%41q@SIa(DLQ%r`p^%C+sH2G{K$=e6*qgru$l;JGvgvjlgtFnj5|qWSk7mO+OptoE*(9KOYpFLQr&yw9fdY zpzM@&jThc)j?L|h3d`~`*DqG;8q57=@FLH=*Wc)TmFHOgcY_sJ@mG*IYlJNkc6|Z6 z0oXENZB`-dCSg|yyS0Fw>Rn}PgndHTb;4FZg56-7gsl;Fi?H>NV4tumVH@1O-Db59 z`phHn5qQ>tXM=4MW`{64Da`H!v&;4fvqzZy6lQ;dIber`IUvkY3UfHYJY~-abHwzv z*8JojjPC2EuCnJm>arfpa&0c9Hykt#Re1T`+4sXy#D&VWc*qA#0>JvllhL?(LT~WM z^?Z5q%USE&-UaVRHvp&zF2mtK@@_C>+y_PZ>9#UhuWz8y$z{URf^iB%uEQ+&#;UPr z;jyL6wt&Z8iWy4A2XS~gWV<&w?=p^Q@^FIlyuBaSO^WM+g{2&;!01_uBTB}Z6VANo z&QLkQ-;KD8?k5};*Q}s0Fv)^yYxhZ6s8V347DLzo*>f0@3f2&~9@|7=8v9fxJ=k;^ zO;1%VrLYYqKTA-+_4p{J5b+@F2I0e5A2grS%AdBm9=>#&e8@HFo zu`13LEj7Oj=3XSsDfbD^X$imD>t`L2&| zT^$caAh1oV+#6R$Zs-ZjFM1=NjTrK3)=`rvZxB&mQ?(ccdsL8fjKGGX>hbo=X-7%yV_B>HiIGX3wBoW(ps=u% z6%K(GCb-)A8j><)^K1YGf|;idaqkDnyH_c76XS%#peq|Bu?mu5Bof6%oe~?j%D;dw hpRwb{0EPuGUosQ literal 0 HcmV?d00001 diff --git a/kv/routers/__pycache__/payment.cpython-39.pyc b/kv/routers/__pycache__/payment.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b010da98fda398452fb80d236357016355296e37 GIT binary patch literal 2281 zcmbtVO>Y}F5M8dmWqn(=q*!s1<`4*IZ1mDYQ4|f_i-9&UtfB=30mfP!yDRT%H{{BJ zg!GhN`wwzR4m}ts`h$4wsehrT&WvPvE$^ie1yY>h$3<`d6P-Hvf zZTY1^Nmx*LZw<;&9#>=*N+8D7jwN%y+fanedvPHkC-WbKEXd+-Xb)4o zwHGnoTVgu$5o5X>agQTDeh_hgiSEkBjDEuCeMUchfPS__Kao!v{h1VftM}|5y2sZ& zVX~JHoyl|T<@%tt8%%n(DZDy4J`JW3D3kjRLYPR6fb{pSj^?#Pn&Af%n4Lwl5NM>L zK!?FZ1NtR+=&|Mb2t~0fHuh3jkFe?*Hjyx_>t4#FM`|if<;0o! zFo}M0;cXuxQ(ar}##Sgt%cP|fIX9N7qVey`qpyac3dS&s^iYGkc1Q5i3B%#l^-%F% z^e|k+JqTy2gmb9sG&Yu966~4Rd3SFEbp>j%z5lljRlsPyl%j{Dwy-fZA|DT^$}~ot z7Y&_;s$ZVYVCXU$TM#FFlR?�d0VJY zf?%0eu(On@K%v@w>*4M05YY!~s3uNbzv5l=y}+t@L0geMFCS{>8g3(O#-$Vwl}Mq5 zOMV`sK=!Y$S{5bjfc9zS+j#c`HC`}$z3=)aza;; zkQ99*O%@ZSJGoR@HWt~)q)EB6is8aFi_Y*WOP9Y5Gc*qrNUQcMlLK% zt8|-wK^7^{F8mq&joEh9U+5;icPQJkB%>&TQW$dP&f(m1pOjZF7Yw-m`2D>1&M}NX zaWQ*kVevH#(IbXI4N3wdBrYN8+zc(((sMJg!;G8Jb1TS(j_c^T9pu8in-2?aL9a7G zF)XS}+n~;ClNDIz6*(hpl{qx`#-w>#_!%T_Rbz`9TU&xH z0k%vl8oQ>kD;m500CtsDHFiT|YZ_aB0J}!lHFi^DH#Bx@0lN*1>u)T&Nw+k52hh88 zTcaCuXfoIX^bT;|r45bVr=)E(_x?ifA2*50o-^5{J(xLdCWIeHO;hEcJUeG^?ZUHNnZTNTbk5=Vk{!G$JdB!BSPPi-buafU$C z;yE~o=i#Po>Phd~;485B`}3z?bP^s9SYL{cVEn@Gv(LOF>Abk;aBZ9DBvS=ms^B2G zkZ38GWR!mO~zO;|s=HS4W3)>?UAzbwR3${Z}V&EEce=2oH{AR2faa z)qZX9DsG|Cyn;8hIK8dn41J5^&InwMKGa4`eF3psU^{t#rX^&0qk^v?n>ljpAlte} z4ke?#X^I~Qlhost;b6o_~~~{o?a&G@zr!PfjDBY zlrt5i8G)s6b7f$1TNaOCfn_l^#)OjB=ERcbzj*PolKua@f8}xhvL+Czk+QfdB#o|EusII+q z=0{%C_r0JyEhi`lhqISMCgi`A0eb#^FOb&2J~Mn{Z2m@mfsU1yL}td64K!szC*Opl z)YfyB#9W@9e0#%b+Cm^0I{>%AP}2NB6<%B%Or4zSa6o`frrSfTTJ z9^^juJXH}d124d^Tpq+c=tl}$U7vcNd?XfBqA zY0qsl4o>z*(3~wllDa>s+9|ZA6X;BLySfXgkLM0KJplyvLNSBH0#uDT|PuPIwzE!#1QrdzBQkdN0Bc%x^<>A=pKQ+OXa?VPslJ}U%@{CLtxI8 TNcvlaXEswKJ9DE^sF8mFT~7qh literal 0 HcmV?d00001 diff --git a/kv/routers/__pycache__/reference.cpython-39.pyc b/kv/routers/__pycache__/reference.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0463c831d559d523f0f83ed17ed0e461a14107c5 GIT binary patch literal 8089 zcmcgxJ9it$6~+P}z!xYId_P1|6!m}}q-5(YSr$#oHe*X-M9Gd3Cdd*qB$vWsq1h#Q zxFIX0N#T7~{%xFh z^0qhHhQ`yZ<2#LYvaVl2J>N^nZbJ4&kXgWHzKgRSc8ak5gzY8lKm_Y+?PFO&4id7T zkV8u302?IaFd>H;=p1Gvgd8E{C?Q9cI>*>JA;$@-&+y3ggj5k4+wcdiTse=Aml|t-XvsBiM+*b6Y>%v?=_|H_^-&75c0RdQ0yLfII*|dLF}D&s2u>+BkgG}E)e7mDmyufiwt^_B~f`9O!f%er&TeQ_2*(zFeE-BEuywu7<%}R&lZBSzeSp0?ACO3K6f%!2jdf8~f`bTiSRT`ChY8qHPMrOyy zJ4)Qs#B1F$O0a-&WwOz!_~PWzE_q&MY6o&j=SAYJJIM_EAFb_D0n|BG;>Hzna2 zAon~%7-jCHzw#W;Hlw^*U>t8^`*{C0ecqj>$4$;qhOe5fWE~rz6p!oBD=FVYrZRSqH-l$yuEmc zElNV}QDIZJTckH2(L2_r58Dt8r(HfSfN>-?3brCr1g;=2^I81`E!9Eiu@Q_=du?dMVDu)$5hX$76X+6_wb3FqigD`HDH)+3_v;WN zl(-Y}UfX~;4B{e);9BH0E-h+Qsgm6l;PRUgJCwM?#Lm%$v9VznDpqBuMD*VKB7m@u zfh&o(%>jeog*c()y}K4y;j0rn_`TeL+ehPta9F^7-P*40#U+q6DJjfD_wQs1 z0wqDLp)&^Yc&kJx)(ELmGPwr*{xQS^CBc2Gvt1o>4h%d2T@<&D;$B+t*E<}X4UFbP z?kuh|-q{pVW3)*b0?ZM_S7V{TG|3r6%@{mHTvLzk+ZP* zEDOPQ0f)c2d7M3&Xic}0E5=oSmAGQvotC*$(Hq(?{1zoiZhxyU_dJB{oX9&_DD2g2xB=Vq!Ny>E{a%Tzn z#OtwNm-G^*{r2Z9VG2Cuy!3`{J9@!0eUGog1|8oX{z`MOfLa@%^QoPKI~O; zkPMd#%3ykZ&-~dVEW4IS|yA5 z8htW>X(Vq@k^nDAAK}LW(>Fjg(6<;QZln$|)gdrZ;Eg{y&Jh4LND=HyuxUh$)F{7v zxx6GbV}LAX5R(Nd#hFqo#(G}n*>CV%d&2vJhNyt8~ZJ)Oy))3uTe;2J$AJ1eebe1+4!MNAUvAA3o6ip?+kEx%i!VY4ZiT*vz24-j5Oh~Zms<%05RoBS?ge$ab+R+~tkRNA%w005^iF#rGn literal 0 HcmV?d00001 diff --git a/kv/routers/__pycache__/report.cpython-39.pyc b/kv/routers/__pycache__/report.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..507159ffa8eb15b7f04a51656c8469d88aba54e8 GIT binary patch literal 696 zcmZWn&59F25bo~z%S?VYMi6|20gZPNQP#_X1WCZdFtBvewQ;i3GrirNNF<(iufBl? zJ$UeSJV{?Y`3jz_p2)Ib4fV@Z*Y{O79}Y8u^7Gqz`GXSj%O`gw!sG?2xj`d{pf!=S zp!66s85BVmvpSSf5p{7;$1*9BE)MISOp8=zMb_m}-Is%6KnbMRq!_|*GZHZjfNoA6 z5|MmjkU?}!FDO>Vkci%ACQ^~zV6C_(=z`?^--v|Fa_ZtW*mJSOC|Q6pRompur7z!{ z&D*U7?UGlZpb-Xt2wzvme#o9^P<$_;u~-{vFsf|~oXb`~jlGG6t1TGom{_iuAM;NF z^daggs+pj%WJABO13i$h>?1oc#6@R$;KG&O3OAgCYPEe^!TSYR*Y9wG2?DvYf1xpSFPYNSE{_+mAWHjN`#N+PSxI}w@e1uY&g*+2OvZcFM5V7KYMj@7B5ra(tZvJESNxm^)e9Y zrhBAza7bdFj;29~pi#O`Kp|=zL=rCqjG~x9xHY8B;bI9Ql?EG640Y&kC?ESkj&X__ znv~4xXXBDyk}t-9Z0Tvwl-7hVnLIethrQ5ey$#^~08-hxr3zlcTwB8H`1PBpIHshFtR#!;DErq@S$0s-=ok=xPleZw~iK0~>{SAOAv%S1@nS zm4kl{o+&_+hX?HJ9GtK_`nK)or~FRqD<`8~HSPi@NUX rVniY8FN$%lSxS3cbxf8X*`Fi@j=aDgNbd*`Rk>6`1rfwy6)D=Rr|G7<>#gksrRuFb214zD zLte>OPVfkv7&}ml>~ z_mAG6eBdhuLWgglgO*85@ZMHZT_uN2aRD=_xM=y-(V>9L6-cEWHZO55_sd`p?HElC z&?&N{x6U=aCU?$+Z0Tv{YOfS4riUL_qJ6gp@u`B(6Hq$dyF-L{c1wgQ@q2vyeA)@V zgi^_=1hKA4cvf`X^kO{~R!`xmN7X4Nc+*-2vJ^8HQ(%b#$>F%kmtWLhA4yV9-p(UZG=TtWd?g zz-~z>?i?wAXR`RnbHV-tv>S uQg$LbKH5#fMvS<<2F%=r=|cBjG@Pw!ctw%PC+HHo`$o72evdx&dh`#^2*M@+ literal 0 HcmV?d00001 diff --git a/kv/routers/__pycache__/withdrawing.cpython-39.pyc b/kv/routers/__pycache__/withdrawing.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0aa84a41c8c459678f3e39f5b2a9fbed9dd5aac2 GIT binary patch literal 1413 zcmbtUJ8#=C5GG~W^84+)5TLV%Cg@reMT>L^Py|ICw18m1kj+aXN3s-Bb`T?-(zX8} zLo#&8FX(^a+Npb|PQ9bkL`}Sf#?g1=N8anByh^3WaQyy$IQ(HV_LGeC$fEHEMKR8p zV1frMneZ__(&tg!9dUB4jW40S8CqFS#g);#aiYIwBjQWRT4VNIq^Mx_oJgil`cN+n{R( z-FbvwxkcAS!=P88a@7#cYkudOkJoN7EzvfZb-{bA+xbPc+3RwhJA`B)hNw9`P|A-c zT}v0uRzZH5j^+exPLtBOOu=Gr?S|J&tw_Tktie( zV^*1)mHFzn!i*)vkxT{$et=~e1Xzk2OFI%yrl1nze?;m18>G`UCRGaPHdT(vT0JHU zxYW%^BCRapq*sx`U zo;S9YH-j`;o)%91;dM(xX`}0BsZhx7Zs_9iY)g%fAoP@W?i5@kwwXrg5?aKep@)Q_ z+Ulx03A}(#ooz)jl*C@`9C#}6Vqa2&C4E_R4j%!&1(`F(f?qm=)zcd(8t>Cf>4EgU zz@LLO^wM@5ssCX+M=(0Rhv|0e3bVI6@e|W@y`I|I$KIq)wH|DlL(~>sOYQWqL6Rzz o;uz6Y647-26+Y!@0I%s4t4*BBeDSN}e=ghPYxySMv`O;(FJ#wU=Kufz literal 0 HcmV?d00001 diff --git a/kv/routers/accrual.py b/kv/routers/accrual.py new file mode 100644 index 0000000..780a124 --- /dev/null +++ b/kv/routers/accrual.py @@ -0,0 +1,13 @@ +import kv.schemas as schemas +import kv.crud as crud +from sqlalchemy.orm import Session +from fastapi import APIRouter, Depends +from kv.database import get_db +router = APIRouter() + +"""get""" + + +@router.get("/get_municipals") +def get_municipals(db: Session = Depends(get_db)): + return crud.AccrualViewSet.get_municipals(db) diff --git a/kv/routers/address.py b/kv/routers/address.py new file mode 100644 index 0000000..b176750 --- /dev/null +++ b/kv/routers/address.py @@ -0,0 +1,65 @@ +import kv.schemas as schemas +import kv.crud as crud +from kv.database import get_db +from sqlalchemy.orm import Session +from fastapi import APIRouter, Depends +from typing import List + +router = APIRouter() + +"""get""" + + +@router.get("/get_details/{id}", response_model=List[schemas.AddressDetailsSerializer]) +def get_details(id: int, db: Session = Depends(get_db)): + data = crud.AddressInfoViewSet.get_details(db, id) + return data + + +@router.get("/get_personal_accounts/{IDCity}", response_model=List[schemas.PersonalAccountSerializer]) +def get_personal_accounts(IDCity: int, db: Session = Depends(get_db)): + data = crud.AddressInfoViewSet.get_personal_accounts( + db, IDCity=IDCity) + return data + + +@router.get("/get_addresses/{IDCity}", response_model=List[schemas.AddressesSerializer]) +def get_addresses(IDCity: int, db: Session = Depends(get_db)): + data = crud.AddressInfoViewSet.get_addresses(db, IDCity) + return data + + +@router.get("/get_address_personal_accounts/{IDAddress}", response_model=List[schemas.AddressPersonalAccounts]) +def get_address_personal_accounts(IDAddress: int, db: Session = Depends(get_db)): + data = crud.AddressInfoViewSet.get_address_personal_accounts(db, IDAddress) + return data + + +@router.get("/retrieve/{id}", response_model=List[schemas.AddressDetailInfoSerializer]) +def retrieve(id: int, db: Session = Depends(get_db)): + data = crud.AddressInfoViewSet.retrieve(db, id) + return data + + +@router.get("/get_metering_devices/{IDAddress}", response_model=List[schemas.AddressMeteringDevices]) +def get_metering_devices(IDAddress: int, db: Session = Depends(get_db)): + data = crud.AddressInfoViewSet.get_metering_devices(db, IDAddress) + return data + + +"""post""" + + +@router.post('/edit') +def edit(request: schemas.EditAdressInit, db: Session = Depends(get_db)): + return crud.AddressInfoViewSet.edit(db, request) + + +@router.post('/edit_personal_account') +def edit_personal_account(request: schemas.PersonalAccountDetailsSerializer, db: Session = Depends(get_db)): + return crud.AddressInfoViewSet.edit_personal_account(db, request) + + +@router.post('/edit_personal_account') +def edit_personal_account(request: schemas.PersonalAccountDetailsSerializer, db: Session = Depends(get_db)): + return crud.AddressInfoViewSet.edit_personal_account(db, request) diff --git a/kv/routers/objectvs.py b/kv/routers/objectvs.py new file mode 100644 index 0000000..eb7be97 --- /dev/null +++ b/kv/routers/objectvs.py @@ -0,0 +1,62 @@ +import kv.schemas as schemas +import kv.crud as crud +from kv.database import get_db +from sqlalchemy.orm import Session +from fastapi import APIRouter, Depends +from typing import List +router = APIRouter() + +"""get""" + + +@router.get("/get_details/{IDObject}", response_model=List[schemas.ObjectDetailsSerializer]) +def get_details(IDObject: str, db: Session = Depends(get_db)): + data = crud.ObjectViewSet.get_details(db, IDObject) + return data + + +@router.get("/get_municipals/{IDCity}", response_model=List[schemas.ObjectMunicipalsSerializer]) +def get_municipals(IDCity: int, db: Session = Depends(get_db)): + data = crud.ObjectViewSet.get_municipals(db, IDCity) + return data + + +@router.get("/get_services/{IDObject}", response_model=List[schemas.ObjectServicesSerializer]) +def get_services(IDObject: str, db: Session = Depends(get_db)): + data = crud.ObjectViewSet.get_services(db, IDObject) + return data + + +@router.get("/get_addresses/{IDObject}", response_model=List[schemas.ObjectAddressesSerializer]) +def get_addresses(IDObject: str, db: Session = Depends(get_db)): + data = crud.ObjectViewSet.get_addresses(db, id) + return data + + +@router.get("/get_metering_devices/{IDObject}", response_model=List[schemas.ObjectMeteringDevicesSerializer]) +def get_metering_devices(IDObject: str, db: Session = Depends(get_db)): + data = crud.ObjectViewSet.get_metering_devices(db, IDObject) + return data + + +"""post""" + + +@router.post('/edit') +def edit(request: schemas.ObjectDetailsSerializer, db: Session = Depends(get_db)): + return crud.ObjectViewSet.edit(db, request) + + +@router.post('/edit_service') +def edit_service(request: schemas.EditObjectServiceInit, db: Session = Depends(get_db)): + return crud.ObjectViewSet.edit_service(db, request) + + +@router.post('/edit_temp_metering_device_address') +def edit_temp_metering_device_address(request: schemas.EditTempMeteringDeviceAddressInit, db: Session = Depends(get_db)): + return crud.ObjectViewSet.edit_temp_metering_device_address(db, request) + + +@router.post('/add_object') +def add_object(request: schemas.AddObjectInit, db: Session = Depends(get_db)): + return crud.ObjectViewSet.add_object(db, request) diff --git a/kv/routers/payment.py b/kv/routers/payment.py new file mode 100644 index 0000000..bcfd778 --- /dev/null +++ b/kv/routers/payment.py @@ -0,0 +1,56 @@ +import kv.schemas as schemas +import kv.crud as crud +from kv.database import get_db +from sqlalchemy.orm import Session +from fastapi import APIRouter, Depends +from typing import List +router = APIRouter() + +"""get""" + + +@router.get("/get_money_types", response_model=List[schemas.MoneyTypesSerializer]) +def get_money_types(db: Session = Depends(get_db)): + data = crud.PaymentViewSet.get_money_types(db) + return data + + +@router.get("/get_worker_types", response_model=List[schemas.WorkerTypesSerializer]) +def get_worker_types(db: Session = Depends(get_db)): + data = crud.PaymentViewSet.get_worker_types(db) + return data + + +@router.get("/get_payer_category_types", response_model=List[schemas.PayerCategoryTypesSerializer]) +def get_payer_category_types(db: Session = Depends(get_db)): + data = crud.PaymentViewSet.get_payer_category_types(db) + return data + + +@router.get("/get_services_additional", response_model=List[schemas.ServicesAdditionalSerializer]) +def get_services_additional(db: Session = Depends(get_db)): + data = crud.PaymentViewSet.get_services_additional(db) + return data + + +"""post""" + + +@router.post('/get_receipt_calculate', response_model=List[schemas.ReceiptCalculatedSerializer]) +def get_receipt_calculate(request: schemas.RecieptCalculateInit, db: Session = Depends(get_db)): + return crud.PaymentViewSet.get_receipt_calculate(db, request) + + +@router.post('/save_receipt') +def save_receipt(request: schemas.ReceiptSaveInit, db: Session = Depends(get_db)): + return crud.PaymentViewSet.save_receipt(db, request) + + +@router.post('/repayment_info', response_model=List[schemas.RentRepaymentInfoSerializer]) +def repayment_info(request: schemas.RepaymentInfoInit, db: Session = Depends(get_db)): + return crud.PaymentViewSet.repayment_info(db, request) + + +@router.post('/repayment', response_model=List[schemas.RentRepaymentSerializer]) +def repayment(request: schemas.RepaymentInit, db: Session = Depends(get_db)): + return crud.PaymentViewSet.repayment(db, request) diff --git a/kv/routers/personalaccount.py b/kv/routers/personalaccount.py new file mode 100644 index 0000000..fd6af91 --- /dev/null +++ b/kv/routers/personalaccount.py @@ -0,0 +1,50 @@ +import kv.schemas as schemas +import kv.crud as crud +from kv.database import get_db +from sqlalchemy.orm import Session +from fastapi import APIRouter, Depends +from typing import List +router = APIRouter() + +"""get""" + + +@router.get("/get_details/{id}", response_model=List[schemas.PersonalAccountDetailsSerializer]) +def get_details(id: int, db: Session = Depends(get_db)): + data = crud.PersonalAccountViewSet.get_details(db, id) + return data + + +@router.get("/get_turn_over/{IDPersonalAccount}", response_model=List[schemas.TurnOverSerializer]) +def get_turn_over(IDPersonalAccount: int, db: Session = Depends(get_db)): + data = crud.PersonalAccountViewSet.get_turn_over(db, IDPersonalAccount) + return data + + +@router.get("/get_services/{IDPersonalAccount}", response_model=List[schemas.PersonalAccountTOServicesSerializer]) +def get_services(IDPersonalAccount: int, db: Session = Depends(get_db)): + data = crud.PersonalAccountViewSet.get_services(db, IDPersonalAccount) + return data + + +@router.get("/get_debt/{IDPersonalAccount}", response_model=List[schemas.PersonalAccountDebtSerilizer]) +def get_debt(IDPersonalAccount: int, db: Session = Depends(get_db)): + data = crud.PersonalAccountViewSet.get_debt(db, IDPersonalAccount) + return data + + +@router.get("/get_debts/IDPersonalAccount={IDPersonalAccount},GetType={GetType}", response_model=List[schemas.PersonalAccountDebtsSerializer]) +def get_debts(IDPersonalAccount: int, GetType: bool, db: Session = Depends(get_db)): + to_data = schemas.PersonalAccountType( + IDPersonalAccount=IDPersonalAccount, GetType=GetType) + data = crud.PersonalAccountViewSet.get_debts(db, to_data) + return data + + +"""post""" + + +@router.post("/get_financial_account", response_model=List[schemas.ReportTOFinancialAccount]) +def get_financial_account(request: schemas.PersonalAccountInit, db: Session = Depends(get_db)): + data = crud.PersonalAccountViewSet.get_financial_account(db, request) + return schemas.ReportTOFinancialAccount(**data) diff --git a/kv/routers/reference.py b/kv/routers/reference.py new file mode 100644 index 0000000..1493330 --- /dev/null +++ b/kv/routers/reference.py @@ -0,0 +1,213 @@ +import kv.schemas as schemas +from kv.crud import ReferenceViewSet +from kv.database import get_db +from sqlalchemy.orm import Session +from fastapi import APIRouter, Depends +from typing import List +router = APIRouter() + +"""get""" + + +@router.get("/get_personal_accounts", response_model=List[schemas.PersonalAccountsSerializer]) +def get_personal_accounts(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_personal_accounts(db) + return data + + +@router.get("/get_objects/{IDCity}", response_model=List[schemas.ObjectsSerializer]) +def get_objects(IDCity: int, db: Session = Depends(get_db)): + inn = schemas.CityInit(IDCity=IDCity) + data = ReferenceViewSet.get_objects(db, inn) + return data + + +@router.get("/get_services", response_model=List[schemas.CommonTypeSerializer]) +def get_services(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_services(db) + return data + + +@router.get("/get_provider_types", response_model=List[schemas.ProviderTypeSerializer]) +def get_provider_types(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_provider_types(db) + return data + + +@router.get("/get_providers", response_model=List[schemas.CommonTypeSerializer]) +def get_providers(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_providers(db) + return data + + +@router.get("/get_systems_water", response_model=List[schemas.SystemWater]) +def get_systems_water(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_systems_water(db) + return data + + +@router.get("/get_systems_water_period_types", response_model=List[schemas.SystemWaterPeriodType]) +def get_systems_water_period_types(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_systems_water_period_types(db) + return data + + +@router.get("/get_provider_contracts/{IDPersonalAccount}", response_model=List[schemas.ProviderContractSerializer]) +def get_provider_contracts(IDPersonalAccount: int, db: Session = Depends(get_db)): + inn = schemas.PAInit(IDPersonalAccount=IDPersonalAccount) + data = ReferenceViewSet.get_provider_contracts(db, inn) + return data + + +@router.get("/get_providers_utility_services/{IDCity}", response_model=List[schemas.CommonTypeSerializer]) +def get_providers_utility_services(IDCity: int, db: Session = Depends(get_db)): + inn = schemas.CityInit(IDCity=IDCity) + data = ReferenceViewSet.get_providers_utility_services(db, inn) + return data + + +@router.get("/get_management_companies", response_model=List[schemas.ManagementCompanySerializer]) +def get_management_companies(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_management_companies(db) + return data + + +@router.get("/get_boilers_by_city/{IDCity}", response_model=List[schemas.CommonTypeUUIDSerializer]) +def get_boilers_by_city(IDCity: int, db: Session = Depends(get_db)): + inn = schemas.CityInit(IDCity=IDCity) + data = ReferenceViewSet.get_boilers_by_city(db, inn) + return data + + +@router.get("/get_streets_by_city/{IDCity}", response_model=List[schemas.CommonTypeSerializer]) +def get_streets_by_city(IDCity: int, db: Session = Depends(get_db)): + inn = schemas.CityInit(IDCity=IDCity) + data = ReferenceViewSet.get_streets_by_city(db, inn) + return data + + +@router.get("/get_metering_devices_services", response_model=List[schemas.ServicesSerializer]) +def get_metering_devices_services(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_metering_devices_services(db) + return data + + +@router.get("/get_owhership_types", response_model=List[schemas.OwnershipType]) +def get_owhership_types(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_owhership_types(db) + return data + + +@router.get("/get_object_improvement_degree_types", response_model=List[schemas.ImprovementDegreeSerializer]) +def get_object_improvement_degree_types(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_object_improvement_degree_types(db) + return data + + +@router.get("/get_object_gas_types", response_model=List[schemas.CommonTypeSerializer]) +def get_object_gas_types(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_object_gas_types(db) + return data + + +@router.get("/get_object_heating_types", response_model=List[schemas.CommonTypeSerializer]) +def get_object_heating_types(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_object_heating_types(db) + return data + + +@router.get("/get_object_wiring_types", response_model=List[schemas.CommonTypeSerializer]) +def get_object_wiring_types(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_object_wiring_types(db) + return data + + +@router.get("/get_object_overlapping_types", response_model=List[schemas.CommonTypeSerializer]) +def get_object_overlapping_types(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_object_overlapping_types(db) + return data + + +@router.get("/get_object_wall_material_types", response_model=List[schemas.CommonTypeSerializer]) +def get_object_wall_material_types(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_object_wall_material_types(db) + return data + + +@router.get("/get_object_roof_types", response_model=List[schemas.CommonTypeSerializer]) +def get_object_roof_types(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_object_roof_types(db) + return data + + +@router.get("/get_object_foundation_types", response_model=List[schemas.CommonTypeSerializer]) +def get_object_foundation_types(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_object_foundation_types(db) + return data + + +@router.get("/get_tariffs_population", response_model=List[schemas.CommonTypeSerializer]) +def get_tariffs_population(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_tariffs_population(db) + return data + + +@router.get("/get_tariffs_population", response_model=List[schemas.CommonTypeSerializer]) +def get_tariffs_population(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_tariffs_population(db) + return data + + +@router.get("/get_courts_types", response_model=List[schemas.CommonTypeSerializer]) +def get_courts_types(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_courts_types(db) + return data + + +@router.get("/get_address_types", response_model=List[schemas.CommonTypeSerializer]) +def get_address_types(db: Session = Depends(get_db)): + data = ReferenceViewSet.get_address_types(db) + return data + + +"""post""" + + +@router.post('/get_advanced_search', response_model=List[schemas.AdvancedSearchSerializer]) +def get_advanced_search(request: schemas.AdvancedSearchInit, db: Session = Depends(get_db)): + return ReferenceViewSet.edit(db, request) + + +@router.post('/get_metering_devices_types', response_model=List[schemas.MeteringDeviceTypeSerializer]) +def get_metering_devices_types(request: schemas.ServiceIDInit, db: Session = Depends(get_db)): + return ReferenceViewSet.get_metering_devices_types(db, request) + + +@router.post('/get_object_metering_devices_types', response_model=List[schemas.CommonTypeSerializer]) +def get_object_metering_devices_types(request: schemas.ObjectMeteringDevicesTypesInit, db: Session = Depends(get_db)): + return ReferenceViewSet.get_object_metering_devices_types(db, request) + + +@router.post('/get_object_metering_device_addresses', response_model=List[schemas.ObjectMeteringDeviceAddressesSerializer]) +def get_object_metering_device_addresses(request: schemas.AdvancedSearchInit, db: Session = Depends(get_db)): + return ReferenceViewSet.get_object_metering_device_addresses(db, request) + + +@router.post('/get_object_water_system_volumes', response_model=List[schemas.CommonTypeSerializer]) +def get_object_water_system_volumes(request: schemas.TariffsPopulationInit, db: Session = Depends(get_db)): + return ReferenceViewSet.get_object_water_system_volumes(db, request) + + +@router.post('/get_tariff_population', response_model=List[schemas.TariffPopulationSerializer]) +def get_tariff_population(request: schemas.AdvancedSearchInit, db: Session = Depends(get_db)): + return ReferenceViewSet.get_tariff_population(db, request) + + +@router.post('/get_object_tariff_provider', response_model=List[schemas.TariffProviderSerializer]) +def get_object_tariff_provider(request: schemas.TariffProviderInit, db: Session = Depends(get_db)): + return ReferenceViewSet.get_object_tariff_provider(db, request) + + +@router.post('/edit_metering_device') +def edit_metering_device(request: schemas.MeteringDeviceInit, db: Session = Depends(get_db)): + return ReferenceViewSet.edit_metering_device(db, request) diff --git a/kv/routers/report.py b/kv/routers/report.py new file mode 100644 index 0000000..6d2bd8f --- /dev/null +++ b/kv/routers/report.py @@ -0,0 +1,15 @@ +import kv.schemas as schemas +import kv.crud as crud +from kv.database import get_db +from sqlalchemy.orm import Session +from fastapi import APIRouter, Depends +from typing import List +router = APIRouter() + +"""post""" + + +@router.post("/repayment", response_model=List[schemas.RentRegisterNotices]) +def repayment(request: schemas.RentRegisterNoticeInit, db: Session = Depends(get_db)): + data = crud.ReportViewSet.get_details(db, request) + return data diff --git a/kv/routers/reportfilter.py b/kv/routers/reportfilter.py new file mode 100644 index 0000000..3eae7b8 --- /dev/null +++ b/kv/routers/reportfilter.py @@ -0,0 +1,24 @@ +import kv.schemas as schemas +import kv.crud as crud +from kv.database import get_db +from sqlalchemy.orm import Session +from fastapi import APIRouter, Depends +from typing import List +router = APIRouter() + +"""post""" + + +@router.post('/get_report_filter_types', response_model=List[schemas.ReportFilterTypeSerializer]) +def get_report_filter_types(request: schemas.UserInit, db: Session = Depends(get_db)): + return crud.ReportFilterViewSet.get_report_filter_types(db, request) + + +@router.post('/get_report_filtered_list', response_model=List[schemas.ReportFilterListSerializer]) +def get_report_filtered_list(request: schemas.ReportFilterInit, db: Session = Depends(get_db)): + return crud.ReportFilterViewSet.get_report_filtered_list(db, request) + + +@router.post('/set_report_filter_list', response_model=List[schemas.ReportFilterListSerializer]) +def set_report_filter_list(request: schemas.ReportFilterSetInit, db: Session = Depends(get_db)): + return crud.ReportFilterViewSet.set_report_filter_list(db, request) diff --git a/kv/routers/turnover.py b/kv/routers/turnover.py new file mode 100644 index 0000000..34b419d --- /dev/null +++ b/kv/routers/turnover.py @@ -0,0 +1,19 @@ +import kv.schemas as schemas +import kv.crud as crud +from kv.database import get_db +from sqlalchemy.orm import Session +from fastapi import APIRouter, Depends +from typing import List +router = APIRouter() + +"""post""" + + +@router.post('/make_storno') +def make_storno(request: schemas.StronoInit, db: Session = Depends(get_db)): + return crud.TurnOverViewSet.make_storno(db, request) + + +@router.post('/get_to_archive') +def get_to_archive(request: schemas.ArchiveInit, db: Session = Depends(get_db)): + return crud.TurnOverViewSet.get_to_archive(db, request) diff --git a/kv/routers/withdrawing.py b/kv/routers/withdrawing.py new file mode 100644 index 0000000..a1ba5fb --- /dev/null +++ b/kv/routers/withdrawing.py @@ -0,0 +1,33 @@ +import kv.schemas as schemas +import kv.crud as crud +from kv.database import get_db +from sqlalchemy.orm import Session +from fastapi import APIRouter, Depends +from typing import List +router = APIRouter() + +"""get""" + + +@router.get("/get_withdrawing_types", response_model=List[schemas.WithdrawingTypesSerializer]) +def get_withdrawing_types(db: Session = Depends(get_db)): + data = crud.WithdrawingViewSet.get_withdrawing_types(db) + return data + + +"""post""" + + +@router.post('/set_report_filter_list', response_model=List[schemas.WithdrawingCheckSerializer]) +def set_report_filter_list(request: schemas.WithdrawingCheckInit, db: Session = Depends(get_db)): + return crud.WithdrawingViewSet.set_report_filter_list(db, request) + + +@router.post('/get_withdrawing_temp', response_model=List[schemas.WithdrawingTempSerializer]) +def get_withdrawing_temp(request: schemas.WithdrawingTempInit, db: Session = Depends(get_db)): + return crud.WithdrawingViewSet.get_withdrawing_temp(db, request) + + +@router.post('/save_withdrawing') +def save_withdrawing(request: schemas.WithdrawingSave, db: Session = Depends(get_db)): + return crud.WithdrawingViewSet.save_withdrawing(db, request) diff --git a/kv/schemas.py b/kv/schemas.py new file mode 100644 index 0000000..780d4bf --- /dev/null +++ b/kv/schemas.py @@ -0,0 +1,797 @@ +from decimal import Decimal +from pydantic import BaseModel +from typing import Optional, List +from datetime import date, datetime + + +class AddObjectInit(BaseModel): + IDCity: int + IDStreet: int + Number: Optional[str] + + +class AdvancedSearchSerializer(BaseModel): + IDPersonalAccount: int + IDAddress: int + RegionName: Optional[str] = None + CityName: Optional[str] = None + Address: Optional[str] = None + AccountType: Optional[str] = None + FullName: Optional[str] = None + + +class SettingsSerializer(BaseModel): + CurrentYear: int + CurrentMonth: int + CurrentMonthName: str + + +class ServiceIDInit(BaseModel): + IDService: int + + +class UserInit(BaseModel): + IDUser: int = 1 + + +class AccountInit(BaseModel): + IDAccount: int + + +class CityInit(BaseModel): + IDCity: int + + +class AdvancedSearchInit(AccountInit, CityInit): + LastName: Optional[str] = None + FirstName: Optional[str] = None + Patronymic: Optional[str] = None + + +class ReportFilterInit(UserInit): + IDFilterType: int + + +class ReportFilterSetInit(ReportFilterInit): + IDFilterObject: int + + +class WithdrawingCheckSerializer(BaseModel): + IDGetType: int + + +class RentRegisterNoticeInit(BaseModel): + IDUser: int = 1 + IDCashbox: int = 1 + IsRepayment: bool + DateBegin: date + DateEnd: date + + +class ObjectMeteringDeviceAddressInit(BaseModel): + IDUser: int = 1 + IDCashbox: int = 1 + IDObject: int + IDAddress: int + + +class DateInit(BaseModel): + DateBegin: date + DateEnd: date + + +class CashboxInit(UserInit): + IDCashbox: int = 1 + + +class PAInit(BaseModel): + IDPersonalAccount: int + + +class PersonalAccountInit(CashboxInit): + IDPersonalAccount: int + + +class GetTypeInit(BaseModel): + GetType: bool + + +class PersonalAccountType(PersonalAccountInit, GetTypeInit): + pass + + +class PersonalAccount(BaseModel): + IDPersonalAccount: int + + +class ObjectInit(BaseModel): + IDObject: str + + +class TariffProviderInit(ObjectInit): + IDTariffPopulation: int + + +class ObjectMeteringDevicesTypesInit(GetTypeInit, ServiceIDInit, ObjectInit): + pass + + +class WithdrawingTempInit(CashboxInit, GetTypeInit): + pass + + +class WithdrawingCheckInit(PersonalAccountInit, GetTypeInit, DateInit): + pass + + +class WithdrawingSave(PersonalAccountInit, WithdrawingCheckSerializer, DateInit): + IDWithdrawingType: int + WitdrawingNumber: int + IDProviderContract: int + IDManagementCompany: int + + +class RepaymentInfoInit(BaseModel): + IDCashbox: int + IDMoneyType: int + + +class RepaymentInit(RepaymentInfoInit): + IDRepaymentType: int + RepaymentNumber: int + RepaymentDate: date + + +class RecieptCalculateInit(PersonalAccountInit): + IDType: int + Amount: float + AmountFine: float + + +class ReceiptSaveInit(RecieptCalculateInit): + IDDebtContract: int + IDService: int + DateBegin: date + DateEnd: date + IDMoneyType: int + Note: Optional[str] = None + + +class StronoInit(PersonalAccountInit): + ReceiptNumber: Optional[str] + + +class ArchiveInit(BaseModel): + GetTypeName: Optional[str] + GetAdditType: int + IDAddress: int + + +class EditTempMeteringDeviceAddressInit(BaseModel): + IDUser: int + IDCashbox: int + IDAddress: int + IsChecked: bool + + +class PersonalAccountReportTOFinancialInit(PersonalAccountInit): + Month: int + vid: int + IsAUP: bool + + +class ServicesSerializer(BaseModel): + ID: int + Name: Optional[str] = None + + +class MeteringDeviceTypeSerializer(BaseModel): + ID: int + Name: Optional[str] = None + + +class PersonalAccountSerializer(BaseModel): + IDAddress: int + IDTenants: int + IDWorker: Optional[int] = None + Address: Optional[str] = None + ObjectStreetName: Optional[str] = None + ObjectNumber: Optional[str] = None + ObjectCorp: Optional[str] = None + ObjectType: Optional[str] = None + AddressNumber: Optional[str] = None + IDAccount: int + FullName: Optional[str] = None + + +class PersonalAccountDetailsSerializer(BaseModel): + ID: int + IDAddress: int + IDTenants: int + IDWorker: int + LastName: Optional[str] = None + FirstName: Optional[str] = None + Patronymic: Optional[str] = None + Note: Optional[str] = None + PassportSerialNumber: Optional[str] = None + PassportNumber: Optional[str] = None + PassportIssueBy: Optional[str] = None + PassportIssueDate: Optional[date] = None + PassportRegistrationPlace: Optional[str] = None + PassportRegistrationDate: Optional[date] = None + + +class AddressesSerializer(BaseModel): + IDAddress: int + Address: Optional[str] = None + + +class ObjectsSerializer(BaseModel): + IDObject: str + Address: Optional[str] = None + StreetName: Optional[str] = None + Number: Optional[str] = None + Corp: Optional[str] = None + + +class AddressPersonalAccounts(BaseModel): + ID: int + IDTenants: int + IDWorker: int + LastName: Optional[str] = None + FirstName: Optional[str] = None + Patronymic: Optional[str] = None + + +class EditPersonalAccountAddressInit(BaseModel): + IDAddress: int + CadastralNumber: Optional[str] = None + Privatization: bool + Area: float + AreaOwned: float + AreaAdditional: float + AreaAboveNormal: float + RoomsNumber: int + PeopleNumber: int + PeopleWithoutReg: int + PeopleAway: int + PeopleDependents: int + MeteringDeviceHeating: bool + MeteringDeviceHotWater: bool + MeteringDeviceColdWater: bool + + +class AddressDetailInfoSerializer(BaseModel): + IDAddress: int + CadastralNumber: Optional[str] = None + Privatization: bool + Area: float + AreaOwned: float + AreaAdditional: float + AreaAboveNormal: float + AreaAboveNormal2: float + ODNPersent: float + ODN: float + ODNArea: float + AddressAdditArea: float + RoomsNumber: int + PeopleNumber: int + PeopleWithoutReg: int + PeopleAway: int + PeopleDependents: int + MeteringDeviceHeating: bool + MeteringDeviceHotWater: bool + MeteringDeviceColdWater: bool + IDFias: Optional[str] = None + FloorNumber: int + FullArea: float + ObjectMeteringDeviceHeating: bool + ObjectMeteringDeviceEl: bool + ObjectMeteringDeviceGas: bool + ObjectMeteringDeviceWater: bool + ActAvailabilityMeteringDeviceInstallAddressWater: bool + ActAvailabilityMeteringDeviceInstallObjectHeating: bool + ActAvailabilityMeteringDeviceInstallObjectWater: bool + StandartVolumeName: Optional[str] = None + MCompanyName: Optional[str] = None + BoilerName: Optional[str] = None + DirectControl: Optional[str] = None + ExecutorName: Optional[str] = None + + +class AddressDetailsSerializer(BaseModel): + ID: int + IDObject: str + IDType: int + IDImprovementDegree: int + CadastralNumber: Optional[str] = None + Number: Optional[str] = None + Privatization: bool + Area: float + AreaOwned: float + AreaAboveNormal: float + AreaAdditional: float + RoomsNumber: int + PeopleNumber: int + PeopleWithoutReg: int + PeopleAway: int + PeopleDependents: int + Glazing: bool + IDSystemHotWater: int + IDSystemHotWaterPeriodType: int + IDSystemColdWater: int + IDSystemColdWaterPeriodType: int + IDSystemSewerage: int + IDSystemSeweragePeriodType: int + IDStandartVolume: int + MeteringDeviceHeating: bool + MeteringDeviceHotWater: bool + MeteringDeviceColdWater: bool + ActAvailabilityMeteringDeviceInstallIDType: int + ActAvailabilityMeteringDeviceInstallHeating: bool + ActAvailabilityMeteringDeviceInstallWater: bool + + +class EditAdressInit(AddressDetailsSerializer): + ActionType: Optional[str] = None + + +class TurnOverSerializer(BaseModel): + AmountSaldoBegin: float + AmountAccrued: float + AmountSubsidy: float + AmountWithdrawing: float + AmountActualAccrued: float + AmountReceipt: float + AmountSaldoCorrect: float + AmountSaldoEnd: float + AmountTotalWithFine: float + + +class TOArchiveWithdrawingSerializer(BaseModel): + id: int + Number: int + Name: Optional[str] = None + Amount: Optional[str] = None + + +class TOArchiveReceiptSerializer(BaseModel): + id: int + Number: int + PaymentDate: datetime + RepaymentDate: datetime + DateBegin: date + DateEnd: date + IDMoneyType: int + MoneyTypeName: Optional[str] = None + Period: Optional[str] = None + Amount: float + AmountFine: float + + +class ReportTOFinancialAccount(BaseModel): + por: int + ServiceName: Optional[str] = None + ProviderName: Optional[str] = None + DateBegin: date + DateEnd: date + StandartVolume: float + TariffPopulation: float + TariffProvider: float + AmountSaldoBegin: float + AmountTotalAccrued: float + AmountAccruedSubsidy: float + AmountAccrued: float + AmountSubsidy: float + AmountWithdrawing: float + AmountActualAccrued: float + AmountReceipt: float + AmountSaldoCorrect: float + AmountAccruedPreferential: float + AmountSaldoEnd: float + + +class MoneyTypesSerializer(BaseModel): + ID: int + Name: Optional[str] = None + + +class WorkerTypesSerializer(BaseModel): + ID: int + Name: Optional[str] = None + + +class PayerCategoryTypesSerializer(BaseModel): + ID: int + Name: Optional[str] = None + + +class EditObjectServiceInit(BaseModel): + ActionType: Optional[str] = None + IDObject: str + IDService: int + IDCity: int + IDProviderContractOld: int + IDTariffPopulationOld: int + IDProviderContract: int + IDTariffPopulation: int + + +class TariffsPopulationInit(BaseModel): + IDObject: str + IDService: int + IDCity: int + IDProvider: int + + +class PersonalAccountTOServicesSerializer(BaseModel): + Rank: int + IDPersonalAccount: int + IDService: int + IDProviderContract: int + ServiceName: Optional[str] = None + ServiceSecondName: Optional[str] = None + ProviderName: Optional[str] = None + DateBegin: datetime + DateEnd: datetime + Spor: int + Por: int + IDTariffPopulation: int + Tariff: float + TariffProvider: float + StandartVolume: float + Volume: float + AmountSaldo: float + AmountAccrued: float + AmountSubsity: float + AmountWithdrawing: float + AmountActualAccrued: float + AmountReceipt: float + AmountAccruedSubsidy: float + AmountPrin: float + AmountFine: float + + +class AddressMeteringDevices(BaseModel): + id: int + IDMeteringDevice: int + IDType: int + IDObjectType: int + SerialNumber: Optional[str] = None + IDAddressAddit: int + IDService: int + ServiceName: Optional[str] = None + MeteringDeviceTypeName: Optional[str] = None + VerificationYearInterval: int + VerificationDate: date + DateEnd: date + + +class ReceiptCalculatedSerializer(BaseModel): + IDService: int + ServiceName: Optional[str] = None + Amount: float + + +class RentRepaymentInfoSerializer(BaseModel): + Name: Optional[str] = None + + +class RentRepaymentSerializer(BaseModel): + RepaymentNumber: int + Type: Optional[str] = None + Provider: Optional[str] = None + Amount: float + + +class ReportFilterTypeSerializer(BaseModel): + ID: int + Name: Optional[str] = None + + +class ReportFilterListSerializer(BaseModel): + ID: int + Name: Optional[str] = None + IsChecked: bool + + +class ServicesAdditionalSerializer(BaseModel): + ID: int + Name: Optional[str] = None + + +class RentRegisterNotices(BaseModel): + CityName: Optional[str] = None + Number: Optional[str] = None + Address: Optional[str] = None + AccountFullName: Optional[str] = None + Amount: float + AmountFine: float + AmountTotal: float + + +class PersonalAccountDebtSerilizer(BaseModel): + ID: int + DebtTypeName: Optional[str] = None + DecisionNumber: Optional[str] = None + DecisionDate: Optional[str] = None + DecisionDateEnd: Optional[str] = None + FullName: Optional[str] = None + ExecutionNumberV: Optional[str] = None + DecisionAmountSaldo: float + DecisionAmountFine: float + DecisionAmountStateDuty: float + DecisionAmountReceipt: float + DecisionAmountReceiptFine: float + AmountReceipt: float + AmountReceiptFine: float + AmountReceiptStateDuty: float + + +class PersonalAccountDebtsSerializer(BaseModel): + ID: int + IDType: int + IDPersonalAccount: int + IDCourt: int + Number: Optional[str] = None + DateBegin: date + DateEnd: date + LastName: Optional[str] = None + FirstName: Optional[str] = None + Patronymic: Optional[str] = None + PassportSerialNumber: Optional[str] = None + PassportNumber: Optional[str] = None + PassportIssueBy: Optional[str] = None + PassportIssueDate: date + PassportBirthPlace: Optional[str] = None + PassportBirthday: date + AmountSaldo: float + AmountFine: float + AmountAccrued: float + MonthNumber: int + AmountReceipt: float + DateOk: date + Note: float + DateP: date + DateIns: date + DateUv: date + ContractTypeName: Optional[str] = None + DateUv: date + Decision: bool + Execution: bool + Amount: float + AmountFine: float + RepaymentDate: date + CourtTypeName: Optional[str] = None + CourtNote: Optional[str] = None + Contract2Number: Optional[str] = None + Contract2DateBegin: date + + +class PersonalAccountsSerializer(BaseModel): + ID: int + + +class CommonTypeSerializer(BaseModel): + ID: int + Name: Optional[str] = None + + +class ProviderTypeSerializer(BaseModel): + ID: int + Name: Optional[str] = None + + +class ProviderContractSerializer(BaseModel): + id: int + Name: Optional[str] = None + ProviderContractTypeName: Optional[str] = None + OrganizationName: Optional[str] = None + DateBegin: date + DateEnd: date + + +class ManagementCompanySerializer(BaseModel): + ID: int + Name: Optional[str] = None + + +class WithdrawingTypesSerializer(BaseModel): + ID: int + Code: int + Name: Optional[str] = None + + +class WithdrawingTempSerializer(BaseModel): + id: int + IDService: int + ServiceName: Optional[str] = None + Por: int + AmountAccrued: float + Amount: float + + +class ObjectDetailsSerializer(BaseModel): + IDObject: str + IDFias: Optional[str] = None + IDBoiler: str + IDOwnershipType: int + IDProviderUtilityServices: int + BuildDate: int + FloorNumber: int + Entrance: int + CommissDate: date + Volume: float + FullArea: float + IDBuildingType: Optional[str] = None + IDOverlappingType: int + IDWallMaterial: int + IDRoofType: int + IDFoundationType: int + WithdrawingDate: date + WithdrawingReason: Optional[str] = None + IDSystemHotWater: int + IDSystemHotWaterPeriodType: int + IDSystemColdWater: int + IDSystemColdWaterPeriodType: int + IDSystemSewerage: int + IDStandartVolume: int + IDHeatingType: int + IDGasType: int + IDWiringType: int + IDImprovementDegree: int + Amount: float + Deterioration: float + AreaRoof: float + AreaFoundation: float + AreaFacade: float + AreaPlub: float + AreaAttic: float + AreaTechnicalFloor: float + AreaBuilding: float + AreaLk: float + AreaYardArea: float + AreaBoiler: float + ActAvailabilityCounterInstallObjectHeating: int + ActAvailabilityCounterInstallObjectWater: int + DirectControl: bool + + +class ObjectMunicipalsSerializer(BaseModel): + ID: int + Name: Optional[str] = None + + +class ObjectServicesSerializer(BaseModel): + id: int + IDService: int + IDProviderContract: int + ServiceName: Optional[str] = None + por: int + ProviderName: Optional[str] = None + DateBegin: date + DateEnd: date + IDTariffPopulation: int + TariffPopAmount: float + TariffProvAmount: float + + +class ObjectAddressesSerializer(BaseModel): + id: int + IDObject: str + IDAddressType: int + AddressTypeName: Optional[str] = None + Number: Optional[str] = None + FullArea: float + OwnedArea: float + PeopleNumber: int + RoomsNumber: int + + +class MeteringDeviceInit(BaseModel): + ActionType: Optional[str] = None + IDUser: int + ID: int + IDService: int + IDType: int + IDCity: int + IDObjectType: int + IDObject: str + IDAddress: int + IDAddressAddit: int + IDService: int + SerialNumber: Optional[str] = None + VerificationDate: date + VerificationYearInterval: int + + +class ObjectMeteringDevicesSerializer(BaseModel): + ID: int + IDService: int + IDType: int + IDObjectType: int + IDAddressAddit: int + IDService: int + ServiceName: Optional[str] = None + MeteringDeviceTypeName: Optional[str] = None + SerialNumber: Optional[str] = None + VerificationDate: date + DateEnd: date + AddressDeviceNumber: int + VerificationYearInterval: int + + +class ObjectMeteringDeviceAddressesSerializer(BaseModel): + IDAddress: int + Number: Optional[str] = None + IsChecked: bool + ix: int + + +class SystemWater(BaseModel): + ID: int + IDServiceType: int + IDPeriodType: int + Name: Optional[str] = None + + +class SystemWaterPeriodType(BaseModel): + ID: int + Name: Optional[str] = None + + +class OwnershipType(BaseModel): + ID: int + Name: Optional[str] = None + + +class CommonTypeUUIDSerializer(BaseModel): + ID: str + Name: Optional[str] = None + + +class ImprovementDegreeSerializer(BaseModel): + ID: int + Name: Optional[str] = None + IDHotWater: Optional[int] = None + IDColdWater: Optional[int] = None + IDSewerage: Optional[int] = None + + +class ObjectWaterSystemVolumesInit(BaseModel): + IDHotWater: int + IDColdWater: int + IDSewerage: int + + +class TariffPopulationSerializer(BaseModel): + ID: int + IDService: int + IDCity: int + Name: Optional[str] = None + Amount: float + + +class TariffProviderSerializer(BaseModel): + ID: int + IDType: int + Name: Optional[str] = None + ProviderTypeName: Optional[str] = None + + +class ProviderUtilityService(BaseModel): + ID: int + IDCity: int + FullName: str + ShortName: Optional[str] = None + INN: str + KPP: str + FIO: Optional[str] = None + PhoneNumber: Optional[str] = None + ADS: Optional[str] = None + Email: Optional[str] = None + BankName: Optional[str] = None + CheckingAccount: str + CorrectAccount: str + BIK: str + WorkTime: Optional[str] = None diff --git a/kv/settings b/kv/settings new file mode 100644 index 0000000..32bdc1a --- /dev/null +++ b/kv/settings @@ -0,0 +1,12 @@ +{ + "database": { + "engine": "mssql+pyodbc", + "name": "Kvartplata", + "host": "kts-srv", + "user": "sa", + "password": "gjghj,eqgjl,thb", + "options": { + "driver": "SQL Server" + } + } + } \ No newline at end of file diff --git a/main.py b/main.py index 42b9b16..5333b6d 100644 --- a/main.py +++ b/main.py @@ -1,9 +1,11 @@ from fastapi import FastAPI, Depends, HTTPException, status from fastapi.middleware import Middleware from fastapi.middleware.cors import CORSMiddleware + from kv import kv from auth import auth from kassa import kassa +from infosys import ismain import uvicorn middleware = [Middleware( @@ -14,7 +16,7 @@ middleware = [Middleware( allow_headers=['*'], )] -app = FastAPI(middleware=middleware) +app = FastAPI( middleware=middleware) @app.get('/hello') @@ -27,12 +29,21 @@ app.include_router( tags=['Авторизация'], responses={404: {"description": "Not found"}} ) + app.include_router( router=kv.router, prefix='/kv', tags=['Кварплата'], responses={404: {"description": "Not found"}} ) + + +app.include_router( + router=ismain.router, + prefix='/is', + tags=['Информационная система'], + responses={404: {"description": "Not found"}} +) app.include_router( router=kassa.router, prefix='/kassa', @@ -41,4 +52,4 @@ app.include_router( ) if __name__ == "__main__": - uvicorn.run("main:app", host="0.0.0.0", port=4321) + uvicorn.run("main:app", host="0.0.0.0", port=4321, reload = True) diff --git a/settings b/settings new file mode 100644 index 0000000..32bdc1a --- /dev/null +++ b/settings @@ -0,0 +1,12 @@ +{ + "database": { + "engine": "mssql+pyodbc", + "name": "Kvartplata", + "host": "kts-srv", + "user": "sa", + "password": "gjghj,eqgjl,thb", + "options": { + "driver": "SQL Server" + } + } + } \ No newline at end of file diff --git a/Новый текстовый документ.txt b/Новый текстовый документ.txt index 1a80b67..c4b3d45 100644 --- a/Новый текстовый документ.txt +++ b/Новый текстовый документ.txt @@ -1,2 +1 @@ -CD %CD% -py -3.9 main.py \ No newline at end of file +py -3.9 C:\\projects\service-app\kassa\atol_token.py \ No newline at end of file