From 96f25fc0eb3126f4bdc8e98a89845f30824a9adc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Sun, 22 Feb 2026 17:42:31 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20[contracts]=20=EA=B3=84=EC=95=BD?= =?UTF-8?q?=EC=84=9C=20=EB=B2=84=EC=A0=84=20=EA=B4=80=EB=A6=AC=20=EC=8B=9C?= =?UTF-8?q?=EC=8A=A4=ED=85=9C=20=EA=B5=AC=EC=B6=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - DOCX 4종 → Markdown 미러링 체계 구축 (Git diff 추적) - DOCX에 개정이력 테이블 삽입 (Pretendard 9pt, 파란 헤더) - 자동화 스크립트 3종 (추출/삽입/동기화 검증) - revisions.json, CHANGELOG.md, INDEX.md 업데이트 - .gitignore에 contracts 경로 allowlist 추가 --- .gitignore | 10 + sam/docs/INDEX.md | 14 + sam/docs/contracts/CHANGELOG.md | 28 ++ ...고객_서비스이용계약서_v4_0_전자서명용.docx | Bin 0 -> 38003 bytes sam/docs/contracts/docx/비밀유지서약서.docx | Bin 0 -> 26356 bytes .../docx/영업파트너 위촉계약서(단체용).docx | Bin 0 -> 25834 bytes .../contracts/docx/영업파트너 위촉계약서.docx | Bin 0 -> 30124 bytes .../markdown/01-service-agreement.md | 424 ++++++++++++++++++ sam/docs/contracts/markdown/02-nda.md | 198 ++++++++ .../markdown/03-partner-agreement.md | 275 ++++++++++++ .../markdown/04-partner-agreement-group.md | 275 ++++++++++++ sam/docs/contracts/revisions.json | 52 +++ .../contracts/scripts/extract_to_markdown.py | 334 ++++++++++++++ .../scripts/insert_revision_table.py | 348 ++++++++++++++ sam/docs/contracts/scripts/sync_check.py | 255 +++++++++++ 15 files changed, 2213 insertions(+) create mode 100644 sam/docs/contracts/CHANGELOG.md create mode 100755 sam/docs/contracts/docx/01_고객_서비스이용계약서_v4_0_전자서명용.docx create mode 100755 sam/docs/contracts/docx/비밀유지서약서.docx create mode 100755 sam/docs/contracts/docx/영업파트너 위촉계약서(단체용).docx create mode 100755 sam/docs/contracts/docx/영업파트너 위촉계약서.docx create mode 100644 sam/docs/contracts/markdown/01-service-agreement.md create mode 100644 sam/docs/contracts/markdown/02-nda.md create mode 100644 sam/docs/contracts/markdown/03-partner-agreement.md create mode 100644 sam/docs/contracts/markdown/04-partner-agreement-group.md create mode 100644 sam/docs/contracts/revisions.json create mode 100644 sam/docs/contracts/scripts/extract_to_markdown.py create mode 100644 sam/docs/contracts/scripts/insert_revision_table.py create mode 100644 sam/docs/contracts/scripts/sync_check.py diff --git a/.gitignore b/.gitignore index 0267b6b..5af8f26 100644 --- a/.gitignore +++ b/.gitignore @@ -14,5 +14,15 @@ !.claude/agents/ !.claude/agents/** +# sam 문서 +!sam/ +sam/* +!sam/docs/ +sam/docs/* +!sam/docs/contracts/ +!sam/docs/contracts/** +sam/docs/contracts/docx/backup/ +!sam/docs/INDEX.md + # 기타 sam/sales diff --git a/sam/docs/INDEX.md b/sam/docs/INDEX.md index 572b412..92e8070 100644 --- a/sam/docs/INDEX.md +++ b/sam/docs/INDEX.md @@ -42,6 +42,7 @@ docs/ ├── features/ # 기능별 상세 문서 ├── projects/ # 프로젝트별 문서 (MES, Legacy) ├── history/ # 히스토리 및 로드맵 +├── contracts/ # 전자계약서 버전 관리 ├── changes/ # 변경 이력 └── data/ # 데이터 분석 ``` @@ -125,6 +126,19 @@ docs/ |------|------| | [analysis/item-db-analysis.md](data/analysis/item-db-analysis.md) | Item DB/API 분석 최종본 | +### contracts/ - 전자계약서 버전 관리 +> DOCX 배포본 + Markdown 추적본 + 자동화 스크립트 + +| 문서 | 설명 | +|------|------| +| [CHANGELOG.md](contracts/CHANGELOG.md) | 전체 개정이력 | +| [revisions.json](contracts/revisions.json) | 개정 데이터 (스크립트 입력) | +| [docx/](contracts/docx/) | DOCX 배포본 (전자서명용 4종) | +| [markdown/](contracts/markdown/) | Markdown 추적본 (Git diff용 4종) | +| [scripts/extract_to_markdown.py](contracts/scripts/extract_to_markdown.py) | DOCX → Markdown 추출 | +| [scripts/insert_revision_table.py](contracts/scripts/insert_revision_table.py) | DOCX 개정이력 테이블 삽입 | +| [scripts/sync_check.py](contracts/scripts/sync_check.py) | DOCX ↔ Markdown 동기화 검증 | + ### features/ - 기능별 문서 | 문서 | 설명 | diff --git a/sam/docs/contracts/CHANGELOG.md b/sam/docs/contracts/CHANGELOG.md new file mode 100644 index 0000000..774edb3 --- /dev/null +++ b/sam/docs/contracts/CHANGELOG.md @@ -0,0 +1,28 @@ +# 계약서 개정이력 + +> **작성일**: 2026-02-22 +> **관리 대상**: 전자계약 DOCX 4종 + +--- + +## v4.0 (2026-02-22) + +**작성자**: 개발팀 + +- 계약서 버전 관리 시스템 도입 +- DOCX → Markdown 미러링 체계 구축 +- 4개 전자계약 문서에 개정이력 테이블 삽입 +- 동기화 검증 스크립트 구축 + +### 대상 문서 + +| 파일 | 문서명 | +|------|--------| +| `01_고객_서비스이용계약서_v4_0_전자서명용.docx` | 고객사 서비스 이용계약서 | +| `비밀유지서약서.docx` | 비밀유지서약서 (NDA) | +| `영업파트너 위촉계약서.docx` | 영업파트너 위촉계약서 | +| `영업파트너 위촉계약서(단체용).docx` | 영업파트너 위촉계약서 (단체용) | + +--- + +**최종 업데이트**: 2026-02-22 diff --git a/sam/docs/contracts/docx/01_고객_서비스이용계약서_v4_0_전자서명용.docx b/sam/docs/contracts/docx/01_고객_서비스이용계약서_v4_0_전자서명용.docx new file mode 100755 index 0000000000000000000000000000000000000000..e5d8c10c37e2b1433493b2b3042151f2f6279500 GIT binary patch literal 38003 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 KI_&B_p8X$x!}0b2 literal 0 HcmV?d00001 diff --git a/sam/docs/contracts/docx/영업파트너 위촉계약서(단체용).docx b/sam/docs/contracts/docx/영업파트너 위촉계약서(단체용).docx new file mode 100755 index 0000000000000000000000000000000000000000..7726944670f938f5a6ecf313c43325bf87760359 GIT binary patch literal 25834 zcmaHSV|=C0vTke}lZkEHwrv{|b7I?0Cbn(cwkNh$oZS5PzUQ8^&xiZr>9tn%s_OoA zRrlLn{k#g&pkQb~KtNDH^HFL#yfM?aw?M0&mS8SviQAqse@FjDP1pKZ*(Mo%B>C>p)pBT z*V1Ew`z-3K#x3BdsSEB+(%=)I8X1&MMRPi5auzyB?nayb7R|+xbKi`ac(Z0)(maQy zG|e24=69J-Mv|&*nhysQOB(77#mj94XwvaLgRD*&I7|f1LE$J@^6uZBAj5Q1F?z1g zA3~70D!g)duEL&I@*FLvNI4X8YFoe1lJb(6G_F~^D{1=52BdwYDaijuJhG%uWq>3H|Ej1Yn*h*cG(#$FUaF|is$`9XD(7HbB3uzS5{EB*)w z563+qId_=p+FFlx1b3IG*HAUvD%_WXPeCBf6L_?QE9((*NkT6pR?&f=(Op}inF-5zAG~!R@^p~Sd!{y9^+(F#KeWO{cwMHog zhPieIi^uvMx~pW0sJ?wPP)nEme73Er*L1SKTFPRn5v6eojX%;CKm{0yJ!oWQ(9Y!X z8^o(;cm#y*BS8DgZLbNw%tq~o(YPy2x7V~O0VN_UwZ=Q#!m)Edc) zoA??Ely1`?jc9FIsj+VRNu(nF7Mo>E67}bWpTDk0Xw-`Pr@+ zwQKeF>~Yg{1)qTbb42*j-AT^A!}bsq2ngwWL`>|B6&&pyoahZ59R7*fY~?9h zCrFN8WNr{5mgGc>;yo$I@9%YPfC;yQ4WiW~E|c-2WB6WR8ZwuimZ6~dXpo&_;ZH^^ zZU{yK5QT61I2_|<#$+JJbW}D<`(t9Jci4WuY1lN@*XGlWO09tfe31^amYVfjo8rWJ z>0AgF#A-6>TMVP7@RowfUZ>d9q7uyc~4w^3L@eZXsosO>TgI zlmvIO3qCLE8O{o|mz_91BeuNE+MfHvzjryf@*Jd}jjsrDS}|QCKR!FP!w2_Rsr{8l zl^^T7xQ4%C6STyc$Xt6dX$22VT1A2-jc&@7k`J?P7iydWeyG_H@~HGkw*Z_~do?lT zMh`zUMLPerKz}_Z@df?QxL_enW4HN^i~8@Gg8V<@!r0!?^q;^8PSBO_XFvzVzn4>;=Bn! z0Q`t!G1r-f-1g$StKl8dAi^GVga);T9mXZYWK>0-V(mQD@o)YSr5sQgUW(HSYpog- zmj{b9=qwdVGo)D!UT0c*EP>ok;v_&g>_gIvB1R*KKC4bUw?&9;8*f$AfYVD600$;v ztuPBc+h;8Z>%^9)7LygQQ5Ddz+_l=y9?~+LPr)VH(wy=LdE#`(Q>FdbRw*XhCu<}| zJYfq_%9pY9gs89qrUF{mCRZFwUn4*L?8*~9H|N5-PHGdW!@NMkz@Xw}I)R?2H62!$ z=qS#NaAB7jcO^?7HK(6GWJE#MBSYLIF`~~vQD*6pQ0@n=E1q)l^hS--ofZu`sHWKfxv?$mVyedQ2S-dSD)GHyQik= zc2C-@v9(_yDxDKPNY`k z=cE3n^t$-GBV`Lmb|yW|5&y@@#QUB2m-C_T`$5&%Y5!t$@Vk*@J~a)U{I*uc>qEay zStAQ4V;v7`rv50czFt};6-El|id1R|3@mD}^~zE49cl~A&?z(+!LBbYI;`@`q3NrO zn%%9L-HTA`<|3w1g)F91%gL0DAP*yJCUwf4KFf+I&o-Fbgjp z9$Z>QH>bh4LqlUXpVHB9Ys=(;Zv*<#+;{gz`qDjexud>{8TxdhPZ**Gn45N?0l~ty z`DwW&4m31$Gt;!Jg#$wCODCBPb42X&AiYz;FR<`q5a61$a*b=iI2o`JHvEHI{ob|r ziRwWDK$$k-!+1p67GKjAEp0ekrwc@I>tujV_P=a zoPx~}%ZfPXld>(9iFVAiurfOmjbI4{KDGK6fRv_`66uA8v6M&$mcFa0WXFcK!!-bU z4Kz%Eh3ICzk$}N{aM^j4^-&^lGz-SNV;*>@G;@jZ;tm=tdrC&dRJL8y4y!1jYRCi; zDoL(fLyK?Aj4yYJR#CE>f%T;$eMpGW%_Zk5tiDEsQ(+$~4g|xXr_isWFzk0B)Fn!Z zTzL2(ta>T3dlSP4>06h`PH&=go6(h9QYgV9dLfFVzkU%_<6w399%2`lUzqcna z5GIO&b+mLY`kJV&BI^YU-TI4l8}2*v&uqB%;c z=lda8)C(&{_j@YeUrSm?J*i)4J}P3E{nX2j2O0gv>m7HNCNt-7x zHi@>}_*!(BQjQ(_*b8_1swC}f<>}}Tizxsp5if_{w`QOH$-ZgyA6iEE)ZqAb8z%G& zPv9IE6(3U@p9@Q`>slXudFtKtFUj@3H>#JqYdgS7RCEHVF9zjTmkl!P;aFw% zWwe!Ek!yaJ7T+vob}=NPHcS_Cf+@A$CZg;6P4C~DuTff^kuUjwX{P_0-EDR;n?-nh zs=LiLUPK8dN#V2yR(MbyQaTWVTv$4;obUyz(`H^ai?}WGb~7Z$(ZX8)0fpKsrD)+{ z6$gJcAM&P@-_kULQJiPONR8EvqNuumMMLk~J|Fo6M5uVRob#@=&I)=faLakmH33~I z2fqk0dP?u{XX`wOm#I}fci?^k{9E3nUSq2b=ykIZeS=$cv%lQhZB8dhVX`)(mHaPL z*WC%8@2(7r*gu@|9J0GzY^z&!>S6BLF)&VJ=ta~&62-KY-Lyp z**`?DgpTVc8Ww*1ynkS{8S106;8|Mq=ELlB94|a$)7LqohmoEWPdm$=Y2Z%z5)p+Y zCl&+E)th~hcX;yt)S_I&Q->{5G9+B%9coKo6VYd$1L&a2rac<1VW?$c@d>*cvYHsF zGIrcsQ{Q{MnfkVD1|O1Tm^jJt91kvJyI)+U33e+An z%Sr2f(x_0O)@fDL-Rvj_gU>|?MpvW4t#RA!Mg4+E{TZ10xD@f1m+FnXBDYbz;2l5r zxufN!#P#P>BNG{pfBEkq=#7Bda!|i;(|F>LXLswj@5vBkKpx{u+|0UbR6%@Ep^;KK z7P59+YwsSeEWKh%RB){Tb8wyn@{TF~IdJ*9oZ%ZvbeBrLy@G!2F!grT^RaU2{kwhF zD|6-Ufsqt*Z%A65PD!ZT-bTt-zYGlb<82%;^4YNZaSN_e3L59_#%TB(z>MXPbrVeP zZH~E*HOm(Ax=7AjosTlX`ub!-?vuKQv~Wqy#0)BC1XK!_Vny_ucZy9)ouUQtlCzox zfq-9*Ak}KA{>#}Xj3v{+J{Pwq_1$sktxd+X3N5Q%>d_qidahx;gSfiQ?TI4cy~LjM zdQaNdD_Xyrub|bMKWK|i`twuJwnuBn{eZVqp5I$@w^v!wRGGY<>W?+5RrfBr+Wl?S zq-^r@(-B6A8LVh^INrtRpxA>jJ9(tXE1&e{%MAUh))yxvaK2if6J&GQgbP=qQp<{DeW^SgYjfTzpykj^WYWLKaL0-cw$$Ktm?`K_bWbnDiYoB#| zyb!xP)4R&rGDCgi=fJhe1R;~a0pf4%%0<0NOgFoWYqdXLom9F}5;n?r-M+%ngR$Tg zu(%ofAkuPnL-3QuXVcY}A!-I~3KgPOWZVqELb+XD2w(?_o*hpS^@sA4S;d=Dmyhx! zUsso}WV)~7R>imAr#Raipa4POn=uulF)FqYSq<`x!kwDsT-!yrE9u8*UNQ#|s~c+Z z?fZx%nX8kGBO+U%*i^YI0^MX*=@z5Im;~Ckz;M$FgvMdjD*`&V_bT>JcF3%!w9Ix& zA~zLPMqAJ|;(*Eh=-}PhwwKI%ylO6=Yqte>d)`48cVYZqHGSh-0xK2d}u=;#RY#5k??u=q-d{HY#a%iGB5h9vIMD;xDl{C zDa3>xY7t#{>(50X8KBurm0xaV_jYy)zwY%aNljwo7Oj_(U0cGn%dDv%xR|9n&su&U zUL#PHglSY2pS6PZAtE8lCT#29<42S{I9~1Q5WLKcqs1$IY&gR9uwWF+aV#CgTJtkP zx(<2WL@QygpcOj-1H~XrK_yJGV(HH}H@@0cd`V|Q5pVVO#X3)Ya`LF(p z=cWQ@aDY`h!Y~n*b0EGu)j!AWP$A>V_pMgaml@0vNihXc$Ca1X?uN@u5knOrf{7#` z$TR`+FZhI!O43oN5317jJ+`G75bEF{$P9dI8lXxvTD-?pBo_z`^UL$P74}yWzqs4R zSpor0a;5$Z2}6dFtxT)V@Tee1cLzBu>*6-@UOJKsChLSsH8j!6VDz)9kO2xCD72&% zfn3T8x#~2vhZ2V2Du$=Qj4ewOQyPetAt{DtL>mw&h>(Xxjmrx0!^x1o>)yH7=RXQU z?Uf`U60{L^JDh}!kb}-xe{<=%Ek2Gs$;X zfcy>%*9`#Mbf6Q!W>Zrj}?;x`&i<#&Rr zYekeVZf6jdEDq-J)Bt~rr=lYjjT2ZZDXfrlYH@+DZ^+gY=k_vG(N=cOJk%dObV}ho zU&?plZDI9jAvAIX?NNStAlQK?t$318%d<3joSSQG8)HIxf+VQ_zBlZR+Xv%zB-xkL ze`&OCqNx*QvcC*1%7Dxm3$rKC{Ksa%DX2ui-TrnH_EE=5CgD+olnqhTUeu-O8*h=lTPoVctC3a%)fOB8T# z9k-oT@ydio#*ZbeM3tUsuEf+ZBUzdZYfN!%P{XZ4AVprD#%+OxIY# zql02fXQ1ogxo2yxd;(5 zlb5sQpXJc;K%t8uk@x}SNi1_F@Ts7)xWj|V3<1ZSot>v~Cs5V3n0umLF*hAKscSqWBH6OPHqUXLBqW??#RfQPb6Tk2w*OTr zO51}e@znV;(6*9LmITcO>ixR*?bseIjP$s>Md%?uT6Tl(u?BO2?Mb{!HO*)3sr6F% zG~u#{RJUp`*W!&q1@&qSX4yv*M{35BeUBc+n3wedvYG$9?K{cilfb^-`*~Q+;!0l7 zqnIblXgf6+61Iyk-xxgB;13=*tVK*bm_v15ZmdnzH-0;)$DCSSwo7j|=M@&K=pv19 zBIzsx9UXB}>YHDYLY%O}l_RnO#gwI*&mDebBxKW177Z6xK^>wHMq4C_DxJRCSbMZ? zER*iPK=rc3o^(~(pFo%3j8a%Jhm5E(;^=P~Awn`kWALk@V3A*Vx45tVyxopUti&2< zv{}K@Qb;4z$U>tQ1J%tI7~44kjrY_t@J&9v*G`J{^X~{z(5L}Wh!bGWS&GJGJI5Qc zq!1ODin9s_tldr^6K=jC)@=xn#8}$`VI@6z*>DvwcH>OI5Kakd8|71VaUu|f4)y0v z5N3tB5H!3P6=nvwR^;1OHK^B_0D4CTxR)(f=m&&7+lujFcg;$Sxxc$L z_2Pgp6&Z zu?w%8Ce%kv^QX*ZEtQ|dU^B(RWJ>~3Uge3gxikW$@0&!{c{{ngn65#ANylZu;JuL1 zQ|rg}7a$x=@R+TG7?lVer<|$WPMui1_^;~Dcit&6e9q1Et7lo`8rfIBP!Xg)UfTJY zkV)pHmN}6Gy(P;;{=v-|@ton_d8w!6$fs*+wZ8c)vPV^xDNMAR=1VFcBD_ccR^L9X z2@^P_+?YsZAenM2%w$Mqvd+fvm(mxNH+D;geBP(GUeyNy5kjeXd1gwc$FDymn2?Gv z*bRu8!$%dw%g9qZRkeKU{=>$25g^NVxz$eANuY{Bs?JohE~Ywpm@M_190u9$ol`Dm z-YdDbp8VV90L==#=?=YL;LFcRX_bn$%6%c(FJkg#KByizySNnK}VkncphUEDW% z;R4Y}q7b7veyM5oYsf6Mz%IycqQ>ZNPcf^6fdTybdXB~2S1^4IK;@ge*1MdXX6N6g(gmk+tsD}WWDdI^>n zSfnYYx||n50ZWPlDfY#;nN=h+KGw@Qu240OL!$bEpNe+|PSP=}ez_lPI>jIi&a5jK zT)kXgKnRBlm$l>EGu_@lnpK{bscD7ZHK70A2UbUo9xd5+NrEX<5>~bvs9gSrq&-li z$SQnY&iOvR0TI-jA+Iem@BGv{&vZZ}7!14MkgW=m!3mSN9!d6W^WEo70DrW9BUriK zKCadoW$;Ja=RvjO+Wp?-#n;Z2D%+TJ4_M(SoglF-?!eFL9R)_oA#uxAeHEVhv}71i z6NACqF!S`NscQuKF0OTm4as zj!T`6kCO(Y<*zs^Cg~_5Im!7~*)yO{tZFz2YL#Y7Q8tfiQUXSCBVzyJ&dMza|1l9{2D8Qp>6cA85!t}d_M4Hj0 zgAG{G(sAS`j>uq8J-_I{X#r{S*6Xq!(NiLwlwYN}{&=y#IdnKWBPHh!4*)UuJ}JPD zxBpqP=Y|H9ZcE;GTk*{!8sGL-8LUia8WBHYV<8g@vmHb^M({Ss6OblUt&|c~=fzk!mpdsy zqeGGl5)WhIbbPc1LRko@yaIjN+2-44;1e_gxCuDn)>L;LFT-74<#j$(x1cKyyJmv zrsZs~FrtjjWK&$A`0f3IqFHC=6=Hxa=G^e&;4c<0mAZOCQ1bm+Iz}zz&?N$mJ+4E_J^TxA2&!ZV11C`sD(-{co<#G9xL#{8%W6>*7PrW4P%1V~bw( zuila=Qp5MFv^IQEXDvq0=kY&6JAS_$`i7OtmkMgDG3O=&FUWe8G=A)l?(759k^bDf z**6$9K9-)z1l7=Hm%}hnd9WK`EwPu~zNp;+a-ZqPHzkYt*1DQTB`dmo&v)LOh};QP z)lDZRy$$uGGTQG`#%8uQ5}p8I=ry(Z!q_CAFmC`Ea%Tghg& zkVVuzI)$lgOnAYELigW8Y(!lzFG@^{1L0jTyPD9i zsQ7eE9m;m9+-p`uz#62%m8L~sjK|)71t+6GMdGgcrBRh%KvpQDt>i8u5nsG2 zScbDVkRkfE;fvvmxKAqT!pG3`S^xPHiNmd690rZ&T91nt(y5(SBcd@i4=2nA3OwU% ziwh!pbY1!8R_eOrd3E`@sbHdFX5WPjt+3W!#0hX;z9_9!)b{c_Ba|1q^~Knuvmmel zPWWKSR%zKys@S&QCK@^7ax=U+`}W(K|%#s%A;3o#GcsrgOh zfr!`{%CDUGj+*jyVf(dzZD0SFHm@En+mpI?^ixxy{S$Pg-5dO2(6}{UmmoeM&n_eV z+B!L*5~1SrV=Jr@%e!+)*h~Qi{N1#?IPVt(iiR9vvW8^w(*X?qyE`F@jW8IIF7QEl zN&F(M7_|w8aOtWP0Gm>E&ikGw+Cx*&JB7VsUBei!dllL?(`R6YG#9VFmvn-sQy(xv zzu?)MaaCTO^73g_2864uy&4RbITcOv)w3!9mLh`ds%;&(PdTdpQ@1Ryk~^i}r-^a! zE_r#o=3?=sw?fThc>}THQ!YKWPC^5WK)XI_lwdcxJ`T4%CQnGR4r*O`9>Qb8>;XJt(RWfz0;cSO+rQS?&#dx z@0mAG^)o+pW|Lt)tvAbHa$-_SX%{^4rOC^h7{? zz0Nw!!k35#3Gc*9v%m9K=*3AfY`P{LsufBj4|+JHibq-1gCUUeMX-UUIE<6RJY!*C zN-*a2_k7fk`OO{KlnmNV1uEvw_cUbbHUiT#rqYuhE`90Hs@YWtkGfpRYo-*T-$Ow% z?I!db=aj;hckQ);UvOa~X|KgGpT#j?dsv+!7oyd_FghdFZ5yv%*@xOJ0mpD3vMW#k z7<64|w$)2){ss(*oH|Lq+LI0j00Q_{_MiQZk^-fbG|hpKJq<22 zDMYDJGFyE7NsGnbw`+s_qGJ}vM0;o7{#g3Ks*=>6dZ2Fi88^UBl6+aV4| zfogzxf-LCVctV{9mC6V_;T+;l)V;-pXmO4=Ri5CVgtK5Gm#l;U6;F~B8b9mu@^h$Q z;+e7htrYkWo|Fz3LP^rMgLsq7S%$%o${gad50k%4C(9h%$)zzvu~gg=qyiKw3|j9{ z2KhDl@YF~I^VDJNSaZcFCK?gcNi}ZMte5$hk1(0mJUqbS9~28I!64w^qZ z{fMzj$rz^nlHUhBsWQ7>t>GogjnpJa*v#*;RJn=3?X9lclYs%+ zX-e9PuG7JmIM%vB)^e9mM)>CvjvC@&o`VWBscV|#V5-pIm0iuAOUf@aojpo#Z&m)P9#X=?1-B7Y z+OBJ>_u+o#0`4d0TSCuKQ>?nNB^#S?@(Zj>O#j>+R3%VD;|4tEnw&r58z;k@#Xs6$ zx#wU9^%43?s};e3xE$>{Fpz|F{G^XQ&jVeH6c^>*JG-FDW zST$e4M%u4Mg^LyINWjZ5TvaZ+E$4s!CO7MfSPVB@T2|4V@=jrpVm->!9?7FHC7gW! zw2W;J1@R*q3@I)*>y{Vh5&&N^YI3Ut&G`GF0r4p}+Bj73xV=;M{qkd1+0i^cddSUfY?77Nx-mL?CCE4~Vy-l`sNhK? zo~~7^H`NdpPlk6fA@aHjVTF06aJU@KxLgEO2qn6O1NIjAB_G z-Mi*RkpQ%5iq+5Bp_P(T!wtKovl}}%J-V2BxvWT3%v1(LgneDn9&VCc>l*EnaZEtj zIZ9}m8KA1sgAqoo+WA-;WWQ{g%26`=B8@n)0x%lU&1louKdDF}Twtv;R(~C12Tn*9 z;VX2*6`7UveWy6BOd>f9>n%@ka6Bc8)4B~0Z4h%LC@fNLR_VWxC{ug&elO2EWQ@&f zJvM`-yWRec7TNNkD@;hzwT#$9Vu~>p&Jt4K_#p*`R&K0m@hl4}Ul{pEkLAbJGTTJ{ zToGB?sOIf8uYFQR*kCJ?Ln*PT`N=OY17-t1Fe&X)Vl+0mp#*W!ukWo}#tR1{Xh;FF zOJX+0@nG>|9!a)m3hsJ`N2c&j$Y2S&R~8byw)MokP; zHOdhkkVtt?rEbD6&jyt(ko{!s7+QS@v}vq5lk7?$!suN9R0$%0kc%}O^tCGGThTwJSbgoRk# zktg)1K6Z28A>_K#13I}gE3Lavc|FMl!T-qd31iblxzHQrAKOd}e_J z%DM2uDAAnOfRYQJZ$1(0A99{i&z&T46UFCyc%k5vwR!EEy4u;9~A|F!GWvuYL3k>_k|tV-niDQxowFi)CFL z(4Z2=qT#!Twn z5O0Ic|2zvXI%g4wAKZq)x~{4;oiWRFBuF7OnqvSvFbaD*!xqKkS@BOE)-=so!%o%E zHe)hGyco137!0)ZI5Q|Xw4Br>YQdFCnd}-mhw=6qx}~mHd(73{VAV5QJ^6xmg|cy5 z2K5tF7*uJ&kFn5|dLJp!W1KdI)P1wn354#-8l z6b$@l=zE|%3=qSGs5-uD*`*DoN5nBmJy6hJZcl`^Lh$Ku>=@|pSYRqNL z0$uZuGl-W7bINkt&3Z!SP%LWDA5v}&S9v_EFNTrDg~pVXvbdf1J1Hki1Xd7Bo%Rv7 z)m$Y9GW>%I5--7WKL8eIgCfcXL8v_pCQuF%W;Qlp8RLNg9Apb=b;Joi1R?<(a+cOE zA$A`MO&|jFOV%1rlcte2z~SK*G8BQeS4Dg--1Pl_R!bA%H8CGhJu>OdCBwR@4G6v6pjFV&o;A zO+iPTgdjIAb9g)PJOPBTG!pAD24+t~5h>t~vtL=pbhm!B!)e#PC}W>vJnwhCtpGYy zv?qtS*B8Qe>pC|2v}!)e1xS2(>i2kvosNH>0r#^Zavit2#3=csnvu1D^&ejyw#%$Zk3(&%?vcr9knk?S>)1%>86m4C z6Uu9Hjp|pfKJ7>2Zic~YojHCDa9=RjK!0>UWZ|WCCZWeE31V;$dmxBt-2oA-ZuiE~(Sr$D_9UAWM2$h^ zY?{~yM>t5Y4kkziix%BauL6qN!Ma@~;=(x$8&9NZF4G>doK~{y%3U2CdFIGa`Ie(9`PY&dQtrbb+)_gTkSNW2v1!4 z)B;=$;1#-w@gVBeNtrMd@aUKc4{4ZEyV-Acqfr!8C${@K6(82}bn*kC@cx2y!md9b z=gG^#iQFIn67BLvE03uCQ(twgH&&6&DC^a(PN`+xGnc=rm>8}cV!%R6VU12uL23nL zZDHRE7XsCh|1S3<8?gTl`k)K5&V?&leh?ibJY$J}E)vkXkrB$=XFkhsy@S4mSet0^ zDnxhn-~61a2+DqUFTVayPrMWib%%ii0quNKi~nJf{>u|irq0fmcIHn1qQq-#IjwUb z`S$em4@m39_(k*kQJ&r$lG!?520gse*!a7QCWt2x{yqA9($-Y-8@vp1eGTgD*~(R` zSh^y+-sV4ATr(nsHZOpEs`uJ6NV!R>eLUGe7v8+m=TIU{AsWa2se4h^>F)bD(y^sr zR3sqH)!X}*L0+s%rp##dbd+R(Gaj4NYWh-derGP6}vRjNK;>ST+l#`7O9xh5rd)qR4QX~1alQ}z0t;DWw ztd?EN#+iiyw4QKu)@@I#R+7+7LeUDA|3!zxWLx6xkTcmV!p|#6!FkT4qpl{7r7v7q(S&PjFR{#9dQxc>&E$4@4Tjk&KN4XO z(%pl60cfa_+LqnLjFMLd<3cq61r`u%6v_u1?A%Zx7lFxs6mTC>xNSWKQ0C21!ki;P4) z$uPK>wr5Z4YHYY46QINS%I8`n=S!h6kP+qsj(9Jg4^NH1}=b~4~$ zPY){~$nOYHp~xA zjYSWk9ZCzvIhBlj#Vl(?Oa(DS(lbsnJY#7lNy9d8K*Vw8vxJzN`B%rE%OPghYb|h- zEJJQ<3A0G$;rn_Y%@@F7;2Tg-!nLE8GKfx;w|47mqd?%1w>WCjVJ=7XExLg91>Jj4 zmvi9tH{eoHfT-T~h^jJ{IWt=O>Yg0O#;X`h&XzXqUCKYXeB>GBSwnUUiyBJJI$p+T zsj%~^XHq^(?IDhw8MgtfCMy_b43;3J9t;IL^nRG+B;%bvR#v*jy{H}GoA@V#Luy)> z=B1dO5R(R}+s2gjwahT5f;w^$29S^pS zd%iddNdFQd5XOA-_DDmdk3L9}IKcytN{E1s{LnP4Mm&&pEGV(>nPzrl%6;pm?jzqzHh&cm5aRz^ww*m}O#iiLU+PLHZZ;!#AFI~_^8XUdyfqy* zS?6jdlX_h0YMR4^ujQo*%SgniohM#*52q$6Crc|yQbFb_eafcXp`_;k52S*#M#f8HQ!?u1aq}M%(=2eSU9d`*Vitk_w%U^PH8m+h> ze6f`(@Nhe|i4i(&8p(b6k6!sJtu0rt*3>=`S%p=bqmGB5whC}~RLY$Qi(X_+teFqf ztb#2z!4A{-mZ&u8gR~Y8)wvwU5C9Z{x$?nkz!!+eYI1E0Y{SBL?-G_ zj zB0KPwx1_-_!;8eryB9;Oz{ssum3fpKb{3eIGW8(qwoHtnol4kc(vjQt%G?xilFsP~ zi|6Md(>5;li(7O3i2Sna+laW6+rvDxi-#xBuMCokFi6^8B*^o#7#<^?bq_A}MEz=6+)%ooqjU@I<1_PX%66QK9Wu}1 zfn5MSt>^tQ(Z3C0Ba?w$V5MI$d|{?5X>{<9%G%^s0AGQX=yE&dr2m7Gc$K zVX#$I!#cK2U4h+-*WGrDJvF%SSLb2_Z|!p@-F7V9HMp|dfav$xgD#nt1CJ| zL^n6YKcOAmyXSjXG1s209RqFO@{_7>k;cKVg}jvepbpJ6EU&ewIua9Tm%-9ytmvR0 z(nl+RhRX!UGoP#5Qbw4T4pGFP= zK5bJ*A>2?{1~-+^&%`3_DSf$+vi;AOiCLOcT4CmujpSS~XRpOMOFlQZAGNDuy&VrV z!km{@QAyudnV2L*E6AGDc#Ps*PKCkUGsyQ>S=6{b>o{Y}t$G<@X_bJ1or zX!EhIW%raHHqqu+Ml;V0nsBqzmw%a4D=d{x8>boqq){s8fvehD;s-bT*$^C##Oqku zOGBCr`eue40Gsm)_R7-t5w^9HTUOjunpJubmU$^gFN<m|uP8hBtB zgXW7#t0#NQiVd z$vP83Tq@vcjg2NNdz3JelG+!X*;no z(lJG0N%xsw!ec+P=6)h|q%FWyaMiPOg360yPzXD?Dje@MYA9vkS-tN+&F6z?+r@apmc8T|NtF#0kS zL28iRzVV({P42ymHoRCic*?5ZN+pWj^bD-pcD!GvJ?sAf8(%JKxaac5N2JG5bPTw**<2{N#(Wx zy!Xly#}U4L&fG>NeGL3Vx~V+2&~fXcVXIG?eq>{Ixx>KFEG{Y6gT=L)$Zk=|S$M#C zK=s3fw=&FijGu#U8YPq)+P=$NI{|{K4rT#tfWm-Fd>a82x(;S6YyhY@*s<-YpfE4| z%9}K>P&Ow9l9*KxS3{5v&S?ux!~) zg%u>lD(sIatKVD+j*z7?eBMK8h(EG4t4Oa>6@Jzdl$Hu8mQOih65A4zRIJr%vSC>W zltww>x7GlHCUk*3YtVc#j?k$hJfz#d#bJI$I7AkT@CFZMAqwj%!rx5^rbHFv5E=Yi zGXP@=NG#V1sz{bKsJuXHI{(C68vNHLK_x-hc^qs&>#h#c;%ExYe8!p*upqN`fX=C@ zwCMapeG!qD=bBQySeFg-O<5|fDoVw7!Bm+_TUIt~Dy^z=&Rwq8tRl)vr>&$EJ&|Jd zkF-hUpq`XI-^%~$%6Frr|1|nfrHb^odCy@{Z`c~YcAYqiUl(2USKm9a zptPQ>8&RyeH1L|z<5k-;Wff}emZBMbXqy*9!QVdpE@az&dhR-7(mOzzz~ivF4kSc9 z2BcJbCi)N)d^)7(8C8qpJ8R?}c0RFN5hE?c7=MYKu2)O#A%)DPf^;MTz(q;q0^KXKUVK)#|s{ZH<*T{_JS%x}@y7 zpmy!>t!wVep1NbH+e}{jUaqpM=NhIp+#wf5rtKGxNf(cBtLI(h7cQ6eE9{2lH74cu zy((XL=H+N4Z&LZ5!y>2iObYW%41Y{-tP6(_hwwnSq(v@`uguE6r;+C$gPJdc3;5&< zc=%P^Zp;gp$P1UH3;3T=UGWKB@xWdMPXS$e@m)C?U3-Cb>}vJwYzFr4dbKO`^(*QP z?4Aq&GARHV#D(lOEC50j0AU3fe(KGcs1Vt_I9w=i3t%HqzSYGBXU;a8EVWJ#dns$j z>Bsh)->6W73#_%T}B9%GRXj_mv6U#g?owlYT4;_$?h=A6?(Vj@y9C!DfuO;^&He8C=3dVC|J!@^OxM&? zXHR#}%+obp)iwZuN^T+fjrgjh*j>|7^j!5yIqNmphK$*&eY3Vl_0kYH-)Azr_l#T| zD(+a$4MQzer>%wToU8K>d-g)@ceh|G3KOt75tlNyEJxlq#e_0}zD(a}exvYJIi;iy@yxzN`u;gZb{R#9 zHJ>wrm*pC47)M&RgDW|4Y zK3JV_85hk+?=U1oDpJpurAQzg8{6M0RLGAS5l_?GqMac1=rAiPhtzU9r85cC&Xlxc z(f41`JAj`b5O=+7+zN5)tVKG#DY%U>r9qJaQjv5cVVyI&G#_SGL3PSbyJtKLsk*h3 zh&aflxT&FpbVHJhZen0&QfoMf?IP@AJs=Zh#9n-~;>M2+UFH3fs@t&wKSo8D1A(Q< z|2ZFUyrwI-PCJjX8aUhIsBwMQYG5ZUt#-KAANX$DVISu4#PVSGWVb&I9A_ee0u7<6 z2C`%AYtf=zEDAB*+{wbE7tD+V7f}}Hnh!~}iqJ@ZgJ!l2mP=j+%$nCDpjq*Im^e}N z_5gX^O(SVxwri`bv~1&dsR|ulP=pobi8KBAVN3ciO|R{W+WX9tb`?|bdM6x8b;PRD z!TY0ZeEGI)xY&oM*#tr-_prJy-F$7oW>e$Hquj)`76TGXHcR(Qo>c;7+2@*rlz85pe)>vPHDT; z+X7_~?fo7vGtZu5n%b7D#(!KG{-l0^`M0Z@f}~;g7!C}q8Uq{*{XaerJ6Bs{GbfO< z`meD1>{Yv+R=nV|2TX|oGEMe)XOl<_iQJ8EDL&+pxuy53y^gdVS0=oao=RhD<&Xyj={6Qx|1MYgpX#Dw(C zKQayP%n$NsYwne{mk3Ra`e?0xE4VcMrKAx_N}go%+*Cf|S*xR+O~dqKXC9dU?Qzx5 zDw58xnwsmgF?UyF8SmXqfd~qA{CoDfs^GNHxahd)MU_V*+IKcG*D_KbaLXzkDhYlv zggvxEls7uG=c?OP$@O1m%2sLpeFIZR3#$3-N9ba$A1qw?#&(X5z3zJ8nRj?Q6zb}q z?cRl3nQhnqI#MR{UQi%Chz!K~{K0@JA&OZi`Qpe}A1iGwpZ&WXglbyHg{%Jgv)?eZTpdzG$3zVjy&Z5q4l$pH`i zZA%R{E|aA<8nc|s1|ifvz7a1Trx!N5PEBN#-g@H_#_j`x;vRR|w$e`CFrb_TnpQcK zsXvx~)kB;l2V_utKWo+F-z%GN`zAQ0w#0{-hsc{{*}zfg4zL;vgRX zK3T63>E-C2rso|UGT!1yxB)C{OO4?2=7g%q^C)WW=&5yjzHTvh(wf;-IQM=&!Dq6M zEi3jf9l5@cW)x63y;MznQX;@6Q5IUq8l86xzPn~JSV`gk5-YfYZH8rN(J0n*4=3YpzJG-CB| z%AwNbX6S+QB85`NMa^m z{s`6&^V^=S3)LWcFE~wWi{{@au>i1|H)xfNo%G*+SCc{2YqZMEi4?24hfRlh+Fqo4 zSWR>b)rMtXhvpvI-uaH8x7?YfzjfyUu!~n{mFN>iR(0O74x!B42VA6KULvR%{45ck z@8fWfOAy}+qmsa)Lcu~nfqw=Q3CML8LB0G$G6J0}ieL!4y%mL9$Jj*-rC(LYP{LO= z;QxGg=FC3TSM2qemMq?3Roj^X_&yJ;+PFMsTg}2>3F=&m!*+GfT?KSjqBH&7@QqV-kckAi5 z>e_GBK!=MYqVFir09t{mAO~WM-eOi8UbuGoFr%+u_rr3u(okQOIQJA4kSMN0KJ1*0 zRPT+L@{zTuxz~WX*T|zhtO1N=An=&PgAl4JaMKmF9r^R3$T@EqF_bhh>~;{Vw0S%; zRJfFc2@v|9%}63V)j}fWDKeF$@*(N=@T2sh3nzx8Fe;Jcjw1(=u?}ga^SI zU+lJ{%h_1u;B<%cyWheeAYq%3$7F0iq!30PX1au`JqBB5uoGK2=-+r5Ph&*pXkGQ^ z1o-@Y^lW(DZ$%7??ozHb)ImCgi!Lvg3oa5s@{fL=`Vbcq z1Jv1nbh7Ph?W!ncgR)rB2~mg zTsM{aS!xKtHV6OrslPQ3Z7_EmK8Ejxz@b?h!bgZIH1}LI{M&|o zG(?4Z7@G0FH6%q0W*cP*gM;MF*L_7yN(a=8Pif>9f`?ltAe_?5%iOj4P4znyg0-pI#MD3) zBfw~IE8B@n_<+eIF=*^^V(D0EICH-i6LYP@C#5XEWEX=H3yn!FgT~n>XZi1Dk`NiQ zJ|!t^L9W00fndC&6tuM)HtqQ@9bpkkmAJ(f5%5epBDx(}k-Cp^h>2Q~`2Xy*sXLk> z>(gA}j4(wqfA|bBUekM6_})XPD247rDF3*=!=UvKX!#gkFe*_BhoJW6{pwyl01|Ey zf`nYKXPzz)mpX0qxb!k)JU?AYF$B_O0;y*XBL%qiu7G*W*uFJ~k>Z97_r?#$k=G!_ zv@vtKx#vrDwh~AtRzu2r<7u48&ZXM~mH%oBpqBrZX(Y#h$IW zj0@^M*_4^lVl?Sr#=Xl4kHbM`dR{T@)MB;IGs5i^L&fhC+@;?n;pMl)+ef}Z zmY*&hroqv%5~JOBrq+-bWOXV-gMq9(k0%I-LM$rqxLl{v04)=I>tnUvE!OdK4O@g0Q_xN-aNeM1!b{w9ii4r| zj{H!?cLyd?OW!zY2OE@?=|_ec#MkDpG4-9rTC0<`se6EzR|%Ic$8p6vKzXpZ5&yA@ z!OYIo&fevJUx`q?1Afd6_od&q?K!mc4?L-l}ZBCv6fN!{E$g%UY*lQti^19ca zADUKG#k9tnsYX~~i}Dh?`Qoe?$zZV*;KYwY%(a|=7`}l#!Ti!}a+~3!xc8L@DT<;_ za!G6lYvgWX@N?WgM3Rw|ym%iF^hC1AN`_lZJQ7K*n}ah+hrWQbVc)N#He^M?=gwP! z>5N0*RlF&<=AXgZ`RqyIF9m-PpYndjoX9dx!6gmk0W!zNV4|JbS0^G7zoJd1CaeeeT>z@XBi z+8OW%ip+(-sWg(ipW2J+(GZymmpW|j42TYLVw$l}B@WQ~e!co^HAzOZ~Q8>$q@94pzVW?Kc7JBrYOk3 zz_9)^4RZNtW^2a$*Dvc|Ga((_NCGZwKa>-H)a&(1S@&yTGvPh{U`|bFdd+*HdG#Z@ z7WG02l}R}ah#t~7VOXeyYLvG_x?-!nCE%U9xnT+s7MOEjT7Q%Gx zHy%fIxi($V@}apV+1D zQ?h6Z4giOuS^>gLyTThzb6?Ch+CQXpa>=qqW#nD6c1_O4rIOw6X!xwE^3jLTD zyJ9n4>J&>9!HrOdl3TsC7VY`;tGYFW?+QiSt9CeDeZ>8p4gISGu5|D_TYybBi`=L3 z1DzrEwm+YV{5C!M3{?9bbbY*0HZl--*TwqimE;^+mn56`*6iAZQ{#9jo1)GQ+D=^t zpnW21>8F!N0eMUd=)dA>OQ2{DL_evLEXZ<%e(EP=rHK1R&rsiuUX(N{IOwd8=gK%p zFEsM)ocFW2@;lt~5u^3wX$XEJ58C?$+mek^;he{d(H%)4A-}81L1O>MU(*{s;4#J@ z;@Y5Ri|KAp9zY(J8}joFf1lfvvZ`?p1EA2;&pN=%{q5x(Li7TckigR&fZG3QTS&;q zEC2;JOMMH#Ekf{3{9rSU%IQ-G+*DLYR=*{pqq=dN1VIr?B5N)+*}|0jVw^CfU6>1> zpb?vOTEJO3kyVhQaU=Q?SUUza{&}1VTfta!5#O?&I(_-f5I>Kuy5k^fPWnF4sRw9w zJ90iqm7I@j$q^go!V{$w0W~ym2tgXS^nh#aCeRO_pEUvPK^#chFOitFoz8-=)*F5` zx+11@uUj|11<6v-U*H!t;ZpGJZCsifSzh{2!e(?9R<;nh5;BzBFnJ2a1%@faiQp@j zAXw-`R7bmnmca%5H9n;x=KNKZVczL@xy@iWPcYgFvOyQth!3?KP6L*Dz|K(|HZfA} zyk4o#M|>34vO?YU3u`DW=*&$`XQLdZ$Z_#O6VaU!pp(#>K(v3;X*X`gK=kw`ob9 zzo<>8WJibkpL-j5f}zqO_c4tfjAWWrOwF)|8xzrW@%Hxbi`H6u)=PZRvpP$H;~2Pd z9#2;nH6Hc+mQ_==-6FGjzuASe=P~r#`vtRylwH9NzuznEZlQB{CPv6=eezLX&`W-& zX*T{+UcRis=61amJCiUc2$x|Zs?eX23t4GJ!gTA$ot$0zHE0Azaa79yd)Bf!OvDul z7whZ;+LwL@T7cs`A{w)rBmo0$DrJ&-nXdYWvfa24ptFGcWw|Q6aLuXvW3AzW4cVEk zdn1a3>~$&DPdaczT3<)>xz?FPp){1x%VL7579=pi-y{BCW`%ZnX3%kw$$5`YI@ zAKSBoHwj0K4mplTrd|-uC%Vp_kd(}cg=#}}YS7Y2Hx49Jsb|4GvID$#g7`omq@>Cu6OvhN~aJs2Xo%V@=P@b)`9jVa^cf7*t(GIMn_@2nk z55rz-Jg9^}a@L&g{(emS`w?oLjEj9mb7ECQM{x)G$`56!6jp|qBrDFzt)tcgRqasY z);79T(_U?kjwqAc*kHF>^KrPD5_yxVv!tqOs|@YC0n^1}-bo=UgD0_KrQ?i}cjI$M z$g#5JuynHx)+hV(UYA(0fosJL^udKzryZw7b)jq*gSC44@$I1nwS_dyv1!|a`CF~c z6#N^McNv_P0R@8}ksUlpRf~qXfycXS;e-bmrlFd&AL~n*v^JZ<0hn$tTFpsIb0>w> zbffa{{o*{%F_VNE=Fz<>jl&Ta>#;r4`)2kz3hHN6;)bx*#?AJ=o4*1VhAt(M0LO~> z73QOsE>9wLtmjWfd_VOq_^$+$uEesM{eE=Q%CTtU2!$&>c?(5KadI&%LS!tdt;sLR zXgx9XUdstZa*q!%T4G6$W;Qe0Z${(i*R0yrw>!2?pK`!N$1f6jL#7X}&h~_2bE_J; za}y~7Iu}32QdI6CJ`NZy5xiSj8=lH+O5Gs%(`fdWw_T+|Ros>V%@S@Jf+WEe~F8fhQ%f@7TZ6ATju?)@i2 z0k~mSQ<@83fExMl7bt_8;b;gUN*ldRY$hiUO4p zJ~kW$nCA;ilp$LR#<&2Rf!r!fl#GM%MfxfnF>}(?EAkFZu_Uk<%`KL7yfj_K+?^Q2U^giA#epF0N@ipp0yu$gLA107~ z;N=1SoQ-h|H$cdbr!|~Z%heR`E|cv>Hqckk86}N%@N(b}R>}$d57ZLN<2>j(c?s)9N!1d%eFtLu|KV*q1vf zFaH5ZjSYFwJjoG{MOi)NyjMKwEPb&M{Mb=^ZTN3~7#PU@QV1IFa`68e?{+R~AB=7O zN(?-ovSzi)f*EiI;|;U*ups2PO~JufFK@(UVnf)bVakKuKtWC`@7$z`Ym*wdehPl0 zaZF?^`7BMC#o$OA$OE-3Ib-pCHvY6O(mUrXUnxhT@%Ar3PGB(!o4GNoqu~0OLJ0EA zn@C&>m8tN$qLmhI|ED9HcM1h8_#*ya2eag|=F)slS~CigOnm8_>2lfPBTOJut+t%X z?NaaH;`s+d#pXJs!Z@s(HxwMIS?2?&gx)$~!P>V{7 zYS=bWx=s4nKET>;F)s0EW^f$*Bs+bj z7MQ8fcV9-!!w$5h@CZF2X&wxAn;S``Yi8zb@ZXqm_hgwJ^OjN! z=9LenlUfpX^+hc6B&laG<{FnA5IL0g(UJ@D$2F3Rl*!xkiNa4f@NILgbPKGh2+Q^( z?WpB9xdgA{kZ+jvn@@Bfe+ox^2G0s^i}qkPF@-llE~;BjjHeG1>w7jE9Xhm^h>-2t zC9vO>VZzEE;axT%hk(rQjc7n~tL-t9n`a_~YXkiJ$<({voB`1T}eVfq7L zvoQW;TEY`h{PkQscUwSv>r<=&bggDvo$+B;SY%1I*OVN>%LQ-74Hw!m8NMP`m}Im_yk_U+e%3G1)*0% z6xL=&`T179iB0;|U9pSLXnF;f!-R9|eo0qh^aM`YFC-8iab1Fj$0$mpI?ztj?I6^T zZu6Ly&(7apvC7i7=B9}Zm5~6`prI2C`IdS(DhJm+^0Q|p6o38_UiH^-3uG6}>3h-S z&iPW^diZPxLilsR1(U03cD-eG_6$7{3Aj+AOO_~L7MoQuuAoc?b^c3$rI3*i^cd91 z170k3AaJNM-&DxL%`NGK`$e`0a!8-q_;G4qnc3B2@Pch9k9aW$t<1!86Z#fdn0D;9 zT|iC*BbUGACV#kC{~eD%?H(~&%8(12(D0ZBSVG}gEd`mlGrWMngN$IgD!O7NHS5wE zc8fEb8+HE)tCc!58D{WkQO~-3eZycoL|^X$$gCs_4uJ{z|K3#r)H#2B0zkd>f9|pH z+Q93K|NjdI0}B8z1ey3p{{Pp&*NO4}0GmL!zt?HW>sPZ@bwO{15iPz-t zkBM9DzfJs$D!#_Qe%SuOAL#uT|BpxSYy9i`+8=zo;otaIcR3|lXwU!y149Ot0MM2Y JY9D^r{s(E*sW<=t literal 0 HcmV?d00001 diff --git a/sam/docs/contracts/docx/영업파트너 위촉계약서.docx b/sam/docs/contracts/docx/영업파트너 위촉계약서.docx new file mode 100755 index 0000000000000000000000000000000000000000..acf1e0e1e9fdc6a73a55588fdcd2a50ae6d0d9be GIT binary patch literal 30124 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 cTmE(Ze`*g2{89hx2w{L+0 ⚠️ 중요: - 월 구독료는 원이며, 영업 협상 및 개발 범위에 따라 증액될 수 있습니다. + +- 계약 시 확정된 구독료: [ ]원/월 + +### 4.3 납부 방법 + +- **개발비**: + - 계좌이체 (세금계산서 발행) + - 입금 계좌: 기업은행 170-175519-04-011  (주)코드브릿지엑스 +- **구독료**: + - CMS 자동이체 (권장) + - 또는 세금계산서 발행 후 계좌이체 + +### 4.4 잔금 지급 기한 [법률 검토 반영] + +- **지급 기한**: 서비스 게시일로부터 **3일 이내** +- **사전 준비**: 회사는 영업 단계부터 납품 일정을 공유하여 고객이 미리 준비할 수 있도록 합니다. +- **미납 시 조치**: 제13조 참조 + +## 제5조 (마일스톤 및 진행 일정) + +### 5.1 개발 단계 (5단계 통일) + +| 단계 | 주요 활동 | 진행률 | 기간 | 납부 | +| --- | --- | --- | --- | --- | +| M1 | 요구사항 분석 및 기획 | 20% | [ 2 ]주 | 1차 개발비 (착수금 50%) | +| M2 | 설계 및 개발 착수 | 50% | [ 2 ]주 | - | +| M3 | 개발 진행 (50% 완료) | 60% | [ 2 ]주 | - | +| M4 | 개발 완료 및 테스트 | 80% | [ 2 ]주 | - | +| M5 | 검수 및 서비스 게시 | 100% | 최대 2주 | 2차 개발비 (잔금 50%) | + +> ⚠️ 중요: - 5단계 마일스톤으로 통일 관리 - M5 검수 완료 후 서비스 게시 - 서비스 게시일로부터 3일 이내 잔금 납부 + +### 5.2 일정 조정 + + - 개발 일정은 고객의 협조에 따라 변동될 수 있습니다. + - 고객 귀책 사유로 인한 지연은 회사의 책임이 아닙니다. + - 불가항력으로 인한 지연 시 양측 협의하여 일정을 조정합니다. + +## 제6조 (서비스 게시 및 검수) + +### 6.1 서비스 게시 + +- 회사는 개발 완료 후 고객에게 **서비스 게시**를 통지합니다. +- **서비스 게시일**은 고객이 서비스에 접근 가능한 날짜를 의미합니다. + - 서비스 게시일부터 구독료가 발생합니다. + +### 6.2 검수 기간 + +- 고객은 개발 완료 후 **최대 2주간 검수 기간**을 가집니다. +- 검수 기간은 서비스 게시 **전**에 이루어집니다. + - 검수 기간 중 발견된 하자는 회사가 무상으로 수정합니다. + +### 6.3 검수 완료 + + - 고객이 서면으로 검수 완료를 통지하거나, + - 검수 기간 2주 종료 시점에 특별한 이의가 없으면 자동 승인으로 간주합니다. + - 검수 완료 후 서비스 게시일이 확정되고, 하자담보 책임 정책이 적용됩니다. + +## 제7조 (하자담보 책임) + +### 7.1 책임 기간 + +서비스 게시일로부터 1년 (소프트웨어산업진흥법 제16조, 민법 제667조) + +### 7.2 하자담보 범위 (무상 처리) + +| 항목 | 내용 | 예시 | +| --- | --- | --- | +| 버그 수정 | 소프트웨어 오류 | 계산 오류, 기능 미작동 | +| 미구현 기능 | 계약서에 명시된 기능 누락 | 약속된 기능 미구현 | +| 성능 개선 | 명시된 성능 기준 미달 | 속도 저하, 응답 지연 | +| UI/UX 수정 | 사용성 문제 | 버튼 미작동, 화면 깨짐 | +| 데이터 오류 | 데이터 손실 또는 오류 | 데이터 삭제, 중복 생성 | +| 보안 패치 | 보안 취약점 수정 | 해킹 방지, 암호화 | + +### 7.3 제외 사항 (별도 비용) + +| 항목 | 내용 | 예시 | +| --- | --- | --- | +| 신규 기능 개발 | 계약서에 없던 새 기능 | 새로운 모듈, 기능 확장 | +| 구조 변경 | 시스템 아키텍처 변경 | DB 구조, 프레임워크 교체 | +| 추가 모듈 | 새로운 모듈 개발 | 회계 모듈, 재고 모듈 | +| 기획 변경 | 초기 기획과 다른 요구사항 | 화면 구성, 프로세스 변경 | +| 교육/컨설팅 | 사용자 교육, 업무 컨설팅 | 직원 교육, 프로세스 개선 | + +### 7.4 하자 처리 절차 + +| 단계 | 내용 | 기간 | +| --- | --- | --- | +| 1. 하자 신고 | 고객이 이메일로 하자 신고 | - | +| 2. 하자 확인 | 회사가 하자 여부 판정 | 3영업일 | +| 3. 수정 작업 | 하자 인정 시 무상 수정 | 7영업일 | +| 4. 검수 완료 | 고객이 수정 사항 확인 | - | + +> ⚠️ 긴급 하자 (서비스 중단)는 24시간 이내 조치합니다. + +### 7.5 책임 면제 사유 + +다음의 경우 하자담보 책임이 면제됩니다: +- **고객 귀책 사유**: + - 고객의 임의 수정 또는 변경 + - 승인되지 않은 제3자 개입 + - 사용 환경 미준수 +- **불가항력**: + - 천재지변 (지진, 태풍 등) + - 전쟁, 테러, 전염병 + - 정부 규제 또는 법령 변경 +- **기간 만료**: + - 서비스 게시일로부터 1년 경과 + +## 제8조 (계약 해제 및 환불) + +### 8.1 환불 정책 개요 + +고객의 임의 해제 권리와 회사의 투입 비용 보전의 균형을 고려하여 수립되었습니다. + +### 8.2 단계별 환불 + +### Phase 1: 상담(인터뷰) 시작 전 + +- **환불율**: 100% (전액 환불) +- **조건**: 계약 후 상담(인터뷰) 배정 전 +- **위약금**: 없음 +- **임의 해제 가능** + +### Phase 2: 상담(인터뷰) 시작 후, 개발 착수 전 + +| 진행 상황 | 환불율 | 공제 내역 | +| --- | --- | --- | +| M1: 기획안 작성 중 (50% 미만) | 80% | 상담매니저 및 기획/개발자 투입 비용 20% 공제 | +| M2: 기획안 완료 (50% 이상) | 50% | 상담매니저 및 기획/개발자 투입 비용 50% 공제 | + +### Phase 3: 개발 진행 중 (5단계 마일스톤 기준) + +| 마일스톤 | 진행률 | 청구 금액(개발비 대비) | 비고 | +| --- | --- | --- | --- | +| M3: 개발 진행 중 (50%) | 70% | 70% | 30% 환불 | +| M4: 개발 완료 및 테스트 | 90% | 90% | 10% 환불 | +| M5: 서비스 개시 완료 | 100% | 100% | 환불 불가 | + +> ⚠️ 중요: 5단계 마일스톤으로 통일 관리 + +### Phase 4: 서비스 게시 후 + +- **환불율**: 0% (환불 불가) +- **개발비**: 전액 확정, 환불 불가 +- **구독료**: 매월 말일 후불제이므로 사용한 만큼만 청구 (환불 개념 없음) +- **대신 제공**: 하자담보 책임 (1년) + 유지보수 (구독 기간 전체) + +### 8.3 환불 불가 사유 + +- **고객 귀책 사유**: + - 협조 지연으로 인한 개발 지연 + - 요구사항 변경으로 인한 추가 개발 + - 승인 거부 또는 회피 +- **약관 위반**: + - 허위 정보 제공 + - 부정 사용 또는 재판매 + - 회사 명예 훼손 + +## 제9조 (구독 및 해지) + +### 9.1 구독 시작 + +- **시작일**: 서비스 게시일 (검수 완료 후) +- **결제일**: 매월 말일 +- **청구 방식**: 후불제 (해당 월 사용량 기준) +- **일할 계산**: (사용 일수 / 해당 월 일수) × 구독료 + +> ⚠️ 중요: - 계약 시 확정된 구독료 금액은 [ ]원/월입니다. + +- 매월 말일에 해당 월 사용일수만큼만 후불 청구됩니다. + +### 9.2 구독 해지 + + - 고객은 언제든지 구독을 해지할 수 있습니다. (위약금 없음) + - 해지 신청 후 30일간 데이터 백업 기간 제공 + - 해지일로부터 30일 후 모든 데이터 완전 삭제 + +## 제10조 (유지보수 정책) + +### 10.1 유지보수 개요 + +- **적용 대상**: 구독료를 정상 납부하는 고객 +- **적용 기간**: 구독 기간 전체 (하자담보 책임 1년 이후에도 구독 중이면 계속 제공) +- **비용**: 월 구독료(500,000원)에 포함 + +### 10.2 하자담보 책임과의 차이 + +| 구분 | 하자담보 책임 (제7조) | 유지보수 (제9조의2) | +| --- | --- | --- | +| 기간 | 서비스 게시일로부터 1년 | 구독 기간 전체 | +| 근거 | 법적 의무 (소프트웨어산업진흥법) | 계약 조건 | +| 비용 | 무상 | 구독료에 포함 | +| 범위 | 하자(버그, 미구현 등) | 하자 + 일반 유지보수 | + +### 10.3 유지보수 범위 (구독료에 포함) + +> ✅ 무상 제공: - 모든 버그 수정 및 오류 처리 - 보안 패치 및 업데이트 - 성능 최적화 - 긴급 장애 대응 (24시간 이내) - 데이터 백업 및 복구 - 기술 지원 (고객센터, 이메일) - 플랫폼 업데이트 (프레임워크, 브라우저 호환성) + +> ❌ 별도 비용: - 신규 기능 개발 - 커스터마이징 및 추가 개발 - 기획 변경 (화면 구성, 프로세스 변경) - 외부 시스템 연동 - 추가 교육 및 컨설팅 + +### 10.4 서비스 레벨 (SLA) + +| 심각도 | 상황 | 응답 시간 | 해결 목표 | +| --- | --- | --- | --- | +| 긴급 (P0) | 서비스 완전 중단 | 1시간 | 24시간 | +| 높음 (P1) | 주요 기능 장애 | 4시간 | 3영업일 | +| 보통 (P2) | 일반 버그 | 1영업일 | 7영업일 | +| 낮음 (P3) | 문의/안내 | 1영업일 | 3영업일 | + +### 10.5 정기 유지보수 + +- **월간**: 보안 패치, 백업 점검 (매월 첫째 주 일요일 새벽) +- **분기**: 성능 최적화 (분기 말 일요일 새벽) +- **반기**: 시스템 점검 (6월/12월 일요일 새벽) + +> ⚠️ 모든 정기 점검은 최소 7일 전 사전 공지됩니다. + +### 10.6 유지보수 신청 + +- **고객센터**: 02-6347-0005 (평일 09:00~18:00 ) +- **이메일**: support@codebridge-x.com (24시간) +- **시스템 내**: SAM 시스템 내 고객지원 메뉴 + +### 10.7 유지보수 종료 + +다음의 경우 유지보수 서비스가 종료됩니다: 1. 구독 해지 시 2. 구독료 3개월 연속 미납 시 3. 중대한 약관 위반 시 + +## 제11조 (고객의 의무) + +고객은 다음 사항을 준수해야 합니다: +- **정확한 정보 제공**: 허위 정보 제공 금지 +- **협조 의무**: 개발에 필요한 자료 및 정보 제공 +- **부정 사용 금지**: 서비스의 재판매, 재배포 금지 +- **지적재산권 존중**: 무단 복제, 역설계 금지 + +## 제12조 (회사의 의무) + +회사는 다음 사항을 준수합니다: +- **서비스 제공**: 계약서에 명시된 서비스 제공 +- **하자담보 책임**: 1년간 하자 무상 수정 +- **개인정보 보호**: 개인정보보호법 준수 +- **기술 지원**: 고객센터 운영 및 기술 지원 + +## 제13조 (미입금 시 법적 조치) + +### 13.1 개발비 미입금 절차 + +| 단계 | 시점 | 조치 내용 | +| --- | --- | --- | +| 1차 독촉 | 기한 경과 후 3일 | 이메일 및 SMS 발송 | +| 내용증명 | 기한 경과 후 7일 | 우편 발송, 7일 내 입금 요청 | +| 추심등 | 기한 경과 후 14일 | 신용정보사 연체 등록, 법률대리인 위임 | +| 법적 조치 | 기한 경과 후 30일 | 지급명령 신청 또는 소송 제기 | + +### 13.2 구독료 미입금 절차 + +| 단계 | 시점 | 조치 내용 | +| --- | --- | --- | +| 1차 실패 | 익일 | 재출금 | +| 2차 실패 | 기한 경과 후 3일 | 재출금 | +| 3차 실패 | 미수금 처리 | 서비스 접근 제한, 1차 독촉 | +| 내용증명 | 기한 경과 후 7일 | 우편 발송, 7일 내 입금 요청 | +| 서비스 중단 | 기한 경과 후 14일 | 로그인 불가, 데이터 격리 | +| 강제 해지 | 기한 경과 후 30일 | 계약 해지, 법적 조치 검토 | + +## 제14조 (개인정보 보호) + + - 회사는 「개인정보 보호법」을 준수합니다. + - 고객의 개인정보는 서비스 제공 목적으로만 사용됩니다. + - 제3자에게 제공하지 않습니다. (법령 제외) + - 계약 종료 시 개인정보는 즉시 삭제됩니다. (법정 보관 의무 제외) + +## 제15조 (지적재산권) + +- **소유권**: 서비스에 대한 모든 지적재산권은 회사에 귀속됩니다. +- **사용 권한**: 고객은 서비스 사용 권한만을 부여받습니다. +- **금지 사항**: 복제, 배포, 역설계, 재판매 금지 + +## 제16조 (손해배상) + + - 회사 또는 고객이 본 계약을 위반하여 상대방에게 손해를 입힌 경우 배상 책임이 있습니다. + - 다만, 불가항력으로 인한 손해는 배상 책임에서 제외됩니다. + +## 제17조 (불가항력) + +다음의 사유로 서비스 제공이 불가능한 경우 회사는 책임을 지지 않습니다: + - 천재지변 (지진, 태풍, 홍수 등) + - 전쟁, 테러, 전염병 + - 정부 규제 또는 법령 변경 + - 제3자의 불법 행위 (해킹 등) + +## 제18조 (분쟁 해결) + + - 본 계약과 관련한 분쟁은 상호 협의하여 해결합니다. +- 협의가 이루어지지 않을 경우, **서울중앙지방법원**을 관할 법원으로 합니다. + +## 제19조 (계약의 효력) + + - 본 계약은 계약일로부터 효력이 발생합니다. + - 본 계약은 구독 해지 시까지 유효합니다. + +## 제20조 (기타) + + - 본 계약서는 2부 작성하여 회사와 고객이 각 1부씩 보관합니다. + - 본 계약의 해석 및 적용은 대한민국 법률을 준거법으로 합니다. + +## 계약 당사자 + +### [회사] + +상호: 주식회사 코드브릿지엑스 +대표자: 이의찬 +사업자등록번호: 664-86-03713 +주소: 서울특별시 강서구 양천로 583, 우림블루나인 B동 1602호 +이메일: contact@codebridge-x.com +전화: 02-6347-0005 +서명: +날짜: + +### [고객] + +상호: +대표자: +사업자등록번호: +주소: +이메일: +전화: +서명: +날짜: + +## 별첨 + +### 별첨 1: 기획서 + +[별도 첨부] + +### 별첨 2: 개발 일정표 + +[별도 첨부] + +### 별첨 3: 기능 명세서 + +[별도 첨부] + +주식회사 코드브릿지엑스 +이메일: contact@codebridge-x.com +전화: 02-6347-0005 +주소: 서울특별시 강서구 양천로 583, 우림블루나인 B동 1602호 + diff --git a/sam/docs/contracts/markdown/02-nda.md b/sam/docs/contracts/markdown/02-nda.md new file mode 100644 index 0000000..4a35314 --- /dev/null +++ b/sam/docs/contracts/markdown/02-nda.md @@ -0,0 +1,198 @@ +--- +title: "비밀유지서약서 (NDA)" +version: "v4.0" +date: "2026-02-22" +docx_file: "비밀유지서약서.docx" +--- + +# 비밀유지서약서 (NDA) + +- **작성일**: + +- **서약인 정보** +- **구분**: + +- **인적 사항:** +상호(성명): _______________ +대표자(본인): _______________ +사업자등록번호(주민등록번호): ____________________ +주소: ______________________________________________________________________ +연락처: _______________ +이메일: _______________ + +## 제1조 (목적) + +본 서약서는 주식회사 코드브릿지(이하 “회사”)와의 업무 관계에서 알게 된 기밀 정보를 보호하기 위해 작성되었습니다. + +## 제2조 (기밀 정보의 정의) + + - 다음 각 호의 정보는 회사의 기밀 정보로 간주됩니다: + +### 2.1 고객 정보 + + - 고객사 명단 (법인명, 대표자명, 연락처) + - 고객사 담당자 정보 (성명, 부서, 연락처, 이메일) + - 계약 내역 (가입비, 할인율, 구독료, 특약 사항) + - 고객사의 사업 정보 (매출, 직원 수, 거래처 등) + - 고객사가 회사에 요구한 개발 내역 및 기획 문서 + +### 2.2 영업 정보 + + - 가격 정책 (정가, 할인 정책, 최소 가입비) + - 수수료 정책 (비율, 지급 기준, 상계 방식) + - 영업 전략 및 마케팅 계획 + - 잠재 고객 리스트 + - 계약 체결 노하우 및 제안서 템플릿 + +### 2.3 기술 정보 + + - SAM 시스템의 소스코드 + - 데이터베이스 구조 및 설계 문서 + - 개발 프로세스 및 방법론 + - 서버 인프라 구성 및 보안 정책 + - API 키, 접속 정보, 관리자 권한 + +### 2.4 경영 정보 + + - 회사의 재무 정보 (매출, 이익, 원가) + - 조직도 및 인사 정보 + - 사업 계획 및 전략 + - 투자 유치 및 M&A 관련 정보 + +### 2.5 기타 + +- 회사가 **“기밀(Confidential)”** 또는 **“대외비”**로 표시한 모든 문서 및 정보 + +## 제3조 (기밀 유지 의무) + +### 3.1 기본 의무 + + - 본인은 업무 수행 중 알게 된 모든 기밀 정보를: +- **외부에 누설하지 않습니다** +- **업무 목적 외에 사용하지 않습니다** +- **무단으로 복사, 복제, 전송하지 않습니다** +- **제3자에게 제공하거나 공개하지 않습니다** + +### 3.2 정보 관리 + + - 기밀 문서는 안전한 장소에 보관 + - 이메일, 메신저 등 전송 시 암호화 + - 업무 종료 시 모든 기밀 자료 반환 또는 파기 + - 개인 디바이스에 기밀 정보 저장 금지 + +### 3.3 제3자 접근 차단 + + - 가족, 친구 등 타인이 기밀 정보에 접근하지 못하도록 조치 + - 공공장소(카페, 도서관 등)에서 기밀 정보 취급 금지 + - 비밀번호 및 접속 정보 타인 공유 금지 + +## 제4조 (예외 사항) + + - 다음의 정보는 기밀 정보에서 제외됩니다: + - 본인이 알기 전에 이미 공개된 정보 + - 본인의 귀책사유 없이 공개된 정보 + - 제3자로부터 적법하게 취득한 정보 + - 본인이 독자적으로 개발한 정보 + - 법원, 정부기관의 법적 요구에 따라 공개해야 하는 정보 (단, 회사에 사전 통지 필수) + +## 제5조 (의무 기간) + +### 5.1 기간 + + - 본 서약서의 기밀 유지 의무는: +- **계약 체결일로부터 효력 발생** +- **계약 종료 후 2년간 유지** + +### 5.2 영구 보호 + +- 단, 다음 정보는 **영구적으로** 보호됩니다: + - 고객사 개인정보 + - 회사의 영업 비밀 (부정경쟁방지법상 영업 비밀) + - 기술 정보 (특허, 저작권 대상) + +## 제6조 (위반 시 책임) + +### 6.1 민사 책임 + + - 본인이 본 서약을 위반하여 회사 또는 고객에게 손해를 입힌 경우: +- **실손해**** 배상**: 실제 발생한 손해 전액 +- **징벌적 손해배상**: 실손해의 최대 3배 (악의적 유출 시) +- **법률 비용**: 소송 비용, 변호사 비용 등 + +### 6.2 형사 책임 + + - 다음의 경우 형사 고발 대상이 됩니다: +- **부정경쟁방지법** 위반 (영업 비밀 침해) +- **개인정보보호법** 위반 (고객 정보 유출) +- **정보통신망법** 위반 (기술 정보 침해) +- **형법** 위반 (업무상 배임) +- **※ 형사 처벌: 5년 이하 징역 또는 5천만원 이하 벌금** + +### 6.3 계약 해지 + + - 회사는 본 서약 위반 시 즉시 계약을 해지할 수 있으며, 이미 지급한 수수료 또는 + - 대금을 환수할 수 있습니다. + +## 제7조 (자료 반환) + +### 7.1 반환 대상 + + - 계약 종료 또는 요청 시 다음을 즉시 반환해야 합니다: + - 회사로부터 제공받은 모든 문서 (종이, 파일) + - 고객사 계약서 및 개인정보 + - 가격표, 제안서, 템플릿 등 영업 자료 + - USB, 하드디스크 등 저장 매체 + +### 7.2 파기 확인 + +- 반환 불가능한 파일(이메일, 클라우드 등)은 즉시 삭제하고, **삭제 확인서**를 회사에 + - 제출해야 합니다. + +## 제8조 (경업 금지) + +### 8.1 경업 금지 기간 + +- 계약 종료 후 **6개월간** 다음 행위를 금지합니다: + - 회사의 고객에게 경쟁 제품 판매 + - 회사의 기밀 정보를 이용한 유사 사업 + - 회사 직원 또는 영업파트너를 스카우트 + +### 8.2 예외 + + - 단순히 경쟁사 제품을 판매하는 것은 허용되나, 회사의 기밀 정보를 활용해서는 + - 안 됩니다. + +## 제9조 (분쟁 해결) + +### 9.1 관할 법원 + + - 본 서약과 관련된 분쟁은 회사 본사 소재지 관할 법원으로 합니다. + +### 9.2 준거법 + + - 본 서약은 대한민국 법률에 따라 해석됩니다. + +- **서약 확인** + - 본인은 위 내용을 충분히 이해하였으며, 이를 성실히 준수할 것을 서약합니다. +- **서약일**: ___________________ +- **서약인** +상호(성명): _______________ +대표자(본인): _______________ +주민등록번호(또는 사업자등록번호): _______________ +- **서명 또는 인**: _______________ + +- **수령인 (주식회사 ****코드브릿지엑스****)** + - 대표이사: 이의찬 +- **확인****일**: ___________________ +- **서명 또는 인**: _______________ + +- **참고: 관련 법률** +- **부정경쟁방지법 제2조 (영업비밀)** + - “영업비밀”이란 공공연히 알려져 있지 아니하고 독립된 경제적 가치를 가지는 것으로서, + - 비밀로 관리된 생산방법, 판매방법, 그 밖에 영업활동에 유용한 기술상 또는 경영상의 + - 정보를 말한다. +- **부정경쟁방지법 제18조 (벌칙)** +- 영업비밀을 외국에서 사용하거나 외국에서 사용되게 할 목적으로 취득·사용 또는 제3자에게 누설한 자는 **15년 이하의 징역** 또는 **15억원 이하의 벌금**에 처한다. + +- **※ 본 서약서는 2부를 작성하여 회사와 서약인이 각 1부씩 보관합니다.** +- **※ 서약 위반 시 민·형사상 책임을 질 수 있습니다.** \ No newline at end of file diff --git a/sam/docs/contracts/markdown/03-partner-agreement.md b/sam/docs/contracts/markdown/03-partner-agreement.md new file mode 100644 index 0000000..eea874f --- /dev/null +++ b/sam/docs/contracts/markdown/03-partner-agreement.md @@ -0,0 +1,275 @@ +--- +title: "영업파트너 위촉계약서" +version: "v4.0" +date: "2026-02-22" +docx_file: "영업파트너 위촉계약서.docx" +--- + +# 영업파트너 위촉계약서 + +*Sales Partner Engagement Agreement* + + - 본 계약은 주식회사 코드브릿지엑스(이하 “회사”)와 (이하 “파트너)간에 SAM 서비스 영업 활동과 관련하여 다음과 같이 위촉계약을 체결합니다. + +## 제1조 (계약의 목적) + +본 계약은 회사와 파트너 간의 영업파트너 위촉 관계를 규정하고, 상호 권리와 의무를 명확히 함을 목적으로 합니다. + +## 제2조 (용어의 정의) + +- **판매자**: 고객을 발굴하고 계약 체결을 주도하는 영업파트너 +- **관리자**: 판매자를 관리하고 지원하는 상급 영업파트너 +- **개발비**: 고객이 SAM 서비스 개발을 위해 지급하는 비용 +- **수수료**: 파트너가 영업 활동의 대가로 받는 보상 +- **서비스 게시**: 개발 완료 후 고객이 서비스에 접근 가능하도록 제공하는 것 + +## 제3조 (파트너의 역할 및 업무) + +### 3.1 판매자의 역할 + + - 잠재 고객 발굴 및 초기 접촉 + - SAM 서비스 소개 및 제안 + - 고객과의 계약 체결 지원 + - 계약 후 고객 관리 및 사후 지원 + +### 3.2 관리자의 역할 + + - 판매자 모집 및 관리 + - 판매자 교육 및 지원 + - 영업 전략 수립 및 실행 + - 회사와 판매자 간 소통 중재 + +### 3.3 공통 의무 + + - 회사의 브랜드 이미지 유지 + - 정확한 정보 제공 + - 윤리적 영업 활동 준수 + - 비밀 유지 의무 + +## 제4조 (수수료 정책) + +### 4.1 수수료 비율 + +| 역할 | 수수료 비율 | 산정 기준 | +| --- | --- | --- | +| 판매자 | 개발비의 20% | 1차,2차 입금액 기준 | +| 관리자 | 개발비의 5% | 1차,2차 입금액 기준 | + +### 4.2 수수료 산정 예시 + +- **총 개발비 80,000,000원 계약 시** + +| 단계 | 고객 입금 | 판매자 수수료 (20%) | 관리자 수수료 (5%) | +| --- | --- | --- | --- | +| 1차 착수금 (50%) | 40,000,000원 | 8,000,000원 | 2,000,000원 | +| 2차 잔금 (50%) | 40,000,000원 | 8,000,000원 | 2,000,000원 | +| 총계 | 80,000,000원 | 16,000,000원 | 4,000,000원 | + +- **⚠️ 중요**: 개발비만 수수료 산정 대상이며, 구독료는 수수료 대상이 아닙니다. + +### 4.3 지급 시기 + +- **지급일**: 고객 입금일 **익월 10일** +- **지급 방식**: 계좌 이체 +- **세금**: 3.3% 원천징수 (사업소득) + +### 4.4 수수료 지급 조건 + + - 고객이 개발비를 실제로 입금한 경우에만 지급 + - 계약 해지 또는 환불 시 수수료 미지급 또는 환수 + - 파트너가 계약 위반 시 수수료 지급 보류 + +## 제5조 (수수료 정책 변경) + +### 5.1 사전 고지 의무 + +- 회사는 수수료 정책을 변경할 경우 **최소 1개월 전** 서면 또는 이메일로 파트너에게 고지합니다. + - 수수료 정책을 완전히 폐지하는 경우에도 동일하게 1개월 전 고지합니다. + - 고지 기간 중 체결된 계약은 기존 수수료 정책을 적용합니다. + +### 5.2 변경 효력 + +- 변경된 수수료 정책은 고지일로부터 **1개월 후** 새로 체결되는 계약부터 적용됩니다. + - 고지 기간 만료 전에 체결된 계약은 기존 정책을 따릅니다. + - 진행 중인 계약은 최초 약정 조건을 유지합니다. + +### 5.3 변경 예시 + +#### 예시 1: 수수료율 변경 + + - 고지일: 2026년 2월 1일 + - 변경 내용: 판매자 수수료 20% → 18% + - 적용일: 2026년 3월 1일 이후 체결 계약부터 + +#### 예시 2: 수수료 정책 폐지 + + - 고지일: 2026년 2월 1일 + - 변경 내용: 수수료 정책 완전 폐지 + - 적용일: 2026년 3월 1일 이후 체결 계약부터 + +## 제6조 (계약 기간) + +- 본 계약은 계약일로부터 **1년간** 유효합니다. +- 양측이 계약 만료 **30일 전**까지 서면으로 해지 의사를 통지하지 않으면 자동으로 **1년 연장**됩니다. + - 자동 연장은 동일한 조건으로 반복됩니다. + +## 제7조 (계약 해지) + +### 7.1 일반 해지 (양방향) + +- **통지 기간**: 양측은 **30일 전** 서면 통지로 계약을 해지할 수 있습니다. +- **통지 방법**: 이메일 또는 등기우편 +- **효력 발생**: 통지일로부터 30일 후 +- **미지급 수수료**: 해지일 이전에 발생한 수수료는 정산하여 지급 +- **예시**: + - 통지일: 2026년 2월 1일 + - 해지일: 2026년 3월 1일 + - 2월 중 발생한 수수료는 3월 10일 정상 지급 + +### 7.2 즉시 해지 사유 + +- 회사는 다음의 경우 **즉시 계약을 해지**할 수 있습니다: +- **(1) 품위 유지 결격사유 발생 [신설]** + - 음주운전으로 적발된 경우 + - 형사 범죄로 기소 또는 구속된 경우 + - 사회적 물의를 일으킨 경우 + - 기타 파트너로서의 품위를 훼손한 경우 +- **(2) 계약 위반** + - 허위 정보 제공 또는 사기 행위 + - 회사 명예 훼손 또는 영업 방해 + - 비밀 유지 의무 위반 + - 중대한 업무 태만 +- **(3) 부정 행위** + - 고객으로부터 금품 수수 + - 계약서 위조 또는 변조 + - 회사 자산 횡령 또는 유용 + +### 7.3 즉시 해지 시 조치 + + - 미지급 수수료는 지급하지 않습니다. + - 이미 지급한 수수료는 환수하지 않습니다. (단, 사기 행위는 예외) + - 진행 중인 계약은 회사가 직접 관리합니다. + +## 제8조 (비밀 유지) + +### 8.1 비밀 정보 + + - 다음 정보는 비밀로 유지되어야 합니다: + - 회사의 영업 전략 및 계획 + - 고객 정보 (회사명, 담당자, 연락처 등) + - 수수료 정책 및 계약 조건 + - 기술 정보 및 노하우 + - 회사 내부 자료 + +### 8.2 비밀 유지 의무 + + - 파트너는 업무 중 알게 된 비밀 정보를 외부에 누설하지 않습니다. +- 비밀 유지 의무는 계약 종료 후에도 **3년간** 유효합니다. + - 위반 시 손해배상 책임이 있습니다. + +## 제9조 (지적재산권) + + - SAM 서비스에 대한 모든 지적재산권은 회사에 귀속됩니다. + - 파트너는 회사의 사전 서면 동의 없이 회사의 상표, 로고, 브랜드를 무단으로 사용할 수 없습니다. + - 영업 활동에 필요한 자료는 회사가 제공합니다. + +## 제10조 (세금 및 원천징수) + +### 10.1 사업소득 + +- 파트너 수수료는 **사업소득**으로 간주됩니다. + +### 10.2 원천징수 + +| 항목 | 비율 | 비고 | +| --- | --- | --- | +| 소득세 | 3.0% | | +| 지방소득세 | 0.3% | 소득세의 10% | +| 합계 | 3.3% | | + +### 10.3 지급명세서 + +- 회사는 매월 수수료를 지급한 후에 파트너에게 **지급명세서**를 발급합니다. + +## 제11조 (손해배상) + +### 11.1 파트너의 귀책 사유 + + - 파트너가 다음의 행위로 회사에 손해를 입힌 경우 배상 책임이 있습니다: + - 허위 정보 제공으로 계약 취소 + - 고객과의 분쟁으로 회사 명예 훼손 + - 비밀 유지 의무 위반 + - 부정 행위 + +### 11.2 회사의 귀책 사유 + + - 회사가 정당한 사유 없이 수수료를 지급하지 않을 경우, 연체 이자를 더하여 지급합니다. + +## 제12조 (분쟁 해결) + + - 본 계약과 관련한 분쟁은 상호 협의하여 해결합니다. +- 협의가 이루어지지 않을 경우, **서울중앙지방법원**을 관할 법원으로 합니다. + +## 제13조 (기타 사항) + +### 13.1 계약서 교부 + + - 본 계약서는 2부 작성하여 회사와 파트너가 각 1부씩 보관합니다. + +### 13.2 통지 + + - 모든 통지는 다음의 연락처로 발송됩니다: +- **회사**: +- 이메일: admin@codebridge-x.com +- 전화: 02-6347-0005 +- **파트너**: +- 이메일: +- 전화: + +### 13.3 준거법 + + - 본 계약은 대한민국 법률에 따라 해석되고 적용됩니다. + +- **계약 당사자** +- **[회사]** +- **상호**: 주식회사 코드브릿지엑스 +- **대표자**: 이의찬 (인) +- **사업자등록번호**: 664-86-03713 +- **주소**: 서울특별시 강서구 양천로 583, 우림블루나인 B동 1602호 +- **이메일**: +- **전화**: 02-6347-0005 +- **날짜**: + +- **[파트너]** +- **상호/성명**: +- **대표자/본인**: (서명) +- **사업자등록번호**: +- **주소**: +- **이메일**: +- **전화**: +- **날짜**: + +- **별첨** + +#### 별첨 1: 수수료 정산표 + +| 계약번호 | 고객사 | 입금일 | 입금액 | 수수료율 | 수수료 | 지급일 | +| --- | --- | --- | --- | --- | --- | --- | +| | | | | | | | + +#### 별첨 2: 영업 활동 보고서 + +| 날짜 | 활동내용 | 고객사 | 진행 상황 | +| --- | --- | --- | --- | +| | | | | + + - 첨부 서류 + - 사업자등록증 사본 (사업자인 경우) + - 주민등록등본 사본 (개인인 경우) + - 통장 사본 (수수료 입금용) + - 비밀유지서약서 + +- **주식회사 코드브릿지엑스** +- 이메일: admin@codebridge-x.com +- 전화: 02-6347-0005 +- 주소: 서울특별시 강서구 양천로 583, 우림블루나인 B동 1602호 diff --git a/sam/docs/contracts/markdown/04-partner-agreement-group.md b/sam/docs/contracts/markdown/04-partner-agreement-group.md new file mode 100644 index 0000000..f46b6bb --- /dev/null +++ b/sam/docs/contracts/markdown/04-partner-agreement-group.md @@ -0,0 +1,275 @@ +--- +title: "영업파트너 위촉계약서 (단체용)" +version: "v4.0" +date: "2026-02-22" +docx_file: "영업파트너 위촉계약서(단체용).docx" +--- + +# 영업파트너 위촉계약서 + +*Sales Partner Engagement Agreement* + + - 본 계약은 주식회사 코드브릿지엑스(이하 “회사”)와 (이하 “파트너)간에 SAM 서비스 영업 활동과 관련하여 다음과 같이 위촉계약을 체결합니다. + +## 제1조 (계약의 목적) + +본 계약은 회사와 파트너 간의 영업파트너 위촉 관계를 규정하고, 상호 권리와 의무를 명확히 함을 목적으로 합니다. + +## 제2조 (용어의 정의) + +- **판매자**: 고객을 발굴하고 계약 체결을 주도하는 영업파트너 +- **관리자**: 판매자를 관리하고 지원하는 상급 영업파트너 +- **개발비**: 고객이 SAM 서비스 개발을 위해 지급하는 비용 +- **수수료**: 파트너가 영업 활동의 대가로 받는 보상 +- **서비스 게시**: 개발 완료 후 고객이 서비스에 접근 가능하도록 제공하는 것 + +## 제3조 (파트너의 역할 및 업무) + +### 3.1 판매자의 역할 + + - 잠재 고객 발굴 및 초기 접촉 + - SAM 서비스 소개 및 제안 + - 고객과의 계약 체결 지원 + - 계약 후 고객 관리 및 사후 지원 + +### 3.2 관리자의 역할 + + - 판매자 모집 및 관리 + - 판매자 교육 및 지원 + - 영업 전략 수립 및 실행 + - 회사와 판매자 간 소통 중재 + +### 3.3 공통 의무 + + - 회사의 브랜드 이미지 유지 + - 정확한 정보 제공 + - 윤리적 영업 활동 준수 + - 비밀 유지 의무 + +## 제4조 (수수료 정책) + +### 4.1 수수료 비율 + +| 역할 | 수수료 비율 | 산정 기준 | +| --- | --- | --- | +| 판매자 | 개발비의 30% | 1차,2차 입금액 기준 | +| 관리자 | 개발비의 3% | 1차,2차 입금액 기준 | + +### 4.2 수수료 산정 예시 + +- **총 개발비 80,000,000원 계약 시** + +| 단계 | 고객 입금 | 판매자 수수료 (30%) | 관리자 수수료 (3%) | +| --- | --- | --- | --- | +| 1차 착수금 (50%) | 40,000,000원 | 12,000,000원 | 1,200,000원 | +| 2차 잔금 (50%) | 40,000,000원 | 12,000,000원 | 1,200,000원 | +| 총계 | 80,000,000원 | 24,000,000원 | 2,400,000원 | + +- **⚠️ 중요**: 개발비만 수수료 산정 대상이며, 구독료는 수수료 대상이 아닙니다. + +### 4.3 지급 시기 + +- **지급일**: 고객 입금일 **익월 10일** +- **지급 방식**: 계좌 이체 +- **세금**: 사업소득일 경우 3.3% 원천징수 + +### 4.4 수수료 지급 조건 + + - 고객이 개발비를 실제로 입금한 경우에만 지급 + - 계약 해지 또는 환불 시 수수료 미지급 또는 환수 + - 파트너가 계약 위반 시 수수료 지급 보류 + +## 제5조 (수수료 정책 변경) + +### 5.1 사전 고지 의무 + +- 회사는 수수료 정책을 변경할 경우 **최소 1개월 전** 서면 또는 이메일로 파트너에게 고지합니다. + - 수수료 정책을 완전히 폐지하는 경우에도 동일하게 1개월 전 고지합니다. + - 고지 기간 중 체결된 계약은 기존 수수료 정책을 적용합니다. + +### 5.2 변경 효력 + +- 변경된 수수료 정책은 고지일로부터 **1개월 후** 새로 체결되는 계약부터 적용됩니다. + - 고지 기간 만료 전에 체결된 계약은 기존 정책을 따릅니다. + - 진행 중인 계약은 최초 약정 조건을 유지합니다. + +### 5.3 변경 예시 + +#### 예시 1: 수수료율 변경 + + - 고지일: 2026년 2월 1일 + - 변경 내용: 판매자 수수료 20% → 18% + - 적용일: 2026년 3월 1일 이후 체결 계약부터 + +#### 예시 2: 수수료 정책 폐지 + + - 고지일: 2026년 2월 1일 + - 변경 내용: 수수료 정책 완전 폐지 + - 적용일: 2026년 3월 1일 이후 체결 계약부터 + +## 제6조 (계약 기간) + +- 본 계약은 계약일로부터 **1년간** 유효합니다. +- 양측이 계약 만료 **30일 전**까지 서면으로 해지 의사를 통지하지 않으면 자동으로 **1년 연장**됩니다. + - 자동 연장은 동일한 조건으로 반복됩니다. + +## 제7조 (계약 해지) + +### 7.1 일반 해지 (양방향) + +- **통지 기간**: 양측은 **30일 전** 서면 통지로 계약을 해지할 수 있습니다. +- **통지 방법**: 이메일 또는 등기우편 +- **효력 발생**: 통지일로부터 30일 후 +- **미지급 수수료**: 해지일 이전에 발생한 수수료는 정산하여 지급 +- **예시**: + - 통지일: 2026년 2월 1일 + - 해지일: 2026년 3월 1일 + - 2월 중 발생한 수수료는 3월 10일 정상 지급 + +### 7.2 즉시 해지 사유 + +- 회사는 다음의 경우 **즉시 계약을 해지**할 수 있습니다: +- **(1) 품위 유지 결격사유 발생 [신설]** + - 음주운전으로 적발된 경우 + - 형사 범죄로 기소 또는 구속된 경우 + - 사회적 물의를 일으킨 경우 + - 기타 파트너로서의 품위를 훼손한 경우 +- **(2) 계약 위반** + - 허위 정보 제공 또는 사기 행위 + - 회사 명예 훼손 또는 영업 방해 + - 비밀 유지 의무 위반 + - 중대한 업무 태만 +- **(3) 부정 행위** + - 고객으로부터 금품 수수 + - 계약서 위조 또는 변조 + - 회사 자산 횡령 또는 유용 + +### 7.3 즉시 해지 시 조치 + + - 미지급 수수료는 지급하지 않습니다. + - 이미 지급한 수수료는 환수하지 않습니다. (단, 사기 행위는 예외) + - 진행 중인 계약은 회사가 직접 관리합니다. + +## 제8조 (비밀 유지) + +### 8.1 비밀 정보 + + - 다음 정보는 비밀로 유지되어야 합니다: + - 회사의 영업 전략 및 계획 + - 고객 정보 (회사명, 담당자, 연락처 등) + - 수수료 정책 및 계약 조건 + - 기술 정보 및 노하우 + - 회사 내부 자료 + +### 8.2 비밀 유지 의무 + + - 파트너는 업무 중 알게 된 비밀 정보를 외부에 누설하지 않습니다. +- 비밀 유지 의무는 계약 종료 후에도 **3년간** 유효합니다. + - 위반 시 손해배상 책임이 있습니다. + +## 제9조 (지적재산권) + + - SAM 서비스에 대한 모든 지적재산권은 회사에 귀속됩니다. + - 파트너는 회사의 사전 서면 동의 없이 회사의 상표, 로고, 브랜드를 무단으로 사용할 수 없습니다. + - 영업 활동에 필요한 자료는 회사가 제공합니다. + +## 제10조 (세금 및 원천징수) + +### 10.1 사업소득 + +- 파트너 수수료는 **사업소득**으로 간주됩니다. + +### 10.2 원천징수 + +| 항목 | 비율 | 비고 | +| --- | --- | --- | +| 소득세 | 3.0% | | +| 지방소득세 | 0.3% | 소득세의 10% | +| 합계 | 3.3% | | + +### 10.3 지급명세서 + +- 회사는 매월 수수료를 지급한 후에 파트너에게 **지급명세서**를 발급합니다. + +## 제11조 (손해배상) + +### 11.1 파트너의 귀책 사유 + + - 파트너가 다음의 행위로 회사에 손해를 입힌 경우 배상 책임이 있습니다: + - 허위 정보 제공으로 계약 취소 + - 고객과의 분쟁으로 회사 명예 훼손 + - 비밀 유지 의무 위반 + - 부정 행위 + +### 11.2 회사의 귀책 사유 + + - 회사가 정당한 사유 없이 수수료를 지급하지 않을 경우, 연체 이자를 더하여 지급합니다. + +## 제12조 (분쟁 해결) + + - 본 계약과 관련한 분쟁은 상호 협의하여 해결합니다. +- 협의가 이루어지지 않을 경우, **서울중앙지방법원**을 관할 법원으로 합니다. + +## 제13조 (기타 사항) + +### 13.1 계약서 교부 + + - 본 계약서는 2부 작성하여 회사와 파트너가 각 1부씩 보관합니다. + +### 13.2 통지 + + - 모든 통지는 다음의 연락처로 발송됩니다: +- **회사**: +- 이메일: admin@codebridge-x.com +- 전화: 02-6347-0005 +- **파트너**: +- 이메일: +- 전화: + +### 13.3 준거법 + + - 본 계약은 대한민국 법률에 따라 해석되고 적용됩니다. + +- **계약 당사자** +- **[회사]** +- **상호**: 주식회사 코드브릿지엑스 +- **대표자**: 이의찬 (인) +- **사업자등록번호**: 664-86-03713 +- **주소**: 서울특별시 강서구 양천로 583, 우림블루나인 B동 1602호 +- **이메일**: +- **전화**: 02-6347-0005 +- **날짜**: + +- **[파트너]** +- **상호/성명**: +- **대표자/본인**: (서명) +- **사업자등록번호**: +- **주소**: +- **이메일**: +- **전화**: +- **날짜**: + +- **별첨** + +#### 별첨 1: 수수료 정산표 + +| 계약번호 | 고객사 | 입금일 | 입금액 | 수수료율 | 수수료 | 지급일 | +| --- | --- | --- | --- | --- | --- | --- | +| | | | | | | | + +#### 별첨 2: 영업 활동 보고서 + +| 날짜 | 활동내용 | 고객사 | 진행 상황 | +| --- | --- | --- | --- | +| | | | | + + - 첨부 서류 + - 사업자등록증 사본 (사업자인 경우) + - 주민등록등본 사본 (개인인 경우) + - 통장 사본 (수수료 입금용) + - 비밀유지서약서 + +- **주식회사 코드브릿지엑스** +- 이메일: admin@codebridge-x.com +- 전화: 02-6347-0005 +- 주소: 서울특별시 강서구 양천로 583, 우림블루나인 B동 1602호 diff --git a/sam/docs/contracts/revisions.json b/sam/docs/contracts/revisions.json new file mode 100644 index 0000000..b039728 --- /dev/null +++ b/sam/docs/contracts/revisions.json @@ -0,0 +1,52 @@ +{ + "documents": { + "01-service-agreement": { + "title": "고객사 서비스 이용계약서", + "docx_file": "01_고객_서비스이용계약서_v4_0_전자서명용.docx", + "revisions": [ + { + "version": "v4.0", + "date": "2026-02-22", + "author": "개발팀", + "description": "버전 관리 시스템 도입, 개정이력 추적 시작" + } + ] + }, + "02-nda": { + "title": "비밀유지서약서 (NDA)", + "docx_file": "비밀유지서약서.docx", + "revisions": [ + { + "version": "v4.0", + "date": "2026-02-22", + "author": "개발팀", + "description": "버전 관리 시스템 도입, 개정이력 추적 시작" + } + ] + }, + "03-partner-agreement": { + "title": "영업파트너 위촉계약서", + "docx_file": "영업파트너 위촉계약서.docx", + "revisions": [ + { + "version": "v4.0", + "date": "2026-02-22", + "author": "개발팀", + "description": "버전 관리 시스템 도입, 개정이력 추적 시작" + } + ] + }, + "04-partner-agreement-group": { + "title": "영업파트너 위촉계약서 (단체용)", + "docx_file": "영업파트너 위촉계약서(단체용).docx", + "revisions": [ + { + "version": "v4.0", + "date": "2026-02-22", + "author": "개발팀", + "description": "버전 관리 시스템 도입, 개정이력 추적 시작" + } + ] + } + } +} diff --git a/sam/docs/contracts/scripts/extract_to_markdown.py b/sam/docs/contracts/scripts/extract_to_markdown.py new file mode 100644 index 0000000..ea44889 --- /dev/null +++ b/sam/docs/contracts/scripts/extract_to_markdown.py @@ -0,0 +1,334 @@ +#!/usr/bin/env python3 +""" +DOCX → Markdown 추출 스크립트 + +4개 전자계약 DOCX 파일을 Markdown으로 변환한다. +- 서비스이용계약서: Heading 스타일 기반 매핑 +- 나머지 3개: Bold 런 + 패턴 매칭으로 구조 유추 +""" + +import re +import sys +from datetime import date +from pathlib import Path + +from docx import Document + +# 경로 설정 +BASE_DIR = Path(__file__).resolve().parent.parent +DOCX_DIR = BASE_DIR / "docx" +MD_DIR = BASE_DIR / "markdown" + +# DOCX → Markdown 매핑 +FILE_MAP = { + "01_고객_서비스이용계약서_v4_0_전자서명용.docx": { + "output": "01-service-agreement.md", + "title": "고객사 서비스 이용계약서", + "type": "styled", + }, + "비밀유지서약서.docx": { + "output": "02-nda.md", + "title": "비밀유지서약서 (NDA)", + "type": "pattern", + }, + "영업파트너 위촉계약서.docx": { + "output": "03-partner-agreement.md", + "title": "영업파트너 위촉계약서", + "type": "pattern", + }, + "영업파트너 위촉계약서(단체용).docx": { + "output": "04-partner-agreement-group.md", + "title": "영업파트너 위촉계약서 (단체용)", + "type": "pattern", + }, +} + + +def table_to_markdown(table): + """DOCX 테이블을 Markdown 테이블로 변환""" + rows = [] + for row in table.rows: + cells = [cell.text.strip().replace("\n", " ") for cell in row.cells] + rows.append(cells) + + if not rows: + return "" + + lines = [] + # 헤더 + lines.append("| " + " | ".join(rows[0]) + " |") + lines.append("| " + " | ".join(["---"] * len(rows[0])) + " |") + # 본문 + for row in rows[1:]: + # 셀 개수 맞추기 + while len(row) < len(rows[0]): + row.append("") + lines.append("| " + " | ".join(row[: len(rows[0])]) + " |") + + return "\n".join(lines) + + +def get_paragraph_heading_level_styled(para): + """스타일 기반 문서의 헤딩 레벨 판별 (서비스이용계약서)""" + style = para.style.name if para.style else "" + + if style == "Heading 1": + return 1 + elif style == "Heading 2": + return 2 + elif style == "Heading 3": + return 3 + + return 0 + + +def get_paragraph_heading_level_pattern(para): + """패턴 매칭 기반 문서의 헤딩 레벨 판별 (비밀유지서약서, 영업파트너 위촉계약서)""" + text = para.text.strip() + has_bold = any(r.bold for r in para.runs if r.bold) + + if not text or not has_bold: + return 0 + + # "제X조" 패턴 → ## (h2) + if re.match(r"^ 0: + lines.append("") + lines.append(f"{'#' * level} {text}") + lines.append("") + elif style == "Compact": + # Bold 런이 있으면 강조 리스트 + has_bold = any(r.bold for r in para.runs if r.bold) + if has_bold: + # Bold 부분과 일반 부분 분리 + parts = [] + for run in para.runs: + if run.bold: + parts.append(f"**{run.text}**") + else: + parts.append(run.text) + combined = "".join(parts) + lines.append(f"- {combined}") + else: + # 들여쓰기된 하위 항목 + lines.append(f" - {text}") + elif style in ("Body Text", "First Paragraph"): + # 본문 텍스트 + if text.startswith("⚠️") or text.startswith("✅") or text.startswith("❌"): + lines.append("") + lines.append(f"> {text}") + lines.append("") + else: + lines.append(text) + else: + lines.append(text) + + elif tag == "tbl": + if table_idx <= len(doc.tables): + current_table_idx = sum( + 1 + for c in list(body)[: list(body).index(child)] + if (c.tag.split("}")[-1] if "}" in c.tag else c.tag) == "tbl" + ) + if current_table_idx < len(doc.tables): + lines.append("") + lines.append(table_to_markdown(doc.tables[current_table_idx])) + lines.append("") + + return "\n".join(lines) + + +def extract_pattern_doc(doc, file_info): + """패턴 매칭 기반 문서 추출 (비밀유지서약서, 영업파트너 위촉계약서)""" + lines = [] + + body = doc.element.body + para_idx = 0 + + for child in body: + tag = child.tag.split("}")[-1] if "}" in child.tag else child.tag + + if tag == "p": + para = doc.paragraphs[para_idx] + para_idx += 1 + text = para.text.strip() + + if not text: + lines.append("") + continue + + level = get_paragraph_heading_level_pattern(para) + has_bold = any(r.bold for r in para.runs if r.bold) + + if level > 0: + lines.append("") + # 제목에서 < > 제거 + clean_text = re.sub(r"^<\s*|\s*>$", "", text).strip() + lines.append(f"{'#' * level} {clean_text}") + lines.append("") + elif has_bold: + # Bold 텍스트는 강조 처리 + parts = [] + for run in para.runs: + if run.bold: + parts.append(f"**{run.text}**") + else: + parts.append(run.text) + combined = "".join(parts) + + # (1), (2) 같은 번호 패턴 + if re.match(r"^\*\*\(\d+\)", combined): + lines.append(f"- {combined}") + # "예시 N:", "Phase N:" 같은 패턴 + elif re.match(r"^\*\*(예시|Phase|별첨)\s", combined): + lines.append("") + lines.append(f"#### {text}") + lines.append("") + else: + lines.append(f"- {combined}") + else: + # 일반 텍스트 + # 빈칸 양식 (___) 유지 + if "___" in text: + lines.append(text) + elif re.match(r"^(이메일|전화|주소|상호|대표|사업자|주민|연락처|날짜):", text): + lines.append(f"- {text}") + else: + lines.append(f" - {text}") + + elif tag == "tbl": + current_table_idx = sum( + 1 + for c in list(body)[: list(body).index(child)] + if (c.tag.split("}")[-1] if "}" in c.tag else c.tag) == "tbl" + ) + if current_table_idx < len(doc.tables): + lines.append("") + lines.append(table_to_markdown(doc.tables[current_table_idx])) + lines.append("") + + return "\n".join(lines) + + +def add_frontmatter(content, file_info, docx_name): + """YAML 프론트매터 추가""" + frontmatter = f"""--- +title: "{file_info['title']}" +version: "v4.0" +date: "{date.today().isoformat()}" +docx_file: "{docx_name}" +--- +""" + return frontmatter + "\n" + content + + +def extract_file(docx_name, file_info): + """단일 DOCX 파일 추출""" + docx_path = DOCX_DIR / docx_name + if not docx_path.exists(): + print(f" [SKIP] {docx_name} - 파일 없음") + return False + + doc = Document(str(docx_path)) + + if file_info["type"] == "styled": + content = extract_styled_doc(doc, file_info) + else: + content = extract_pattern_doc(doc, file_info) + + # 프론트매터 추가 + content = add_frontmatter(content, file_info, docx_name) + + # 연속 빈 줄 정리 (3줄 이상 → 2줄로) + content = re.sub(r"\n{3,}", "\n\n", content) + + # 파일 저장 + output_path = MD_DIR / file_info["output"] + output_path.write_text(content, encoding="utf-8") + print(f" [OK] {docx_name} → {file_info['output']}") + return True + + +def main(): + print("DOCX → Markdown 추출 시작") + print(f" DOCX 디렉토리: {DOCX_DIR}") + print(f" 출력 디렉토리: {MD_DIR}") + print() + + MD_DIR.mkdir(parents=True, exist_ok=True) + + success = 0 + for docx_name, file_info in FILE_MAP.items(): + if extract_file(docx_name, file_info): + success += 1 + + print(f"\n완료: {success}/{len(FILE_MAP)} 파일 변환됨") + return 0 if success == len(FILE_MAP) else 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/sam/docs/contracts/scripts/insert_revision_table.py b/sam/docs/contracts/scripts/insert_revision_table.py new file mode 100644 index 0000000..3706aa5 --- /dev/null +++ b/sam/docs/contracts/scripts/insert_revision_table.py @@ -0,0 +1,348 @@ +#!/usr/bin/env python3 +""" +DOCX 개정이력 테이블 삽입 스크립트 + +revisions.json을 읽어 각 DOCX 문서의 제목 직후에 개정이력 테이블을 삽입한다. +- 삽입 위치: 문서 제목(첫 번째 Heading 또는 Bold 텍스트) 직후 +- 스타일: Pretendard 9pt, 연한 파란 헤더, 회색 테두리 +- 원본 백업 후 삽입 +""" + +import json +import shutil +import sys +from pathlib import Path + +from docx import Document +from docx.enum.table import WD_TABLE_ALIGNMENT +from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.oxml import parse_xml +from docx.oxml.ns import nsdecls, qn +from docx.shared import Pt, RGBColor + +BASE_DIR = Path(__file__).resolve().parent.parent +DOCX_DIR = BASE_DIR / "docx" +BACKUP_DIR = BASE_DIR / "docx" / "backup" +REVISIONS_FILE = BASE_DIR / "revisions.json" + +# 스타일 설정 +FONT_NAME = "Pretendard" +FONT_NAME_FALLBACK = "맑은 고딕" +FONT_SIZE = Pt(9) +HEADER_BG_COLOR = "D6E4F0" # 연한 파란색 +BORDER_COLOR = "999999" # 회색 테두리 +HEADER_FONT_COLOR = RGBColor(0x2B, 0x47, 0x6B) # 진한 파란 텍스트 + + +def set_cell_border(cell, **kwargs): + """셀 테두리 설정""" + tc = cell._tc + tcPr = tc.get_or_add_tcPr() + + tcBorders = parse_xml( + f'' + f' ' + f' ' + f' ' + f' ' + f"" + ) + tcPr.append(tcBorders) + + +def set_cell_shading(cell, color): + """셀 배경색 설정""" + tc = cell._tc + tcPr = tc.get_or_add_tcPr() + shading = parse_xml( + f'' + ) + tcPr.append(shading) + + +def set_run_font(run, bold=False): + """런의 폰트 설정""" + run.font.size = FONT_SIZE + run.font.bold = bold + + # Pretendard 설정 (없으면 맑은 고딕 폴백) + run.font.name = FONT_NAME + r = run._element + rPr = r.get_or_add_rPr() + rFonts = parse_xml( + f'' + ) + # 기존 rFonts 제거 + for existing in rPr.findall(qn("w:rFonts")): + rPr.remove(existing) + rPr.insert(0, rFonts) + + +def create_revision_table(doc, revisions): + """개정이력 테이블 생성 (Document에 직접 추가하지 않고 XML 요소만 생성)""" + # 테이블 생성 + headers = ["버전", "날짜", "작성자", "변경 내용"] + num_cols = len(headers) + num_rows = 1 + len(revisions) + + table = doc.add_table(rows=num_rows, cols=num_cols) + table.alignment = WD_TABLE_ALIGNMENT.CENTER + + # 헤더 행 설정 + header_row = table.rows[0] + for i, header_text in enumerate(headers): + cell = header_row.cells[i] + cell.text = "" + paragraph = cell.paragraphs[0] + paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER + run = paragraph.add_run(header_text) + set_run_font(run, bold=True) + run.font.color.rgb = HEADER_FONT_COLOR + set_cell_shading(cell, HEADER_BG_COLOR) + set_cell_border(cell) + + # 데이터 행 설정 (최신 순) + sorted_revisions = sorted(revisions, key=lambda r: r["date"], reverse=True) + for row_idx, rev in enumerate(sorted_revisions): + row = table.rows[row_idx + 1] + values = [rev["version"], rev["date"], rev["author"], rev["description"]] + for col_idx, value in enumerate(values): + cell = row.cells[col_idx] + cell.text = "" + paragraph = cell.paragraphs[0] + paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER + run = paragraph.add_run(value) + set_run_font(run) + set_cell_border(cell) + + return table + + +def find_title_paragraph_index(doc, doc_type="pattern"): + """문서 제목 문단의 인덱스를 찾는다""" + for i, para in enumerate(doc.paragraphs): + text = para.text.strip() + if not text: + continue + + if doc_type == "styled": + # Heading 1 스타일의 첫 번째 문단 + if para.style and para.style.name == "Heading 1": + return i + else: + # 첫 번째 Bold 텍스트 (제목) + has_bold = any(r.bold for r in para.runs if r.bold) + if has_bold: + return i + + return 0 # 찾지 못하면 맨 앞 + + +def find_subtitle_index(doc, title_idx): + """제목 다음의 부제목(영문 제목 등) 인덱스를 찾는다""" + # 제목 바로 다음 문단이 영문 부제목이면 그 다음에 삽입 + if title_idx + 1 < len(doc.paragraphs): + next_para = doc.paragraphs[title_idx + 1] + text = next_para.text.strip() + if text and any( + text.startswith(prefix) + for prefix in ["Customer Service", "Sales Partner", "Non-Disclosure"] + ): + return title_idx + 1 + return title_idx + + +def insert_table_after_paragraph(doc, para_idx, table): + """특정 문단 인덱스 다음에 테이블을 이동""" + body = doc.element.body + + # 빈 문단 추가 (테이블 전 여백) + spacer_before = parse_xml( + f'' + f" " + f"" + ) + + # 빈 문단 추가 (테이블 후 여백) + spacer_after = parse_xml( + f'' + f' ' + f"" + ) + + # "개정이력" 라벨 문단 + label_para = parse_xml( + f'' + f" " + f" " + f' ' + f" " + f" " + f" " + f' ' + f' ' + f' ' + f" " + f' ' + f" " + f" [ 개정이력 ]" + f" " + f"" + ) + + # 대상 문단의 XML 요소 찾기 + para_elements = body.findall(qn("w:p")) + if para_idx >= len(para_elements): + para_idx = len(para_elements) - 1 + + target_para = para_elements[para_idx] + + # 테이블 XML 요소 (이미 doc에 추가되어 body 끝에 있음) + table_element = table._tbl + + # body에서 테이블 제거 (끝에서) + body.remove(table_element) + + # 대상 문단 다음에 삽입 (역순으로 삽입) + target_para.addnext(spacer_after) + target_para.addnext(table_element) + target_para.addnext(label_para) + target_para.addnext(spacer_before) + + +def remove_existing_revision_table(doc): + """기존 개정이력 테이블이 있으면 제거""" + body = doc.element.body + + # "[ 개정이력 ]" 라벨 문단 찾기 + for para in body.findall(qn("w:p")): + texts = para.findall(f".//{qn('w:t')}") + full_text = "".join(t.text or "" for t in texts) + if "개정이력" in full_text: + # 이 문단과 바로 다음의 테이블, 그리고 전후 spacer 제거 + siblings = list(body) + idx = siblings.index(para) + + # 이전 spacer (빈 문단) + if idx > 0: + prev = siblings[idx - 1] + prev_tag = prev.tag.split("}")[-1] if "}" in prev.tag else prev.tag + if prev_tag == "p": + prev_texts = prev.findall(f".//{qn('w:t')}") + prev_full = "".join(t.text or "" for t in prev_texts) + if not prev_full.strip(): + body.remove(prev) + siblings = list(body) + idx = siblings.index(para) + + # 라벨 문단 다음의 테이블 + if idx + 1 < len(siblings): + next_elem = siblings[idx + 1] + next_tag = ( + next_elem.tag.split("}")[-1] + if "}" in next_elem.tag + else next_elem.tag + ) + if next_tag == "tbl": + body.remove(next_elem) + siblings = list(body) + + # 테이블 다음 spacer + if idx + 1 < len(siblings): + after = siblings[idx + 1] + after_tag = ( + after.tag.split("}")[-1] + if "}" in after.tag + else after.tag + ) + if after_tag == "p": + after_texts = after.findall(f".//{qn('w:t')}") + after_full = "".join(t.text or "" for t in after_texts) + if not after_full.strip(): + body.remove(after) + + # 라벨 문단 제거 + body.remove(para) + return True + + return False + + +def process_document(docx_name, doc_info): + """단일 DOCX에 개정이력 테이블 삽입""" + docx_path = DOCX_DIR / docx_name + if not docx_path.exists(): + print(f" [SKIP] {docx_name} - 파일 없음") + return False + + # 백업 + BACKUP_DIR.mkdir(parents=True, exist_ok=True) + backup_path = BACKUP_DIR / docx_name + shutil.copy2(docx_path, backup_path) + print(f" [BACKUP] {docx_name} → backup/") + + doc = Document(str(docx_path)) + + # 기존 개정이력 테이블 제거 + if remove_existing_revision_table(doc): + print(f" [INFO] 기존 개정이력 테이블 제거됨") + + # 문서 유형 판별 + has_heading_styles = any( + p.style and p.style.name.startswith("Heading") + for p in doc.paragraphs + ) + doc_type = "styled" if has_heading_styles else "pattern" + + # 제목 위치 찾기 + title_idx = find_title_paragraph_index(doc, doc_type) + # 부제목(영문 제목) 확인 + insert_after_idx = find_subtitle_index(doc, title_idx) + + # 테이블 생성 + table = create_revision_table(doc, doc_info["revisions"]) + + # 테이블 삽입 + insert_table_after_paragraph(doc, insert_after_idx, table) + + # 저장 + doc.save(str(docx_path)) + print(f" [OK] {docx_name} - 개정이력 테이블 삽입 완료") + return True + + +def main(): + print("DOCX 개정이력 테이블 삽입 시작") + print(f" DOCX 디렉토리: {DOCX_DIR}") + print(f" 개정 데이터: {REVISIONS_FILE}") + print() + + # revisions.json 로드 + if not REVISIONS_FILE.exists(): + print(f"[ERROR] {REVISIONS_FILE} 파일을 찾을 수 없습니다.") + return 1 + + with open(REVISIONS_FILE, "r", encoding="utf-8") as f: + data = json.load(f) + + documents = data.get("documents", {}) + + success = 0 + for doc_key, doc_info in documents.items(): + docx_name = doc_info["docx_file"] + print(f"처리 중: {doc_info['title']}") + if process_document(docx_name, doc_info): + success += 1 + print() + + print(f"완료: {success}/{len(documents)} 파일 처리됨") + return 0 if success == len(documents) else 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/sam/docs/contracts/scripts/sync_check.py b/sam/docs/contracts/scripts/sync_check.py new file mode 100644 index 0000000..1a497c9 --- /dev/null +++ b/sam/docs/contracts/scripts/sync_check.py @@ -0,0 +1,255 @@ +#!/usr/bin/env python3 +""" +DOCX ↔ Markdown 동기화 검증 스크립트 + +DOCX에서 텍스트를 추출하고 Markdown 파일의 텍스트와 비교하여 +불일치 항목을 리포트한다. +""" + +import difflib +import re +import sys +from pathlib import Path + +from docx import Document + +BASE_DIR = Path(__file__).resolve().parent.parent +DOCX_DIR = BASE_DIR / "docx" +MD_DIR = BASE_DIR / "markdown" + +# DOCX → Markdown 파일 매핑 +FILE_MAP = { + "01_고객_서비스이용계약서_v4_0_전자서명용.docx": "01-service-agreement.md", + "비밀유지서약서.docx": "02-nda.md", + "영업파트너 위촉계약서.docx": "03-partner-agreement.md", + "영업파트너 위촉계약서(단체용).docx": "04-partner-agreement-group.md", +} + + +def extract_text_from_docx(docx_path): + """DOCX에서 순수 텍스트만 추출 (개정이력 테이블 제외, 인터리빙 방식)""" + doc = Document(str(docx_path)) + lines = [] + + from docx.oxml.ns import qn as _qn + + body = doc.element.body + para_idx = 0 + table_idx = 0 + skip_revision = False + + for child in body: + tag = child.tag.split("}")[-1] if "}" in child.tag else child.tag + + if tag == "p": + if para_idx < len(doc.paragraphs): + text = doc.paragraphs[para_idx].text.strip() + para_idx += 1 + + if "개정이력" in text: + skip_revision = True + continue + if text: + skip_revision = False + lines.append(text) + + elif tag == "tbl": + if table_idx < len(doc.tables): + table = doc.tables[table_idx] + table_idx += 1 + + # 개정이력 테이블 건너뛰기 + if len(table.rows) > 0: + first_row_text = [cell.text.strip() for cell in table.rows[0].cells] + if "버전" in first_row_text and "날짜" in first_row_text: + skip_revision = False + continue + + if skip_revision: + skip_revision = False + continue + + for row in table.rows: + row_text = " | ".join(cell.text.strip() for cell in row.cells) + if row_text.strip(): + lines.append(row_text) + + return lines + + +def extract_text_from_markdown(md_path): + """Markdown에서 순수 텍스트만 추출 (프론트매터, 마크업 제거)""" + content = md_path.read_text(encoding="utf-8") + lines = [] + + in_frontmatter = False + in_table = False + + for line in content.split("\n"): + stripped = line.strip() + + # YAML 프론트매터 건너뛰기 + if stripped == "---": + in_frontmatter = not in_frontmatter + continue + if in_frontmatter: + continue + + # 빈 줄 건너뛰기 + if not stripped: + in_table = False + continue + + # Markdown 마크업 제거 + text = stripped + + # 헤딩 마크업 제거 + text = re.sub(r"^#{1,6}\s+", "", text) + + # 리스트 마크업 제거 + text = re.sub(r"^\s*[-*+]\s+", "", text) + + # Bold/Italic 마크업 제거 + text = re.sub(r"\*\*(.+?)\*\*", r"\1", text) + text = re.sub(r"\*(.+?)\*", r"\1", text) + + # 블록인용 제거 + text = re.sub(r"^>\s*", "", text) + + # 테이블 구분선 건너뛰기 + if re.match(r"^\|[\s\-|]+\|$", text): + continue + + # 테이블 행 + if text.startswith("|") and text.endswith("|"): + # 파이프 제거하고 셀 텍스트 추출 + cells = [c.strip() for c in text.strip("|").split("|")] + text = " | ".join(cells) + + text = text.strip() + if text: + lines.append(text) + + return lines + + +def normalize_text(text): + """비교를 위한 텍스트 정규화""" + # 공백 정규화 + text = re.sub(r"\s+", " ", text).strip() + # 특수문자 정규화 + text = text.replace("\u00a0", " ") # non-breaking space + text = text.replace("\u3000", " ") # ideographic space + # 언더스코어 빈칸 정규화 + text = re.sub(r"_{3,}", "___", text) + return text + + +def compare_documents(docx_name, md_name): + """두 문서의 텍스트를 비교""" + docx_path = DOCX_DIR / docx_name + md_path = MD_DIR / md_name + + if not docx_path.exists(): + return {"status": "error", "message": f"DOCX 파일 없음: {docx_name}"} + if not md_path.exists(): + return {"status": "error", "message": f"Markdown 파일 없음: {md_name}"} + + docx_lines = [normalize_text(l) for l in extract_text_from_docx(docx_path) if l.strip()] + md_lines = [normalize_text(l) for l in extract_text_from_markdown(md_path) if l.strip()] + + # difflib로 비교 + matcher = difflib.SequenceMatcher(None, docx_lines, md_lines) + ratio = matcher.ratio() + + # 차이점 추출 + diffs = [] + for tag, i1, i2, j1, j2 in matcher.get_opcodes(): + if tag == "equal": + continue + elif tag == "replace": + for idx in range(max(i2 - i1, j2 - j1)): + docx_text = docx_lines[i1 + idx] if i1 + idx < i2 else "(없음)" + md_text = md_lines[j1 + idx] if j1 + idx < j2 else "(없음)" + diffs.append({ + "type": "변경", + "docx": docx_text[:80], + "markdown": md_text[:80], + }) + elif tag == "delete": + for idx in range(i1, i2): + diffs.append({ + "type": "DOCX에만 존재", + "docx": docx_lines[idx][:80], + "markdown": "-", + }) + elif tag == "insert": + for idx in range(j1, j2): + diffs.append({ + "type": "Markdown에만 존재", + "docx": "-", + "markdown": md_lines[idx][:80], + }) + + return { + "status": "ok", + "similarity": round(ratio * 100, 1), + "docx_lines": len(docx_lines), + "md_lines": len(md_lines), + "diff_count": len(diffs), + "diffs": diffs[:20], # 상위 20개만 + } + + +def main(): + print("=" * 70) + print("DOCX ↔ Markdown 동기화 검증") + print("=" * 70) + + all_ok = True + + for docx_name, md_name in FILE_MAP.items(): + print(f"\n{'─' * 50}") + print(f"문서: {docx_name}") + print(f" ↔ {md_name}") + print(f"{'─' * 50}") + + result = compare_documents(docx_name, md_name) + + if result["status"] == "error": + print(f" [ERROR] {result['message']}") + all_ok = False + continue + + similarity = result["similarity"] + status_icon = "OK" if similarity >= 80 else "WARN" if similarity >= 60 else "FAIL" + + print(f" 유사도: {similarity}% [{status_icon}]") + print(f" DOCX 라인: {result['docx_lines']}") + print(f" Markdown 라인: {result['md_lines']}") + print(f" 차이점: {result['diff_count']}개") + + if result["diffs"]: + print(f"\n 주요 차이점 (상위 {min(len(result['diffs']), 10)}개):") + for i, diff in enumerate(result["diffs"][:10]): + print(f" [{diff['type']}]") + if diff["docx"] != "-": + print(f" DOCX: {diff['docx']}") + if diff["markdown"] != "-": + print(f" MD: {diff['markdown']}") + + if similarity < 80: + all_ok = False + + print(f"\n{'=' * 70}") + if all_ok: + print("결과: 모든 문서 동기화 상태 양호") + else: + print("결과: 일부 문서에서 불일치 발견 - 확인 필요") + print(f"{'=' * 70}") + + return 0 if all_ok else 1 + + +if __name__ == "__main__": + sys.exit(main())