From 0ebf1321eeef9a13e6e8459bfbbb7ccfb63031be Mon Sep 17 00:00:00 2001 From: "FNOS-WIN11ENT\\choshoukaku" Date: Sun, 14 Dec 2025 21:01:12 +0900 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/__pycache__/main.cpython-312.pyc | Bin 1724 -> 1840 bytes backend/app/main.py | 3 + backend/app/modules/journals/schemas.py | 29 +++++++++ .../app/modules/opening_balances/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 179 bytes .../__pycache__/router.cpython-312.pyc | Bin 0 -> 2967 bytes .../__pycache__/schema.cpython-312.pyc | Bin 0 -> 1512 bytes .../app/modules/opening_balances/router.py | 55 ++++++++++++++++++ .../app/modules/opening_balances/schema.py | 25 ++++++++ 9 files changed, 112 insertions(+) create mode 100644 backend/app/modules/journals/schemas.py create mode 100644 backend/app/modules/opening_balances/__init__.py create mode 100644 backend/app/modules/opening_balances/__pycache__/__init__.cpython-312.pyc create mode 100644 backend/app/modules/opening_balances/__pycache__/router.cpython-312.pyc create mode 100644 backend/app/modules/opening_balances/__pycache__/schema.cpython-312.pyc create mode 100644 backend/app/modules/opening_balances/router.py create mode 100644 backend/app/modules/opening_balances/schema.py diff --git a/backend/app/__pycache__/main.cpython-312.pyc b/backend/app/__pycache__/main.cpython-312.pyc index 8c1b95b184b246caad23b9558dcd36bab7c975e1..bcc55dcc52edf4c358f76c3845a2143a1776fdd1 100644 GIT binary patch delta 176 zcmdnPyMd4QG%qg~0}#BKYnQojBCjOlijC^kj9e)UDSSB+x%^R*lLHtf86`K*V0_QS zD7CqR#gQ@cmU3c2fnIKYN@-4Nv0i>bYF=hudVEr1PGVj%P@pKkv?R6Y79UIk!Y`5n z+EOG9B7}j&Ee;!q0d__DKrSN?7vGrtmi4&g6$Xu`3?4Tan6EPkU1SiNV0V>439JtQ D0?0O7 delta 67 zcmdnMw}+SaG%qg~0}vc+u+21_$ScWMwNbsAaq|Vnr%a3zo42tzGEUZElj70^Dq#fT S;^UJ8*p72tWzZ;+266#pgb?Te diff --git a/backend/app/main.py b/backend/app/main.py index 23ed1f8..0e5af8d 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -42,3 +42,6 @@ app.include_router(ledger_router) from app.modules.trial_balance.router import router as trial_balance_router app.include_router(trial_balance_router) +from app.modules.opening_balances.router import router as opening_router +app.include_router(opening_router) + diff --git a/backend/app/modules/journals/schemas.py b/backend/app/modules/journals/schemas.py new file mode 100644 index 0000000..f131588 --- /dev/null +++ b/backend/app/modules/journals/schemas.py @@ -0,0 +1,29 @@ +# app/modules/journals/schemas.py +from pydantic import BaseModel, field_validator +from typing import List +from decimal import Decimal +from datetime import date + +class JournalLineCreate(BaseModel): + account_id: int + debit: Decimal = 0 + credit: Decimal = 0 + + @field_validator("debit", "credit") + @classmethod + def non_negative(cls, v): + if v < 0: + raise ValueError("金額は0以上で入力してください") + return v + +class JournalCreate(BaseModel): + journal_date: date + description: str + lines: List[JournalLineCreate] + + @field_validator("lines") + @classmethod + def validate_lines(cls, v): + if len(v) < 2: + raise ValueError("仕訳明細は2行以上必要です") + return v diff --git a/backend/app/modules/opening_balances/__init__.py b/backend/app/modules/opening_balances/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/modules/opening_balances/__pycache__/__init__.cpython-312.pyc b/backend/app/modules/opening_balances/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61681c5b74f240c5dd4e8e7790d3d94b2f7852b8 GIT binary patch literal 179 zcmX@j%ge<81P2>zGePuY5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!3UaoJDbFv;E-pw+ zPL0XSDk;`YOis=(%`3^wOV>@#FG`I`N=(j9%}a?%EGUS{%}*)KNiB}aFG$S;Du_=? u%t_2k1`5Q-XXa&=#K-FuRNmsSfhe;pVg*{k2*kx8#z$sGM#ds$APWGMIxt}X literal 0 HcmV?d00001 diff --git a/backend/app/modules/opening_balances/__pycache__/router.cpython-312.pyc b/backend/app/modules/opening_balances/__pycache__/router.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a6fd76c398bdabc5bdd5b247d3d74d8fc271f30 GIT binary patch literal 2967 zcmcImT}%{L6uvXFf3wT}@gqMgWfZJzgP@7pMvLh#tdWX90Bt3tWSALnV0ULTGaFci zhBYQ?B(XkJuxg5lm9|=Anm(8|vBB5AU^IbD>O-@F^=+#pCiJD}?lQ1H);{%acIMpg zoO93pIp>@Eo84|j&}Oe65Pvo!l)xRm8P=S$Zr4B9TDwM&2|?+%exK)8qBf0zFis2ibV@7M{Li)vb7&U>P9! zf-{EOYbHH5@GIZ2*CpQ0J2L#7f*t%^8GeqK+gtbon|n!(_I0#$N>NpiHT$9N?vB7H zCqz_H3VR8y=%6GE;$Zl&5IZJHL3Ryx3<_!=CxycTw}uqAM})8#9`v(8Hp~f4vcRgs zNq2*khIjO*aV1&+L6@(6{o>Z;<+~SN+@6LBm?E+;AdYGVl^s+xq9Iz5W5YbZ^2>|K z9~+jh{^{j;BGHAa(JrJABaoWM5dpu+l2Ph78X@xVavfJ)dfXZ$I|!r}>3!b78}FF(n5T&m zl=ktO+t@MKV=I%>TH3k-o!v}JTX#FNmIi%#8sr&c-`W9D;n-kbOkm|YhUGXZ8dm#6 zzHZ%}7y3nYqsz$xFRI?W!H)S_j|RG!+HFc5v+>WjYj0zk+S?AcwlsDBYw&!p=62?2 zN3*Xxz;p$=^J3$L=&MalmuX}IpEk7~Z4NZoXDRC5>YHBMo1D{{EN9Im3raMoYNRwQ zegTIO-3iCG^uzShwQm#gsYLwyMEuP2*-Ou_-c7_OmnY9I-Tf*N|1xoUG7-N8szm%j zB7Ox*(Wa=Z8dadSc|kMrg35|PuT{ngubH^0tVptE7DfdQ=t8q)oR?m%3Jlu-T1Rh^`bg^m@s-R?|oMs_#$ojmfo3f1meuvaD-Mui+ZhrxF z-RJZp<6NBu5(ZaVeO|;7(O#KfuJ3#1U1B6Hp;dnVsCq$0SCBS?npA5rP zn!s{>V|lb0)2WVZV~2C8t}D1D!5{aL*7aeGUfPQ(hsGC-Ic^A>qvCkUdiQ{=OJKRFcW3}Agmj)B8A zCCjS4vpLYo_>X6di}!2Y#%oBCk6Z{xFXL~KW*HDv?gSeQ0&C!;l<@^f##aWNG-MC9 zD+!89UX?3y73gZQaTh!$&@;O930*$jJ+pgu|Bd}O8}BtOT5K0>=WR)3D=A2BLe7eF zpRJVI=*nanaur=1J3n^e^Vc3!vumbtfi8bUm(MoNG_Hb}?yV|YVB8CC-*)O+wXe|l zD-F_Iq0#4|=St03-fr~mG`D%3nt6Z)wvC7~=DHLQYL18!!vj6}9 literal 0 HcmV?d00001 diff --git a/backend/app/modules/opening_balances/__pycache__/schema.cpython-312.pyc b/backend/app/modules/opening_balances/__pycache__/schema.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14d10b29182d0ff0d7d30a76ae8dc8f2347f5631 GIT binary patch literal 1512 zcmaJ>&u<$=6rTO%_-A7WTO3G4D3ofETBwvr6jhaIDLK^vAvjn@tI5u|-DJJ%%&rTr zf)vqIL{*WTAg~pIs)9hEh>Al5ZPoG*aIxfzwc>(^Q|IPjxNzdl?mA5i;z@q{y_s)z zX1?#Oe@Ug{2%`V_X+xC|`kfcUP(mHr#uqJltBL3|rgiONJc z1*1L^IU-U)p%ECD!)nB@6kdslMv1T~0ED115}{H_BqJ;GW-x??&qCbiDhIgHmHpX$ zR-zVD<6d^QLM_9(a0Z*$(&<@7u}i%~$#8URYBh?P7stA8S1ngF2oqs1FJ%X7G(zVL z*E=*Ubw&x)!X=&4hQa0Izrjn88fZx%!UD`Y3LtUeHH28g4R6I27@qn=VM%xksdCmz;0@dNHhQ;icJFL;?|!p=`{SMOzj|=l_QO1(!dj+l&_Hu)aVoQpA-?v22s7NuA>GYIA`+ zPSMdX(lS0?sd=f;aO$gc`S5=UdHfL$Z%5}aq-E5Ppk!**z4mf_u{pK={;y->t%<4j z*mNs7-5E`(_f*KLG%*dROju>(_T0KlXn9 zq2LT+r@VJ#H!Lsr0XZH zoor^BZ*Js#(_U|n&9ss;!wI4J>W19r8EywO|oG z$`fDU7?7@_PA1!yvz_!4S7tj;jW3_CPq*dq&iKS~zJ9JPPyD82>+iOeXFE!|FG@ 2100: + raise ValueError("会计年度不正确") + return v + + @field_validator("opening_credit") + @classmethod + def validate_balance(cls, v, info): + debit = info.data.get("opening_debit", 0) + if debit > 0 and v > 0: + raise ValueError("借方和贷方不能同时输入金额") + if debit < 0 or v < 0: + raise ValueError("金额不能为负数") + return v