๐ฆ ์ธ์์ธ๊ณ์ โ ๋ค์ ๋ํ๋ฐฉ์ฉ
์ ๋ฐฉ์ ์ด ํ์ด์ง ๋จผ์ ์ฝ๊ณ ๋ณต์. ๊ฒฌ์ ์คํค๋ง=
schema-estimate.md, ํจ์ =traps.md, ์๋ฃ ์์ธ=archive.md, ์ธ์ =sessions.md(๊ฐ๋ณsession-*.md์ธ๋ฑ์ค), ์ธํ๋ผ/๊ท์ฝ ๋ ํผ๋ฐ์ค=memory.md, ์ค๊ณ=design.md.
๐ NOW (2026-08-26) โ ํ์ ์ ์ฉ ๊ฒฌ์ ๋ชจ๋ ์ ์ค โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] ใpfs์ ๊ฒฌ์ ์ ๋ชฉ๋ก(ํ์)์ ์์ฑํด์ค. ๊ฒฌ์ ์์ ๋ฐ ๋จ๊ฐํ ๋ฐ์ดํฐ db์ถ๊ฐํด์ ์์ฑํ ์ ์๊ฒ. ์์ ํ์ผ๋ ์ฌ๋ ค์ ์์ ํ์ผ์ ๋ฃ๋ ํ์์ผ๋ก. ๊ธฐ์กด ๊ฒฌ์ ์ ์์์ผ๋ก ํ์๋ถ ์ ์์ ๊ทธ๋๋ก ์ ์ง, ๋ณ๋๋ก ์ ์์๊ณผ ๋จ๊ฐํ ๊ด๋ฆฌํด์ ์ด์. ์ด์๋ฐฐํฌ.ใ โ ๊ทธ๋ฆด๋ง 5์ฐจ(๊ฒฐ์ 12๊ฑด) ํ ์ฐฉ์.
- ์ ๋ณ๋ ๊ณํต์ธ๊ฐ = ๊ณ์ฐ์ฒด๊ณ๊ฐ ๋ค๋ฅด๋ค. ํฌ์ธ
์๋น(300mm)ร๋ถ์๋น์จร๋ง์งvs ํ์ํญ/10ร๋จ๊ฐร์ ํ๋ฐฐ์ร์ ์ฉ๋ฅ. ๊ธฐ์กดestimate๊ณํต์ ์ฝ๋ ๋ณ๊ฒฝ 0. - ๐๊ธ์ก์ PFS ๊ฐ ์์
์ ์ฐ์ง ์๋๋ค โ ์น์ยท๋ง๊ฐยท๋ฑ๊ธยท์ ์ฉ๋ฅ ๊ณผ ๋จ๊ฐํ๋ง ์์ ์ฌ๋ณธ์ ์ฃผ์
ํ๊ณ ,
๊ธ์ก์ ํ์ผ ์ LOOKUP ์ฒด์ธ(๋จ๊ฐ๊ธฐ์คโ๋ฐฑ๋ฐ์ดํฐโ๋ด์ญ์ 6ํญโ๊ฐ์ง)์ด ๊ณ์ฐํ๋ค. ํ์์ด ์ด์ด ๊ฒ์ฐํ ๋ ์์์ด ๋ณด์ธ๋ค.
๋ชฉ๋ก ์ด์ก๋ง
hansem_calc๊ฐ ๊ฐ์ ์์ผ๋ก ๋ฐ๋ก ๋ธ๋ค(์ฐธ๊ณ ๊ฐ). - ์ ์ค = ํ
์ด๋ธ 8(
hansem_price_book/price/finish/furn_type/form/estimate/estimate_type/estimate_detail) ยท ํ๋ฉด 3(/estimate/hansem/list|regist|price) ยท API 10(/api/hansem/*) ยท ๋ฉ๋ด 3(display_order 140~142). ๋ง์ด๊ทธ๋ ์ด์ migrations/patch47_hansem_estimate.sql(๋ฉฑ๋ฑ, ์๋ = ๋ง๊ฐ 12 ยท ์ ํ 14 ยท 2019 ํ ๋จ๊ฐ 192์นธ[๊ฐ 156]). - ์์ง
api/pfs/hansem/hansem_excel.pyโ openpyxl ๋ก loadโsave ํ๋ฉด ์ด๋ฏธ์ง 10ยท๋ํ 9ยท๋ฉ๋ชจยทx14 ๋ฐ์ดํฐ์ ํจ์ฑ์ด ์ฌ๋ผ์ ธ์ zip XML ์ธ๊ณผ์์ ๋ก ๊ฐ๋ค. ๊ฐ ์ ๋ง ์ฐ๊ณ ์์ ์ ์ ์ ๊ฑด๋๋ฆฌ๋ฉฐ, ๋ก์ ์บ์<v>๋ฅผ ์ง์ฐ๊ณfullCalcOnLoad๋ก ์ฌ๊ณ์ฐ์ํจ๋ค. ํํ๋ช ์A4ํ ์นธ๋ง ์ฐ๋ฉด E2ยทA54ยท๊ฐ์ง A19~A21 ์ด ๋ฐ๋ผ์จ๋ค. ์ง์ ํํ ์ = ์์์ด ๊ฐ์ง ๋ด์ญ์ ์ ์(์ด๊ณผํ๋ฉด ๋ง๋๋ค โ ๋ฐํ์ ํญ ๋ณต์ ์ ํจ). - ๊ฒ์ฆ = โ ์๋ฒ๊ณ์ฐ vs ์์ ์บ์๊ฐ 48/48 ์ ๋จ์ โก์๋ณต ๋์ผ์ฑ 582/582 โข๊ตฌ์กฐ ๋ณด์กด(์ด๋ฏธ์ง10ยท๋ํ9ยทํํธ82) โฃE2E(์์ ์ ๋ก๋โ์์ฐ ์ค๋ฐ์ดํฐ ๊ฒฌ์ โ์์ ์์ ) ์ด์ก 20,818,331 ์ผ์น ยท ์ ๋ ฅ์ 291/291 โ ํ ์คํธยท์ด์ ์์ชฝ โค์ฌ์ดํธ ์ ๊ฒ ํ๋ฉด3+API5 ํ ์คํธยท์ด์ 8/8 ALL PASS.
- ๋ฐฐํฌ = master
2d16739+8c5ac83+dcd61c8โ ์ด์b3fbba9(ํ์ผ 19๊ฐ ์ ๋ณ ํฌ์๋). merge ์ ์ด ์ด์ = deploy-live ๋ฏธ๋ฐ์ ์ปค๋ฐ์ด 138๊ฑด์ด๋ผ ํต์งธ๋ก ๋๋ ค์จ๋ค. ์ง์ ์ 2ํ์ผ (api/config.pyยทweb/__init__.py)์ deploy-liveโmaster ์ฐจ์ด๊ฐ ํ์ ๋ฑ๋ก 4์ค๋ฟ์์ ํ์ธํ๊ณ ๋๊ฒผ๋ค. ์ด์ RDS patch47 ์ ์ฉ ์๋ฃ ยท E2E ํ์ hard delete(๊ฒฌ์ 0 ยท ์์ 1 ํ์ฑ ยท ๋จ๊ฐ 192์นธ). ์ฌ์ดํธ๋งต ์ฌ๋น๋ = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 54โ57 ยท ๋ฏธ๋ฐ์ 0. devplanhansem-estimate.html+ ํ๋ธ ์นด๋ ๋ฑ๋ก. - โ ๋ฐฐํฌ ์ค ๊ฑธ๋ฆฐ ์ฌ๊ณ 2๊ฑด = โ
MySQLUtil.execute๊ฐ ๋น ํ๋ผ๋ฏธํฐ์๋ ํฌ๋งท์ ๋๋ ค SQL ๋ฆฌํฐ๋ด%์์ ์์ปค ์ฌ๋ง โกpymysql DECIMAL โ jsonify 500. ๋ ๋คrules.md๐ ๋ฑ์ฌ. - โน์์ ์์ฒด ๊ฒฐํจ ๋ฐ๊ฒฌ(์ ๊ณ ์นจ) = ์๋ฉ ๋ด์ญ์์ ํ์ฐ๋์ฅยทํฝ์ค๋์๋ ๋จ๊ฐํ ๋ผ๋ฒจ์ด ใ๋จ๊ฐ (50%)ใ์ธ๋ฐ ์์์ ๋ฐฐ์ ์์(ร1), ๊ณตํ๋์ด๋ ๋ผ๋ฒจ ์์ด ร0.7. ์ฃผ๋ฐฉ์ ์ ๋ถ ์ผ์น. ์์์ ์ ๋ณธ์ผ๋ก ์๋ํ๊ณ ์ ํ ๋ง์คํฐ์์ ๊ณ ์น ์ ์๊ฒ ๋๋ค.
- โณํํ = โ ์ด์ ์ก์ 1ํ(
/estimate/hansem/price๋จ๊ฐํยท์์ โ/estimate/hansem/regist์ค๊ฒฌ์ 1๊ฑด โ ์์ ) โก์ต์ 7,148,000 ๋ฐฐ๋ถ ๊ท์น ๊ฒฐ์ (2์ฐจ ์ฐฉ์ ์ ์ โ ์์ฌ๋น ์ค๋น/์ ์ฉ๋ฅ ์ํฅ/๋ฑ๊ธ ์ํฅ ์ค). - 2์ฐจ(๋ฏธ์ฐฉ์) = ์์ฌ๋นยท์ด๋ฐ๋นยท์ถ๊ฐ๋ถ๊ฒฌ์ ํญ ยท ๊ธฐ์กด ๊ฒฌ์ ์ ํ ๋๊ตฌ ยท ํํ 4๊ฐ ์ด์ ํ์ฅ ์์ ยท ์๋ง๊ฐ ํธ์ ์ฌ๋ถ.
๐ ์ค๊ฒฌ์ 3๊ฑด ๋ฑ๋ก (2026-08-26 ํ์) โ
ํํ ใ2๊ฐ ๊ฒฌ์ ์ ํ์ ์์์ผ๋ก ์์ฑํ์ด? ๋ชฉ๋ก์ ์๋ณด์ธ๋คใ โ ๊ทธ๋๋ ๊ทธ๋ฆ๋ง ์์๋ค(0๊ฑด). ์ง๊ธ ์ด์ 3๊ฑด.
| no | ๊ฒฌ์ ๋ช | ์๋ฒ์ด์ก(๋ณธ์ค๋) | ๋น๊ณ |
|---|---|---|---|
| 1 | ๋ผ์ธ ์์ฐ7์ฐจ(๋ฆฌ๋ด์ผ) M/H ์์ฐ๋น 26๋ 06์ | 20,818,331 | ์๋ณธ ๊ฑฐ๋๋ช ์ธ์ ์ฌํ ยท field_no ์์(ํ์ฅ ๋ฏธ๋ฑ๋ก) |
| 2 | GS ์์ฃผ ๋จ๊ตฌ MH โ ํ์์์ V2 (์น์๊ธฐ์ค) | 17,370,850 | ์ ์ฉ๋ฅ ์ ํ 1.0 ยท ์ต์ ๋ฏธ๋ฐ์ ยท field_no 2169 |
| 3 | GS ์์ฃผ ๋จ๊ตฌ MH โ ํ์์์ V1 (์ต์ ๋ฐฐ๋ถ) | 22,193,970 | ํ๋ณ ์ ์ฉ๋ฅ ์ํฅ(์ต๋ 1.8810) ยท field_no 2169 |
- ํํ ๊ฒฐ์ (26.8.26) = ใGS์์ฃผ๋ ๊ฒฌ์ ๋ชฉ๋ก V1ยทV2 2๊ฐ์ง๋ก ์์ฐํ๋ค. V1์ ์ถ์ฒ(3๋ถ๋ฅ)๋๋ก, V2๋ ๊ธ์ก์ฐจ ์๊ด์์ด ์น์ ๊ธฐ์ค์ผ๋ก๋งใ.
- 3๋ถ๋ฅ ๋ฐฐ๋ถ(V1) = โ ์ ๋ฆฌ๋ฅ 2,325,000(์ ๋ฆฌ๋์ด 1,520,000ยท์ ๋ฆฌ์ ๋ฐ 605,000ยท์ ๋ฆฌ 200,000) โ ์์ฌ๋น ํญ ์ค๋น ๋ณ๋(์์ฐ๋น ๋ฏธํฌํจ) โกํ๋ฌ๋ฅ 3,168,000(EP 6์ข 1,805,000ยทํฝ์คํ๋ฌ 360,000ยทํ๋ฉด์ฅ 373,000ยทํ๋ฉดํฝ์ค 60,000ยท๋ฉ์งํ 90,000ยท12Tํ ๋ผ 300,000ยท9T์ซ๋ 180,000) โขํ๋์จ์ดยท์์ธ๊ธฐ๋์ด 1,655,000(HK-TOP 800,000ยทํ๋ฉ์ 450,000ยท์ธ๋๋ ์ผ 150,000ยท๋ฐฅํต์ฅ๋ ์ผ 75,000ยท์์ธ๊ธฐ๋์ด 180,000) โ โกโข 4,823,000 ์ ํ๋ณ ์ ์ฉ๋ฅ ์ํฅ์ผ๋ก ์์ฐ๋น ํก์. ์์ฐ๋น 22,193,970 + ์ ๋ฆฌ ์์ฌ๋น 2,325,000 = 24,518,970 (ํฌ์ธ 763 ํ์ด์ก 24,327,000 ๋๋น +191,970). โ ๋ฑ๊ธ์ D๊ฐ ์ํ์ด๋ผ ใ๋ฑ๊ธ ์ํฅใ์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ถ๊ฐ โ ์ ๋ถ ์ ์ฉ๋ฅ ๋ ๋ฒ๋ก๋ง ํก์ํ๋ค.
- 763 โ ํ์ ๋งคํ(์คํฌ๋ฆฝํธ
scripts/_hansem_from_est.py, 763 21ํ ์ ๋ถ ์ฃผ๋ฐฉยท์๋ฉ 0ํ): ์๋ถ์ฅยท์ฅ์์ฅ ์๋ถ์ฅยทํ๋ฉด ์ ๋ฆฌํ๋ถ์ฅ โ b4 / ํ๋ถ์ฅยท์ฅ์์ฅ ํ๋ถ์ฅ โ b11 / ์์ผ๋๋ ํ๋ถ์ฅ โ b25 ์คํ์ฅ (์์ ์๋ณธ ์ธํธ๋ผ๋ฒจ์ดC(์์ผ๋๋)๋ผ ๊ทผ๊ฑฐ ์์. b11 ๊ณผ ๋จ๊ฐ๊ตฐยท๋ฐฐ์ ๋์ผ์ด๋ผ ๊ธ์ก ๋ฌด๊ด) / ์ฅ์์ฅ ํคํฐ์ฅยท๋์ฅ๊ณ ์ฅยท๊ฐ์ ์๋ฌผ์ฅ โ b32 / ํฌํธ๋ฆฌ๋์ด โ b46 ๊ณตํ๋์ด(KIT_TALLร0.7). ํํ ์ฌ๋กฏ 3๊ฐ =84A/84C/84C(F)(763 ์ type_name + field_type. K=์ฃผ๋ฐฉยทF=์ผ๋ฐ). ๐์น์๋ถ์ด ์ด์ ๋ณด๊ณ (16,648,450)๋ณด๋ค 722,400 ํฌ๋ค(17,370,850) โ ํฌํธ๋ฆฌ๋์ด๋ฅผ ์ํ๋ถ์ฅร0.7 ๋ก ๋ดค๋ ๊ฒ ์ค๋ฅ๊ณ , ์์ ์์ ์ ๋ณธ์ ํคํฐ์ฅร0.7 ์ด๋ค. - ๐ด์์ ์ฐ์ถ๋ฌผ์ ์์ง ์์(์์ฐ) ์์กด๊ฐ์ด ์์ธ๋ค โ ์์ฌ๋น 5,654,155 ยท ์ด๋ฐ๋น 1,060,000 ยท ์ถ๊ฐ๋ถ 1,010,000 ยท ์๊ณต๋น ๋ฆฌํฐ๋ด 12,930,000 ยท ์ ์ฌ 5์นธ์ด ๊ฐ์ง์ ๊ทธ๋๋ก ๋ฌ๋ค. 1์ฐจ ๋ฒ์๊ฐ ใ๋ณธ์ค๋ ๋ด์ญ์ใ๋ฟ์ด๋ผ ๊ทธ๋ ๋ค. ์์ฐ(๊ฒฌ์ 1)์ ์๋ณธ ์ฌํ์ด๋ผ ์คํ๋ ค ๋ง๊ณ , GS(๊ฒฌ์ 2ยท3)๋ง ํ๋ฆฌ๋ค. โ 2์ฐจ ๊ณผ์ (์์ฌ๋นยท์ด๋ฐ๋นยท์ถ๊ฐ๋ถ ํญ) ๋๋ ๋น๋ ์ 0 ์ฒ๋ฆฌ. โณํํ ๊ฒฐ์ .
- โณ์ด์๋ฐฐํฌ ๋๊ธฐ = master
dd677a7(ํญ rename ๊ต์ฐจ ๋ฒ๊ทธ ์์ ). ๋ฐฐํฌ ์ ๊น์ง ์ด์์์ GS ์์ ์ ๋ฐ์ผ๋ฉด ํญ์ด ๊ต์ฐจ๋ ํ์ผ์ด ๋์จ๋ค. ๋ก์ปฌ ๊ฒ์ฆ์ ๋(scripts/_hansem_local_build.py). - ๊ฒ์ฆ ๋๊ตฌ ์ ์ค =
scripts/_hansem_from_est.py(763โํ์ ๋ฑ๋ก) ยท_hansem_local_build.py(์ด์๋ฐฐํฌ ์ ๋ก์ปฌ ์ฐ์ถยท๊ตฌ์กฐ ์ ๊ฒ) ยท_hansem_state.py(ํํฉ) ยท_hansem_field_find.pyยท_est763_table.py.
(์ด์ ) 2026-08-26 โ ํ์ ๋จ๊ฐํ ์ ํ ํํฉํ์ (๋ณด๊ณ ๋ง) + ํ์ ์์ xlsx ์ธ๋ถ๋งํฌ ์ ๋ฆฌ โ
[ํํ] โ ใ๊ธฐ์กด ๊ฒฌ์ (GS ์์ฃผ 763)์ ํ์ ์ ๊ท ์์์ ๋ง์ถฐ์ผ ํ๋ค. ํ์ ๋จ๊ฐํ๊ฐ ๊ธฐ์กด๋ณด๋ค ๊ธ์ก์ด ์ ๋ค.
์ถ๊ฐ๊ธ์กยท์ต์
๊ธ์ก ๊ท์น์ ํ์ธํด ์์ค ์ต์๋ก ์ฎ๊ธธ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ๋ค. ์ฐ์ ์น์๋ง ๋ฐ์ํด ๊ธ์ก์ฐจ๋ฅผ ๋ณธ๋ค โ
์ด๋ฒ์ ์ค์ ์์
์์ด ํํฉ ๋ณด๊ณ ๋งใ โกใ์์ ํ์ผ ์์์ด ์ธ๋ถ ๋์คํฌ ๊ฒฝ๋ก๋ฅผ ์ฐธ์กฐํ๋ค โ ํ์ผ ๋ด ๋จ๊ฐ๊ธฐ์ค
ํญ ์ฐธ์กฐ๋ก ๊ณ ์ณ๋ผ. ๋์ผํด๋์ ์ํด๋ ๋ง๋ค์ด ์๋ณธ ๋ฐฑ์
ใ โข๋น์ฅ ์ ๋ด๋ ๋๋ ํญ = ์ถ๊ฐ๋ถ๊ฒฌ์ ยท์์ฌ๋นยท์ด๋ฐ๋นยท๊ฐ๊ฒฉ์ ์ฉ๋ถ.
โ ํํฉ (๋ณด๊ณ ๋ง ยท ์ฝ๋/DB ๋ณ๊ฒฝ 0)
- ํ์ ๊ณ์ฐ์ =
ํญ(mm)/10 ร ๋จ๊ฐ(์/10mm) ร ์ ์ฉ๋ฅ. ๋จ๊ฐ๋ ๊ฐ๊ตฌ์ ํ ร ๋ง๊ฐ 12์ข ร ๋ฑ๊ธ A~D ๋งคํธ๋ฆญ์ค (๋จ๊ฐ๊ธฐ์คํญ). ์ฃผ๋ฐฉ ๋ฒฝ์ฅยท๋ฐ์ฅ 2500~3900 ยท ํคํฐ์ฅ 5300~8400 ยท ์๋ฉ ์ผ๋ฐ์ฅ 6100~9000 ยท ๋ฎ์์ฅ 4000~5900. ๋ฑ๊ธ = ๋์ด์ฌ์(Aํํ / Bํฌํคยท๋งค์ ์์ก์ดยท๋ฉ์งํ / C์์ฒด์์ก์ดยทAL1๋ฉดยทํ๋ชจยทํ๋ ์ / D AL4๋ฉด์ฃ์ง๋ฐยทALํ๋ ์ยท์ฌ๋ผ์ด๋ฉ). ๋จ๊ฐ ๋ฐฐ์ = FIX PANEL 50% ยท ๊ณตํ๋์ด 70%. ์ ์ฉ๋ฅ = ๋์ด๋ง 30% / ๋ฐ๋์ผ๋ถ 50% / ๋์ด+๋ฐ๋ 70% / ์ ์ฒด 100%(์๊ธฐ). - ํฌ์ธ ๊ณ์ฐ์(pfs) =
(ฮฃ์น์โฮฃ์ฝ๋)/300 ร ์๋น๋จ๊ฐ ร ๋ถ์๋น์จ ร (1+๋ง์ง)์ฒ์ ์ฌ๋ฆผ + ฮฃ์ถ๊ฐ๊ธ์ก. โrules.md๐ฐํญ๋ชฉ. - 763 ์ค์ธก = 21ํ ยท ์ ํจํญ 37,755mm(125.8์) ยท ํ์ด์ก 24,327,000(= ์๋น๋ชซ 17,179,000 + ์ถ๊ฐ๊ธ์ก 7,148,000)
- ์๊ณต๋น 6,500,000 + ์ด๋ฐ๋น 400,000 = 31,227,000. ์๋น๋จ๊ฐ ์/10mm ํ์ฐ = ์๋ถ 3,583 ยท ํ๋ถ 4,163 ยท ๋์ฅ๊ณ ์ฅ 4,583 ยท ํฌํธ๋ฆฌ๋์ด 4,600 ยท ํคํฐ์ฅ/๊ฐ์ ์๋ฌผ์ฅ 8,337.
- ์น์๋ง ๋ฐ์ํ ๊ธ์ก์ฐจ(PUR๊ณ์ด, ์ ์ฉ๋ฅ 100%ยท๊ณตํ๋์ด 70%): A 11,684,100 / B 13,000,650 / C 13,878,350 / D 16,648,450. ๐D๋ฑ๊ธ์ด๋ฉด ํฌ์ธ ์๋น๋ชซ(17,179,000)๊ณผ โ530,550(โ3.1%) ๋ฐ์ ์ฐจ์ด๊ฐ ์๋ค โ ๋จ๊ฐํ ์์ฒด๋ ๊ฑฐ์ ๊ฐ๋ค. ํ์ด์ก ๋๋น โ7,678,550(โ31.6%) ์ธ ๊ฒ์ ์ ๋ถ ์ถ๊ฐ๊ธ์ก 7,148,000 ์ด ํ์ ์์ฐ๋น ๋จ๊ฐํ์ ์๋ฆฌ๊ฐ ์์ด์๋ค.
- ์์ค์ ์ค์ฒด = ์ต์ (์ถ๊ฐ๊ธ์ก) 7,148,000(ํ์ด์ก์ 29.4%) โ ์ ๋ฆฌ๋์ด 1,520,000 ยท EP 810,000 ยท HK-TOP 800,000 ยท ์ ๋ฆฌ์ ๋ฐ 605,000 ยท ํ๋ฉ์ 450,000 ยท ์์ผ๋๋EP 420,000 ยท ํ๋ฉด์ฅ 373,000 ยท ํฝ์คํ๋ฌ 360,000 โฆ
- ํ์ ์์์ ์ฒญ๊ตฌ ๊ฒฝ๋ก 3๊ฐ = ์์ฐ๋น(๋จ๊ฐํ) ยท ์์ฌ๋น ํญ(๋ณด๋ยท์ฃ์งยท์ ๋ฆฌยท๊ฑฐ์ธยทAL์ฃ์ง๋ฐ/์์ก์ด๋ฐ/ํ๋ ์๋์ด ์ค๋น, ๋จ๊ฐํ ๋น๊ณ ใ์์ ๊ฒฝ๋ฉดยท๋ฌด๋ฌ๋ชฉยทํ๋์ปด = A๋จ๊ฐ ํ๊ท ร50% ์์ฌ๋น ๋ณ๋ใ๊ฐ ๊ทผ๊ฑฐ) ยท ์ถ๊ฐ๋ถ๊ฒฌ์ ํญ(๋ณธ์ค๋ ์ดํ ์ค๊ณ๋ณ๊ฒฝยท์ฌ์์ฐยท์ํ ๋ฑ ์ฌํ ๋ฐ์๋ถ, ์ต์ ์ ๊ฐํ ์๋). โ ์์ฌ๋น ํญ์ ํ๋์จ์ด(๋ธ๋ผ ํ๋ฉ์ยทHK-TOPยท๋ ์ผ)๋ ์๋ค โ ์ ๋ฆฌยทAL ์ ์์ฌ๋น๋ก ๋๊ธธ ์ฌ์ง๊ฐ ์์ผ๋ ํ๋์จ์ดยทEPยทํฝ์คํ๋ฌ์ ์์ง ๊ฐ ๊ณณ์ด ์๋ค(๋ค์ ๊ฒฐ์ ์ฌํญ).
- โณ๋ค์(์ค๊ณ ํ๋จ ํ์) = โ GS ์์ฃผ ๋์ด์ฌ์ โ ํ์ ๋ฑ๊ธ ํ์ (D ๊ฐ์ ์ โ3%) โ ์ต์ 7.1M ๋ฐฐ๋ถ ๊ท์น (์์ฌ๋น ์ค๋น / ์ ์ฉ๋ฅ ์ํฅ / ๋ฑ๊ธ ์ํฅ ์ค ํ) โ ๊ทธ ๋ค์ ์น์ ์๋์ ๊ฐ. ์ฐฉ์ ์ ๊ทธ๋ฆด๋ง + ๊ณํ 3๋จ๊ณ ๋์.
โก ์์ xlsx ์ธ๋ถ๋งํฌ ์ ๋ฆฌ (์ค์์ )
- ๋์ = NAS
2026ํ์ฅ\๊ฒฌ์ \๋ฅ์์ค\ํ์ ๊ฒฌ์ ์์(๊ฐ๊ตฌ,์๊ณต)\1.์์ฐ๋น ๊ฑฐ๋๋ช ์ธ์_๋ผ์ธ๊ฑด์ค ์์ฐํ ํฌ๋ ธ๋ฐธ๋ฆฌ_26๋ 06์.xlsx - ์ธ๋ถ๋งํฌ ์ ์ 13๊ฐ ์ค ์ค์ ์์์ด ์ฐ๋ ๊ฑด 2๊ฐ๋ฟ([11]=
โฆ\ํ์\2019๋ \8์\โฆ\๋กฏ๋ฐ๊ด๋ช ์ฒ ์ฐ ์์ฐ๋น.xlsx, [13]=โฆ๋ผ์ธ ์์ฐํ ํฌ๋ ธ๋ฐธ๋ฆฌ MH ์๋ฉ ๊ฑฐ๋๋ช ์ธํ 260604.xlsx). ๋๋จธ์ง 11๊ฐ๋ ์ ๋ น(A:\ยท\๊น์๊ณค๋ถ์ฅ\โฆ ๋ฑ). - ๊ณ ์น ๊ฒ = โ ๋ด์ญ์ 6ํญ(77/84A/84B ร ์ฃผยท์)์ LOOKUP 276๊ณณ์์
[11]์ ๋ ์ ๊ฑฐ โ ๊ฐ์ ํ์ผ์๋ฐฑ๋ฐ์ดํฐ(๊ฑด๋ค์ง๋ง์ธ์!!)ํญ ์ฐธ์กฐ โก๊ทธ ๋ฐฑ๋ฐ์ดํฐ C์ด 156์ ์=๋จ๊ฐ๊ธฐ์ค!D7์์ผ๋ก ๋ฐ๊ฟ๋จ๊ฐ๊ธฐ์คํญ์ด ๋จ์ผ ์ถ์ฒ๊ฐ ๋๊ฒ ํจ(๊ฐ ๋ณ๊ฒฝ 0 โ 156์ ์ ์ ๋์กฐ ์ผ์น, ๋น์นธ 36์ ์๋ ๋น ์์ ๊ฒฝ๋ฉด B~D) โขfullCalcOnLoad+ calcChain ํ๊ธฐ. - ๐openpyxl ๋ก ๋ค์ ์ฐ์ง ์์๋ค โ ์ด ํ์ผ์ ์ด๋ฏธ์ง 10ยท๋ํ 9ยท๋ฉ๋ชจยท๋ฐ์ดํฐ์ ํจ์ฑ ํ์ฅ์ด ์์ด ์ฌ์ ์ฅํ๋ฉด ๊นจ์ง๋ค.
zip ์ XML ๋ง ์ธ๊ณผ์์ (
fix_links.py). ํํธ 109โ108(calcChain ๋ง ๋น ์ง), ๋ฐ๋ ํํธ 10๊ฐ. - ๊ฒ์ฆ = LOOKUP 17์ ์ ๋ก์ปฌ ๋ฐฑ๋ฐ์ดํฐ๋ก ์ฌํ โ ์ ๋ถ ์ผ์น ยท ์บ์ ์ด์ก ์ ์ง(์ฃผ๋ฐฉ 17,479,999.5 / ์๋ฉ 11,050,000.2) ยท ์ํฌ์ํธ์ ๋จ์ ์ธ๋ถ์ฐธ์กฐ 1๊ฑด ยท NAS ํ์ผ md5 = ๋ก์ปฌ ์ฐ์ถ๋ฌผ๊ณผ ๋์ผ.
- โ 2์ฐจ(๊ฐ์ ๋ , ํํ ใํ์ผ ๋ซ์์ด. ์ฌ๊ฒํ + ๋ ํญ ๋จ๊ฐ ์ผ์น ํ์ธใ) โ ์ ์ ๋์กฐ + ์ธ๋ถ๋งํฌ ์์ ์ ๊ฑฐ
- ๋ฐฑ๋ฐ์ดํฐ โ ๋จ๊ฐ๊ธฐ์ค ์ ์ ๋์กฐ = ์ผ์น 156 ยท ๋น์นธ 36 ยท ๋ถ์ผ์น 0. ๋ผ๋ฒจ(๋ง๊ฐ 12์ข ร ๋ฑ๊ธ A~D)ยท์์ ๋์์ ยท ์บ์๊ฐ 3์ค ๋์กฐ. ์ญ๋ฐฉํฅ๋ ํ์ธ โ ๋จ๊ฐ๊ธฐ์ค ๋จ๊ฐ์์ญ ๊ฐ์ 68๊ฐ ์ ๋ถ ๋ฐฑ๋ฐ์ดํฐ๊ฐ ์ฐธ์กฐ, ๋น์นธ 12๊ฐ(์์ ๊ฒฝ๋ฉดยท๋ฌด๋ฌ๋ชฉยท ํ๋์ปด์ B~D)๋ ์๋ก ์ผ์น. ๋ด์ญ์ 6ํญ LOOKUP 92์ ๋ก์ปฌ ์ฌํ ์ ๋ถ ์ผ์น.
์๋ฉ!O34์ ์ฒด ํ๋ช = ์์ฌ๋นยท์ด๋ฐ๋น ํญ์ ํ์ฅ ์ ์ฒด ํฉ๊ณ(์์ฌ๋น 5,654,155 / ์ด๋ฐ๋น 1,060,000)์ด๊ณ ์ฃผ๋ฐฉ ์ํธ๊ฐ ๊ทธ ์ ์ก์ ์ด๋ฏธ ๊ฐ์ ธ๊ฐ๋ค(์ฃผ๋ฐฉ!O32=์์ฌ๋น!H124,O33=์ด๋ฐ๋น!I18). ์ฆ ์๋ฉ ์นธ์ ์ฐ๊ฒฐํ๋ฉด ์ด์ค ๊ณ์์ด๋ค โ ๋ฐ๋ก ์์๋ฉ!O33(์์ฌ๋น) ์ฒ๋ผ ๋น์นธ์ด ๋ง๋ค. ๊ฐ์ด ์ด๋ฏธ 0 ์ด๋ผ ๊ธ์ก ์ํฅ 0.- โ ์ฃฝ์ ์์ ์ ๊ฑฐ ํ ์ธ๋ถ๋งํฌ ์์ฌ ์ ๋ถ ์ญ์ : externalLink ํํธ 13๊ฐ(+rels 13) ยท
externalReferences๋ธ๋ก ยท Content_Types Override 13 ยท ์ธ๋ถํ์ผ์ ๊ฐ๋ฆฌํค๋ definedName 26๊ฐ(์ ๋ถ ๋ฏธ์ฌ์ฉ, ๋๋ถ๋ถ ์ด๋ฏธ#REF!โ ์ํฌ์ํธ ์์ยท๋ฐ์ดํฐ์ ํจ์ฑ์์ ์ฐ์ด๋ ๊ฒ 0๊ฑด ํ์ธ ํ ์ญ์ ). ์ด์ ์์ ์ด ใ๋งํฌ ์ ๋ฐ์ดํธใ๋ฅผ ์ ๋ฌป๋๋ค. - ํํธ 108โ82 ยท ๋ฐ๋ ํํธ 4๊ฐ ยท ํญ 15๊ฐ ์ ์ง ยท ์ด์ก ๋ถ๋ณ(์ฃผ๋ฐฉ 17,479,999.5 / ์๋ฉ 11,050,000.2 / ์์ฐ๋น์ด 28,529,999.7 / ์์ฐ๋น+์๊ณต๋น 41,459,999.7) ยท ๋จ์ ์ธ๋ถ์ฐธ์กฐ 0๊ฑด ยท NAS md5 ๋์กฐ ์ผ์น.
- โ
3์ฐจ(๊ฐ์ ๋ , ํํ ใ์ธ๋ถ ๋ฐ์ดํฐ ์ฐ๊ฒฐ ๋ฉ์์ง ์์ง๋ ๋ฌ๋คใ) โ ์ง๋ฒ = x14 ํ์ฅ ๋ฐ์ดํฐ์ ํจ์ฑ
๋งํฌ ์ ์๋ฅผ ๋ค ์ง์ ๋๋ฐ๋ ๊ฒฝ๊ณ ๊ฐ ๋จ์ ์ด์ =
<extLst>์<x14:dataValidation>4๊ฑด์ด ๋๋กญ๋ค์ด ๋ชฉ๋ก์ ์ ๋๊ฒฝ๋ก ๋ค๋ฅธ ํตํฉ๋ฌธ์๋ก ์ก๊ณ ์์๋ค โ ์ฃผ๋ฐฉ(H34:K34 D32:G34)ยท์๋ฉ(H35:K35 D33:G35)์D:\0.๋ฐ์ง์-pc\โฆ\[201804 ๋กฏ๋ฐ ์ฒญ๋๋ฆฌ_์์ฐ๋น(๋์).xlsx]Sheet3'!#REF!, ์ถ๊ฐ๋ถ๊ฒฌ์ ์ฃผ๋ฐฉ(K3 F22:G22 G8)ยท ์ผ๋ฐ(K3)์G:\์์ \โฆ\[๋ผ์ธ ๊ด์ฃผ์ผ๊ณก MH ๊ฑฐ๋๋ช ์ธํ .xlsx]Sheet3'!#REF!. ์ ๋ถ ์ด๋ฏธ#REF!= ์ฃฝ์ ๋ชฉ๋ก. ๐openpyxl ์ ์ด๊ฑธ ๋ชป ๋ณธ๋ค(๋ก๋ ์ ๊ฒฝ๊ณ ๋ง ์ฐ๊ณ ๋ฒ๋ฆฐ๋ค) โ zip XML ์ง์ grep ์ผ๋ก ์ฐพ์๋ค. โrules.md๐ด. - ๊ฐ ์ํธ์
<extLst>๋ ์ด ํญ๋ชฉ ํ๋๋ง ๋ด๊ณ ์์ด ๋ธ๋ก์งธ ์ ๊ฑฐ(4ํํธ๋ง ๋ณ๊ฒฝ, ํํธ ์ 82 ์ ์ง). - ๋จ๋ ์ผ๋ฐ ๋ฐ์ดํฐ์ ํจ์ฑ์ ๊ทธ๋๋ก โ ๋ด์ญ์ 6ํญ์ ๋ง๊ฐ 12์ข
๋ชฉ๋กยท
"A,B,C,D"๋ฑ๊ธ ๋ชฉ๋ก ์ด์ ์๋ค. - ์ฌ๋ผ์ง๋ ๊ฒ = ์ 4๊ณณ์ ๋๋กญ๋ค์ด(์๋
#REF!๋ผ ์๋ฌด๊ฒ๋ ์ ๋จ๋ ๊ฒ). ์ ๊ฐยท์์์ ๊ทธ๋๋ก. - ์ฌ๊ฒ์ฆ = ๋ฐฑ๋ฐ์ดํฐโ๋จ๊ฐ๊ธฐ์ค 156/0 ยท LOOKUP 92์
์ผ์น ยท ์ด์ก ๋ถ๋ณ ยท ์ธ๋ถ ํ์ 0๊ฑด
(
[n]ยท[ํ์ผ.xlsx]ยทTargetMode="External"์ ํํธ ์ค์บ). NAS md53920c11dโฆ๋์กฐ ์ผ์น. - ์ ์ผํ๊ฒ ๋จ์ ๊ฒฝ๋ก ๋ฌธ์์ด =
workbook.xml์x15ac:absPath(๋ง์ง๋ง ์ ์ฅ ์์น ํํธ) โ ๋งํฌ ์๋, ๊ฒฝ๊ณ ์ ๋ฌด๊ด. - ๋ฐฑ์
= ๊ฐ์ ํด๋
_์๋ณธ๋ฐฑ์ _2026-08-26\(md5 ์๋ณธ๊ณผ ๋์ผ). โ ํ์ผ์~$โฆ์ ๊ธ(์์ ์poinpc)์ด ์์ด ์ฒซ ๋ฎ์ด์ฐ๊ธฐ๊ฐDevice or resource busy๋ก ๋งํ๋ค โ ์์๋ช write + rename ์ผ๋ก ๋ฃ์๋ค(์์์ ๊ต์ฒด).
(์ด์ ) 2026-08-26 โ ์๋ฅ์ค ๊ธํธ ๊ตฌ๋ฏธ ๊ฒฌ์ 3์ฐจ์ ์์ฑ + ์์ 3์ข NAS ์ ์ฅ โ ์ด์ ์๋ฃ (์ฝ๋๋ณ๊ฒฝ 0)
[ํํ] estimate/modify-v2/764 ๋ณธ๊ฑด ์์ฑ ํ = ใ์ด 3๊ฐ ๊ฒฌ์ ์ ์์
ํ์ผ ์์ฑ. 1์ฐจ=ํ์ฌ๊ฑด 24,058,000์ /
2์ฐจ=์ ์ฒด ๋ง์ง์จ 20% ๊ฐ ํญ๋ชฉ ์กฐ๊ธ์ฉ ์กฐ์ ํด 1900๋ง์ ์ฝ๊ฐ ์ด๊ณผ(๋ชฉํ 1900๋ง) / 3์ฐจ=2์ฐจ ๊ธฐ์ค 5% ์ธ์.
pfs ์๋ ์ฐจ์๋ณ๋ก ์ ์ฅํ๊ณ ๋น๊ณ ์ ์์ ๋ด์ฉ ์ ์ฅ. ์์
์ NAS 2026ํ์ฅ\๊ฒฌ์ \09์\์๋ฅ์ค\๊ธํธ ๊ตฌ๋ฏธ ๊ฒฌ์ ์.
์ด์๋ฐฐํฌ ์์
๊ฑด์ด๋คใ + ์ถ๊ฐ 2๊ฑด = ใ3์ฐจ๋ ํผ์ผํธ ์กฐ๊ธ ๋ ์ฌ๋ ค 2000๋ง์์ ์กฐ๊ธ ๋๊ฒ, ํ์ผ๋ช
ํผ์ผํธ๋
์์์ ์์ด ์ ์๋กใ ยท ใ์ ์ฒด ํ์ผ ๋ชจ๋ ์ด์์ ๊ฑด๋๋ฆฌ์ง ์๋๋คใ.
- ํด์ ๊ฒฐ์ (ํํ ํ์ธ๋ฐ์) = ใ์ ์ฒด ๋ง์ง์จ 20%ใ = ํ ์ธ 20% =
margin_percent -20. ๊ทผ๊ฑฐ = ์ด ๊ฒฌ์ ์ ์ถ๊ฐ๊ธ์ก์ด ์ด๋ฏธ โ20% ๋ฅผ ํ ์ธ์ผ๋ก ์ฐ๊ณ ์์๊ณ , ํ๋ซ โ20% ๋ฅผ ๊ฑธ๋ฉด ์ด์ก์ด 19,009,000 ์ = ใ1900๋ง์ ์ฝ๊ฐ ์ด๊ณผใ์ ์ ๋จ์๋ก ๋จ์ด์ง๋ค(๋จ๊ฐยท์ถ๊ฐ๊ธ์กยท์ด๋ฐ๋น ์ ์ ๋๊ณ ). 3์ฐจ๋ ํํ ์ง์๋ก ๋ง์ง์จ โ14% ๊ณ์ฐ์ + ํ์ผ๋ช ์ (5) ํ๊ธฐ(๊ท์น ์ธ ๋ช ๋ช ) ๋ก ํ์ . - ์ฐจ์(์ด์ DB) โ ์ฑ์ ์ฌ์์ฑ API(
POST /api/estimate/<no>/rewrite {copy_items:'1'})๋ก ๋ง๋ค์๋ค. | ์ฐจ์ | ๊ฒฌ์ ๋ฒํธ | ์ด๋ฆ | ๋ง์ง์จ | ํญ๋ชฉํฉ๊ณ | ์ด๋ฐ๋น | ์ด์ก | ์ํ | |---|---|---|---|---|---|---|---| | 1์ฐจ | 764 | ๊ธํธ ๊ตฌ๋ฏธ MH ๊ฒฌ์ ์ | ์๋ 10 | 23,608,000 | 450,000 | 24,058,000 | ๋ณด๊ด | | 2์ฐจ | 765 | ใ (2์ฐจ) | โ20 | 18,559,000 | 450,000 | 19,009,000 | ๋ณด๊ด | | 3์ฐจ | 766 | ใ (3์ฐจ) | โ14 | 19,570,000 | 450,000 | 20,020,000 | ๋ณด๊ด | | 4์ฐจ | 767 | ใ (4์ฐจ) | +24 | 25,962,000 | 450,000 | 26,412,000 | ์ฌ์ฉ ์ค | ๋น๊ณ (estimate.comment)์ ์ฐจ์๋ณ ์์ ๋ด์ฉ ์ ์ฅ โ ๋ง์คํฐ ๋น๊ณ ๋ ์์ ์ ์ ๋๊ฐ๋ค(์์ ๋น๊ณ 3์ค์ ๊ณ ์ ๋ฌธ๊ตฌ)๋ผ ๋ด๋ถ ๋ฉ๋ชจ๋ก ์์ ํ๋ค. ์ด๋ฐ๋น 450,000 ์ 3์ฐจ์ ์ ๋ถ ๋์ผ(์ง์๋๋ก ๋ฏธ๋ณ๊ฒฝ). - 4์ฐจ ์ถ๊ฐ ์ง์(๊ฐ์ ๋ ) = ใ1์ฐจ ๊ธ์ก ๊ธฐ์ค 10% ์ธ์, ํ์ผ์ด๋ฆ์๋ ๋์ผํ๊ฒ (10)ใ. ์ ์ ๋ง์ง์จ ์ค +24% ๊ฐ 1์ฐจ ํญ๋ชฉํฉ๊ณ ๋๋น +9.97%(๋ชฉํ 25,968,800 ๋๋น โ6,800์)๋ก ๊ฐ์ฅ ๊ทผ์ โ ํ์ผ๋ช (10) ๊ณผ ์ ํฉ. (24.1% ๋ฉด +10.05% ์ง๋ง ์์ ๋ง์ง์จ์ด๋ผ ์ฑํ ์ ํจ.)
- ์์
4์ข
= NAS
\\192.168.0.101\๊ณต์ ํด๋\2026ํ์ฅ\๊ฒฌ์ \09์\์๋ฅ์ค\๊ธํธ ๊ตฌ๋ฏธ ๊ฒฌ์ (md5 ๋์กฐ ์ผ์น)โฆ๊ฒฌ์ ์(์๋ณธ๋จ๊ฐ).xlsx(1์ฐจ) ยทโฆ๊ฒฌ์ ์.xlsx(2์ฐจ) ยทโฆ๊ฒฌ์ ์(5).xlsx(3์ฐจ) ยทโฆ๊ฒฌ์ ์(10).xlsx(4์ฐจ) โน๏ธ2026-08-26 4์ฐจ ์ ์ฅ ์์ ์ 2์ฐจ ํ์ผ์ดโฆ๊ฒฌ์ ์(์ต์ข ).xlsx๋ก ์ด๋ฆ์ด ๋ฐ๋์ด ์์๋ค(ํํ๊ฐ ์๋ ๊ฒ์ผ๋ก ๋ณด์, ๊ทธ๋๋ก ๋ ). - ๊ฒ์ฆ = โ ๊ณ์ฐ์ ์ฌํ์ผ๋ก 1์ฐจ 20ํยท์ด์ก์ด ์ ๋จ์ ์ผ์น โก๋ณต์ฌ๋ณธ์ ์๋ณธ๊ณผ ์ ์ปฌ๋ผยท์ sub ๋์กฐ(PASS)
โข์์
์คํ์ผ์์ ์์ธ๋ธ๋ก
์๋ร๋จ๊ฐํฉ + ๋ฌผ๋ฅ๋น = ์ด์ก 3ํ์ผ ALL PASS. - ๐์ ๊ท์น 3๊ฑด(๊ณ์ฐ์ ๋จ์ผ์ถ์ฒ ยท
estimate_detail์ปฌ๋ผ/FLOAT ํจ์ ยท ์์ ๋จ๊ฐ=SET๋จ๊ฐยทํ์ผ๋ช quirk) =rules.md๐. - ์ฝ๋ ๋ณ๊ฒฝ 0 ยท DDL 0 โ ๋ฐฐํฌยท์ฌ์ดํธ๋งต ์ฌ๋น๋ ๋์ ์๋.
(์ด์ ) 2026-08-26 โ ๊ฒฌ์ v2 ํ UI 3๊ฑด (์น์ ๋ธ๋ก์ ํ ยท ํด๋ฉ ์์ด์ฝ ยท ๋ถ๋ฅ ๋๋กญ๋ค์ด) โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] qa_helper(/estimate/modify-v2/764) 3๊ฑด = โ ใ์น์์นธ, ์ฝ๋์นธ ํด๋ฆญ์ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ธ๋ก์ผ๋ก
์กํ๊ฒ ํด์ค. ์์ ์ ๋ฐ๋ก ์ซ์์
๋ ฅ์ผ๋ก ๋ฎ์ด์ธ์ ์๊ฒใ โกใํด๋ฉ ์์ด์ฝ์ ์ ์ฒด 1๊ฐ์ ์์ด์ฝ์ผ๋ก ๋ณ๊ฒฝํด์ค.
ํ์ฌ ์์ด์ฝ ์ธ๋ชจ ๋ชจ์์ด ์ ์ค์์ด ์๋๋ค. ์ธ๋ชจ๋ชจ์๊ณผ ํ๋ ์์กฐํฉ์ผ๋ก ๋ณด์ธ๋ค. ๋์์ธ์ ์ผ๋ก ๋ณ๋ก์. ํ์ฉ๋
๋ฒ์์์์ ํฌ๊ธฐ๋ฅผ ์ต๋ํ ํค์์ค. ํด๋ฆญํ๊ธฐ ํธํ๊ฒ. ์ถ๊ฐ๊ธ์ก ํญ๋ชฉ์ด ์๋ ๊ฒฝ์ฐ ๋ฒํผ์ ์ปฌ๋ผ ๋ฐฐ๊ฒฝ์
์ฌ์ด์๊ณ์ด๋ก ๋ณ๊ฒฝํด์คใ โขใ๊ธ์จ ํฌ๊ธฐ 1ํฌ์ธํธ ํค์์ฃผ๊ณ ์์ ์ข ๋ ์งํ๊ฒ. ๋๋กญ๋ฆฌ์คํธ ๊ธ์จ ๊ฐ๋ก ์์๋ฆฌ๊ฒ
๋ฆฌ์คํธ ํ๋ ์ ํ์ฅ. ๋ฆฌ์คํธ ์คํฌ๋กค ์์ด ์ ์ฒด ๋ชฉ๋ก ๋ณด์ด๊ฒใ + ใ์ ์ฒด ์์
๋ด์ฉ ๋ชจ๋ ์ด์๋ฐฐํฌ ์งํใ
- ๊ณ ์น ๊ฒ = 2ํ์ผ +39 โ12์ค(
web/static/css/estimate_regist_v2.cssยทweb/static/js/estimate_regist_v2.js). ์๋ฒ์ฝ๋ 0 ยท DDL 0 ยท DB ๋ณ๊ฒฝ 0. - โ ํด๋ฆญ ์ฆ์ ๋ธ๋ก์ ํ = ์์ ํ ์ค
$(document).on('focus click', '.dim-cell, .corner-cell', โฆ)์์ ๊ฐ์ด ์์ผ๋ฉดselect(). ๐focus๋ง ๊ฑธ๋ฉด ์ ๋๋ค โ ๋ง์ฐ์ค ํด๋ฆญ์ focus ๋ค์ mouseup ์ด ๋ฐ๋ผ์ ์ ํ์ ์บ๋ฟ์ผ๋ก ํ์ด๋ฒ๋ฆฐ๋ค.click์ mouseup ๋ค์์ด๋ผ ์ต์ข ์น์๋ค(ํญยท๋ฐฉํฅํค ์ด๋์ focus ๊ฐ ๋ด๋น). ๐type=number๋selectionStart๋ฅผ ๋ชป ์ฝ์ง๋ง(Chrome ์ด null)select()์์ฒด๋ ๋์ํ๋ค โ ์ค์ธก์ผ๋ก ํ์ธํ๊ณ ๊ฐ๋ค. ๋ณธ๋ฌธยท๋ชจ๋ฌ(#itemModal)ยท๊ณ์ฐ๊ธฐ(#calcFrame) ๊ฐ ๊ฐ์ ํด๋์ค๋ผ ํ ์ค์ด ์ ๋ถ ๋ฎ๋๋ค. - โกํด๋ฉ ์์ด์ฝ =
โถ๊ธ๋ฆฌํ + 1px ํ ๋๋ฆฌ ์์ ์กฐํฉ์ ๋ฒ๋ฆฌ๊ณ border ๋ก ๊ทธ๋ฆฐ CSS ์ผ๊ฐํ::beforeํ๋๋ก.inset:0 + margin:auto๋ผ ๊ธฐํํ์ ์ ์ค์(์ค์ธก ์ข์ฐ 8=8 ยท ์ํ 6=6) โ ๊ธ๋ฆฌํ ๋ฉํธ๋ฆญ ์น์ฐ์นจ์ด ์ ์ด์ ์๋ค. ํฌ๊ธฐ๋ 18 โ 26px: ๐์นธ ํญ 30px ์columnSettings(์ฌ์ฉ์๋ณ DB ์ ์ฅ)๋ผ ๊ฑด๋๋ฆฌ๋ฉด ๊ธฐ์กด ์ฌ์ฉ์์๊ฒ ์ ๋จน๋๋ค โ td ํจ๋ฉ์ 9/8 โ 4/2 ๋ก ์ค์ฌ ๊ฐ์ ํญ ์์์ ๋ฒํผ์ ํค์ ๋ค. ํผ์นจ ํ์๋ ์ข ์ ๊ทธ๋๋ก 90๋ ํ์ (์๋ง--primary). - โก์ถ๊ฐ๊ธ์ก ์ฌ์ด์ =
cellForCol('twirl')์ดsubs.length > 0์ด๋ฉด td ์has-subโ ๋ฐฐ๊ฒฝ#cdf0f7. sub ์ถ๊ฐ/์ญ์ ๊ฐrenderDetailTable()์ ๋ถ๋ฅด๋ฏ๋ก ์ ํ ์ํ์์๋ ์๋ ๋๊ธฐ๋๋ค(๋ณ๋ ๋ฐฐ์ 0). - โข๋ถ๋ฅ ์นธ = input 12 โ 13px, ์์ td ์์
--ink-2โ--ink(๊ตต๊ธฐ๋ ์ ๊ฑด๋๋ ธ๋ค โ ํํ UI ๊ท์น = ๊ฐ์กฐ๋ ์์ผ๋ก๋ง). ๋๋กญ๋ค์ด์right:0์ ๋นผ๊ณwidth:max-content+min-width:100%(์นธ ํญ 48px ์ ๋ฌถ์ฌ ํญ๋ชฉ๋ช ์ด ์๋ฆฌ๋ ๊ฒ) +max-height:220px์ ๊ฑฐ โ ๊ณตํต์ฝ๋ 15์ข ์ด ์คํฌ๋กค ์์ด ํ ๋ฒ์(450px). - ๊ฒ์ฆ = ์ ์ค
scripts/_est_qa826_ui_check.py [test|prod] [๊ฒฌ์ ๋ฒํธ]โ ํ ์คํธ(707) 36/36 ALL PASS ยท ์ด์(764) ์ฝ๊ธฐ์ ์ฉ 37/37 ALL PASS. ์ด์์์ ์ถ๊ฐ๊ธ์ก 3ํ ์ฌ์ด์rgb(205,240,247)ยท ์๋ 1ํ ํฐ์๊น์ง ๊ฐ์ด ์กํ๋ค. ํ๊ท =_dim_wheel_check(ํ ๊ฐ๋) ยท_size_unit_check(์น์ mm ์๋๋ถ์ฐฉ) ยท_actcol_vert_check(์ก์ ์ด) ํ ์คํธยท์ด์ ์ ๋ถ 0 FAIL, ์ฝ์ 0. - ๋ฐฐํฌ = master
abf3e36โ deploy-liveb83d8c6(2ํ์ผ ์ ๋ณ ํฌ์๋,--detach์ํฌํธ๋ฆฌ). ํฌ์๋ ์ git diff origin/deploy-live origin/master -- <2ํ์ผ>์ด ๋ด ์ปค๋ฐ diff ์ ๋ฐ์ดํธ ๋์ผํจ์ ํ์ธํ๊ณ ๋๊ฒผ๋ค(๊ทธ ํ์ผ์ ๊ฑธ๋ฆฐ ๋ฏธ๋ฐ์ ์ปค๋ฐ 11๊ฐ๋ ์ ๋ถ ์ด๋ฏธ ๋ฐ์๋ผ ์์๋ค). ์ฌ์ดํธ๋งต = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 54 ยท ๋ฏธ๋ฐ์ 0.devplan/pfs.htmlDONEAE๋ฑ์ฌ. - โ ๋ฐ๋ก ๋ฐ๊ฒฌ(๋ด ๋ณ๊ฒฝ ์๋, ์ ์ ๋) = ํญ๋ชฉํ ํค๋์
dragยทtwirl์ด ์๋ฌธ ๊ทธ๋๋ก ๋ ธ์ถ๋๋ค.labelForCol()์ดlabels[key] || key๋ผ ๋ผ๋ฒจ์ด ๋น ๋ฌธ์์ด('')์ด๋ฉด ํด๋ฐฑ์ด ํค ์ด๋ฆ์ ์ฐ๋๋ค (drag:'', twirl:''). ์ง์ ๋ฒ์ ๋ฐ์ด๋ผ ์ ๊ณ ์ณค๋ค โ ๊ณ ์น๋ ค๋ฉด|| ''๋ถ๊ธฐ ํ ์ค. - โณํํ = ์ด์ ์ก์ 1ํ(
/estimate/modify-v2/764โ ์น์์นธ ํด๋ฆญ ยท ํด๋ฉ ์์ด์ฝ ยท ๋ถ๋ฅ ๋๋กญ๋ค์ด).
๐ NOW (2026-08-25 ยท 7์ฐจ) โ ๊ฒฌ์ ํ์ฅ๊ฒ์ ๋ชจ๋ฌ์ ์์ฐจ์ผ ๋ฏธํ์ ๋ ธ์ถ + ๋งจ ์ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] qa_helper(/estimate/regist-v2, #btnFieldSearch) ใ๊ฒฌ์ ์ฉ ํ์ฅ ๋ชจ๋ฌ์์ ๋ฆฌ์คํธ์ ์์ฐจ์ผ
๋ฏธํ์ ๋ถ์ด ๋์ค์ง ์๋๋ค. ์์ฐจ์ผ ๋ฏธํ์ ๋ถ๋ ๋์ค๊ฒ ํ๊ณ , ์์์ ๋ฆฌ์คํธ ์๋จ์ ๋ฐฐ์น์์ผ๋ผ. ์ด์๋ฐฐํฌใ
- ๐์์ธ์ ์ ๋ ฌ์ด ์๋๋ผ
WHERE์ ์ด์๋ค. 5์ฐจ(ํ์ฅ๋ชฉ๋ก)๋ ์ ๋ ฌ๋ง ๊ณ ์น๋ฉด ๋์ง๋ง ์ฌ๊ธฐ๋select_site_search์AND f.shipping_date >= date_from์ด NULL ์ ํต์งธ๋ก ๊ฑธ๋ฌ๋ด ๋ฏธํ์ ํ์ฅ์ด ๊ฒฐ๊ณผ์ ์์ ์์๋ค(๋ชจ๋ฌ ๊ธฐ๋ณธ = 1๊ฐ์ ์ ~๋ฌด์ ํ). ๊ฐ์ ํจ์ ์ ์ด๋ฏธ ๋ ๋ฒ ๊ณ ์ณค๋๋ฐ (์์ฐํํฉ ๋ฆฌํฌํธ SQL = ๋ฐฐํฌXยท ํ์ฅ๋ชฉ๋ก ๊ฒ์ = ๋ฐฐํฌY) ๊ฒฌ์ ํ์ฅ๊ฒ์์ ํ ๊ณณ ๋จ์ ์์๋ค. - ๊ณ ์น ๊ฒ = 2ํ์ผ +12 โ4์ค. โ DAO ๊ธฐ๊ฐ์กฐ๊ฑด 2๊ฐ๋ฅผ
(f.shipping_date IS NULL OR โฆ)๋ก ๊ฐ์ธ๊ณ โกORDER BY (f.shipping_date IS NULL) DESC๋ฅผ ๋งจ ์์ โLIMIT 50์ด๋ผ ์ ๋ ฌ์ ์ ๋ฐ๊พธ๋ฉด ๋ฏธํ์ ์ด ๊ผฌ๋ฆฌ์์ ์๋ ค๋๊ฐ๋ค(WHERE ๋ง ๊ณ ์น๋ฉด ๋ฐ์ชฝ) โขํ๋ก ํธsiteSortCmp๋ ์์ฐจ์ผ ํค์์ ๋น ๊ฐ์ ์ ๋ ฌ ๋ฐฉํฅ๊ณผ ๋ฌด๊ดํ๊ฒ ๋งจ ์(ํค๋๋ก ์ค๋ฆ/๋ด๋ฆผ ๋ค์ง์ด๋ ์๋จ ์ ์ง) โฃfmtShipDate('')= ใ๋ฏธํ์ ใ ํ๊ธฐ โ ์ข ์ ์ ๋น ์นธ์ด๋ผ ๋งจ ์์ ์๋ ๋ญ์ง ์ ๋ณด์ธ๋ค. ์๋ฒ DDL 0 ยท DB ๋ณ๊ฒฝ 0. - ๊ฐ์ API ๋ฅผ ์ฐ๋ ๋ค๋ฅธ ํ๋ฉด๋ ํจ๊ป ๊ณ ์ณ์ก๋ค = AL๋ฐ์ฃผ์ ํ์ฅ๋ช
๋๋กญ๋ฆฌ์คํธ(
al_orderpaper.js)ยท ์์ฌ๊ด๋ฆฌ ํ์ฅ๋ชฉ๋ก(orderpaper_material.js). ๋ ๋ค ๋น ์์ฐจ์ผ์ ์ด๋ฏธ ์์ ํ๊ฒ ์ฒ๋ฆฌํด์ ํ๊ท 0 (_al_combo_checkํ ์คํธยท์ด์ ALL PASS ๋ก ํ์ธ). - ๊ฒ์ฆ = ์ ์ค
scripts/_estimate_site_tbd_check.py [test|prod]โ ํ ์คํธ 22/22 ALL PASS (์์ฐจ์ผ ์๋ ์์ ํ์ฅ 1๊ฑด ์์ฑ โ ๊ฒ์๊ฒฐ๊ณผ ์ต์๋จ ํ์ธ โ ์ํํธ์ญ์ ), ์ด์ ์ฝ๊ธฐ์ ์ฉ 17/17 ALL PASS (๋ฏธํ์ 3๊ฑด = ๊ธํธ ๊ตฌ๋ฏธยทGS ์์ฃผ ๋จ๊ตฌยท๋กฏ๋ฐ ํ์ฑ ํฅ๋จ ์ด ํ ๋งจ ์ 3ํ ใ๋ฏธํ์ ใ, 4ํ์งธ๋ถํฐ20260916๋ด๋ฆผ์ฐจ์, ์ ๋ ฌ ๋ค์ง๊ธฐยท์ด๊ธฐํ์๋ ์๋จ ์ ์ง, ์ฝ์ 0). ํ๊ท =_al_combo_checkํ ์คํธยท์ด์ ALL PASS ยท_ship_tbd_checkํ ์คํธ ALL PASS. - ๋ฐฐํฌ = master
ac24be5โ deploy-live845285e(2ํ์ผ ์ ๋ณ ํฌ์๋,--detach์ํฌํธ๋ฆฌ). ์ฌ์ดํธ๋งต = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 54 ยท ๋ฏธ๋ฐ์ 0.devplan/pfs.htmlDONEAD๋ฑ์ฌ. - โณํํ = ์ด์ ์ก์ 1ํ(๊ฒฌ์ ๋ฑ๋ก โ ๐ ๊ฒ์ โ ๋งจ ์ 3ํ์ด ใ๋ฏธํ์ ใ).
๐ NOW (2026-08-25 ยท 6์ฐจ) โ ๊ฑฐ๋์ฒ ๊ฐ๋ช : ๋ฅ์์ค โ ํ์ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] ใpfs ์ ์ฒด๋ช ๋ณ๊ฒฝ์ ํ๋ค. "๋ฅ์์ค"๋ฅผ "ํ์"์ผ๋ก ๋ณ๊ฒฝํ๊ณ ๊ด๋ จ ์ง์นจ์์ ์ฉ์ด ๊ต์ฒด๋ฅผ ๊ฐ์ดํด์ ์์คํ ์ ์ค๋ฅ๊ฐ ์์๊ธฐ๋๋ก ํด๋ผ. db์์ ๋ ์น์ธํ๋ค. ์ด์ ๋ฐฐํฌใ
- ๊ทธ๋ฆด๋ง 6๋ฌธ ํํ ํ์ = โ ๋ฒ์ = ๋ง์คํฐ+ํ๋ฉด ํค๋ง(๊ณผ๊ฑฐ ํ์ํ
์คํธยท์ค๋ฌผ์ฐธ์กฐ ์ ์ธ) โก๋ฐ์ฃผ์ ๋๊ธฐํ๋
ํ์์์ ์ ๊ทํ โขํ๊ธฐ =
ํ์/ ์ถ๋ ฅ(์ฃผ)ํ์โฃ๊ณผ๊ฑฐ ๋ง๊ฐํ๋ 8์๋ถ๋ถํฐ๋ง(1~7์์ ๋น์ ์ฌ๋ช ๋ณด์กด) โค์์ ์ฅ์น = ๋กค๋ฐฑ ์คํฌ๋ฆฝํธ + RDS ์ค๋ ์ท โฅ์ง์นจ๋ฌธ์๋ ์นํ + ์ต์ด 1ํ ใ๊ตฌ ๋ฅ์์คใ ๋ณ๊ธฐ. - ๐๊ฐ๋ฅด๋ ๊ธฐ์ค = ใ์ค๋ฌผ์ด ๊ฐ์ด ๋ฐ๋์๋ใ. ์์ธ ๊ท์นยท๋ชฉ๋ก =
rules.md๐ ๋งจ ์. ๋ฐ๊พผ ๊ฒ =company.name(company_no=1 โ ํ์ฅ 825๊ฑดยท๋ด๋น์ 22๋ช ์ด FK ๋ก ์๋ ์ถ์ข ) ยทorderpaper.furniture_companyยทorderpaper_site_mapยทmonthly_close.company_name(2026-08 ๋ง) ยทvendors.json. ์ ๋ฐ๊พผ ๊ฒ = NAS ํ์ผ๋ช ยท ์นดํก๋ฐฉ๋ช ยท ๋ น์ํ์ผ๋ช ยท ํตํ์๋ฌธ ยทestimate_nameยทfield.nameยทworklog.site_nameยทnexus_close_form.xlsxยท ์ ์ฉ์๋ฃ ๋ง์ด๊ทธ๋ ์ด์ . - ๐ํจ์ 1 โ DB ๋ง ๊ณ ์น๋ฉด ๋๋์๊ฐ๋ค.
orderpaper_sync๊ฐON DUPLICATE KEY UPDATE furniture_company=VALUES(โฆ)๋ก ๋งค ๋๊ธฐํ๋ง๋ค ํ์ผ๋ช ํ์ฑ๊ฐ์ผ๋ก ๋ฎ๊ณ , ๋์ด๋ฐ์ฃผ์๋ H6 ์ ์ ์ฌํ์ฑํ๋ค. NAS ํ์ผ๋ช ์ ์ ์ฌ๋ช ๊ทธ๋๋ก๋ค. โorderpaper_parse._COMPANY_ALIAS(๋จ์ผ ์ถ์ฒ,door_order_parse๊ฐ import) ์์ ์ ์ฌ ์์ ์ ๊ทํ._KNOWN_COMPANIES์ ์ ์ด๋ฆ์ ๋จ๊ฒจ ์ ํ์ผ๋ช ์ด ๊ณ์ ํ์ฑ๋๊ฒ ํ๋ค. ์์ = ํ์ ๋จผ์ , DB ๋์ค โ ์๋๋๊ธฐํ๊ฐ ๋ก์ปฌ ์คํ(30๋ถ ์ฃผ๊ธฐ)์ด๋ผ ํ์๋ฅผ ๊ณ ์น๋ ์๊ฐ ๋ฐํจ๋ผ ๋๊ธฐํ๋ฅผ ๋ฉ์ถ ํ์๊ฐ ์๋ค. - ๐ํจ์ 2 โ
vendors.json์ ๊ฑฐ๋์ฒ์ ใ์๋ ์ด๋ฆ๋งใ ๋ณด์ถฉํ๋ ํด๋ฐฑ์ด๋ค. ๋ง์คํฐ๋ง ๋ฐ๊พธ๋ฉด ์ค๋ ์ท์ ์ ์ด๋ฆ 18ํ์ด ์ค๋ณต์ ๊ฑฐ๋ฅผ ํผํด AL๋ฐ์ฃผ์ ์๋์์ฑ์ ์ ๋ น์ผ๋ก ๋จ๋๋ค โ ๊ฐ์ด ๊ต์ฒด. - ์ฝ๋ = master
b1ef589โ deploy-livea449d3e(22ํ์ผ ์ ๋ณ ํฌ์๋,--detach์ํฌํธ๋ฆฌ). ์ ํ์ผdeploy-liveโmaster์ฐจ์ด๊ฐ ๋ด ๋ณ๊ฒฝ๋ฟ์์ ํ์ผ๋ณ diff ์ค์ ๋์กฐ๋ก ํ์ธํ๊ณ ๋๊ฒผ๋ค. DDL 0. - DB(SSM
scripts/_hanssem_rename_apply.py, ํ์ผ ๋ด ์์EXECUTE๊ฒ์ดํธ) = ์ด์ company 1 / orderpaper 1561 / site_map 18 / monthly_close 1(2026-08) ยท ํ ์คํธ 1 / 1382 / 16 / 5. RDS ์ค๋ ์ทpfs-pre-hanssem-20260825(03:02Z=12:02 KST, available ํ์ธ ํ ์งํ). ๋กค๋ฐฑ =scripts/_hanssem_rename_rollback.py(์ญ์กฐ๊ฑด UPDATE โ ๋ณ๊ฒฝ ์ 'ํ์'์ด 4๊ฐ ์ปฌ๋ผ ์ ๋ถ 0๊ฑด์ด๋ผ ํ๋จ์ ๋ฐฑ์ ์ด ํ์ ์๋ค. โ ๋กค๋ฐฑ์ ํ์ ์ ๊ทํ ์ ๊ฑฐ๊ฐ ๋จผ์ ๋ค). - ๊ฒ์ฆ = ์ ์ค
scripts/_hanssem_rename_check.py [test|prod]โ ํ ์คํธ 16/16 ยท ์ด์ 20/20 ALL PASS (์ ์ฒดํํฐ 2์ข ยท์๋ง๊ฐ ๊ฑฐ๋์ฒ๋ชฉ๋กยท์ด์ 2026-08 ๋ง๊ฐํ+์๊ณต๋น ์ปฌ๋ผยท2026-07 ์ ใ๋ฅ์์ค (9)ใ๋ก ๋ณด์กดยท AL๋ฐ์ฃผ์ vendors ์ ๋ น 0ยท์์ฌ๊ด๋ฆฌ datalistยท์์ฐํํฉ ์์๋งตยท์ฝ์ 0). ํ๊ท =_field_list_qa5_checkํ ์คํธยท์ด์ ALL PASS ยท_monthly_close_ui_checkํ ์คํธ 19/19ยท์ด์ 19/19 ยท_ship_tbd_checkํ ์คํธ ALL PASS ยท_field_status_print_ivision_checkALL PASS ยทtest_monthly_close_excelALL PASS ยทtest_door_order_parse8/8 ยท ๊ฒฌ์ ์ A6 ์ ๋ ๋จ์๊ฒ์ฌ 7/7. - ์ค์ฆ(๊ฐ์ฅ ์ค์) = ํ์ ์์ ๋ค ์๋๋๊ธฐํ๊ฐ ์ค์ ๋ก 1ํ ๋์๊ณ (round
R1787627337โ 12:09 KST, prod, 50ํ์ผ 1861ํญ๋ชฉ) ๊ทธ ์งํ ์ด์/api/orderpaper/all-items์ ์ฒด๋ณ ์ง๊ณ = ํ์ 1276 / ๋ฅ์์ค 0. NAS ํ์ผ๋ช ์ด ์์ง ์ ์ฌ๋ช ์ธ๋ฐ๋ ๋๋๋ฆผ์ด ์๋ค๋ ๊ฒ ํ์ธ๋๋ค. - โ ์ ๋ฐ์ ๋ฐ๊ฒฌ(๋ด ๋ณ๊ฒฝ๊ณผ ๋ฌด๊ด) =
_mc_aug_row_ui_check.py๊ฐ ์ด์ 2 FAIL โ ์ถ๊ฐ๊ธ์กยทํฉ๊ณ ๊ธฐ๋๊ฐ์ด 2026-08-24 ใ์๋ง๊ฐ ๊ธ์ก = ๊ฒฌ์ ์ค์๊ฐ ์ฌ๊ณ์ฐใ ๋ฐฐํฌ ์ด์ ์ ๊ตณ์ ๊ฐ์ด์๋ค(์ถ๊ฐ 6,295,000/ํฉ๊ณ 28,975,000). ๊ฒฌ์ ์ค์ธก(735 total 20,370,000ยท์๊ณต 8,000,000 / 753 total 10,467,000ยท์๊ณต 2,310,000)๊ณผ ํ๋ฉด์ด ์ ํํ ์ผ์น โ ๊ณ ์ ์ซ์๋ฅผ ํญ๋ฑ์ ๋์กฐ๋ก ๊ต์ฒด(8/24 ์_monthly_close_ui_check์ ํ ๊ฒ๊ณผ ๊ฐ์ ๊ต์ ). ์ฌ์คํ 10/10 PASS. - ์ฌ์ดํธ๋งต = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 54 ยท ๋ฏธ๋ฐ์ 0.
devplan/pfs.htmlDONEAC๋ฑ์ฌ. - โณํํ = ์ด์ ์ก์ 1ํ(ํ์ฅ๋ชฉ๋ก/๊ฒฌ์ ๋ชฉ๋ก ์ ์ฒด ํํฐ ใํ์ใ ยท ๊ฒฌ์ ์ ์ถ๋ ฅ A6 ใ(์ฃผ)ํ์ใ).
๐ NOW (2026-08-25 ยท 5์ฐจ) โ ํ์ฅ๋ชฉ๋ก ์์ฐจ์ผ ๋ฏธํ์ ์ ๋งจ ์๋ก โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] ใpfs ํ์ฅ ๋ชฉ๋ก์์ ์์ฐจ์ผ ๋ฏธํ์ ๋ถ์ด ๋ฆฌ์คํธ์์ ์ ๋ณด์ธ๋ค. ์ ๋ ฌ์์ ๊ท์น๋๋ฌธ์ธ๋ฐ, ๋ฏธํ์ ๋ถ์ ๋ชฉ๋ก ์๋จ์ผ๋ก ๊ธฐ๋ณธ ๋ฐฐ์ ํด์ค. ์ด์ ๋ฐฐํฌใ
- ๐์์ธ = 3์ฐจ์์ ์ํ ๊ทธ๋ฃน ์ ๋ ฌ์ ๋กค๋ฐฑํ๋ฉฐ ์ ๋ ฌ์ด ใ์์ฐจ์ผ ๋ด๋ฆผ์ฐจ์ ํ ์คใ๋ก ๋์๊ฐ๋๋ฐ, ๋ด๋ฆผ์ฐจ์์์ ๋น ๊ฐ(๋ฏธํ์ )์ ๋งจ ๋ค๋ค. ์ด์ 129ํ์ด๋ฉด 7ํ์ด์ง์งธ๋ก ๋ฐ๋ ค ์ฌ์ค์ ์ ๋ณด์๋ค. 2์ฐจ ์ ๋ ฌ์ ๋ฏธํ์ ์ 0๋ฒ ๊ทธ๋ฃน์ผ๋ก ๋งจ ์์ ๋์๋๋ฐ, ๋กค๋ฐฑ์ด ๊ทธ ํจ๊ณผ๊น์ง ๊ฐ์ด ๊ฑท์ด๊ฐ ๊ฒ์ด๋ค.
- ๊ณ ์น ๊ฒ =
field_list.htmlํ ํ์ผ(+13 โ3์ค).fieldListOrder(a, b)๋ถํ โ ๋ค๋ง ์ด๋ฒ์ ์ํ๋ฅผ ์ ๋ณธ๋ค: ๋ฏธํ์ ์ฌ๋ถ ๋จผ์ (๋ฏธํ์ ์ด ์) โ ์์ฐจ์ผ ๋ด๋ฆผ์ฐจ์ โ ๋ฏธํ์ ๋ผ๋ฆฌ๋field_no๋ด๋ฆผ์ฐจ์. ใ์งํํ์ฅใ ํ ๊ธ์ ์ค๋ฆ์ฐจ์ ๋ถ๊ธฐ๋ ๋น ๊ฐ์ด ์๋ ๋งจ ์์ด๋ผ ์ ๊ฑด๋๋ ธ๋ค. ์๋ฒ์ฝ๋ 0 ยท DDL 0 ยท DB ๋ณ๊ฒฝ 0. - 3์ฐจ์์ ๋บ ใ๋๊ธฐ์ค/์งํ์ค/์๋ฃใ ์ํ ๊ทธ๋ฃน ์ ๋ ฌ์ ์ฌ์ ํ ์๋ค(๊ฒ์ฌ๋ก ๊ณ ์ ) โ ์ํ๋ ํ ์ ํญ์ผ๋ก ๊ณ ๋ฅธ๋ค.
- ๊ฒ์ฆ =
_field_list_qa5_check.py๊ฐฑ์ (๋จ์กฐ ๋น๊ต๋ฅผorder_ok()ํ์ ์ผ๋ก ๊ต์ฒด, ํญ ์ ์ ๋ ฌ๋ ๊ฐ์ ๊ท์น ์ ์ฉ). ํ ์คํธ 57/57 ALL PASS ยท ์ด์ ์ฝ๊ธฐ์ ์ฉ 34/34 ALL PASS. ์ด์ ์ก์ = ์ฒซ ํ์ด์ง ์์ 3ํ์ด ๊ธํธ ๊ตฌ๋ฏธ / GS ์์ฃผ ๋จ๊ตฌ / ๋กฏ๋ฐ ํ์ฑ ํฅ๋จ ์ ๋ถ ๋ฏธํ์ , 4ํ์งธ๋ถํฐ20260916๋ด๋ฆผ์ฐจ์. - ๋ฐฐํฌ = master
1640a2fโ deploy-liveb1958ab(1ํ์ผ ์ ๋ณ ํฌ์๋,--detach์ํฌํธ๋ฆฌ). ์ฌ์ดํธ๋งต = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 54 ยท ๋ฏธ๋ฐ์ 0.devplan/pfs.htmlDONEAB๋ฑ์ฌ.
๐ NOW (2026-08-25 ยท 4์ฐจ) โ ๋ฑ๋กยท์์ ํผ ํ์ฅ์ํ ํ ๊ธ = ์งํ์ค โ ๋๊ธฐ์ค ๋๋ง โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] qa_helper(/field/modify/2157, button[name=field_status]) = ใํ ๊ธ๋ฒํผ ์์ ์์ . ์งํ์ค ๋๊ธฐ์ค
2๊ฐ์ง ์ํ๋ง ์ ์ฉํ๋ค. ์ด ๋ฒํผ์์ ์๋ฃ๋ ์ ์ธํ๋ค. ์ด์๋ฐฐํฌใ
- ใ์ด ๋ฒํผใ = ๋ฑ๋กยท์์ ํผ์ ํ์ฅ์ํ ํ ๊ธ๋ง์ด๋ค. ๋ชฉ๋ก ์ํ ์ปฌ๋ผ ๋ฒํผ์ ์ข ์ ๋๋ก 3๋จ๊ณ (๋๊ธฐ์คโ์งํ์คโ์๋ฃ) โ ์๋ฃ ํ์๋ฅผ ๋ชฉ๋ก์์ ๋บ ์๋ ์์ผ๋ ๋์ด ์๋ก ๋ค๋ฅธ ์ํํ๋ฅผ ์ด๋ค.
- ๊ณ ์น ๊ฒ =
pfs-component.js์PFS_STATUS_FORM_NEXT = {'20':'10', '10':'20', '30':'20'}์ ์ค,initFieldStatusToggle์ดPFS_STATUS_NEXT๋์ ์ด๊ฑธ ๋ณธ๋ค. ํ ํ๋ฆฟ 2๊ฐ๋ ๋ฒํผtitle๋ฌธ๊ตฌ๋ง ใํด๋ฆญ: ์งํ์ค โ ๋๊ธฐ์คใ. 3ํ์ผ / +8 โ3์ค ยท ์๋ฒ์ฝ๋ 0 ยท DDL 0 ยท DB ๋ณ๊ฒฝ 0. - ๐
30 โ 20๋งคํ์ ๋จ๊ธด ์ด์ = ์๋ฃ๋ก ์ ์ฅ๋ ํ์ฅ์ ์์ ์ผ๋ก ์ด๋ฉด ์๋ฃ๋ฅผ ๊ทธ๋๋ก ๋ณด์ฌ์ค์ผ ํ๊ณ (์๋์ผ๋ก ๋ฐ๋๋ฉด ์ ์ฅ ์๊ฐ ์ํ๊ฐ ์กฐ์ฉํ ๋ค์งํ๋ค), ๋๋ฅด๋ ์๊ฐ ๋ ์ํ ์ํ์ผ๋ก ๋ค์ด์ค๊ฒ ํ๋ ค๋ฉด ์ถ๊ตฌ๊ฐ ํ์ํ๋ค. ์๋ฃ๋ก ๋๋๋ฆฌ๋ ค๋ฉด ๋ชฉ๋ก ์ํ ์ปฌ๋ผ ๋ฒํผ์ ์ด๋ค. - ๊ฒ์ฆ =
_field_list_qa5_check.py๊ฐฑ์ . ํ ์คํธ 55/55 ALL PASS(๋ฑ๋กยท์์ ๊ฐ 4ํด๋ฆญ์ด ๋๊ธฐ์ค/์งํ์ค ์๋ณต์ด๊ณ ใ์๋ฃใ ๋ฏธ์ถํ + ์๋ฃ ํ์ฅ์ ์ด์์ ๋ ์๋ฃ ์ ์ง โ 1ํด๋ฆญ์ ์งํ์ค) ยท ์ด์ ์ฝ๊ธฐ์ ์ฉ 32/32 ALL PASS. ํ๊ท_ship_tbd_checkํ ์คํธ ALL PASS. โ ๊ฒ์ฌ ํจ์ = ์ฝ์ 500 ํํฐ(๊ธฐ์กด/children)๋ฅผ ํ์ด์ง๋ฅผ ๋ ์ด๊ธฐ ์ ์ ์ ์ฉํด ๋๋ฉด ๊ทธ ๋ค์ ์๊ธด 500 ์ด ๋จ์ ๊ฑฐ์ง FAIL ์ด ๋๋ค โ ํํฐ๋ ๋ง์ง๋ง ํ ๋ฒ๋ง. - ๋ฐฐํฌ = master
a998988โ deploy-livef739d33(3ํ์ผ ์ ๋ณ ํฌ์๋,--detach์ํฌํธ๋ฆฌ). ์ฌ์ดํธ๋งต = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 54 ยท ๋ฏธ๋ฐ์ 0.devplan/pfs.htmlDONEAA๋ฑ์ฌ. - โณํํ = ์ด์ ์ก์ 1ํ(ํ์ฅ ๋ฑ๋ก/์์ ํ์ฅ์ํ ๋ฒํผ).
๐ NOW (2026-08-25 ยท 3์ฐจ) โ ํ์ฅ๋ชฉ๋ก ์ํ ์ ๋ ฌ ๋กค๋ฐฑ + ํ์ฅ์ํ ํํฐ ํญ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] ใํ์ฅ๋ชฉ๋ก ์ํ ์ ๋ ฌ์ ์ทจ์ํ๋ค. ๋ค์ ๋กค๋ฐฑํด์ค. ๋์ ํ ์ด๋ธ ์๋จ ๊ฒ์๊ฒฐ๊ณผ ํ ์คํธ ์ง์ฐ๊ณ ๊ทธ ์์น์ ํ์ฅ์ํ ํํฐ์ฉ ํญ์ ๋ฌ์์ค. ๋๊ธฐ์ค,์งํ์ค,์๋ฃ. ๋๋จธ์ง ์๋ฃ ์์ ์ ๊ทธ๋๋ก ์ ์ง. ์ด์ ๋ฐฐํฌใ
- ๊ณ ์น ๊ฒ =
field_list.htmlํ ํ์ผ(+53 โ23์ค). ์๋ฒ์ฝ๋ 0 ยท DDL 0 ยท DB ๋ณ๊ฒฝ 0. - ๋กค๋ฐฑ =
applyFieldFilter์ ๊ธฐ๋ณธ ์ ๋ ฌ์ ์์ฐจ์ผ ๋ด๋ฆผ์ฐจ์ ํ ์ค๋ก ๋๋๋ ธ๋ค(2์ฐจ ์ด์ ๊ณผ ๋ฐ์ดํธ ๋์ผ).fieldListGroupยทfieldListOrderยทSTATUS_RANK์ญ์ . โ ์์ฐจ์ผ ์๋ ํ์ฅ์ด ๋งจ ๋ค๋ก ๋ฐ๋ ค ์ ๋ณด์ด๋ ๋ถ์์ฉ์ด ๋ฌ๋ค โ 5์ฐจ์์ ๋ฏธํ์ ๋ง ๋งจ ์๋ก ๋๋๋ ธ๋ค(์๋ 5์ฐจ ์ ). ใ๋๊ธฐ์ค/์งํ์ค/์๋ฃใ ์ํ ๊ทธ๋ฃน ์ ๋ ฌ์ ๋บ ๊ฒ์ ๊ทธ๋๋ก ์ ํจํ๋ค. - ์ ์ค =
<h5 class="card-title">๊ฒ์๊ฒฐ๊ณผ</h5>๋ฅผ ์ง์ฐ๊ณ ๊ทธ ์๋ฆฌ์#status-tabs(๋๊ธฐ์ค 10 / ์งํ์ค 20 / ์๋ฃ 30). ํ ๋ฒ์ ํ๋๋ง ๊ฑธ๋ฆฌ๊ณ ๊ฐ์ ํญ ์ฌํด๋ฆญ = ์ ์ฒด ํด์ โ ๋ฐ๋ก ์ ์ ์ฒด ํํฐ ๋ฒํผ๊ณผ ๊ฐ์ ๋ฐฉ์์ด๋ผ ๋ฐ๋ก ๋ฐฐ์ธ ๊ฒ ์๋ค. ์ ์ฒด ํํฐยทใ์งํํ์ฅใ ํ ๊ธ๊ณผ๋ AND ๋ก ๊ฒน์ณ ๊ฑธ๋ฆฐ๋ค. ํ์ฑ ํญ์ ๊ทธ ์ํ ์(--pfs-st-*)์ผ๋ก ๋ฐ์ค๊น์ง ๋ฌผ๋ ๋ค. ์ฃฝ์ CSS(h5.card-title) ์ ๊ฑฐ. - ๊ทธ๋๋ก ๋ ๊ฒ = ์ํ ์ปฌ๋ผ ํ ๊ธ ยท ๋ฑ๋ก/์์ ํ์ฅ์ํ ์นธ ยท ํญ ์ด๋ ยท 20ํ.
โ ์์ฐจ์ผ ๊ธฐ๊ฐ๊ฒ์ NULL ํต๊ณผ(
IS NULL OR โฆ)๋ ์ ์งํ๋ค โ ๊ทธ๊ฑด ์ ๋ ฌ์ด ์๋๋ผ ใ๋ฏธํ์ ํ์ฅ์ ๋ชฉ๋ก์ ๋์ฐ๋ใ ์์ ์ด๋ผ ๋กค๋ฐฑ ๋์์ด ์๋๋ค. ๋นผ๋ฉด ๋ฏธํ์ ํ์ฅ์ด ๋ชฉ๋ก์์ ๋ค์ ์ฌ๋ผ์ง๋ค. - ๊ฒ์ฆ =
_field_list_qa5_check.py๊ฐฑ์ . ํ ์คํธ 51/51 ALL PASS(ํญ 3์ข ร ํํฐ ๊ฒฐ๊ณผยทํ์ฑํ์ยทํญ ์ ์ ๋ ฌยท ์ฌํด๋ฆญ ๋ณต๊ท + ๊ธฐ์กด ํญ๋ชฉ ์ ๋ถ) ยท ์ด์ ์ฝ๊ธฐ์ ์ฉ 30/30 ALL PASS. ํ๊ท_ship_tbd_check์ด์ ALL PASS. ์ก์ = ํ ์คํธ ์คํฌ๋ฆฐ์ท 2์ฅ(์ ์ฒด/์งํ์ค). ์ด์ ์ค์ธก = ๋๊ธฐ์ค 6 / ์งํ์ค 8 / ์๋ฃ 114(์ ์ฒด 128). โ ๊ฒ์ฌ ํจ์ = ์์ฐจ์ผ ์๋ ํ์ ๋ด๋ฆผ์ฐจ์์์ ๋งจ ๋ค๋ผ 1ํ์ด์ง์ ์๋ค โ ์ํ๋ฒํผ ํ ๊ธ ๊ฒ์ฌ๋manageDataTable.search(์ด๋ฆ)์ผ๋ก ๋์ด์ฌ๋ฆฐ ๋ค ๋๋ฅธ๋ค. - ๋ฐฐํฌ = master
6fda185โ deploy-live89e5c9d(1ํ์ผ ์ ๋ณ ํฌ์๋,--detach์ํฌํธ๋ฆฌ). ์ฌ์ดํธ๋งต = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 54 ยท ๋ฏธ๋ฐ์ 0.devplan/pfs.htmlDONEZ๋ฑ์ฌ. - โณํํ = ์ด์ ์ก์ 1ํ(ํ์ฅ๋ชฉ๋ก ํ ์ ํญ).
๐ NOW (2026-08-25 ยท 2์ฐจ) โ ํ์ฅ๋ชฉ๋ก QA 5๊ฑด โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] ใPFS ํ์ฅ๋ชฉ๋ก ์์ ์์ ์ถ๊ฐ โฆโ ๊ธฐ๋ณธ ์ ๋ ฌ์ ๋ฏธํ์ /๋๊ธฐ์ค/์งํ์ค/์๋ฃ ์ + ํญ๋ชฉ๋ณ ์์ฐจ์ผ ๋ด๋ฆผ์ฐจ์ โก์ํ ์ปฌ๋ผ ๋ด์ฉ๋ฒํผ ํ ๊ธํ(๋๊ธฐ์ค-์งํ์ค-์๋ฃ ์ํยท๋ฐ๋ก DB) โข๋ฑ๋กยท์์ ์์ ํ์ฅ๋ช ํญ์ ์ค์ด๊ณ ์ ํ๊ณผ ์์ฐจ์ผ ์ฌ์ด์ ํ์ฅ์ํ ํ ๊ธ(๊ธฐ๋ณธ ์งํ์คยท์ ์ฅ ๋ฐ์) โฃํ์ฅ๋ด๋น์ โ ์ ์ฒด๋ด๋น์ โ ์๊ณต๋ด๋น์ ํญ ์งํ โคํ์ด์ง๋น 10 โ 20 ยท ์ด์๋ฐฐํฌใ
- ๊ณ ์น ๊ฒ = 7ํ์ผ / +201 โ49์ค. DDL 0 ยท DB ๋ณ๊ฒฝ 0 ยท ์ ๊ท API 0.
- โ ์ ๋ ฌ = ~~๊ทธ๋ฃน(๋ฏธํ์ โ๋๊ธฐ์คโ์งํ์คโ์๋ฃ) ์ ๋ ฌ~~ โ 3์ฐจ์์ ํํ ์ง์๋ก ๋กค๋ฐฑ(์๋ 3์ฐจ ์ ์ฐธ๊ณ ).
์ง๊ธ์ ์์ฐจ์ผ ๋ด๋ฆผ์ฐจ์ ํ ์ค์ด๊ณ , ์ํ๋ ํ ์ ํํฐ ํญ์ผ๋ก ๊ณ ๋ฅธ๋ค.
๐๊ฐ์ด ๊ณ ์น ๊ฒ = ๋ชฉ๋ก์ด ์ฒซ ์ง์
์ ๊ธฐ๋ณธ ๊ฒ์๊ธฐ๊ฐ(๊ณผ๊ฑฐ6๊ฐ์~๋ฏธ๋1๋
)์ ์ค์ค๋ก ์ฑ์ฐ๋๋ฐ
select_field_search_list์ ์์ฐจ์ผ ๋น๊ต๊ฐ NULL ์ ๊ฑธ๋ฌ๋ด ๋ฏธํ์ ํ์ฅ์ด ์์ ์ ๋์๋ค โ(a.shipping_date IS NULL OR โฆ). ์ด์ ๋ฆฌํฌํธ SQL ํจ์ ์ 2์ฐจ ๋ฐํ โ ๋จ์ ์๋ฆฌ๋rules.md๐ ์ ์ ์๋ค. - โก์ํ ์ปฌ๋ผ =
statusBtnHtml()ํ ๊ณณ์์๋ง ๋งํฌ์ ์ ๋ง๋ค๊ณ ์ปฌ๋ผ ๋ ๋ยทํด๋ฆญ ํ ๊ฐฑ์ ์ด ๊ฐ์ด ์ด๋ค. ์ ์ฅ์ ํ์ฅํ ์นฉ๊ณผ ๊ฐ์PATCH /api/field/status/<no>(์๋ฒ ํ์ดํธ๋ฆฌ์คํธ ๊ทธ๋๋ก). ๋๊ด์ ๋ฐ์ ํ ์คํจํ๋ฉด ๋๋๋ฆฐ๋ค. ํ์ฅํ ใํ์ฅ ์ํใ ์นฉ๋ ๊ฐ์ด ๋ง์ถ๋ค. โ ํด๋ฆญํด๋ ํ์ด ์ฆ์ ์ฌ์ ๋ ฌ๋์ง ์๋๋ค(์ปค์ ๋ฐ์์ ํ์ด ํ์ง ์๊ฒ) โ ๋ค์ ๊ฒ์/์๋ก๊ณ ์นจ์ ์ ์์๋ก ์จ๋ค. - โขํ์ฅ์ํ ์นธ = ํ์ฅ๋ช
col-md-5โ4๋ก ์ค์ธ ํ ์นธ(col-md-1). ๊ฐ์ ๋ฒํผdata-stํ๋์๋ง ์๊ณ ์ ์ฅํ ๋ ์ฝ๋๋ค(๊ณต์ฉinitFieldStatusToggleinpfs-component.js). ์๋ฒ =insert_field์ ํ๋์ฝ๋ฉ'20'์ ํ๋ผ๋ฏธํฐ๋ก,update_field๋ ๊ฐ์ด ์ฌ ๋๋งfield_status๋ฅผ SET(์ ๊ทธ๋ฌ๋ฉด ๋ชฉ๋ก ํ ๊ธ๋ก ๋ฐ๊พผ ์ํ๋ฅผ ํผ ์ ์ฅ์ด ์กฐ์ฉํ ๋ฎ๋๋ค).select_field์d.field_status์ถ๊ฐ(์์ ํ๋ฉด ์ด๊ธฐ๊ฐ). - โฃํญ = ์๋์ผ๋ก ์ฑ์์ง๋ ์นธ(์ง์ยท๋ถ์ยท์
์ฒด๋ช
)
tabindex="-1". ์์ ํ๋ฉด์ ๋ด๋น์ ๊ฒ์๋ฒํผ๊น์ง ๋นผ์ผ ์งํ์ด๋ผ ๊ฐ์ด ๋บ๊ณ , ๋์ ์ด๋ฆ์นธ Enter ๋ก ๊ทธ ์ค ํ์ ์ด ์ด๋ฆฌ๊ฒ ํ๋ค โ ์์ ํ๋ฉด์ ํ์ ์ด ๋ด๋น์๋ฅผ ๊ณ ๋ฅด๋ ์ ์ผํ ๊ธธ์ด๋ผ ๊ทธ๋ฅ ๋นผ๋ฉด ํค๋ณด๋๋ก ๋ชป ๊ณ ๋ฅธ๋ค. ๋ฑ๋กํ๋ฉด์ ์ธ๋ผ์ธ ๊ฒ์(Enter ์ ํ)์ด๋ผ ์๋๋๋ก. - โค
pageLength: 20. - ํ์ฅ์ํ ์(
--pfs-st-*)์pfs.css๋จ์ผ ์ถ์ฒ๋ก ์ฎ๊ฒจ ๋ชฉ๋กยท๋ฑ๋กยท์์ ์ด ๊ฐ์ด ์ด๋ค.field_list์ ์ฌ๋ณธ๊ณผSTATUS_NEXT์ค๋ณต ์ ๊ฑฐ(ํ์ฅํ ์นฉ ๋ผ๋ฒจ๋ง ์นธ์ด ์ข์ '๋๊ธฐ' ๋ก ๋จ๊ฒจ๋ ). - ๊ฒ์ฆ = ์ ์ค
scripts/_field_list_qa5_check.py [test|prod]. ํ ์คํธ 38/38 ALL PASS = ์์ ํ์ฅ 2๊ฑด ์์ฑ(๋ฏธํ์ ยท์๋ฃ / ์์ฐจ์ผ ์์ยท๋๊ธฐ์ค) โ ๋ฑ๋กยท์์ ์ํ ์๋ณต โfield_status๋ฏธ์ ์ก ์ ๊ฐ ์ ์ง โ ๊ธฐ๊ฐ๊ฒ์์ ๋ฏธํ์ ์์กด โ ํ๋ฉด ์ ๋ ฌ ์ค์ธก(๊ทธ๋ฃน ๋จ์กฐ์ฆ๊ฐ + ๋ฌถ์ ๋ด ๋ด๋ฆผ์ฐจ์) โ ์ํ๋ฒํผ 3๋ฐํด ํ DB ๋์กฐ โ ํผ ์ขํ(์ ํ<์ํ<์์ฐจ์ผ)ยท๊ธฐ๋ณธ๊ฐยท์ํ โ ํญ ํ ์ค์ธก โ ์ํํธ์ญ์ ์ ๋ฆฌ. ์ด์ ์ฝ๊ธฐ์ ์ฉ 16/16 ALL PASS(ํ์ฅ ์์ฑ ์ ํจยท์ ์ฅ ์ ๋๋ฆ). ์ด์ ์ฒซ ํ์ด์ง = ๋ฏธํ์ 2๊ฑด โ ๋๊ธฐ์ค ๋ฌถ์ ์. ํ๊ท_ship_tbd_checkํ ์คํธยท์ด์ ALL PASS. - ๋ฐฐํฌ = master
c45cd33ยทadb7c2aโ deploy-livef082d28(7ํ์ผ ์ ๋ณ ํฌ์๋,--detach์ํฌํธ๋ฆฌ). ์ฌ์ดํธ๋งต ์ฌ๋น๋ = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 54 ยท ๋ฏธ๋ฐ์ 0.devplan/pfs.htmlDONEY๋ฑ์ฌ. - โณํํ = ์ด์ ์ก์ 1ํ(ํ์ฅ๋ชฉ๋ก ์ ๋ ฌยท์ํ๋ฒํผ ยท ํ์ฅ ๋ฑ๋ก/์์ ํ์ฅ์ํ์นธยทํญ).
- โน๏ธโฃ๋ ใ์ํฐ๋ก ์ ํใ์ด ๋ฑ๋กํ๋ฉด์๋ง ์๋ ๋์์ด๋ผ ์ง์๋ ๋ฑ๋ก ๊ธฐ์ค์ด์ง๋ง, ์์ ํ๋ฉด์๋ ๊ฐ์ด ๋ฃ์๋ค (๊ฐ์ ํญ ์์). ๋ฑ๋ก๋ง ์ํ๋ฉด ์๋ ค๋ฌ๋ผ.
๐ NOW (2026-08-25) โ ์์ฐจ์ผ ใ๋ฏธํ์ ใ ํ ๊ธ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] qa_helper(/field/modify/2134, input[name=shipping_date]) = ใ์์ฐจ์ผ ์ข์ธก์ ๋ฏธํ์ ํ ๊ธ๋ฒํผ์ ๋ง๋ค์ด์ค.
์์ฐจ์ผ ๋ฏธํ์ ์ ํ ๊ธ๋ฒํผ ํ์ฑํํ ๋ ์ง ๋ฏธ์ ํ์์๋ ํ์ฅ ๋ฑ๋ก, ์์ ์ด ๊ฐ๋ฅํ๊ฒ ํ๋ค. ๋ ์ง๋ฅผ ์
๋ ฅํ๋ฉด ๋ฏธํ์
๋ฒํผ์ ์๋ ๋นํ์ฑํ ์ํจ๋ค. ๋ฐ๋๋ก ๋ฏธํ์ ๋ฒํผ์ ํ์ฑํํ๋ฉด ์์ฐจ์ผ์ ๋น์ด๋ค. field/print/status ์์๋ ์์ฐจ์ผ
๋ฏธํ์ ์ธ ๊ฒฝ์ฐ ๋ ์ง ๋์ "๋ฏธํ์ "์ผ๋ก ํ๊ธฐ. ์ด์๋ฐฐํฌใ
- ์ค๊ณ = ์ปฌ๋ผ์ ์ ๋ง๋ ๋ค. ๋ฏธํ์ =
field.shipping_date IS NULLํ๋๋ฟ.char(8) NULLํ์ฉ ์ปฌ๋ผ์ด๋ผ DDL 0. ํ ๊ธ ๋ฒํผ์ ๊ทธ ๊ฐ์ ๊ฑฐ์ธ์ด๋ผ ใ๋ ์ง ์๋๋ฐ ๋ฏธํ์ ใ ๊ฐ์ ๋ชจ์ ์ํ๊ฐ ์์ ์๋ค. - ๊ณ ์น ๊ฒ = 7ํ์ผ / +54 โ13์ค.
โ
web/static/js/pfs-component.js๊ณต์ฉinitShippingTbd($input, $btn)21์ค โ ๋ฑ๋กยท์์ ๋ ํ๋ฉด์ด ๊ฐ์ด ์ด๋ค.btn-infoโbtn-outline-secondary๋ก ํ์ฑ ํ์, ๋ ์ง๊ฐ ๋ค์ด์ค๋ฉด(change) ์๋ ํด์ , ์ด๋ฏธ ๋ฏธํ์ ์ผ ๋ ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ฌ๋ ฅ์ ์ฐ๋ค. โกfield_modify.htmlยทfield_regist.html= ๋ฒํผ ๋งํฌ์ (input-group-prepend) + ํธ์ถ 1์ค์ฉ. โขfield_service.py= ์์ฐจ์ผ ํ์๊ฒ์ฆ ํด์ (๊ฐ์ด ์์ ๋๋ง date ํ์ ๊ฒ์ฌ) +None๋ฐฉ์ด. โฃfield_dao.py=insert_fieldยทupdate_fieldยทinsert_shipping_history์CONVERT_EMPTY_STRING_TO_NULL(%s)(๊ธฐ์กดsticker_dao์IS NULL์กฐ๊ฑด์ด ๊ทธ๋๋ก ๊ฑธ๋ฆฐ๋ค). โคproduction_status_dao.pyยทfield_status_print.html= ๋ฆฌํฌํธ ํฌํจ์กฐ๊ฑด + ใ๋ฏธํ์ ใ ํ๊ธฐยท์ ๋ ฌ. - ๐๊ทผ๋ณธ์์ธ 2๊ฑด โ ๋ ๋ค ์ ๊ณ ์ณค์ผ๋ฉด ๊ธฐ๋ฅ์ด ๊ฒ์ผ๋ก๋ง ๋๋ ์๋ฆฌ๋ค(์์ธ =
rules.md๐): โ ๋ฆฌํฌํธ SQLWHERE date_format(a.shipping_date,'%Y') >= ์ฌํด-1์ด NULL ์ ํต์งธ๋ก ๊ฑธ๋ฌ๋ด ๋ฏธํ์ ํ์ฅ์ด ํ์ ์์ ์ ๋์๋ค โ(a.shipping_date IS NULL OR โฆ). โกdaterangepicker ๋typeof null === 'object'๋ผstartDate: nullโmoment(null)=Invalid date โ ๋ฌ๋ ฅ์ด ์ ๊ทธ๋ ค์ ธ ๋ฏธํ์ ํ์ฅ์์ ๋ ์ง๋ฅผ ๋ค์ ๊ณ ๋ฅผ ์ ์์๋ค โresultData.shipping_date || moment().format('YYYY-MM-DD')๋ก ์ด๊ณ ์ ๋ ฅ์นธ๋ง ๋น์ด๋ค. - ์ ๋ ฌ = ๋ฏธํ์ ํ์ ๋งจ ๋ค(
byDate์์8e15). ํ๊ธฐ๋fmtDateํ ๊ณณ(์์ฐยทAS ํ ๋ ๋ค ์ฌ๊ธฐ๋ฅผ ํ๋ค). - ๊ฒ์ฆ = ์ ์ค
scripts/_ship_tbd_check.py([test|prod],scripts/_*๋ gitignore). ํ ์คํธ 27/27 ALL PASS = ์์ ํ์ฅ ์์ฑ(์์ฐจ์ผ ๋น ๊ฐ)โ์ ์ฅ๊ฐ NULL ํ์ธโ๋ฆฌํฌํธ API ํฌํจยทdate ์์โ๋ ์ง ์๋ณต (20260921โNULL, ํ์คํ ๋ฆฌ ๊ฒฝ๋ก ํฌํจ)โUI ํ ๊ธ 4ํญยท๋ฑ๋กํ๋ฉด 2ํญโfmtDate(null)=๋ฏธํ์ ยทํ ์ ์ค์ธกยท๋งจ ๋ค ์ ๋ ฌ โ์ํํธ์ญ์ ์ ๋ฆฌ. ์ด์ 17/17 ALL PASS(์ฝ๊ธฐ ์ ์ฉ โ ํ์ฅ ์์ฑ ์ ํจ, ์ ์ฅ ์ ๋๋ฆ). - ๋ฐฐํฌ = master
a6da396ยท86c168fโ deploy-live7b8d622(7ํ์ผ ์ ๋ณ ํฌ์๋,--detach์ํฌํธ๋ฆฌ). DDL 0 ยท DB ๋ณ๊ฒฝ 0. ์ฌ์ดํธ๋งต ์ฌ๋น๋ = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 54 ยท ๋ฏธ๋ฐ์ 0 ยท ๊ณต์ฉAPI 5.devplan/pfs.htmlDONEX๋ฑ์ฌ. - โ ๋ณ๊ฑด(์ด๋ฒ ๋ณ๊ฒฝ๊ณผ ๋ฌด๊ดยท๋ฏธ์์ ) =
/api/field/<no>/children์ ํ์ AS ๊ฐ 0๊ฑด์ด๋ฉด 500 ('tuple' object has no attribute 'sort'โfetchall์ด ๋น ๊ฒฐ๊ณผ์ tuple ์ ์ค๋ค). ๊ธฐ์กด ํ์ฅ 2134ยท2142 ๋ ๋์ผ. - โณํํ = ์ด์ ์ก์ 1ํ(ํ์ฅ > ์์ > ์์ฐจ์ผ ์ข์ธก ใ๋ฏธํ์ ใ ยท ํ์ฅ > ์์ฐํํฉ ์ถ๋ ฅ).
- โน๏ธ์ฐฉ์ ์ ์ฐจ = ๊ณํ 3๋จ๊ณ(Fable ๊ณํ โ ์ฝ๋ฑ์ค ์์ โ devplan ๊ณํํ์ด์ง)๋ฅผ ๊ฑด๋๋ฐ๊ณ ๋ฐ๋ก ์คํํ๋ค. ๋จ์ผ QA ์ฝ๋ฉํธ ยท ์ฌ์์ด ํ์ ๋ผ ์์ด ๊ธฐ๊ณ์ ์์ ์ผ๋ก ๋ดค๋ค. ๋ค๋ฅด๊ฒ ์ํ๋ฉด ์๋ ค๋ฌ๋ผ.
๐ NOW (2026-08-24 ยท 3์ฐจ) โ ์๋ง๊ฐ ๋ด๋น์ ์ง์ ยท ๊ฒฌ์ ์ ๋ด๋น์ ์์ธ ยท ์๋ง๊ฐ ๊ธ์ก ๊ฒฌ์ ์ ์ฐ๋ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] โ ์๋ง๊ฐ ๋ด๋น์๋ ์ ์ฒด ใ์ฐธ์กฐใ ์ฒดํฌ๋ ์ฌ๋์ด ๊ธฐ๋ณธ์ด๋ ๋ฅ์์ค=์ฅ๋์ฑ ์ฐจ์ฅ / ์๋ฅ์ค=๊ฐ๋์ ์ฐจ์ฅ / ๋ด์ =๊น์ํ ์ฐจ์ฅ / ์์ด๋น์ ผ๊ธ๋ก๋ฒ=์์งํธ ๋ํ๋ก ๊ณ ์ . ใํ๋์ฝ๋ฉ ์๋๋คใ โก๊ฒฌ์ ์ ์์ ๋ด๋น์๋ ์ฐธ์กฐ์ธ์ ์ฐ๊ณ์ธ๋ฐ ๋ฅ์์ค๋ง ํด๋น ํ์ฅ ๋ด๋น์ ์ด๋ฆ+์ง์ฑ ์์ธ โข์๋ง๊ฐ์ ๊ฒฌ์ ํญ๋ชฉ์ ๋ด์ ๋ค ๊ธ์ก์ด ๊ตณ์ด ๊ฒฌ์ ์์ ์ด ๋ฐ์ ์ ๋๋ค โ ์๋๋ฐ์. ์ด์๋ฐฐํฌ.
- ๊ทธ๋ฆด๋ง 3๋ฌธ ํ์ = ์กฐํํ ๋๋ง๋ค ์ฌ๊ณ์ฐ / ๊ณผ๊ฑฐ ๋ง๊ฐ์๋ ๊ฐ์ ๊ท์น /
company_member์ปฌ๋ผ ์ ์ค + ใ๊ฒฌ์ ์ฐธ์กฐใ ๋ค์ ์ปฌ๋ผ์ผ๋ก UI ์ฐ๋. ์ฐธ์กฐ ์ฒดํฌ 4๋ช ์ ๋ฆฌ๋ ํํ๊ฐ ์ง์ ํ๋ค(์ด์ ํ์ธ ์๋ฃ). - DDL(์ด์ยทํ
์คํธ ์ ํ) =
company_member.close_manager_ynยทcompany.estimate_manager_field_yn(๋ ๋ค CHAR(1) DEFAULT '0', ๊ธฐ์กด ๋์ ๋ถ๋ณ). ์คํฌ๋ฆฝํธ =scripts/op_close_manager_cols.py. - โ ๋ด๋น์ =
close_manager_yn์ฒดํฌ > ใ๊ฒฌ์ ์ฐธ์กฐใ ์ฒดํฌ > ๋น์นธ. ์ด๋ฆ+์ง์ฑ ์ผ๋ก ์กฐ๋ฆฝ. ๊ฑฐ๋์ฒ ๋ชฉ๋ก API ์ ๋ง๊ฐ ํค๋ ์์ชฝ์ ํด๋ฐฑ โ ์ ๋ง๊ฐยท๊ธฐ์กด ๋ง๊ฐ ๋ชจ๋ ์ฑ์์ง๋ค. ์ ์ฅ๊ฐ์ด ์์ผ๋ฉด ๊ทธ๊ฒ ์ฐ์ . UI = ์ ์ฒด > ๋ด๋น์ ํ๋ฉด ์ ๋ ฅํผยทํ์ ใ์๋ง๊ฐ๋ด๋นใ ์ฒดํฌ๋ฐ์ค(๊ฒฌ์ ์ฐธ์กฐ ๋ฐ๋ก ๋ค์). - โก๊ฒฌ์ ์ ๋ด๋น์ =
company.estimate_manager_field_yn์ผ๋ฉด ํ์ฅ๋ด๋น์, ๋๋ฉด ์ฐธ์กฐ์ธ๋ฌผ._compose_managerํ ๊ณณ๋ง ๋ณด๋ฏ๋ก ์์ ยทPDFยทHTML ์ด ๊ฐ์ด ๋ฐ๋ผ๊ฐ๋ค. UI = ์ ์ฒด > ์์ ใ๊ฒฌ์ ์ ๋ด๋น์ = ํ์ฅ ๋ด๋น์๋ก ํ๊ธฐใ. ๋ฅ์์ค๋ง ON(scripts/op_nexus_estimate_manager.py). - โข๊ธ์ก ์ฐ๋ = ๊ฒฌ์ ๋ฒํธ๊ฐ ๋ถ์ ํญ๋ชฉ์ ์กฐํํ ๋๋ง๋ค ๊ฒฌ์ ์์์ ์ฌ๊ณ์ฐ(
_relink_amounts). ๋ณธ๊ฑดยท์ถ๊ฐ๊ฑด ๊ฐ๊ฐ, ์๊ณต๋น ๋ถ๋ฆฌ ๊ฑฐ๋์ฒ๋ ๋ด๊ธฐ ๋ชจ๋ฌ๊ณผ ๊ฐ์_CONS_EXPR๋ก ๋ผ์ ๋ณธ๊ฑด ํ์ ๋์ . ๋ชฉ๋ก ํฉ๊ณ๋ ๊ฐ์ ๊ท์น(์์ธ๋ฅผ ์ด๊ธฐ ์ ์๋ ์ ์ด๊ธ๋๋ค). ๋์ฐ๊ธฐ ์์ โ ์กฐํ๊ฐ DB ๋ฅผ ์ ๊ฑด๋๋ฆฐ๋ค. ์์ ๋ ฅ ํ(๊ฒฌ์ ๋ฒํธ ์์)ยทํ์ ๊ธ์กยท์๋ฃ์ฒญ๊ตฌ์ผยท๋น๊ณ ๋ ๋ถ๋ณ. - ๐๊ทผ๋ณธ์์ธ 1๊ฑด = ๋ด๋น์ ํด๋ฐฑ์ด ใ์ผ๋ถ๋งใ ์ ๊ฑธ๋ฆฌ๋ ์ด์ =
SELECT h.*์ ๊ฐ์ ์ด๋ฆ ๋ณ์นญ์ ์น์ด DictCursor ๊ฐ ์๋ณธ(NULL)์ ๋จ๊ธฐ๊ณ ๊ณ์ฐ๊ฐ์ ๋ฒ๋ฆฐ ๊ฒ. ๋ณ์นญ์manager_name_default๋ก ๋ถ๋ฆฌ. rules.md ๋ฑ์ฌ. - ๊ฒ์ฆ = ์ ์ค
scripts/_mc_manager_amount_check.py [test|prod]ํ ์คํธยท์ด์ ๊ฐ ALL PASS (๊ฑฐ๋์ฒ 100๊ฐ ๋ด๋น์ ๊ธฐ๋ณธ๊ฐ ์ ์ ๋์กฐ ยท ์ค์์น ON/OFF ๊ฒฌ์ ๊ฐ 3๊ฑด ยท ๋ง๊ฐ ํค๋ ํด๋ฐฑ ยท ์ฐ๋ ํญ๋ชฉ ์ด์ 13ํยทํ ์คํธ 56ํ์ด ๊ฒฌ์ ์ด์ก๊ณผ ์ผ์น ยท ๋ชฉ๋กํฉ๊ณ=์์ธํฉ๊ณ). ๐์ฐ๋ ์ค์ฆ = ํ ์คํธ DB ์์ ๊ฒฌ์ ์ด์ก +1,000,000 โ ๋ง๊ฐ์ด ์ฆ์ 51,793,000 ์ผ๋ก ๋ฐ๋ผ ์์ง์ด๊ณ ์๋ณต๋ ๋ฐ์, DB ์ ์ฅ๊ฐ์ ์ ๊ฑด๋๋ฆผ ํ์ธ. ํ๊ท =_monthly_close_ui_check์ด์ยทํ ์คํธ 19/19(๊ณ ์ ๊ธฐ๋๊ฐ 252,970,000 ์ ์๊ธฐ์ ํฉ ๋์กฐ๋ก ๊ต์ฒด โ ๊ธ์ก์ด ๊ฒฌ์ ์ ๋ฐ๋ผ๊ฐ๋ ์ซ์๋ฅผ ๋ฐ์ผ๋ฉด ๊ฑฐ์ง FAIL) ยท_kst_timezone_checkยท_kf_softdelete_page_check์ด์ ALL PASS. - ๋ฐฐํฌ = master
f5aa495+ โ deploy-live6c7088f(12ํ์ผ ์ ๋ณ ํฌ์๋). ์ฌ์ดํธ๋งต ๊ทธ๋ฃน8ยทํ์ด์ง54ยท๋ฏธ๋ฐ์ 0. - ์ด์ ์คํจ = ๊ฒฌ์ ๊ณผ ์ด๊ธ๋ ์๋ 11ํ ํด์ ยท ๋ฅ์์ค ์๋ง๊ฐ=์ฅ๋์ฑ ์ฐจ์ฅ / ๊ฒฌ์ ์=ํ์ฅ๋ด๋น์(์กฐ์ธ์ ๋๋ฆฌ) ํ์ธ.
- โณํํ = ์ด์ ์ก์ 1ํ(์๋ง๊ฐ ์ ๊ฑฐ๋์ฒ ๋ด๊ธฐ ์ ๋ด๋น์ ์๋์ ๋ ฅ ยท ๋ฅ์์ค ๊ฒฌ์ ์ ์ถ๋ ฅ ๋ด๋น์์นธ).
๐ NOW (2026-08-24 ยท 2์ฐจ) โ ์๊ฐ๋ ์ ๋ฉด KST ์ ํ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] ใPFS ์์ฐํํฉ ๋ฉ๋ชจ์์ ์๋์ ๋ณด๋ ์๊ฐ๋๋ฅผ KST ๋ก ๊ณ์ฐ ์ ํ๊ณ ์๋ค. PFS ์ ์ ๊ฒ์ฌํด์ ์๊ฐ๋๋ ๋ชจ๋ KST ๊ธฐ์ค์ผ๋ก ์์ ํ๊ณ ์ด์๋ฐฐํฌํด.ใ + ใ์ฝ๋ ๊ธฐ๋ณธ ์ง์นจ๋ KST ๋ก ๋ณด๊ณ ยทํ๊ธฐํ๊ฒ ๊ณ ์ณ๋๋ผใ
- ๋ฟ๋ฆฌ = EC2 OS(
Etc/UTC) ์ RDS(time_zone=UTC) ๊ฐ ๋ ๋ค UTC.NOW()ยทCURDATE()ยทdatetime.now()์ ๋ถ 9์๊ฐ ๋ฐ๋ฆผ. - ์ ์ ๊ฒ์ฌ = Python naive now 15๊ณณ ยท SQL
NOW()155๊ณณ ยทCURDATE()9๊ณณ ยท ์๋ฒDATE_FORMAT(%H:%i)10์ฌ๊ณณ ยท DATETIME 79์ปฌ๋ผ(์ ๋ถ UTC ์ ์ฅ ํ์ธ) ยท TIMESTAMP 22 ยท DATE 78 ยท API 21๊ฐ๊ฐ GMT ๋ผ๋ฒจ datetime ์ก์ถ. ๐์ง๊ธ ใ๋ง๊ฒใ ๋ณด์ด๋ ํ๋ฉด 21๊ฐ๋ ์ฐ์ฐ์ด์๋ค โ Flask 1.0.2 ๊ฐ naive datetime ์GMT๋ฅผ ๋ถ์ด๊ณ ๋ธ๋ผ์ฐ์ ๊ฐ +9 ํด์ ๋ง์ ๊ฒ. - ๊ทธ๋ฆด๋ง 6๋ฌธ ํํ ํ์ = โ ์ ์ฅ๊น์ง ์ ๋ฉด KST โก๊ณผ๊ฑฐ ๋ฐ์ดํฐ ๋ฐฑํ โขRDS ํ๋ผ๋ฏธํฐ๊ทธ๋ฃน ๋ ๋ฒ โฃ์ฆ์ ์งํ(์ฑ ์ค์ง) โคํ ์คํธ๋ ๊ฐ์ด โฅEC2 ์๋ฒ ์ ์ฒด TZ.
- ์งํ(๋ค์ดํ์ 10:32~10:36 KST, 4๋ถ)
- RDS ํ๋ผ๋ฏธํฐ๊ทธ๋ฃน
pfs-custom-params-84time_zone=Asia/Seoul(dynamicยท๋ฌด์ฌ๋ถํ ) โ ์ฑ๋ฟ ์๋๋ผ ์ฌ๋ฌด์ค PC ๋ฌ๋ยท์ง์ ์กฐํ๊น์ง ํ ๋ฒ์ ์ ํฉ. - EC2
timedatectl set-timezone Asia/Seoul+ ํ ์คํธDB ๋ฐฑ์ ํฌ๋ก30 17โ30 2(02:30 KST ์ ์ง) + cron ์ฌ์์. - ํ
์คํธ ๋์ปค MySQL
SET PERSIST time_zone='+09:00'โ ์ฌ๊ธฐ๋ ์ค์ธก์ผ๋ก ์ปค๋งจ๋๋ผ์ธ--default-time-zone=+00:00์ ์ด๊ธฐ๋ ๊ฒ ํ์ธ(์ปจํ ์ด๋ ์ฌ์์ฑ ๋ถํ์). - ๋ฐฑํ
scripts/kst_backfill.py= DATETIME 78์ปฌ๋ผ/45ํ ์ด๋ธ +9h. ์ด์ 120,719ํ ยท ํ ์คํธ 15,968ํ. ์ ์ธ = TIMESTAMP 22(์ธ์ tz ์๋๋ณํยท๋ฐฑํํ๋ฉด ์ด์ค) ยท DATE 78(์์ฐจ์ผ ๋ฑ ์ฌ์ฉ์ ์ ๋ ฅ) ยทdoor_order_file.file_mtime(์ฌ๋ฌด์คPC ํ์ผ์๊ฐ = ์ด๋ฏธ KST). ํ ์ด๋ธ๋น ๋จ์ผ UPDATE(๋๋ ์๋ฉด ๊ฐ์ ํON UPDATE์ปฌ๋ผ์ด ํ์ฌ์๊ฐ์ผ๋ก ํ๋ค) + ์ปฌ๋ผ๋ง๋ค ์ ํ MAX ์ฐจ์ด ยฑ9h ๊ฒ์ฆ. - ์์ฐ ๋ฉ๋ชจ JSON(
web/static/uploads/memo/field_memo.json) ๋ +9(์ด์ยทํ ์คํธ). - ์ฝ๋(master
f318745โ deploy-livef69d3d8, 6ํ์ผ ์ ๋ณ ํฌ์๋) KstJSONEncoder(web/init.py) โ GMT ๋ผ๋ฒจ โ KST ํ๋ฌธ. ๊ฐ์ ๊ทธ๋๋ก ์ฐ๋ ํ๋ฉด(๊ฒฌ์ ยท์ฌ์ฉ์ยทํ์ฅ ๋ชฉ๋ก DataTables)๊ณผsticker.html์String(v).slice(5,16)(์๋YYYY-MM-DD HH:MM:SS์ ์ ์๋ ์ ๋ณต๋ฒ๊ทธ)๊น์ง ๊ฐ์ด ์ณ์์ก๋ค.pfsParseDateTime()์ ์ค(pfs-utils.js) โ ๊ณต๋ฐฑํ์์T๋ก ๋ฐ๊ฟ ES2015 ใ์คํ์ ์์ผ๋ฉด ๋ก์ปฌ์๊ฐใ ๊ท์ ์ผ๋ก ํ์ ํ์ฑ.convertDateYYYYMMDD*๋getUTC*๋ผ ๊ทธ๋๋ก ๋๋ฉด ํ๋ฃจ ๋ฐ๋ฆผ โ ๋ก์ปฌ ๊ฒํฐ๋ก.field_orderpaper5๊ณณยทfield_kakao_rooms1๊ณณ ๊ต์ฒด.orderpaper_dao์CONVERT_TZ('+00:00','+09:00')๋ณด์ ์ ๊ฑฐ(๋๋ฉด ์ด์ค์ด๋).- ๐ด์ฌ๊ณ 1๊ฑด(๋ณต๊ตฌ ์๋ฃยท์์ฌ 0) =
ssm_run.py๊ฐ ์๊ฒฉ์ ์ธ์๋ฅผ ์ ๋๊ฒจ--dry๊ฐ ๋ฌด์๋๊ณ ์ค์งํ(14ํ ์ด๋ธ +9). ์ฆ์ -9 ์๋ณต โ ๊ทธ ์ฌ์ด INSERT ๋audit_log4ํ(PK 109052~109055)์ PK ๋ก ํน์ ํด +9 ์ ์ (์๊ฐ ๊ตฌ๊ฐ์ผ๋ก ๊ณ ๋ฅด๋ฉด ์ ์ํ 126๊ฐ๊ฐ ์์ธ๋ค). ์ดํ ์ํ ์ค์์น๋ฅผ ํ์ผ ๋ด ์์EXECUTE=False๋ก ๊ต์ฒด. rules.md ๐ ๋ฑ์ฌ. - ๊ฒ์ฆ = RDS ์ค๋
์ท
pfs-pre-kst-20260824(01:22Z = ๋ฐฑํ ์ด์ ) ยท ์ ์คscripts/_kst_db_check.py(SSM) ์ด์ยทํ ์คํธ ALL PASS(NOW=UTC+9 ยท ์ ๊ท ์ ์ฅ๊ฐ์ด KST ยท ๋ฏธ๋์๊ฐ 0๊ฑด = ์ด์ค์ ์ฉ ์์ ยท ํฌ๋ก ๋ณด์ ) ยท ์ ์คscripts/_kst_timezone_check.py [test|prod]๊ฐ ALL PASS(GMT ๋ผ๋ฒจ 0๊ฑด ยท ํ๋ฌธ 2,160๊ฐ ยท ๋ธ๋ผ์ฐ์ ์คํ์ฑ 09:37 ยท ๋ ์ง ์ ๋ฐ๋ฆผ ยท ์ฝ์ 0) ยท ํ๊ท_kf_softdelete_page_check์ด์ยทํ ์คํธ ALL PASS ยท_field_status_print_date_check17ํญ ยท_field_status_print_ivision_checkALL PASS. ์ฌ์ดํธ๋งต ๊ทธ๋ฃน8 ยท ํ์ด์ง54 ยท ๋ฏธ๋ฐ์ 0. - ์ ์ญ ์ง์นจ๋ ๊ฐฑ์ (ํํ ์ง์ 2๋ฒ์งธ) =
C:\dev\CLAUDE.mdยง2-3 = ใ๋ ์ง26.7.27(ํ)ยท ์๊ฐ = KSTใ, ๋จ์ผ ์ถ์ฒ =rules/tooling.mdใ๋ ์งยท์๊ฐ ํ๊ธฐใ โ ๋ณด๊ณ ยทํ๊ธฐ๋ฌผ ์ ๋ถ KST, ์๋ฒ ๋ก๊ทธ ์ธ์ฉ์00:29 UTC = 09:29 KST๋ณ๊ธฐ. - โณํํ = ์ด์ ์ก์ 1ํ(๋ฉ๋ชจ ์ ์ฅ ์ ํ ๋ ๊ทธ๋จ ์๋ฆผ ์๊ฐ์ด ์ง๊ธ ์๊ฐ๊ณผ ๋ง๋์ง).
๐ NOW (2026-08-24) โ ์์ฐํํฉ ์ถ๋ ฅ ํ์ ์นด์ดํธ์์ ์ํํธ๋๋ฆฌํธ ํ์ ์ ์ธ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] qa_helper(/field/print/status, div.muted ใ(3/3)ใ) = ใํ์
์นด์ดํธ๋ฅผ ์ํํธ๋๋ฆฌํธํ ํญ๋ชฉ๊น์ง
๊ฐ์ด ๊ณ์ฐํ๊ณ ์๋ค. ํ์
์ด ์ํํธ๋๋ฆฌํธ(remove_yn) 1์ด ๋๋ฉด ์นด์ดํธ์์ ์ ์ธํด์ค. ์ด์๋ฐฐํฌใ
- ๊ณ ์น ๊ฒ =
api/pfs/field/dao/production_status_dao.py2์ค.select_production_status_print()(์์ฐํํฉ ์ถ๋ ฅ)์select_calendar_print()(์๊ฐ๊ณํํ)์LEFT JOIN field_type AS fON ์ ์AND f.remove_yn < 1. ๋์ด ๊ฐ์ KF CASE ์์ ๋ณต์ฌํด ์ฐ๊ณ ์์ด ํ์ชฝ๋ง ๊ณ ์น๋ฉด ํ๋ฉด๋ง๋ค ์ซ์๊ฐ ๋ ๊ฐ๋ฆฐ๋ค โ ๊ฐ์ด ๊ณ ์ณค๋ค. - ๐WHERE ๊ฐ ์๋๋ผ ON โ WHERE ๋ก ๋ฃ์ผ๋ฉด LEFT JOIN ์ด INNER ๊ฐ ๋ผ ํ์ 0๊ฐ ํ์ฅ์ด ํ์์ ์ฌ๋ผ์ง๋ค (๋ฆฌํฌํธ 9ํ ์ค 4ํ์ด ํ์ 0๊ฐ). rules.md ๐ ๋ฑ์ฌ.
- ์ ์ด๊ธ๋ ์์๋ = ํ์ฅ๋ชฉ๋ก(
field_dao)์ ์์ ๋ถํฐremove_yn < 1์๋ธ์ฟผ๋ฆฌ๋ก ์ผ๋ค. ๋ฆฌํฌํธ๋ง ์ ๊ฑธ๋ ๋ค. - ์ด์ ์ค๋ฐ์ดํฐ ์ํฅ 17๊ฐ ํ์ฅ โ ์ผ๋ ๋ธ ํํฌ์ฌ์ด๋
(3/3)โ(2/1)ยท GS ์ค์ฐ ์์ฐ(13/5)โ(10/3)ยท ์์ค ์ํ์ฅ(F:3)โ๊ณต๋ฐฑ๋ฑ. ์ค๋ ๋ฆฌํฌํธ์ ๋ฌ ์งํ์ค 9๊ฑด์ ์ญ์ ํ์ ์ด ์์ด ํ๋ฉด ์ซ์๋ ์ค๋ ๊ทธ๋๋ก๋ค. - ๊ฒ์ฆ 3๊ฒน
โ ์ด์ RDS ์์ DAO SQL ์๋ฌธ์ ๊ทธ๋๋ก ๋ A/B ๋์กฐ(
scripts/_kf_sql_ab_gen.pyโ_kf_sql_ab_check.py) โ ํ ์งํฉยทKF ์ธ ์ ์ปฌ๋ผ ๋์ผ, KF ๋ง ๊ธฐ๋๊ฐ๋๋ก. ALL PASS. ์บ๋ฆฐ๋๋ 319ํ ๋์ผยทKF 3๊ฑด๋ง ๋ณํ. โก ์ ์คscripts/_kf_softdelete_page_check.py [test|prod]= ์ฑ ์ ๊ต์ฐจ๋์กฐ(๋ฆฌํฌํธยท์บ๋ฆฐ๋ API ์ KF โ ํ์ฅ๋ชฉ๋ก API ์field_type_10/20/30). ๋ฐฐํฌ ์ ์ด์ FAIL(์์ค ์ํ์ฅ) โ ํ ์คํธ ALL PASS โ ๋ฐฐํฌ ํ ์ด์ ALL PASS(๋์กฐ ์ปค๋ฒ๋ฆฌ์ง 154/319ํ). โข ํ๊ท =_field_status_print_date_check.py17ํญ ยท_field_status_print_ivision_check.py์ด์ ALL PASS. - โ ํจ์ (rules.md ๐ ๋ฑ์ฌ) = ์บ๋ฆฐ๋ API ๋
field_no๋ฅผ ์ ๋ด๋ ค์ค ์กฐ์ธ ํค๊ฐ ์์ผ๋ฉด 0๊ฑด ๋์กฐ๋ก ์กฐ์ฉํ ALL PASS๊ฐ ๋๋ค. ์ปค๋ฒ๋ฆฌ์ง ์ฒดํฌ๋ฅผ ๋จผ์ ๋ฃ์ด์ผ ๊ฒ์ฆ์ด ๊ฒ์ฆ์ด ๋๋ค. - ๋ฐฐํฌ = master
f9eb62eโ deploy-livea3bc435(1ํ์ผ ์ ๋ณ ํฌ์๋,--detach์ํฌํธ๋ฆฌ). DDL 0 ยท DB ๋ณ๊ฒฝ 0 ยท ํ๋ก ํธ 0. ์ฌ์ดํธ๋งต ์ฌ๋น๋ = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 54 ยท ๋ฏธ๋ฐ์ 0.devplan/pfs.htmlDONE ์a3bc435๋ฑ์ฌ + ํ๋ธ ์ฌ๋น๋(pfs ์นด๋ 2026-08-24). - โณํํ = ์ด์ ์ก์ 1ํ(ํ์ฅ > ์์ฐํํฉ ์ถ๋ ฅ โ ์ญ์ ํ ํ์ ์ด ๊ฐ์์์ ๋น ์ก๋์ง).
๐ NOW (2026-08-21 ยท 2์ฐจ) โ ํ๋ ํธ์ฉ์ง ใํ์ฅ๋ช ใยทใ์์ธใ ๊ธ์ํฌ๊ธฐ ์นธ ์ ์ต๋์น ์๋์กฐ์ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] qa_helper(/production/sticker, div.ps-detail) = ใ์์ธ๋ด์ฉ ๋ฉ๋ชจ ๊ธ์ ํฌ๊ธฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ํ๋ ์
๊ตฌ์ญ ์์์ ์ต๋์น๋ก ์๋์กฐ์ ํด์ ๋ณด์ด๊ฒ ํด์ค. ์ค๋ฐ๊ฟ ์ํฉ๋ ๊ณ ๋ คํด์ ์กฐ์ . ์ด์๋ฐฐํฌใ
โ ์ด์ด์ ์ฑํ
= ใํ์ฅ๋ช
์ด๋ฆ๋ ๊ธ์ํฌ๊ธฐ ์ต๋ ์๋์กฐ์ ๋๊ฒ ํด์ค. ์ด๊ฒ๋ ์ด์๋ฐฐํฌ๊น์ง ์งํใ(ํ์ฅ๋ช
= ํ์ฅ๋ช
์
๋ ฅ๊ฐ).
- ๊ณ ์น ๊ฒ =
web/templates/default/sticker.htmlํ ํ์ผ(CSS 2์ค + JS 22์ค). ๋ผ์ด๋ธ๋ฌ๋ฆฌ 0. - ๊ณต์ฉ ์ด๋ถํ์
fitFont(el, fits)= 1~50mm 12ํ.fits()๊ฐ ์ฐธ์ธ ์ต๋ mm ๋ฅผ ์ธ๋ผ์ธfont-size๋ก ๋ฐ๋๋ค.fitSheetText()๊ฐ ์์ธยทํ์ฅ๋ช ๋์ ๊ฐ์ ํ์ ์์ผ๋ก ๋ถ๋ฅด๊ณ ,fitPallet()๋์์ ํธ์ถ๋๋ค โ ํ์ดํ๋ง๋ค(inputโrenderPallet) ์ค์๊ฐ + ํญ ์ ํยท์ฐฝ ๋ฆฌ์ฌ์ด์ฆ์๋ ์ฌ๊ณ์ฐ. - ์์ธ(
.ps-detail) =min-height:0; overflow:hidden์ถ๊ฐ. flex ์์์min-height:auto๋ฅผ ํ์ด์ผ ๊ธด ๊ธ์ด ์นธ์ ๋๋ฆฌ์ง ์๊ณ ๋์นจ์ด ์ธก์ ๋๋ค. ํ์ =scrollHeight<=clientHeight && scrollWidth<=clientWidth. - ํ์ฅ๋ช
(
.ps-site) =overflow:hidden+ ๊ฐ์<span>์ผ๋ก ๊ฐ์๋ค. ๊ฐ์ด๋ฐ ์ ๋ ฌ flex ๋ ์๋ก ๋์น ๋งํผ์ดscrollHeight์ ์ ์กํ ๋ชป ๋ฏฟ๋๋ค โ ์์ชฝ span ์offsetWidth/offsetHeight๋ฅผ ์นธ ์์ชฝ ์น์์ ์ง์ ๋๋ณธ๋ค. - ์ธ์์๋ ๊ทธ๋๋ก ๊ฐ๋ค โ
printPallet()์ด#stk-pallet-sheetHTML ์ ํต์งธ๋ก ๋ณต์ฌํ๋ ์ธ๋ผ์ธfont-size๊ฐ ๋ฐ๋ผ๊ฐ๊ณ , ์น 196mm(ํ ๋๋ฆฌ 0.5mmร2, border-box) = ์ธ์ 195mm(ํ ๋๋ฆฌ ์์) ๋ก ๋ด์ฉ ๋์ด๊ฐ ๊ฐ๋ค. - ๐ํจ์ (rules.md ๐ ๋ฑ์ฌ): ์ ๋์น๋ ๋ธ๋ก์
scrollHeight == clientHeight๋ผ ์์ ์ฌ์-4px๋ฅผ ๋นผ๋ฉด ์กฐ๊ฑด์ด ํญ์ ๊ฑฐ์ง โ 1์ฐจ ํ ์คํธ๋ฐฐํฌ์์ ๋ชจ๋ ๊ธธ์ด๊ฐ 1.0mm ๋ก ๋์๋ค. ๋ฑํธ ๋น๊ต๋ก ์์ . - ๊ฒ์ฆ =
scripts/_stk_pallet_fit_check.py(๊ธฐ์กด ๋ฐฐ์จ 11ํญ + ์์ธ 12~17 + ํ์ฅ๋ช 18~23,scripts/_*๋ gitignore). ํ ์คํธ ALL PASS ยท ์ด์ ALL PASS(๊ฐ 0 fail). ์์ธ = ์งง์๊ธ 35.9mm / 12์ค 3.5mm / 24์ค 1.8mm, ํ์ฅ๋ช = ์งง์ 50.0mm / ๋ณดํต 25.7mm / ์์ฃผ๊ธด(70์) 17.2mm. ์ธ ๊ฒฝ์ฐ ๋ชจ๋ ์ธ๋กยท๊ฐ๋ก ์ ๋์นจ + ์นธ ์น์(196mmยท62mm) ์ ์ง + ์ฝ์ ์๋ฌ 0. ์คํฌ๋ฆฐ์ท 4์ฅ ์ก์ ํ์ธ (%TEMP%\stk_pallet\detail_short|detail_huge|site_short|site_long.png). โ ๊ฒ์ฌ ์คํฌ๋ฆฝํธ๋ ํ์ด์ง JS ๊ฐ IIFE ๋ผSยทrenderPallet์ ๋ชป ๋ถ๋ฅธ๋ค โ ํ์ฅ๋ช ์ span ํ ์คํธ๋ฅผ ์ง์ ๋ฃ๊ณwindow.dispatchEvent(new Event('resize'))๋กfitPalletโfitSheetText๋ฅผ ๋ฐํ์์ผ ์ฐ๋ค. - ๋ฐฐํฌ = master
f63fc25ยท8f956daยทc8e0798ยท0c81e76โ deploy-livea5c7b20ยท9ad83ea(sticker.html 1ํ์ผ ์ ๋ณ ํฌ์๋,--detach์ํฌํธ๋ฆฌ). ๊ทธ ํ์ผ์ deploy-liveโmaster ์ฐจ์ด๊ฐ ์ด ๋ณ๊ฒฝ๋ฟ์์git diff --stat๋ก ๋จผ์ ํ์ธ(์ ์คํฐ์ปค ์ปค๋ฐ๋ค์ ์ด๋ฏธ cherry-pick ๋ฐ์๋ผ ์์๋ค). DDL 0 ยท DB ๋ณ๊ฒฝ 0. ์ฌ์ดํธ๋งต ์ฌ๋น๋ = ๊ทธ๋ฃน8 ยท ํ์ด์ง54 ยท ๋ฏธ๋ฐ์ 1โ0 ยท ๊ณต์ฉAPI 5.devplan/pfs.htmlDONE ์9ad83ea๋ฑ์ฌ.
๐ NOW (2026-08-21 ยท 1์ฐจ) โ ์์ฐํํฉ ์ถ๋ ฅ ํค๋ ๋ ์ง: ์๋์ ํ + ๊ธฐ๋ณธ ์๋ํ๊ธฐ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] qa_helper(/field/print/status, #rpt-date) = ใโ ๋ ์ง๋ฅผ ์๋์ผ๋ก ๋ฐ๊ฟ ์ ์๊ฒ. ๊ฐ๋ฅํ ์บ๋ฆฐ๋
ํ์์ผ๋ก ์ฌ์ฉ์๊ฐ ๋ ์ง์ ํ ๋๊ฒ ํ๋ค. โก๊ธฐ๋ณธ ์๋ํ๊ธฐ = ๋น์ผ 0~9์ ์ถ๋ ฅ์ด๋ฉด ๋น์ผ ๋ ์ง, ๋น์ผ 9์~24์๋ฉด
๋ด์ผ ๋ ์ง. ์ด์๋ฐฐํฌใ
- ๊ณ ์น ๊ฒ =
web/templates/basic/field/field_status_print.htmlํ ํ์ผ(26์ค ์ถ๊ฐยท5์ค ์ญ์ , JSยทCSSยทHTML๋ง). โ ๋ค์ดํฐ๋ธ<input type="date">๋ฅผ ์ฐ์๋จ ๋ ์ง ์์ ๋ถ์๋ค(.rpt-datewrapflex). ๋ผ์ด๋ธ๋ฌ๋ฆฌ 0.class="no-print"๋ผ ๊ธฐ์กด ์ธ์ CSS(.no-print{display:none!important})๊ฐ ์ถ๋ ฅ๋ฌผ์์ ์๋์ผ๋ก ์จ๊ธด๋ค โ ์ข ์ด์๋ ์ข ์ ๋๋ก8.21(๊ธ)ํ ์คํธ๋ง ๋๊ฐ๋ค. โกheaderDate()(๋ฌด์กฐ๊ฑด ์ค๋) โdefaultHeaderDate()=if (d.getHours() >= 9) d.setDate(d.getDate()+1).loadReport()์์pick.value = ymd(defaultHeaderDate())๋ก ์ฑ์ฐ๊ณchangeโapplyHeaderDate(). ์นธ์ ๋น์ฐ๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋๋์์จ๋ค(๋น ํค๋ ๋ฐฉ์ง). - โ ๋ ์ง๋ ํ์ ์ ์ฉ โ ๋ฐ์ดํฐ๋ ์ ๋ฐ๋๋ค.
/api/field/status/report๋ ๋ ์ง ํ๋ผ๋ฏธํฐ๊ฐ ์๊ณ ์งํ์ค ํ์ฅ์ ์ ๋ ๋ด๋ ค์ค๋ค. ์ฆ ๋ ์ง์นธ์ ๋ฐ๊ฟ๋ ํ ๋ด์ฉ์ ๊ทธ๋๋ก๋ค(ํํ ์ง์ ๋ฒ์ = ใ๋ ์ง ํ๊ธฐใ๋ฟ). ๋ ์ง๋ณ ํํฐ๊ฐ ํ์ํ๋ฉด API๋ถํฐ ์๋์ผ ํ๋ค โ ๋ณ๊ฑด. - ๊ฒ์ฆ = ์ ์ค
scripts/_field_status_print_date_check.py(Playwright, ์ฝ๊ธฐ ์ ์ฉ,scripts/_*๋ gitignore ๋ผ ๋ก์ปฌ ๋ณด๊ด). ํ์ด์ง ์์์window.Date๋ฅผ ์ ๊น ๊ต์ฒดํด ์๊ฐ๋ณ ๊ธฐ๋ณธ๊ฐ 7๊ฑด์ ์ค์ธก(00์ยท08:59=๋น์ผ / 09:00ยท23:59=์ต์ผ / ์๋ง 8.31 10์โ9.1 / ์ฐ๋ง 12.31 22์โ์ต๋ 1.1 / 12.31 03์=๋น์ผ) + UI 7๊ฑด (type=dateยท๊ธฐ๋ณธ๊ฐยทM.D(์์ผ)ํฌ๋งทยท์๋๋ณ๊ฒฝ 12.25(๊ธ)ยท์นธ๋น์ ๋ณต๊ทยท์ธ์ ์ ์บ๋ฆฐ๋ display:noneยทํ ์คํธ ์ ์ง) - ์ฝ์ 0. ํ
์คํธ 17/17 ALL PASS ยท ์ด์ 17/17 ALL PASS.
ํ๊ท =
_field_status_print_ivision_check.pyํ ์คํธ ALL PASS ยท ์ด์ ALL PASS. - ๋ฐฐํฌ = master
918b79bโ deploy-live1fca652(1ํ์ผ ์ ๋ณ ํฌ์๋,--detach์ํฌํธ๋ฆฌ). DDL 0 ยท DB ๋ณ๊ฒฝ 0 ยท ์๋ฒ์ฝ๋ 0. ์ฌ์ดํธ๋งต ์ฌ๋น๋ = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 54 ยท ๋ฏธ๋ฐ์ 0. - โณํํ = ์ด์ ์ก์ 1ํ(ํ์ฅ > ์์ฐํํฉ ์ถ๋ ฅ โ ์ฐ์๋จ ๋ ์ง ์ ์บ๋ฆฐ๋์นธ).
๐ NOW (2026-08-20 ยท 1์ฐจ) โ ์คํฐ์ปค ํ๋ ํธ์ฉ์ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์๋๋ฐฐ์จ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] qa_helper(/production/sticker) = ใA4์ฉ์ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํฌ๊ธฐ๊ฐ ๋๋ฌด ์๋ค. ๋จ๋ ํ๋ฉด์ ์ต๋ํ
์ฑ์์ ๋ณผ์ ์๊ฒ ์์ ํด์ค. ์ด์๋ฐฐํฌใ
- ๊ณ ์น ๊ฒ =
sticker.htmlํ ํ์ผ. ๊ณ ์ scale(0.4)(428px) โfitPallet()์ด ๋จ๋ ํญยท๋ทฐํฌํธ ๋์ด์์ ๋ฐฐ์จ์ ๊ณ์ฐํด--ps๋ก ๋ฐ๋๋ค(CSSmm= 96dpi ๊ณ ์ ์ด๋ผ 283mm=1069.6px ๋ก ๊ณ์ฐ์ด ๊ฒฐ์ ๋ก ์ ). ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ด =.stk-pallet-prevcol{flex:1 1 0;min-width:0}โ ๊ทธ ์ดclientWidth๊ฐ ๊ณง ๊ฐ์ฉํญ์ด๋ผ ์ํ์ฐธ์กฐ ์๋ค. ํธ์ถ 3๊ณณ =renderPallet()๋ ยท ํญ ์ ํ(์จ๊น ์ํ์์ ํญ 0 ์ด๋ผ ํ์ ํ ์ฌ๊ณ์ฐ) ยทwindow resize. ํํ 0.4 = ์์ ๋ณด๋ค ์์์ง์ง ์์. - ๊ฒ์ฆ =
scripts/_stk_pallet_fit_check.py(Playwright, 11ํญ) โ ํ ์คํธยท์ด์ ALL PASS. 1920ร1080 = 428 โ 1182px(๋ฐฐ์จ 1.105, 2.76๋ฐฐ) ยท 1366ร768 = 788px(0.737) ยท A4 ๋น์จ 1.444 ์ ์ง ยท ํ๋ฉด ๋ฐ ๋์นจ 0 ยท ์ฝ์ 0. - ๋ฐฐํฌ = master
2b732e8โ deploy-livef938944(1ํ์ผ ์ ๋ณ ํฌ์๋,--detach์ํฌํธ๋ฆฌ). DDL 0 ยท DB ๋ณ๊ฒฝ 0 ยท ์ธ์ CSS ๋ฌด๊ด. ์ฌ์ดํธ๋งต ์ฌ๋น๋ = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 54 ยท ๋ฏธ๋ฐ์ 0. - โณํํ = ์ด์ ์ก์ ํ์ธ.
๐ NOW (2026-08-19 ยท 8์ฐจ) โ AL QA 5๊ฑด: ์ค์ ์ธ๋ผ์ธ๊ฒ์ยท์๋์ ์ฅ ยท ํฐ์/์์์ ๊ฐญยท์ง ๋ฌถ๊ธฐ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] qa_helper 5๊ฑด(/field/al-profile 4 + /field/al-orderpaper 1, ใ์๋ ๋ชจ๋ ์์
์ฒ๋ฆฌ ํ ์ด์๋ฐฐํฌํ๋คใ):
โ ์
์ฒด ์ธ๋ผ์ธ ๊ฒ์ + ใ๊ณตํตใ์ฒ๋ผ ์๋์
๋ ฅ๋ ํ๊ฐ โก๊ฒ์์นธ์ ๋จ๋ null ์ ๋ณด์ด๊ฒ โข์์ ยท์ถ๊ฐ๋ ์๋์ ์ฅ
โฃ๊ทธ๋์ ์ ์ฅ ๋ฒํผ ์ญ์ โคใํฐ์ยท์์์ ๋์ด์ ๊ฐญ๋นผ๊ธฐ ์น์๋ ์ ์ฉ. ๋ชฉ๋ 0.5๋ ๋ฒ๋ฆผํด์ ์ ์. ์ง์ผ๋ก ๋์ค๋ฉด
๊ฐญ์ ๋บ ๋ค ์ค์ง์ ์ผ๋ก ๊ฐ์ ๋ชฉ๋ยท์ ๋ฆฌ๊ฐ ๋์์ผ ํ๋๋ฐ ๊ฐ ํ์ด ์ง์ธ์ง ๋ชจ๋ฅด๋ NO ์นผ๋ผ์ 2ํ ์ด์์ ์ฐ๊ฒฐํ๋
๊ธฐ๋ฅ์ ๋ฌ์๋ผใ + ๋ฐ์ฃผ์ ์์ฑ๋ฒ 5๋จ๊ณ(์์
์์ ((D-10-VLOOKUP(,6))/2)+VLOOKUP(,7)).
๋ฐฐํฌ = master 7758a18ยทe06d62aยท3b807a1 โ deploy-live 2bbc552(9ํ์ผ ์ ๋ณ ํฌ์๋, --detach ์ํฌํธ๋ฆฌ).
์ด์ DDL ์ ํ(SSM) = al_orderpaper_item.pair_link CHAR(1) NOT NULL DEFAULT '0' ์ถ๊ฐ๋ง, ๋ฐ์ดํฐ ๋ณ๊ฒฝ 0.
โณํํ = ์ด์ ์ก์ 1ํ(ํ์ฅ > AL๋ฐ์ฃผ์ NO์นธ ๐ ยท AL์ค์ ๊ด๋ฆฌ ์๋์ ์ฅ).
- ๐โค์ ํต์ฌ = ๋น ์ ธ ์๋ ํญ์ด
ํฐ์๋ง๊ฐ(์ค์ 7์ด) ํ๋์๋ค.W=(์ฅ์ธ๊ฒฝ-10-ํฐ์๊ฐญ)/2๋ง ์์๋ค โ+ํฐ์๋ง๊ฐ์ ๋ถ์ด์ ๊ฐ์ ์ฅ์ธ๊ฒฝ 800 ์์ ์์์ 383.5 / ํฐ์ 406.5 ๋ก ๊ฐ๋ฆฐ๋ค. ๋ชฉ๋ยท์ ๋ฆฌ๋ ์ ์ ๋ฒ๋ฆผ (370.5โ370 ยท 377.5โ377). ๋ฒ๋ฆผ ๋ฒ์๋ ํํ ํ ๋ ๊ทธ๋จ ํ์ (ASK-FA7446 = ใ๋๋ค ์ ์๋ฒ๋ฆผใ, ๊ท๊ฒฉWยทAL์น์๋ ์ ์ง). - ์ง ๋ฌถ๊ธฐ = NO์นธ ๐ ํ ๊ธ(
pair_link= ์ด ํ์ ์ํ๊ณผ ํ ์ง, 2ํ ์ด์ ์ฐ์ ๊ฐ๋ฅ). ๋ฌถ์ผ๋ฉด โ ์ฅ์ธ๊ฒฝ ๊ณต์ (ํ ์นธ์ ์น๋ฉด ๋ฌถ์ ์ ์ฒด๊ฐ ๋ฐ๋ผ๊ฐ๋ค) โก๋ชฉ๋ยท์ ๋ฆฌ๋ฅผ ์ฒซ ํ ๊ฐ์ผ๋ก ํต์ผ โข์๋ ๋ฌ๋๋ ํ์ NO์นธ ๋ ธ๋. ๊ฐ์ ๊ท์น์ด ์๋ฒal_calc.compute_rows()์๋ ์์ด ์์ ยท์ธ์๊น์ง ํ๋ฉด๊ณผ ๊ฐ์ ๊ฐ์ด ๋๊ฐ๋ค. โ ์กฐ์ฉํ ๋ฎ์ง ์๋ ๊ฒ ์ค๊ณ ์์ โ ์ ์ ์ง์ ์ค์ ์์๊ฐ ์ด๋ฏธ ๋ง์ถฐ์ ธ ์์ด(AA-303/304 ๋ชฉ๋๋บ 13/36, ์ฐจ์ด 23 = ํฐ์๋ง๊ฐ) ํต์ผ์ด no-op ์ด๊ณ , ๊ฐ์ด ๊ฐ๋ฆฌ๋ฉด ๊ทธ๊ฑด ์์ ๋ฏธ์ ๋ ฅ ์ ํธ๋ค(AA*494/495 = ๋ชฉ๋๋บ 0/0). - โขโฃ ์๋์ ์ฅ = ํ์ดํ ๋ฉ๊ณ 0.9์ด ๋ค 1์ฝ. ๐์ ์ฅ ํ
load()๋ก ๋ค์ ๊ทธ๋ฆฌ์ง ์๋๋ค(์ปค์ยท์คํฌ๋กค ์์ค) โ ์๋ต์ ์ ๊ทํ ๋ฒํธnos๋ฅผ ์ค์ด ํ๋ฉด ํ์ ๋ฌผ๋ฆฐ๋ค. ์ ๋ฌผ๋ฆฌ๋ฉด ๋ค์ ์ ์ฅ์ด ๊ฐ์ ํ์ ๋ INSERT ํ๋ค. ์์ ์ฅ์น = ํ๋ช 0ํ์ด๋ฉด ์ ์ฅ ์คํต(ํ ์ ๋ฉธ ๋ฐฉ์ง) ยท ์ซ์ ์๋ ๊ฐ์ด๋ฉด ๋ณด๋ฅ ยท ์ ์ฅ๋ ํ ร ๋ 1ํ ํ์ธ. - โ ์ธ๋ผ์ธ ๋๋กญ๋ฆฌ์คํธ๋ฅผ
web/static/js/al_combo.js๊ณต์ฉ ๋ชจ๋๋ก ๋ถ๋ฆฌ(CSS ์์ฒด ์ฃผ์ ) โ ๋ฐ์ฃผ์ยท์ค์ ๋ ํ๋ฉด์ด ๊ฐ์ ๋์. ํ๋ณด = ์ค์ ํ์ ์ด๋ฏธ ์ฐ์ธ ์ ์ฒด + PFS ๊ฑฐ๋์ฒ, ๋ชฉ๋ก์ ์๋ ๊ฐ๋ ๊ทธ๋ฅ ํ์ดํ(=ใ๊ณตํตใ). - โ โก๋ ์ฌํ ์คํจ โ ์ด์ยทํ
์คํธ ์ค์ธก
#apSearchplaceholder ๋ ๋ ๋ค์ ์ฒดยทํ๋ช ๊ฒ์์ด๊ณ ์์คยทgit ์ด๋ ฅ์null์ด ์๋ค(el.placeholder = null์ ๋ฃ๋ ์ฝ๋๋ ์๋ค). ์ฝ๋์์ ๊ฐ์ ํ ๋ฒ ๋ ๋ชป๋ฐ์ ๋์๋ค. ๋ ๋จ๋ฉด ์บก์ฒ + ๋ธ๋ผ์ฐ์ /ํ์ฅ ์ ๋ณด ํ์. - ๊ฒ์ฆ = ์ ์ค
scripts/_al_qa5_check.py(์ค์ ํ๋ ์์ํ 1๊ฐ ์ถ๊ฐโ์ญ์ ํ ์ /ํ ์ค๋ ์ท ๋์กฐ, ๋ฐ์ฃผ์๋ ์ด์์์ ์ ์ฅ ์ ํจ). ํ ์คํธ 37 ALL PASS ยท ์ด์ 33 ALL PASS(B19~22 = ์ ์ฅ ์์ยท์์ ์ ํ ์คํธ ์ ์ฉ). ํ๊ท =_al_orderpaper_e2e_test.py20 PASS ยท_al_recv_check.pyALL PASS ยท_al_combo_check.pyALL PASS ยทal_calc.py์์ฒด๊ฒ์ฌ(์ง ๊ณต์ ยทํต์ผยท๋ฒ๋ฆผ) PASS. ์ฌ์ดํธ๋งต = ๊ทธ๋ฃน8ยทํ์ด์ง54ยท๋ฏธ๋ฐ์ 0. - ํ์ผ =
api/pfs/al_orderpaper/{al_calc,service/al_orderpaper_service,dao/al_orderpaper_dao,dao/al_profile_dao}.pyยทweb/static/js/{al_combo(์ ๊ท),al_orderpaper,al_profile}.jsยทweb/templates/basic/field/field_al_{profile,orderpaper}.html. โprojects/pfs/rules.md๐
๐ NOW (2026-08-19 ยท 7์ฐจ) โ AL๋ฐ์ฃผ์ QA 3๊ฑด: ์ ๋ฆฌ ์ ๊ณ ์ฒ ยท ์ ํ๋ฉด ๊ฐ๋กํญ ยท ๊ฑฐ๋์ฒ ๋ด๋น์ ์ค์๊ฐ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] QA 3๊ฑด(/field/al-orderpaper, ๊ฐ์ ์ธ์
์ฐ์ ์ง์ ยท ์
๋ค "์ด์ ๋ฐฐํฌ"):
โ ใ์ ๋ฆฌ๋ AL์
์ฒด์ ๋ฃ์ด์ค์ผ ํ๋ ์
๊ณ ์ฒ ์ปฌ๋ผ์ด ํ์. ๋ง์ง๋ง์ ์์ฑ, ๊ธฐ๋ณธ์ ๋ฐ์ฃผ์์ ์ฐ๊ฒฐ๋ ์
์ฒด,
์ธ๋ผ์ธ ๊ฒ์ยทEnter ์๋์
๋ ฅ, ์ง์ ์
์ฒด๋ ๊ฑฐ๋์ฒ ์ฃผ์๊น์ง ์ฐธ๊ณ ํด ์์
์
๊ณ ์ฒ ์
์ฒด๋ช
ยท์ฃผ์์นธ์ ๋ฃ๋๋ค.
ํ ์ ๋ฆฌ์
์ฒด์ ์
๊ณ ์ฒ 2๊ณณ ์ด์์ด๋ฉด ์
๊ณ ์ฒ๋ณ๋ก ํ์ ๊ทธ๋ฃนํํ๊ณ ์
๊ณ ์ฒ ํ์ ๊ทธ ๊ทธ๋ฃน ๋ฐ๋ก ์๋.
ํ์ ์ถ๊ฐํ์ง ๋ง๊ณ ๊ธฐ์กด ๋ธ๋กํ ๊ฐ์ ์์์ ๊ต์ฒดใ โกใ๊ธฐ๋ณธ์ ๋ณดยท๋ฐ์ดํฐ์
๋ ฅ ํ๋ ์ ๊ฐ๋กํญ ๋ถ์กฑ โ
์ฌ์ด๋๋ฉ๋ด ๋บ ์ ํ๋ฉด ํญ + ์ปฌ๋ผํญ ์ ์ฝใ โขใ๋์ง์ํธ์์ด์ด ๋ด๋น์๋ฅผ ๋ฐ๊ฟจ๋๋ฐ ๊ฐฑ์ ์ด ์ ๋ค์ด์จ๋คใ
๋ฐฐํฌ = master fffd408ยทb98e683ยทb23cf72 โ deploy-live 9963dd5ยท75172d2(ํ์ผ 5๊ฐ ์ ๋ณ ํฌ์๋,
--detach ์ํฌํธ๋ฆฌ). ์ด์ DDL ์ ํ ์ ์ฉ(SSM) = al_orderpaper_item.receive_place VARCHAR(100) ์ปฌ๋ผ ์ถ๊ฐ๋ง,
๋ฐ์ดํฐ ๋ณ๊ฒฝ 0. โณํํ = ์ด์ ์ก์ 1ํ(ํ์ฅ > AL๋ฐ์ฃผ์ โ ์ ๋ฐ์ฃผ์ โ ํ ๋งจ ์ค๋ฅธ์ชฝ ์
๊ณ ์ฒ).
- ๐โข์ ๊ทผ๋ณธ์์ธ = ์
์ฒด ์๋์์ฑ์ด DB ๊ฐ ์๋๋ผ ๋ฒ๋ค JSON ์ค๋
์ท์ด์๋ค(
assets/vendors.json= ์๋ถ์์ฌ๋ฐ์ฃผ์.xlsx ์ ์ฒดํญ, 381ํ + ํ๋ก์ธ์ค ์บ์). ๊ฑฐ๋์ฒ๋ฅผ ๊ณ ์ณ๋ ๋ฐ์ฃผ์์ ๊ตฌ์กฐ์ ์ผ๋ก ๋ชป ๋ค์ด์จ๋ค. ์ด์ ์ค์ธก =company_member๋์ง์ํธ์์ด์ด(136) ๋ ์ ๋ํ์ฐจ์ฅ ์ญ์ (remove_yn=1) ยท ๊น์ ํ๋๋ฆฌ ํ์ฑ (modify_date 2026-08-19)์ธ๋ฐ ํ๋ฉด์ ์ ๋ํ์ฐจ์ฅ. โcompany+company_member์ค์๊ฐ ์กฐํ๋ก ๊ต์ฒด, ๊ฑฐ๋์ฒ์ ์๋ ์ด๋ฆ๋ง ์ค๋ ์ท ๋ณด์ถฉ, ์บ์ ์ ๊ฑฐ. ์ด์ 407โ414ํ(์ค๋ ์ท ์ ์ฉ 1๊ฑด = ๊ฑฐ๋์ฒ์ ์๋ ์ ์ฒด). โ ์ด๋ฏธ ์ ์ฅ๋ ๋ฐ์ฃผ์์ ํค๋ ๋ด๋น์์นธ์ ๊ทธ๋๋ก ๋๋ค โ ๊ทธ๋ ํฉ์ค ๋ฐ์ ์ฌ๋ ๊ธฐ๋ก์ด๋ค. ์ ์ฒด๋ช ์ ๋๋กญ๋ฆฌ์คํธ์์ ๋ค์ ๊ณ ๋ฅด๋ฉด ์ ๋ด๋น์๋ก ๊ฐฑ์ ๋๋ค(pickCombo๊ฐ ๊ฐ์ด ๊ฐ์๋ change ๋ฅผ ์๋ค). - โ ์ ์์ ๋ธ๋ก ๊ตฌ์กฐ๋ฅผ ๊ทธ๋๋ก ์ด ๊ฒ ํต์ฌ โ ์ ๋ฆฌ์ํธ ๋ธ๋ก(29ํ)๋ง๋ค ์
๊ณ ์ฒ ํ์ด ์ด๋ฏธ ์๋ค(C ์
์ฒด๋ช
ยท
D
์ฃผ์/๋ด๋น์, ์๋ณธ์ ์ ์ฒด์ํธ ์ฐธ์กฐ ์์). ๊ทธ๋์ ํ ์ฝ์ ์์ด ์ ๋ฆฌ ๊ทธ๋ฃน ํค๋ฅผ ใ์ ์ฒดใโใ์ ์ฒด+์ ๊ณ ์ฒใ๋ก ๋ฐ๊พธ๋ ๊ฒ๋ง์ผ๋ก ์ง์(๊ทธ๋ฃนํยท๋ฐ๋ก ์๋ยทํ ๊ต์ฒด)๊ฐ ์ ๋ถ ์ถฉ์กฑ๋๋ค. ํ๋ฉด ๊ธฐ๋ณธ๊ฐ์_recvAutoํ๋๊ทธ๋ก ใ์ฌ๋์ด ์๋ ํ์ ์ ๋ฎ๋๋คใ(ํค๋ ์ ์ฒด๋ช ์ ํ ๊ธ์ ์น ๋๋ง๋ค ๋ฎ์ด๋ฉด ์ ๋๋ค). ๋ฏธ๋ฆฌ๋ณด๊ธฐยท์ธ์ ๋ฏธ๋ฌ๋ ๊ฐ์ ๊ทธ๋ฃนยท์ ๊ณ ์ฒ ํ์ ๊ทธ๋ ค ํฉ์ค๋ก ๋๊ฐ๋ ์ข ์ด์ ์์ ์ด ์ด๊ธ๋์ง ์๋๋ค. - ๐ด์ค๊ฐ์ ์ก์ ๊ธฐ์กด ๋ฒ๊ทธ(๊ฐ์ ๋ธ๋ก ๋ก์ง) = ์ ๋ฆฌ ํญ๋ชฉ 17๊ฐ ์ด์์ด๋ฉด ์์
๋ค์ด๋ก๋๊ฐ 500์ด์๋ค.
์์ 24ํ์ด ์บก๋
ธํธ(
C24:H24๋ณํฉ)์ธ๋ฐ ํญ๋ชฉํ ํ๋ณ์ด ๋ณํฉ ์์์ด์ B ๋ง ๋ด์(AL ์บก๋ ธํธ๋B16:N16) ํญ๋ชฉํ์ผ๋ก ์ ๊ณ , ๊ทธ ํ D ์ ์ MergedCell ์ด๋ผ ๊ธฐ์ ์๊ฐread-only์์ธ. ํ๋ณ์ BยทC ๋ก, ์ ๋ฆฌipb18โ17. - ๊ฒ์ฆ = ์ ์ค
scripts/_al_recv_check.py(์ฝ๊ธฐ์ ์ฉ + ํ ์คํธ๋ง ์ ์ฅยท์ญ์ ). ๋ฐฐํฌ์ ํ ์คํธ 9 FAIL โ ํ ์คํธ 24 ALL PASS โ ์ด์ 18 ALL PASS. ํ๊ท =_al_combo_check.py19 ALL PASS ยท_al_orderpaper_e2e_test.py20 PASS/0 FAIL ยท ์์ ๋ชจ๋ ์์ฒด๊ฒ์ฌ(์ ๊ณ ์ฒ ๋ถ๋ฆฌยท17/18 ๊ฒฝ๊ณยท์ฃผ์์๋ ์ ๊ณ ์ฒ). ์ด์ ๊ฒ์ฆ์ ๊ธฐ์กด ๋ฐ์ฃผ์ 1(๊ธ๊ฐ ๋ถ์ฐ์์ฝ ยท AL ๋์ง์ํธ์์ด์ด ยท ์ ๋ฆฌ ์ง์คํฐ)์ ์์ ์ GET ๋ง ํด์ ์ ๊ณ ์ฒ = ๋์ง์ํธ์์ด์ด + ๊ฑฐ๋์ฒ ํ์ฌ ๋ด๋น์๋ก ๋์ค๋์ง ๋์กฐ. ์ฌ์ดํธ๋งต = ๊ทธ๋ฃน8ยทํ์ด์ง54ยท๋ฏธ๋ฐ์ 2 (๋ฏธ๋ฐ์ 2๊ฑด์ ๋ด ์์ ์๋ = ๊ฒฌ์ ์ ๋ฑ๋กยท์์ v2, master ์ ์ฉ). - โ ๊ฒ์ฆ์ด ๋ ๋ฒ ์ก์๋ธ ๊ฒ(๋ ๋ค ๋ฐฐํฌ ํ ์ฆ์ ์์ ) = โ ์
๊ณ ์ฒ์ ๊ฑฐ๋์ฒ ์ฃผ์๊ฐ ์์ผ๋ฉด ์ฃผ์์นธ์ด ํฌ์ธ ์ฃผ์๋ก
ํด๋ฐฑํด ใ์
์ฒด๋ช
์ ๋จ์ ๊ฒ, ์ฃผ์๋ ํฌ์ธใ์ด ๋๊ฐ๋ค(
orํด๋ฐฑ์ recv ์ ๋ฌด ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌ) โก์ ๊ณ ์ฒ ์ฃผ์์นธ์ด ๋ฐ์ฃผ์์ ์ ์ฅ๋ ์ ๋ด๋น์๋ก ๋๊ฐ๋ค โ ๊ฑฐ๋์ฒ ๋ง์คํฐ๋ฅผ 1์์๋ก ๋ค์ง์๋ค(ํํ ์ง์ "๊ฑฐ๋์ฒ ์ฃผ์๊น์ง ์ฐธ๊ณ "). - ํ์ผ =
api/pfs/al_orderpaper/{al_orderpaper_excel,dao/al_orderpaper_dao,service/al_orderpaper_service}.pyยทweb/static/js/al_orderpaper.jsยทweb/templates/basic/field/field_al_orderpaper.html. โprojects/pfs/rules.md๐
๐ถ ๋ฃจํธ NOW ์ด๊ด โ ์งํยท๋ฏธ๊ฒฐ (2026-08-19 ๋์ฒญ์, ํํ ์ง์)
๋ฃจํธ
HANDOFF.md๋ฅผ pncad ๋ง ๋จ๊ธฐ๊ณ ๋น์ ๋ค. ์๋๋ ๊ทธ๋ ์ฎ๊ฒจ์จ ์๋ฌธ(๋ฌธ๊ตฌ ๋ฌด๋ณ๊ฒฝ).
- ๐intake-check ์์ฌ ์
๊ณ ์ฒดํฌ [์ฝ๋] 26.8.10 ๊ฐ๋ ์ค โ ์นดํก ใํฌ์ธ01ใ ๋ช
์ธ์ ์ฌ์ง โ ํ๋
โ ์ด์ pfs
orderpaper1:1 ๋งค์นญ๋ถ๋ง์๋ฃ+์ ๊ณ ์ผ. ๋งค์ผ 16:30 ์์ฝ์์IntakeCheck-1630. ์ด์ ๋ฐ์ 7๊ฑด ์๋ฃ, ์ ํ๋ = ์ ๋ฐ๋ 100%(7/7, ์คํ 0) ยท ์ฌํ์จ 46.7%(๋๋ฝ 8 = ํคํ ๋ ๊ฒฝ์ฒฉ ๋ณ์นญ ๋ฏธ๋ณด์ ). ์นดํก ๋ณด๊ณ = ์ ๋์น(์ ํ๋ ํฌํจ) + ํฌ์ธ ์ ๋ํ ๋๋ฆฌ(์์ฌ๋ง). โ ๋งํ ์๋ ์ ๋ํ ๋ฐ์ก ํด์ โ ๋ฐฉ ์ด๋ฆ์ด ๊ณ์ ๋ง๋ค ๋ฌ๋๋ค(PC์ ๋ํโ ํฐํฌ์ธ ์ ๋ํ ๋๋ฆฌ) โ ํ ์คํธ ๋ฐ์ก 11:15 ์์ ํ์ธ. โ ๋ฐ์ก ๋์์ ์ด์ devplan ์นดํก๊ด๋ฆฌ(kakao-ops)์ ใ์์ฌ์ ๊ณ ๋ฐ์กใ ์ฒดํฌ๊ฐ ๋จ์ผ ์ถ์ฒ(fail-closedยท๋ง์ง๋ง ๋ฐ์ก์๊ฐ ํ์) + ๋ฐฉ ๋ชฉ๋ก ์๋ ๋ฑ๋ก(16:30 ์์ฝ์์ ์ดrooms.py list์ ํ โ ์ ๋ํ ๋ฐฉ์ด ์ ๋ฌ ์์ธ์ 8/5 ์ค๋ ์ท ๊ณ ์ฐฉ). โ ๋ฒํธโ์นดํก์ด๋ฆ ๋งคํpoin-agent/people_map.py(find๋ก ๋ฐ์ก ์ด๋ฆ ์กฐํ). โณ๋จ์ ๊ฒ = โ ์ค๋ 16:30 ์ฒซ ์ ๊ท ์คํ ๊ฒ์ฆ(์ฌ์ง ์๋ณธ ๋์กฐ โruns/*.verdict.jsonโ--accuracy) โก์ ์ฒด์ฝ๋โpfs ํ๋ช ๋ณ์นญ ์ฌ์ ์ผ๋ก ์ฌํ์จ ์ฌ๋ฆฌ๊ธฐ โขํ์ธ์์ฒญ 2๊ฑด(์์๋ณด๋LPM4.5 HS2329/ ํ๋ฆฐํ ํฌPTA261) โฃrules/tooling.md์ ์ญํจ์ 2๊ฑด(schtasks/trraw string ยท ํด๋๋ช ๋ ์ ). โ.claude/skills/intake-check/SKILL.mdยทprojects/{pfs,talklog}/rules.md
๐ NOW (2026-08-20 ยท 2์ฐจ) โ ๊ฒฌ์ ๋ชฉ๋ก ์ถ๊ฐ๊ฑด ํด๋ฉ ๋ฐ๊ฒฌ์ฑ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] ใestimate/list-v2 ์์๋ ์ถ๊ฐ๊ฑด๋ค ํด๋ฉ์ผ๋ก ๋ณผ์ ์๊ฒ ํด์ค. ๊ทธ๋์ผ ์ ๊ธ์ฌ๋ถ ์ค์ ์ ๋ด๊ฐ ํ ์ ์๋คใ + ใ์ด์๋ฐฐํฌใ
๐๊ธฐ๋ฅ์ ์ด๋ฏธ 1์ฐจ์ ๋ค์ด๊ฐ ์์๋ค โ ํ๋ฉด์์ ์ฐพ์ ์๊ฐ ์์์ ๋ฟ์ด๋ค. ์ค์ธก = ๊ธฐ๋ณธ ๋ชฉ๋ก 36ํยทํ์ด์ง๋น 10ํ์ธ๋ฐ
์ถ๊ฐ๊ฑด ๋ณด์ ๋ณธ๊ฑด 5๊ฑด์ด ์ ๋ถ 6~7์ ๊ฑด์ด๋ผ ์ต์ ์ 1ํ์ด์ง์ โถ ๊ฐ 0๊ฐ(visibleFold=0). 1์ฐจ E2E ๊ฐ ์ด๊ฑธ ๋ชป ์ก์
์ด์ = ๊ฒ์ฆ์ด datatable.page.len(-1) ๋ก ์ ํ์ด์ง๋ฅผ ํผ์ณ๋๊ณ ์
๋ค.
- ใ์ถ๊ฐ๊ฑด ์๋ ๊ฑด๋งใ ์ฒดํฌ๋ฐ์ค ์ ์ค(๊ฒ์ ํํฐ, ใ๋ณด๊ด ํฌํจใ ์). ์ด๋ฏธ ๋ฐ์ ๊ฒฐ๊ณผ์์๋ง ๊ฑฐ๋ฅธ๋ค
(
$.fn.dataTable.ext.search, ์๋ฒ ์๋ณตยท์ ๊ท API 0). ์ด์ ์ค์ธก 10ํ โ 5ํ ยท โถ 0๊ฐ โ 5๊ฐ. - โถ ๋ผ๋ฒจ์ ๊ฑด์ โ
โถ ์ถ๊ฐ 3+btn-info. ์ ์๋ค ํด๋ ๊ฑด์๋ ๋จ๋๋ค. - ์ถ๊ฐ๊ฑด ์
๊ธ์ฌ๋ถ ํ ๊ธ์ ์๋๋ถํฐ ์ ์์ด์๋ค โ ํ์ํ ๋ฐฐ์ง ํด๋ฆญ โ
PUT /api/estimate/<no>/depositโ DB ๋ฐ์ยท3ํ ์ํ ์์๋ณต๊ท๊น์ง ์ค์ธก ํ์ธ(ํ ์คํธ). ํํ๊ฐ ๋ชป ๋ง์ก๋ ๊ฑด ์์ ํ ํด๋ฉ์ ๋ชป ์ฐพ์์๋ค.
๊ฒ์ฆ = _mc_pick_check.py ์ ๋ฐ๊ฒฌ์ฑยทํ์ํ ํ ๊ธ 8ํญ๋ชฉ ์ถ๊ฐ โ ํ
์คํธ 59/59 ยท ์ด์ 53/53
(์ด์์ ์ฐ๊ธฐ ํญ๋ชฉ skip). ํ๊ท = _deposit_mark_check ์ด์ 12/12. ์ฌ์ดํธ๋งต ๊ทธ๋ฃน8ยทํ์ด์ง54ยท๋ฏธ๋ฐ์ 0.
์ปค๋ฐ = master 1f3954a โ deploy-live efeab22(1ํ์ผ ์ ๋ณ ํฌ์๋).
โณํํ = ์ด์ ์ก์ 1ํ โ ๊ฒฌ์ ์ ๊ด๋ฆฌ โ ๊ฒ์ํํฐ ใ์ถ๊ฐ๊ฑด ์๋ ๊ฑด๋งใ ์ฒดํฌ โ โถ ์ถ๊ฐ N ํด๋ฆญ โ ํ์ํ ์
๊ธ์ฌ๋ถ ๋ฒํผ ํด๋ฆญ.
๐ NOW (2026-08-20) โ ์๋ง๊ฐ ๊ฒฌ์ ๋ด๊ธฐ(์ถ๊ฐ๊ฑด ๋งคํ) + ๊ฒฌ์ ๋ชฉ๋ก ์ถ๊ฐ๊ฑด ํด๋ฉ + ์๋์์ง=๋ฏธ์ ๊ธ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] ใ์๋ง๊ฐ ๋งคํ ๊ธฐ๋ฅ์ด ํ์ํ๋ค. ํญ๋ชฉ์ถ๊ฐ์ ๊ฒฌ์ ์ ๋ชฉ๋ก ๊ธฐ์ค ํ์ฅ๋ช ๊ฒ์ ๋ฐ ์ ํ. ์ด๋ ์ถ๊ฐ๊ฑด๋ ์ง์ ์ ํ์ด ๋์ด์ผ ํ๊ณ ๊ฐ์ ๋ณธ๊ฑด ํ์ฅ ๊ธฐ์ค์ผ๋ก ํ ํ์ผ๋ก ๋ฌถ๋๋ค. ์ถ๊ฐ๊ฑด์ ์ถ๊ฐ1,2๋ฒํธ์ ์๊ด์์ด ์ ํ๋ ํญ๋ชฉ์ ๋ณธ๊ฑด์ปฌ๋ผ ๋ฐ์ด๋๊ณ ์ถ๊ฐ๊ฑด ์ฒซ๋ฒ์งธ๋ถํฐ ์์๋๋ก ๋ค์ด๊ฐ๊ฒ. ํ์์ฌํญ ๊ทธ๋ฆด๋ง. ์ด์ ๋ฐฐํฌใ
๊ทธ๋ฆด๋ง 6๋ฐฐ์น ยท ํํ ํ์ 13๊ฑด = ๊ฒ์๋ฒ์ = ๊ฑฐ๋์ฒ ํ์ + ใ์ ์ฒดใ ํด์ / ๊ธฐ๊ฐ ์์ ์ต์ 50 / ๋ชจ๋ฌ ํ + ์ถ๊ฐ๊ฑด
ํ์ํ / ๋ฌถ์ํค = ๋ณธ๊ฒฌ์ estimate_no / ์ค๋ณต์ ๊ธฐ์กด ํ์ ๋ณํฉ / ์ถ๊ฐ์นธ ์์ = ๊ฒฌ์ ๋ฒํธ ์ค๋ฆ์ฐจ์ /
์ถ๊ฐ๊ฑด ๋ฒํธ = add_amounts ํ์ฅ [{no,amt}] / ๋ณธ๊ฑด ๋ฏธ์ ํ ํ์ ๋งคํ = ๋ถ๋ชจ ๋ณธ๊ฒฌ์ ๋ฒํธ / ๊ฒ์ฆ = ๋ด์ ๊ฒ
ํฉ(ํ์ ๊ธ์ก์ ๊ฒ์ฆ ๋ฌด๊ด โ ๋ค๊ณ ์๊ธฐ๊ฐ) / ใํ ์ถ๊ฐใ ์ ์ง + ใ๊ฒฌ์ ๋ด๊ธฐใ ์ ์ค / ์๋์์ง = ๋ฏธ์
๊ธ๋ง /
๋ชฉ๋ก ํด๋ฉ = โถ ํ์ ์์ฝํ + ์ถ๊ฐ๊ฑด ์ํ ๋ณ๋ / ์๊ธ์ฐ๊ฒฐ 66ํ์ ๋ฒ์ ๋ฐ / ๋ฐฐํฌ = ํ ์ธ์
์ ๋ถ ยท ์ด์ 1ํ.
๐ด์ฐฉ์ ์ ํํ ์ง์ = ใ6์๊น์ง ๊ฒฌ์ ์๋ ๋ชจ๋ ๋ง๊ฐ์ฒ๋ฆฌใ โ ์๋์์ง ํผ์ ์ ๊ฑฐ์ฉ. is_deposit '0'โ'2',
๊ฒฌ์ ์ผ(์์ผ๋ฉด ๋ฑ๋ก์ผ) โค 2026-06-30, ๊ธฐ์กด ์
๊ธ('1') 5๊ฑด์ ์ ์ธ. ์ด์ 609๊ฑด ยท ํ
์คํธ 659๊ฑด ์ ์ฉ,
๋กค๋ฐฑ์ฉ ๋ฒํธ๋ชฉ๋ก ๋ฐฑ์
= /home/ubuntu/pfs-backup/is_deposit_{prod,test}_*.json. ๊ฒฐ๊ณผ = ๋ฏธ์
๊ธ ๋ณธ๊ฒฌ์ 608 โ 11๊ฑด.
๐๊ทผ๋ณธ ๋ฌธ์ ์๋ ๊ฒ = ๋ง๊ฐ ํญ๋ชฉ์ด ๊ฒฌ์ ์์ ๋ฐ์ชฝ๋ง ๋ถ์ด ์์๋ค โ ์ด์ 78ํ ์ค estimate_no 12ํ๋ฟ์ด๊ณ
(1~6์ ์๊ธฐํ์ ํ์ฅ๋ง) ์ถ๊ฐ๊ฑด์ ๊ธ์ก ๋ฐฐ์ด์ด๋ผ ๋ฒํธ๊ฐ ์์ ์์๋ค. ๊ทธ๋์ โ ๊ฒ์ฆ ๋ฐฐ์ง๊ฐ ๋ฌด์๊ณผ ๋์กฐํ๋์ง
๋ถ๋ถ๋ช
โก์ถ๊ฐ๊ฑด ์
๊ธ์ฌ๋ถ๋ฅผ ํ์ํ ๊ทผ๊ฑฐ ์์ โข๋ฐฐ์ง๊ฐ ๋งํฌ๋ ์๋. โ add_amounts ๋ฅผ [{"no","amt"}] ๋ก ํ์ฅํ ๊ฒ
์ด ๊ธฐ๋ฅ ์ ์ฒด์ ์ ์ . ์ด์ DDL 0(TEXT ์ปฌ๋ผ ๊ทธ๋๋ก, ์ซ์๋ฐฐ์ด ํ์ํธํ).
- ๋ด๊ธฐ ๋ชจ๋ฌ(
estimate_monthly_close.html+GET /api/monthly-close/estimate-search) = ๊ฒฌ์ ์ ๋ชฉ๋ก๊ณผ ๊ฐ์ ๊ธฐ์ค (๋ณธ๊ฒฌ์ ยท๋ณด๊ด ์ ์ธ) ํ์ฅ๋ช ยท์ ์ฒด๋ช ๊ฒ์ + ๋ณธ๊ฑด ์๋ ์ถ๊ฐ๊ฑด ๋ค์ฌ์ฐ๊ธฐ ์ฒดํฌ. ใ๋ฏธ์ ๊ธ๋งใยทใ์ ์ฒด ์ ์ฒดใยทใ์ ๋ถ ์ ํใ. ๋ด๊ธฐ = ๋ณธ๊ฒฌ์ 1๊ฑด = 1ํ(์์ผ๋ฉด ๋ณํฉยท์ค๋ณต๋ฒํธ ๋ฌด์), ์ถ๊ฐ๊ฑด์ ๊ฒฌ์ ๋ฒํธ ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๊ฐ๊ธ์ก 1๋ฒ ์นธ๋ถํฐ, ๋ณธ๊ฑด ๋ฏธ์ฒดํฌ๋ฉด ๋ณธ๊ฑด๊ธ์ก 0 + ๋งคํ์ ๋ถ๋ชจ ๋ฒํธ. ๊ธ์ก์ ์๋์์ง๊ณผ ๊ฐ์ ์๋น์ค ํจ์(๋ฅ์์ค ์๊ณต๋น ๋ถ๋ฆฌ). - ๊ฒ์ฆ ๋ฐฐ์ง = ๋ด์ ๊ฒฌ์ ํฉ vs ํฉ๊ณ ยท
๊ฒฌ์ #711 +6 โ(โ =๋ฏธ๋ด๊น ์์) ยท ํด๋ฆญ ์ ๊ฒฌ์ ์ ์ ํญ. โ ๋ ๊ฑฐ์(๋ฒํธ ์๋) ํ์JSON_CONTAINS_PATH๋ก ๊ฐ๋ผ ์ ๊ธฐ์ค์ผ๋ก ํด๋ฐฑ โ ์ ๊ทธ๋ฌ๋ฉด ๋ฐฐํฌ๋ง์ผ๋ก ์ ๋ถ ๋นจ๊ฐ. ๊ธฐ์กด 7์ ๋ง๊ฐ 12ํ ์ค ์๋์์ง์ด ๋ง๋ 2ํ์ ๋ฒํธ๋ฅผ ์ ํ ๋ณต์(๊ฐ์ยท๊ธ์ก ์ ๋ถ ์ผ์นํ ๋๋ง,add_amounts_*.json๋ฐฑ์ ). - ๊ฒฌ์ ๋ชฉ๋ก ํด๋ฉ(
estimate_list_v2.html) = ์ถ๊ฐ๊ฑด ์๋ ๋ณธ๊ฑด์ โถ(์ด์ 5๊ฑด). ํผ์น๋ฉด ๊ฒฌ์ ๋ช ยท๊ฒฌ์ ์ผยท๊ธ์กยท์ ๊ธ๋ฐฐ์งยท์์ . ์ถ๊ฐ๊ฑด ๋ฐฐ์ง = ๋ณธ๊ฑด๊ณผ ๊ฐ์depositBtnHtmlโ ์๋์ ๊ทธ ํis_deposit, ํ์์ ๋ง๊ฐํadd_amounts์ ๋ฒํธ+ํ์ ๊ธ์ก. - ์๋์์ง = ๊ฐ์ ๋ชจ๋ฌ์ ใ๋ฏธ์
๊ธ๋งใ ์ผ ์ฑ๋ก ์ฌ๋ ๊ฒ. ๊ตฌ
/candidates์ ๊ฑฐ(404).
๊ฒ์ฆ = ์ ์ค scripts/_mc_pick_check.py ๋ฐฐํฌ์ 7 FAIL โ ํ
์คํธ 50/50 โ ์ด์ 46/46(์ด์์ ์ ์ฅ ์๋ณต ์ ์ธ).
ํ๊ท = _deposit_mark_check ํ
์คํธ 17/17ยท์ด์ 12/12 ยท _monthly_close_ui_check ํ
์คํธยท์ด์ ๊ฐ 19/19 ยท
์์
์์ฑ ํ
์คํธยท์ด์ ๊ฐ 4/4(์ถ๊ฐ๊ธ์ก1..N ์ปฌ๋ผ ์ ์ง) ยท ์ ๊ท SQL 6/6(์ด์ ์ง์ ์คํ) ยท ์ด์ ๋ฐฐํฌ ํ์ผ 4๊ฐ ํด์๊ฐ
ํ
์คํธ์ ์์ ์ผ์น ยท ์ฌ์ดํธ๋งต ๊ทธ๋ฃน8ยทํ์ด์ง54ยท๋ฏธ๋ฐ์ 0.
์ปค๋ฐ = master c65e484ยทb9bd8bd โ deploy-live 75fd745(7ํ์ผ ์ ๋ณ ํฌ์๋).
โณํํ = ์ด์ ์ก์ 1ํ โ ๊ฒฌ์ >์๋ง๊ฐ โ ๋ง๊ฐ ๊ณจ๋ผ ใ๊ฒฌ์ ๋ด๊ธฐใ(ํ์ฅ๋ช
๊ฒ์ยท์ถ๊ฐ๊ฑด ์ฒดํฌยท๋ด๊ธฐ) / ใ๊ฒฌ์ ์๋์์งใ์ด
๋ฏธ์
๊ธ ์ผ์ง ๋ชจ๋ฌ๋ก ์ด๋ฆฌ๋์ง / ๊ฒฌ์ ์ ๊ด๋ฆฌ ๋ชฉ๋ก์ โถ ํผ์นจ.
โณ๋จ์ ๊ฒ = 1~6์ ์๊ธฐํ 66๊ฑด ๊ฒฌ์ ์๊ธ ์ฐ๊ฒฐ(๋ฒ์ ๋ฐ์ผ๋ก ๋บ ๊ฑด, ์ด์ ๋ด๊ธฐ ๋ชจ๋ฌ๋ก ํ ๋ฌ์ฉ ๊ฐ๋ฅ).
โ projects/pfs/rules.md ๐ ์ ๊ท 5์ค
๐ ์กฐ์ฌ (2026-08-19 ยท 6์ฐจ) โ ์๋ง๊ฐ ํญ๋ชฉ โ ๊ฒฌ์ ์ ๋งคํ ์คํ (์ฝ๋ ๋ณ๊ฒฝ ์์)
[ํํ] ์ง๋ฌธ = ใ์๋ง๊ฐ ์ง์ ๋ ํ์ฅ๋ณ ๊ฒฌ์ ์ด ์ค์ ๊ฒฌ์ ์์ ๋งคํ์ ์ ๋๋? ๊ฒ์ฆ์ ์ ํ ๊ฒฌ์ ์ ๋ฒํธ๊ฐ ๋ค์ผ?ใ
๊ฒฐ๋ก = ๋งคํ ์์ฒด๋ ์๋ค(DB ์ปฌ๋ผ 2๊ฐ). ๋ค๋ง โ ์ค๋ฐ์ดํฐ ๋๋ถ๋ถ์ด ์ ๋ถ์ด ์๊ณ โก์ถ๊ฐ๊ฒฌ์ ๋ฒํธ๋ ์์ ์ ์ฅ ์ ๋๊ณ โข๊ฒ์ฆ ๋ฐฐ์ง๋ ๋งํฌ๊ฐ ์๋๋ค.
- ๋งํฌ ์ปฌ๋ผ =
monthly_close_item.estimate_no(๋ณธ๊ฒฌ์ FK) +field_no(ํ์ฅ FK). ๊ฒ์ฆ ๋ฐฐ์ง = ๊ทธestimate_noํ์ +select_items๊ฐ ๊ณ์ฐํestimate_total(๋ณธ๊ฒฌ์ + ์์๊ฒฌ์ ํฉ)๊ณผ ํ ํฉ๊ณ๋ฅผ ๋์กฐํด ์ด๋ก/๋นจ๊ฐ. - ๐ด์ด์ ์ค์ธก(์ฝ๊ธฐ์ ์ฉ ํ๋ก๋ธ) = ํญ๋ชฉ 78ํ ์ค estimate_no 12ํ(์ ๋ถ ์ค์ฌ, dangling 0) ยท field_no 75ํ ยท ๋ฐฐ์ง ์์ 66 / ์ด๋ก 7 / ๋นจ๊ฐ 5. 1~6์ ์๊ธฐ ์๋ฉ๋ถ์ ๊ฒฌ์ ๋งํฌ 0, 7์ ์๋์์ง๋ถ(๋ฅ์์ค9ยท๋ต์ค2ยท์๋ฅ์ค2)๋ง ๊ฒฌ์ ์ ๋ถ์ด ์๋ค โ ์ ๊ธ์ฌ๋ถ ํ์ ์ด ใ๊ฒฌ์ ๋ฒํธ ์ฐ์ + ํ์ฅ ํด๋ฐฑใ์ธ ์ด์ ๊ฐ ์ด ๋ถํฌ๋ค.
- ๐ด์ถ๊ฐ๊ฒฌ์ ์ ๋ฒํธ๊ฐ ์๋ค โ
add_amounts๊ฐ ๊ธ์ก JSON ๋ฐฐ์ด([912000,1206000,โฆ])๋ฟ์ด๋ผ ํ ํ๋์ ๋จ๋ ๊ฒฌ์ ๋ฒํธ๋ ๋ณธ๊ฒฌ์ 1๊ฐ. ์ = item 140GS ์ค์ฐ ์์ฐ๊ฒฌ์ #711 + ์ถ๊ฐ 6๊ฑด(์์๊ฒฌ์ ๋ 6๊ฑด ์ค์ฌํ์ง๋ง ๋ฒํธ๋ ๋ฏธ๋ณด์กด). - ๋ฐฐ์ง๋
<span class="badge">ํ ์คํธ โ ๊ฒฌ์ ์๋ก ๊ฐ๋ ๋งํฌ ์์(ํด๋ฆญ ๋ถ๊ฐ).
๊ฐ์ ํ๋ณด(๋ฏธ์ฐฉ์ยทํํ ๊ฒฐ์ ๋๊ธฐ) = โ ๋ฐฐ์ง๋ฅผ /estimate/modify-v2/<no> ๋งํฌ๋ก(1์ค) โก์ถ๊ฐ๊ฒฌ์ ๋ฒํธ ๋ณด์กด
(add_amounts ๋ฅผ [{no,amt}] ๋ก or ๋ณ๋ ์ปฌ๋ผ) โข1~6์ ์๊ธฐํ ๊ฒฌ์ ์๊ธ ์ฐ๊ฒฐ(ํ์ฅ+๊ธ์ก ๋์กฐ).
๐ NOW (2026-08-19 ยท 5์ฐจ) โ ์ ๊ธ์ฌ๋ถ ใ๋ง๊ฐใ ์๋ ์ ํ + QA ๋๊ตฌ ๋ฒํผ ์ ๋ฆฌ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] QA(qa_helper, /estimate/modify-v2/730) = ใ๋ง๊ฐ ๋ฒํผ๋ ์ถ๊ฐํด์ค. ์๋ง๊ฐ ์ด์ ์ ๋ฆฌํ๋ฉด์ ๋ง๊ฐ ํ์๋ฅผ
์ฝ๋๊ฐ ์์ฑํ๋๋ฐ ๋ด๊ฐ ์ ํํ ์ ์๋ ํญ๋ชฉ์ ์๋ค. ์ด์๋ฐฐํฌใ + ๊ฐ์ ์ธ์
์ถ๊ฐ์ง์ = ใqahelper ์์
์ฑํฐ์ฉ ๋ณต์ฌ ๋ฒํผ ์ด๋ฆ์ ๊ทธ๋ฅ ใ๋ณต์ฌใ๋ก, ํ
์คํธ ๋ณด๊ธฐ ๋ฒํผ์ ์ญ์ ใ.
๋ฐฐํฌ = master 08e0944 โ deploy-live 97e596a(4ํ์ผ ์ ๋ณ ํฌ์๋, --detach ์ํฌํธ๋ฆฌ). DDL 0 ยท DB ๋ณ๊ฒฝ 0.
โ
ํํ ์ด์ ์ก์ ํ์ธ ์๋ฃ(26.8.19) โ ๊ฒฌ์ ์์ ํ๋ฉด ๋ง๊ฐ ์ ํ ํ์ธ. ์ด ๊ฑด ์ข
๊ฒฐ.
- ๐์ง์ (4์ฐจ ์ด์ ) ์์
์ด ๋ง๋ ๋ฐ์ชฝ ์ํ๋ฅผ ๋ฉ์ด ๊ฒ โ 26.8.19 3์ฐจ์์ list-v2 ์
๊ธ์ฌ๋ถ๋ฅผ ์๋ง๊ฐ ์ด์ ๊ธฐ์ค
3์ํ(์
๊ธ/๋ง๊ฐ/๋ฏธ์
๊ธ)๋ก ๋ฐ๊ฟจ๋๋ฐ, ใ๋ง๊ฐใ์ ํ์๊ฐ์ผ๋ก๋ง ์กด์ฌํด ์ฌ๋์ด ๊ณ ๋ฅผ ์๋จ์ด ์์๋ค.
โ
is_deposit์ 3์ํ๋ก ์น๊ฒฉ =1์ ๊ธ /2๋ง๊ฐ /0๋ฏธ์ ๊ธ(=์๋ ํ์ ์ ๋งก๊น). ์ปฌ๋ผ์ด ์ด๋ฏธchar(1)์ด๋ผ DDL ์์(rds-map ์ค์ธก). - ์๋ 4๊ณณ = โ ๊ฒฌ์ ํผ(
estimate_regist_v2.html, registยทmodify ๊ณต์ฉ) ๋ผ๋์ค์ ใ๋ง๊ฐใ โกlist_v2depositBtnHtml์ด'2'๋ฅผ ์ต์ฐ์ ๋ง๊ฐ์ผ๋ก(๋ง๊ฐ ์ด์ ์ ๋ฌด์ ๋ฌด๊ด) โขํ ๊ธ์ 0โ1โ2โ0 ์ํ(์ ํ๋ฉด ํผ์์ ๊ณ ๋ฅธ ๋ง๊ฐ์ ๋ชฉ๋ก์์ ํ ๋ฒ ํด๋ฆญํ๋ ์๊ฐ ์๋๋ค) โฃset_deposit์ด'2'๋ฅผ ํต๊ณผ์ํจ๋ค(์ข ์ ์'1' else '0'์ผ๋ก ๋ญ๊ฐฐ๋ค). - qa_helper = ๋ฒํผ ๋ผ๋ฒจ ใ์ฑํฐ์ฉ ๋ณต์ฌใโใ๋ณต์ฌใ, ใํ
์คํธ ๋ณด๊ธฐใ ๋ฒํผ ์ญ์ .
showExportDialogํจ์๋ ๋จ๊ธด๋ค โ ํด๋ฆฝ๋ณด๋ API ์คํจ ์ ํด๋ฐฑ์ด๋ผ ์ง์ฐ๋ฉด ๊ทธ ๊ฒฝ์ฐ QA ํญ๋ชฉ์ด ํต์งธ๋ก ๋ ์๊ฐ๋ค. - ๊ฒ์ฆ =
scripts/_deposit_mark_check.py(๊ธฐ์กด ์คํฌ๋ฆฝํธ ํ์ฅ ยทscripts/_*๋ gitignore ๋ผ ๋ฏธ์ถ์ ). ๋ฐฐํฌ์ ํ ์คํธ 4 FAIL โ ํ ์คํธ 17 ALL PASS โ ์ด์ 12 ALL PASS. ํ ์คํธ๋ ํ ๊ธ 3์ํ ์๋ณต + ์๋ก๊ณ ์นจ ํdata-deposit=2ํ์ธ(DB ์์), ์ด์์ ์ฝ๊ธฐ์ ์ฉ(ํผ ๋ผ๋์ค๋ง). ๊ฒ์ฆ ์ค ์ผ ํ ์คํธ ๊ฒฌ์ 721ยท797 ์is_deposit์'0'์ผ๋ก ์๋ณต(SSM). ์ฌ์ดํธ๋งต = ๊ทธ๋ฃน8ยทํ์ด์ง54ยท๋ฏธ๋ฐ์ 2 โ ๋ฏธ๋ฐ์ 2๊ฑด์ ๋ด ์์ ์ด ์๋๋ผ ์๋ 4์ฐจ(ํตํฉํ์ฅ, master ์ ์ฉ)๋ค. - โ ๊ฐ์ ๋ฆฌํฌ์์ ๋ค๋ฅธ ์ธ์
์ด ๋์์ ์์
์ค์ด์๋ค(4์ฐจ ํตํฉํ์ฅ). ๊ฒ์ฆ ๋์ค
origin/master๊ฐ08e0944โa784e25๋ก ๋ฐ๋๊ณ ๋ด ์ํนํธ๋ฆฌ์ ๋ฏธ์ปค๋ฐ WIP ์ด ์ฌ๋ผ์ก๋ค. ํ์ผ ์ง์ add + ์ ๋ณ ํฌ์๋๋ผ ์๋ก ์ ์์๋ค (deploy-live ์ปค๋ฐ diff = ๋ด 4ํ์ผ 19+/9โ).git add -A์์ผ๋ฉด ๋จ์ ๋ฏธ์์ฑ ์ฝ๋๊ฐ ์ด์์ ๊ฐ๋ค.
๐ NOW (2026-08-19 ยท 4์ฐจ) โ ํตํฉํ์ฅ ํญ ์ฌ์ค๊ณ = ์ฝ๋๊ฐ ์ ๋ฆฌํ ใํตํฉ ๊ฒ์๊ธใ โ 1์ฐจ ์ด์๋ฐฐํฌ ์๋ฃ(๋ณ๋ ์ธ์ ์ ๋ด ยท ํํ ์ง์ 26.8.19)
โ 1์ฐจ ๋๋ฌ๋ค(์ด์๋ฐฐํฌ๊น์ง). ๋ด๋น ์ธ์ ์ด master
a784e25~93a748eยท deploy-livef10e839~7d5e2c7๋ก ๋ฐ์ ์๋ฃ. ์ด ๊ฑด ํ์ผ(worklog dao/service/controller ยท kakao_board dao/service ยท field_worklog.html)์ 2์ฐจ ์์ ๋ ๊ฐ์ ์ธ์ ์ด ์ก๋๋ค โ ๊ฐ์ ์ํฌํธ๋ฆฌ ๋์ํธ์ง์ด๋ฉด ์๋ก ๋ฎ์ด์ด๋ค.
[ํํ ์ง์ ยท QA ์ฝ๋ฉํธ /field/worklog #wl-tab-fusion] "์นดํกยทํตํ 2๊ฐ์ง๋ฅผ ๊ฐ๊ฐ ๋ณด๋ ๊ฒ ์๋๋ผ ํ์ฅ ๊ธฐ์ค์ผ๋ก ํตํฉํ๋ค.
๋จ์ ๊ทธ๋ฃน๋ถ๋ฅ๊ฐ ์๋๋ผ ์ฝ๋๊ฐ ๋ด์ฉ์ ์์งยท์ ๋ฆฌํด ์นดํก ๊ฒ์๊ธ์ฒ๋ผ ์ ๋ฆฌํ๋ค. ํตํ๋ด์ฉ๋ ํ์ฅ ๊ด๋ จ์ด๋ฉด
์ถ์ฒ๊ฐ ํตํ์์ ํ๊ธฐํด ๊ฒ์๊ธ์ ํตํฉํ๋ค. ์ต์ข
์ ์ผ๋ก ์นดํก ๊ฒ์๊ธ๋ก ๋ชจ๋ ์ ๋ณด๊ฐ ํตํฉ๋์ด ๊ฑฐ๋์ฒ์
ํฌ์ธ ์ง์์ด ํ๋์ ๊ณต์ ํ๊ฒ ํ๋ ๊ฒ." โ ๊ทธ๋ฆด๋ง 5๋ฐฐ์น 15๋ฌธ ์งํ, ์๋ ์ ๋ถ ํํ ํ์ .
์ฐฉ์ ์ ํ์ธํ ๊ตฌ์กฐ(์ฝ๋ ์ค์ธก)
- 3ํญ์ ์ง๊ธ ์ฝ๊ธฐ์ ์ฉ ๋์ด์ด๋ค โ
GET /api/worklog/fusion(worklog_service.get_worklog_fusion)์ด worklog ์ด๋ฒ์ฃผ๋ถ +kakao_board๋ฏธ๋ฌ๋ฅผ ํ์ฅ์นด๋๋ก ๋ฌถ๊ธฐ๋ง ํ๋ค. ์ ๋ฆฌยท์์ฝยท๋ฌธ์ฅ์์ฑ ์์. - ๊ฒ์๊ธ ์๋ณธ์ PFS ๊ฐ ์๋๋ค โ ๋ก์ปฌ PC
poin-agent/<๋ฐฉ>/board.md. PFS ๋ ๋ฏธ๋ฌ(kakao_board) + ๋ช ๋ น ํ(kakao_board_op). ํ ์ก์ =hide/restore/edit/delete4๊ฐ๋ฟ โ ใํ ์ถ๊ฐใ๊ฐ ์๋ค(์ ์ค ๋์). - board.md ๊ฐ ๋ฐ๋๋ฉด
sgc/watcher.py(30์ด ๋ฃจํ)๊ฐ ํด์๋ก ๊ฐ์งํด ์๋์ผ๋ก ์นดํก๋ฐฉ ๊ฒ์๊ธ ์์ + ๊ณต์ง ๊ณ ์ . = ๊ฒ์๊ธ์ ์ค ํ๋ ๋ฃ์ผ๋ฉด ๊ทธ๋๋ก ๊ฑฐ๋์ฒ๊ฐ ๋ณธ๋ค. - ๊ฒ์๊ธ ๋ฐฉ =
board_edit:true7๋ฐฉ, ํ์ฅ๋ฐฉ์ 4๊ฐ(SGC ์ฉ๋๋ยท๊ธ๊ฐ ๋ถ์ฐ์์ฝยท์๋ฅ์ค ๋์ฐ ์ฉ์ธยท๋กฏ๋ฐ ํ์ฑ ํฅ๋จ). PFS ํ์ฅ ์์ฒ ๊ฑด ๋๋ถ๋ถ์ ์นดํก๋ฐฉ ์์ฒด๊ฐ ์๋ค. ์น์ ๊ตฌ์ฑ๋ ๋ฐฉ๋ง๋ค ๋ค๋ฅด๋ค(ใํ์ธ์คยท์์ฒญใ 4๋ฐฉ / ๊ธ๊ฐ์ ใํ์ธ์คยท๋๊ธฐใ / ์๋ฅ์ค๋ ์์). - ํตํ ์ ์ฌ๋ณธ = ํ์์คํฌํยทํ์ ์๋ ํ ๋ฉ์ด๋ฆฌ ํ๋ฌธ(
pipeline_worker.py:83์ดseg.start/end๋ฅผ ๋ฒ๋ฆฐ๋ค). ๋ น์์ ๋ชจ๋ ธ 1์ฑ๋(ffprobe ์ค์ธก)์ด๋ผ ์ฑ๋๋ก ํ์๋ฅผ ๋ชป ๊ฐ๋ฅธ๋ค. - ์๋ณธ m4a ๋ ์ ์ฌยท์ ์ฌ ํ ์ญ์ ํ๋ค(purge 3,005๊ฑด, ์์กด 17๊ฐ) โ ๊ณผ๊ฑฐ 1,111๊ฑด์ ์ฌ์ ์ฌ ๋ถ๊ฐ = ์๊ฐยทํ์ ์๊ธ ๋ณต์ ๋ถ๊ฐ.
- ์ ์ฌ๋ณธ 1,111๊ฐ ยท ์ด 1.29MB(ํ๊ท 1.2KB) โ DB ๋ถ๋ด 0. ๋จ ์ง๊ธ์ ๋ก์ปฌ PC ์๋ง ์๋ค(PFS ๋ก ์ฌ๋ฆฌ๋ ๊ฒฝ๋ก ์์).
- ์ฐ๊ฒฐํค๋ ์ด๋ฏธ ์๋ค โ
worklog.note = "audio=<ํ์ผ๋ช > / number=<๋ฒํธ>"(pipeline_worker.py:218). - ํตํ๋ = 26-06 404๊ฑด ยท 07 643๊ฑด ยท 08 63๊ฑด(8/11๊น์ง). ์ 400~650๊ฑด โ ์ 20์๊ฐ.
- ํตํ ํ์ดํ๋ผ์ธ์ ํ๋ฃจ 1ํ 02:00(
PFS-Night-Worklog). ์นดํก board sync ๋ 1๋ถ, watcher ๋ 30์ด. - ํตํ ์์ง์ ํฐ ์ฑ์ด PC ๋ก push(
talklog_server.py8792/callsยท/upload-audio). ์ฑ์TriggerReceiver๊ฐ ์์ด ๋ฐ์์ ๋ธ๋ก๋์บ์คํธ๋ก ๊นจ์ธ ์ ์๋ค. ์ง๊ธ ๋ถ๋ฅด๋ ๊ฑดNightRunner(๋ฐค)ยทMainActivity(์๋)๋ฟ โ ํตํ์ข ๋ฃ ๊ฐ์ง๋ ์๋ค.
ํํ ํ์ 15๊ฑด (๊ทธ๋ฆด๋ง)
- ์ฐฉ์ง์ = ์๋ ์ฆ์ ๋ฐ์ ํ๋ก์ธ์ค๋ก ๊ฐ๋ค. ๋จ ํตํ๋ด์ฉ์ PFS ์ ๋จผ์ ๋จ๊ณ ํํ๊ฐ ํ์ธ ํ ์นดํก ๊ฒ์๊ธ ๋ฐ์ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค. ํ์ฅยท๊ฑฐ๋์ฒ์ ๋ฐ๋ผ ์ฌ์ ์ ์ฒด์น์ธ์ผ๋ก ๋๋ฆด ์ ์๋ค. ๊ฒ์ ํ ์คํ์ PFS ํ๋ฉด์์ ์ฌ์ฉ์๊ฐ ์ง์ ์์ ํด ๋ณด์ํ๋ค.
- ์์ฑ์์ ์ฝ๋ ์ธ๊ธ๋ง ๋นผ๋ฉด ํญ๋ชฉ ๋ด์ฉ ์์ฒด์ ํฐ ์ํ์ด ์๋ค(ํํ ํ๋จ).
- ์ ๋ฆฌ ๋ฌธ์ฅ ์์ฑ ์ฃผ์ฒด = ์ฝ๋(LLM) ๋ฐฐ์น.
- ๊ฒ์๊ธ์ ๋๊ฐ๋ ํตํ ํญ๋ชฉ = ์ฝ๋ ์ฌ์์ฑ 1์ค + ์ถ์ฒ ํ๊ทธ. ์๋ฌธยทํ์ ์ด๋ฆ์ ๊ฒ์๊ธ์ ์ ๋๊ฐ๋ค.
is_private=1์ ์์ฒ ์ ์ธ. - PFS ์์ ํตํ ํญ๋ชฉ์ ํด๋ฆญํ๋ฉด ๊ทธ ํตํ ์ ๋ฌธ ์ ์ฌ๋ฅผ ๋ณด์ฌ์ค๋ค โ ์๊ฐยทํ์๋ณ๋ก ์ ๋ฆฌํ๊ณ ๊ทธ ํญ๋ชฉ์ ๊ทผ๊ฑฐ ๊ตฌ๋ฌธ์ ํ๊ด ๊ฐ์กฐํ๋ค.
- ์ ์ฌ ์์ค = ๊ธฐ์กด 1,111๊ฑด์ ํ๋ฌธ+๊ตฌ๋ฌธ๊ฐ์กฐ๋ง. ์ ๊ท ํตํ๋ถํฐ ํ์๋ถ๋ฆฌ๋ฅผ ํ๋ค.
- ์ ๊ท ์ ์ฌ ์์ง = Groq(whisper-large-v3-turbo) ์ ์ฌ + sherpa-onnx ๋ก์ปฌ ํ์๋ถ๋ฆฌ(pyannote-segmentation-3.0 ONNX 6.6MB).
๋ ๋ค ๋ฌด๋ฃยท๋ฌด์ ํ. Groq ํค๋
.secrets/.env์ ์ด๋ฏธ ์๋ค. - ํ์ ๋ผ๋ฒจ = ์ฝ๋๊ฐ ๋งฅ๋ฝ์ผ๋ก ํ์ . ํํธ = ใ๋ใ = ํฌ์ธ ์ ๋์น ์ฐจ์ฅ, ์๋๋ ๋ณดํต ๋๋ฅผ ใ์ ์ฐจ์ฅยท์ ๋์น ์ฐจ์ฅยท์ฐจ์ฅ๋ใ์ด๋ผ ๋ถ๋ฅธ๋ค. โ์ ์ฌยท์ฐ์ถ๋ฌผ์ ใํํใ๋ผ๋ ๋ง์ ์ ๋ ์ฐ์ง ์๋๋ค.
- ์ ์ฌ๋ณธ PFS ์ ๋ก๋ = ์ ๋(worklog ํญ๋ชฉ์ด ์๊ธด ํตํ๋ง). ๋จ 1์ฐจ๋ ์งํ์ค ํ์ฅ๋ถ ๋จผ์ โ ๋ณด๊ณ , ๊ทธ ๋ค ์ต๊ทผ ์ผ์ โ ๊ณผ๊ฑฐ ์ผ์ ์์ผ๋ก ๋๋จธ์ง โ ์๋ฃ ๋ณด๊ณ .
- ์น์ธ UI = ํตํฉํ์ฅ ํญ ์(ํ๋ณ โ๊ฒ์/โ๋ฒ๋ฆผ/โ์์ + ๋ฐฉ๋ณ ใ์ฌ์ ์ ์ฒด์น์ธใ ์ค์์น).
- ์ด์ ์์ฑ ์ฃผ๊ธฐ = 30๋ถ๋ง๋ค(์นดํก ๊ฒ์๊ธ ์ฃผ๊ธฐ์ ๋ง์ถ๋ค). ์ด์ ๋ง์ถฐ ํฐ ํตํ์์ง๋ ํตํ ์ข ๋ฃ ์ฆ์๋ก ๋น๊ธด๋ค.
- ์ค๋ณต = ์ฝ๋๊ฐ ํ์ฌ ๊ฒ์๊ธ ์ ๋ฌธ๊น์ง ์ฝ๊ณ ํ๋จ. ์ด๋ฏธ ์์ผ๋ฉด ์ด์์์ ๋นผ๊ณ , ์งํ์ด ๋ฐ๋ ๊ฑด์ ์ ํ์ด ์๋๋ผ
๊ธฐ์กด ํ ์์ ์ ์์ผ๋ก ๋ธ๋ค(
edit๋ช ๋ น์ ์ด๋ฏธ ์๋ค). - ๊ฒ์๊ธ ์น์ = ์ฝ๋๊ฐ ๊ทธ ๋ฐฉ์ ๊ธฐ์กด ์น์ ๋ชฉ๋ก์ ๋ณด๊ณ ๊ณ ๋ฅธ๋ค. ๋ง๋ ๊ฒ ์์ผ๋ฉด ใํ์ธ์ค ยท ์์ฒญใ ์ ์ค. ์ด์์ ์น์ ๋ช ์ ์ ์ด ์น์ธ ์ ์ ๋ณด์ธ๋ค.
- ์นดํก๋ฐฉ ์๋ ํ์ฅ = ์ด์์ ๋๊ฐ์ด ๋ง๋ค๊ณ PFS ์ ์ฉ์ผ๋ก ๋ณธ๋ค(๊ฒ์ ๋ฒํผ ์๋ฆฌ์ ใ์นดํก๋ฐฉ ์์ใ).
- ์ฆ์์์ง ๊ตฌํ = PC ๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก adb ํธ๋ฆฌ๊ฑฐ(์ฑ ์์ ยทAPK ์ฌ์ค์น 0). ๋ฒ์ = ๋จ๊ณ ๋ถํ , ์๋ฃ ๊ฒฝ๊ณ = ๋ฐ๋ก ์ด์๋ฐฐํฌ๊น์ง.
โ 1์ฐจ ๊ฒฐ๊ณผ (์ด์๋ฐฐํฌ ์๋ฃ)
๋ฐฐํฌ = pfs master a784e25ยทee39821ยทeb3aa2eยทef38616ยท4eb6cc3ยท93a748e
โ deploy-live f10e839ยท73d8fbdยท4ed5557ยท7d5e2c7(6ํ์ผ ์ ๋ณ ํฌ์๋, ๋ณ๋ ์ํฌํธ๋ฆฌ โ ๋ค๋ฅธ ์ธ์
์ด ๊ฐ์ ๋ฆฌํฌ๋ฅผ ์ฐ๊ณ ์์๋ค).
poin-agent c818a8a ยท talklog 1a78d82. DDL ์ ํ ์์ โ ํ
์ด๋ธ 2๊ฐ๋ ์ฒซ ํธ์ถ์ ์๊ฐ์์ฑ.
- ํ
์ด๋ธ 2๊ฐ ์ ์ค(๊ธฐ์กด ALTER 0) =
fusion_row(์ฝ๋ ์ ๋ฆฌ๋ณธ ํ + ์นดํก ๋ฐ์ ์ํ) ยทcall_transcript(์ ์ฌ ํ๋ฌธ,audio๊ฐ PK). - API 4๊ฐ =
POST worklog/fusion/post(ํ์ฅ ํต์งธ ๊ต์ฒด) ยทPOST worklog/fusion/decide(๋๊ธฐ/๊ฒ์/์ ์ธ) ยทGET worklog/transcript/<no>ยทGET|POST worklog/transcript/sync. ๊ธฐ์กดGET worklog/fusion์postยทroom_nameยทcnt_wait์ถ๊ฐ. - ๊ฒ์๊ธ ใํ ์ถ๊ฐ(add)ใ๋ฅผ ์์ชฝ์ ์ ์ค = PFS
kakao_board_op.action='add'(row_id ์นธ์ด ์น์ ๋ช ์ด๋ค โ ๊ณ ์น ํ์ด ์๋ค) + ๋ฐ๋ชฌboard_rows.add.restore์ ๊ณต์ฉ_append_to_section์ผ๋ก ๋ฌถ์ด ์ค๋ณต ํ์ ์ ํ ๊ณณ์ ๋๋ค. ์น์ ๋์กฐ๋ ใโ ใ ์ ๋ฌด๋ฅผ ๋ฌด์ํ๋ค(_sec_name) โ ์ ๋ง์ถ๋ฉด ๊ฐ์ ์ด๋ฆ ์น์ ์ด ํ๋ ๋ ์๊ธด๋ค. - ๐ํต์ฌ ๋ถ๋ณ์ = 30๋ถ๋ง๋ค ๋ค์ ๋ง๋ค์ด๋ ์ฌ๋ ๊ฒฐ์ ์ด ์ด์๋จ๋๋ค. ์ง๋ฌธ
fp= ์น์ + ์ฒซ ์ค(๊ตฌ๋์ ยท๊ณต๋ฐฑยทใโป์์ ใ ํ๊ธฐ ์ ๊ฑฐ). upsert ๋kakao_stateยทdecide_*๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๋๋ค. ๊ฒ์ฆ์์ ์ด ์๋ณต(์ ์ธ โ ์ฌ์์ฑ โ ์ ์ธ ์ ์ง)์ ์ค์ ๋ก ๋๋ฆฐ๋ค. - ๊ฒ์ฆ = ์ ์ค
scripts/_fusion_post_check.py {--logic|test|prod}(๋ฏธ์ถ์ โscripts/_*๋ gitignore). ๋ฐฐํฌ ์ ํ ์คํธ 9 FAIL โ ํ ์คํธ 33 ALL PASS(์ฐ๊ธฐ ์๋ณต ํฌํจ) โ ์ด์ 17 ALL PASS(์ฝ๊ธฐ ์ ์ฉ). ๊ธฐ์กด ํ๊ท_worklog_fusion_check.pyํ ์คํธยท์ด์ ๊ฐ 38 ALL PASS. ์ฝ์ ์ค๋ฅ 0. ์ฌ์ดํธ๋งต ๊ทธ๋ฃน8ยทํ์ด์ง54ยท๋ฏธ๋ฐ์ 0. โ ์ด์์์๋ ์ฐ๊ธฐ๋ฅผ ์ ๋๋ค โ ใ๊ฒ์ใ๊ฐ ์ค์ ๊ฑฐ๋์ฒ ๋จํก๋ฐฉ์ ๋ค์ด๊ฐ๋ค. ์ฐ๊ธฐ ์๋ณต์ ํ ์คํธ ์ ์ฉ ๋ฐฉ์ผ๋ก๋ง. - ์ ์ฌ๋ณธ ์
๋ก๋ ์๋ฃ = ์งํ์ค ํ์ฅ ๊ด๋ จ 20๊ฑด(1์ฐจ ๋ณด๊ณ ๋ถ) โ ๋๋จธ์ง ์ ๋, ์ด์
call_transcript1,110๊ฑด. - ์ ๋ฆฌ๋ณธ ์์ฑ ์คํ = ์งํ์ค 10ํ์ฅ ์ค ์ฌ๋ฃ๊ฐ ์๋ 2๊ณณ. ๋กฏ๋ฐ ํ์ฑ ํฅ๋จ 2ํ ์์ฑ(๋ ๋ค ใ(ํตํ ํ์ธ)ใ ์ถ์ฒ ํ๊ธฐ), ๋์ฐ ์ฉ์ธ 0ํ(๊ฒ์๊ธ์ ์ด๋ฏธ ์๋ ๋ด์ฉ์ด๋ผ ์ ๋ = ๊ท์น 2 ์ ์ ๋์).
๐ด ์ก์ ํจ์ 4๊ฐ (์ ๋ถ ์ค์ธก)
_ensure_fusion()์ด ์๊ธฐ ์์ ์ ๋ถ๋ ๋ค โ DDL 1ํ ์คํ์ผ๋ก ๋ฐ๊พธ๋ฉฐ ์ผ๊ด์นํ์ด ํจ์ ์์ชฝ ํธ์ถ๊น์ง ๋จน์๋ค. ์ฆ์ = ํตํฉํ์ฅ API 500 "maximum recursion depth exceeded". ์ผ๊ด์นํ ๋ค์ ๊ทธ ํจ์ ๋ณธ๋ฌธ์ ๋์ผ๋ก ๋ณธ๋ค.- flask_restplus ๋ผ์ฐํธ ๋ณ์๋ ๋ฉ์๋ ์ธ์๋ก ๋ฐ์์ผ ํ๋ค โ
def get(self)๋ก ๋๋ฉด 500get() got an unexpected keyword argument 'worklog_no'. ํ ์คํธ์ ํตํ ํญ๋ชฉ์ด 0๊ฑด์ด๋ผ ์ด์์์ ์ฒ์ ๋๋ฌ๋ฌ๋ค. - ๐๊ทผ๊ฑฐ(excerpt)๋ ์ ์ฌ๋ฌธ์ ์ธ์ฉ์ด ์๋๋ผ ใ์์ฝใ์ด๋ค โ ํต์งธ๋ก ์ฐพ๋ ํ๊ด์ ์ค์ธก ๋งค์น 0%.
โ ๊ตฌ๋์ ยท๊ณต๋ฐฑ์ ๋บ ๊ธ์์ด๋ผ๋ฆฌ ์ต์ฅ ๊ณตํต ์กฐ๊ฐ(6์ ์ด์)์ ์์์๋ถํฐ ํ๋ ๋ฐฉ์์ผ๋ก ๊ต์ฒด
โ ์ด์ 12๊ฑด ์ค์ธก 12๊ฑด ์ ๋ถ ํ๊ด ยท ๊ทผ๊ฑฐ ๊ธ์์ 91% ๋ฎ์.
โ ์ค๊ฐ์ ํ์ด์ฌ ์ธก์ ์ด
SKIP + "*".join(...)์ฐ์ฐ์ ์ฐ์ ์์ ๋๋ฌธ์ ใ๊ฐ ๊ธ์ 0ํ ์ด์ใ ์ ๊ท์์ด ๋ผ 92%๋ผ๋ ๊ฐ์ง ํฉ๊ฒฉ์ ๋๋ค. ๋งค์น์จ์ ์ด ๋ ๋ง๋ค์ด์ง ์ ๊ท์์ ํ ๊ฑด ์ฐ์ด์ ๋์ผ๋ก ๋ณธ๋ค. - ๊ฒ์ ๋ฒํผ ํ๋จ์ ์นด๋๊ฐ ์๋๋ผ ใํ์ด ๊ฒจ๋ฅํ ๋ฐฉใ์ผ๋ก ํ๋ค โ ๋ฐฉ ์ฐ๊ฒฐ์ด ๋์ค์ ๋ฐ๋๋ฉด ๋์ด ์ด๊ธ๋๊ณ , ๋ฒํผ์ ์ค์ ๋ก ๋๊ฐ ๊ณณ์ ๋ฐ๋ผ์ผ ํ๋ค.
๐ด ์ง๊ธ ์ด ๊ธฐ๋ฅ์ ์ค์ง ๋ณ๋ชฉ โ ์นดํก ๊ฒ์๊ธ ๋ฐฉ 3๊ฐ๊ฐ ใํ์ฅ ๋ฏธ์ฐ๊ฒฐใ
์ด์ ์ค์ธก = ๊ฒ์๊ธ ๋ฐฉ 5๊ฐ ์ค ์์ฌ๋ฐฉ 2๊ฐ(์์ด๋น์ ผยท์ค์ ์จ)๋ ํ์ฅ์ด ์๋ ๊ฒ ๋ง๊ณ , ๋๋จธ์ง 3๊ฐ๊ฐ ํ์ฅ์ด ์๋๋ฐ๋ ๋ฏธ์ฐ๊ฒฐ์ด๋ค.
โ ๊ทธ ๋ฐฉ๋ค์ ๊ฒ์๊ธ์ด ํ์ฅ ์นด๋์ ์ ๋ถ์ด ์ฝ๋๊ฐ ์ ๋ฆฌํ ์ฌ๋ฃ๊ฐ ์๋ค(๋ฐฐ์น๊ฐ 8ํ์ฅ์ ๊ทธ๋ฅ ๊ฑด๋๋ด๋ค).
๊ทผ๋ณธ์์ธ = ๋๋ช
ํ์ฅ์ด ์ฌ๋ฟ์ด๋ผ _match_room_field ์ ใ์ ์ผ ์น์ใ ๊ฒ์ดํธ์ ๊ฑธ๋ฆฐ๋ค.
์ค์ธก = ใSGC ๊ด์ฃผ ์ฉ๋๋ใ 3๊ฑด(๋ณธ๊ฑด MH 1 + AS 2 ยท #2129/#2151/#2164) ยท ใ๊ธ๊ฐ ๋ถ์ฐ ์์ฝใ 2๊ฑด ยท ใ๋์ฐ ์ฉ์ธใ 2๊ฑด.
โณํํ ํ๋จ ํ์ โ ์นดํก๋ฐฉ์ ๋ณธ๊ฑด์ ๋ถ์ผ์ง AS ์ ๋ถ์ผ์ง๋ ์
๋ฌด ํ๋จ์ด๋ค(์งํ์ค์ผ๋ก ๋จ๋ ๊ฑด AS ์ชฝ #2164 ์ธ๋ฐ
๊ฒ์๊ธ์ ์ฃผ์ธ์ ๋ณดํต ๋ณธ๊ฑด์ด๋ค). ์ ํด์ฃผ๋ฉด kakao_board.field_no ์ง์ ์ฐ๊ฒฐ ๋๋ ๋งค์นญ ๊ท์น์ ๊ทธ ๊ธฐ์ค์ ๋ฃ๋๋ค.
โ 1-2์ฐจ ์ถ๊ฐ (๊ฐ์ ๋ , ํํ ์ง์) โ ๋ณธ๊ฑด ์ฐ์ ๊ท์น + ์๋ ์ฐ๊ฒฐ + ๊ฒ์ ์น์ธ
[ํํ] "์นดํก๋ฐฉ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณธ๊ฑด์ ๋ถ์ด๋ ๊ฒ์ ๊ท์น์ผ๋ก ํ๋ค. ์ดํ์๋ ๊ท์น ํด๋น์ด ์์ด ๋ฏธ์ฐ๊ฒฐ ๋๋ ๊ฒ์ ํ์ฅ์ฐ๊ฒฐ ๋ฒํผ์ ๋ง๋ค์ด์ ๋ด๊ฐ ์ง์ ์ฐ๊ฒฐํด์ฃผ๊ฒ ๋ค." + "ํตํ ๋ด์ฉ ํ์ธ ์ฌ๋ถ์ ์ ์ธ ๋ฒํผ๋ง ์๊ณ ์น์ธ ๋ฒํผ์ด ์๋ค."
๋ฐฐํฌ = master 61a149aยท9010333 โ deploy-live efc046eยทf362fe0.
- โ ๋ณธ๊ฑด ์ฐ์ โ
_match_room_field๋์ tie-break ์field_div != '60'(AS ์ ์ธ)์ active ํ์ ๋ณด๋ค ๋จผ์ ๋ฃ์๋ค. ์ค์ธก ํจ๊ณผ = ๋ฏธ์ฐ๊ฒฐ ๋ฐฉ 5 โ 3(SGC ์ฉ๋๋ยท๊ธ๊ฐ ๋ถ์ฐ์์ฝ๊ฐ ๋ณธ๊ฑด #2129ยท#2142 ์ ๋ถ์๋ค). ๋จ์ 3 = ์์ฌ๋ฐฉ 2(ํ์ฅ ์์์ด ๋ง๋ค) + ๋กฏ๋ฐ ํฅ๋จ. ๐๋กฏ๋ฐ ํฅ๋จ์ด ๋จ์ ์ด์ ๋ ๋์ ์ด ์๋๋ผ ์ ์ ๋ฏธ๋ฌ์ด๋ค โ ๋ฐฉ ์ด๋ฆ๋กฏ๋ฐ๊ฑด์ค ํ์ฑ ํฅ๋จ(ํฌ์ธ)vs ํ์ฅ๋กฏ๋ฐ ํ์ฑ ํฅ๋จ์ ๋ถ๋ถ์ผ์น๊ฐ ์ ๋๊ณ (ใ๊ฑด์คใ์ด ๋ผ์ด ์๋ค) ํ ํฐ ์ ์ 64์ (< 80). ์ด๊ฑด ๊ท์น์ผ๋ก ๋ชป ๋ถ์ธ๋ค = ์๋ ์ฐ๊ฒฐ ๋์. - โก ๋ฐฉโํ์ฅ ์๋ ์ฐ๊ฒฐ =
POST worklog/fusion/link {room_name, field_no}. ๋ฏธ์ฐ๊ฒฐ ๋ฐฉ ์นด๋์ ๐ ํ์ฅ ์ฐ๊ฒฐ + ์ด๋ฏธ ๋ถ์ ๋ฐฉ๋ ์นด๋ ๋จธ๋ฆฌ์ ๐ ๋ฒํผ์ผ๋ก ์ฎ๊ธด๋ค(ํ์ฅ ํ๋ณด์ AS/MH ํ๊ทธยท#๋ฒํธยท์์ฐจ์ผ์ด ๋ฌ๋ค). ๊ธฐ์กด ํ์ฅ ๊ฒ์ UI(loadFieldsForLinkยทwlFieldRowHtml)๋ฅผ ๊ทธ๋๋ก ์ฌ์ฌ์ฉํ๋ค.field_no=null์ด๋ฉด ์ฐ๊ฒฐ ํด์ . ๐๋ฐ๋ชฌ ๋ฏธ๋ฌ upsert ๋field_no์ปฌ๋ผ์ ์ ๊ฑด๋๋ฆฌ๋ฏ๋ก ์ด ์ฐ๊ฒฐ์ 30์ด ๋๊ธฐํ์๋ ์ด์๋จ๋๋ค. - โข ์นดํก๋ฐฉ์ด ์์ด๋ ใ๐ค ๊ฒ์ ์น์ธใ โ ์ํ์
์น์ธ์ถ๊ฐ(๋๊ธฐ/์น์ธ/๋ฐ์/์ ์ธ). ๋ฐฉ์ด ์์ผ๋ฉด ๊ฑฐ์ ํ์ง ์๊ณ ์น์ธ๋ง ๊ฑธ์ด ๋๊ณ , ๋ฐฉ์ด ์ฐ๊ฒฐ๋๋ ์๊ฐ ๊ทธ ํ์ฅ์ ์น์ธ๋ถ์ด ๊ทธ๋๋ก ๊ฒ์๊ธ ๋ช ๋ น ํ๋ก ๋๊ฐ๋ค(link_board_room์ด_publish_row๋ฅผ ๋๋ค). ๊ฒ์๊ธ๋ก ๋๊ฐ๋ ๋ฌธ์_publish_rowํ๋๋ฟ์ด๋ค. - ๐ด๋ณธ๊ฑด ๊ท์น์ ๋ถ์์ฉ์ ๊ทธ ์๋ฆฌ์์ ์ก์๋ค โ ใ๋ณธ๊ฑด์ ์๋ฃ ยท ์งํ์ค์ธ ๊ฑด ASใ์ธ ํ์ฅ(SGCยท๊ธ๊ฐ)์์ ๋ฐฉ์ด ์๋ฃ ํ์ฅ์ ๋ถ์
์นด๋๊ฐ ์์ ์ ๋ง๋ค์ด์ ธ ๊ฒ์๊ธ์ด ํ๋ฉด์์ ์ฌ๋ผ์ก๋ค(๋ฏธ์ฐ๊ฒฐ์ผ ๋ ํ๋จ ๊ทธ๋ฃน์๋ผ๋ ๋ณด์๋ค = ํ๊ท).
โ ๊ฒ์๊ธ ๋ฐฉ์ด ๋ถ์ด ์์ผ๋ฉด ์๋ฃ ํ์ฅ์ด์ด๋ ์นด๋๋ ๋ง๋ ๋ค(๋ด์ฉ ํ์ ๊ท์น ใ์๋ฃ=๋ฏธ์ถ๊ณ ยท์ ๊ท๋งใ์ ๊ทธ๋๋ก).
์นด๋๊ฐ ์์ด์ผ ๐ ๋ฒํผ์ผ๋ก ์ฎ๊ธธ ์ ์๋ค. ์นด๋
room_name๋ ๊ฑฐ๋ฅด๊ธฐ ์ ๋ฐฉ ๋ชฉ๋ก์์ ๋ฝ๋๋ค. - ๊ฒ์ฆ =
_fusion_post_check.pyํ ์คํธ 42 ALL PASS(๋ฐฉ ์์ด ์น์ธ โ ๋ฐฉ ์ฐ๊ฒฐ โ ์๋ ๊ฒ์ โ ๋ฐ์ํ ์ ๊ธ โ ์ฐ๊ฒฐ ํด์ ์์๋ณต๊ตฌ ์ ๊ตฌ๊ฐ ์๋ณต) ยท ์ด์ 17 ALL PASS(์ฝ๊ธฐ ์ ์ฉ) ยท ๊ธฐ์กด ํ๊ท 38 ALL PASS ยท ์ฝ์ ์ค๋ฅ 0 ยท ์ฌ์ดํธ๋งต ๊ทธ๋ฃน8ยทํ์ด์ง54ยท๋ฏธ๋ฐ์ 0. ์ด์ ์ก์ = ๊ฒ์ ์น์ธ 2 ยท ์นดํก ๊ฒ์ 1 ยท ํ์ฅ ์ฐ๊ฒฐ 3 ยท ๋ฐฉ ์ด๋ 3 ๋ฒํผ ๋ ๋, ์ฐ๊ฒฐ ๋ฐ์ค ๊ฒ์ ใ์ฉ๋๋ใ โ AS #2164ยทAS #2151ยทMH #2129. - โณํํ = ์ด์์์ ํ๋จ 2๊ฐ โ ๋กฏ๋ฐ๊ฑด์ค ํ์ฑ ํฅ๋จ(ํฌ์ธ) ๋ฐฉ์ #2134 ์ ๐ ์ฐ๊ฒฐ โกSGCยท๊ธ๊ฐ ๊ฒ์๊ธ์ ์๋ฃ๋ ๋ณธ๊ฑด(#2129ยท#2142)์ ๋์ง, ์งํ์ค AS(#2164ยท#2163)๋ก ์ฎ๊ธธ์ง โ ์นด๋ ๋จธ๋ฆฌ ๐ ๋ฒํผ์ผ๋ก ๋ฐ๊พผ๋ค.
โ 1-3์ฐจ (๊ฐ์ ๋ ) โ ์๋ฃ ํ์ฅ๋ ์ฐ๊ฒฐ๋ AS ๊ฐ ์งํ์ค์ด๋ฉด ์ด๋ฆฐ๋ค
[ํํ] "์๋ฃ ํ์ฅ๋ AS๊ฐ ๋ฐ์ ๋ฐ ๋ณธ๊ฑด๊ณผ ์ฐ๊ฒฐ์ฒ๋ฆฌ ๋์ด ์์ผ๋ฉด ์ง๊ธ ์ฒ๋ฆฌํ ๊ฒ์ฒ๋ผ ๋ฐฉ ํ์ฑํํ๊ธฐ." + ๊ทธ๋ฆด๋ง ํ์ธ.
๋ฐฐํฌ = master 628a15f โ deploy-live af128b5.
- ๊ทธ๋ฆด๋ง 3๋ฌธ ํ์ = โ ํ์ฑํ ๋ฒ์ = ์งํ์ค์ฒ๋ผ ์ ๋ถ(๊ฒ์๊ธ ์ ๋ฌธ + ์ฝ๋ ์ ๋ฆฌ ๋์), ๋จ ์ถ๊ณ ์๋ฃ๋ถ์ ์ ํ ๊ทธ๋ฃน
โกํ์ =
field.parent_field_no+ ๊ทธ AS ๊ฐ ์งํ์ค('20') โข๋ณธ๊ฑด ์นด๋์ AS ์งํ์ค ๋ฐฐ์ง. - ๐์ถฉ๋์ ํ ๊ณณ๋ฟ์ด์๋ค = 26.8.7 ใ์๋ฃ ํ์ฅ์ ๋ฏธ์ถ๊ณ ยท์ด๋ฒ์ฃผ ์ ๊ท๋งใ(
filtered). ์ด๋ฆฐ ํ์ฅ๋ง ๊ทธ ๊ท์น์ ๋ฉด์ ํ๋ค (revived = (st=='30' and AS ์งํ์ค ์์)โfiltered = (st=='30' and not revived)). ๋๋จธ์ง ๊ท์น(๋ณธ๊ฑด ์ฐ์ ๋งค์นญยท๋ฐฉ ์์ผ๋ฉด ์นด๋ ์์ฑ)์ ๊ฐ์ ๋ฐฉํฅ์ด๋ผ ์ถฉ๋ ์๋ค. - ์ค์ธก ๊ทผ๊ฑฐ = ASโ๋ณธ๊ฑด ์ฐ๊ฒฐ์
field.parent_field_no์ ์ง์ง ์๋ค(#2151ยท#2164โ2129 ยท #2163โ2142). ๋จ AS 1,040๊ฑด ์ค parent ๊ฐ ์๋ ๊ฑด 30๊ฑด(2.9%), ์งํ์ค AS ๋ 4๊ฑด โ ๊ท์น ์ฌ์ ๊ฑฐ๋ฆฌ๊ฐ ์ข๋ค. ใ์๋ฃ ๋ณธ๊ฑด์ธ๋ฐ ๋๋ช AS ์งํ์คใ = 2๊ฑด(SGCยท๊ธ๊ฐ) = ์ ํํ ์ด ์ผ์ด์ค. AS ๊ฐ ๋๋๋ฉด ์์ฐํ ๋ค์ ์ ํ๋ค(์ํ ํ๋๊ทธ๊ฐ ์๋๋ผ ๊ณ์ฐ๊ฐ). - ์ด๋ฆฐ ํ์ฅ์ ์ ๋ ฌ๋ ์งํ์ค ๊ธ์ผ๋ก ์ฌ๋ฆฐ๋ค(๋งจ ์๋๋ฉด ์ด๋ฆฐ ์๋ฏธ๊ฐ ์๋ค). ์ํ ๋ผ๋ฒจ์ ใ์๋ฃใ ๊ทธ๋๋ก ๋๊ณ ๋ฐฐ์งยท์๋ด๋ฌธ์ผ๋ก ๊ตฌ๋ถ.
- ๊ฒ์๊ธ ์ถ๊ณ ์๋ฃ๋ถ์ ์ ํ ๊ทธ๋ฃน(
fs-done) โ ์ ์นด๋ ๊ณตํต. ์ด๋ฆฐ ํ์ฅ์ ๊ฒ์๊ธ์ด ํต์งธ๋ก ๊ธธ์ด์ง๋ค. - ๊ฒ์ฆ = ์ด์ ์ค์ธก #2142 ๊ฒ์๊ธ 34ํ ยท #2129 21ํ์ด ๋์ด์๋ฌ๋ค(์ง์ 0ํ). AS ๋ฐฐ์ง 2 ยท ์ด๋ฆผ ์๋ด๋ฌธ 2 ยท
์ถ๊ณ ์๋ฃ ใ8๊ฑด(์จ๊น)ใ ์ ํ โ ํผ์น๋ฉด 8ํ ยท ์ฝ์ ์ค๋ฅ 0.
_fusion_post_checkํ ์คํธ 45 ยท ์ด์ 20 ALL PASS, ๊ธฐ์กด ํ๊ท 38 ALL PASS, ์ฌ์ดํธ๋งต ๊ทธ๋ฃน8ยทํ์ด์ง54ยท๋ฏธ๋ฐ์ 0. โ ๊ฒ์ฆ ์ค ํญ์ ์ฐธ์ด ๋๋ ๊ฐ์ง ์ฒดํฌ๋ฅผ ํ๋ ๋ฃ์๋ค๊ฐ ์ก์๋ค(sites.index(x) < len(...)+len(sites)) โ ใ์ด๋ฆฐ ํ์ฅ์ด ์ ์ด๋ฆฐ ์๋ฃํ์ฅ๋ณด๋ค ์ใ์ด๋ผ๋ ์ค์ ์กฐ๊ฑด์ผ๋ก ๊ต์ฒด.
โ 3์ฐจ (2026-08-21) โ ์์(5๋ถ)ยท์ฃผ๊ธฐ(30๋ถ) ์์ง ์์ํ + ํตํ 143๊ฑด ํ์ + ํ์ฅ๋ณ ๋ฐ์ ์๋ฃ
2์ฐจ โณใํํ๊ฐ ํฐ์ ๊ฝ์ ์ค์ผ ํตํ๊ฐ ๋ค์ด์จ๋คใ๊ฐ ํด์(๋ฌด์ adb ์ ์ํฌํธ ์๋ํ์). ํตํ 143๊ฑด ์ ์ฌ โ
autolink 27๊ฑด ์ฐ๊ฒฐ โ ์ ๋ฆฌ๋ณธ 19ํ. PFS ์ ํ์ฝ๋ ๋ณ๊ฒฝ 0 โ deploy-live ์์(๋ฐ์ดํฐ ๋ฐ์์ด ๊ณง ์ด์ ๋ฐ์).
๊ฒ์ฆ = ์ด์ ํตํฉํ์ฅ ํญ ๋ ๋ยท์ฝ์ 0. ์๋ฌธยท๋ฏธ๊ฒฐ(๋ฌด์ adb Wi-Fi ์ข
์ / ๋ถ๋ฅ ํ์ฅ๋ช
ํ์ง) โ
projects/talklog/handoff.md NOW 2026-08-21 ยท projects/talklog/rules.md ๐.
โ 2์ฐจ (2026-08-19) โ Groq ์ ์ฌ + ํ์๋ถ๋ฆฌ ยท adb ์ฆ์์์ง ยท 30๋ถ ๋ฐฐ์น ์๋ฃ
์ปค๋ฐ = talklog 7202a6c. PFS ์ ํ์ฝ๋ ๋ณ๊ฒฝ 0 โ ์ด์๋ฐฐํฌ ์์(1์ฐจ๊ฐ ๋ง๋ call_transcript.segs APIยทํ๋ฉด์
๊ทธ๋๋ก ์ฑ์ฐ๋ ์์
์ด๋ผ ์๋ฒ ์ชฝ์ ๊ณ ์น ๊ฒ ์๋ค). ์ฌ์ดํธ๋งต ๊ทธ๋ฃน8ยทํ์ด์ง54ยท๋ฏธ๋ฐ์ 2 = ์ ๋ถ ๋จ์ ์ธ์
๊ฒ(AL๋ฐ์ฃผ์).
โ ์ฐฉ์ ์ ์ค์ธก ๋ฒค์น (ํํ ์ง์ โ ์คํตํ 5๊ฑด ยท server/_bench_stt_diar.py)
| ํญ๋ชฉ | ๊ฒฐ๊ณผ |
|---|---|
| Groq ์ ์ฌ ์๋ | 5๋ถ ํตํ 1.4์ด(์ค์๊ฐ 210๋ฐฐ) ยท 1๋ถ ํตํ 1.0~1.4์ด. ๋ณํ(ffmpeg) 0.1~0.8์ด |
| ์ ์ฌ ํ์ง | ๋ก์ปฌ medium ๋๋น ๋ฌธ์ ์ ์ฌ๋ 0.83~0.90(๊ธ์์๋ ๋น์ท) ยท ๋ฌด๋ฃ |
| ํ์๋ถ๋ฆฌ ์๋ | RTF 0.05(1๋ถ ํตํ 0.8์ด, ์ ๋ ๋ก์ปฌยท๋ฌด๋ฃ) |
| ํ์๋ถ๋ฆฌ ์ ํ๋ | 88.0%(์ ๋ต ๋ผ๋ฒจ 4ํตํ 98์ธ๊ทธ๋จผํธ ๋๋น, 2๋ผ๋ฒจ ์ต์ ๋์) |
- ๐sherpa ๊ธฐ๋ณธ ํ์ดํ๋ผ์ธ์ ์ ์ด๋ค โ ๊ทธ์ชฝ์ ์๊ธฐ segmentation(10์ด ์ฐฝ) ๊ฒฝ๊ณ๋ก ์๋ฒ ๋ฉ์ ๋ฝ์ 76.2%. Groq ์ด ์ค ๋ฐํ ๊ฒฝ๊ณ๋ก ์๋ผ ๋ฐํ๋น ์๋ฒ ๋ฉ 1๊ฐ๋ฅผ ๋ฝ์ผ๋ฉด 88.0%. ์ฝ์ฌ์ธ 2-means, ์ค์ฌ์ ์ 1์ด ์ด์ ๋ฐํ๋ก๋ง.
- ์๋ฒ ๋ฉ ๋ชจ๋ธ = 3dspeaker campplus(zh_en). wespeaker voxceleb CAM++ ๋ ๊ฐ์ ์กฐ๊ฑด์์ 64.7% ๋ก ํ์ฐํ ๋์๋ค.
- โ๊ณ ์ญ ์๋์ง๋ก ใ๋ด ๋ง์ดํฌ vs ํต์ ๋งใ์ ๊ฐ๋ฅด๋ ๊ฑด ์ ๋๋ค(62.2% = ๋ค์๊ฒฐ ์์ค) โ ๋ น์์ด ํตํ ์คํธ๋ฆผ์ด๋ผ ์์ชฝ ๋ค ์ ํ ๋์ญ์ด๋ค. ๋ชจ๋ ธ 1์ฑ๋์ด๋ผ ์ฑ๋ ๋ถ๋ฆฌ๋ ๋ถ๊ฐ.
- ํธ์ฐจ = ํตํ๋ณ 66.7%(์๋์ฐ์ ยท ๋ฐํ๊ฐ 1~2์ด๋ก ์๊ฒ ์ชผ๊ฐ์ง ๊ฑด) ~ 95.7%. ์งง์ ๋ง์ฅ๊ตฌ๊ฐ ์ฝ์ . ํ๋ผ๋ฏธํฐ ์ค์(๊ฐ์ฅ์๋ฆฌ ํธ๋ฆผยท์ค์ฌ์ ์ต์๊ธธ์ดยท๊ต๋ ์ฌ์ ํ๋ฅ )์ ์ ๋ถ ยฑ1pp ๋ผ ๋ ์ ๋ง์ก๋ค.
โก ๋ง๋ ๊ฒ
server/stt_groq.py์ ์ค =transcribe(m4a) โ (ํ๋ฌธ, [{s,e,spk,text}]). Groq ์คํจ๋ ์์ธ๋ก ์ฌ๋ ค ๊ธฐ์กด faster-whisper medium ์ผ๋ก ํด๋ฐฑ(์๋ณธ m4a ๋ ์ ์ฌ ํ ์ง์์ง๋ฏ๋ก ์ฌ๊ธฐ์ ๋์น๋ฉด ์์ ๋ชป ์ด๋ฆฐ๋ค). ํ์๋ถ๋ฆฌ๋ง ์คํจํ๋ฉด ์ผํค๊ณ ํ๋ฌธยท์๊ฐ์ ์ด๋ฆฐ๋ค.pipeline_worker= ์ ์ฌ 1์์๋ฅผ Groq ๋ก. segs ๋data/calls/transcripts_segs/<audio>.json. ๐ใ๋/์๋ใ ๋ผ๋ฒจ์ ๋ถ๋ฅ LLM ์ด ๊ณ ๋ฅธme๋ก ๋ฎ์ด์ด๋ค โ ๋ถ๋ฅ๊ฐ ์ด์ฐจํผ ์ ์ฌ๋ฌธ์ ๋ค ์ฝ์ผ๋ฏ๋ก API ์๋ณต ์ฆ๊ฐ 0._classify_system.txt์meํ๋ ๊ท์ ์ถ๊ฐ(๋จ์ = ์๋๋ ๋๋ฅผ ใ์ ์ฐจ์ฅยท์ฐจ์ฅ๋ใ์ด๋ผ ๋ถ๋ฅธ๋ค).fusion_post= segs ๋ฅผtranscript/sync์ ์ค์ด ์ฌ๋ฆฐ๋ค(์๋ฒ upsert ๊ฐCOALESCE๋ผ ์ ํตํ ๋ฎ์ด์ฐ๊ธฐ ์์).- ๐ดํ์ฅ๋ณ ใ์
๋ ฅ ์ง๋ฌธใ ๋ณํ ๊ฒ์ดํธ ์ ์ค(
data/_fusion_state.json) โ 30๋ถ๋ง๋ค ๋๋๋ฐ ์ด๊ฒ ์์ผ๋ฉด โ ์ฌ๋ฃ๊ฐ ๊ทธ๋๋ก์ธ๋ฐ ๋ชจ๋ธ์ ๊ณ์ ๋ถ๋ฅด๊ณ โก๋ชจ๋ธ์ด ๊ฐ์ ์ฌ์ค์ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ์จ์fp๊ฐ ๋ฐ๋๋ฉด ์ฌ๋์ด ์ด๋ฏธ ใ์ ์ธใํ ํ์ด ์ ใ๋๊ธฐใ ํ์ผ๋ก ๋์ด์๋๋ค(put_fusion_post๋ ์ ํ์ ์๋ ํ์ ์ง์ด๋ค). ์ค์ธก = 1ํ์ฐจ 14์ดยท๋ชจ๋ธ 2ํ โ 2ํ์ฐจ 2์ดยท๋ชจ๋ธ 0ํ(unchanged: 2).--force๋ก ๋ฌด์ ๊ฐ๋ฅ. server/run_fusion30.py+.vbs= โ ์์ง์๋ฒ(8792) ์๊ฐ๊ธฐ๋ โกadb ์ญํฐ๋ยท์ฆ์์์ง ํธ๋ฆฌ๊ฑฐ โข์ ๋ฆฌ๋ณธ ์์ฑ. ์์ฝ์์PFS-Fusion-30m(30๋ถ ์ฃผ๊ธฐ,wscript.exe์จ๊น ์คํ). ๊ฐ์ ์คํ ์ค์ธก rc=0.
โข ๐ด ์ด ๊ธฐ๋ฅ์ ์ง์ง ๋ณ๋ชฉ์ ์ฐพ์๋ค โ ํตํ ์์ง์ด 8/12๋ถํฐ ๋ฉ์ถฐ ์๋ค
- ์์ง์๋ฒ
talklog_server(8792) ๊ฐ ์ฃฝ์ด ์์๋ค. ์ผ๊ฐ ํ์ดํ๋ผ์ธ(PFS-Night-Worklog02:00)์ ๋งค์ผ ์ ์ ์คํ๋์ง๋ง ์ ํ์ผ์ด 0๊ฑด์ด๋ผ ์กฐ์ฉํ ์๋ฌด๊ฒ๋ ์ ํ๋ค โ ์คํจ ๋ก๊ทธ๋ ์ ๋จ๋๋ค. 30๋ถ ๋ฐฐ์น๊ฐ ์ด์ ์๊ฐ๊ธฐ๋ํ๋ค. - ๋
น์ ํฐ์ด PC ๋ฅผ ๋ชป ์ฐพ๋๋ค. ์ฑ ํ๋ณด(
Config.FALLBACKS)๋ Tailscale100.108.234.45์192.168.45.2๋ฟ์ธ๋ฐ, ํฐ์ Tailscale ์ด ์๊ณ ์ด PC ์ ์ค์ LAN IP ๋ 192.168.45.48 ์ด๋ค โ ๋ ๋ค ์คํจ(server_unreachable). โ ๋ฐฐ์น๊ฐadb reverse tcp:8792๋ก ์ญํฐ๋์ ๊น๊ณsetserver http://127.0.0.1:8792๋ฅผ ๋ฃ๋๋ค(์ฑ ์์ 0). - โ ์ง๊ธ USB ๋ก ๋ถ์ด ์๋ ํฐ์ poin-agent ์ฉ ๋
ธํธ20(SM-N981N)์ด๊ณ ๊ฑฐ๊ธฐ์ talklog ์ฑ์ด ์๋ค.
am broadcast๋ ๋ฐ๋ ์ฑ์ด ์์ด๋result=0์ผ๋ก ์ฑ๊ณตํ๋ค = ์๋ฑํ ํฐ์ ๋๋๋ฆฌ๋ฉฐ ใํธ๋ฆฌ๊ฑฐ OKใ๋ก ์ฐํ๋ค. โ ๋ฐฐ์น๊ฐpm list packages๋ก ์ฑ์ด ๊น๋ฆฐ ํฐ์ ๊ณจ๋ผ์ ๋๋๋ฆฌ๊ณ , ์์ผ๋ฉด ๊ทธ๋ ๋ค๊ณ ๋ก๊ทธ์ ์ ๋๋ค. ๋ น์ ํฐ(๊ฐค๋ญ์ S25 Edge100.106.4.88)์ Tailscale 6์ผ์งธ offline.
โฃ ๊ฒ์ฆ
- ์ ์ค
talklog/server/_stt_check.pyโ ๋ก์ง 11 PASS(๋ผ๋ฒจ ๋ค์ง๊ธฐยท๋ฏธ๋ฐฐ์ ๋ณด์กดยท๋ณ์นญ ๊ธ์งยทํ์ฑ) ยท ์ค์ ์ฌ+๋ผ๋ฒจ+PFS ์๋ณต 19 PASS(Groq 1.9์ด โ segs 28๊ฐ โ ๋ถ๋ฅmeโ ๋/์๋ โ ํ ์คํธ PFS ์ ๋ก๋ โ ๋ทฐ์ด API ๋ก ๋ค์ ์ฝ์ด 28๊ฐ ๋์กฐ โ segs ์์ด ์ฌ์ ๋ก๋ํด๋ ๋ณด์กด โ ์์๋ณต๊ตฌ). - ๐ํ
์คํธ PFS ์ ํตํ ํญ๋ชฉ์ด 0๊ฑด์ด๋ผ ์ ์ฌ ๋ทฐ์ด ๊ฒฝ๋ก๊ฐ ํต์งธ๋ก ๋ฏธ๊ฒ์ฆ์ด์๋ค(1์ฐจ์์ ๋ผ์ฐํธ ๋ฒ๊ทธ๊ฐ ์ด์์์
์ฒ์ ํฐ์ง ์ด์ ).
pfs/scripts/_stt_seed_test.py๋ก ํ ์คํธ RDS ์ ํตํ ํญ๋ชฉ์ ์ฌ๊ณ ๊ฒ์ฆ ํ ์ง์ ๋ค. - ์ก์(ํ
์คํธ PFS) = ์ ์ฌ ๋ชจ๋ฌ์
00:00 ๋ / 00:01 ์๋ โฆ28ํ + ๊ทผ๊ฑฐ ํ๊ด 1๊ฑด ๋ ๋. ์ฝ์ ์ค๋ฅ 0. - ํ๊ท =
_fusion_post_check.py--logicยทtestยทprod ์ ๋ถ ALL PASS ยท_worklog_fusion_check.pytestยทprod ALL PASS. โ ์ด์ ํ๊ท 2๊ฑด์ด FAIL ๋ก ๋ ์๋ ๊ฑธ ์ก์๋ค โ ใ์๋ฃ ์นด๋๋ ์ ๋ถ filteredใ๋ผ๋ ๊ฒ์ฌ๊ฐ 1-3์ฐจ์ ์ด๋ฆฐ ํ์ฅ(revived) ๊ท์น๊ณผ ์ ๋ฉด์ผ๋ก ์ด๊ธ๋๋ค(#2142ยท#2129). ์ ํ์ด ์๋๋ผ ๊ฒ์ฌ๋ฅผ ๊ท์น์ ๋ง์ท๋ค (์ ์ด๋ฆฐ ์๋ฃ / ์ด๋ฆฐ ์๋ฃ๋ฅผ ๊ฐ๋ผ์ ๋ณธ๋ค). ๋ด ๋ณ๊ฒฝ์ PFS ์ ํ์ฝ๋๋ฅผ ์ ๊ฑด๋๋ ธ๋ค.
โค โณ ๋จ์ ๊ฒ
- ํํ ๋ชซ = โ ๋ น์ ํฐ(S25 Edge)์ ์ด PC ์ USB ๋ก ๊ฝ๊ฑฐ๋ Tailscale ์ ์ผ ์ค๋ค โ ๊ทธ๋์ผ ํตํ๊ฐ ๋ค์ ๋ค์ด์จ๋ค. ๊ฝํ๋ฉด 30๋ถ ๋ฐฐ์น๊ฐ ์์์ ์ญํฐ๋ยท์์งํ๋ค. โก๋กฏ๋ฐ๊ฑด์ค ํ์ฑ ํฅ๋จ(ํฌ์ธ) ๋ฐฉ ๐ ์ฐ๊ฒฐ(๊ท์น 64์ ์ด๋ผ ์๋ ๋ถ๊ฐ) โขSGCยท๊ธ๊ฐ ๊ฒ์๊ธ์ ์๋ฃ ๋ณธ๊ฑด(#2129ยท#2142)์ ๋์ง ์งํ์ค AS(#2164ยท#2163)๋ก ์ฎ๊ธธ์ง.
- (์ ํยท๋ฏธ์ฐฉ์) ๋ฐฉ๋ณ ใ์ฌ์ ์ ์ฒด์น์ธใ ์ค์์น โ ์ง๊ธ์ ํ๋ง๋ค ์ฌ๋์ด ๋๋ฅธ๋ค.
- ์ ๊ท ํตํ๊ฐ ์ค์ ๋ก ๋ค์ด์ค๋ฉด ํ์ ๋ผ๋ฒจ ์ ํ๋๋ฅผ ์ด์ ๋ฐ์ดํฐ๋ก ์ฌ์ธก์ ํ๋ค(์ง๊ธ 88%๋ 8์ ํตํ 4๊ฑด ๊ธฐ์ค).
์ง๊ธ์ ๋ฐฐ์น๋ฅผ ์์ผ๋ก ๋๋ฆฐ๋ค(
PYTHONUTF8=1 python C:/dev/talklog/server/fusion_post.py --live --active-only). ๋ฐฉ๋ณ ใ์ฌ์ ์ ์ฒด์น์ธใ ์ค์์น๋ 2์ฐจ โ 1์ฐจ๋ ํ๋ง๋ค ์ฌ๋์ด ๋๋ฅธ๋ค.
๐ NOW (2026-08-19 ยท 3์ฐจ) โ ๊ฒฌ์ v2 ๊ทธ๋ฃน ์๊ณ ์ค์๊ฐ ๊ฐฑ์ + ์ถ๋ ฅ ๋ด๋น์์นธ ์ง์ฑ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] QA(qa_helper, /estimate/modify-v2/749) 2๊ฑด = โ ใ310,000์ ์๊ณ๊ฐ ์ค์ ๊ธ์ก๊ณผ ์ ์ ๋ง๋๋ค. ๊ฒํ ํ
์์ ๋ณด์. ์ด์๋ฐฐํฌ. 749 ๊ฒฌ์ ๊ธฐ์คใ โกใ๊ฒฌ์ ์ ์์
ํ์ผ์์ ๋ด๋น์ ์ด๋ฆ๋ง ๋์ค๊ณ ์ง์ฑ
์ด ๊ฐ์ด ์ ๋์จ๋ค.
๊ธฐ์กด์ ใ์์งํธ ํ์ฅใ์์ผ๋ก ์ด๋ฆ+๋์ด์ฐ๊ธฐ+์ง์ฑ
์ด์๋ค. ์ด๊ฒ๋ ์์ ํ ์ด์๋ฐฐํฌใ.
๋ฐฐํฌ = master 4114abf โ deploy-live 7aab4ad(estimate_regist_v2.js + estimate_dao.py 2ํ์ผ ํฌ์๋,
--detach ์ํฌํธ๋ฆฌ). DB ๋ณ๊ฒฝ 0 ยท 749 ๋ฐ์ดํฐ ๋ฌด๋ณ๊ฒฝ(๊ฒ์ฆ ํ ์ฌ์กฐํ๋ก ํ์ธ).
- ๐โ ์ ๊ทผ๋ณธ์์ธ = ๋ถ๋ถ ๊ฐฑ์ ๋๋ฝ. 749 ๋ ํญ๋ชฉ 4๊ฐ ํฉ 420,000(80,000+200,000+80,000+60,000)์ธ๋ฐ ์๊ณ๋
310,000 ์ผ๋ก ๋ฉ์ถฐ ์์๋ค.
recalcDetailRow()๊ฐ ํ ์ต์ข ํฉ๊ณ + ์ข ํฉํฉ๊ณ๋ง ๊ฐฑ์ ํ๊ณ ๊ทธ๋ฃน ์๊ณ ํ์ ์๋์ง ์์, ๋ง์ง๋งrenderDetailTable()์์ ๊ฐ์ด ๊ทธ๋๋ก ๋จ๋๋ค.updateGroupSubtotal()์ ์ด๋ฏธ ์์์ง๋ง part_mode ํ ๊ธ ํ ๊ฒฝ๋ก์์๋ง ํธ์ถ๋๋ค(๊ทธ๋์ QA ์ฌํ์์ part ํ ๊ธ๋ง ์ ์ผํ๊ฒ ํต๊ณผํ๋ค). โ ํธ์ถ์ 4๊ณณ(์น์/์ฝ๋ ์ ๋ ฅยท์ธ๋ผ์ธ ํธ์งยท๋จ๊ฐ ์๋์กฐํยทSUB ์ฌ๊ณ์ฐ)์ด ์ ๋ถ ์ง๋๋recalcDetailRowํ ๊ณณ์์ ๋ถ๋ฅด๊ฒ ํตํฉํ๊ณ , part_mode ์ชฝ ์ค๋ณต ํธ์ถ์ ์ ๊ฑฐ. - ๐โก์ ๊ทผ๋ณธ์์ธ = SELECT ๋๋ฝ.
_compose_manager()๋ ์ฐธ์กฐ์ธ๋ฌผ ์์ผ๋ฉด ํ์ฅ๋ด๋น์ ์ด๋ฆ+์ง์ฑ ํด๋ฐฑ์ธ๋ฐselect_estimate๊ฐd.position์ ์ ๋ฝ์ pos ๊ฐ ๋ ๋น๊ฐ์ด์๋ค โd.position AS positionํ ์ค ์ถ๊ฐ. 749 ๋ ์ฐธ์กฐ์ธ๋ฌผ ์์ + ํ์ฅ๋ด๋น์ ์์งํธ/๋ํ โ ใ์์งํธใ โ ใ์์งํธ ๋ํใ. ์ฐธ์กฐ์ธ๋ฌผ ๋ณด์ ์ธ์์ ์ ์ฒด 417๋ช ์ค 33๋ช ๋ฟ์ด๋ผ ํด๋ฐฑ ๊ฒฝ๋ก๊ฐ ๋ค์๋ค. ์์ ยทPDFยทHTML ์ด_build_common_headerํ ๊ณณ์ ๊ณต์ ํด ํจ๊ป ๋ณต๊ตฌ. - ๊ฒ์ฆ = ์ ์ค
scripts/_est_grouptot_manager_check.py {test|prod} [๊ฒฌ์ ๋ฒํธ](์ฝ๊ธฐ์ ์ฉ โ ์ ์ฅ ๋ฒํผ ์ ๋๋ฅธ๋ค). ๋ก๋ ์งํยท๋จ๊ฐยท์๋ยท์น์ยท๋ง์งยทpart ํ ๊ธ 6์์ ์์ ํํฉ = ๊ทธ๋ฃน์๊ณ๋ฅผ ๋์กฐํ๊ณ ,print/dataํค๋์ ์ค์ ๋ค์ด๋ก๋ xlsx ์ A8 ์ ๊น์ง ๋ณธ๋ค. ์ด์ ๋ฐฐํฌ ์ 7 FAIL(๋จ๊ฐ/์๋/์น์/๋ง์ง 4๊ฑด + ์ง์ฑ 3๊ฑด) โ ํ ์คํธ 15 ALL PASS โ ์ด์ 15 ALL PASS(749 ์ค์ธก: 420,000โ430,000โ520,000โ700,000โ718,000 ์ ๋ถ ๋๊ธฐ, ์์ ์ข ํฉ!A8 = "์์งํธ ๋ํ"). ์ฝ์ ์๋ฌ 0. โ ํ ์คํธ RDS ์ 749 ํญ๋ชฉ์ด ์์ด ์คํฌ๋ฆฝํธ๊ฐ ํญ๋ชฉ+์ง์ฑ ์๋ ๊ฒฌ์ ์ผ๋ก ์๋ ๋์ฒดํ๋ค(ํ ์คํธ๋ 797 ์ฌ์ฉ). - ์ฌ์ดํธ๋งต ์ฌ๋น๋(๋ฐฐํฌ ํ) = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 54 ยท ๋ฏธ๋ฐ์ 0.
- โณ[ํํ] ์ด์ ์ก์ 1ํ โ 749 ์์ ๋จ๊ฐ/์๋ ๊ณ ์ณ ์๊ณ๊ฐ ์ฆ์ ๋ฐ๋ผ์ค๋์ง ยท ์์ ๋ฐ์ ๋ด๋น์์นธ ใ์์งํธ ๋ํใ.
๐ NOW (2026-08-19 ยท 2์ฐจ) โ ๊ฒฌ์ list-v2 ์ ๊ธ์ฌ๋ถ = ์๋ง๊ฐ ์ด์ ๊ธฐ์ค โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] "pfs ๊ฒฌ์ ์ ์๋ง๊ฐ ์ด์ ๊ธฐ์ค์ผ๋ก estimate/list-v2 ์ ์
๊ธ/๋ฏธ์
๊ธ ์ฌ๋ถ ํ์ ๋ณ๊ฒฝํด์ค. ์ด์๋ฐฐํฌ ์์
."
๋ฐฐํฌ = master d2940ee โ deploy-live 3ed47d7(estimate_dao.py + estimate_list_v2.html 2ํ์ผ ํฌ์๋, --detach ์ํฌํธ๋ฆฌ). DB ๋ณ๊ฒฝ 0.
- ์ฐฉ์ ์ ๊ทธ๋ฆด๋ง 3๋ฌธ โ ํํ ํ์ = โ ํ์ = ํ์ ๊ธ์ก ์์ผ๋ฉด ์
๊ธ ยท ๋ง๊ฐํ๋ง ์์ผ๋ฉด ใ๋ง๊ฐใ ยท ๋ง๊ฐ ์ด์์ ์์ผ๋ฉด ๋ฏธ์
๊ธ(3์ํ)
โก๋งค์นญ = ๊ฒฌ์ ๋ฒํธ ์ฐ์ + ํ์ฅ(field_no) ํด๋ฐฑ โข๊ธฐ์กด ์๋ ํ ๊ธ(
is_deposit)์ด '1' ์ด๋ฉด ๊ทธ๊ฒ ์ฐ์ (ํ ๊ธ ์ ์ง). - ๐๋ฐ๊พผ ์ด์ ์ ์ค์ธก ๊ทผ๊ฑฐ = ์๋ ํ ๊ธ์ ์ฌ์ค์ ์ ์ฐ์ธ๋ค โ ์ด์ ๊ฒฌ์ 640๊ฑด ์ค
is_deposit='1'์ 5๊ฑด(2026๋ 2๊ฑด), ๋ง๊ฐ์ ๊ฑธ๋ฆฐ ๊ฒฌ์ 12๊ฑด์ ์ ๋ถ'0'์ด์๋ค. ๋ฐ๋ฉด ๋ง๊ฐ ์ด์์ 16๊ฑดยท78ํ์ด ์ด๋ฏธ ์ ์๋ค. - ๋งค์นญ ๊ท์น(๋ง๊ฐํ ๋จ์) =
i.estimate_no = a.estimate_noOR (i.estimate_no IS NULL AND i.field_no = a.field_no). ๋ง๊ฐํ์ด ๋ค๋ฅธ ๊ฒฌ์ ์ ๋ช ์ํ๊ณ ์์ผ๋ฉด ํ์ฅ ํด๋ฐฑ์ผ๋ก ๋์ด์ค์ง ์๋๋ค. ๋ง๊ฐ 78ํ ์ค 75ํ์ด ๋ถ๋๋ค (์ ๋ถ๋ 3ํ = ๋ฐ๋ ๋ถ์ฐ EDC ยท ์ผ๋ ๋ธ ์คํผ์คํ SH ยท ๋ณ๋ ๋น์ฉ โ ์ ๋ถfield_no์์ฒด๊ฐ ์๋ค). - ์๋ฒ =
select_estimate_search_list์ ์๋ธ์ฟผ๋ฆฌ 2๊ฐ(mc_confirm_cntยทmc_close_ym)๋ง ์ถ๊ฐ. ๋ง๊ฐํ์ด ์์ผ๋ฉดmc_close_ym์ด NULL ์ด๋ผ ใ๋ง๊ฐ/๋ฏธ์ ๊ธใ์ด ์ด๊ฑธ๋ก ๊ฐ๋ฆฐ๋ค(ํ์ ์ธ๋ ์ธ ๋ฒ์งธ ์๋ธ์ฟผ๋ฆฌ๋ ๋ถํ์). โ ์ง๊ณ๋COUNTยทMAX๋ง โSUM()์ Decimal ์ด ๋ผ jsonify 500(๋ง๊ฐ ๊ธฐ๋ฅ ๊ธฐ์กด ํจ์ ). - ํ๋ฉด = ํ์ ์ด
depositBtnHtml()ํ ๊ณณ. ์ = ์ ๊ธbtn-infoยท ๋ง๊ฐbtn-warningยท ๋ฏธ์ ๊ธbtn-danger, ํดํ์ ํ์ ๊ทผ๊ฑฐ(ใ2026-07 ๋ง๊ฐ ยท ํ์ ๊ธ์ก ๋ฐ์ใ / ใ2026-07 ๋ง๊ฐํ ํฌํจ ยท ํ์ ๊ธ์ก ๋ฏธ๊ธฐ์ฌใ / ใ์๋ ์ ๊ธ ํ์ใ). ํ ๊ธ์ ๊ทธ๋๋ก โ ๋๋ฉด ๋ง๊ฐ ๊ธฐ์ค ํ์๋ก ๋๋์๊ฐ๋ค(๋ฒํผ์ ํต์งธ๋ก ๋ค์ ๊ทธ๋ฆฐ๋ค. ์ข ์ ์ฒ๋ผ ํ ์คํธ๋ง ๊ฐ๋ฉด ใ๋ฏธ์ ๊ธใ์ผ๋ก ๊ตณ๋๋ค). - ๊ฒ์ฆ = ์ ์ค
scripts/_deposit_mark_check.py {test|prod}. ์ ํ์ ๋ผ๋ฒจยท์ยทํดํ์ ์๋ฒ ์์๋ฃ๋ก ์ฌ๊ณ์ฐํด ๋์กฐํ๋ค. ์ด์ ๋ฐฐํฌ ์ 2 FAIL โ ํ ์คํธ 12 ALL PASS(ํ ๊ธ ์๋ณต ๋ง๊ฐโ์ ๊ธโ๋ง๊ฐ ์ค๊ฒ์ฆ) โ ์ด์ 9 ALL PASS(์ด์์ ์ฐ๊ธฐ ์์ด ์ฝ๊ธฐ ์ ์ฉ). ์ด์ ๊ธฐ๋ณธ ๋ชฉ๋ก 36ํ ๋ถํฌ = ์ ๊ธ 13 ยท ๋ง๊ฐ 2 ยท ๋ฏธ์ ๊ธ 21, ์ ๋(627ํ) ๊ธฐ์ค = ์ ๊ธ 16 ยท ๋ง๊ฐ 4. ์ฝ์ ์๋ฌ 0. SQL ๋จ๋ ๊ฒ์ฆ =scripts/_deposit_mc_sql_probe.py(SSM). - โ ์ ๊ฒฌ์ ์ ใ๋ง๊ฐใ์ด ๋ถ๋ ๊ฑด ์ค๋ฅ๊ฐ ์๋๋ค โ ๋ฅ์์ค 1~4์ ๋ง๊ฐํ๋ ๋ฏธํ์ ํ์ฅ์ ๋งค๋ฌ ์ด์ํด ๋ฐ๋ณต ๊ธฐ์ฌํ๋ค.
์ค์ ๋ก
๋ถ๋นํํฌ๋ทฐ(๊ฒฌ์ 565ยท2022๋ )ยท์ฉ์ธ ์ง์ฐ๋ง์(594ยท2023๋ )์ด 2026-01~04 ๋ง๊ฐํ์ ๊ทธ๋๋ก ์ด์ ์์ด ใ๋ง๊ฐใ์ผ๋ก ๋ฌ๋ค. - โณ[ํํ] ์ด์ ์ก์ 1ํ โ ๊ฒฌ์ ์ ๋ชฉ๋ก์์ ๋
ธ๋ ใ๋ง๊ฐใ ๋ฐฐ์ง์ ํดํ ํ์ธ. ์/๋ฌธ๊ตฌ ๋ฐ๊พธ๋ ค๋ฉด
depositBtnHtml()ํ ๊ณณ.
๐ NOW (2026-08-19) โ AL๋ฐ์ฃผ์ ๋๋กญ๋ฆฌ์คํธ ๊ทผ๋ณธ์์ + ํ์ฅ๋ช ๋๋กญ๋ฆฌ์คํธ ์ ์ค โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] QA(qa_helper, /field/al-orderpaper ํ๋ช
์นธ) = "๋๋กญ๋ฆฌ์คํธ๊ฐ ์ ๋๋ก ์๋ ์๋๋ค. ํ๋ ์์ ๊ฐํ์ ์กฐ๊ธ๋ง
์์ง์ฌ๋ ๋ชจ๋ฌ์ด ๋ซํ๋ ํ์์ด ๋น๋ฒ. ๊ฐ์ด๋ฐ ํ ๋ ์ ๋๋ก ์๋ ์๋จ. ๋ณด์ด๋ ๋์ด๋ 2๋ฐฐ๋ก. ์์ ํ ์ด์๋ฐฐํฌ."
+ ์ถ๊ฐ = "ํ์ฌ ํ์ด์ง ๋ค๋ฅธ ๋๋กญ๋ฐ์ค๋ค๋ ๋์ผ ๋ฌธ์ โ ๋ชจ๋ ์์ ๋ณด์" + "ํ์ฅ๋ช
๋๋กญ๋ฆฌ์คํธ๋ฅผ ๊ฒฌ์ ์ ํ์ฅ๊ฒ์
๋ฆฌ์คํธ ๊ธฐ์ค์ผ๋ก".
๋ฐฐํฌ = master de0ba09 โ deploy-live ec2c87a(al_orderpaper.js + field_al_orderpaper.html 2ํ์ผ ํฌ์๋). DB ๋ณ๊ฒฝ 0.
- ๐๊ทผ๋ณธ์์ธ 1์ค =
window.addEventListener('scroll', closeCombo, true). ์บก์ฒ๋ผ ๋๋กญ๋ฆฌ์คํธ ์์ ์ ์คํฌ๋กค๊น์ง ์ก์ ํ ํ ์นธ์ ๋ซํ๊ณ (=ใํ ์ ๋จใ), ๊ทธ๋ฆฌ๋overflow-x๋ํผ์ ๊ฐ๋ก ์คํฌ๋กค๋ ๊ฐ์ด ๊ฑธ๋ ธ๋ค(=ใ์กฐ๊ธ๋ง ์์ง์ฌ๋ ๋ซํใ). โ ๋ซ์ง ๋ง๊ณ ๋ฐ๋ผ๊ฐ๊ฒ(box.contains(e.target)๋ฉด ๋ฌด์, ๋๋จธ์งplaceCombo()์ฌ๋ฐฐ์น + resize). - ใํ๋ ์์ ๊ฐํใ =
position:absolute+pageOffset ์ด๋ผ ํ๋จ ํ์์ ๋ชฉ๋ก์ด ํ๋ฉด ๋ฐ์ผ๋ก ์๋ฆฌ๋ ๊ฒ โfixed(๋ทฐํฌํธ) + ์๋ ๊ณต๊ฐ ์ข์ผ๋ฉด ์๋ก ๋ค์ง๊ธฐ + ๋จ๋ ๊ณต๊ฐ๋งํผ๋ง ๋์ด + ์ข์ฐ ํด๋จํ. - ๋ชฉ๋ก
mousedown๋ฌด์กฐ๊ฑดpreventDefaultโ ์คํฌ๋กค๋ฐ ๋๋๊ทธยท์ฌ๋ฐฑ ํด๋ฆญ์ ํฌ์ปค์ค๊ฐ ๋น ์ ธ blur ๋ก ๋ซํ๋ ๊ฒ๋ ์ฐจ๋จ. - ๋์ด
max-height 242 โ 484px(2๋ฐฐ) +overscroll-behavior:contain(๋์์ ํ์ด์ง๋ก ์ ๋์ด๊ฐ). - ๋๋กญ๋ฐ์ค ์ ๋ถ = ๊ฐ์
attachCombo()ํ ๊ณณ์ด๋ผ ํ๋ช ยท์ ์ฒด๋ช ์ด ํ ์์ ์ผ๋ก ๋ฎ์ธ๋ค(ํญ๋ชฉํ AL/์ ๋ฆฌ์ ์ฒด๋ ๋ค์ดํฐ๋ธ<select>๋ผ ์ ์ด์ ๋ฌด๊ด). - ํ์ฅ๋ช
(
#fSite) ๋๋กญ๋ฆฌ์คํธ ์ ์ค = ๊ฒฌ์ ์ ใํ์ฅ ๊ฒ์ใ๊ณผ ๊ฐ์ APIGET estimate/site-search(์์ฐจ์ผ ์ต๊ทผ 30์ผ ์ดํ ยท ํค์๋ = ํ์ฅ๋ช OR ์ ์ฒด๋ช ยท ์ต๋ 50๊ฑด), 200ms ๋๋ฐ์ด์ค ์๋ฒ์กฐํ.attachCombo(input, getItems, fetchItems)3๋ฒ์งธ ์ธ์ ์ ์ค(๋น๋๊ธฐ ๋ชฉ๋ก) โ ๊ธฐ์กด ๋ ์ฝค๋ณด ๋์ ๋ฌด๋ณ๊ฒฝ. ํด๋ผ ํํฐ๊ฐ ๋ณด์กฐ์ค๋ช (์ ์ฒด๋ช )๊น์ง ๋ณด๊ฒ ๊ณ ์นจ โ ์๋ฒ๊ฐ ์ ์ฒด๋ช ์ผ๋ก ์ฐพ์์ค ํ์ฅ์ด ํ๋ฉด์์ ๊ฑธ๋ฌ์ง๋ ๊ฒ. - ๊ฒ์ฆ = ์ ์ค
scripts/_al_combo_check.py {test|prod}(์ฝ๊ธฐ์ ์ฉ). ๋ฐฐํฌ ์ 8 FAIL โ ํ ์คํธ 19 ALL PASS ยท ์ด์ 19 ALL PASS. ๊ธฐ์กด_al_orderpaper_ui_check.pyํ๊ท = ํ ์คํธยท์ด์ ๊ฐ 27 ALL PASS. ์ฝ์ ์๋ฌ 0. ์ด์ ํ์ฅ ๋ชฉ๋ก 34๊ฑด์ด ๊ฒฌ์ ์ ํ์ฅ๊ฒ์ ๊ฒฐ๊ณผ์ ์์ ์ผ์น. - ์ฌ์ดํธ๋งต ์ฌ๋น๋(๋ฐฐํฌ ํ) = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 54 ยท ๋ฏธ๋ฐ์ 0.
- โณ[ํํ] ์ด์ ์ก์ 1ํ โ ํ์ฅ๋ช ์นธ ํด๋ฆญ(ํ์ฅ ๋ชฉ๋ก) ยท ํ๋ช ์นธ์์ ํ ๋ก ๋ชฉ๋ก ๊ตด๋ฆฌ๊ธฐ ยท ๋งจ ์๋ ํ์์ ๋ชฉ๋ก์ด ์๋ก ๋ค์งํ๋์ง.
๐ NOW (2026-08-18 ยท 3์ฐจ) โ ๊ฒฌ์ v2 ์น์/์ฝ๋ ์นธ ํ ์คํฌ๋กค ๊ฐ์ฆ๊ฐ ์ฐจ๋จ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] QA(qa_helper, /estimate/modify-v2/751 ์น์3 ์
๋ ฅ) = "๋ชจ๋ ์น์์นธ์์ ์คํฌ๋กค๋ก ์ซ์ ์ฆ๊ฐ์ด ๋๋ ๋ฒ๊ทธ๊ฐ
์๋ค. ์น์์
๋ ฅ์นธ์์ ์คํฌ๋กค ์ฌ์ฉ์ ๊ธ์ง๋ค. ์์ ๋ณด์ํด. ์ด์๋ฐฐํฌ."
๋ฐฐํฌ = master 387ba62 โ deploy-live b827551(estimate_regist_v2.js 1ํ์ผ ํฌ์๋ ยท ์์ 7์ค ์ถ๊ฐ). DB ๋ณ๊ฒฝ 0.
- ์์ธ = ์น์/์ฝ๋ ์นธ์ด
<input type="number">๋ผ ํฌ์ปค์ค ์ค ํ = ๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ์ฆ๊ฐ. - ์กฐ์น =
bindEvents()์ ์์ 1์ค.$(document).on('wheel', '.dim-cell, .corner-cell', โฆ)์์this === document.activeElement๋ฉดblur()โ ํฌ์ปค์ค๊ฐ ์์ผ๋ฉด ๊ธฐ๋ณธ ์ฆ๊ฐ์ด ์์ ์ผ์ด๋์ง ์๋๋ค. ๐preventDefault๋ ์ ์ด๋ค = โ ํฌ๋กฌ์ document ์์ wheel ์ passive ๋ก ์ก์ ์ ๋จน๊ณ โก๋จน๋๋ผ๋ ๊ทธ ์นธ ์์์ ํ์ด์ง ์คํฌ๋กค๊น์ง ๋งํ ํ๊ฐ ์ ๊ตด๋ฌ๊ฐ๋ค. - ๐ํ ๊ณณ์ผ๋ก ์ ๋ถ ๋ฎ์ธ๋ค โ ๋ณธ๋ฌธ ํ ยท ์์๊ณ์ฐ๊ธฐ
#calcFrameยท ํญ๋ชฉ๋ชจ๋ฌ#itemModal์ด ๊ฐ์ ํด๋์ค๋ฅผ ์ด๋ค (๋ชจ๋ฌ ์น์์นธ์type="text"๋ผ ๋ฌดํด). ์ฝ๋์นธ๋ ๊ฐ์ ๋ธ๋กยท๊ฐ์ ์ฌ๊ณ ๋ผ ํจ๊ป ๋ง์๋ค. - ๊ฒ์ฆ = ์ ์ค
scripts/_dim_wheel_check.py {test|prod} [๊ฒฌ์ ๋ฒํธ](์ฝ๊ธฐ ์ ์ฉ โ ์ ์ฅ ์ ๋๋ฅธ๋ค). ์ด์ ๋ฐฐํฌ ์ 6 FAIL โ ๋ฐฐํฌ ํ 14๊ฒ์ฌ ALL PASS, ํ ์คํธ ALL PASS(๊ณ์ฐ๊ธฐ ์นธ ๊ธฐ์ค โ ํ ์คํธ RDS ๊ฒฌ์ ์ ํญ๋ชฉ์ด ์๋ค). - ์ฌ์ดํธ๋งต ์ฌ๋น๋(๋ฐฐํฌ ํ) = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 54 ยท ๋ฏธ๋ฐ์ 0.
- โณ[ํํ] ์ด์ ์ก์ โ ์น์์นธ์ ์ปค์ ๋๊ณ ํ ๊ตด๋ ค ๊ฐ์ด ์ ๋ณํ๋์ง(ํฌ์ปค์ค๋ ํ๋ฆฐ๋ค).
๐ NOW (2026-08-18 ยท 2์ฐจ) โ ์๋ง๊ฐ UI: ๋ง๊ฐ์ ์ข์ฐ ํ์ดํ + ์ปฌ๋ผ ํญ ์กฐ์ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] QA = "๋ง๊ฐ์ ์ด๋์ด ๋ถํธํ๋ค. ๊ธฐ์กด ํํ ๊ทธ๋๋ก ์ ์งํ๋ฉด์ ์ข์ฐ ํ์ดํ๋ก ๋์ด๊ฐ ์ ์๊ฒ. ํ์ฅ๋ช ๊ฐ๋กํญ ์ ์ฝ. ์๋ฃ/์ฒญ๊ตฌ์ผ ๊ฐ๋กํญ ์ฆ๊ฐ. ์ด์ ๋ฐฐํฌ."
๋ฐฐํฌ = master b60787d โ deploy-live a8d8f30(ํ
ํ๋ฆฟ 1ํ์ผ ํฌ์๋). DB ๋ณ๊ฒฝ 0.
mcShiftMonth(delta)=#mc-ym๊ฐ์ Date ๋ก ๊ตด๋ ค ยฑ1๊ฐ์. ์ฐ ๋๊น(2026-01 โ 2025-12)์ด ๊ณต์ง๋ก ๋ฐ๋ผ์จ๋ค.<input type="month">๋ ์๋์ง ์๊ณ ์ข์ฐ์ ํ์ดํ ๋ฒํผ๋ง ๋ถ์๋ค(๊ธฐ์กด ํํ ์ ์ง ์ง์).- ์ปฌ๋ผ ํญ = ํ์ฅ๋ช
26% โ 17%, ์๋ฃ/์ฒญ๊ตฌ์ผ๋ฌด์ง์ โ 12%(์ด์ ์ค์ธก 221px ยท 156px). ใํ์ ๋ ํฌํจใยทใํํ์ฅ์ ํฌํจใ์ด ์๋ฆฌ๋ ๊ฒ ํด์๋๋ค. - ๊ฒ์ฆ
scripts/_monthly_close_ui_check.py19ํญ๋ชฉ(ํ์ดํ 6 ์ ๊ท) โ ํ ์คํธยท์ด์ ๊ฐ๊ฐ ALL PASS. โ ํ์ยท๊ธ์ก ๋จ์ ์ ์ด์/ํ ์คํธ ๋ถ๋ฆฌํ๋ค โ ํ ์คํธ RDS ๋ 07-23 ์ ์๋ฉ๋ณธ(7์ ๋ฅ์์ค 7ํยท176,113,000)์ด๋ผ ์ด์ ๊ธฐ์ค(9ํยท252,970,000)์ผ๋ก ๋ณด๋ฉด ๋ฌด๊ดํ FAIL 5๊ฑด์ด ๋ฌ๋ค. - ์ฌ์ดํธ๋งต ์ฌ๋น๋ = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 54 ยท ๋ฏธ๋ฐ์ 0.
๐ NOW (2026-08-18) โ ์๋ง๊ฐ 26๋
1~7์ ์ด์ 1์ฐจ ์ด์ ์๋ฉ ์๋ฃ (์์ธ: session-2026-08-18-monthly-close-prod-seed.md)
07-29์ ์ฝ๋๋ง ์ด์๋ฐฐํฌํ๊ณ ๋ฏธ๋ค๋ ใ๋ง๊ฐ ๋ฐ์ดํฐ ์๋ฉใ์ NAS ๋ง๊ฐํ ๊ธฐ์ค์ผ๋ก ์งํ. ๋ง๊ฐ 16๊ฑดยท78ํ.
- ๊ทธ๋ฆด๋ง 2๋ฌธ ํ์ = ๊ธฐ์กด ๊ฒฌ์ ๋ง ์ฐ๊ฒฐ(๋ฐฑํ ์์ฑ ์ ํจ) / ๊ธฐ์กด 2026-07 ๋ฅ์์ค ์๋์์ง๋ณธ(close_no=1)์ ๋ง๊ฐํ๋ก ๊ต์ฒด.
- ์ ๋ณธ ํ์ผ ํ์ (์ด๋ฆ์ผ๋ก ํน์ ๋ถ๊ฐ โ ๋ด์ฉ์ผ๋ก) = ๋ฅ์์ค 1~7์ ยท ์๋ฅ์ค 1~7์(+
-ํฌ์ธํ์ ํ์ ์ก) ยท ๋ต์ค 3ยท7์. 5์์(ํฌ์ธ)๋ฅ์์ค 5์ ๋ง๊ฐ.xlsx, 6์์๋ฅ์์ค 6์ ๋ง๊ฐ.xlsx((ํฌ์ธ,7์๋ง๊ฐ๊ฑด์ ์ฐธ์กฐ)โฆ๋ 7์ ์์ฑ์ฉ ์ฐธ์กฐ๋ณธ์ด๋ผ ๊ณ๊ฐ ๋ค๋ฆ). - ๋งคํ = ํ์ฅ 75/78(๋ฏธ์ฐ๊ฒฐ = ์ผ๋ ๋ธ ์คํผ์คํ SH ยท ๋ณ๋ ๋น์ฉ ยท ๋ฐ๋๊ฑด์ค ๋ถ์ฐ EDC), ๊ฒฌ์ 12ํ. ๊ฒฌ์ ์ฐ๊ฒฐ์ ๊ธ์ก ๊ฒ์ดํธ(๊ฐ์กฑํฉ ยฑ10% ๋๋ ์ ํ์ผ์น)๋ฅผ ๊ฑธ์ด ์ด๋ฆ๋ง ๋น์ทํ ์ค์ฐ๊ฒฐ์ ๋ง์๋ค.
- ๊ฒ์ฆ = ์ ์ฅ๋ณธ ์ฌ์กฐํ 16/16 PASS ยท UI
scripts/_monthly_close_ui_check.py prod12/12 ALL PASS ยท ์์ 3๊ฑด ยท ์ฌ์ดํธ๋งต ๋ฏธ๋ฐ์ 0. - โณํํ ํ์ธ 2๊ฑด = โ ๋ฅ์์ค 1~4์์ ์ด์ ํ์ฅ 7~8ํ์ด ๋งค๋ฌ ๋ฐ๋ณต(๋ง๊ฐํ ์๋ณธ ๊ตฌ์กฐ) โ ๊ทธ๋๋ก ๋์ง โก7์ ๋ง๊ฐํ์ ์๋ ํ๋๋งค์ฅ 3๊ฑดยท๊ธ๊ฐ ๋ถ์ฐ์์ฝ(๊ต์ฒด ์ ์๋์์ง๋ณธ์ ์์์)๊ฐ ๋ง๊ฐํ ๋๋ฝ์ธ์ง 8์ ์ด์์ธ์ง.
๐ NOW (2026-08-10 ยท 5์ฐจ) โ ์จ๊น ํ์ฅ ๊ด๋ฆฌ ๋ชจ๋ฌ = ๊ฒฌ์ ์ ํ์ฅ ๊ฒ์ ํ ์์(๊ธฐ๊ฐ+ํ์ฅ๋ช ๊ฒ์, ๊ธฐ๋ณธ 3๊ฐ์) โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] QA(qa_helper, /field/orderpaper ใ๐ ์จ๊น ํ์ฅ ๊ด๋ฆฌใ ๋ฒํผ) = "์จ๊น ํ์ฅ ๋ชจ๋ฌ์ ๊ฒฌ์ ์ ํ์ฅ๋ช
๊ฒ์
๋ชจ๋ฌ๊ณผ ๋์ผํ ํ์์ผ๋ก ์์ ํด์ค. ๋ชจ๋ฌ์ ๋ณ๋ ๊ฒ์์ฐฝ ์ถ๊ฐํ๋ค. ๋ ์ง ๊ธฐ๊ฐ+ํ์ฅ๋ช
๊ฒ์ ์ฉ๋.
๋ชจ๋ฌ ๊ธฐ๋ณธ ๋ก๋๋ 3๊ฐ์ ์ด์ ํ์ฅ๊น์ง ๋์ด๋ค. ์ด์ ๋ฐฐํฌ."
๋ฐฐํฌ = master eac466b โ deploy-live e965a65(2ํ์ผ ์ ๋ณ ํฌ์๋, --detach worktree). DB ๋ณ๊ฒฝ 0.
- ์ข
์ = ํญ 560px ๋ชจ๋ฌ์ ๊ฒ์ ์
๋ ฅ 1๊ฐ +
.op-map-rowํ ์ค ๋ฆฌ์คํธ(ํ์ฅ๋ช + ใ์ ์ฒด ยท ์ฐ๊ฒฐํ์ฅ ยท ํญ๋ชฉ nใ ๋ฉํ). ์ง๊ธ = ํญ 900px + ๊ฒฌ์ ์(estimate_regist_v2)์ ๊ฐ์ ํ 6์ปฌ๋ผ (์ ์ฒด๋ช / ํ์ฅ๋ช (๋ฐ์ฃผ์)+์ฐ๊ฒฐํ์ฅ / ๊ตฌ๋ถ / ์์ฐจ์ผ / ์ต๊ทผ ์ ๊ณ ์ผ / ํญ๋ชฉ) + ํ์ฑํ ์ด + ๊ฒฐ๊ณผ ๊ฑด์ + ํค๋ ํด๋ฆญ ์ ๋ ฌ. - ๊ฒ์์ฐฝ = ์์ฐจ์ผ ๊ธฐ๊ฐ(from~to) + ํ์ฅ๋ช ํค์๋. ๊ธฐ๋ณธ = ์ค๋โ3๊ฐ์ ~ ๋น์(์ดํ ์ ์ฒด) โ ๊ฒฌ์ ์ ๋ชจ๋ฌ์ ใ์ต๊ทผ 1๊ฐ์~์ดํ ์ ์ฒดใ์ ๊ฐ์ ๋ฐฉ์(์ข ๋ฃ์ผ์ ๋น์ ๋ฏธ๋ ๋ฌด์ ํ). ํค์๋๋ ํ์ฅ๋ช ยท์ฐ๊ฒฐํ์ฅ๋ช ยท์ ์ฒด๋ช 3ํ๋.
- ๐๋ฐ์ดํฐ๋ ๋ชจ๋ฌ ์ด ๋ ํ ๋ฒ๋ง ๋ฐ๊ณ ํํฐยท์ ๋ ฌ์ ํ๋ฉด์์ ํ๋ค โ ์จ๊น ํ์ฅ์ ์์ญ ํ(์ด์ 27ยทํ
์คํธ 6)์ด๋ผ
์๋ฒ ์๋ณตยท์ ๊ท API ๊ฐ ํ์ ์๋ค. ์ปจํธ๋กค๋ฌยท์๋น์ค ๋ฌด๋ณ๊ฒฝ(GET
/api/orderpaper/hidden-sites๊ทธ๋๋ก). - DAO
select_hidden_sites()์ship_date(field.shipping_date) ยทfield_div_name(common_code FIELD_DIV) ยทorder_date_min์ถ๊ฐ. ๐field ๊ฐ์ LEFT JOIN ๋์ ์๋ธ์ฟผ๋ฆฌ โGROUP BY o.site_name_raw, m.field_no๋ผ ์กฐ์ธ ์ปฌ๋ผ์ SELECT ์ ์น์ผ๋ฉด ONLY_FULL_GROUP_BY ์ ๊ฑธ๋ฆฐ๋ค(๊ธฐ์กดfield_name๋ ๊ฐ์ ์ด์ ๋ก ์๋ธ์ฟผ๋ฆฌ์๋ค). - ๐ด์์ฐจ์ผ ์๋ ์จ๊น ํ์ฅ์ ๊ธฐ๊ฐ๊ณผ ๋ฌด๊ดํ๊ฒ ํญ์ ๋ณด์ธ๋ค(fail-open) โ ๋ ์ง๋ก ๊ฑธ๋ฌ ์ฌ๋ผ์ง๋ฉด ํ์ฑํํ ๊ธธ ์์ฒด๊ฐ
์์ด์ง๋ค(์จ๊น ํ์ฅ์ ์ด ๋ชจ๋ฌ์ด ์ ์ผํ ํด์ ์ฐฝ๊ตฌ). ํ์ฌ ์ค์ธก 0๊ฑด์ด์ง๋ง
field.shipping_date๋ nullable. - ๊ฒ์ฆ = ์ ์ค
scripts/_op_hidden_modal_check.py {test|prod}โ ์ฝ๊ธฐ ์ ์ฉ(GET + ๋ชจ๋ฌ ์กฐ์๋ง, ใํ์ฑํใ๋ ์กด์ฌ๋ง ํ์ธํ๊ณ ๋๋ฅด์ง ์๋๋ค = ์ด์ ๋ฐ์ดํฐ ๋ฌด๋ณ๊ฒฝ). ํ ์คํธ 35๊ฒ์ฌ ALL PASS ยท ์ด์ 35๊ฒ์ฌ ALL PASS (๊ธฐ๋ณธ 3๊ฐ์ ์ปท ์ค์ธก = ์ด์ 27โ25, ํ ์คํธ 6โ5 / ์์์ผ ๋น์ฐ๋ฉด ์ ์ฒด ๋ณต๊ท / ์ข ๋ฃ์ผ ํํฐ / ํค์๋ ๋งค์น / ํค๋ ์ ๋ ฌยทํ ๊ธยท์ด๊ธฐํ / ๋ชจ๋ฌยทํ ๊ฐ๋ก ๋์นจ 0 / ์ฝ์ 0 / ๋ฐ์ฃผ์์ ๋ฆฌ ์นด๋ ํ๊ท 8์นด๋). - ์ฌ์ดํธ๋งต ์ฌ๋น๋(๋ฐฐํฌ ํ) = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 50 ยท ๋ฏธ๋ฐ์ 0.
- โ ๊ฐ์ ์๊ฐ ๋ค๋ฅธ ์ธ์
์ด ๊ฐ์ ํ์ผ(
field_orderpaper.html)์ ใ๋ฏธ์ ๊ณ ํํฐใ QA ๋ฅผ ์งํ ์ค์ด์๋ค โ ์ฐฉ์ ์์ ์ํนํธ๋ฆฌ๋ ๊นจ๋ํ๊ณ (๊ทธ ์ธ์ ๋ฏธ์ฐฉ์) ํธ์ง ๊ตฌ์ญ๋ ๊ฒน์น์ง ์์ ๊ทธ๋๋ก ์งํ, ์ปค๋ฐ์ ํ์ผ 2๊ฐ ๋ช ์ add. - โณ[ํํ] ์ด์ ์ก์ โ
/field/orderpaperโ ใ๐ ์จ๊น ํ์ฅ ๊ด๋ฆฌใ(๊ธฐ๊ฐยทํ์ฅ๋ช ๊ฒ์ ยท ์ ๋ ฌ ยท ํ์ฑํ).
๐ NOW (2026-08-10 ยท 4์ฐจ) โ ๋ฐ์ฃผ์ ใ์ ๊ณ ์ฒใ ํ ํ์ฑ โ ์ค์ ์จ ์์ฌ๊ด๋ฆฌ๋ฅผ ์ค์ ์จ ์ ๊ณ ์ํธ๋ก ํ์ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] QA(qa_helper, /omc/material ํ๋ช
์นฉ BNS-24E117 PP) = "์๋ถ์์ฌ๋ฐ์ฃผ์ ์ฝ๋ ์คํฌ ๋ณด์ํด์ค.
์ด ํ๋ชฉ์ ํ์์ํธ์์ ํผ์ค์๋ก ์
๊ณ ๋๋ ํ๋ชฉ์ด๋ค. ํ๋ชฉ ์๋๋ก ๋ณํฉ๋ ๋ผ์ธ์ด ์๊ณ , ์
๊ณ ์ฒ ์
๊ณผ
์ค๋ฅธ์ชฝ์ ์
์ฒด๋ช
์
, ๊ทธ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฃผ์๊ฐ ์๋ค. ์
๊ณ ์ฒ ํ ์์ชฝ์ ์๋ ๋ฐ์ดํฐ๊ฐ ๋ฐ์ฃผ์ ํด๋น ํญ ์
์ฒด์์
์
๊ณ ์ฒ ์
์ฒด๋ก ๋ฐ์ก๋๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ BNS-24E117 PP์ ์ค์ ์จ๋ก ๊ฐ๋๊ฒ ์๋๊ณ ํผ์ค์์ด ๋ง๊ณ ,
์ค์ ์จ ์์ฌ ๊ด๋ฆฌ์๋ ๋ณด์ด๋ฉด ์๋๋ค. ์์ ์ด์ ๋ฐฐํฌ."
๋ฐฐํฌ = master ba33cfc โ deploy-live efa4593(5ํ์ผ ์ ๋ณ ํฌ์๋, --detach worktree).
์ด์ RDS ๋ ๋๊ธฐํ๊ฐ ์ ์ ์ฉ(orderpaper.receiver ๋ฉฑ๋ฑ ALTER) โ ๋ฐฐํฌ ์ ์ ์ปฌ๋ผ์ด ์์ด์ผ DAO ๊ฐ SELECT ํ๋ค.
- ๋ฐ์ฃผ์ ใ์
๊ณ ์ฒใ ํ ์ค์ธก ๊ตฌ์กฐ(์ ํ์ผ ์ ์์กฐ์ฌ = 45ํ์ผ ยท 543ํ) โ A์ด(A:B ๋ณํฉ)
์ ๊ณ ์ฒยท C์ด ์ ๊ณ ์ฒ ์ ์ฒด ยท D์ด~J์ด(๋ณํฉ) ์ฃผ์. ํ ํญ(์น์ )์ ์ฌ๋ฌ ๊ฐ์ผ ์ ์๊ณ ๊ฐ ์ ๊ณ ์ฒ ํ์ด ์๊ธฐ ์ ๋ฌถ์์ ๋๋๋ค (์ค์ธก์ ์ ์ด์ค์ํญ = r10 ์ค์ ์จ / r13 ์ง์LDM / r39 ์์ํ ํฌ / r42 ์ธ์Mํ ํฌ). ๋๋ถ๋ถ ํญ์ ํ ์๋ r26ยทr28 ์ํฌ์ธ1๊ฐ(์ฐ๋ฆฌ ๊ณต์ฅ ์ ๊ณ )๋ง ์๋ค. - ํ์
orderpaper_parse.py=_receivers(ws,sr,er)+_receiver_of(rcvs,r)โ ํญ๋ชฉ dict ์receiver. ํญ๋ชฉ์ ์ ๊ณ ์ฒ = ๊ทธ ํญ๋ชฉ ์๋์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ๊ณ ์ฒ ํ. ์๋์ ์์ผ๋ฉด''(๋ฏธ๊ธฐ์ฌ). ์์์ฌ(์ค์ ์จ) ๋ถ๊ธฐยท๋ถ์์ฌ ๋ถ๊ธฐ ์์ชฝ ๋ค ํ ์ค์ฉ. ์ ๊ณ ์ฒ ํ ์์ฒด๋ ์ข ์ ๋๋ก_is_label์ด ๊ฑธ๋ฌ๋ธ๋ค. - ๋๊ธฐํ
orderpaper_sync.py=orderpaper.receiver VARCHAR(100)์ ์ค(CREATE + ๋ฉฑ๋ฑ ALTER ๋ชฉ๋ก) + INSERT/UPDATE ์ ์ถ๊ฐ. ๐item_key/block_keyํด์์๋ ๋ฃ์ง ์์๋ค โ ๋ฃ์ผ๋ฉด ๋ค์ ๋๊ธฐํ๊ฐ ์ ํ์ ์ ํ์ผ๋ก ๋ง๋ค์ด ์ฌ์ฉ์ ํธ์ง(*_user)ยท์ํยท์ฌ์ฉ์ด๋ ฅ์ด ๋๊ธด๋ค(์ค์ธก ins 0 / upd 1769 = ํค churn 0). - ํ๋ฉด
field_orderpaper.html์ค์ ์จ ํํฐ = ์ข ์ ๋ฐ์ฃผ์ฒ=์ค์ ์จ OR ์ํธ(T)โ๋ฐ์ฃผ์ฒ=์ค์ ์จ OR (์ํธ AND ์ ๊ณ ์ฒโ{์ค์ ์จ, ๋ฏธ๊ธฐ์ฌ}).dao.select_all_items์receiver๋ ธ์ถ. ๐๋ฏธ๊ธฐ์ฌ๋ fail-open(์ข ์ ๋๋ก ๋ ธ์ถ) โ ๊ทผ๊ฑฐ๊ฐ ์์ ๋ ์ ๊ณ ๋๋ฝ์ด ์ค๋ ธ์ถ๋ณด๋ค ์ํ. ํ์ฌ ๋ฏธ๊ธฐ์ฌ ์ํธ๋ 0๊ฑด. - ์ํฅ ์ค์ธก โ ์ค์ ์จ ํ๋ฉด ์งํฉ: ํ ์คํธ 229โ181(-48), ์ด์ 216โ170(-46). ๋น ์ง ๊ฒ์ ์ ๋ถ ๋ชฉ์ ์ง๊ฐ ์ค์ ์จ๊ฐ ์๋ ์ํธ๋ค(ํผ์ค์ยท๋ฐ์ฌ๋์์ธยทํค๋ธ๋ก ยทํธ์ ์ฐ๋ยท์ฒญ์์ฐ์ ยท์ผ์ฑ์ฐ์ ยท์๋์ฐ์ , ๊ทธ๋ฆฌ๊ณ ํฌ์ธ ์ง์ ๊ณ ).
- ๐์ด์ ํ๋ฉด์์ ์ง๊ธ ์ํธ ๊ทธ๋ฃน์ด ๋น์ด ๋ณด์ด๋ ๊ฑด ์ ์์ด๋ค โ ์จ๊น ์ ์ธ ์ํธ 17๊ฑด ์ค ์ค์ ์จํ 13๊ฑด์ด ์ ๋ถ
์๋ฃ, ์ด ํ๋ฉด์ ์๋ฃ๋ฅผ ์ ๋๋ค(foldcfg.done=false). ๋จ์ ์๋ ๋ฏธ์๋ฃ ์ํธ 1๊ฑด์ด ๋ฐ๋ก ํผ์ค์ํ์ด์๋ค(= ํํ๊ฐ ์ง์ ํ ๊ทธ ์ค). ์ ์ค์ ์จํ ์ํธ๊ฐ ๋ค์ด์ค๋ฉด ๋ค์ ๋ฌ๋ค. ์นด๋ ์ ์ฒด ํผ์นจ(opExpandCardAll)์ผ๋ก 13๊ฑด ๋ ๋ ํ์ธํจ. - ๊ฒ์ฆ = โ ์ ์ค
scripts/_op_receiver_probe.pyํ์ ์์ฒด๊ฒ์ฌ(ํฉ์ฑ 3์ผ์ด์ค + NAS ์คํ์ผ ๋์กฐ) ALL PASS โก์ ์คscripts/_op_receiver_db_check.py(SSM, ์ฝ๊ธฐ์ ์ฉ) ํ ์คํธยท์ด์ ALL PASS โ ์ปฌ๋ผ ์กด์ฌยท์ ์ฌ (์ด์ 1705ํ ์ค 1608 ๊ธฐ์ฌ)ยท์ํธ ์ ๊ณ ์ฒ ๋ถํฌยท์งํฉ ์ถ์ยทํ์์ํธ BNS-24E117 = ํผ์ค์โขscripts/_omc_material_check.pyํ์ฅ(์ ๊ณ ์ฒ ํ์ 2๊ฒ์ฌ ์ถ๊ฐ) ํ ์คํธ ALL PASS + ์ด์ ALL PASS. โ ๊ฒ์ฌ 2๊ฑด์ด ๋ฐ์ดํฐ ๋ชจ์์ ๋ฌถ์ฌ ์์ด ๊ฐ์ด ๊ณ ์ณค๋ค โ ใ์ํธ ๊ทธ๋ฃน ๋งจ ์ใยทใํ์ ์ฒด ํ๋ช ํธ์งใ์ด ์ฒซ ์นด๋/๊ธฐ๋ณธ ํผ์นจ ์ํ์ ๊ธฐ๋๊ณ ์์๋ค โ ์ ์นด๋opExpandCardAllํ ์ํธ ์น์ ์ด ์๋ ๋ชจ๋ ์นด๋๋ฅผ ๋ณธ๋ค. - ์ฌ์ดํธ๋งต ์ฌ๋น๋(๋ฐฐํฌ ํ) = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 50 ยท ๋ฏธ๋ฐ์ 0.
- โณ[ํํ] ์ด์ ์ก์ โ
/omc/material์ ํ์์ํธBNS-24E117 PP๊ฐ ์๋์ง, ํ์ฅ ์นด๋ ใ์๋ฃ ์ ์ฒดใ๋ฅผ ํผ์น๋ฉด ์ค์ ์จํ ์ํธ 13๊ฑด์ด ๋ณด์ด๋์ง. - โ[ํํ] ํ๋จ 1๊ฑด = ํ๋ฉด์ ์ ๊ณ ์ฒ ์ปฌ๋ผ์ ๋ณด์ฌ์ค์ง. ์ง๊ธ์ ํํฐ์๋ง ์ฐ๊ณ ํ์๋ ์ ๋์ด๋ค(์ง์ ๋ฒ์ ๋ฐ).
๐ NOW (2026-08-10 ยท 3์ฐจ) โ ์์ฐํํฉ ๋ ํฌํธ ์์ด๋น์ ผ๊ธ๋ก๋ฒ ์ ์ฒด๋ช 2์ค ํ๊ธฐ โ ์ด์๋ฐฐํฌ ์๋ฃ
[ํํ] ์ง์ = "field/print/status ์์ด๋น์ ผ๊ธ๋ก๋ฒ ์
์ฒด๋ช
์ด ๊ธธ์ด์ ์
์ ๋์ด์ ๋ค. ์ค๋ฐ๊ฟ ์ ์ฉ.
์์ด๋น์ ผ ํ์ ๊ธ๋ก๋ฒ์ ๋ค์์ค. ์ด ์
์ฒด๋ง. ์ด์๋ฐฐํฌ."
๋ฐฐํฌ = master 4406fe2 โ deploy-live 09c60ff(1ํ์ผ ์ ๋ณ ํฌ์๋, --detach worktree). DB ๋ณ๊ฒฝ 0.
- [์ฝ๋] ์์ธ =
td.comp { white-space: nowrap }+col.c-comp { width: 8% }(์ค์ธก 60px). ํญ์ ๋ํ๋ฉด ๋ค๋ฅธ ์นธ์ด ๋ฐ๋ฆฌ๋ฏ๋ก ์ด ์ ์ฒด๋ช ๋ง<br>๋ก ๋๋๋ค โ<br>์nowrap๋ ๋ฌด์ํ๊ณ ๊ฐํํ๋ค(CSS ๋ฌด๋ณ๊ฒฝ).field_status_print.html์compName()์ ์ค,compTd()๊ฐesc()๋์ ์ด๊ฑธ ์ด๋ค. - ๐ดํจ์ = ํ
์คํธ์ ์ด์์ ์
์ฒด๋ช
ํ๊ธฐ๊ฐ ๋ค๋ฅด๋ค. ์ด์ =
์์ด๋น์ ผ๊ธ๋ก๋ฒ, ํ ์คํธ =๊ธ๋ก๋ฒ์์ด๋น์ ผ(์์ ๋ฐ๋). 1์ฐจ ๊ตฌํ(์์ด๋น์ ผ๊ธ๋ก๋ฒ๊ณ ์ ๋งค์นญ)์ ํ ์คํธ์์ ์๋ฌด ๊ฒ๋ ์ ๊ฑธ๋ ธ๊ณ ๊ทธ๊ฒ ๊ฒ์ฆ์์ ์กํ๋ค. โ ์ ๊ท์/(์์ด๋น[์ ผ์ ])\s*(๊ธ๋ก๋ฒ)|(๊ธ๋ก๋ฒ)\s*(์์ด๋น[์ ผ์ ])/ โ '$1$3<br>$2$4'๋ก ๋ ํ๊ธฐ ๋ค ๋ฐ๋ ์ด๋ฆ ์์๋ ๊ทธ๋๋ก ๋๋ค(์ ์ฒด๋ช ์ ๋ค์ง์ง ์๋๋ค). rules ๐. โปorderpaper_parse.py๋ ๋ณ๊ฐ๋ก๊ธ๋ก๋ฒ์์ด๋น์ โ ์์ด๋น์ ผ๊ธ๋ก๋ฒ์ ๊ทํ๋ฅผ ์ด๋ฏธ ํ๊ณ ์๋ค(๋ฐ์ฃผ์ ๊ฒฝ๋ก ํ์ ). - ๊ฒ์ฆ = ์ ์ค
scripts/_field_status_print_ivision_check.py {test|prod}(์ฝ๊ธฐ ์ ์ฉ โ ํ์ด์ง์compTd()๋ฅผ ๊ทธ๋๋ก ํธ์ถํด ์์ ํ์ ๋ฃ๊ณscrollWidth>clientWidth์ค์ธก ํ ํ ์ ๊ฑฐ). ํ ์คํธยท์ด์ ๋ ๋ค ALL PASS โ 2์ค ํ๊ธฐยท์ ๋์นจ 0(60=60)ยทํ ๊ฐ๋ก ๋์นจ 0ยท๋ฅ์์ค ๋ฑ ๋ค๋ฅธ ์ ์ฒด<br>์์ยท์ค๋ฐ์ดํฐ ์ ์ฒด์ ๋์นจ 0ยท์ฝ์ 0. ์ด์ ์ค๋ฐ์ดํฐ์ ํด๋น ์ ์ฒด 2์ ์ด์์ด๋น์ ผ<br>๊ธ๋ก๋ฒ(๋ด๋น ์์งํธ)๋ก ๋์จ๋ค = ํํ ์ง์ ๊ทธ๋๋ก. - ์ฌ์ดํธ๋งต ์ฌ๋น๋ = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 50 ยท ๋ฏธ๋ฐ์ 0.
- โณ[ํํ] ์ด์ ์ก์ + ์ค์ ์ธ์ โ ํ๋ฉด์ ํ์ธํ์ผ๋ A4 ์ธ์(font-size 11px)๋ ๋์ผ๋ก ๋ณผ ๊ฒ.
๐ NOW (2026-08-10 ยท 2์ฐจ) โ ๊ฒฌ์ ์ฌ์์ฑ์ ใ๋ด์ฉ ๋ณต์ฌใ ์ ํ ์ ์ค + ์ฐจ์ ๋ฒํผ ํ๊ธฐยท์์นยท๋ชจ๋ฌ ํญ โ ์ด์๋ฐฐํฌ ์๋ฃ
ํํ ์ง์ = "ํจ์ ์ฃผ์ํ๊ณ pfs ์ ๊ธฐ๋ฅ์ผ๋ก ์ถ๊ฐํด๋ผ. ๋ณธ๊ฑด ๊ฒฌ์ ์ ์๋ก ์์ฑ์ ๋ณต์ฌ ๊ธฐ๋ฅ ์ถ๊ฐ
(์ฌ์ฉ์ ์ ํ์์ , 0์ผ๋ก ์์ํ๋ ๊ฒฝ์ฐ๋ ์์) ์ด์๋ฐฐํฌ." + QA 3๊ฑด(/estimate/list-v2) =
"์ฐจ์ 1ยท์ฐจ์ 2 ๋ก ํ๊ธฐ๋๋ ๋ฒํผ์ 1์ฐจยท2์ฐจ๋ก", "๋ฒํผ์ ์ญ์ ์ผ์ชฝ์ผ๋ก", "์ฐจ์ ์ด๋ ฅ ๋ชจ๋ฌ ๊ฐ๋กํญ โ ์ค์ด ๋ฐ๋ฆฐ๋ค".
๋ฐฐํฌ = master e25e3e7 โ deploy-live e659f80(4ํ์ผ ์ ๋ณ ํฌ์๋, --detach worktree). DB ๋ณ๊ฒฝ 0.
- โ ์ฌ์์ฑ = ์์ ๋ฐฉ์์ ์ฌ๋์ด ๊ณ ๋ฅธ๋ค. ์ข
์ ์
confirm('โฆํญ๋ชฉ์ ๋ณต์ฌํ์ง ์์ต๋๋ค')ํ๋๋ฟ์ด๋ผ ๋น ๊ฒฌ์ ์๊ฐ ์ ์ผํ ๊ธธ์ด์๋ค. ์ด์ ๋ชจ๋ฌ#rewrite-modal์์ ใ๋ด์ฉ ๋ณต์ฌํด์ ์์ใ / ใ๋น ๊ฒฌ์ ์๋ก ์์ใ / ์ทจ์. ๐confirm 2๋ฒ์ผ๋ก ์ ๋ฌผ์๋ค โ ใ์ทจ์ใ๊ฐ ใ๋น ๊ฒฌ์ ์ใ๋ก ์ฝํ ๊ธ์ก ๋ฌธ์๋ฅผ ์ค์กฐ์ํ๋ค. API =POST /api/estimate/<no>/rewritebodycopy_items:'1'|'0'(๊ธฐ๋ณธ '0' = ์ข ์ ๋์, ํ๊ท 0). - โก ๋ณต์ฌ ๋ฒ์ =
estimate_detail+estimate_detail_sub+estimate_extra_cost+estimate_material - ๋ง์คํฐ ๊ธ์ก 4์ปฌ๋ผ(์ด์กยท๋ง์ง์ด์กยท์๊ณต๋นยท์ด๋ฐ๋น). ํค๋(ํ์ฅยท์
์ฒดยท์ง๋ถ์กฐ๊ฑดยท๋ง์ง)๋ ์ข
์ ์ฌ์์ฑ ๊ทธ๋๋ก ์น๊ณ,
comment๋ ์ข ์ ๋๋ก ๋น ๊ฐ(๋ด์ฉ ๋ณต์ฌ์ ๋ฒ์๊ฐ ์๋๋ค). - ๐ดํจ์ 1 = FLOAT(์ด์ 708โ747 ์๋ ๋ณต์ฌ์์ ๋ฐ๊ฒฌ) โ
estimate_dao.copy_estimate_contents๋ ๊ฐ์ MySQL ๋ฐ์ผ๋ก ์ ๊บผ๋ธ๋ค. ์ ๋ถINSERT .. SELECT, ํ์ด์ฌ์ ์ ์ PK ๋ง ๋ง์ง๋ค. - ๐ดํจ์ 2 =
display_order๋ก ๋ถ๋ชจ-์์์ ์ง์ง์ผ๋ฉด ์ ๋๋ค โ ์ค๋ฐ์ดํฐ์ ์ค๋ณต์ด ์๋ค (ํ ์คํธ ๊ฒฌ์ 33ยท35ยท36ยท37ยท47 = 19ํ์ธ๋ฐ distinct 6). โ ํญ๋ชฉ์ ํ ๊ฑด์ฉ INSERT ํ๊ณ ๊ทธ ์๋ฆฌ์์SELECT LAST_INSERT_ID()(๊ฐ์ ์ปค๋ฅ์ ยทํธ๋์ญ์ )๋ก ์detail_no๋ฅผ ๋ฐ์ ๊ทธ ์์๋ง ๋ถ์ธ๋ค. rules ๐. - ๐ดํจ์ 3 =
%ํฌ๋งท ์กฐ๋ฆฝ โvalues์กฐ๊ฐ์%%s๋ฅผ ์ฐ๋ฉด ๋ฐ๊นฅ ํฌ๋งท์ ์ธ์๋ผ escape ์ด ์ ๋ผ%%s๊ฐ ๊ทธ๋๋ก ๋จ๋๋ค(1์ฐจ ๊ตฌํ ๋ฒ๊ทธ, ์์ฑ SQL ์ print ํด์ ์ก์๋ค). rules ๐. - ๋ณต์ฌ ์คํจ = ์ฌ์์ฑ ์์ฒด๋ฅผ ๋๋๋ฆฐ๋ค โ ์ ์ฐจ์
delete_estimate+ ์๋ณธupdate_archive('0')ํ ์์ธ ์ ๋ฌ. ๋น ์ฐจ์๊ฐ ๋จ์ ์ฌ๋์ด ์น์ฐ๋ ์ํ๋ฅผ ์ ๋ง๋ ๋ค. - โข ์ฐจ์ ๋ฒํผ = ๋ผ๋ฒจ์ด ใ์ฐจ์ N(ํ์ฅ์ ์ฐจ์ ๊ฐ์)ใ์๋ค โ ใN์ฐจ(์ด ํ์ด ๋ช ์ฐจ์ธ๊ฐ)ใ.
๐๊ฐ์๋ ๊ทธ ํ์ด ๋ช ์ฐจ์ธ์ง ๋งํด์ฃผ์ง ์์ ๋ณด๊ด๋ 1์ฐจ ํ์ด "์ฐจ์ 2" ๋ก ๋ณด์๋ค. ๋ฒํธ ๋งค๊น์ ์ฐจ์ ๋ชจ๋ฌ๊ณผ ๊ฐ์
estimate_no์ค๋ฆ์ฐจ์ ์๋ฒ(DAO ์๋ธ์ฟผ๋ฆฌrevision_no์ ์ค). ๊ฐ์๋ ํดํ์ผ๋ก ๋จ๊ฒผ๋ค. ์์น = ์ญ์ ์ผ์ชฝ. - โฃ ์ฐจ์ ์ด๋ ฅ ๋ชจ๋ฌ =
modal-lg(800px) โ 1140px(calc(100vw-40px)์ํ) + ๊ฒฌ์ ๋ช ์ธnowrap. ์ค์ธก = ํญ 1140 ยท ๊ฐ๋ก ๋์นจ 0 ยท ์ ์๋ฆผ 0 ยท ํ ๋์ด ๊ท ์ผ(53=53). - ๊ฒ์ฆ = ์ ์ค
scripts/_est_rewrite_copy_check.py {test|prod} [--write] [--empty]+_est_rewrite_db_verify_test.py(SSM, ์๋ฒ์ธก<=>๋์กฐ) โ ํ ์คํธ E2E 3ํ์ (๋ณต์ฌ โ ์ ๋ฆฌ โ ๋น ๊ฒฌ์ ์ โ ์ ๋ฆฌ โ ๋ณต์ฌ ์ฌํ์ธ โ ์ ๋ฆฌ) ์ ๋ถ ALL PASS. ๋์ = ํ ์คํธ ๊ฒฌ์ 707 ์ผ๋ ๋ธ ํํฌ์ฌ์ด๋ (ํญ๋ชฉ 52ยทsub 215ยท๋ณ๋ 2ยท์์ฌ 4 = ๋ค ํ ์ด๋ธ ์ ๋ถ ๋ฎ๋๋ค). DB ๋์กฐ = 4ํ ์ด๋ธ ์ ์ปฌ๋ผ ๋นํธ ์ผ์น 0๋ถ์ผ์น ยทSUM(amount)ยทSUM(margin_total_amount)<=>1 ยท ๋ง์คํฐ ๊ธ์ก 4์ปฌ๋ผ ๋์ผ ยท ์ด๋ฆ(2์ฐจ)ยท ์๋ณธ ๋ณด๊ดยทํญ๋ชฉ ๋ณด์กด. ํ๋ฉด ๋์กฐ = ์๋ณธ 707 ๊ณผ ๋ณต์ฌ๋ณธ 804 ์ ๊ฒฌ์ ์ด์ก์ด ๊ฐ๋ค(๋ ๋ค 195,760,580). ๐ํ ์คํธ DB ๋ ์์๋ณต๊ตฌํ๋ค โ ๋ง๋ ์ฐจ์ 802ยท803ยท804 ๋ฅผ ์์๊น์ง ์ญ์ ํ๊ณ 707 ๋ณด๊ด ํด์ (์ค์ธก ํ์ธ). ์ด์์ ์ฝ๊ธฐ ์ ์ฉ ๊ฒ์ฆ๋ง(๋ผ๋ฒจยท์์นยทํดํยท๋ชจ๋ฌ ํญยท์ฌ์์ฑ ๋ชจ๋ฌ 3๋ฒํผยท์ฝ์ 0) โ ์ด์์์ ์ฌ์์ฑ์ ์ ๋๋ ๋ค. - ์ฌ์ดํธ๋งต ์ฌ๋น๋ = ๊ทธ๋ฃน 8 ยท ํ์ด์ง 50 ยท ๋ฏธ๋ฐ์ 0.
- โณํํ = ์ด์ ์ก์ โ ๋ชฉ๋ก์์ ใN์ฐจใ ์์นยทํดํ, ์ฐจ์ ์ด๋ ฅ ๋ชจ๋ฌ ํญ, ์ฌ์์ฑ โ ๋ ๊ฐ๋ ์ ํ.
๐ NOW (2026-08-10) โ ๋์ฐ ์ฉ์ธ MH ๊ฒฌ์ ์ 1์ฐจ(708) โ 2์ฐจ ์ฌ์์ฑ๊ฑด(747) ๋ด์ฉ ๋ณต์ฌ โ ์ด์ ๋ฐ์ ์๋ฃ
ํํ ์ง์ = "pfs ์ด์์๋ฒ ์๋ฅ์ค ๋์ฐ ์ฉ์ธ ๊ฒฌ์ ์ ๋ณธ๊ฑด 1์ฐจ๋ฅผ 2์ฐจ ๋ณธ๊ฑด ์ฌ์์ฑ๊ฑด์ ๋ด์ฉ ๋ณต์ฌํด. ์ด์ ์์ ์น์ธ". ์ฝ๋ ๋ณ๊ฒฝ 0 โ ์ด์ RDS ๋ฐ์ดํฐ ์์ ๋ง(๋ฐฐํฌ ์์, ์ฌ์ดํธ๋งต ๋ฌด๊ด).
- ๋์ = ํ์ฅ
field_no 2109(๋์ฐ ์ฉ์ธ, ์๋ฅ์คยท๊น๋์ฐ). ๋ณธ๊ฑด 1์ฐจ = ๊ฒฌ์ 708(2026-06-10,archive_yn='1'๋ณด๊ด๋จ, ์ด์ก 43,563,000) โ 2์ฐจ = ๊ฒฌ์ 747(๋์ฐ ์ฉ์ธ MH ๊ฒฌ์ ์ (2์ฐจ), 2026-08-10 ์์ฑ, ์์ ํ ๋น์ด ์์๋ค). ๋ ๋คparent_estimate_noNULL = ๋ณธ๊ฑด, ์ถ๊ฐ๊ฑด 0๊ฑด(๋ณต์ฌ ๋์๋ ๋ณธ๊ฑด๋ฟ). - ๋ณต์ฌํ ๊ฒ =
estimate_detail50ํ +estimate_detail_sub53ํ(์ ์ปฌ๋ผ ์๋ณธ ๊ทธ๋๋ก, PK๋ง ์ ๊ท ์ฑ๋ฒ) + ๋ง์คํฐtotal_amountยทmargin_total_amount= 43,563,000.estimate_extra_costยทestimate_material์ ์๋ณธ์ด 0๊ฑด. ๋ง์คํฐ ๋๋จธ์ง(์ง๋ถ์กฐ๊ฑด ํ๊ธยท๋ง์ง -10ยท๊ตฌ๋ถยท์๊ณต๋น/์ด๋ฐ๋น 0)๋ 747 ์ด ์ด๋ฏธ 708 ๊ณผ ๊ฐ์ ์๋์ง ์์๋ค. - ๐ดํจ์ = FLOAT ์ ๋ฐ๋. 1์ฐจ ์๋(ํ์ด์ฌ์ผ๋ก ์ฝ์ด ๋๋ฃ๊ธฐ)๋ ๊ฐ์ด ๋ฏธ์ธํ๊ฒ ๋ฌ๋ผ์ก๋ค โ MySQL ํ
์คํธ ํ๋กํ ์ฝ์ด
FLOAT ๋ฅผ ์ ํจ 6์๋ฆฌ๋ก ์๋ผ ๋ณด๋ด
SUM(amount)33,419,453.09375 โ 33,419,442.0(11.09 ์ฐจ์ด). ํ ๋จ์ ํ์ด์ฌ ๋์กฐ๋ก๋ ์ฐจ์ด 0 ์ผ๋ก ๋ณด์ฌ ๋ชป ์ก๋๋ค(์ฝ๋ ์๊ฐ ์์ชฝ ๋ค ๋ญ๊ฐ์ง). โ ๋ฃ์ ํ์ ์ง์ฐ๊ณ ์๋ฒ์ธกINSERT .. SELECT๋ก ์ฌ๋ณต์ฌ(์์์display_order์กฐ์ธ์ผ๋ก ์detail_no๋งคํ). rules ๐ ๋ฑ๋ก. - ๊ฒ์ฆ = โ ์๋ฒ์ธก
NOT (a.col <=> b.col)์ ์ปฌ๋ผ ์กฐ์ธ โ detailยทsub ๋ถ์ผ์น 0ํ โกSUM(amount)ยทSUM(margin_total_amount)708 = 747 ์์ ์ผ์น โข708 ๋ฌด๋ณ๊ฒฝ ํ์ธ(50ํยทํฉ๊ณ ๊ทธ๋๋ก) โฃ์ด์ ํ๋ฉด ์ค๋ธ๋ผ์ฐ์ (scripts/_est_daewoo_ui_check.py prod) ALL PASS โ 747 ์ ํ์ 5๊ฐ(59Aยท59Bยท84Aยท84Bยท84C)ยท์ฃผ๋ฐฉ(K)5/๊ฐ๊ตฌ(F)4ยท๊ฒฌ์ ์ด์ก 43,563,000 ํ์, ์ฝ์ ์๋ฌ 0. - ๋กค๋ฐฑ = 747 ์
detail_no 35494~35543(+๊ทธ ์์ sub) ์ญ์ + ๋ง์คํฐ ํฉ๊ณ 0 ๋ณต์. ์คํฌ๋ฆฝํธ๋ ์ ๋ถpfs/scripts/_est_daewoo_*.py(๋ฏธ์ถ์ ). - โณํํ = ์ด์ ์ก์(
/estimate/modify-v2/747โ ํ์ ๋ณ๋ก ํญ๋ชฉ ํ์ธ ํ 2์ฐจ ๋ด์ฉ ์์ ).
๐ NOW (2026-08-10) โ ์์ฐ ์คํฐ์ปค ์ถ๋ ฅ ํ์ ์ด๊ธฐํ ๋ฒํผ(์ด๊ด๋ฆฌ์ ์ ์ฉ) โ ์ด์๋ฐฐํฌ ์๋ฃ
ํํ QA(qa_helper, ๋์ด ํ์ โ2ํ 09 Aug 2026 ์ ๋์น ์
) = "์ถ๋ ฅ ํ์ ์ด๊ธฐํ ๋ฒํผ์ ์ถ๊ฐํด์ค.
๊ด๋ฆฌ์๋ง ์ฌ์ฉ๊ฐ๋ฅ. ๊ด๋ฆฌ์ ์์ด๋๋ง ๋ณผ ์ ์๊ฒ ์ค์ . ํ์ด์ง ์ด๋ ๋ฒํผ ํ์ ์ฐ์ธก ๋์ ์ถ๊ฐ."
(1์ฐจ ์ง์์ ์ด์๋ฐฐํฌ ๋ง์ด ์์ด ํ
์คํธ๊น์ง๋ง ํ๊ณ , ๊ฐ์ ๋ ํํ๊ฐ ์ฑํ
์ ใ์ด์๋ฐฐํฌ ์งํใ ์ง์ ์
๋ ฅ โ ๋ฐฐํฌ.)
๋ฐฐํฌ = master b590f3e โ deploy-live 84fcb2f(3ํ์ผ ์ ๋ณ ํฌ์๋). ์ด์ RDS DDL ์ ํ ์ ์ฉ ์๋ฃ.
๐๊ฐ์ ํ์ผ์ ์ค๋ ค 8/7 ๋ฐฑ๋ก๊ทธ๋ ํจ๊ป ๋ฐ์๋๋ค = sticker_controller sync target ํ ์ค
(์ด์ ํ๋ฉด ใ์์
๋๊ธฐํใ๊ฐ ํ
์คํธ DB ๋ฅผ ๊ฐฑ์ ํ๋ ๊ฒ โ FLASK_CONFIGURATION ๊ธฐ์ค prod/test ๊ฒฐ์ ).
โ ์ฌ์ดํธ๋งต ๋ฏธ๋ฐ์ 1 โ 0.
- ๋ฒ์ = ํ์ฌ ์ ํ๋ ๋์ด๋ฐ์ฃผ์ ํ์ผ ์ ์ฒด(๋ชจ๋ ํ์ด์ง) โ ํํ ํ1. "์ด ๋ฐ์ฃผ์ ๋ค์ ์ฒ์๋ถํฐ ๋ฝ๋๋ค"๊ฐ ์ค์ ์ํฉ.
- ๊ถํ 2๊ฒน = โ ํ
ํ๋ฆฟ
{% if is_super_admin %}๋ก ๋ฒํผ ์์ฒด๊ฐ ๊ด๋ฆฌ์์๊ฒ๋ง ๋ ๋ โก์๋ฒPOST /api/sticker/print-log/reset๊ฐsession.is_super_admin์ ๋ค์ ํ์ธ. ๋น๋ก๊ทธ์ธ์ ๊ธฐ์กด ๊ฒ์ดํธ๊ฐ 401. - ๐DELETE ๊ฐ ์๋๋ผ ์ํํธ ๋๋ฆฌํธ โ
sticker_print_log.remove_yn='1'+removed_byยทremoved_at. ๋๊ฐ ์ธ์ ์ง์ ๋์ง ๋จ๊ณ , ์๋ชป ๋๋ฌ๋ DB ์์ ๋์ด๋ฆด ์ ์๋ค. ์กฐํ 2๊ณณ(select_print_logs,select_print_log_history)์remove_yn='0'ํํฐ ์ถ๊ฐ. - ํ์ธ ๋ํ์์์ ๋์ ํ๋ชฉ ์ยท"๊ธฐ๋ก์ ๋จ์ ๋ณต๊ตฌ ๊ฐ๋ฅ" ์ ์ ์ด ์ค์กฐ์์ ์ค์๋ค. ๋ฒํผ์ ๋ถ์ ํ
๋๋ฆฌ๋ก ํ์ด์ง
๋ฒํผ๊ณผ ๊ตฌ๋ถ(์ฐ์ธก ๋,
.pn-reset). - ์คํค๋ง
scripts/codi_sticker_printlog_reset_schema.py(๋ฉฑ๋ฑ โ ์ปฌ๋ผ 3 +ix_spl_live). โ.gitignore์scripts/codi_*๋ผ ์ถ์ ์ ๋จ(์ codi_sticker_.py ๋ ๊ท์น ์๊ธฐ๊ธฐ ์ ์ ๋ค์ด๊ฐ ๊ฒ). ํ ์คํธยท์ด์ RDS ๋ ๋ค ์ ์ฉ ์๋ฃ(์ด์์_codi_sticker_printlog_reset_schema_prod.py= ENV_PATH ๋ง ๋ค๋ฅธ ์ฌ๋ณธ, ์ฝ๋ ๋ฐฐํฌ๋ณด๋ค ๋จผ์ ์คํ). ์ด์ ์ ์ฉ ํ ์ค์ธก = ์ปฌ๋ผ 3๊ฐ ์กด์ฌ ยท ๊ธฐ๋ก 3ํ ์ ๋ถremove_yn='0'(๋ฐ์ดํฐ ๋ฌด๋ณ๊ฒฝ*). - ๊ฒ์ฆ = ์ ์ค
scripts/_sticker_printlog_reset_check.py {test|prod}โ ํ ์คํธ 19 + ์ด์ 13 ALL PASS (์์ค ๊ฒ์ดํธ 6 ยท ๋น๋ก๊ทธ์ธ 401 ยท ๋ฒํผ ๋ ธ์ถ/ํ ๋ง์ง๋ง/์ฐ์ธก ๋ ยท ์ค์ ์ด๊ธฐํ โ3โ0 ยท ํ 25ํ ๋ณด์กด ยท ๋ค๋ฅธ ๋ฐ์ฃผ์ยท๋ค๋ฅธ source ๊ธฐ๋ก ๋ณด์กด ยท ์์๋ณต๊ตฌ ยท ์ฝ์ 0). prod ๋ชจ๋๋ ์ฝ๊ธฐ ์ ์ฉ(๋ฒํผยท๊ถํยท์์ค๋ง, ์ด๊ธฐํ ์ ๋๋ฆ). - ๐ด๊ฒ์ฆ ํจ์ = ํ
์คํธ DB ์ ใ์งํ์ค ํ์ฅ์ ์ฐ๊ฒฐ๋ ์ด์์๋ ๋์ด๋ฐ์ฃผ์ใ๊ฐ 0๊ฑด์ด๋ผ ํ๋ฉด์ ํ๊ฐ ์ ๋ฌ๋ค.
๊ธฐ๋ก์ด ์๋
file 222๋door_order_file.remove_yn='1'์ธ ์ญ์ ํ์ผ(์นฉ 0๊ฐ)์ด์๋ค โ ์ด์์๋file 241(๊ธ๊ฐ ๋ถ์ฐ์์ฝ, 264ํ๋ชฉ)์ ์งํ์ค ํ์ฅ2142์ ์์ ์ฐ๊ฒฐ + ๊ธฐ๋ก ์๋ โ ๊ฒ์ฆ โ ์ฐ๊ฒฐ ํด์ + ์๋ ํ ์ญ์ . ์๋ณต ํ์ธ = ๋ก๊ทธ 16ํ ์ ๋ถremove_yn='0'ยท file222โ2099 ยท file241โNULL(SSM ์ค์ธก). - โ ์ด์์์๋ ์ด๊ธฐํ๋ฅผ ์ ๋๋ ๋ค โ ์ด์ ๊ธฐ๋ก 3ํ์ด ์ค๋ฐ์ดํฐ๋ผ ์ง์ฐ๋ฉด ์ ๋๋ค. ์ด์ ๊ฒ์ฆ์ ์ฝ๊ธฐ ์ ์ฉ (๋ฒํผ ๋ ธ์ถยท์์นยท๊ถํ ๊ฒ์ดํธยท๋น๋ก๊ทธ์ธ 401ยท์์ค ๊ฒ์ดํธ)๊น์ง. ์ค์ ์ด๊ธฐํ ๋์ ํ์ธ์ ํ ์คํธ์์ ๋๋๋ค.
- ๐ด๋ฐฐํฌ ํจ์ = ๋ค๋ฅธ ์ธ์
์ด
deploy-live์ํฌํธ๋ฆฌ๋ฅผ ์ก๊ณ ์์ผ๋ฉดgit worktree add๊ฐ ๊ฑฐ๋ถ๋๋ค. ์ด๋ฒ์ ๊ทธ ๊ฒฝ๋ก์.git์ด ์๋ ๊นจ์ง ๋ฑ๋ก์ด์๋๋ฐ๋ ๋ธ๋์น๊ฐ ๋ฌถ์ฌ ์์๋ค โgit worktree add --detach <๊ฒฝ๋ก> origin/deploy-live๋ก ๋ถ๊ณgit push origin HEAD:deploy-live. ๋จ์ ๋ฑ๋ก์ ์ง์ฐ์ง ์๊ณ , ์ถฉ๋ํ๋ฉด non-fast-forward ๋ก ์์ ํ๊ฒ ์คํจํ๋ค(rules ๐). - โณํํ = ์ด์ ์ก์(์ด๊ด๋ฆฌ์๋ก
/production/stickerโ ๋ฐ์ฃผ์ ์ฐ๊ฒฐ๋ ํ์ฅ โ ์ฐ์ธก ๋โบ ์ถ๋ ฅ ํ์ ์ด๊ธฐํ).
๐ NOW (2026-08-10) โ ์์ฐ ์คํฐ์ปค ํ์ฅ ๊ฒ์์ ๊ฒฌ์ ์ ๋ฑ๋ก๊ณผ ๊ฐ์ ํ ์์์ผ๋ก โ ์ด์๋ฐฐํฌ ์๋ฃ
ํํ QA(qa_helper, #stk-field-input) = "๊ฒฌ์ ์ ๋ฑ๋ก์ ํ์ฅ๋ช
๊ฒ์ ๋ฆฌ์คํธ ์์์ ์ฌ๊ธฐ์ ์ ์ฉํด์ค.
๋๋ฌด ๊ฐ๋จํ๊ฒ ๋์ค๊ณ ๋ด์ฉ์ด ์ ์ ๋ณด์. ์ด์๋ฐฐํฌ"
๋ฐฐํฌ = master fa34a53+cda67b2+582593a โ deploy-live ae9e767(2ํ์ผ ์ ๋ณ ํฌ์๋ ยท ์์ worktree).
- ์ข
์ = ํญ 340px ๋๋กญ๋ค์ด ํ ์ค(
ํ์ฅ๋ช+ ํ์์ ์ฒด๋ช ยท 2026-08-17). ์ง๊ธ = ๊ฒฌ์ ์ ๋ฑ๋ก(estimate_regist_v2)๊ณผ ๊ฐ์ 5์ปฌ๋ผ ํ โ ์ ์ฒด๋ช / ํ์ฅ๋ช / ๊ตฌ๋ถ ์นฉ / ์์ฐจ์ผ / ๋ด๋น์ + ํค๋ ํด๋ฆญ ์ ๋ ฌ + ๊ฒฐ๊ณผ ๊ฑด์. ํญ 780px (max-width:100vw-60px), ์ต๋๋์ด 320โ420px, ํค๋ยท์ปฌ๋ผํค๋ sticky. - ๋ชจ๋ฌ์ด ์๋๋ผ ์ธ๋ผ์ธ ๋๋กญ๋ค์ด์ ๋ํ ๊ฒ(ํํ ํ1) โ ๊ฒฌ์ ์๋ ๋ชจ๋ฌ์ด์ง๋ง ์์ฐํ์ ํ์ฅ์ ์์ฃผ ๋ฐ๊พธ๋ฏ๋ก ํด๋ฆญ ์๋ฅผ ๋๋ฆฌ์ง ์๋๋ค. ๋ฆฌ์คํธ ์์๋ง ๊ฐ์ ธ์๋ค.
- DAO =
field_div_name(๊ธฐ์กด๊ณผ ๊ฐ์CONVERT_MULTI_COMMON_CODE, common_code ์กฐ์ธ ์ ์)ยทcompany_member_name์ถ๊ฐ, ํค์๋๊ฐ ์ ์ฒด๋ช ๊น์ง ๊ฒ์(a.name LIKE OR b.name LIKEโ ๊ฒฌ์ site-search ์ ๋์ผ). ์งํ์ค(production_status.field_status='20') ๊ฒ์ดํธยท3๊ฐ์์ ~1๋ ํ ์ฐฝยทLIMIT 100 ์ ๋ฌด๋ณ๊ฒฝ. - ์์ฐจ์ผ =
26.8.17(์)(ํํ ๋ ์ง ๊ท์น). ๋น ๊ฐ์ ์ ๋ ฌ ๋ฐฉํฅ๊ณผ ๋ฌด๊ดํ๊ฒ ํญ์ ๋ค๋ก(์์ฐจ์ผ ๋ฏธ์ ํ์ฅ์ด ๋งจ ์๋ฅผ ์ฐจ์งํ์ง ์๊ฒ). ์ ํ ํ๋ฆยท์คํฐ์ปค ํค๋ ํ๊ธฐ๋ ์๋์ง ์์๋ค(field_name๊ทธ๋๋ก ์ฌ์ฉ). - ๐ด์์ฒด๊ฒ์ฌ๊ฐ ์ค๋ฒ๊ทธ 1๊ฑด ์ ๋ฐ = ์ ๋ ฌ ํ ๋ฒ ๋๋ฅด๋ฉด ํจ๋์ด ๋ซํ๋ค. ์ ๋ ฌ ํธ๋ค๋ฌ๊ฐ
.html()๋ก ํ๋ฅผ ๋ค์ ๊ทธ๋ฆฌ๋๋ฐ, ๋ค์ด์ด ๋๋ ใํจ๋ ๋ฐ ํด๋ฆญ์ด๋ฉด ๋ซ๊ธฐใ ํธ๋ค๋ฌ๊ฐ ๋ณผ ๋e.target(ํด๋ฆญํ th)์ ์ด๋ฏธ DOM ์์ ๋จ์ด์ ธ ๋๊ฐclosest('.stk-field-pick')๊ฐ 0 โ ๋ฐ ํด๋ฆญ์ผ๋ก ์คํ. โ ์ ๋ ฌยท์ด๊ธฐํ ํธ๋ค๋ฌ์stopPropagation(rules ๐ ๋ฑ๋ก). - ๊ฒ์ฆ = ์ ์ค
scripts/_sticker_field_search_check.py {test|prod}(๋ฏธ์ถ์ ) โ ํ ์คํธ 40 + ์ด์ 40 ALL PASS (์๋ต ํค 8ยท์ปฌ๋ผ/์ ๋ ฌํค ์ผ์นยท๊ฑด์ ์ผ์นยทํญ 780ยท๊ฐ๋ก์คํฌ๋กค 0ยท๋ ์ง ํ์ยท์ ๋ ฌ 3์ข +ํจ๋ ์ ์ง ํ๊ทยท์ ์ฒด๋ช ๊ฒ์ยท ํ ํด๋ฆญ ํ๊ทยท์ฝ์ 0). ์ฝ๊ธฐ ์ ์ฉ์ด๋ผ ์ด์ ์คํ ๋ฌดํด(GET + ํ๋ฉด ์กฐ์๋ง, ์ฐ๊ธฐ ์์). - ์ฌ์ดํธ๋งต ์ฌ๋น๋ = ๊ทธ๋ฃน8ยทํ์ด์ง 50ยท๋ฏธ๋ฐ์ 1 โ ๋จ์ 1๊ฑด์
sticker_controller.pysync target ํ ์ค (8/7 ๋ฐฑ๋ก๊ทธ, ์์ปค ์ด์ค๊ฒฐ์ ์ผ๋ก ๋์์ ์ ์). ์ด๋ฒ ๊ฑด์ ์ ๋ถ ๋ฐ์๋จ. - โณํํ = โ ์ด์ ์ก์ โก
sticker_controllerํ ์ค ์ด์๋ฐฐํฌ ์ง์ ์ฌ๋ถ.
๐ NOW (2026-08-10 ยท 3์ฐจ) โ ํ๋ช ์ธ๋ผ์ธ ํธ์ง ์ ํญ๋ชฉ ํ๋ + ์ํธ ์ ๊ณ ์ผ์ ๋ณํฉ ์ฃผ์ํ ์ ์ธ โ ์ด์๋ฐฐํฌ ์๋ฃ
ํํ = "์๋ ํ์ธ ์๋ฃ. ๋ชจ๋ ํญ๋ชฉ ์์ฌ๊ด๋ฆฌยท์ค์ ์จ ์์ฌ๊ด๋ฆฌ์์ ํ๋ช ์์ ๊ฐ๋ฅํ๊ฒ. ํผ์ค์๊ฑด : ์ํธ๊ฐ ํฌํจ๋ ํ์ด ๊ธฐ์กด ๋ธ๋ก์์์ด ์๋ ๋ณํฉ๋ ํ์ด๋ฉด ์ ๊ฑฐํ๋ค. ์ํธ ์ ๊ณ ์ผ์ ์ ๋ํ ์ ๋ณด๋ค." ์ด์๋ฐฐํฌ.
๋ฐฐํฌ = master d1cb28e โ deploy-live b295283(2ํ์ผ ์ ๋ณ ํฌ์๋ ยท --detach worktree).
- โ ํ๋ช
ํธ์ง โ ์ค์ ์จ ์ธ ์ ํญ๋ชฉ๋ ํ์์ ํด๋ฆญ ํธ์ง(
nameChip/opEditName/setItemName). ์ ์ฅ์ ์ ๋ฉด/ํ๋ฉด๊ณผ ๊ฐ์item_name_user๋ผ ๊ธฐ์กด ์์ฌ๊ด๋ฆฌ ํญ๊ณผ ๊ทธ๋๋ก ์ฐ๋(์ถ๊ฐ ๋ฐฐ์ 0). - โก ๋ณํฉ ์ฃผ์ํ ์ ์ธ โ ๐์์
์ค๋ฌผ ํ์ธ์ด ๋ต์ด์๋ค: ํฌ์ธ ๋ฐ์ฃผ์ ํ์ค์ ํ๋ช
B:Cยท๊ท๊ฒฉD:E๋ฅผ ๊ฐ๊ฐ ๋ณํฉํ๋๋ฐ, ์ฃผ์ํ์B:Gํ ์นธ์ผ๋ก ํฉ์ณ ์ด๋ค(ํผ์ค์ ํญ ํ68 =์ํธ : 7.22(์) 13๋ฏธํฐ 1๋กค ์ฐจ๋ ์ ๊ณ). โ ํ์๊ฐ ํ๋ช ์นธ ๋ณํฉ์ด ๊ท๊ฒฉ์นธ๊น์ง ๋ฎ์ผ๋ฉด ์ฃผ์ํ์ผ๋ก ๋ณด๊ณ , ๊ทธ์ค '์ํธ'๊ฐ ๋ ๊ฒ๋ง ์์ง ์ ์ธ. ๐JARVIS 1096.19 / 9T MDF ์ํธ/์ฌ๊ณ PP(ํ66)๋ ์ ์ ํญ๋ชฉํ์ด๋ผ ๊ทธ๋๋ก ๋๋ค โ ๊ทธ ํ์ ๊ณ์ ์ํธ(T)๋ก ๋ถ๋ฅ๋๋ค (ํํ ๊ท์น์ด "๊ท๊ฒฉ์ ์ํธ"์ด๋ฏ๋ก). ๋นผ๋ ค๋ฉด ๊ทธ ํ ๊ท๊ฒฉ์์ '์ํธ'๋ฅผ ์ง์ฐ๋ฉด ๋๋ค. ๊ธฐ์กด ์ ์ฌ๋ถ = ํ ์คํธ 4๊ฑด soft delete(del_manual='1'), ์ด์์ ๋๊ธฐํ๊ฐ ์ด๋ฏธ ์ ๋ฆฌํด 0๊ฑด. โ ์ฌ์ด๋์นด ์ฌ์์ ๋ถํ์ โorderpaper_sync.py๋subprocess๋ก ๋๋ค(์ ๋ก๋ ํ์๋งsys.modules์บ์).
๊ฒ์ฆ = scripts/_omc_material_check.py ํ
์คํธยท์ด์ ALL PASS(ํ๋ช
์นธ ์ ๋ ํธ์ง ๊ฐ๋ฅยท์ํธ ์ฃผ์ํ 0) +
์ ์ค scripts/_pnr_sheet_row_probe.py ํ์ ์์ฒด๊ฒ์ฌ(ํฉ์ฑ 4์ผ์ด์ค + NAS ์คํ์ผ ๋์กฐ) ALL PASS.
์ฌ์ดํธ๋งต = ๊ทธ๋ฃน8ยทํ์ด์ง50ยท๋ฏธ๋ฐ์ 0.
โณํํ = ์ด์ ์ก์(ํ๋ช ํด๋ฆญ ํธ์ง ยท ์ํธ ๊ทธ๋ฃน์์ ์ ๊ณ ์ผ์ ๋ฉ๋ชจ ์ฌ๋ผ์ก๋์ง).
๐ NOW (2026-08-10 ยท 2์ฐจ) โ ์ํธ(T) ์์ฌ๋ถ๋ฅ ์ ์ค + ์ค์ ์จ ์ ๋ฉด/ํ๋ฉด ํธ์ง + ์ค์ ์จ ํ๋ฉด ํผ์นจยท์ํธ ์ฐ์ โ ์ด์๋ฐฐํฌ ์๋ฃ
ํํ QA 3๊ฑด = โ "์ ๋ฉดยทํ๋ฉด ํ๋ช ์์ ๊ฐ๋ฅํ๊ฒ. ๊ธฐ์กด ์์ฌ๊ด๋ฆฌํ์ด์ง์ ์์ ๊ฒฐ๊ณผ ์ฐ๋. ๊ธฐ์กด ๋ฐ์ฃผ์ ์ ๋ฆฌ ํญ์์๋ ์ ๋ฉด/ํ๋ฉด ๋ถ๋ฆฌ โ ์ค์ ์จ ํ ์ด๋ธ๋ง" โก"๋ถ์์ฌ๋ก ๋ถ๋ฅ๋๋ ์ํธ ํญ๋ชฉ์ ๋ณ๋ ์ํธ ํญ๋ชฉ์ผ๋ก ๋ถ๋ฆฌ. ํํฐ๋ ์ถ๊ฐ. ์์ฌ๊ด๋ฆฌ ์ ํ์ด์ง ์ ์ฉ. ๊ธฐ์กด๋ถยท์ถ๊ฐ๋ถ ๋ชจ๋. ์ํธ๋ ๊ท๊ฒฉ์ ํญ์ '์ํธ'๊ฐ ํฌํจ" โข"์ค์ ์จ ์์ฌ๊ด๋ฆฌ ํ์ฅ๋ณ ๊ทธ๋ฃน ๊ธฐ๋ณธ ํผ์นจ(์๋ฃํญ๋ชฉ์ ๊ทธ๋๋ก ์จ๊น), ํ์ฅ ์นด๋ ์๋จ์ ์ํธ ๊ทธ๋ฃน ๋จผ์ โ ์ค์ ์จ์์ ์ํธ ์ ๊ณ ์ฒดํฌ์ฉ". ์ด์๋ฐฐํฌ.
๋ฐฐํฌ = master 945ab51+26d2533 โ deploy-live 5222bed(8ํ์ผ ์ ๋ณ ํฌ์๋ ยท ์์ worktree). DB ๋ณ๊ฒฝ 0.
- โ ์ ๋ฉด/ํ๋ฉด ํธ์ง โ
PATCH /api/orderpaper/{no}/item-name(=item_name_user)์ ํฉ์น ํ๋ช ํ ํ๋๋ก ์ ์ฅํ๋ ๊ธฐ์กด ์์ฌ๊ด๋ฆฌ ํญยท๋ชฉ๋ก์ด ์๋์ผ๋ก ๊ฐ์ ๊ฐ์ ๋ณธ๋ค(์ฐ๋ ๋ณ๋ ์ฝ๋ 0). ์ฌ์กฐ๋ฆฝ ๊ท์ฝ = ํ์omc_raw_fields์ ๋์ผ. ๐๊ท๊ฒฉ์ ์๋ฉด/๋จ๋ฉด๋ ๊ฐ์ด ๋ง์ถ๋ค โ ํ๋ฉด์ ๋น์๋ ๊ท๊ฒฉ์ด '์๋ฉด'์ด๋ฉดopFaceParts๊ฐ ํ๋ฉด=์ ๋ฉด์ผ๋ก ๋์ด๋ ค ํธ์ง์ด ์ ๋จน์ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค. ๋ถ๋ฆฌยทํธ์ง์ ๋ฐ์ฃผ์ฒ๊ฐ ์ค์ ์จ์ธ ๋ธ๋ก๋ง(์ค์ ์จ ํ๋ฉดยท๊ธฐ์กด ํญ ๊ณตํต ๊ท์น). - โก ์ํธ(T) โ ์ปฌ๋ผ์ ์ ์ฑ์ฐ๊ณ ์กฐํ ์์ ์ ํ์์์ผฐ๋ค(
orderpaper_dao._MT, ๊ท๊ฒฉ์ '์ํธ' โ T). ๐์ ์ฅ๊ฐ์ ๋ฐ๊พธ๋ฉดitem_key/block_key๊ฐsha1(โฆ,material_type)์ด๋ผ ๋ค์ ๋๊ธฐํ๊ฐ ์ ํ์ ์ ํ์ผ๋ก ๋ง๋ค์ด ์ฌ์ฉ์ ํธ์งยท์ํยท์ฌ์ฉ์ด๋ ฅ์ด ๋๊ธด๋ค. ํ์์ด๋ผ ๊ธฐ์กด 85๊ฑด + ์ถํ ์ถ๊ฐ๋ถ์ด ๋ง์ด๊ทธ๋ ์ด์ 0์ผ๋ก ๊ฐ์ ๊ท์น์ ํ๋ค. ํ๋ฉด 4๊ณณ(๋ฐ์ฃผ์์ ๋ฆฌยท์ ๊ณ ์ผ์ ยท์์ฌ๊ด๋ฆฌ ํญยท์ค์ ์จ) ์ ๋ถ์ ํํฐ ๋ฒํผยท์์(#2563eb)ยท์ ๋ ฌ ๋ฐ์. โ ์ ์ฅ๋ ํํฐ๊ฐS.mat๋ฅผ ํต์งธ๋ก ๋ฎ์ด์จ ์ ๊ท ๋ถ๋ฅ๊ฐundefined=์ ์ธ๊ฐ ๋๋ฏ๋ก ๋ณต์ ์ ๊ธฐ๋ณธ๊ฐ๊ณผ ๋ณํฉ. ๐ดํ์์ ๋๊ฐ = ํ ๋ธ๋ก์ ์ํธ/๋น์ํธ๊ฐ ์์ธ๋ค(์ด์ 59๋ธ๋ก ์ค 23) โ ๋ธ๋ก ์ผ๊ด์กฐ์ 4์ข (block-statusยทblock-receive-dateยทโฆ-bulkยทblock-delete)์ ์์ฌ๋ถ๋ฅ๋ฅผ ๊ฐ์ด ๋๊ฒจ ๊ทธ ์น์ ๋ง ๋ฐ๊พธ๊ฒ ์ขํ๋ค. ์ ๊ณ ์ณค์ผ๋ฉด ์ํธ ์น์ ์ ใ์ํ ์ผ๊ดใ์ด ํ๋ฉด์ ์๋ ๋ถ์์ฌ ํ๊น์ง ๋ฐ๊ฟจ๋ค(์ค์ ์จ ํ๋ฉด์ ๊ทธ ํ์ด ์ ๋ณด์ธ๋ค). - โข ์ค์ ์จ ํ๋ฉด โ ํ์ฅ ์นด๋ยท์
์ฒด ๋ธ๋ก ๊ธฐ๋ณธ ํผ์นจ(
OP_FOLDCFG.card/block=true, ์๋ฃ ํญ๋ชฉ๋ง ์ ํ) + ์ํธ ์น์ ์ต์๋จ. ๐์ํธ๋ ์ค์ ์จ ๋ฐ์ฃผ๊ฐ ์๋๋ค โ ์ํธ์ ์ฒด(์กฐ์ดIMTยท๋ฐ์ฝ๋ฐธ๋ฆฌยท๋ฏธ๋ฆผยท์ ์ ์ด์ค์ โฆ)์ ๋ฐ์ฃผํด ์ค์ ์จ๋ก ์ ๊ณ ๋๋ค. ์ค์ธก ๋ฐ์ฃผ์ฒ ์ค์ ์จ + ๊ท๊ฒฉ '์ํธ' = ์ด์ 0๊ฑด โ ์ค์ ์จ๋ง ๊ฑธ๋ฉด ์ํธ ๊ทธ๋ฃน์ด ์์ํ ๋น๋ค. ๊ทธ๋์ ์ด ํ๋ฉด ๋ฐ์ดํฐ =๋ฐ์ฃผ์ฒ ์ค์ ์จ OR ์์ฌ๋ถ๋ฅ T. โ ๋ถ์์ฉ = ์ค์ ์จ ๋ฐ์ฃผ๊ฐ ์๊ณ ์ํธ๋ง ์๋ ํ์ฅ ์นด๋๋ ๋ฌ๋ค(์ด์ 4โ5์นด๋).
๊ฒ์ฆ = scripts/_omc_material_check.py {test|prod} ํ์ฅ โ ํ
์คํธ ALL PASS + ์ด์ ALL PASS.
ํ
์คํธ์์๋ง ์ฐ๊ธฐ ์๋ณต 2๊ฑด(โ ์ ๋ฉด/ํ๋ฉด ์ ์ฅ โ ์๋ฒ ํฉ์น ํ๋ช
ํ์ธ โ ์๋ณต โกํผํฉ ๋ธ๋ก์ ์ํธ ํ์ ์ํ์ผ๊ด โ
์ํธ 2ํ๋ง ๋ฐ๋๊ณ ๋น์ํธ 3ํ ๋ฌด๋ณ๊ฒฝ โ ์ ๋ ์๋ณต). ์ด์์ ์ฝ๊ธฐ์ ์ฉ(ํผ์นจยท์คํฌ๋กคยท์ธํ์ด์ง ํจ์๋ง).
์ฌ์ดํธ๋งต = ๊ทธ๋ฃน8ยทํ์ด์ง50ยท๋ฏธ๋ฐ์ 1(/production/sticker, ๋ค๋ฅธ ์ธ์
์งํ๋ถ).
โณํํ = ์ด์ ์ก์ โ /omc/material(์ํธ ๊ทธ๋ฃน ์ต์๋จยท์ ๋ฉด/ํ๋ฉด ํธ์ง) ยท /field/orderpaper(์ํธ ํํฐยท์ค์ ์จ ์ ๋ฉด/ํ๋ฉด).
โํ๋จ ํ์ 1๊ฑด = ๊ท๊ฒฉ 9T MDF ์ํธ/์ฌ๊ณ PP(ํผ์ค์, 1ํ)๋ ๋ณด๋์ธ๋ฐ ๊ท๊ฒฉ์ '์ํธ'๊ฐ ์์ด ์ํธ๋ก ์กํ๋ค.
์๋๋ฉด ์์ฌ๊ด๋ฆฌ ํญ์์ ๊ทธ ํ ๊ท๊ฒฉ์ ๊ณ ์น๋ฉด ๋๋ค.
๐ NOW (2026-08-10) โ QA 2๊ฑด: ์ฌ์ด๋ ๋ฉ๋ด ์คํฌ๋กค + ์ค์ ์จ ์ ์ฉ ์์ฌ๊ด๋ฆฌ(/omc/material) โ ์ด์๋ฐฐํฌ ์๋ฃ
ํํ QA(qa_helper) = โ "์ฌ์ด๋ ๋ฉ๋ด ํ์ฌ์ํ์์๋ ์คํฌ๋กค ๋๊ฒ. ํ๋จ ๋ฉ๋ด๊ฐ ๋๋ฌด ๋ฐ์ ์์ด ์ ํ์ด ์ด๋ ค์. ํ๋จ ์คํฌ๋กค ์ ์์คํ ๊ด๋ฆฌ ์ดํ๋ก๋ ์๋จ์์ ๋ฒ์ด๋์ง ์๊ฒ ๊ธฐ์ค์ ์ง์ . ์ด์๋ฐฐํฌ ์น์ธ" โก"์ค์ ์จ ์ ์ฉ ์์ฌ๊ด๋ฆฌ ํ์ด์ง ์์ฑ. field/orderpaper ๋ฐ์ฃผ์ ์ ๋ฆฌ ํญ ๊ธฐ์ค. ์์ด๋ ๋๋ ๊ฒ = ํ์ฅ๋ณ/์ ์ฒด๋ณ ํ ๊ธยท ๋๊ธฐํ ์ฌ์ด๋์นด ๋ฒํผยท์ญ์ /์จ๊น(์ค์ ์จ ์ ์ ์๋ ๋ถ๊ฐ)ยท์์์ฌ ํํฐ ๋์ผ ๋ผ์ธ ๋ชจ๋ ๋ฒํผยท๋น ๋ฅธํํฐ ๋ผ์ธ. ํ๋ช ์ ์ ๋ฉด/ํ๋ฉด ์ปฌ๋ผ ๋ถ๋ฆฌํด ํ๋ฉด ์์ฌ ํ์(ํฉ์น ์ปฌ๋ฌ ๋ ์๋ ๊ดํธ ํ๊ธฐ ์ ๊ฑฐ). ์ด์๋ฐฐํฌ"
๋ฐฐํฌ = master f956d27+3e80d33 โ deploy-live f68f155(5ํ์ผ ์ ๋ณ ํฌ์๋ ยท ์์ worktree).
์ด์ RDS์ patch45 ์ ์ ์ฉ(menu_catalog OMC_MATERIAL 1ํ + company_permission ์ค์ ์จ(196) 1ํ, ๋ฉฑ๋ฑ).
โ ์ฌ์ด๋ ๋ฉ๋ด ์คํฌ๋กค โ ๐ด์๋ ์คํฌ๋กค์ด ์์ ์ ๋๋ค. ํ
๋ง๊ฐ .left-sidebar์ .scroll-sidebar๋ฅผ
๋ ๋ค height:100%๋ก ์ก๋๋ฐ ๊ทธ ์์ ๋ก๊ณ +์ฌ์ฉ์ ๋ธ๋ก(114px)์ด ์นํ ์์ด ์คํฌ๋กค ์์ญ ์๋ 114px๊ฐ ํ๋ฉด ๋ฐ์ด๊ณ ,
scrollHeight==clientHeight๋ผ perfect-scrollbar๊ฐ ์คํฌ๋กค์ ์ ๋ง๋ ๋ค(ํ ์ค์ธก scrollTop=0).
โ pfs_layout.css ยง10 ์ฌ์ด๋๋ฐ ์ธ๋ก flex(์คํฌ๋กค ์์ญ = ๋จ์ ๋์ด) + pfs.js pfsSidebarPad()๊ฐ
๊ธฐ์ค์ (์์คํ
๊ด๋ฆฌ)์ด ์๋จ์ ์๋ ๋งํผ๋ง ์คํฌ๋กค๋๋๋ก ul ํ๋จ ์ฌ๋ฐฑ์ ๋ฃ๋๋ค.
๐์ฌ๋ฐฑ์ ๊ณ์ฐ์ด ์๋๋ผ ์ค์ธก ๋ณด์ โ ์งง์ ์ฝํ
์ธ ๋ scrollHeight๊ฐ ์๋ฆฌ๊ณ , ps ๋ ์ผ(์ ๋๋ฐฐ์น)์ด 8.5px๋ฅผ ๋ํ๋ค
(1์ฐจ ๊ตฌํ์ด ๊ธฐ์ค์ ์ 8.5px ๋๊ฒจ ์ฌ๋ผ๊ฐ ์์ธ). 2ํจ์ค ๋ณด์ ํ ์ค์ฐจ 0.5px. ์์ธ = rules.md ๐.
โก ์ค์ ์จ ์์ฌ๊ด๋ฆฌ โ ํ๋ฉด์ ์๋ก ๋ง๋ค์ง ์์๋ค. /omc/material(omc_controller)์ด field_orderpaper.html์
omc_view=True๋ก ๋ ๋ํ๋ค(์ธ๋ผ์ธ JS 1,000์ค ๋ณต์ 0). ํ
ํ๋ฆฟยทJS๊ฐ ๊ทธ ํ๋๊ทธ๋ก ๊ฐ๋ผ์ง๋ค โ
ํญ๋ฐยท๋ค๋ฅธ ํญ ์ปจํ
์ด๋/JS 3ํ์ผยท๋ถ๋ฅํ ๊ธยทํด๋ฐ(์์ฌ/์จ๊น๊ด๋ฆฌ/์
๋ก๋/๋๊ธฐํ)ยท๋น ๋ฅธํํฐ ๋ผ์ธยท์นฉยท์์ธํํฐ/์
๋ก๋/์จ๊น ๋ชจ๋ฌ ์ ์ธ,
op-del-btnยท๋ธ๋ก์ญ์ ยท์จ๊นยทํ์ฅ์ฐ๊ฒฐ/์ฐ๊ฒฐ๋ณ๊ฒฝ ์ ์ธ(๋ฐ์ฃผ์ฒ๊ฐ pfs ํ์ฅ ๋งคํ์ ๋ฐ๊ฟ ์๋ฆฌ๊ฐ ์๋๋ผ ์ง์ ๋ชฉ๋ก์ ์์ด๋ ๋บ๋ค),
OP_ALL์ ์ ์ฌ ์งํ ๋ฐ์ฃผ์ฒ='์ค์ ์จ'๋ก ํํฐ(์นด์ดํธยทํํฐ ์ต์
๊น์ง ์ด ์งํฉ ๊ธฐ์ค), OP_MODE='site' ๊ณ ์ ,
opLoadState/opSaveState ์คํต(๋ฉ์ธ ํ๋ฉด๊ณผ ๊ฐ์ localStorage ํค๋ผ ํด์ UI ์์ด ํํฐ์ ๊ฐํ๋ค).
ํ๋ช
โ ์ ๋ฉด/ํ๋ฉด 2์ปฌ๋ผ(opFaceParts, ํ 7โ8์ปฌ๋ผ). ํธ์ง(์ํยท์
๊ณ ์ผยท๋ฐ์ฃผ๋ยท๋น๊ณ )์ ๊ทธ๋๋ก ๋๋ค.
- ๐ด๊ดํธ๊ฐ ์์ฌ๋๋ฒ์ ์ผ๋ถ์ธ ํ์ด ์ค์ ๋ก ์๋ค(70-113(PP)ยท์ ์ฌPP(WH240EMT)) โ ๊ณต๋ฐฑ ์๋ ' (' ๋ง ํฉ์น ํ๊ธฐ๋ก ๋ณธ๋ค. rules.md ๐.
- ์จ๊น ํ์ฅ์ ๊ธฐ์กด๊ณผ ๋๊ฐ์ด ์ ์ธํ๋ค(์ด์ ์ค์ ์จ 130ํญ๋ชฉ ์ค 99๊ฐ ์จ๊น ํ์ฅ โ ํ๋ฉด์ 4ํ์ฅ 31ํญ๋ชฉ).
์จ๊น์ ใ์ ์งยท์ค์ ์จ ์ ์ ์๋ ๋ถ๊ฐใ๋ผ๋ ์ง์๋๋ก ๋ฒํผ๋ง ์์ ๊ณ ๋์์ ๊ทธ๋๋ก ๋๋ค.
- ๊ถํ = ์ค์ ์จ(196)๋ง ๋ถ์ฌ. ์๋ฅ์ค(4)๋ OMC_SHEET/BOARD ๊ถํ์ด ์์ง๋ง ์ด ํ๋ฉด์ ์ ํ์ฅ์ ์ค์ ์จ ๋ฐ์ฃผ๋ฅผ ๋ณด์ฌ์ค ์ ์ธ.
ํฌ์ธ(์์ฌ)์ ๋ช
์ row ์์ผ๋ฉด ๊ธฐ๋ณธ ํ์ฉ์ด๋ผ ์๋ ๋
ธ์ถ.
๊ฒ์ฆ = ์ ์ค scripts/_omc_material_check.py {test|prod} [๋ทฐํฌํธ๋์ด](๋ฏธ์ถ์ , ์ฝ๊ธฐ์ ์ฉ โ ์นด๋ยท๋ธ๋ก ํผ์นจ๊ณผ
์คํฌ๋กค๋ง ๊ฑด๋๋ฆฌ๊ณ ์ ์ฅ ๋ฒํผ์ ์ ๋๋ฅธ๋ค, localStorage ์๋ณต) โ ํ
์คํธ ALL PASS(๋ทฐํฌํธ 700/800/1080) + ์ด์ ALL PASS.
์ ๋ฉด/ํ๋ฉด ๊ท์น 9์ผ์ด์ค๋ฅผ ํ์ด์ง์ opFaceParts๋ก ์ง์ ํธ์ถํด ๊ฒ์ฆ + ๊ธฐ์กด /field/orderpaper ํ๊ท(ํญ4ยท7์ปฌ๋ผยท์ญ์ ๋ฒํผยทํญJS 3๊ฐ) ํฌํจ, ์ฝ์ 0.
์ฌ์ดํธ๋งต ์ฌ๋น๋ = ๊ทธ๋ฃน8ยทํ์ด์ง 50(/omc/material ์ ๊ท, live ๋ฐ์ ํ์ธ)ยท๋ฏธ๋ฐ์ 1 = /production/sticker(๋ค๋ฅธ ์ธ์
์งํ๋ถ, ๋ณธ๊ฑด ๋ฌด๊ด).
โณํํ = ์ด์ ์ก์ โ โ ์ฌ์ด๋๋ฐ ๋๊น์ง ์คํฌ๋กค(์์คํ
๊ด๋ฆฌ๊ฐ ์๋จ์ ์๋์ง) โก/omc/material ํ๋ฉด.
๐ NOW (2026-08-07) โ field/worklog 3ํญ ใํตํฉํ์ฅใ(ํตํ+์นดํก ์ตํฉ) โ ์ด์๋ฐฐํฌ ์๋ฃ
ํํ ์ง์ = "s25์์ ์ฝ๋ ๋ด์ฉ(ํตํ์์งยท์นดํก)๊ณผ pfs worklog ์นดํก๋ฐฉ ๋ด์ฉ์ ์ตํฉ. ๋ชจ๋ ์ ๋ณด๋ฅผ ํ์ฅ ๋งค์นญํด ํ ์ฅ์์์. ๊ธฐ์กด ํญ ์ ์ง + ์ ํญ. ์งํ์ค ํ์ฅ ๊ธฐ์ค + ์ต๊ทผ ์ ์ ์๋ ์๋ฃํ์ฅ(๋ฏธ์ถ๊ณ ยท์ ๊ท์ ์ ์์ฃผ). ์ด์ ๋ฐฐํฌ ์น์ธ."
๋ฐฐํฌ = master 844fff8 โ deploy-live c6277a9(4ํ์ผ ์ ๋ณ ํฌ์๋ โ worklog dao/service/controller + field_worklog.html).
- ์ ๊ท API
GET /api/worklog/fusionโ worklog ์ด๋ฒ์ฃผ ์ฐฝ(source ๊ฒ์ดํธ ์์ = ํตํ+ํฅํ ์นดํก ์ ์ฌ๋ถ ์๋ ํฌํจ, privacyยท์จ๊นํ์ฅ์ ๊ธฐ์กด ์ ์ฌ์ฌ์ฉ) +kakao_board๋ฏธ๋ฌ๋ฅผproduction_status.field_status('10'๋๊ธฐ์ค/'20'์งํ์ค/'30'์๋ฃ) ๊ธฐ์ค ํ์ฅ ์นด๋๋ก ์กฐ๋ฆฝ. ์งํ์ค=์ ๋ถ ๋ ธ์ถ, ์๋ฃ('30')=๋ฏธ์ถ๊ณ ์น์ +์ด๋ฒ์ฃผ ํญ๋ชฉ๋ง(์ถ๊ณ ์๋ฃยท๊ธฐํ ๋น์), ๋๊ธฐ์ค/๋ฏธ์=๋ด์ฉ ์์ผ๋ฉด ์ ๋ถ. - ๋ฐฉโํ์ฅ ๋งค์นญ =
kakao_board.field_no์ง์ ์ฐ๊ฒฐ ์ฐ์ โ ์์ผ๋ฉด auto-link์ ๊ฐ์ ๊ฒ์ดํธ(์ ์80ยท์ ์ผ์น์ยท3์ยท์ปค๋ฒ๋ฆฌ์ง)๋ก site_nameโaliasโroom_name ์ ์ ์ฌ๋. ์คํจ๋ถ์ ใํ์ฅ ๋ฏธ์ฐ๊ฒฐใ ๊ทธ๋ฃน์ผ๋ก ํ๋ฉด ํ๋จ ๋ ธ์ถ(์ ๋ณด ์ ์ค ๊ธ์ง). ๊ฒ์๊ธ ์น์ ๋ถ๋ฅ๋ '๋ฏธ์ถ๊ณ ' ํ์ ์ '์ถ๊ณ '๋ณด๋ค ๋จผ์ ('๋ฏธ์ถ๊ณ '์ '์ถ๊ณ '๊ฐ ๋ถ๋ถ๋ฌธ์์ด). ใ๋ณ๋ ๋ฐ์ ์ด๋ ฅใ์ ๋ก๊ทธ๋ผ ์ ์ธ. - ํ๋ฉด = ๋ชจ์๋ณด๊ธฐ ์ ์ฉ(ํธ์ง์ 1ยท2ํญ), ๊ฒ์(ํด๋ผ ํํฐ)ยท์ ์ฒดํผ์นจยท์๋ก๊ณ ์นจ. ํญ ๋ฐฐ์ง=ํ์ฅ ์.
- ๊ฒ์ฆ = ์ ์ค
scripts/_worklog_fusion_check.py {--logic|test|prod}(๋ฏธ์ถ์ ) โ ๋ก์ง 17 + ํ ์คํธ 38 + ์ด์ 38ํญ๋ชฉ ALL PASS (API ๊ตฌ์กฐ 8ยท์ฐฝยท์ ๋ ฌยท์๋ฃํํฐ + UI ํญ์ ํยท์นด๋์ ์ผ์นยทํผ์นจยท๊ฒ์ยท1/2ํญ ํ๊ทยท์ฝ์ 0). ์ฝ๊ธฐ์ ์ฉ GET์ด๋ผ ์ด์ ์คํ ๋ฌดํด. - ์ด์ ์ค์ธก = ์งํ์ค 6ํ์ฅ(๊ธ๊ฐ ๋ถ์ฐ์์ฝ์ ์นดํก 20ํ ๋งค์นญ), ๋ฏธ์ฐ๊ฒฐ ๋ฐฉ 3(์ค์ ์จ ์์ฌ๋ฐฉยทSGC ์ฉ๋๋ยท์์ด๋น์ ผ ์๋ฌผ๋๋ฐฉ),
๋ฏธ์ฐ๊ฒฐ ํตํ๋ฌถ์ 9. ๐SGC ์ฉ๋๋ ๋ฐฉ์ด ๋ฏธ์ฐ๊ฒฐ์ธ ์ด์ = pfs ํ์ฅ ๋ชฉ๋ก์ ์ ์ฌ๋ช
ํ์ฅ์ด ์์(๋ฐฉ site_name "SGC ์ฉ๋๋ MH")
โ ํ์ฅ ๋ฑ๋ก๋๋ฉด ์๋ ๋งค์นญ, ๋๋ poin-agent
state.json์ site๋ฅผ pfs ํ์ฅ๋ช ์ ๋ง์ถ๋ฉด ๋๋ค. - ์ฌ์ดํธ๋งต ์ฌ๋น๋ = ๊ทธ๋ฃน8ยทํ์ด์ง49ยท๋ฏธ๋ฐ์ 1(
/production/stickerโ ๊ธฐ์กด ๋ฐฑ๋ก๊ทธ, ๋ณธ๊ฑด ๋ฌด๊ด. AL ์์ฌ๋ ๊ฑทํ)./field/worklog์ฃผํฉ ์์. - โณํํ ๋ชซ = ์ด์ ์ก์(
/field/worklogโ 3ํญ ใ๐งฉ ํตํฉํ์ฅใ) + ๋ฏธ์ฐ๊ฒฐ ๋ฐฉยท๋ฌถ์ ์ฐ๊ฒฐ ํ๋จ.
๐ NOW (2026-08-07) โ qa_helper ๋ค์ค์ ํ(๋๋๊ทธ ๋ฒ์์ง์ + Ctrl์ ํ) โ ์ด์๋ฐฐํฌ ์๋ฃ
ํํ ์ง์ = "qahelper ์ ํ๊ธฐ๋ฅ์ ๋๋๊ทธยทCtrl์ ํ ์ถ๊ฐ. ์ํฉ ํ๋จํด์ค" โ ํ๋จ ๋ณด๊ณ ํ "A๋ก ์งํ. pfs ์ด์๋ฐฐํฌ".
๋ฐฐํฌ = master adca587 โ deploy-live ff85064(2ํ์ผ ์ ๋ณ ํฌ์๋ = web/static/js/qa_helper.js + web/static/css/qa_helper.css).
A์ = N๊ฐ๋ฅผ 1ํญ๋ชฉ(๋ฌถ์) + ์ฝ๋ฉํธ 1๊ฐ. ํ 20์นธ์ ์ฝ๋ฉํธ 20๊ฐ ์ธ ์ผ์ด ์๋ค๋ ๊ฒ ๊ทผ๊ฑฐ.
- Ctrl(โ)+ํด๋ฆญ = ํ๋ณด ํ ๊ธ ยท ํ๋ณด๊ฐ ํ๋๋ผ๋ ์์ผ๋ฉด ๊ทธ๋ฅ ํด๋ฆญ๋ ํ ๊ธ(๋ชจ์ผ๋ ์ค์ ํด๋ฆญ=ํ ๊ธ์ด๋ผ ํ๋ณด๋ฅผ ์์ง ์๋๋ค)
- ๋๋๊ทธ = ๋ฐด๋ ๋ฒ์ ยท Enter ๋๋ [๐งบ ๋ฌถ์ ๋ด๊ธฐ] ๋ก ํ์ ยท Esc = ํ๋ณด๋ง ๋น์(๊ฒ์ฆ ๋ชจ๋ ์ ์ง)
- ํ๋ณด 0์์ ๋จ์ ํด๋ฆญ = ์ข
์ ๊ทธ๋๋ก ์ฆ์ 1ํญ๋ชฉ(๊ธฐ์กด ๋์ ๋ฌด๋ณ๊ฒฝ)
- ํญ๋ชฉ ์คํค๋ง๋ members:[] ํ๋๋ง ์ถ๊ฐ โ renderListยท๋งํฌ๋ค์ด์ ๊ธฐ์กด ๊ฒฝ๋ก๋ฅผ ๊ทธ๋๋ก ์ฐ๊ณ ๋ฌถ์ ๋ธ๋ก๋ง ๋ง๋ถ์
๐ ๋๋๊ทธ์ ํต์ฌ์ ์ด๋ฒคํธ๊ฐ ์๋๋ผ "๋ฐด๋ ์์ ๋ญ๊ฐ ์กํ๋๋"์๋ค. ๊ต์ฐจ ๊ธฐ์ค์ด๋ฉด ํ ํ๋์
์กฐ์ ์ปจํ
์ด๋ยทtbodyยทtrยทtdยท์์ชฝ span ๊น์ง ์๋ฐฑ ๊ฐ๊ฐ ๊ฑธ๋ฆฐ๋ค โ โ ์์ ํฌํจ๋ง โกํ๋ณด์ ์กฐ์์ ์ ์ธ(=์ต๋ง๋จ๋ง,
Set์ ์กฐ์ ํ์ O(nยทdepth) โ ์ ์ ๋น๊ต O(nยฒ)๋ณด๋ค ์ธ๋ค) โข6px ๋ฏธ๋ง ์ ์ธ โฃ์ํ 50(์ด๊ณผ๋ถ์ ํ ์คํธ๋ก ์๋ฆผ).
์ด๋ฒคํธ๋ mousedown/mousemove/mouseup + 5px ์๊ณ(๋ฏธ๋ง = ๋จ์ผ ํด๋ฆญ), mousedown preventDefault(์ ํ๋ฉด ํ์ด์ง ํ
์คํธ๊ฐ ๊ฐ์ด ๋๋๊ทธ ์ ํ๋จ),
๋๋๊ทธ ์ข
๋ฃ ์งํ ๋ฐ๋ผ์ค๋ click 1ํ ์ต์ (์ ํ๋ฉด ์์์ element ๊ฐ ๋ค์ผ๋ก ์กํ๋ค), ๋๋๊ทธ ์ค ํธ๋ฒ ํ์ด๋ผ์ดํธ OFF.
๐ด ์์ฒด๊ฒ์ฌ๊ฐ ์ก์ ์ค๋ฒ๊ทธ 3๊ฑด(์ ๋ถ rules.md ๐ ์ ํจ์ ์ผ๋ก ๋ฑ๋ก)
1. ๋ฐด๋๊ฐ ์๊ธฐ ์์ ์ ํ๋ณด๋ก ์ก๋๋ค โ #qa-helper-band ๋ ์๊ธฐ rect ์์ ์์ ํฌํจ + ์์ ์์ = ์๋ฒฝํ "์ต๋ง๋จ". isInsidePanel ์ ์ธ ๋ชฉ๋ก์ ์ถ๊ฐ.
2. Enter ๊ฐ ํต์งธ๋ก ๋จนํต โ picker ๊ฐ mousedown ์ preventDefault ํ๋ ํฌ์ปค์ค๊ฐ ์ฌ์ด๋๋ฐ ์ด๋ฆ์นธ์ ๋จ๋๋ค. "ํจ๋ ๋ฐ์ผ ๋๋ง Enter" ๋ก ๊ฑธ์๋๋ ํญ๋ชฉ์ ํ ๋ฒ์ด๋ผ๋ ๋ด์ ๋ค์ ์์ ์ ๋จน์๋ค โ textarea ๋ง ์ ์ธ.
3. ๋ค = ใํ
์คํธ ๋ณด๊ธฐใ ๋ค์ด์ผ๋ก๊ทธ๊ฐ ๊ฒ์ฆ ๋ชจ๋์์ ์ ๋ซํ๋ค(๊ธฐ์กด ๋ฒ๊ทธ). ์ค๋ฒ๋ ์ด์ id ๊ฐ ์์ด isInsidePanel ์ ์ ๊ฑธ๋ ธ๊ณ , document capture ์ stopImmediatePropagation ์ด target ์ onclick ๋ณด๋ค ๋จผ์ ๋ค โ id="qa-helper-export" ๋ถ์ฌ.
๊ฒ์ฆ
- ์ ์ค scripts/_qa_helper_multiselect_check.py โ ๋ก๊ทธ์ธยท์๋ฒ ์์ด ๋๋ ์ ์ ํ๋ค์ค(์์ http.server + ์ค์ js/css ๊ทธ๋๋ก) Playwright 37ํญ๋ชฉ ALL PASS. td 6๊ฐ ๋๋๊ทธ์์ ์กฐ์ 0 ยท 4px ๋ฐ์ค ์ ์ธ ยท 60๊ฐ ์ค ์ํ 50 ยท ์ฝ์ 0.
- ์ ์ค scripts/_qa_helper_live_check.py โ ์ค์๋ฒ. ํ
์คํธ 26 + ์ด์ 26 ALL PASS(/field/list, ์
120๊ฐ). ์ด์ ๋๋๊ทธ = ํ๋ณด 50 ์ ๋ถ leaf(A/BUTTON/SPAN/TD/TH), ํฌํจ๊ด๊ณ 0, ํ์ด์ง ์ด๋ 0, ์ฝ์ 0, localStorage ์์๋ณต๊ตฌ.
- โ ์ด์์์ ๋๋ ค๋ ์์ ํ ์ด์ = qa_helper ๋ ์๋ฒ์ ์๋ฌด๊ฒ๋ ์ ์ฐ๊ณ (localStorage ๋ฟ), ๊ฒ์ฆ ๋ชจ๋๊ฐ ํด๋ฆญ์ preventDefault ํด์ ์กฐ์์ด ์๋ฒ๋ก ์ ๋๊ฐ๋ค.
- ์ฌ์ดํธ๋งต ์ฌ๋น๋ = ๊ทธ๋ฃน8ยทํ์ด์ง49ยท๋ฏธ๋ฐ์ 1(= /production/sticker ์์ฐ ์คํฐ์ปค, ์ด๋ฒ ๊ฑด๊ณผ ๋ฌด๊ดํ ๋ณ๊ฑด ๋ฐฑ๋ก๊ทธ). meta ์ test adca587 / live ff85064 ๋ฐ์ ํ์ธ.
- ๋ฐฐํฌ๋ ์์ worktree ๋ก ํ๋ค โ ์์
ํธ๋ฆฌ์ ํํ์ ๋ฏธ์ปค๋ฐ ์์ (orderpaper-sync/*)์ด ์์ด git checkout deploy-live ๊ฐ ๊ทธ๊ฑธ ๊ฑด๋๋ฆฐ๋ค.
โณํํ = ์ด์ ์ก์(๐ ํ ๊ธ โ Ctrl+ํด๋ฆญ ๋ช ๊ฐ โ Enter โ ์ฌ์ด๋๋ฐ์ ๐งบ ๋ฐฐ์ง / ํ ์์ ๋๋๊ทธ).
โณ์ ํ ๊ฒ = devplan ์ชฝ assets/qahelper.js ํฌํ
(์ง์๊ฐ pfs ๋ง์ด๋ผ ๊ทธ๋๋ก ๋๋ค).
๐ NOW (2026-08-07) โ ๋ถ์์ฌ ๋ฐ์ฃผ์ ์ ๋ก๋ "์์ ํ์ง ์์ ์ ์" ์ด์๋ฐฐํฌ ์๋ฃ
ํํ QA = ใ๏ผ ๋ถ์์ฌ ๋ฐ์ฃผ์ ์ ๋ก๋ใ๋ก ํ์ผ์ ๊ณ ๋ฅด๋ฉด "์์ ํ์ง ์์ ์ ์"์ด๋ผ๋ฉฐ ์งํ์ด ์ ๋จ.
์์ธ = ๋ธ๋ผ์ฐ์ ๊ฐ HTTPS ํ์ด์ง์์ ์ฌ์ค IP(HTTP)๋ก form POST ํ๋ค.
opUpload() ๊ฐ http://192.168.45.2:8791/upload(์ฌ๋ฌด์ค PC ์ฌ์ด๋์นด)๋ก ์ ํญ form POST โ ํฌ๋กฌ ํผํฉ์ฝํ
์ธ ์ฐจ๋จ.
๊ฒ๋ค๊ฐ ๊ทธ ๊ฒฝ๋ก๋ ์ด๋ฏธ ๋ ๊ฒน์ผ๋ก ๋ ๋งํ ์์๋ค โ 26.7.29 ๋ณด์์กฐ์น๋ก ์ฌ์ด๋์นด๊ฐ 127.0.0.1 ๋ฐ์ธ๋ฉ + ํ ํฐ ํ์
(๋ธ๋ผ์ฐ์ ๋ ํ ํฐ์ ๋ชป ๋ถ์ธ๋ค). ์ฆ LAN ์ง๊ฒฐ์ ๋์ด๋ฆด ๊ฐ์ด ์๋๋ผ ์์จ ๊ฒฝ๋ก์๋ค.
๊ณ ์น ๋ฐฉ์ = ์ด๋ฏธ ์๋ ์๋ฒ ์
๋ก๋ API ๋ฅผ ์ฐ๊ณ , ์ฌ์ด๋์นด๋ ๋ฆด๋ ์ด๋ก ๋๋ฆฐ๋ค(๋๊ธฐํ sync-request ์ ๊ฐ์ ๋ชจ์).
1. ํ๋ฉด โ POST /api/orderpaper/upload(๊ฐ์ ์ค๋ฆฌ์ง HTTPSยทFormData) โ EC2 ๊ฐ blob ์ orderpaper_upload(pending)์ ์ ์ฅ.
๐์ด ์๋ํฌ์ธํธยทํ
์ด๋ธ์ ์๋ ์์๋๋ฐ ํ๋ฉด์ด ์ ์ฐ๊ณ ์์๋ค(์ด์ ํ
์ด๋ธ 0ํ = ํ ๋ฒ๋ ์ ํ ์ฃฝ์ ๊ฒฝ๋ก).
2. ์ฌ๋ฌด์ค PC ์ฌ์ด๋์นด(orderpaper_sync_server.py)์ upload_poll_loop ๊ฐ 20์ด๋ง๋ค
POST /api/orderpaper/upload/claim โ ํ์ฑ(orderpaper_upload_parsers) โ ์ ์ฌ(orderpaper_upload_load, SSM)
โ POST /api/orderpaper/upload/finish. ์ธ์ฆ = X-PFS-Agent-Token(door_sync_watch ์ ๊ฐ์ ํ ํฐ).
3. ํ๋ฉด์ upload_no ๋ก /api/orderpaper/uploads ๋ฅผ ํด๋ง โ ๋๊ธฐ โ ๋ถ์ยท์ ์ฌ ์ค โ โ
์๋ฃ(๋ชฉ๋ก ์๋ ๊ฐฑ์ )/โ์ฌ์ .
4. ์ฌ์ด๋์นด์ LAN ์ ์ฉ POST /upload ์ญ์ (๊ฒฝ๋ก ์ด์คํ ๋ฐฉ์ง) ยท running 10๋ถ ์ด๊ณผ ๊ฑด ์๋ ์ฌ์ ์ .
๋ค์ผ๋ก ์ก์ ๊ฒ 3๊ฐ
- ๐ดinsert_upload ๊ฐ ํญ์ upload_no=0 ์ ๋ฐํ(= MySQLUtil.execute + ๋ณ๋ SELECT LAST_INSERT_ID() ๋
์ปค๋ฅ์
์ด ๋ฌ๋ผ์ง๋ค) โ execute_id ๋ก ๊ต์ฒด. ๊ทธ๋๋ก ๋์ผ๋ฉด ์
๋ก๋๊ฐ ์ฑ๊ณตํด๋ ํ๋ฉด์ด ์์ํ "๋๊ธฐ"์๋ค.
- ๐ดnginx client_max_body_size ๊ฐ ์์ ์์ด ๊ธฐ๋ณธ 1MB(์ค์ธก 1.43MB โ 413) โ nginx.conf http ๋ธ๋ก 20m
(์๋ฒ ํ์ผยทgit ๋ฐ, nginx -t ํต๊ณผ ํ reload, ๋ฐฑ์
nginx.conf.bak_20260807). ํ๋ฉด๋ 413 ์ด๋ฉด ํฌ๊ธฐ ์ด๊ณผ๋ผ๊ณ ์๋ด.
- ๐ด์ฌ์ด๋์นด ํด๋ง try ๊ฐ env ๋ฃจํ ๋ฐ๊นฅ์ด๋ผ ์ด์ 401(๋ฏธ๋ฐฐํฌ) ํ๋๋ก ํ
์คํธ ํด๋ง๊น์ง ๊ตถ์๋ค โ ์์ชฝ์ผ๋ก.
๊ฐ์ด _sidecar.log ์ ์ค(์ฐฝ ์๋ ์์ฃผ๋ผ ์ถ๋ ฅ์ด ์ฌ๋ผ์ ธ ์ง๋จ ๋ถ๊ฐ์๋ค).
ํ์๋ ์๋ฒ์ ์ ์ฌ๋ ธ๋ค โ EC2 py3.6 ์์ pdfplumber ๊ฐ chardet 5.0(์ฑ requests 2.21 ๊ณผ ์ถฉ๋)ยทcryptography 40
(certbot)์ ๋๊ณ ์จ๋ค(pip download ์ค์ธก). xlrdยทpdfplumber ๋ ์ฌ๋ฌด์ค PC(Python39)์๋ง ์ค์น.
๊ฒ์ฆ = โ ํ
์คํธ ๋ฆด๋ ์ด E2E 12ํญ๋ชฉ(์๋ฅ์ค ์์ .xls ๋ฅผ xlwt ๋ก ๋ง๋ค์ด ์คํ์ ํต๊ณผ ยท blob ๋ฐ์ดํธ ๋์ผ ยท
์ ์ฌยท์์๋ณต๊ตฌ๊น์ง) โกlive ์ฌ์ด๋์นด 8ํญ๋ชฉ(์์ฃผ ํ๋ก์ธ์ค๊ฐ ์ง์ด๊ฐ๋ ์ค๊ฒฝ๋ก) โข์ค๋ธ๋ผ์ฐ์ (ํ
์คํธ = ์
๋ก๋โ
โ
2๊ฑด ์ ์ฌยท์ฝ์ 0 / ์ด์ = ์ ์ฝ๋ ์ ์ฌ ํ์ธ, OP_SYNC_URL ์๋ฉธ) โฃ์ด์ ์ค๋ชจํฌ 4ํญ๋ชฉ(๋ฏธ๋ฑ๋ก ์์ .txt ๋ก
๊ฒฝ๋ก๋ง ํ์ฐ๊ณ ํ ์ญ์ โ ์ด์ ๋ฐ์ดํฐ ๋ฌด๋ณ๊ฒฝ). ์ฌ์ดํธ๋งต = ๊ทธ๋ฃน8ยทํ์ด์ง49ยท๋ฏธ๋ฐ์ 2(๊ธฐ์กด AL ๋ฐฑ๋ก๊ทธ, ์ฆ๊ฐ ์์).
๋ฐฐํฌ = ํ
์คํธ 12a9b31 ยท ์ด์ bac884b(master 1f497ea+58b6809+12a9b31 7ํ์ผ ์ ๋ณ ํฌ์๋).
โ ์ฌ๋ฌด์ค PC ์ฌ์ด๋์นด๊ฐ ๊บผ์ ธ ์์ผ๋ฉด ์
๋ก๋๋ "๋๊ธฐ"์์ ๋ฉ์ถ๋ค(2๋ถ ๋ค ์๊ฐ์ด๊ณผ ์๋ด).
๐ ํ์(๊ฐ์ ๋ ) โ ํํ ์ค์ ๋ก๋์์ ์ ์ฌ ๋ด์ฉ์ด ๊นจ์ก๋ค โ ํ์ ์ฌ์์ฑยท์ฌ์ ์ฌ ์๋ฃ
์ฆ์ = ๋์ฐ ์ฉ์ธ ์๋ฅ์ค ๋ฐ์ฃผ์๋ฅผ ์ฌ๋ ธ๋๋ 128ํ์ด ๋ค์ด์๋๋ฐ ์ ๋ฐ์ด ๋น ํ๋ช , ์ ์ฒด๋ ์ ๋ถ '์ฒ์ผ'. ์์ธ = ํ์๊ฐ ์์์ ๋ชฐ๋๋ค. ์๋ฅ์ค .xls ๋ ํ ์ํธ์ ๋ฐ์ฃผ ํ์ด์ง๊ฐ ๋ฐ๋ณต๋๋๋ฐ(์์ ์ฒ=์ ์ฒด 1๊ณณ๋น 1ํ์ด์ง, ์ค์ธก 407ํยท11ํ์ด์ง) ์ ํ์๋ ์ฒซ ํ์ด์ง ๋จธ๋ฆฌ๋ง ์ฝ๊ณ 11ํ~๋์ ํต์งธ๋ก ํ ์ ์ฒด ํญ๋ชฉ์ผ๋ก ๋ดค๋ค โ ๋ผ๋ฒจํ('ํ ๋ชฉ/๊ท ๊ฒฉ/์๋'ยท'๊ณ'ยท'ํน์ด์ฌํญ'ยท'๋ฐ ์ฃผ ์ผ'โฆ)๊น์ง ์์ฌ๋ก ์ ์ฌ๋๊ณ ๋๋จธ์ง 10๊ฐ ์ ์ฒด๋ ์์ค.
์์ (orderpaper_upload_parsers.parse_enex) โ A์ด '์ ์ ์ฒ'๋ฅผ ํ์ด์ง ๋จธ๋ฆฌ๋ก ๋ธ๋ก ๋ถํ ,
ํ์ด์ง๋ง๋ค ์
์ฒดยท๋ฐ์ฃผ์ผยท๋ฉ๊ธฐ ์ฝ๊ธฐ, ํ๋ ๋จธ๋ฆฌ+6ํ๋ถํฐ '๊ณ' ์ ๊น์ง, ํ ์ ๊ณ ์ ์๋ด๋ฌธ('ํฌ์ธ : โฆ') ์ ์ธ,
๋น๊ณ ์ด ์คํ 8โ9 ์์ , ๋ฉ๊ธฐ ๋ฌธ์์ด('์ถํํต๋ณด')์ ๋ ์ง ๋น์, ๐๊ฐ์ ์
์ฒด 2ํ์ด์ง(์ฟ ์ค์ฝ)๋ block_key ๊ฐ
๊ฒน์ณ ๋ค๊ฐ ์์ ๋ฎ์ด์ฐ๋ฏ๋ก sheet์ ํ์ด์ง ๋ฒํธ๋ฅผ ๋ฃ์ด ๋ถ๋ฆฌ.
์ฌ์ ์ฌ = ์ฌ์ฉ์ ํธ์งยท์ฌ์ฉ๋ ์ด๋ ฅ 0๊ฑด ํ์ธ โ ์๋ฌธ 128ํ JSON ๋ฐฑ์
(/home/ubuntu/backup/
orderpaper_daewoo_badload_2026-08-07.json) โ ์ญ์ โ ์
๋ก๋ํ pending ๋๋๋ฆผ โ ์ฌ์ด๋์นด ์ฌ์ฒ๋ฆฌ
(โ ํ์๋ sys.modules ์บ์๋ผ ์ฌ์ด๋์นด ์ฌ์์ ํ์) โ 11๋ธ๋กยท55ํญ๋ชฉ.
๊ฒ์ฆ = ์คํ์ผ ํ์ ์ฒดํฌ 12ํญ๋ชฉ ALL PASS(scripts/_op_enex_parse_check.py) ยท ์ด์ DB 55ํยท์
์ฒด 10๊ณณ
(์ฟ ์ค์ฝ 2๋ธ๋ก) ยท ํ๋ณธ 20ํ ํ๋ช
/๊ท๊ฒฉ/์๋/๋น๊ณ ์ ์ ยท ์ด์ ํ๋ฉด 55๊ฑดยท์ฝ์ 0.
๋ฐฐํฌ = master 674102e ยท ์ด์ 2d0bbd2(์ฌ์ด๋์นด ํ์ผ์ด๋ผ ์๋ฒ ์ฑ๊ณผ ๋ฌด๊ด, ๋ธ๋์น ๋๊ธฐํ์ฉ).
๐ 2์ฐจ ํ์ โ ํ๋ช
์์(ํํ ์ง์ "โ ๊ท๊ฒฉยท๋ฐ์ฃผ๋์ ์๋๋ฐ ํ๋ช
์ด ์์ผ๋ฉด ์ ํ๋ช
์ ์ด์ด๋ฐ๋๋ค
โกํ๋ช
์ด ์๋ฐ์ดํ๋ฉด ๋์ผ"). ์๋ณธ์ ๊ฐ์ ํ๋ชฉ์ด ์ด์ด์ง๋ฉด ํ๋ช
์นธ์ ๋น์ฐ๊ฑฐ๋ "(ใ)๋ก ์ฐ๋ ์๊ธฐ ๊ดํ์ด๋ผ
๊ทธ๋๋ก ๋ฃ์ผ๋ฉด ํ๋ฉดยท๋ฐ์ฃผ์์ ํ๋ช
์๋ ํ์ด ๋๋ค(์ค์ธก ๋น์นธ 10 ยท ๋ฐ์ดํ 3). ์์์ ๋ธ๋ก(์
์ฒด) ์์์๋ง.
๐์ฌ์ ์ฌ๋ ์ญ์ ์์ด pending ๋๋๋ฆผ๋ง โ item_key ๊ฐ ๊ทธ๋๋ก๋ผ ๋ก๋๊ฐ ๊ฐ์ ํ์ UPDATE(55ํ ์ ์งยท
์ญ์ 0ยท*_user ํธ์ง ๋ณด์กด). ๊ฒ์ฆ = ํ์ 18ํญ๋ชฉ ALL PASS ยท ์ด์ DB ๋น์นธ 0ยท๋ฐ์ดํ 0ยท์
์ฒด 10ยท๋ธ๋ก 11 ยท
์ด์ ํ๋ฉด 55๊ฑดยท์ฝ์ 0(์: ํคํฐ 2~4ํ์ด ์ด๋
ธํ
์ํฐ๋ผ๋ ์ผ470 ์ ๋ฌผ๋ ค๋ฐ์). ๋ฐฐํฌ = master 971fed7 ยท ์ด์ bdaff93.
โณํํ = ํ๋ฉด ์ก์(์
์ฒด๋ณ ๋ธ๋กยทํ๋ช
์์).
NOW (2026-08-06) โ AWS ๋น์ฉ์ ๊ฐ Phase A ์๋ฃ(A1~A5ยทA7) ยท โณํํ ์น์ธ = A6(RDS-test ์ญ์ )
์ธ์ ์ธ๊ณ์ฉ ์์ฝ: ํ ์คํธ DB๋ฅผ RDS์์ EC2 ์ Docker MySQL 8.4.8๋ก ์ฎ๊ฒผ๋ค. ์ฑ์ ์ด๋ฏธ ์ ํ ์๋ฃยท๊ฒ์ฆ ํต๊ณผ. RDS-test ๋ ์์ง ์ด์ ์๋ค(๋กค๋ฐฑ ์๋ฃ). ๋จ์ ๊ฒ = โ ํํ ์ก์ โกA6 ์ญ์ ์น์ธ โขPhase B RI ๊ตฌ๋งค.
๋ฐ๋จ = ํํ ์ง๋ฌธ "pfs ํ ์คํธ ์๋ฒ๋ฅผ ๋ฏธ๋PC๋ก ๋นผ๋ฉด ์ด๋ค๊ฐ(AWS ๋น์ฉ). ํ๊ฒฝ์ด ๋ฌ๋ผ์ ธ ๊ด๋ฆฌ๊ฐ ๋ฌ๋ผ์ง๋?"
ํ์ โ ๋ฏธ๋PC ์ด์ ์ ์ ์๋ค(์ค์ต ๋๋น ๋ฆฌ์คํฌ ๊ณผ๋ค)
- ๐ด์ ์ ๊ฐ ํ๋ ธ๋ค = ํ
์คํธ๋ ๋ณ๋ EC2๊ฐ ์๋๋ค. ์ด์ยทํ
์คํธ๊ฐ ๊ฐ์ t3.medium 1๋(
i-03225ba8bc12a929e)์ 8000/8001 ๋ก ์นํ ์๋ค โ ์ฑ๋ง ๋นผ๋ EC2 ์ ๊ฐ 0. ๋ฐ๋ก ์๋ ๊ฑด RDS ๋ฟ. - ์ค์ธก ๋น์ฉ(2026-07) = ์ด $86.4/์ โ EC2 compute
$37.44ยท EC2-Other$6.43(EBS gp3 59GB$5.47) ยท RDS$42.44(db.t4g.micro 2๋$37.20+ GP2 20GBร2$5.24) ยท S3 ๋ฑ$0.09. โ ๋ฏธ๋PC ์ด์ ์ ์ค์ ์ ๊ฐ = RDS-test 1๋ $21.2/์๋ฟ. - ํ๊ฒฝ ์ฐจ์ด๊ฐ ํฌ๋ค = ๋ฏธ๋PC๋ Windows / ์ด์์ Ubuntu+nginx+uWSGI+systemd. โ uWSGI ๊ฐ Windows ์์ ์ ๋๋ค
โก๋ฐฐํฌ๊ฐ SSM send-command ๋ผ ๋ฏธ๋PC ๋ ๋์์ด ์๋๊ณ โ ๋ฐฐํฌ ์ ์ฐจ ์์ฒด๋ฅผ ํ
์คํธ ๋ชป ํ๊ฒ ๋๋ค
โข
pfs-test.poin.co.kr+Let's Encrypt ๊ฒฝ๋ก ์์ค โฃ๊ฒ์ฆ ๋ฌ๋๊ฐ ๋ฏธ๋PC ๋ค์ดยทํฐ๋ ๋๊น์ ๋ฌถ์ โค๊ณ ๊ฐ์ ๋ณด๊ฐ ์ฌ๋ฌด์ค ๋ฐ PC๋ก. - ์ฑํ์ = โ RI + โกRDS-test ํก์ โ ์ $46.2(์ ๊ฐ $40.2 = 47%, ์ฐ $483 โ 67๋ง์), ์ ๊ฒฐ์ 0, ํ๊ฒฝ ๋ณํ ๊ฑฐ์ 0.
- AWS ์ ์ฑ ์๋ฐฐ ์์(์ ๊ฒ 7ํญ๋ชฉ) โ RI ๋ ์ ์ ์๊ธ์ , EC2 ์์ ์ค์น๋ ์ ์ ์ฉ๋ฒ, MySQL Community=GPLv2 ์์ฒด์ฌ์ฉ, Docker Engine=Apache 2.0(์ ๋ฃ๋ Desktop ๋ฟ), ์๊ธฐ ์์ ์ญ์ . ์ค์ง ์ ์์ ์ โ 1๋ ์ฝ์ ๊ตฌ์(์ค๋์ทจ์ ๋ถ๊ฐ, RDS RI ๋ ์ฌํ๋งค๋ ๋ถ๊ฐ) โก๋ฐฑ์ ยทํจ์น ์ฑ ์์ด AWSโ์ฐ๋ฆฌ๋ก ์ด๋(๊ณต์ ์ฑ ์๋ชจ๋ธ) โข๋ฐ์ดํฐ ์์น(โก์์ ๊ฐ์ ๋ฆฌ์ ์ด๋ผ ๋ฌด๋ณํ).
์คํ ๊ฒฐ๊ณผ (Phase A ยท 2026-08-06 ์๋ฃ๋ถ)
| ๋จ๊ณ | ๋ด์ฉ | ๊ฒฐ๊ณผ |
|---|---|---|
| A1 | RDS-test ํ๋ผ๋ฏธํฐ ์ฑ์ทจ ยท ์๋น์ค๋ช ํ์ ยท MySQL 5.7 ์ ์ฒด ๊ท๋ช | ์๋ฃ |
| A1-b | ์ MySQL 5.7 stop+disable (๋คํ ๋ณด๊ด ํ) | RAM 177MB ํ์(786โ609MB) |
| A2 | docker.io 20.10.21 ์ค์น + mysql:8.4.8 ์ปจํ
์ด๋ |
127.0.0.1:3307 ์ ์ฉ |
| A3 | RDS-test โ ์ปจํ ์ด๋ ์ด๊ด | 87ํ ์ด๋ธยท๋ทฐ1ยทํจ์2, ๋ฐ์ดํฐ MD5 ์ผ์น |
| A4 | pfs-test.env ์ ํ + uwsgi ์ฌ์์ |
์ฑโ์ปจํ ์ด๋ ์ ์ ํ์ |
| A5 | ๋ฌ๋ + ์ค๋ธ๋ผ์ฐ์ ๊ฒ์ฆ | 8 OK / 0 FAIL |
| A7 | swap 2GB ยท ์ฌ๋ถํ ๋ด์ฑ ยท ์ผ์ผ ๋ฐฑ์ cron | ์๋ฃ |
| A6 | RDS-test ์ต์ข ์ค๋ ์ท + ์ญ์ ์๋ฃ(2026-08-07) | RDS 2๋โ1๋ |
| A8 | ๐EBS ๋ฐฑ์ ์ ์ค(DLM ์ผ์ผ ์ค๋ ์ท + cron ์๊ฐ ์กฐ์ ) | ์๋ฃ |
- MySQL 5.7 ์ ์ฒด = ํํ ์ถ์ธก ์ ์ค โ
auto.cnf2019-05-29 ์ค์น,pfsDB 2020-01-06, ํ ์ด๋ธ 23๊ฐ 1.1MB (ํ ์ด์ 23.1MB), ํ ์ด๋ธ๋ช ์ด ํํ๊ณผ ๊ฐ์ ๊ณ์ด(estimate_detailยทfieldยทcompanyโฆ) = RDS ์ด์ ์ ์ด์ DB์ ์ ์ . ใ์ ์ด๋คใ ์ฆ๊ฑฐ = Uptime 93.5์ผ ๋์Com_insert/Com_update/Com_delete์ ๋ถ 0, ๋ชจ๋ ํ ์ด๋ธupdate_timeNULL, PROCESSLIST ์ฑ ์ ์ 0, ์์ผ ์ฌ์ฉ์ ์๊ธฐ ์์ ๋ฟ. ๋คํ ๋ณด๊ด =/home/ubuntu/backup/mysql57_pfs_2026-08-06.sql.gz(23ํ ์ด๋ธ). - ์ปจํ
์ด๋ ํ๋ผ๋ฏธํฐ = RDS-test ์ ์ ๋ ์ผ์น(์ด์ ํ์ธ) โ
utf8mb4/utf8mb4_0900_ai_ci/time_zone=+00:00/ ๐sql_mode=NO_ENGINE_SUBSTITUTION(8.4 ๊ธฐ๋ณธ์ STRICTยทONLY_FULL_GROUP_BY ํฌํจ์ด๋ผ ์ ๋ง์ถ๋ฉด ๊ธฐ์กด ์ฟผ๋ฆฌ๊ฐ ๊นจ์ง๋ค) /explicit_defaults_for_timestamp=ON/local_infile=ON/lower_case_table_names=0/ buffer_pool 128MB(RDS์ ๋์ผ). - ๋ฐ์ดํฐ ๋์กฐ = 87๊ฐ ์ค 85๊ฐ
CHECKSUM TABLE์ผ์น,estimateยทestimate_detail2๊ฐ๋ง ๋ถ์ผ์น โ ํ์ยทMAX(PK) ๋์ผํ๊ณ--order-by-primary์ ๋ ฌ ๋คํ MD5 ์์ ์ผ์น(f2ef384cโฆ)๋ก ๋์ผ ํ์ . ์ฐจ์ด์ ์ ์ฒด = CHECKSUM ์ด ๋ฌผ๋ฆฌ์ ํ ์์๋ฅผ ํ๋ ๊ฒ(์์ ์ด ์ฆ์ ๋ ํ ์ด๋ธ๋ง ์์๊ฐ ํํธ๋ฌ์ ธ ์์๋ค). ํ๊ธ ์ํ ์์ชฝ ๋์ผ(๋ฅ์์ค/ํํน/์๋ฅ์ค ยท ์์ฉ ํ์๋ ยท ใ๋์ฐ ์ฉ์ธ MH ๊ฒฌ์ ์ (2์ฐจ)ใ). - ์ฑ ์ ํ ํ์ ๊ทผ๊ฑฐ = ๋ก๊ทธ์ธ API probe 5ํ โ ์ปจํ
์ด๋
Com_select+6 / RDS ๋ +1(๋ด ์กฐํ ์์ฒด๋ฟ), ์ฑ ๋ก๊ทธ 08:35:19 ์๋ต 5๊ฑด์ด probe ํ์์ ์ผ์น. RDS ์ฑ ํธ๋ํฝ 0. - A5 ๊ฒ์ฆ = โ
_p0e_platform_core_check.py test0 fail โกtest_worklog_autolink_infer.py10 PASS โข์ ์คscripts/_db_migration_smoke_check.py {test|prod}(๋ฏธ์ถ์ ) 8 OK/0 FAIL โ ๋ก๊ทธ์ธ โ/field/orderpaperํ์ฅ ์นด๋ 25๊ฐ โ/field/worklog๋ ๋ ยท ํ๊ธ ยท ๋ ์ง ยท ์ฝ์ ์๋ฌ 0. โฃ์ด์ ๋ฌด์ํฅ(pfs-liveactive, HTTP 200). โ ๋ฏธํ์ 1๊ฑด =_al_profile_ui_check.py test๊ฐ 104์ค ใ์ ์ฒด 3ํ๋ ๊ฐ์ ์คใ์์ DOM null ๋ก ์ค๋จ. ๊ทธ ์ ํญ๋ชฉ(๋ก๊ทธ์ธยท๋ชฉ๋กยท๊ทธ๋ฆฌ๋ยท๋ ์ด์์)์ ์ ๋ถ OK ์ด๊ณ ์ค๋ชจํฌ 8ํญ๋ชฉ๋ ํต๊ณผ๋ผ DB ์ด์ ๊ณผ ๋ฌด๊ดํ AL ํ๋ฉด ์ ๋ ํฐ ๋ฌธ์ ๋ก ์ถ์ (AL ์ QA 8๊ฑด ๋ฏธ๋ฐฐํฌ ์ํ๋ก ํ๋ฉด์ด ๊ณ์ ๋ฐ๋๋ ์ค). ํ์ ํ๋ ค๋ฉด ์ด์ ๋์กฐ๊ฐ ํ์ํ๋ฐ ์ด์ ๋ฌ๋ ์คํ์ ์ํ์์ ์ด๋ผ ํํ ํ๋จ ๋๊ธฐ. - A7 = swap 2GB(+fstab ๋ฑ๋ก) ยท ์ฌ๋ถํ
๋ด์ฑ ํ์ธ(
dockerenabled ยท ์ปจํ ์ด๋unless-stoppedยทmysql(5.7) disabled ยทpfs-test.uwsgienabled) ยท ์ผ์ผ ๋ฐฑ์/usr/local/bin/pfs_test_db_backup.sh+/etc/cron.d/pfs-test-db-backup(๋งค์ผ 03:15, 7์ผ ๋ณด๊ด) โ ๋๋ผ์ด๋ฐ 1.3MBยทgzip ๋ฌด๊ฒฐ์ฑ OK. ํ์ฌ ์ฌ์ = ๋์คํฌ 31G ยท RAM available 2,352MB ยท load 0.09.
โ A6 ์๋ฃ (2026-08-07) โ RDS-test ์ญ์ ยท ๊ทธ๋ฆฌ๊ณ ๐ด๋ฐฑ์ ๊ตฌ๋ฉ์ ํ๋ ๋ฉ์ ๋ค
- ์ญ์ ์ ํ๋ฃจ ๊ด์ฐฐ ๊ฒฐ๊ณผ ์ ์ โ ์ปจํ
์ด๋ 15์๊ฐ ๋ฌด์ค๋จ ยท DB ์ ์ ์๋ฌ 0 ยท ์ค์ฌ์ฉ
Com_select4,527 ยทCom_insert261 ยทCom_update184(์ฝ๊ธฐ๋ฟ ์๋๋ผ ์ฐ๊ธฐ ๊ฒฝ๋ก๊น์ง ํ๋ฃจ์น๋ฅผ ๊ฒฌ๋ ๋ค). - ์ต์ข
์๋ ์ค๋
์ท
poin-dbinstance-test-final-2026-08-07(availableยท20GBยท8.4.8ยทํ๊ทธPurpose=pre-delete-rollback) โdelete-db-instance --skip-final-snapshot. ๐์๋ ์ค๋ ์ท 9๊ฑด์ ์ธ์คํด์ค์ ํจ๊ป ์ฌ๋ผ์ง๋ค โ ๊ทธ๋์ ์๋ ์ค๋ ์ท์ ๋จผ์ available ๊น์ง ํ์ธํ๊ณ ์ง์ ๋ค. ๊ฒฐ๊ณผ =DBInstanceNotFound, RDS 2๋ โ 1๋(์ด์๋ง). - โ ์ญ์ ๋ช
๋ น์ ์ฝ๋๊ฐ ๋ชป ๋๋ ธ๋ค โ ๋น๋ํํ ์ธ์
์ด๋ผ broker ๊ฒ์ดํธ ์ ์ ๊ฑฐ๋ถ(
rules/tooling.md๐) โ ํํ๊ฐ ์ง์ ์คํ. - ์ญ์ ํ ๊ฒ์ฆ = ์ค๋ชจํฌ 8 OK/0 FAIL(์ญ์ ์ ๊ณผ ๋์ผ) ยท testยทlive HTTP 200 ยท ์ปจํ
์ด๋ Up 16h ยท
DB 88ํ
์ด๋ธ/
field2,041/estimate722 ยท DB ์ ์ ์๋ฌ 0 ยท env ๋ถ๋ฆฌ ํ์ธ(ํ ์คํธ127.0.0.1/ ์ด์poin-dbinstance).
๐ A8 โ EBS ๋ฐฑ์ ์ ์ค (ํํ ์ง๋ฌธ "๋ฐฑ์ ยท์ค๋ ์ท ์ค์ ๋๋?" ์์ ๋ฐ๊ฒฌ)
๐ด์ค์ฌ ๊ฒฐ๊ณผ EC2 ๋ฐฑ์
์ด ์์ ์์๋ค โ ์๋๋ถํฐ. DLM 0 ยท AWS Backup 0 ยท EBS ์ค๋
์ท 0 ยท AMI 0.
์ง๊ธ๊น์ง ํฐ๊ฐ ์ ๋ฌ๋ ์ด์ = ์ค์ํ ๊ฒ ์ ๋ถ RDS ์ ์์๊ธฐ ๋๋ฌธ. ์ด๋ฒ ์ด์ ์ผ๋ก ํ
์คํธ DB ๊ฐ ๊ทธ ๋ฌด๋ฐฉ๋น ์์ญ์ ๋ค์ด์๊ณ ,
๐ด์ผ์ผ ๋
ผ๋ฆฌ ๋ฐฑ์
๋ง์ ๋ฃจํธ์ ๊ฐ์ ๋ณผ๋ฅจ(stat device ๋์ผ ์ค์ธก)์ด๋ผ ๋ณผ๋ฅจ ์ฌ๊ณ ์ DB์ ๋ฐฑ์
์ด ๋์์ ์ฌ๋ผ์ง๋ ๊ตฌ์กฐ์๋ค.
- ์ ์ค = DLM ์ ์ฑ
policy-027b7852ca6ddfea3(ENABLED) โ ๋์VOLUME+ ํ๊ทธBackup=daily, ๋งค์ผ 18:00 UTC(=KST 03:00), 7๊ฐ ๋ณด๊ด,CopyTags. ๋ณผ๋ฅจvol-0f57e223d0a89419b(60GB gp3, 1๊ฐ๋ฟ)์ ํ๊ทธ ๋ถ์ฐฉ. โ ๋ณผ๋ฅจ ์ ์ฒด๋ฅผ ๋จ๋ฏ๋ก ํ ์คํธ DBยท์ด์ ์ฑ ์ค์ ยทnginxยท์ธ์ฆ์ยทenv ๊ฐ ํ ๋ฒ์ ์ปค๋ฒ๋๊ณ ๊ธฐ์กด ๊ตฌ๋ฉ(์ด์ ์ฑ ์๋ฒ)๋ ๊ฐ์ด ๋ฉ์์ง๋ค. - ์ ํ = IAM ์ญํ
AWSDataLifecycleManagerDefaultRole์ ๊ท ์์ฑ(๊ณ์ ์ ์์๋ค) + ๊ด๋ฆฌํ ์ ์ฑAWSDataLifecycleManagerServiceRole์ฐ๊ฒฐ. ๐DLM--description์ ์์ซ์ยท๊ณต๋ฐฑยท_-๋ง ํ์ฉ โ ์ผํ๋ฅผ ๋ฃ์ผ๋ฉดInvalidRequestException(์ค์ธก 1ํ ์คํจ). - ์ฆ์ ๊ธฐ์ค ์ค๋
์ท
snap-0c40a5eabe84b0ab0(์ด์ ์งํ ์ํ ๋ณด์กด) ์์ฑ โ DLM ์ฒซ ์คํ์ด 18์๊ฐ ๋ค๋ผ ๊ณต๋ฐฑ์ ๋ฉ์ด๋ค. - ๋ฐฑ์
2์ธต ๊ตฌ์กฐ ํ์ = โ ๋
ผ๋ฆฌ(๋น ๋ฅธ ๋ณต์)
pfs_test_db_backup.sh17:30 UTC=KST 02:30ยท7์ผ ๋ณด๊ด โก๋ฌผ๋ฆฌ(์ฌํด ๋ณต๊ตฌ) DLM 18:00 UTC=KST 03:00ยท7๊ฐ. ๐๋ ผ๋ฆฌ๊ฐ ๋จผ์ , ์ค๋ ์ท์ด ๋์ค โ ๊ทธ๋์ผ ์ค๋ ์ท ์์ ๊ทธ๋ ๋คํ๊ฐ ๋ค์ด๊ฐ๋ค. cron ์ 03:15โ17:30 ์ผ๋ก ์ฎ๊ธด ์ด์ = ์ ์ค์ ์ KST 12:15 ์ ์ฌ์๊ฐ์ ๋์๋ค(์๋ฒ TZ=Etc/UTC). - ๋น์ฉ = ์ฆ๋ถ์ด๋ผ ์ $1.5~2.5 ์ถ์ . RDS-test ์ ๊ฐ $21.2 ์ค ์ผ๋ถ๋ผ ์์ ๊ฐ $19์ ์ ์ง.
โณ ๋ค์ (์ธ๊ณ)
- ํํ ์ก์ โ
pfs-test.poin.co.kr๋ก๊ทธ์ธ โ ๋ฐ์ฃผ์์ ๋ฆฌยท๊ฒฌ์ ยทworklog ๊ฐ ํ์์ ๊ฐ์์ง. - ๋ด์ผ ํ์ธํ ๊ฒ = โ DLM ์ฒซ ์ค๋
์ท์ด ์ค์ ๋ก ์์ฑ๋๋์ง(KST 8/8 03:00 ์ดํ
describe-snapshots) โกcron ๋ ผ๋ฆฌ ๋ฐฑ์pfs_test_daily_2026-08-08.sql.gz์์ฑ ์ฌ๋ถ โข๊ธฐ์ค ์ค๋ ์ทsnap-0c40a5eabe84b0ab0completed โฃRDS RIpfs-prod-rds-ri-2026-08์ดactive๋ก ๋์ด๊ฐ๋์ง โคCost Explorer ์ RI ํ ์ธ ๋ฐ์(ํ๋ฃจ ๋ค๋ถํฐ ๋ณด์ธ๋ค). - โ
Phase B RI ๊ตฌ๋งค ์๋ฃ(2026-08-07 ยท ํํ๊ฐ CLI ๋ก ์คํ) โ ์ฝ๋๊ฐ offering ID ๋ฅผ ์กฐ๊ฑด๋ณ ์ ์ผ ๋งค์น๋ก ํน์ ํด์
๋๊ธฐ๋ ๋ฐฉ์์ ์ผ๋ค(์ต์
์ค์ ํ ์ฌ์ง 0). B1 EC2
eccbe392-a683-43e3-b6f0-9ef4d3a9528e= t3.medium ยท Linux/UNIX ยท standard ยท Region ์ค์ฝํ ยท No Upfront ยท ์๋ 1 ยท stateactiveยท 2026-08-07~2027-08-07 ยท $0.0314/h. B2 RDSpfs-prod-rds-ri-2026-08= db.t4g.micro ยท mysql ยท Single-AZ ยท No Upfront ยท ์๋ 1 ยท $0.02/h(๊ตฌ๋งค ์งํpayment-pendingโ active. ์ ๊ฒฐ์ 0 ์ด์ด๋ ์ด ์ํ๋ฅผ ๊ฑฐ์น๋ฉฐ ํ ์ธ์ StartTime ๋ถํฐ). ๋งค์นญ ์ค์ธก ๋์กฐ = EC2(t3.mediumยทLinux/UNIXยทtenancy defaultยท์จ๋๋งจ๋ยทrunning) / RDS(db.t4g.microยทmysqlยท MultiAZ falseยทavailable) ์ ํญ๋ชฉ ์ผ์น โ ๋ณ๋ ์ฐ๊ฒฐ ์์ ์์ด ์๋ ์ ์ฉ. Region ์ค์ฝํ๋ผ ์ธ์คํด์ค๊ฐap-northeast-2c์ฌ๋ ๋ฌด๊ด. โ B1 ์ t3 ํจ๋ฐ๋ฆฌ๋ฅผ ๋ฒ์ด๋๋ฉด ๋ฌดํจ(1๋ ๋ด Graviton ์ ํ ๊ณํ ์์ผ๋ฉด ์ฌ๊ฒํ ). - ๊ณ๊ฐ์ง(์ค๋ ์ฃผ์ ๋ฐ, ์ฌ์ค๋ง) = EC2 ๊ฐ Ubuntu 18.04 + Python 3.6.9(2023 EOL). ์ธ์ ๊ฐ ๊ต์ฒด ํ์ โ ๊ทธ๋๊ฐ ์ธ์คํด์ค ์ฌ์ ์ ๊ธฐํ. apt ์ ์ฅ์๋ ์์ง ์ด์ ์๋ค(EC2 ๋ฏธ๋ฌ + security ์ ์ ์๋ต).
์ฝ๋ ๋ณ๊ฒฝ = pfs ๋ฆฌํฌ์ ๊ฒ์ฆ ๋ฌ๋ 1๊ฐ ์ ๊ท(scripts/_db_migration_smoke_check.py, ๋ฏธ์ถ์ ์ ์ง โ ์ปค๋ฐ ์์).
์ฌ์ดํธ๋งต ์ฌ๋น๋ ๋ถ์(ํ์ด์งยท๋ผ์ฐํธ ๋ณํ 0).
๐ (์ฐธ๊ณ ) ์ ๊ฒํ ๋ฉ๋ชจ โ ๋ฏธ๋PC ์ด์ ํ๋น์ฑ
- ๐ด์ ์ ๊ฐ ํ๋ ธ๋ค = ํ
์คํธ๋ ๋ณ๋ EC2๊ฐ ์๋๋ค. ์ด์ยทํ
์คํธ๊ฐ ๊ฐ์ t3.medium 1๋(
i-03225ba8bc12a929e)์ 8000/8001 ํฌํธ๋ก ์นํ ์๋ค. ์ฑ๋ง ๋ฏธ๋PC๋ก ๋นผ๋ EC2 ์ ๊ฐ 0. ๋ฐ๋ก ์๋ ๊ฑด RDS ๋ฟ(poin-dbinstance-test). - ์ค์ธก ๋น์ฉ(2026-07 ยท Cost Explorer) = ์ด $86.4/์ โ EC2 compute
$37.44(t3.medium 720h) ยท EC2-Other$6.43(EBSยทEIP) ยท RDS$42.44(์ธ์คํด์ค$37.20= db.t4g.micro 2๋ + GP2 20GBร2$5.24) ยท S3 ๋ฑ$0.09. โ ํ ์คํธ ์ด์ ์ผ๋ก ์ค์ ์ค์ด๋๋ ๋ = RDS-test 1๋$21.2/์(โ3๋ง์, ์ ์ฒด์ 24%). โป6์ RDS$57.83์ 7์๋ณด๋ค ๋๋ค(์ค๋ ์ทยทํด๋์ค ์ด๋ ฅ ์ถ์ , ๋ฏธ์กฐ์ฌ) โ ๋ฌ๋๋ ์ดํธ๋ 7์ ๊ธฐ์ค์ด ๋ง๋ค. - ํ๊ฒฝ ์ฐจ์ด = ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฆฐ๋ค(๋์ ์ชฝ): ๋ฏธ๋PC๋ Windows, ์ด์์ Ubuntu+nginx1.14+uWSGI+systemd.
โ uWSGI๋ Windows์์ ์ ๋๋ค โ waitress ๋ฑ์ผ๋ก ๊ฐ์ํ๋ฉด ํ
์คํธ์์ ํต๊ณผํ ๊ฒ ์ด์ ๋ณด์ฆ์ด ์ ๋๋ค
(
uwsgi-die-on-term-killsignal-conflict๊ฐ์ ๋ฐฐํฌ๊ณ์ธต ์ฌ๊ณ ๋ฅผ ํ ์คํธ๊ฐ ๋ชป ์ก๋๋ค) โก๋ฐฐํฌ๊ฒฝ๋ก = pushโActionsโSSM send-command์ธ๋ฐ ๋ฏธ๋PC๋ SSM ๋์์ด ์๋๋ผ ๋ฌ๋๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ผ ํ๊ณ , ๊ทธ๋ฌ๋ฉด ๋ฐฐํฌ ์ ์ฐจ ์์ฒด๋ฅผ ํ ์คํธํ ์ ์๋ค(ํ์ฌ ํ ์คํธ์ ์ต๋ ๊ฐ์น) โขpfs-test.poin.co.kr+Let's Encrypt โ Funnel/์ฌ์ค ๊ฒฝ๋ก๋ก ๋ฐ๋ โฃ๊ฒ์ฆ ๋ฌ๋scripts/_*_check.py {test|prod}๊ฐ ๋ฏธ๋PC ๋ค์ดยทํฐ๋ ๋๊น์ ๋ฌถ์ธ๋ค (vscode-remote-ssh-poin-mini-timeout์ ๋ก) โค์ด์ ๋ฐ์ดํฐ ์ฌ๋ณธ์ด ์ฌ๋ฌด์ค ๋ฐ PC์ ์๋๋ค. - ๋ ์ธ๊ณ ์ ์ํ ๋์(์ฝ๋ ์ถ์ฒ ์) = โ RI/Savings Plan 1๋
๋ฌด์ ๊ฒฐ์ (ํ๊ฒฝ๋ณํ 0) โ ๊ณตํ์์จ ๋๋ต
EC2
-$11~14/RDS ์ด์๋ถ-$6= ์ $17~20 ์ ๊ฐ โกRDS-test ์ญ์ โ EC2 ์์ MySQL 8.4 ์ง์ ์ค์น (๊ฐ์ OSยท๊ฐ์ ๋ฐฐํฌ๊ฒฝ๋ก ์ ์ง, ์ ๊ฐ$21์ ์ก, t3.medium 4GB์ ํ ์คํธ ๋ถํ๋ ๋ฏธ๋ฏธ) โขRDS-test ์ผ๊ฐยท์ฃผ๋ง ์ ์ง (-$12, ๋จ 7์ผ ๋ค ์๋ ์ฌ์์์ด๋ผ ์ค์ผ์ค๋ฌ ํ์). โ +โก = ์ $39(45%) ์ ๊ฐ, ํ๊ฒฝ ๋ณํ ๊ฑฐ์ 0. - โณํํ ๋ชซ = ๋ฐฉํฅ ํ1(โ +โก ์ถ์ฒ / ๋ฏธ๋PC ์ด์ ๊ฐํ / ํ์ ์ ์ง).
๐ NOW (2026-08-06) โ ๊ฒฌ์ ์ ์ฌ์์ฑ + ํ์ฅ ๋จ์ ์ฐจ์ ์ด๋ ฅ โ ์ด์๋ฐฐํฌ ์๋ฃ
- ์ด์ ์ปค๋ฐ = deploy-live
ff48c8bโ masterc69c2d8+641ff825ํ์ผ ์ ๋ณ ํฌ์๋(merge ์๋). ๋์ ํ์ผ์ ๋ค๋ฅธ ๋ฏธ๋ฐ์ ์ปค๋ฐ์ด ๊ฑธ์ณ ์์์ง๋งgit diff origin/deploy-live origin/master -- <file>์ค์ธก์ด ๋ด ๋ณ๊ฒฝ๋ถ๋ฟ์์ ํ์ธํ๊ณ ์งํํ๋ค(์ปค๋ฐ ๋ชฉ๋ก์ cherry-pick ์ด๋ ฅ ํ์ ๊ณผ๋๊ณ์ โ playbook ยง2). - ์ด์ RDS ์ ํ =
ALTER TABLE estimate ADD COLUMN archive_yn CHAR(1) NOT NULL DEFAULT '0' AFTER remove_ynโ 674ํ ์ ๋ถ'0'ํ์ธ ํ ๋ฐฐํฌ(scripts/_estimate_archive_ddl.py, ENV_PATH=pfs-live.env, ๋ฉฑ๋ฑ). - ์ด์ ๊ฒ์ฆ(์ ์ค
scripts/_est_revisions_prod_check.py) = 18ํญ๋ชฉ ALL PASS ยท ์ฝ๊ธฐ ์ ์ฉ. ๐Playwrightpage.route๋ก POST/PUT/DELETE(/selectยท/rewriteยท/archiveยท์ญ์ )๋ฅผ ์์ ์ฐจ๋จํด ๋๊ณ ๋๋ ธ๋ค(์ฐจ๋จ๊ธฐ ๋ฐ๋ 0 = ์ค์กฐ์ ์์๋ค๋ ์ฆ๊ฑฐ). ํ์ธ = ๋ณธ๊ฒฌ์ 32๊ฑดยท๋ณด๊ด 0ยท์ฐจ์2โ ํ์ฅ 0 ยท ํ์ ใ์ฐจ์ 1ใยทใ์ฌ์์ฑใ ยท ๋ชจ๋ฌ GET ๋ง์ผ๋ก ๋ ๋(์์ฉ ํ์๋ 1์ฐจ 6ํญ๋ชฉ 6,500,000 ใ์ฌ์ฉ ์คใ, ์ฌ์ฉ ์ค ํ์ ์ ํ ๋ฒํผ ์์) ยท ๊ฒฌ์ ๋จ๊ฑดยท์ถ๋ ฅ 200 ยท ํ์ฅ๊ฒ์ 34๊ฑด ์นด์ดํธ 1 ยท ์๋ง๊ฐ ํ๋ณด 11๊ฑด ๋ถ๋ณ ยท ์ฝ์ 0. - ์ฌ์ดํธ๋งต ์ฌ๋น๋ = ๊ทธ๋ฃน8ยทํ์ด์ง49ยท๋ฏธ๋ฐ์ 10 โ 2(๋จ์ 2 = ๊ธฐ์กด AL ๋ฐฑ๋ก๊ทธ). devplan
pfs.htmlPENDINGโDONE. - โณํํ ๋ชซ = ์ด์ ์ก์(
/estimate/list-v2โ ์๋ฌด ๊ฒฌ์ ใ์ฐจ์ 1ใ ๋๋ฌ๋ณด๊ธฐ. ์ค์ ์ฌ์์ฑ์ ์ง์ง ํ์ฅ์์๋ง).
(ํ ์คํธ ๋จ๊ณ ๊ธฐ๋ก) ๊ฒฌ์ ์ ์ฌ์์ฑ(1์ฐจ ๋ณด๊ด + 2์ฐจ ๋ฉ์ธ) + ์ด์ 708 ์ด๊ด
ํํ ์ง์ = "ํ ํ์ฅ ๊ฒฌ์ ์๋ฅผ ์๋ก ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค(๋๋ฉด ๋์์ธ์ด ์์ ๋ฐ๋).
๊ธฐ์กด 1์ฐจ ์์ฑ๋ถ์ ๋ณด๊ด์ฒ๋ฆฌ, ์ ๊ท 2์ฐจ ์์ฑ๋ถ์ ๋ณธ๊ฑด ๋ฉ์ธ์ผ๋ก ์์." โ
"ํ
์คํธ์๋ฒ ์์
์งํํ๊ณ ์ด์์๋ฒ์ modify-v2/708 ํ์ฅ ๊ฒฌ์ ์๋ฅผ ์ฎ๊ฒจ์ค. 1์ฐจ ์๋ณธ์ผ๋ก ์ผ๊ณ ํ
์คํธ."
- ๊ตฌํ(master
c69c2d8โ ํ ์คํธ ์๋๋ฐฐํฌ ํ์ธ, ์ด์ ๋ฏธ๋ฐ์) =estimate.archive_yn char(1) DEFAULT '0'ํ๋๋ก ๋๋๋ค. ์ฐจ์ ์ปฌ๋ผยท์ด๋ ฅ ํ ์ด๋ธ ์์. โ ๐1:1 ๊ฐ๋๋ ํ ์ค๋ ์ ๊ณ ์ณค๋ค โselect_site_search์estimate_count์๋ธ์ฟผ๋ฆฌ์AND e.archive_yn='0'๋ง ๋ฃ์ผ๋, 1์ฐจ๋ฅผ ๋ณด๊ดํ๋ ์๊ฐ ๊ทธ ํ์ฅ์ด ๋ค์ ์ ํ ๊ฐ๋ฅํด์ง๋ค. โก ๋ชฉ๋ก = ๋ณด๊ด๊ฑด ๊ธฐ๋ณธ ์จ๊น + ใ๋ณด๊ด ํฌํจใ ์ฒดํฌ๋ฐ์ค, ใ๋ณด๊ดใ ๋ฐฐ์ง + ๋ฐฐ๊ฒฝ#eceff1(๊ธ์์์ ์ ๊ฑด๋๋ฆผ). โข ใ์ฌ์์ฑใ = 1์ฐจ ๋ณด๊ด โ ํค๋(ํ์ฅยท์ ์ฒดยท๋ด๋น์ยท์ง๋ถ์กฐ๊ฑดยท๋ง์ง)๋ง ๋ฌผ๋ ค๋ฐ์ ๋น 2์ฐจ ์์ฑ โ ๊ทธ ์์ ํ๋ฉด์ผ๋ก ์ด๋. ํญ๋ชฉ ๋ณต์ฌ ์์. ์ด๋ฆโฆ (2์ฐจ)โโฆ (3์ฐจ)(์ ๊ท์์ผ๋ก ์ฐจ์ ์ฆ๊ฐ). โฃ ใ๋ณด๊ดํด์ ใ๋ ๊ทธ ํ์ฅ์ ํ์ฑ ๋ณธ๊ฒฌ์ ์ด ์์ ๋๋ง(1:1 ์ ์ง). ์ถ๊ฐ๊ฑด์ ๋ณธ๊ฑด๊ณผ ํจ๊ป ๋ณด๊ด(OR parent_estimate_no=). โค ์๋ง๊ฐ ํ๋ณด(select_candidates)์์ ๋ณด๊ด๊ฑด ์ ์ธ โ ์ ๋นผ๋ฉด 1์ฐจยท2์ฐจ๊ฐ ์ด์ค ์ง๊ณ๋๋ค. - ๐ด๋ค์ผ๋ก ์ก์ ๊ฒ = ์คํจ๊ฐ ์ฑ๊ณต์ผ๋ก ์์ด๋๊ฐ๋ค โ ๊ณต์ฉ
ajaxSuccessProcess๋ code"2000"๋ง ์คํจ๋ก ๋ณด๋๋ฐ ์๋ฒ ์์ธ๋"9999"๋ผ, ๋ณด๊ดํด์ ๊ฑฐ๋ถ ์ฌ์ ๊ฐ ํ๋ฉด์ ์ ๋จ๊ณ ์ฑ๊ณต์ฒ๋ผ ์ง๋๊ฐ๋ค (RestResponsePFS-D002 ๋ฏธ์ด๊ด ๊ตฌ๊ฐ). ์ด ํ๋ฉด ๋ ํธ์ถ๋ง_v2ApiFail(data)๋ก code ์ง์ ํ์ . - ์ด์ 708 ์ด๊ด = ใ๋์ฐ ์ฉ์ธ MH ๊ฒฌ์ ์ใ(field 2109ยท์๋ฅ์ค/๊น๋์ฐ, detail 50ยทsub 53ยทextra 0ยท43,563,000) โ
ํ
์คํธ ๊ฒฌ์
797. ํ ์คํธ 708 ์ ์ด๋ฏธ ๋ค๋ฅธ ๊ฒฌ์ (์ผ๋ ๋ธ ํํฌ์ฌ์ด๋, ์ญ์ ๋จ)์ด๋ผ ๋ฒํธ๋ฅผ ๋ชป ์ด๋ค. ์ฐธ์กฐ(field 2109ยทcompany 4ยทmember 400ยทuser 1)๊ฐ ํ ์คํธ์ ๊ฐ์ ๋ฒํธ๋ก ์ด๋ฏธ ์กด์ฌํด ๊ทธ๋๋ก ๋ถ์๋ค. ํ ๋์กฐ 50/53 ์ ๋ ์ผ์น. โ ํฉ๊ณ๋ง 11.09์ ์ฐจ์ด = ์ด์float์ปฌ๋ผ์ ํ์ ๋ฐ ์์ฌ(490417.03125 ๋ฅ)๊ฐ ์ด๊ด ๋ ์ ์๋ก ์ ๋ฆฌ๋ ๊ฒ. ํ๋ฉด๊ฐยทtotal_amount๋ ๋์ผ. - ๊ฒ์ฆ = ์ ์ค
scripts/_estimate_archive_check.py(๋ฏธ์ถ์ ) ํ ์คํธ 32ํญ๋ชฉ ALL PASS โ ์ฌ์์ฑ ํด๋ฆญโ2์ฐจ ์์ ํ๋ฉด ๋์ฐฉยทํค๋ ํ๋ฆฌํยทํญ๋ชฉ 0ยท๋ชฉ๋ก์์ 1์ฐจ ์ฌ๋ผ์งยทใ๋ณด๊ด ํฌํจใ ๋ณต๊ท(๋ฐฐ์งยท๋ฐฐ๊ฒฝยท๋ฒํผ ๊ตฌ์ฑ)ยท ํ์ฅ ๊ฒฌ์ ์ 1 ์ ์งยท๋ณด๊ดํด์ ๊ฑฐ๋ถ ์ฌ์ ยท์๋ง๊ฐ ํ๋ณด ๊ต์ฒดยท์ฝ์ 0, ๋์ ์์๋ณต๊ตฌ(2์ฐจ ์ญ์ +1์ฐจ ๋ณด๊ดํด์ ) ๊น์ง ํ์ธ. ๋ค์ฒ๋ฆฌ ๋ฌ๋_estimate_archive_cleanup.py(ํญ๋ชฉ ์๋ ๊ฒฌ์ ์ ์ ๋ ์ ์ง์ฐ๋ ๊ฐ๋). ํ์ฌ ํ ์คํธ ์ํ = 797 ํ์ฑ 1๊ฑด๋ง(ํํ๊ฐ ์ฒ์๋ถํฐ ๋๋ฌ๋ณผ ์ ์๊ฒ ๊นจ๋์ด ๋๋๋ฆผ). - ์ฌ์ดํธ๋งต ์ฌ๋น๋ = ๊ทธ๋ฃน8ยทํ์ด์ง49ยท๋ฏธ๋ฐ์ 2โ10(์ด๋ฒ ์ปค๋ฐ์ด ์ด์ ๋ฏธ๋ฐ์์ด๋ผ ์ ์ ยท
/archiveยท/rewrite์ ๊ท ๋ผ์ฐํธ ํฌํจ). devplanpfs.htmlPENDING ์c69c2d8๋ฑ๋ก(์ด์ DDL ์ ํ ํ์ ๋ช ์). - โณํํ ๋ชซ = ํ
์คํธ ์ก์(
/estimate/list-v2โ ํ์ฅ๋ช ใ๋์ฐ ์ฉ์ธใ ๊ฒ์ โ ์ฌ์์ฑ ๋๋ฌ๋ณด๊ธฐ). ์ด์ ๋ฐ์์ ์ง์ ๋ โ DDL(archive_yn) ๋จผ์ , ๊ทธ ๋ค์ ๋ฐฐํฌ.
๐ ํ์ฅ ๋จ์ ์ฐจ์ ์ด๋ ฅ์ผ๋ก ๊ฐํธ (ํํ ์ง์ 26.8.6 ยท master 641ff82 ํ
์คํธ ๋ฐฐํฌ)
ํํ ์ง์ = "๋ณด๊ด ํญ๋ชฉ์ ํ์ฅ๋ณ ์ด๋ ฅ๊ด๋ฆฌ๊ฐ ๋ง๋ค. ์ง๊ธ์ ๋ณด๊ด ํญ๋ชฉ ์ฐพ๊ธฐ๊น์ง ๊ณผ์ ์ด ๋ณต์กํ๊ณ 1์ฐจยท2์ฐจ ์์น๊ฐ ์ ๋ถ์ด ์์ด ๋น๊ต๊ฐ ์ค๋ ๊ฑธ๋ฆฐ๋ค. ํ ํ์ฅ ๊ธฐ์ค์ผ๋ก ํ์ธยท๋ณต๊ตฌ ๊ฐ๋ฅํ ๊ตฌ์กฐ๋ก ๊ฐ๋ณ. 1์ฐจ๋ฅผ ๋ณต๊ตฌํ๋ฉด 2์ฐจ๋ ์ญ์ ๊ฐ ์๋๋ผ ๋ณด๊ด. ํญ์ ๋ณด๊ด ์ ๋ ํญ๋ชฉ = ์ ํ๋ ์ฐจ์, ๋๋จธ์ง๋ ๋ณด๊ด."
- ๐๋ถ๋ณ์ = ใ๋ณด๊ด ์ ๋ ๊ฒ์ด ๊ณง ์ง๊ธ ์ฐ๋ ๊ฒฌ์ ์ใ(ํ์ฅ๋น ์ ํํ 1๊ฑด). ๊ทธ๋์ ๋๋๋ฆฌ๊ธฐ๋ '๋ณด๊ดํด์ '๊ฐ ์๋๋ผ ์๋ฆฌ ๋ฐ๊พธ๊ธฐ๋ค โ ์ ์ฐจ์๋ฅผ ๊ณ ๋ฅด๋ฉด ์ฐ๋ ์ฐจ์๊ฐ ๋ณด๊ด์ผ๋ก ๋ด๋ ค๊ฐ๋ค(์ญ์ ์๋).
- ๋ชฉ๋ก ํ ใ์ฐจ์ Nใ(๊ทธ ํ์ฅ ์ฐจ์ ๊ฐ์ =
revision_count์๋ธ์ฟผ๋ฆฌ) โ ๋ชจ๋ฌ์ ๊ทธ ํ์ฅ ์ ์ฐจ์๋ฅผ ํ ํ๋ก: ์ฐจ์ยท๊ฒฌ์ ๋ช ยท๊ฒฌ์ ์ผยท์์ฑ์ยทํญ๋ชฉ์ยท์ถ๊ฐ๊ฑดยท๊ธ์กยท์ํ. ์ต์ ์ด ์, ์ฌ์ฉ ์ค ํ์ ๋ฐฐ๊ฒฝ#e8f5e9. ์ ์ฐจ์์๋ง [์ด ์ฐจ์ ์ฌ์ฉ], ๋ชจ๋ ์ฐจ์์ [๋ณด๊ธฐ]ยท์ถ๋ ฅ. - ๋ณด๊ดํด์ ํ ๊ธ ํ์ง โ
PUT /<no>/archiveโPUT /<no>/select. ํ์ฑ 0 ์ํ๋ฅผ ๋ง๋ค ์ ์๊ณ , ๋๋๋ฆฌ๊ธฐ๊ฐ ์ญ์ ๋ฅผ ์๊ตฌํ์ง๋ ์๋๋ค.count_active_main_on_field(๊ฑฐ๋ถ ๊ฐ๋)๋ ์ฃฝ์ ์ฝ๋๋ผ ์ ๊ฑฐ. switch_active_estimate= ํธ๋์ญ์ 2๋ฌธ(๊ทธ ํ์ฅ ์ ๋ถ ๋ณด๊ด โ ๊ณ ๋ฅธ ๊ฒ๋ง ํ์ฑ). ์ถ๊ฐ๊ฑด์ ๋ถ๋ชจ๋ก ์ก๋๋ค (LEFT JOIN estimate p ON p.estimate_no=e.parent_estimate_noโ ์ถ๊ฐ๊ฑด์field_no๊ฐ ๋น์ด ์์ ์ ์๋ค). ์ฌ์์ฑ๋ ๋์ ๊ฐ์ ์ค์์น๋ฅผ ํ์ ์ ์ฐจ์๊ฐ ์ฌ๋ฟ์ด์ด๋ ํ ๋ฒ์ ์ ๋ฆฌ๋๋ค.- ๊ฒ์ฆ = ์ ์ค
scripts/_estimate_revisions_check.py21ํญ๋ชฉ ALL PASS(๋ชจ๋ฌ 2์ฐจ ๋น๊ตยท์ ํยท ๐remove_yn=0์ ์ง ์ค์ธกยท๋ชจ๋ฌ ๊ทธ ์๋ฆฌ ๊ฐฑ์ ยทใ์ฌ์ฉ ์คใ ํญ์ 1๊ฑดยท๋ชฉ๋ก ๋ฐ์ยทํ์ฅ ๊ฒฌ์ ์ 1ยท์ฝ์ 0ยท ์์ ์ํ ๋ณต์). ํ ์คํธ ํ์ฌ = 801 ์ฌ์ฉ ์ค ยท 797 ๋ณด๊ด(ํํ๊ฐ ๋๋ฌ๋ณธ ์ํ ๊ทธ๋๋ก ๋๋ ค๋์).
๋ณด๊ด๊ฑด ์ด๋ยท๋ณต๊ตฌ ๊ฒฝ๋ก (ํํ ์ง๋ฌธ 26.8.6 ยท ์ฝ๊ธฐ์ ์ฉ ์ค์ธก 8ํญ๋ชฉ ALL PASS ยท ใ๋ณด๊ดํด์ ใ๋ ์ ๊ฐํธ์ผ๋ก ๋์ฒด๋จ)
- ์ด๋ = ๋ชฉ๋ก์์ ใ๋ณด๊ด ํฌํจใ ์ฒดํฌ โ ๊ฒ์ โ ๋ณด๊ด ํ(ํ์+ใ๋ณด๊ดใ ๋ฐฐ์ง)์ [์์ ] ์ด๋ฉด ํญ๋ชฉยทํ์
ยท๊ธ์ก์ด
๊ทธ๋๋ก ์ด๋ฆฐ๋ค(์ค์ธก = ํ์
5ํญยทํญ๋ชฉ ๋ ๋ยท์ด๋ฆ/ํ์ฅ/์
์ฒด ์ ์). [์ถ๋ ฅ] ๋ ๋จ(
print-v2200 ยท ์์ API 200). URL ์ง์ (/estimate/modify-v2/<๋ฒํธ>)๋ ์ด๋ฆฐ๋ค. ๐์ด์ด์ ์ ์ฅํด๋ ๋ณด๊ด์ ์ ํ๋ฆฐ๋ค โupdate_estimate๊ฐarchive_yn์ ์ ๊ฑด๋๋ฆฐ๋ค(์ค์ธก archive_yn=1 ์ ์ง). - ๋ณต๊ตฌ = ๊ฐ์ ์๋ฆฌ์ [๋ณด๊ดํด์ ]. ๋จ ๊ทธ ํ์ฅ์ ํ์ฑ ๋ณธ๊ฒฌ์ ์ด ์์ด์ผ ํ๋ค(1:1). 2์ฐจ๊ฐ ์ด์ ์์ผ๋ฉด ใ์ด ํ์ฅ์๋ ์ด๋ฏธ ์ฌ์ฉ ์ค์ธ ๊ฒฌ์ ์๊ฐ ์์ต๋๋คใ๋ก ๊ฑฐ๋ถ โ 2์ฐจ๋ฅผ [์ญ์ ]ํ ๋ค ํด์ ํ๋ฉด 1์ฐจ๊ฐ ํญ๋ชฉยท๊ธ์ก ๊ทธ๋๋ก ๋์์จ๋ค.
- ๐ด๊ฐญ = 2์ฐจ๋ฅผ ์ด๋ ค๋ ์ฑ๋ก๋ ๋ง๋ฐ๊ฟ ์ ์๋ค. ํ์ฑ ํ์ ์๋ ใ๋ณด๊ดใ ๋ฒํผ์ด ์์ด์(๋ณด๊ด ๊ฒฝ๋ก๊ฐ ใ์ฌ์์ฑใ๋ฟ)
2์ฐจ๋ฅผ ๋ด๋ฆฌ๋ ค๋ฉด ์ฌ์์ฑ์ผ๋ก ๋น 3์ฐจ๋ฅผ ๋ง๋ค๊ฑฐ๋ 2์ฐจ๋ฅผ ์ง์์ผ ํ๋ค. ์ต์ ์์ = ํ์ฑ ํ์ ใ๋ณด๊ดใ ๋ฒํผ 1๊ฐ
(API
PUT /api/estimate/<no>/archive {archive_yn:'1'}๋ ์ด๋ฏธ ์๋ค ยท JS ๋unarchiveV2๋์นญ 1ํจ์). โณํํ ์ง์ ๋๊ธฐ. - ํ ์คํธ ํ์ฌ ์ํ = 797 ๋ณด๊ด(ํญ๋ชฉ 50 ์จ์ ) + 801 ํ์ฑ ๋น 2์ฐจ(ํํ๊ฐ ์ฌ์์ฑ์ ๋๋ฌ๋ณธ ์ํ โ ์ฝ๋๊ฐ ์ ๊ฑด๋๋ ธ๋ค).
(์ด์ ) ๊ณํ ํ์ ๊ธฐ๋ก
ํํ ์ง์ = "ํ ํ์ฅ ๊ฒฌ์ ์๋ฅผ ์๋ก ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค(๋๋ฉด ๋์์ธ์ด ์์ ๋ฐ๋). ๊ธฐ์กด 1์ฐจ ์์ฑ๋ถ์ ๋ณด๊ด์ฒ๋ฆฌ, ์ ๊ท 2์ฐจ ์์ฑ๋ถ์ ๋ณธ๊ฑด ๋ฉ์ธ์ผ๋ก ์์. ๊ณํ ๋จผ์ ."
- ๐ด์ค์ธก = ์ง๊ธ์ 2์ฐจ๋ฅผ ๋ง๋ค ๋ฐฉ๋ฒ์ด ์์ ์๋ค โ
estimate_regist_v2.js:2142๊ฐ ํ์ฅ ์ ํ ํ์ ์์ "์ด๋ฏธ ๊ฒฌ์ ์๊ฐ ์๋ ํ์ฅ์ ๋๋ค. ํ์ฅ:๊ฒฌ์ ์๋ 1:1์ ๋๋ค" ๋ก ํ์ฅ ์ ํ ์์ฒด๋ฅผ ๋ง๋๋ค. ๊ทผ๊ฑฐ ์นด์ดํธ =field_dao.select_field_list_for_estimate์estimate_count(์ถ๊ฐ๊ฑด ํฌํจยทremove_yn='0'). - ํ๊ธ ์กฐ์ฌ = estimate ๋ฅผ ์ฐธ์กฐํ๋ ๋ค๋ฅธ ๋ชจ๋์ ์๋ง๊ฐ๋ฟ(
monthly_close_dao:177 ํ๋ณด์์ง ยท :89 ์ง๊ณ). worklogยท๋ฐ์ฃผ์์ ๋ฆฌยทํ์ฅ์field_no๊ธฐ์ค์ด๋ผ ๋ฌด๊ด. ๊ฒฌ์ ๋ชฉ๋ก v2 = ๋ณธ๊ฒฌ์ ๋ง(parent IS NULL)ยท์์ฑ์ผ desc. - ํ์ ๊ณํ(P1) = โ ์ปฌ๋ผ 1๊ฐ
estimate.archive_yn char(1) DEFAULT '0'(์ฐจ์ ์ปฌ๋ผยท์ด๋ ฅ ํ ์ด๋ธ ์ ๋ง๋ฆ) โก1:1 ๊ฐ๋๋ ์ ๊ฑด๋๋ฆฐ๋ค โestimate_count์๋ธ์ฟผ๋ฆฌ์AND archive_yn='0'ํ ์ค์ด๋ฉด 1์ฐจ๋ฅผ ๋ณด๊ดํ๋ ์๊ฐ ๊ทธ ํ์ฅ ์ ๊ท ๋ฑ๋ก์ด ์ ์ ๋ก ์ด๋ฆฐ๋ค โข๋ชฉ๋ก = ๋ณด๊ด๊ฑด ๊ธฐ๋ณธ ์จ๊น + ใ๋ณด๊ด ํฌํจใ ์ฒดํฌ๋ฐ์ค(ํํ ํ1), ๋ณด๊ด ํ ํ์+๋ฐฐ์ง, ์ ๋ ฌ ๊ทธ๋๋ก๋ผ 2์ฐจ๊ฐ ์๋์ผ๋ก ์ โฃใ๋ณด๊ดใ ๋ฒํผ = ๋ณธ๊ฑด+์ถ๊ฐ๊ฑด ๋๋ฐ, ํ ๊ธ ํด์ ์ ๊ฐ์ ํ์ฅ์ ํ์ฑ ๋ณธ๊ฒฌ์ ์์ผ๋ฉด ์ฐจ๋จ โคใ์ฌ์์ฑใ = 1์ฐจ ๋ณด๊ด โ ์ ๋ฑ๋ก ํ๋ฉด ํค๋ ํ๋ฆฌํ(ํ์ฅยท์ ์ฒดยท ๋ด๋น์ยท๋ง์ง์จ๋ง, 1์ฐจ ํญ๋ชฉ ๋ณต์ ์ ํจ โ ํํ ํ1) โฅ์๋ง๊ฐ ํ๋ณดยท์ง๊ณ์์ ๋ณด๊ด๊ฑด ์ ์ธ(์ ๋นผ๋ฉด ์ด์ค ์ง๊ณ) โฆ๊ฒ์ฆ ๋ฌ๋scripts/_estimate_archive_check.py {test|prod}(DB+์ค๋ธ๋ผ์ฐ์ ), ํ ์คํธ ๋ฐฐํฌ๊น์ง. - โณํํ ๋ชซ = ์ฐฉ์ ์ง์(์ด์๋ฐฐํฌ๋ ๋ณ๋ ์ง์ ๋).
๐ NOW (2026-08-06) โ ๋์ฐ ์ฉ์ธ ์ค์ ์จ ํญ 1ํ์ด์ง ์ด๊ธฐํ + ์ฌ์ ๋ ฅ(์ด์ ๋ฐ์ดํฐ, ์ฝ๋๋ณ๊ฒฝ 0)
ํํ ์ง์ = "\\192.168.0.101\๊ณต์ ํด๋\2026ํ์ฅ\์๋ถ์์ฌ๋ฐ์ฃผ์\07์\์๋ฅ์ค ๋์ฐ ์ฉ์ธ ํธ๋ฅด์ง์ค MH
์๋ถ์์ฌ๋ฐ์ฃผ์.xlsx ์ ์ค์ ์จ ํญ 1ํ์ด์ง ๋ด์ฉ์ ๋ฐ๊ฟจ๋ค. ํ์์ฒด๊ฐ ์ฌ๋ผ์ง๊ฑฐ๋ ์์ ์ ํ์ผ๋
๊ธฐ์กด ๋๊ธฐํ ๋ด์ฉ์ ์ด๊ธฐํํ๊ณ ์ด ํญ๋ง PFS field/orderpaper ์ ์๋ก ์
๋ ฅํด์ค. ์ด์๋ฐฐํฌ."
- ์ค์ ์จ ํญ์ ์น์
์ด 1๊ฐ = ใ1ํ์ด์งใ =
block_key fe00af48โฆ(=sha1(ํ์ผ|์ค์ ์จ|0|R)) ํ๋๋ก ๋ฑ ๋จ์ด์ง๋ค. ์์ ํ์ฌ๊ฐ = 11ํญ๋ชฉ(๋ฐ์ฃผ๋ฒํธ 2ยท3ยท5ยท6ยท7ยท8ยท10ยท11ยท12ยท13ยท14), ๋ฐ์ฃผ 2026-08-06 ยท ์ ๊ณ 2026-08-11. - ์ ๊ทธ๋ฅ ๋๊ธฐํ๋ก๋ ์ ๋๋(์ด๊ธฐํ๊ฐ ํ์ํ ์ค์ ์ด์ 2๊ฐ, ์ด์ ์ค์ธก):
โ ๊ทธ ๋ธ๋ก 4ํ์ด
del_manual='1'(ํ๋ฉด์์ โ ๋ก ์ง์ด ์ํ)์ด๋ผ ๋๊ธฐํ UPDATE ๊ฐremove_yn=IF(del_manual='1','1','0')๋ก ๊ณ์ '1' ์ ๋ฐ๋๋ค โ ์์ ์ ์ด์ ์์ด๋ ํ๋ฉด์ ์์ํ ์ ๋ฌ๋ค. โก ๋จ์ 7ํ์ ์ ์ฌ์ฉ์ํธ์งยท์ฌ๊ณ ๊ฐ ๋ถ์ด ์์๋ค โreceive_date_user='2026-07-14'(ํ๋ฉด์ COALESCE ๋ผ ์์ ์ ๊ณ 08-11 ๋์ 07-14 ๋ฅผ ๋ณด์ฌ์ค๋ค),stock39/7 ๋ฑ์ด ๋ฐ์ฃผ๋๊ณผ ๋ฌด๊ดํ ์ ๋ผ์ด๋ ๊ฐ.item_key๊ฐsha1(ํ์ผ|ํญ|์น์ |์์ฌ๊ตฌ๋ถ|**idx**)๋ผ ์ค๊ฐ ํ์ด ๋น ์ง๋ฉด idx ๊ฐ ๋ฐ๋ ค ์ ํ์ ํธ์ง์ด ๋ค๋ฅธ ์์ฌ์ ์์๋๋ค. ๊ทธ๋์ ใ์ด๊ธฐํใ์ ์ค์ฒด = ์ด ๋ธ๋ก๋ง ํ์ ์ง์ฐ๊ณ ์ ๊ท INSERT ๋ก ๋ค์ ๋ฐ๊ธฐ. - ์คํ =
orderpaper-sync/_reset_daewoo_omc_prod.py(SSM) โ 12ํ DELETE(active 7 + removed 5, ์์ฌ 0) โpython orderpaper_sync.py prod R_omc_reset_20260806โ ins 11 / upd 1746 / removed 0. ๊ฐ๋ =source_file+block_key์ ํ์ผ์น + ์ ํvendor='์ค์ ์จ'ยทmaterial_type='R'ยทsource_kind='nas', ์ญ์ ์ 12ํ ์ ๋ JSON ์ถ๋ ฅ(๋กค๋ฐฑ ์๋ฃ). ์ฌ์ฉ์ด๋ ฅ(orderpaper_usage_history) 0๊ฑด ํ์ธ ํ ์ญ์ (์์ผ๋ฉด ์ค๋จํ๋ ๊ฐ๋).orderpaper_site_map์ ์๋์ง ์์ ํ์ฅ์ฐ๊ฒฐ field_no=2109 ์ ์ง. - ๊ฒ์ฆ(์ ์ค, ๋ฏธ์ถ์ ) =
orderpaper-sync/_verify_daewoo_omc_prod.py(์ด์ DB 33ํญ๋ชฉ ALL PASS) +scripts/_op_daewoo_omc_screen_check.py prod(์ด์ ํ๋ฉด 43ํญ๋ชฉ ALL PASS, ์ฝ์ 0). DB = 11ํยท์์ 11ํญ๋ชฉ ์ ๋ ๋์กฐ(ํ๋ช ยท๊ท๊ฒฉยท๋ฐ์ฃผ๋)ยทremove_yn=0ยทdel_manual=0ยทstatus=๋๊ธฐยท*_user์ ๋ถ NULLยทstock=๋ฐ์ฃผ๋ยท๋ฐ์ฃผ 08-06/์ ๊ณ 08-11 ยท ๋ค๋ฅธ ํญ ํ์ ์ด๊ธฐํ ์ ๊ณผ ๋์ผ. ํ๋ฉด = ๋ฐ์ฃผ์์ ๋ฆฌ ใ๋์ฐ ์ฉ์ธใ ์นด๋ โ ์ค์ ์จ ๋ธ๋ก ใ11๊ฑด ยท ๋ฐ์ฃผ 8.6(๋ชฉ) ยท ๊ธฐ๋ณธ์ ๊ณ 8.11(ํ)ใ, ํญ๋ชฉํ 11๊ฐ ๋ ๋ + ์์ฌ๊ด๋ฆฌ ํญ์๋ ๋ ธ์ถ(3๊ฐ์ ์ฐฝ ํต๊ณผ โ ์ ๊ณ 8.11 ์ด ์ฐฝ ์). - ์ปค๋ฐ ์์ = ์ฝ๋ ๋ณ๊ฒฝ 0(์ด์ RDS ๋ฐ์ดํฐ ์์
+ ๋ฏธ์ถ์ ์คํฌ๋ฆฝํธ). ์ฌ์ดํธ๋งต ์ฌ๋น๋ = ๊ทธ๋ฃน8ยทํ์ด์ง49ยท
๋ฏธ๋ฐ์ 2(์ด๊ธฐํ ์ ๊ณผ ๋์ผ ยท ๋ ๋ค ๊ธฐ์กด AL
al-orderpaperยทal-profile๋ฐฑ๋ก๊ทธ). - โณํํ ๋ชซ = ์ด์ ์ก์(
/field/orderpaperโ ใ๋์ฐ ์ฉ์ธใ โ ์ค์ ์จ ๋ธ๋ก 11๊ฑด ยท ์ง์ ๋ 2ยท3ยท5ยท6๋ฒ์ด ๋ค์ ๋จ๋์ง ยท ์ ๊ณ ์ผ์ด 8.11 ๋ก ๋ณด์ด๋์ง). โ ์ฌ๊ณ ๋์ด ๋ฐ์ฃผ๋์ผ๋ก ์ด๊ธฐํ๋์ผ๋ ์์ผ๋ก ๋ฃ์ด๋ ์ฌ๊ณ ๊ฐ ์์๋ค๋ฉด ๋ค์ ๊ธฐ์ ํด์ผ ํ๋ค.
๐ NOW (2026-08-06) โ ์นดํก๊ด๋ฆฌ ์์ ์ฐฝ ์๋๋์ด + ํธ์ง ์ค๋ณต ๋ฐฉ์ง 3์ค ๊ฒ์ดํธ ์ด์๋ฐฐํฌ ์๋ฃ
ํํ ์ง์(QA ๋ณด๊ณ /field/worklog) = "์์ ๋ด์ฉ์ด ๋ง์๋ฐ ์์ ์ฐฝ ๋์ด๊ฐ ๋๋ฌด ๋ฎ๋ค. ํ
์คํธ ๋ด์ฉ์ ๋ง์ถฐ์
์์ ์ฐฝ ๋์ด๋ ๋๋ ค์ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์๊ฐ ํธ์งํ๋ฉด ๋ด์ฉ์ด ์ค๋ณต๋์ง ์๊ฒ ์ฝ๋๊ฐ ์ฒดํฌํ๋ ํ๋ก์ธ์ค ์๋์ง
ํ์ธํด์ ๋ณด์ํด์ค. ์ด์๋ฐฐํฌ."
- ์์ ์ฐฝ =
.kb-row textarea๊ฐmin-height:64px๊ณ ์ ์ด๋ผ 10์ค์ง๋ฆฌ ํญ๋ชฉ๋ 3์ค๋ง ๋ณด์๋ค. โkbGrow()๊ฐscrollHeight๋ก ๋์ด๋ฅผ ๋ง์ถ๊ณ ์ ๋ ฅ๋ง๋ค ์ฌ๊ณ์ฐ(๋๊ณ ์ค๊ณ ๋ ๋ค). ์ํmax-height:60vh(๊ทธ ์๋ก๋ง ์คํฌ๋กค โ ์ฐฝ์ด ํ๋ฉด์ ์ผํค์ง ์๋๋ค).resize:vertical์ ๋จ๊ฒจ ์ฌ๋์ด ๋ ๋๋ฆด ์ ์๋ค. ์ด์ ์ค์ธก = 3์ค ํญ๋ชฉ 76px โ 15์ค 309px โ 120์ค 570px(=60vh ์ํ, ๊ทธ๋๋ง ์คํฌ๋กค). - ์ค๋ณต ๊ฒ์ฌ๋ ใ์๋์ง ํ์ธใ์ ๋ต์ด "์ด๋์๋ ์์๋ค" โ ํ๋ฉดยท์๋ฒยท๋ฐ๋ชฌ ์ด๋ ์ธต์๋ ์์๋ค. 3์ค์ผ๋ก ์ ์ค.
ํ์ ๊ธฐ์ค์ ์
๋ค ๊ฐ๋ค = ๊ฐ์ ์น์
ยท ์ฒซ ์ค ๋์ผ(ํ๊ธฐ ์ ๋์ฌ
[์๋ฃ]ยทโป์ถ๊ฐยทโป์์ ๋ ๋ผ๊ณ ๋ณธ๋ค). ์ฒซ ์ค๋ก ๋ณด๋ ์ด์ = ๊ทธ๊ฒ ํ id ์ ๊ทผ๊ฑฐ(board_rows._ids=sha1(์น์ +์ฒซ์ค+๋ฑ์ฅ์๋ฒ))๋ค. ๊ฐ์ ๋ฌธ๊ตฌ๊ฐ ๋์ด๋ฉด id ๊ฐ ๋ฑ์ฅ์๋ฒ์ผ๋ก๋ง ๊ฐ๋ ค์, ์ ํ์ด ์ฌ๋ผ์ง๋ ์๊ฐ ๋ค ํ์ id ๊ฐ ์กฐ์ฉํ ๋ฐ๋๋ค โ ๊ทธ ๋ค์ ์์ ยท์ญ์ ๊ฐ ์๋ฑํ ํ์ ์ก๋๋ค. ๊ทธ๋์ ๊ทธ๋ฐ ์์ ์ ์ด์ ๋ชป ๋ง๋ค๊ฒ ๋ง๋ ๊ฒ ๊ทผ๋ณธ์์ ์ด๋ค. โ ํ๋ฉด(kbDupRow) = ใ์ ์ฉ(ํ์๋ง)ใ ๋จ๊ณ์์ ๋ง๊ณ ํ ์คํธ๋ก ์๋ฆฐ๋ค. ์์ง ์ ์ฅ ์ ํ ํ์(KB_PEND)๊น์ง ๋ฐ์ํด ๋น๊ตํ๋ค โ ์์ ํ์๊ฐ ๊ฑธ๋ฆฐ ํ์ ๊ทธ ์์ ๋ฌธ์ผ๋ก, ๋ด๋ ค๊ฐ ํ(์๋ฃยท์ทจ์ยท์ญ์ )์ ๋์์์ ๋บ๋ค. โก ์๋ฒ(add_op) = ๋ฏธ๋ฌ(rows_json) ๋์กฐ๋ก ๊ฐ์ ๋ด์ฉ ๊ฑฐ๋ถ + ๊ฐ์ ํ์ ๋๊ธฐ ์ค ๋ช ๋ น์ด ์์ผ๋ฉด ๊ฑฐ๋ถ. ๋ค์ฃ๊ฒ์ด ์ค์ํ๋ค โ ๋ฏธ๋ฌ๋ ๋ฐ๋ชฌ์ด ๋ฐ์ํด์ผ ๊ฐฑ์ ๋๋ ๊ทธ 30~60์ด ์ฌ์ด์ ๊ฐ์ ํ์ ๋ ๊ณ ์น๋ฉด ํ๋ฉด์ ์ ๋ด์ฉ์ ๋ณด์ฌ์ฃผ๊ณ , ๋์ค ๋ช ๋ น์ด ์ ๋ช ๋ น์ ๋ฎ์ด์จ ๋ฐฉ๊ธ ์ด ๋ด์ฉ์ด ์กฐ์ฉํ ์ฌ๋ผ์ง๋ค(์ค๋ณต ๋ฑ๋ก โ ์ ์ค). โข ๋ฐ๋ชฌ(board_rows.edit/restore) = ๋ง์ง๋ง ๊ด๋ฌธ. ์น์ด PFSยทdevplan ๋์ด๊ณ ack ์ ์ค ์ ๋ช ๋ น์ด ์ฌ๋ฐฐ๋ฌ ๋๋ฏ๋ก(๊ทธ๋restore๋ ๊ฐ์ ์ค์ ๋ ๋ถ์ธ๋ค) ํ๋ฉด ๊ฒ์ฌ๋ง์ผ๋ก ๋ชป ๋ง๋๋ค. - ๊ฒ์ฆ = ์ ์ค
scripts/_kakao_board_edit_check.py {test|prod} [--api](๋ฏธ์ถ์ ) โ ํ ์คํธ 26 + API 6 ยท ์ด์ 26 ALL PASS. ๋์ด๋ ํฝ์ ์ค์ธก(์ด์๋ง์ ์คํฌ๋กค 0 โ ๋๋ฆผ โ ์ค์ โ 60vh ์ํ), ์ค๋ณต์ ๊ฐ์ ์น์ ๋ค๋ฅธ ํ ๋ฌธ๊ตฌ๋ก ์ค์ ํด๋ฆญ. ์ด์์ ์ ์ฅ์ ๋๋ฅด์ง ์๋๋ค(๋๋ฅด๋ฉด ๊ณ ๊ฐ ๋จํก๋ฐฉ์ด ๋ฐ๋๋ค). scripts/test_kakao_board.py13โ15ํญ๋ชฉ(๋๊ธฐ ์ค ๊ฐ์ ํ ๊ฑฐ๋ถยท๊ฐ์ ์ฒซ ์ค ๊ฑฐ๋ถ/๋ค๋ฅธ ์น์ ํ์ฉ/์๊ธฐ ์์ ์ ์ธ),board_rows.py์์ฒด๊ฒ์ฌ(์ค๋ณต ์์ ๊ฑฐ๋ถยท๋ค๋ฅธ ์น์ ํ์ฉยท๋ณต์ ์ฌ๋ฐฐ๋ฌ ๊ฑฐ๋ถ).- ์ปค๋ฐ = master
cec85c6+229b61dโ deploy-live11e235e(4ํ์ผ ํฌ์๋, merge ์๋). poin-agenta5a5e45(๋ก์ปฌ ๋ฆฌํฌ). ๋ฐ๋ชฌ ์ฌ์์ ์๋ฃ(watcher PID 12084). ์ฌ์ดํธ๋งต 3โ2(/field/worklog๊ฑทํ). - โณํํ ๋ชซ = ์ด์ ์ก์(์นดํก๊ด๋ฆฌ โ ๋ฐฉ ํผ์ณ ๊ธด ํญ๋ชฉ โ โ ์ฐฝ์ด ๋ด์ฉ๋งํผ ์ด๋ฆฌ๋์ง ยท ๋ค๋ฅธ ํ ๋ฌธ๊ตฌ๋ฅผ ๋ถ์ฌ๋ฃ๊ณ ใ์ ์ฉใ โ ใ์ค๋ณต์ด๋ผ ๋ฑ๋กํ์ง ์์์ต๋๋คใ ํ ์คํธ๊ฐ ๋จ๋์ง).
๐ NOW (2026-08-05) โ ์นดํก๊ด๋ฆฌ ใ๋ณ๋ ๋ฐ์ ์ด๋ ฅใ โ = ์ํํธ๋๋ฆฌํธ(์จ๊น ์ด๋ ฅ) ์ด์๋ฐฐํฌ ์๋ฃ
ํํ ์ง์ = "์นดํก๊ฒ์๊ธ ๊ด๋ฆฌ์์ ๋ณ๋ ๋ฐ์ ์ด๋ ฅ ํญ๋ชฉ์ ์ญ์ ๊ฐ ์ํํธ๋๋ฆฌํธ๊ฐ ์๋๋ผ ์ค์ ์ญ์ ๋ผ๊ณ ์๋ด๋ฉ์์ง๊ฐ ๋์จ๋ค. ์ํํธ๋๋ฆฌํธ(์จ๊นํญ๋ชฉ์ผ๋ก ์ด๋)๋ก ์์ ํด์ค. ์ด์๋ฐฐํฌ."
- ์์ธ์ ์๋ด๋ฌธ์ด ์๋๋ผ ๊ตฌ๋ฉ์ด์๋ค โ ์ด๋ ฅ ํ์ ๋ก๊ทธ๋ผ์ ์ค์กฐ์ ๋ฐฉ์ง๋ก โ์๋ฃยทโ์ทจ์๋ฅผ ๋บ๋๋ฐ(2026-07-28),
๊ทธ ๊ฒฐ๊ณผ โ ๋ง๊ณ ๋ด๋ฆด ๋ฐฉ๋ฒ์ด ์๋๋ฐ ๊ทธ โ ๊ฐ ์ค์ ์ญ์ ์๋ค. ๋ค๋ฅธ ํ์ ์๋ฃยท์ทจ์๋ก ์ด๋ฏธ ์ํํธ ๊ฒฝ๋ก๊ฐ ์๋ค.
โ ์ด๋ ฅ ํ์ โ ๋ง
action:'hide', status:'์ญ์ '๋ก ๋ฐ๊ฟ ์จ๊น ์ด๋ ฅ์ ๋จ๊ธฐ๊ณ โฉ ๋ณต์์ด ๋๋ค. ๋ค๋ฅธ ํ์ โ ๋ ์๋์ง ์์๋ค(2026-07-28 ํํ ์ง์ "์ข ๊ฒฐ ํญ๋ชฉ ๋น ๋ฅธ ์ ๋ฆฌ" โ ์ง์ ๋ฐ). - ๋ ๋ฆฌํฌ๋ฅผ ๊ฐ์ด ๊ณ ์ณ์ผ ํ๋ค = PFS
VALID_STATUS์ ์ฌ๋ฌด์ค PC ๋ฐ๋ชฌboard_rows.STATUSES๊ฐ ์ง. PFS ๋ง ๋๋ฆฌ๋ฉด ๋ฐ๋ชฌ์ดValueErrorโ ํ๋ฉด์ ใ๋ฐ์ ์คํจใ๋ก๋ง ๋ฌ๋ค. ์์ = ๋ฐ๋ชฌ ๋จผ์ + ์ฌ์์ โ ๋ฐฐํฌ. ์์ฃผsgc/watcher.py๋ import ๋ฅผ ๋ถ๋ค๊ณ ์์ด ์ฌ์์ ํ์(์์น๊ถํ ๋ถ์ยท์๋ฃ), ์์ฝ์์PFS-KakaoBoard-Sync(1๋ถ)๋ ๋งค๋ฒ ์ ํ๋ก์ธ์ค๋ผ ํ์ผ ์์ ์ฆ์ ๋ฐ์. ์์ธยท์ฌ์์ ๋ช ๋ น โrules.md ๐ - ํ์ ์ ๊ธฐ์กด๊ณผ ๊ฐ์ ํ ์ค(
์น์ ๋ช ์ '์ด๋ ฅ') ์ฌ์ฌ์ฉ โ ์ APIยท์ ์ปฌ๋ผยท์ ํ ์ด๋ธ 0. ํ๋ฉด์ ์ด๋ ฅ ํ์data-log="1", โ ํดํ 2์ข ("์จ๊น ์ด๋ ฅ์ผ๋ก ๋ณด๋ ๋๋ค(๋ณต์ ๊ฐ๋ฅ)" / "์ด๋ ฅ์ ์ ๋จ์ต๋๋ค"), ์จ๊น ์ด๋ ฅ ใ์ญ์ ใ ๋ผ๋ฒจ์ ๋นจ๊ฐ. devplankakao-ops.html๋ ๊ฐ์ ๋ผ๋ฒจ์๋ง ๋ง์ถฐ ๋๋ค. - ๊ฒ์ฆ = ์ ์ค
scripts/_kakao_board_softdelete_check.py(๋ฏธ์ถ์ ) โ ํ ์คํธ 28ํญ๋ชฉ + ์ด์ 24ํญ๋ชฉ ALL PASS. ํ ์คํธ๋--api๋ก ์ค์๋ณต๊น์ง(status=์ญ์ ์๋ฝ ยท ํ์ฉ ๋ฐ ใ๋ณด๋ฅใ๋ ์ฌ์ ํ ๊ฑฐ๋ถ ยท ํ ์ ์ฅ ํ์ธ โ ack ๋ก ์ ๋ฆฌ). ์ด์์ ์ ์ฅ์ ๋๋ฅด์ง ์๋๋ค โ ๋๋ฅด๋ฉด ๊ณ ๊ฐ ๋จํก๋ฐฉ ๊ฒ์๊ธ์ด ์ค์ ๋ก ๋ฐ๋๋ค. ํด๋ฆญโKB_PEND ํ์ด๋ก๋๊น์ง๋ง ํ์ธ. board_rows.py์์ฒด๊ฒ์ฌ(์ค์ ใโ ๋ณ๋ ๋ฐ์ ์ด๋ ฅใ ์น์ ์์ hide('์ญ์ ')โrestore ์๋ณต) ยทtest_kakao_board.py13ํญ๋ชฉ. โ 1์ฐจ ์คํ 5๊ฑด ์คํ = ๊ฒ์ฆ์ด ๋ฐฉ์ ์ ๊ฐ๋๋ค. ํ id ๋ ๋ฐฉ์ด ๋ฌ๋ผ๋ ๊ฐ์ ๋ฌธ๊ตฌ๋ฉด ๊ฐ์ ๊ฐ(sha1(์น์ +๋ณธ๋ฌธ+์๋ฒ)).- ์ปค๋ฐ = master
c0129d2โ deploy-live0a75e3a(3ํ์ผ ์ ๋ณ ํฌ์๋, merge ์๋ โ AL ๋ฏธ๋ฐฐํฌ๊ฑด์ด ๋๋ ค์จ๋ค). poin-agent4889937(๋ก์ปฌ ๋ฆฌํฌยท๋ฆฌ๋ชจํธ ์์). ์ฌ์ดํธ๋งต ์ฌ๋น๋ 2ํ = ๋ฐฐํฌ ์ ๋ฏธ๋ฐ์ 3 โ ๋ฐฐํฌ ํ 2 (/field/worklog์ฃผํฉ ๊ฑทํ, ๋จ์ 2๊ฑด์ ๊ธฐ์กด ALal-orderpaperยทal-profile). - โณํํ ๋ชซ = ์ด์ ์ก์(
/field/worklogโ ์นดํก๊ด๋ฆฌ โ ๋ฐฉ ํผ์ณ ใ๋ณ๋ ๋ฐ์ ์ด๋ ฅใ ํ โ โ ์ ์ฅ โ 30์ด ๋ค ์จ๊น ์ด๋ ฅ์ ใ์ญ์ ใ๋ก ๋จ๋์ง).
๐ NOW (2026-08-05) โ ๊ฒฌ์ ์ ์์ ์์ ํ์ผ ์ฑ์ฐ๊ธฐ ์ ํ ยท ์ด์๋ฐฐํฌ ์๋ฃ + ์ด์ ๋ค์ด๋ก๋ E2E
ํํ ํ๋จ = "โ ใ์๋์ ๊ฐ์ด ๊ฒฌ์ ํฉ๋๋คใ ํ์ ๋ช ์ด๋ฆฐ ์ํ ์ ์ง โก๊ฒฐ์ฌ์นธ ํ์ฌ๋๋ก ์ ์ง. ์ด ์์์ผ๋ก pfs ๊ฒฌ์ ์ ์์ฑ ํ์ผ ๊ต์ฒดํด๋ผ. ์ด์ ๋ฐฐํฌ. ์ค์ ๊ฒฌ์ ๊ฑด 1๊ฐ playwright๋ก ๋ค์ด๋ฐ์์ ๋์ผ test ํ์ผ์ ์ ์ฅ๊น์ง ํ ์คํธ. ์ด์์๋ฒ์์ ๋ค์ด๋ก๋ ํ ์คํธ."
- ์ด์๋ฐฐํฌ = deploy-live
a485b23(4ํ์ผ ํฌ์๋) +9482849(์ผ์ ์์ ํ์). master01d5f43ยทb11c8a5. merge ์๋ โ ํ์ผ๋จ์ ํฌ์๋. ์ฌ์ ํ์ธ = ๋์ 4ํ์ผ์ ๊ฑธ์น ๋ฏธ๋ฐ์ ์ปค๋ฐ์ด ๋ด ๊ฒ๋ฟ์์--cherry-pick --right-only๋ก ํ์ธ. ๋ฐฐํฌ ํ ์์ฌ ๋ฏธ๋ฐ์ = AL 12ํ์ผ๋ฟ(๊ธฐ์กด ๋ฐฑ๋ก๊ทธ), ๊ฒฌ์ ์ ํ์ผ์ ์ ๋ถ ๋ฐ์๋จ. - ๐๋ค์ด๋ก๋ E2E =
scripts/_estimate_excel_download_e2e.py {test|prod} [์ ์ฅ๊ฒฝ๋ก] [๊ฒฌ์ ๋ฒํธ]. ๋ก๊ทธ์ธ โ ๊ฒฌ์ ๋ชฉ๋ก โ ํ๋ชฉ ์๋ ๊ฑด ์๋์ ๋ณ โ ์ถ๋ ฅํ๋ฉด โ ใ์์ ใ ๋ฒํผ ํด๋ฆญ โ ์ค์ ๋ด๋ ค๋ฐ์ ํ์ผ์ ์ด์ด ํ ํ๋ฆฟ๊ณผ ์์ ๋์กฐ. ํ ์คํธ 10ํญ๋ชฉ PASS / ์ด์ 11ํญ๋ชฉ PASS(์ด์ ๊ฒฌ์ 744 ใ๋ต์ค ์์ฉ ํ์๋ MHใ โ NAS ์ค๋ฌผ๊ณผ ๊ฐ์ ํ์ฅ, ๋ณธ๊ฑด 2๋ธ๋กยทํ๋ชฉ 6์คยท6,300,000 ์ผ์น, ์ฝ์ 0). - ๐ํจ์ 3๊ฐ(์ ๋ถ ์ด๋ฒ์ ๋ฌผ๋ฆผ):
โ ๋ก๊ทธ์ธ์ ํผ submit ์ด ์๋๋ผ JS
login()โpage.evaluate("() => login()")ํ URL ๋ณํ ๋๊ธฐ. โก ๋ชฉ๋ก ํ์ ๊ฒฌ์ ๋ฒํธ๊ฐ ์ ๋ฐํ ์๋ค(JS ํด๋ฆญ ํธ๋ค๋ฌ) โ/api/estimate/์๋ต์์ ๋ฝ๋๋ค. ๋ดํฌ ํค๋message(data/result ์๋). โข ๋ธ๋ก ์๋ฅผws.max_row๋ก ์ธ๋ฉด ์ ๋๋ค โ ์ธ์์์ญ($O$n)์์ ์ผ๋ค. ํ ํ๋ฆฟ์ ์ธ์์์ญ ๋ฐ์ ํ๋์ด๋ง 450ํ๊น์ง ์๋ค. - ํ์ ์์ 1๊ฑด = ์ผ์๊ฐ ๋น์์ ๋ ํ
์คํธ ์์(
"์ผ์: "@)์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ์ ์ค๋จ. ๋น์นธ์ ใ์ผ์: ใ๋ง ์ฐํ๊ณ ํ ํ๋ฆฟ ์์๊ณผ๋ ์ด๊ธ๋ฌ๋ค. ๋ ์ง๋ก ๋ชป ์ฝ๋ ๋ฌธ์์ด์ด ์ค์ ๋ก ์์ ๋๋ง ์ ํ. - ๐ด๋ณด๊ณ ์ค๋ฅ ์ ์ = 1์ฐจ ๋ต๋ณ์์ "TEST ํด๋์ 5๊ฐ ๋ฃ์๋ค"๊ณ ํ์ผ๋ ์ค์ ๋ก NAS ์ 2๊ฐ๋ง ๊ฐ๋ค.
Bash heredoc ์
'\\2026ํ์ฅ'์ด 8์ง ์ด์ค์ผ์ดํ๋ก ๋จนํC:\192.168.0.101\๊ณต์ ํด๋6ํ์ฅ\...์ด๋ผ๋ ๋ก์ปฌ ๊ฒฝ๋ก์ ์ฐ์๊ณ ,os.path.exists()๊ฐ True ๋ผ ์ฑ๊ณต์ผ๋ก ๋ณด๊ณ ๋๋ค. ์ง๊ธ์ ์ ๋ฆฌ ์๋ฃ โ ๊ฒฝ๋ก๋ ํฌ์๋์ฌ๋์, ์ ์ฅ ํ ๋ชฉ์ ์งlistdir๋ก ๋์ฝ์ด ํ์ธ. - ๊ฒฐ๊ณผ๋ฌผ(
\\192.168.0.101\๊ณต์ ํด๋\2026ํ์ฅ\๊ฒฌ์ \TEST) =00_์ฝ์ด์ฃผ์ธ์.txtยท01_โฆ(์ค๋ฌผ๊ณผ ๋์ผ๋ฐ์ดํฐ).xlsx/pdfยท01_์ฐธ๊ณ _์ถ๊ฐ๊ฑด ํฌํจ ์ํ.xlsx/pdfยท02_์ด์์๋ฒ ๋ค์ด๋ก๋_๋ต์ค ์์ฉ ํ์๋ MH ๊ฒฌ์ ์.xlsx/pdf. - ์ฌ์ดํธ๋งต ์ฌ๋น๋ = ๋ฐฐํฌ ์ ยทํ ๋ชจ๋ ๊ทธ๋ฃน8ยทํ์ด์ง49ยท๋ฏธ๋ฐ์ 2(๋ ๋ค ๊ธฐ์กด AL โ ๊ฒฌ์ ์ ์ถ๋ ฅ์ ํ๋ฉด ๋ท๋จ API ํ์ผ์ด๋ผ ํ์ด์ง ํ์์ ์ ์กํ๋ค).
- โณํํ ๋ชซ = ์ด์ ์ก์(๊ฒฌ์ ์ ์ถ๋ ฅ โ ์์ ) + TEST ํด๋ 02๋ฒ ํ์ธ.
(1์ฐจ) ๊ฒฌ์ ์ ์์ ์ NAS ์์ ํ์ผ ์ฑ์ฐ๊ธฐ๋ก ์ ํ โ ๋ฐฐํฌ ์ ๊ฒฐ๊ณผ๋ฌผ ์ ์ถ
ํํ ์ง์ = "์ค์ ๊ฒฐ๊ณผ๋ฌผ(07์\๋ต์ค\๋ต์ค ์์ฉ ํ์๋ MH ๊ฒฌ์ ์.xlsx)ยท๊ธฐ๋ณธ ์์(์์ ๊ฒฌ์ ์.xlsx) 2ํ์ผ ํ์ธํด์
PFS ๊ฒฌ์ ์ ์์
์์ ์์ . ์ ๊ตต๊ธฐยท์
๋ฐฐ๊ฒฝ์ยท์ํ์ข์ฐ ์ฌ๋ฐฑ ๋ฑ ๋ชจ๋ ๊ฒ์ด ๋์ผํด์ผ ํ๋ค.
์์ ํ์ผ์ ์๋ก ๋ง๋ค๊ธฐ๋ณด๋ค ๊ธฐ์กด ํ์ผ์ ํ์ฉํด ๋ฐ์ดํฐ ์
๋ ฅํ๋ ์ชฝ์ผ๋ก. ๊ฒฐ๊ณผ๋ฌผ์ ๊ฒฌ์ \TEST ํด๋์ ์์
์๋ฒ."
- ๋ฐฉ์ ์ ํ = ์ฝ๋๋ก ์์์ ๋ค์ ๊ทธ๋ฆฌ๋
build_excel์ ๋ฒ๋ฆฌ๊ณ NAS ์์ ํ์ผ ์์ฒด๋ฅผ ๋ฆฌํฌ์ ๋๊ณ ๊ฐ๋ง ์ฑ์ด๋ค. ํ ํ๋ฆฟapi/pfs/estimate/service/estimate_form.xlsx= NAS ์๋ณธ ๋ฐ์ดํธ ๋์ผ. ์์ผ๋ก ์์์ด ๋ฐ๋๋ฉด ์ฝ๋๊ฐ ์๋๋ผ ์ด ํ์ผ์ ๊ฐ์๋ผ์ด๋ค. (web/static๋ฐ์ ๋ ์ด์ = ์ ์ ๊ฒฝ๋ก๋ฉด ํ๋ณธ ๊ฒฌ์ ๋ด์ฉ์ด ๊ทธ๋๋ก ๊ณต๊ฐ๋๋ค.) - ์ํธ ํ๋ณด = ํ
ํ๋ฆฟ ใ์ข
ํฉใ=์์ฝ ์๋ณธ / ใ๋ณธ๊ฑดใ=๊ธ์ก์ํธ ์๋ณธ(์์ฝ1+์์ธ4 ๋ธ๋ก). ์ถ๊ฐ๊ฑด์ ใ๋ณธ๊ฑดใ์
copy_worksheet. ๋ธ๋ก์ด ๋ชจ์๋ผ๋ฉด ์์ธ ๋ธ๋ก(46~90ํ) ์์์ ๋ณต์ . ใ์ถ๊ฐ1ใ ํ ํ๋ฆฟ ์ํธ๋ ๋ฒ๋ฆฐ๋ค. - ๊ฒฐ์ฌ์นธ๋ง ์์ธ โ ํ ํ๋ฆฟ์์ ๋ํ ๊ทธ๋ฃน์ด๋ผ openpyxl ์ด ๋ชป ์ด๋ฆฐ๋ค โ ํ ํ๋ฆฟ 300dpi ์ค๋ ๋ ํฌ๋กญ PNG๋ก ๋์ฒด, ์ต์ปค๋ ํ ํ๋ฆฟ ๊ทธ๋๋ก(J39 ์ฐ์ธก ~ O ๋ ยท 39~41ํ). ๋์ฅ๋ ํ ํ๋ฆฟ ์๋ณธ jpg(67ร71)๋ก ๊ต์ฒด.
- ๊ฒ์ฆ = ์ ์ค
scripts/_estimate_excel_form_check.py58ํญ๋ชฉ ALL PASS(DB ์์ด DAO ์คํ ). ํต์ฌ = ์์ diff 0 โ ๋ด ์ถ๋ ฅ vs ํ ํ๋ฆฟ์ ์ ๋จ์(ํ ๋๋ฆฌยท๋ฐฐ๊ฒฝยทํฐํธยท์ ๋ ฌยทํ์ํ์) + ํ๋์ดยท์ดํญยท๋ณํฉยท์ฌ๋ฐฑยทํ์ด์ง์ค์ ์ ์ ๋์กฐ. ์ผ์ด์ค 4์ข (๊ธฐ๋ณธ / ํ์ 7์ข =๋ธ๋ก๋ณต์ / ๋ถ๋ถ์ถ๋ ฅ ๋ณธ๊ฑด๋ง / ์ถ๊ฐ๊ฑด๋ง). ์ถ๊ฐ๋ก ๋ด ์ถ๋ ฅ ใ์ข ํฉใ vs NAS ์ค๋ฌผ ใ์ข ํฉใ ์์ diff = 0. Excel COM ์ค๊ณ์ฐ ํ์ธ = ์ข ํฉ 6,640,000 = ๋ณธ๊ฑด 6,500,000 + ์ถ๊ฐ1 140,000. ํ์ผ 438KBโ104KB. - ๊ฒฐ๊ณผ๋ฌผ =
\\192.168.0.101\๊ณต์ ํด๋\2026ํ์ฅ\๊ฒฌ์ \TEST\01_๋ต์ค ์์ฉ ํ์๋ MH ๊ฒฌ์ ์(PFS์ถ๋ ฅ).xlsx(+ ๊ฐ์ ์ด๋ฆ .pdf). NAS ์ค๋ฌผ๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ก ๋ฝ์ 1:1 ๋์กฐ ๊ฐ๋ฅ. - ์ปค๋ฐ master
01d5f43. ๋ฐฐํฌ ์ ํจ(ํ ์คํธ ์๋ฒ ์๋๋ฐฐํฌ๋ง). ์ฌ์ดํธ๋งต ์ฌ๋น๋ = ๊ทธ๋ฃน8ยทํ์ด์ง49ยท๋ฏธ๋ฐ์ 2(๋ ๋ค ๊ธฐ์กด AL ๊ฑด โ ๊ฒฌ์ ์ ์ถ๋ ฅ์ ํ๋ฉด ๋ท๋จ API ์๋น์ค ํ์ผ์ด๋ผ ํ์ด์ง ๋ฏธ๋ฐ์ ํ์์๋ ์ ์กํ๋ค). - ์ ํ ๊ฒ = ์ด์ ์ ์ฐ๋
web/static/img/estimate_supplier_block.{jpg,png}์tools/gen_supplier_block_png.pyยทgen_approval_box_png.py๋ ๊ทธ๋๋ก ๋๋ค(์ง์ ๋ฐ ยท ํํ ํ์ธ ํ ์ ๋ฆฌ). - โณํํ ๋ชซ = TEST ํด๋ 01๋ฒ ๊ฒฐ๊ณผ๋ฌผ ์ก์ โ ์ฌ์ง์(๊ณ ์น ๊ณณ ์ง๋ชฉ). ํจ์ ยท๊ท์น โ
rules.md ๐
๐ NOW (2026-08-05) โ ๋ฐฐ์ฐจ๋ชฉ๋ก ์ธ๋ผ์ธ ํตํฉ ๊ฒ์์ฐฝ ์ถ๊ฐ + ์๋จ ๊ธฐ์ฌ์นธ ์ญ์ ์ด์๋ฐฐํฌ ์๋ฃ
ํํ ์ง์ = "๋ฐฐ์ฐจ๋ชฉ๋ก์ ๋ชจ๋ ํญ๋ชฉ ํตํฉ ๊ฒ์์ฉ ์ธ๋ผ์ธ ๊ฒ์์ฐฝ ์ถ๊ฐ. ์ถ๋ฐ๋์ฐฉ ๊ฒ์์ฐฝ ์ข์ธก์ผ๋ก ์ฝ๊ฐ์ ์ฌ๋ฐฑ๋๊ณ . ์๋จ search filter์์ ๊ธฐ์ฌ ๊ฒ์์ฐฝ์ ์ญ์ . ์ด์๋ฐฐํฌ."
- ํ์ผ 1๊ฐ๋ฟ =
web/templates/basic/dispatch/dispatch_list.html(ํ ํ๋ฆฟ์ด๋ผ ์บ์๋ฒ์คํฐ ๋ถ์). master0d96fe9โ deploy-live668801e. - ํตํฉ ๊ฒ์์ ์๋ฒ๊ฐ ์๋๋ผ ํ ๋ฐ์ดํฐ์์ ํ๋ค โ
dcRows์ ๊ฐ ํ์ดSELECT a.*+ ์กฐ์ธ์ปฌ๋ผ์ด๋ผ ํ๋ฉด ํ์ ์๋ ๊ฐ(๊ธฐ์ฌ๋ช ยท๊ธฐ์ฌ์ฐ๋ฝ์ฒยท๋น๊ณ ยท๋น๊ณ 2ยท์ธ์์์ฐ๋ฝ์ฒยท๋ฌผํ)๊น์ง ์ด๋ฏธ ๋ค์ด ์๋ค.rowAllText(r)= ํ์ ๋ชจ๋ ์ค์นผ๋ผ ๊ฐ์ ํ ๋ฌธ์์ด๋ก join โ ๋ถ๋ถ์ผ์น. ์ APIยท์ ์ปฌ๋ผ 0. ์ด์ ์ค์ธก = ๊ธฐ์ฌ "๋ฐ๊ฒฝ" ์ ๋ ฅ ์ 56๊ฑด ์ค 1๊ฑด. - ๋ฐฐ์น = ์ธ๋ผ์ธ ๊ฒ์์ค(
.dc-results-head)์ ์ฒซ ์นธ, ์ถ๋ฐ ์ ๋ ฅ์นธ๊ณผ ์ฌ๋ฐฑ 22px(๋ํผgap:8px+margin-right:14px). ๊ธฐ์กด ์ถ๋ฐยท๋์ฐฉ๊ณผ AND. - ์๋จ SEARCH FILTER์
srchDriver์ญ์ = ์ ๋ ฅ์นธ +searchFilterargsdriver_name+resetFilter์ฐธ์กฐ 3๊ณณ ๋๋ฐ ์ ๊ฑฐ. DAO๋ ์๋์ง ์์๋ค โselect_dispatch_search_list๊ฐargs.get("driver_name","")์ด๋ผ ๋ฏธ์ ๋ฌ์ด๋ฉด ์กฐ๊ฑด์ด ์ ๋ถ๋๋ค(์ด์ ์๋ณต 1,673๊ฑด ์ ์). - ๊ณ๋ค๋ฆฌ ์์ 1์ค =
renderTable()๋์applyInlineFilter(). ์๋๋ ใ์กฐํใ๋ฅผ ๋๋ฅด๋ฉด ์ธ๋ผ์ธ ๊ฒ์์ด๊ฐ ๊ทธ๋๋ก ๋จ์ ์ฑ ํํฐ๋ง ์กฐ์ฉํ ํ๋ ธ๋ค(๊ธฐ์กด ์ถ๋ฐ/๋์ฐฉ๋ ๊ฐ์ ๊ฒฐํจ). ์ ์นธ๋ง ๊ณ ์น๋ฉด ์ ์ค ํ๋๋ง ๋ง๋ ๊ผด์ด๋ผ ๊ณตํต ์ง์ ์์ ์ก์๋ค. - ๊ฒ์ฆ =
scripts/_dispatch_inline_search_check.py(์ ์คยทscripts/.gitignore๋ก ์ปค๋ฐ ์ ์ธ) 18ํญ๋ชฉ ร ํ ์คํธยท์ด์ ALL PASS โ ์ขํ ์ค์ธก(ํตํฉ right < ์ถ๋ฐ left, ๊ฐ์ ์ค, ์ฌ๋ฐฑ 22px) ยท ์จ๊นํ๋ ๊ฒ์ ยท ์๋ ํค์๋ 0๊ฑด ยท ร ๋ณต์ ยท ํตํฉ AND ์ถ๋ฐ ยท ์ฌ์กฐํ ํ ์ ์ง ยทdriver_name๋ฏธ์ ๋ฌ API ยท ์ฝ์ 0. - ์ ๋ณ ๋ฐฐํฌ(merge ์๋) =
git checkout origin/master -- <ํ์ผ>ํ ์ปค๋ฐ. mergeํ๋ฉด AL ๋ฏธ๋ฐฐํฌ๊ฑด(al-orderpaperยทal-profile)๊น์ง ๋๋ ค์จ๋ค. ์ฌ์ ํ์ธ = ์ด ํ์ผ์ ๊ฑธ์น ๋ฏธ๋ฐ์ ์ปค๋ฐ์ด ๋ด ๊ฒ 1๊ฐ๋ฟ์์git log --cherry-pick --right-only๋ก ํ์ธ. - ์ฌ์ดํธ๋งต ์ฌ๋น๋ 2ํ = ๋ฐฐํฌ ์ ๋ฏธ๋ฐ์ 3(
/dispatch/list์ฃผํฉ) โ ๋ฐฐํฌ ํ 2(์ฃผํฉ ๊ฑทํ, ๋จ์ 2๊ฑด์ ๊ธฐ์กด AL). devplanpfs.htmlDONE ๋ฐฐ์ด ๊ฐฑ์ . - โณํํ ๋ชซ = ์ด์ ์ก์(
/dispatch/list).
๐ NOW (2026-07-30) โ ์ ์ ๊ด์ฃผ ์ฑํผ์ธ์ค์ํฐ MH ๊ฒฌ์ ์ ์ด์๋ฑ๋ก ์๋ฃ (๋ณธ๊ฑด 740 ยท ์ถ๊ฐ1 741)
ํํ ์ง์ = NAS ๊ฒฌ์ ์ xlsx๋ฅผ ์ด์์๋ฒ ๋ฑ๋ก, "๋ณธ๊ฑด ๊ฒฌ์ ์์ฑ ํ์ ์ถ๊ฐ๊ฑด:์ถ๊ฐ1 ํญ๋ชฉ์ผ๋ก", ํ์ฅ field_no 1973(=์ ์ ๊ด์ฃผ/๋ฅ์์ค/MH), ์ด์๋ฐฐํฌ ์น์ธ.
- ์
๋ ฅ์ด ๋์ด๋ฐ์ฃผ์ xlsm์ด ์๋๋ผ ๊ฒฌ์ ์ xlsx(๋จ๊ฐ=๊ณ ๊ฐ ํ์ ๊ฐ) โ ๊ธฐ์กด ์คํฌ๋ก ์ ๋์ด ํ๋
๋ถํฐ ์ฌ์ํ. ๋จ์ผ ์ํธ
์ถ๊ฐ1= p1 ์์ฝ(์ถ๊ฐ1 1,027,000 + ์ด์ 150,000 = 1,177,000) + p2 ์์ธ(์น์ ํค๋ 2 + ํ๋ชฉ 13์ค = 1,027,000). - ๐์ด ์์์ด PFS ์ถ๋ ฅ์์(
estimate_print_service)๊ณผ 1:1์์ ํ์ธํ๊ณ , ๋งคํ์ ์ถ์ธกํ์ง ์๊ณ ๋ ๋๋ฌ ์ ์ฃผ์์์ ์ญ์ฐํ๋ค. ์ค์ ๋ก ์์ฝํ์A=ํ์ฅ๋ช C=ํญ๋ชฉ๋ช์ด๋ผ A์ด์์ ํญ๋ชฉ๋ช ์ ์ฝ์ผ๋ฉด '์ด์'์ด ํ์ฅ๋ช ์ผ๋ก ์กํ๋ค(์ด์์์ ๋ฐ์ โ ์์ ). - ๋ฑ๋ก = โ ๋ณธ๊ฑด
740์ ์ ๊ด์ฃผ ์ฑํผ์ธ์ค์ํฐ MH ๊ฒฌ์ ์(๋น ์ปจํ ์ด๋ 0์ โ ์ด ํ์ผ์ ๋ณธ๊ฑด ๋ด์ฉ ์๊ณ NAS ์ ๋ ๊ฒ์์๋ ๋ณธ๊ฑด ๊ฒฌ์ ์ ํ์ผ ์์) โ โก์ถ๊ฐ๊ฑด741์ถ๊ฐ1(13์ค,type_name='์ถ๊ฐ1', parent 740) โ โข๊ธฐํ๋ถ๊ฐ๋น์ด์ 150,000 (์ ๊ท์์ฌ ์ด์). - ๊ฒฐ์ 3๊ฑด:
type_name=์์ p1 ์์ฝํ ์ด๋ฆ์ถ๊ฐ1(์ ๋ก 738๊ณผ ์ผ์น) ยท ์ด์=transportation_cost์๋estimate_extra_cost(๋ฌผ๋ฅ๋น ๋ผ๋ฒจ ๊ณ ์ ยท๋น๊ณ ๋ถ๊ฐ) ยท ๋ง์ง=master0+detailNULL(master๋ฅผ ์๋์ผ๋ก ๋๋ฉด ๋ฅ์์ค 15.5%๊ฐ ์นํ ๊ธ์ก์ด ๋ถํ๋ ค์ง๋ค). - ๋ฏธ์์ง = ์น์
ํค๋ 2ํ(
128ํ์ 50-010 ๋ชธํต์ฌยท84Dํ์ HS2661 ๋ชธํต์ฌ) โ PFS detail์ ๋์ ํ๋ ์๊ณ , ํ์ ๋ถ๋ฆฌํ๋ฉด p1 ์์ฝ์ด 1โ2์ค๋ก ๋ฐ๋์ด ์ด๋ฏธ ๋ฐ์ก๋ ๋ฌธ์์ ๋ฌ๋ผ์ง๋ค. - ๊ฒ์ฆ 4๋จ ALL PASS = ๊ธ์ก 3์ค ๊ต์ฐจ๊ฒ์ฆ โ VERIFY ์ฌ์ ์กฐํ(ํ์ฅยท์ค๋ณต 0) โ ๋ฑ๋ก ์๋ณต ๋์กฐ ๋ถ์ผ์น 0 โ ์ถ๋ ฅ ์์ ์ค์ ๋ค์ด๋ก๋(353,851B, ์ํธ ์ข ํฉ/๋ณธ๊ฑด/์ถ๊ฐ1) vs NAS ์๋ณธ ์ ๋์กฐ ๋ถ์ผ์น 0.
- ๊ธฐ์กด ๋์(๋ด ๋ฑ๋ก ํ ์๋, ์ ๋ก 738 ๋์ผ ์ค์ธก): ์ถ๊ฐ๊ฑด ์ํธ ์์ฝํ A์ด ํ์ฅ๋ช
๊ณต๋ฐฑ(
select_sub_estimates๊ฐ field_name ๋ฏธ๋ฐํ) ยท ๋ด๋น์๋ ์ ์ฒดrefer_man(๊ณ ์ฌํ ์ด์ฌ)๋ก ํ๊ธฐ. - pfs ๋ฆฌํฌ ์ฝ๋ ๋ณ๊ฒฝ ์์(๋ฐ์ดํฐ ๋ฑ๋ก๋ง) โ ์ปค๋ฐยท๋ฐฐํฌ ์์. ์คํฌ๋ฆฝํธ =
C:\dev\order-automation\build_and_register_shinyoung_add1.py. - โณํํ ๋ชซ = ์ด์ ์ก์ + ๋ณธ๊ฑด 740์ ๋ณธ๊ฑด ๋ด์ฉ ์ฑ์ธ์ง ๊ฒฐ์ (ํ์ฌ 0์). ์์ธ โ
session-2026-07-30-shinyoung-add1-estimate.mdยท ์ ์ฐจ =playbook.md ยง7ยท ๊ท์น =rules.md ๐
๐ NOW (2026-07-29) โ ๋ฏธ๋ฐ์ AยทB ๊ทธ๋ฃน ์ด์๋ฐฐํฌ ์๋ฃ
ํํ: "๋ฏธ๋ฐฐํฌ๊ฑด์ด ์๋ค. A,B ๊ทธ๋ฃน ๋จผ์ ์ด์๋ฐฐํฌํ๋ค." (D005 ๋ฐฐ์ฐจ์ฌ์ง ๊ฒฝ๋ก ๋ฒ๊ทธ๋ "๋ฐฐํฌ๋ง, ๋ฒ๊ทธ๋ P0์์")
- A ํ๋ฌผ์ฑ ๋ฐฐ์ฐจ 3๊ฑด โ deploy-live
83540c8(master f39bdd8ยท1fa41beยท3fa0175). DB๋ensure_freight_cols๋ฐํ์ ๋ฉฑ๋ฑ ALTER๋ผ ๋ง์ด๊ทธ ๋ถ์. - B ์๋ง๊ฐ 5๊ฑด โ deploy-live
70ba185(master dae788eยท26c49cdยทc684883ยทce9b34eยท34ab1c3). ์ด์ RDS ์ ํ ์๋ฃ =monthly_closeยทmonthly_close_item์์ฑ +menu_catalogmenu_no=46(์ ์ฉ ์ ์ค๋ ์ทtables:[]/menu:Noneํ์ธ). ๊ถํ ์ถ๊ฐ์์ ๋ถ์ โhas_menu_permission์ ์์ฌ์ ๋ช ์ row ์์ผ๋ฉด ๊ธฐ๋ณธ ํ์ฉ. - ๋ฐฐํฌ ๊ฒฝ๊ณ๋ ์ปค๋ฐ ์๊ฐ ์๋๋ผ ํ์ผ diff๋ก ํ์ (07-27 ํ์ผ๋จ์ ํฌ์๋ ํ patch-id ๋น๊ต๋ 28๊ฑด์ผ๋ก ๋ถํ๋ ค์ง) โ 37ํ์ผ์ A 8ยทB 14ยทAL 15(๋ฒ์ ๋ฐ)๋ก ๋ถ๋ฆฌ.
โ ๊ณต์ ํ์ผ ์ฌ์ ํ์ธ์ด ํต์ฌ:
api/config.py๋ฏธ๋ฐ์๋ถ์ ์๋ง๊ฐ 2์ค๋ฟ,mysql_util.py๋ A์ execute_id๋ฟ โ ํต์งธ ํฌ์๋ํด๋ AL ๋ฏธ์ ์ . (์๋์ "config.py ํต์งธ ํฌ์๋ ๊ธ์ง" ๊ฒฝ๊ณ ๋ monthly_close๊ฐ ๋ฏธ๋ฐฐํฌ์ด๋ ์์ ์กฐ๊ฑด โ ์ด๋ฒ์ ๋ค์งํ๋ค. ๋งค๋ฒ diff๋ฅผ ๋ณธ๋ค.) - ๊ฒ์ฆ = ์ด์ HEAD
70ba185ยท ์๋น์ค active ยท/login200 ยท/estimate/monthly-close200 ยท/api/monthly-close200 ยท/api/dispatch405(GET ๋ฏธ์ง์=๋ฑ๋ก๋จ) ยท ์์ฌ diff๋ AL 15ํ์ผ๋ฟ. - ์ ํ ๊ฒ = ๋ง๊ฐ ๋ฐ์ดํฐ ์๋ฉ(์ด์ ๊ฒฌ์ ๊ธฐ์ค ์ฌํ๋จ ํ์, ๋ณ๊ฑด) ยท D005 ๋ฐฐ์ฐจ์ฌ์ง ๊ฒฝ๋ก(code-qa
field-dispatchํํธ). - ๐ํ์ QA(๊ฐ์ ๋ ): ํํ ์ง์๋ก ํ๋ฌผ์ฑ ์ ์ ๋ฒํผ ๊ธฐ๋ฅ ๋น์๋ โ
requestFreight()์ ๊ฒ์ดํธ 3์ค(FREIGHT_ENABLED=falseโdcToast('์ค๋น์ค์ ๋๋ค')), ๊ธฐ์กด ๋ก์ง ๋ณด์กด(์ฌ๊ฐ ์ ๊ฐ๋งtrue). master4433226(+๊ฒ์ฆ3288f1e) โ deploy-liveaf4b72d. ๊ฒ์ฆ=์ ์คscripts/_dispatch_freight_ui_check.py์ค์ ํด๋ฆญ, ํ ์คํธ 9/์ด์ 9 ALL PASS(๋ฌธ๊ตฌยทconfirm 0ยทfreight API 0ยท์ฝ์ 0). - โณํํ ๋ชซ = ์ด์ ์ก์(์๋ง๊ฐ ํ์ด์งยทํ๋ฌผ ๋ฐฐ์ฐจ ๋ชฉ๋ก). ์์ธ โ
session-2026-07-29-deploy-ab-freight-monthlyclose.md
๐ NOW (2026-07-29) โ AL๋ฐ์ฃผ์ QA 8๊ฑด (ํ ์คํธ ๋ฐฐํฌ ยท ์ด์ ๋ฏธ๋ฐฐํฌ)
- ํํ QA ๋ฆฌํฌํธ 8๊ฑด(
/field/al-orderpaper). #2๋ง ํด์์ด ๊ฐ๋ ค ์ฐฉ์ ์ 1๋ฌธํญ ๊ทธ๋ฆด๋ง โ ํํ ์ ํ = "ํค๋์ ์ ์ฒด ์ฌ๋ฌ ์ค + ๊ทธ๋ฆฌ๋ ์ปฌ๋ผ์์ ์ ํ". - #1 ์ธ์: "AL์
์ฒด ์ ๋ชฉ ๋ฐ๋ก ์๋ ํ๋ ์ ๊ตต์ ์ ๋ง" = ๋ฐ์ดํฐ๊ฐ ์๋๋ผ ์ธ์ ๋ ์ด์์ ๋ฌธ์ .
@media print์body *{visibility:hidden}ํ ๊ธ์ด ๋ชจ๋ฌ(transform:translateX(-50%)+max-height:92vh+overflow:auto) ์ ๋ด์ฉ์ ์๋๋ค. โ CSS๋ฅผ ๋ ๋ง์ง์ง ์๊ณ ์ธ์ ๋์๋ง ๋ด์ iframe ๋ฌธ์(printSheets())๋ก ๋ถ๋ฆฌ. ๋ถ์ = ์์ ํค๋ colspan ํฉ์ด ๋ณธ๋ฌธ๋ณด๋ค 1 ์ปค์ ์ฐ์ธก์ ๋น ์ปฌ๋ผ์ด ๋จ๋ ๊ฒ(n-3โn-4). - #2 ์
์ฒด ๋ค์ค๋ฑ๋ก: ํค๋
+AL์ ์ฒด/+์ ๋ฆฌ์ ์ฒด๋ก ์ ์ฒดํ ์ถ๊ฐ, ๊ทธ๋ฆฌ๋์AL์ ์ฒดยท์ ๋ฆฌ์ ์ฒดselect(๋น์นธ = ์ฒซ ์ ์ฒด๋ก ์ผ๊ด). ๋ฏธ๋ฆฌ๋ณด๊ธฐยท์์ ์ ์ ์ฒด๋ง๋ค ๋ฐ์ฃผ์ 1์ฅ(์ ์ฒด ๋ฌถ์์ด ๋ธ๋ก์ ํต์งธ๋ก ์ฐจ์ง โ ํ ๋ธ๋ก์ ๋ ์ ์ฒด๊ฐ ์์ด๋ฉด ์์ ์ฒ๊ฐ ํ๋ฆฐ ๋ฐ์ฃผ์๊ฐ ๋์จ๋ค). ์์ ๋ธ๋ก(AL 9ยท์ ๋ฆฌ 5)๋ณด๋ค ํ์ ์ฅ์๊ฐ ๋ง์ผ๋ฉด ์กฐ์ฉํ ๋๋ฝ ๊ธ์ง โ 400 + ์ฌ์ . - ์ ์ฅ =
al_orderpaper.vendors(JSON) +al_orderpaper_item.al_vendor/glass_vendor(patch44, DAOensure_tables()๊ฐ ๋ฉฑ๋ฑ ALTER โ ์๋ ๋ง์ด๊ทธ ๋ถํ์). ์ฒซ ์ ์ฒด๋ ๊ธฐ์กด ๋จ์ผ์ปฌ๋ผ(al_vendor/glass_vendor)์ ๊ทธ๋๋ก ์ ์ง โ ๋ชฉ๋กยท๊ฒ์ยท๊ตฌ ํ์ด๋ก๋ ๋ฌด์์(E2E๋ก ํ์ธ). - #3 ์์ ์ง์นจ: ๋ธ๋ ์ดํฌ๋ค์ด
#94a3b8โ#333(๋ธ๋ 80%). ํํ ์ง์๋ก "ํฐํธ ์์ ๋ธ๋ 70% ์ด์"์ pfs ๊ธฐ๋ณธ ์ง์นจ์ ๋ฑ๋ก โ ์ ์คprojects/pfs/rules.md. - #4 ๊ณ์ฐ์
(AL์น์ยท๋ชฉ๋ยท์ ๋ฆฌ)
font-weight:700โ400, ์์#0f172a์ ์ง. #8 ๊ทธ๋ฆฌ๋width:max-content; min-width:100%โ ์ง์ ํญ์ด ํํ์ด ๋์ด ๋๋ ค์ ์๋ฆฌ๋ ์ปฌ๋ผ์ด ๋์ด๋๋ค(์ ๋ ฅ์นธ์width:100%๋ผ ์ค์ค๋ก ๋ชป ๋์ด๋จ). ํ๋ช 150โ175px, ๋ชฉ๋ยท์ ๋ฆฌ 100โ124px. - #5 ์์
: ๋น ๋ธ๋ก์
print_area๋ฐ์ผ๋ก ๋ฏธ๋ฃจ๋ ๊ฒ โ ํ์ ์ค์ ์ญ์ (_trim_blocks, ๋ณํฉ ํด์ ํdelete_rows; AL 180ํโ20ํ). ๋ถ์ =_fill_label_row_addr์ ์กฐ๊ธฐreturnํ์ ์ ๊ณ ์ฒ๊ฐ ์ฒซ ๋ธ๋ก์๋ง ์ฑ์์ง๋ ๊ฒ(2์ฅ๋ถํฐ ๊ณต๋) โ ์ ๋ธ๋ก. - #6
<datalist>ํ๊ธฐ โ ์์ฒด ์ธ๋ผ์ธ ๋๋กญ๋ฆฌ์คํธattachCombo()(๋ถ๋ถ์ผ์น ๋ชฉ๋ก, Enter = ๊ฐ์กฐํ ์๋์ ๋ ฅ, ๋ถ๊ฐ์ ๋ณด ํ์). #7 ์ ์ฒดํ์ CSS grid(display:contents)๋ก ๋ฐ๊ฟ 5์ปฌ๋ผ ์ผ์ชฝ ๋ผ์ธ ํฝ์ ์ผ์น + ๋ด๋น์ยท์ ํยทํฉ์ค ํญ ์คํ (์ ํ031-355-9705(๋ด์ 206)์๋ฆผ์ ์คํฌ๋ฆฐ์ท์์ ๋ฐ๊ฒฌํด ๋ด๋น์ ์ธ 2์นธ๊น์ง ํ๋). - ์ปค๋ฐ
master b69d325(๋ณธ ๊ตฌํ)โf6bcfb2(#7 ๋ณด์)โ6f9732c(#1 colspan). ํ ์คํธ 8001 ์๋๋ฐฐํฌ ํ์ธ. - ๊ฒ์ฆ = ์์
์์ฑ๊ธฐ ์์ฒด๊ฒ์ฌ(๋น๋ธ๋กยท์
์ฒด๋ถ๋ฆฌ assert) + ํ
์คํธ E2E 18ํญ๋ชฉ PASS + UI Playwright 27ํญ๋ชฉ PASS(์ฝ์์ค๋ฅ 0). ์์ธ=
session-2026-07-29-al-orderpaper-qa8.md. - โณ์ด์ ๋ฐฐํฌ ์ ํจ โ ์ง์๋ฌธ์ "์ด์ ๋ฐฐํฌ" ๋ฌธ๊ตฌ๊ฐ ์๋ค(
deploy-live์ ๋ ๊ท์น = ํํ๊ฐ ์ฑํ ์ ์ง์ ์ ๋ ฅํด์ผ ํจ). ํํ ์ง์ ๋๊ธฐ. - โณํํ ์ก์ = ์ค์ Ctrl+P ์ธ์ ๊ฒฐ๊ณผ + ๋ค์ด๋ก๋ ์์
(ํค๋๋ฆฌ์ค๋
window.print()๋ฌด๋์์ด๋ผ iframe ๋ด์ฉ๊น์ง๋ง ๊ฒ์ฆ). โ ์ปฌ๋ผ 2๊ฐ ์ฆ๊ฐ๋ก ๊ทธ๋ฆฌ๋ ์ดํญ โ1600px > ๋ํผ 1210px โ ๊ฐ๋ก ์คํฌ๋กค ๋ฐ์(#8 ์ง์๋๋ก๋ฉด ์ ์, ๊ฑฐ์ฌ๋ฆฌ๋ฉด.al-wrap์ต๋ํญ ํ๋๊ฐ ๋์).
๐ NOW (2026-07-29) โ AL์ค์ (์์ ์ค์ ํญ) ๊ด๋ฆฌ ํ์ด์ง CRUD (์ด์ ๋ฐฐํฌ ์๋ฃ)
- ํํ ์ง์: NAS
์๋ถ์์ฌ๋ฐ์ฃผ์.xlsxใ์ค์ ใ ํญ(AL ํ๋กํ์ผ๋ณ ๊ณต์ ์์ 49ํ)์ ๊ด๋ฆฌ ํ์ด์ง๋ก ๋ง๋ค๊ณ CRUD / AL๋ฐ์ฃผ์ ํ์ด์ง์ ์ ์ ๋ฒํผ / ์ ๋ฐ์ฃผ์ ์์ ์ค์๋ ์ถ๊ฐยท์์ ๊ฐ๋ฅ / ์ด์๋ฐฐํฌ. + ์ถ๊ฐ์ง์ ์ ์ฒด์ ๋ณด ๋ ์ปดํฉํธํ(๋ฐ์ฃผ๋ด์ฉ ํ ์ด๋ธ ๊ณต๊ฐ ์ฐ์ ). - โ ์ง์๋ฌธ์ ์ฒซ ๊ฒฝ๋ก
๋ถ์์ฌ ๋ฐ์ฃผ์ ์ผ์ง.xlsm์ ์ํธ๊ฐ์ฃผ๋ฌธ์กฐํ/RawData๋ฟ โ ํํ๊ฐ์๋ถ์์ฌ๋ฐ์ฃผ์.xlsx๋ก ์ ์ . ์ด ํ์ผ์ด ๊ธฐ์กดal_calc.py์ ์ ์ถ์ฒ. - ์ ์ฅ์๋ฅผ JSON ์์ฐ โ RDS ํ
์ด๋ธ
al_profile(patch43)๋ก ์ด์ . ๊ธฐ์กดassets/seoljeong_constants.json์ ์ด๊ธฐ ์๋ฉยทใ์์ ์๋ณธ ๋ณต๊ตฌใ ๋ฒํผ์ ๊ธฐ์ค๊ฐ์ผ๋ก๋ง ๋จ๊ธด๋ค(ํ์ผ ํธ์ง ๋ฐฉ์์ ๋ฐฐํฌ๋ง๋ค ์ฌ์ฉ์ ํธ์ง์ด ๋ ์๊ฐ์ ํ๋ฝ). DAOensure_tables()๊ฐ ๋น์ด ์์ ๋ 1ํ๋ง ์๋ฉ โ ํ ์คํธยท์ด์ ๋ชจ๋ ๋ง์ด๊ทธ๋ ์ด์ ์๋์คํ ๋ถํ์. - ํ ์์(
sort_no) = ์์ VLOOKUP ์ฒซ๋งค์น ์์. ์ค๋ณต ํ๋ช 2๊ฑด(AA*494(์์์)+3๋ฉดAA-496ยทAA*495(ํฐ์)+3๋ฉดAA-496) ์ค์ฌ โ ์ ํ์ด ์ด๊ธฐ๊ณ ์๋๋ ๆญปํ. ํ๋ฉด NO์นธ์ ๋ ธ๋๊ฒ ์น ํด ๆญปํ์ ๋ณด์ด๊ฒ ํจ. - ์ ๊ท
/field/al-profile(์ฌ์ด๋๋ฐ ๋ฏธ๋ฑ๋ก โ ์ ๊ทผ์ AL๋ฐ์ฃผ์ ๋ฒํผ 2๊ณณ๋ฟ, ์ง์ ๊ทธ๋๋ก). ์ ์ฅ์ ํ๋ฉด ์ ์ฒด 1์ฝPOST /api/al-orderpaper/profilesโ ์๋ฒ๊ฐ soft delete โ upsert ์. - ์์
์ค ์์ ๋์ = ์ ์ฐฝ(์์ฑ ์ค ๋ฐ์ฃผ์ ์ ์ค ๋ฐฉ์ง) + ์ฐฝ ๋ณต๊ท(
window focus) ์ ์ค์ ์ฌ์กฐํ + ์ ํ ์ฌ๊ณ์ฐ.al_calc์ ๋ชจ๋ ์ ์ญ ์บ์๋ ํธ์ง ๊ฐ๋ฅํด์ง๋ฉด uwsgi ์์ปค๋ณ๋ก ๊ฐ๋ผ์ง๋ฏ๋ก ์์ฒญ๋น 1ํprofile_map()์กฐํ๋ก ๊ต์ฒด(49ํ์ด๋ผ ๋น์ฉ ๋ฌด์). - ํค๋ ์ปดํฉํธํ: ๋ผ๋ฒจ ์ธ๋ก์๊ธฐ ํ์ง โ ์ ์ฒด 1๊ณณ๋น 1์ค(placeholder ์ธ๋ผ์ธ) + ํค๋ ์ ๊ธฐ ํ ๊ธ(์์ฝ์ค ์ ์ง, localStorage). ํผ ๋์ด 106px, ๊ทธ๋ฆฌ๋ ์์ y 262โ์ ์ผ๋ฉด 195px.
- ๐ด์ก์ ๋ฒ๊ทธ:
save_bulk๊ฐ INSERT ๋ค์ soft delete๋ฅผ ๋๋ ค ๋ฐฉ๊ธ ๋ฃ์ ์ ๊ทํ์ด ๊ฐ์ ํธ๋์ญ์ ์์ ์ฆ์ ์ญ์ ๋๋ค(์๋ต์saved:50์ธ๋ฐ ์กฐํ 49ํ = ์กฐ์ฉํ ์คํจ). โ soft delete๋ฅผ INSERT๋ณด๋ค ๋จผ์ + UPDATE์remove_yn='0'๋์ ์ธํ . ํ ์คํธ E2E๊ฐ ์ก์. - ์ปค๋ฐ
master f99e739โ๋ฒ๊ทธ์์ d38661eโ์คํฌ๋ฆฝํธ6f228b9, ์ด์deploy-live a0faf03(ํ์ผ 10๊ฐ ํฌ์๋,api/config.py๋ฌด๊ด). - ๊ฒ์ฆ = ์์
โ์๋ฉ ์ ํฉ ์ค์ ๋ถ์ผ์น 0(๊ณต๋ 50์นธ์ด
0์ ๊ทํ๋ฟ) + ํ ์คํธ CRUD E2E 16ํญ๋ชฉ PASS + UI Playwright ํ ์คํธ 18 / ์ด์ 18 PASS(์ฝ์์ค๋ฅ 0) + ์ด์ SSM ์ค์ธก(HEADa0faf03ยทuwsgi activeยท4๊ฒฝ๋ก 200ยทal_profile49ํ ์๋ฉ). ์์ธ=session-2026-07-29-al-profile-crud.md. - โณํํ ์ก์ = ์ค์ ๊ฐ ์ค์ ํธ์ง โ ๋ฐ์ฃผ์ ๊ณ์ฐ ๋ฐ์. โปํฉ์ค๋ฐ์ก ๋ฒํผ์ ์ฌ์ ํ ์คํ (๋ฒ์ ๋ฐ).
NOW (2026-07-28) โ ํ์ฅ ๋ด์ฉ = ์นดํก๊ด๋ฆฌ(1ํญ) + ํตํ๊ด๋ฆฌ(2ํญ) (์ด์ ๋ฐฐํฌ ์๋ฃ)
- ํํ ์ง์: "์นดํก๊ด๋ฆฌ๋ฅผ field/worklog ๋ฉ์ธํ์ด์ง๋ก, ๊ธฐ์กด ํ์ด์ง๋ฅผ ํญ์ผ๋ก ๋๋ ์ฒซ๋ฒ์งธ ํญ. worklog๋ ํตํ๊ด๋ฆฌ ํญ 2๋ฒ์งธ, ํตํ ์์ง๋ถ๋ง. ์ด๋ฒ์ฃผ ์์์ผ๋ถํฐ ๊ธฐ๋ก๋ง ํ์ฅ๋ณ ๊ทธ๋ฃนํ, ์์์ผ ์ด์ ์ ์จ๊น์ด๋ ฅ. ์ผ๊ฐ์ ์๋ธ์์ด์ ํธ๋ก ํ์ฅ๋งคํ ๋ฐ๋ณต. ์ด์๋ฐฐํฌ".
- 1ํญ ์นดํก๊ด๋ฆฌ = ์ ๊ท
api/pfs/kakao_boardโkakao_board(๋ฏธ๋ฌ) +kakao_board_op(์น ํธ์ง ๋ช ๋ น ํ). ์๋ณธ board.md๋ ์ฌ๋ฌด์ค PC์ ์๊ณ EC2๋ ๊ฑฐ๊ธฐ๋ก ๋ชป ๋ค์ด๊ฐ๋ฏ๋ก ๋ฐฉํฅ์ ๋ค์ง์๋ค: ๋ฐ๋ชฌ์ด ๋ฏธ๋ฌ๋ฅผ pushํ๊ณ ์น ๋ช ๋ น์ pullยท์ ์ฉยทํ์ . ํฐ ์กฐ์ ์ฃผ์ฒด๋ ์ฌ์ ํ ๋ฐ๋ชฌ ํ๋. ํ๋ฉด์ ๋ฐฉ๋ณ ์นด๋ โ ์น์ ยทํ + ์ ํ ์จ๊น์ด๋ ฅ, ๋ฐ์ ๋๊ธฐ n๊ฑดยท์คํจ ์ฌ์ ๋ฐฐ๋(์กฐ์ฉํ ๋ฏธ๋ฐ์ ๊ธ์ง). - 2ํญ ํตํ๊ด๋ฆฌ =
worklog_dao._source_clause()(source='call')๋ฅผ ์กฐํยท์ง๊ณยท๋ฌถ์๋ณ๊ฒฝ ์ ๊ฒฝ๋ก์ ์ ์ฉ. ์นดํก ๊ณผ๊ฑฐ ์ ์ฌ๋ถ์ ํ๋ฉด์ ์ ๋์ค๊ณ ์ผ๊ด๋ณ๊ฒฝ๋ ์ ๊ฑด๋๋ฆฐ๋ค. - ๋
ธ์ถ์ฐฝ = ์ต๊ทผ 2์ฃผ โ ์ด๋ฒ์ฃผ ์์์ผ๋ถํฐ(
week_start()).scope=hidden์ด ์์์ผ ์ด์ ์ ๋ถ(1๋ ). ๋ฐฐํ ์ํ์ด ๊ธฐ๋ณธ์ฐฝ ์์๊ณผ ์ ํํ ๋ง๋ฌผ๋ ค ๊ฒฝ๊ณ ํญ๋ชฉ ๋๋ฝยท์ค๋ณต์ด ์๋ค. ์ํ ์์์ 07-27๊ณผ ๊ฐ์ ์ด์ (๋ฏธ๋ '์์ ' ํญ๋ชฉ ๋ณดํธ). - ์ผ๊ฐ ํ์ดํ๋ผ์ธ(talklog
night_worklog.py, ์์ฝ 02:00) = ์ ์ฌยท๋ถ๋ฅยท์ ์ฌ โ ๊ท์น auto-link โ ๋จ์ ๋ฏธ์ฐ๊ฒฐ๋ง claude ์๋ธ์์ด์ ํธ๊ฐ pfs ํ์ฅ๊ณผ ๋งค์นญ(confidenceโฅ0.8, ์ ๋ ฅ์ ์๋ ํ์ฅ๋ช ยท๋ฒํธ๋ ํ๊ธฐ) โ ์ ์ ์ฌ๋ฌธ์ furniture-expertpractice/ops_*_calls.md์ ์ ๋ฆฝ. - โ
api/config.py๋ ๋ธ๋์น ๊ฐ ํ์ผ ํต์งธ ํฌ์๋ ๊ธ์ง โ master์ ๋ฏธ๋ฐฐํฌmonthly_close๊ฐ ์์ด ๊ทธ๋๋ก ๊ฐ์ ธ์ค๋ฉด ์ด์์ด ์ํฌํธ์์ ์ฃฝ๋๋ค. ์ด ํ์ผ๋ง deploy-live์์ 2๋ธ๋ก ์ง์ ์ถ๊ฐ. - โ ๋ฐฐํฌ ์ค ํ๊ท 1๊ฑด ์ก์: ์จ๊น์ด๋ ฅ 682์ฅ์์
์ ์ฒด ํผ์นจ์ด XHR์ ํ๊บผ๋ฒ์ ์ด 502 โloadItems์ ํ(๋์ 6). ์ฐฝ์ ๋ํ๋ ๊ธฐ๋ฅ์ ํผ์นจ ๋์์ฑ์ ๊ฐ์ด ๋ด์ผ ํ๋ค. - ์ปค๋ฐ
master 028fd6aโdeploy-live 9e3a049, 502์์ master dd76774โdeploy-live a9036c3. + poin-agent39726f9, talklog1440777. - ๊ฒ์ฆ = ์์ฒด๊ฒ์ฌ 18 + ๋ก์ปฌ 7 + pfs-test E2E 8 + ์ด์ UI(Playwright: ์นดํก 4๋ฐฉ 85ํญ๋ชฉยท์ด๋ฒ์ฃผ
2026-07-27~ยท์จ๊น์ด๋ ฅ 682ํ์ฅยท์นดํก๋ฐฐ์ง 0/ํตํ๋ฐฐ์ง 1211ยท์ฝ์์ค๋ฅ 0) + ์ด์ ๋ฌดํด ์๋ณต 1๊ฑด(๊ฐ์ ๋ณธ๋ฌธ ๋์ฐ๊ธฐ โ 40์ด ๋ด ์๋ฃ, board.md ํด์ ๋ถ๋ณ). ์์ธ=session-2026-07-28-worklog-tabs-kakao-board.md. - โณํํ ๋ชซ = ๊ฐ์ ๋ฐ๋ชฌ ์ฌ์์(์์น๊ถํ์ด๋ผ ์ฝ๋ ๋ถ๊ฐ โ ์ง๊ธ์ 1๋ถ ์์ฝ์์
PFS-KakaoBoard-Sync๊ฐ ๋์ ํด ๊ธฐ๋ฅ์ ์ ์) / devplankakao-ops.html์ ์ง ์ฌ๋ถ ๊ฒฐ์ .
NOW (2026-07-28) โ ์์ฐ ๋ฉ๋ชจ ๋ชจ๋ฌ ํตํฉ: ๋จ์ผ ์ ๋ ฅ์ฐฝ (์ด์ ๋ฐฐํฌ ์๋ฃ)
- ํํ QA ๋ฆฌํฌํธ(
/field/list): "๊ธฐ์กด๋ฉ๋ชจยท์ ๊ท๋ฉ๋ชจ ์ฐฝ ํตํฉ, ํ ์ ๋ ฅ์ฐฝ์์ ๋ด์ฉ ์ ๋ถ ๊ด๋ฆฌ, ์ด์๋ฐฐํฌ". field_list.html1ํ์ผ๋ง ์์ โ textarea 2๊ฐ(field-memo-currentreadonly +field-memo-new) โfield-memo-content1๊ฐ. ๋ชจ๋ฌ ์ด๋ฉด ์ ์ฅ๋ณธ์ด ๊ทธ๋๋ก ํธ์ง์ฐฝ์ ๋ค์ด์ค๊ณ , ์ ์ฅํ๋ฉด ๊ทธ ๊ฐ์ด ์ ์ ์ฅ๋ณธ. ๋ผ๋ฒจ =๋ฉ๋ชจ ๋ด์ฉ+(์ต์ข ์ ์ฅ <์ผ์>).- ๋น๊ฐ = ์ฐจ๋จ โ confirm์ผ๋ก ๋ณ๊ฒฝ. ํตํฉ์ฐฝ์์ "๋น์ฐ๊ณ ์ ์ฅ" = ๋ฉ๋ชจ ์ญ์ ์๋๋ผ ์์
alert('์ ๊ท ๋ฉ๋ชจ๋ฅผ ์ ๋ ฅํ์ธ์')์ฐจ๋จ์ด ๊ธฐ๋ฅ์ ๋ง๋๋ค. - ์๋ฒ ๋ฌด๋ณ๊ฒฝ โ
GET/POST /api/field/memoยทDAO์previous๋ฐ์ด๋ด๊ธฐ ๊ทธ๋๋ก. - โ ์ง์๋ฌธ์ "์๋์ ์ฅ"์ ๊ธฐ์กด ์ ์ฅ ๋์ ์ ์ง๋ก ํด์ํ๋ค(ํ ๋ชจ๋ฌ์ autosave ์์). ๊ทผ๊ฑฐ = pfs๋ ๊ฒฌ์ autosave๋ฅผ Patch #21๋ก ์ ๋ฉด ํ์งํ๊ณ ์ฌ๋์ ์ ์ํ์์ ์ผ๋ก ๊ท์ . ์ง์ง ์ ๋ ฅ ์ฆ์ ์ ์ฅ์ ์ํ๋ฉด ๋ณ๋ ์ง์ ํ์. โณํํ ํ์ธ.
- ๋ถ์์ฉ 1๊ฑด(๋ฏธ๊ตฌํ) = ์ ์ฅ ์ ํ๊ณ ๋ซ์ผ๋ฉด ํธ์ง๋ถ ์์ค(์์ ์ ์ ์ฅ๋ณธ์ด readonly๋ก ๋จ์ ์ฒด๊ฐ ์ ๋จ). ์ง์ ๋ฒ์ ๋ฐ์ด๋ผ ๊ฒฝ๊ณ ์ ๋ฃ์.
- 2์ฐจ ์ง์(๊ฐ์ ๋ ): ์ ์ฅ ์๋ด alert ํ๊ธฐ + ์ ์ฅ ์ฑ๊ณต ์ ๋ชจ๋ฌ ์๋ ๋ซํ. ๋ซ๊ธฐ ์ ์ ๋ ฅ์ฐฝ/๋ผ๋ฒจ ๊ฐฑ์ ์ฝ๋๋ ๋ถํ์ํด ํจ๊ป ์ ๊ฑฐ(๋ค์์ ์ด ๋ GET์ผ๋ก ์ฌ์ฃผ์ ). ์คํจ ์์ ๊ธฐ์กด๋๋ก ๋ชจ๋ฌ ์ ์ง.
- ์ปค๋ฐ
master 6e647feโdeploy-live 7c76774(ํตํฉ),master 70475a0โdeploy-live 8bb6fd9(alert ํ๊ธฐยท์๋๋ซํ). ๋ ๋ค ํ์ผ 1๊ฐ ํฌ์๋ ๋ฐ์. ์ฌ์ ํ์ธ =git diff --stat origin/deploy-live origin/master -- <file>๊ฐ ๊ทธ ์ปค๋ฐ ๋ณ๊ฒฝ๋ถ๊ณผ ์ ํํ ์ผ์นํด์ผ AยทB ๋ฏธ๋ฐ์๋ถ์ด ์ ๋ธ๋ ค์จ๋ค. - ๊ฒ์ฆ = ์์ฒด ์คํฌ๋ฆฝํธ ํ
์คํธ 13ํญ๋ชฉ PASS(๋จ์ผ textareaยท๊ตฌ id ์๋ฉธยท์ ์ฅ๋ณธ ์ฃผ์
ยท๋ผ์ด๋ํธ๋ฆฝยทprevious ๋ณด์กดยท์ ์ฅ ํ ๋ชจ๋ฌ ๋ซํยทalert ์์ยท์ฌ์คํ ์ ์ฅ๋ณธยท์๋ณต) + ์ด์ 9ํญ๋ชฉ PASS(์ฝ๊ธฐ์ ์ฉ โ ์ด์ ๋ฉ๋ชจ ๋ฏธ๋ณ๊ฒฝ, ๋ฐฐํฌ ํ
ํ๋ฆฟ ์์ค๋ก alert ์ ๊ฑฐยท
modal('hide')ํ์ธ) + ์คํฌ๋ฆฐ์ท ์ก์. ์์ธ=session-2026-07-28-field-memo-modal-merge.md.
NOW (2026-07-27) โ field/worklog ๋ ธ์ถ๊ธฐ๊ฐ 2์ฃผ ์ ํ (์ด์ ๋ฐฐํฌ ์๋ฃ)
- ํํ ์ง์: worklog ๋ด์ฉ ๋์ ์ผ๋ก ํ์ด์ง ๋ก๋ ๋ฒ๋ฒ ์ โ ์ต๊ทผ 2์ฃผ๋ง ํ์, ๋๋จธ์ง ์จ๊น. ๊ณผ๊ฑฐ๋ ์ผ์(์์์ผ) ํํฐ๋ก ๋ณ๋ 2์ฃผ์ฐฝ ์กฐํ, ๊ฒ์๋ 2์ฃผ ์ฐฝ ์์ผ๋ก ์ ํ.
- ๋
ธ์ถ์ฐฝ ๋จ์ผ ์ถ์ฒ =
worklog_service.worklog_window(date_from)โ(from, to)(to ๋ฐฐํ). ๋ฏธ์ง์ =(์ค๋-13, None), ์ง์ =(๊ทธ๋ , +14์ผ), 1๋ ํํ ํด๋จํ. - โ ๊ธฐ๋ณธ์ฐฝ์ ์ํ์ ๋์ง ์๋๋ค โ
work_date์ ๋ฏธ๋ '์์ ' ํญ๋ชฉ ์กด์ฌ(์ค์ธก 10๊ฑด, ์ ๋ถ ์งํ์ค/๋๊ธฐ).[์ค๋-13, ์ค๋]๋ก ์๋์ผ๋ฉด ์์ ์์ ์ด ํต์งธ๋ก ์ฌ๋ผ์ง. ์๋ฅด๋ ๊ฑด ๊ณผ๊ฑฐ๋ฟ. - ๊ฒ์ดํธ ๋ฐฉ์ ๊ต์ฒด: HAVING โ WHERE ์ฐฝ. HAVING(์ง๊ณ ํ)์ ์นด๋ ๊ฑด์์ ์ฐฝ ๋ฐ ๊ณผ๊ฑฐ๊ฐ ์์ฌ "2์ฃผ๋ง ํ์"๊ฐ ์ฑ๋ฆฝ ์ ํจ. ๊ฐ์ ์ฐฝ์ itemsยทstatus-bulkยทowners์๋ ์ ์ฉ โ ์นด๋ ๊ฑด์=ํผ์น ๋ชฉ๋ก=์ผ๊ด๋ณ๊ฒฝ ๋ฒ์ ์ผ์น.
- ์ปค๋ฐ
master ed2ea6aโdeploy-live 750fdad(worklog 5ํ์ผ๋ง ํฌ์๋ ๋ฐ์, AยทB ๋ฏธ๋ฐ์ ์ ์ง). devplanpfs.htmlDONE ๊ฐฑ์ . - ๊ฒ์ฆ =
scripts/test_worklog_window.py7ํญ๋ชฉ PASS(์ฐฝ ๊ณ์ฐ + SQL%s/ํ๋ผ๋ฏธํฐ ์ผ์น) + ์ด์ ์ค์ธก ๋ฌถ์ 702โ252(64%โ)ยทํญ๋ชฉ 1674โ565(66%โ), ์ต์ ์์ 07-29(์์ ์ ์ง). โณํํ ์ก์(์นด๋ ํผ์นจยท์ผ๊ด๋ณ๊ฒฝ ํ์ธ์ฐฝ ๋ฌธ๊ตฌ). ์์ธ=session-2026-07-27-worklog-2week-window.md, ํจ์ 2๊ฑดtraps.md.
NOW (2026-07-27) โ ๋ฏธ๋ฐ์ ์ปค๋ฐ ์ ๋ณ ์ด์๋ฐฐํฌ(CยทDยทE) + devplan ๋ฐฐํฌ๊ด๋ฆฌ ํ์ด์ง
- ๋ฏธ๋ฐ์ ์ปค๋ฐ ์ธ๋ ๋ฒ(์ค์): ์ด์์ merge๊ฐ ์๋๋ผ cherry-pick ์ด๋ ฅ์ด๋ผ ํด์๊ฐ ์ ๋ถ ๋ค๋ฅด๋ค โ ์์
deploy-live..master89๊ฑด์ ๊ณผ๋๊ณ์.git log --no-merges --cherry-pick --right-only origin/deploy-live...origin/master(patch-id ๋น๊ต) = 22๊ฑด, ๊ทธ์ค diff 0์ธ 2๊ฑด ๋นผ๋ฉด ์ค์ 20๊ฑด. ์ต์ข ํ์ธ์git diff --stat๊ณผ ๋์กฐ. - ์ ๋ณ ๋ฐฐํฌ(ํํ "CยทDยทE๋ง"):
git merge master๋ AยทB๊น์ง ๋๊ณ ์ค๋ฏ๋ก ํ์ผ๋จ์git checkout origin/master -- <files>ํฌ์๋ ๋ฐ์. ์ํ ๋ฎ์ ์ E(์คํฌ๋ฆฝํธ)โC(ํ์)โD(์นUI) 3์ปค๋ฐ + push 1ํ(์ด์ ์ฌ์์ 1ํ). deploy-live6fe4e38ยท7b916e8ยท8ca0389. - ๊ฒ์ฆ = ์์ฒด 14์ผ์ด์ค PASS(
_is_zero_name6ยทํ์ผ๋ช ํ์ฑ 4ยทnum_only4, D๋ colgroup 17๊ฐ ๋ถ๋ณ) + SSM ์ค์ธก(์ด์ HEAD ์ผ์นยทpfs-live.uwsgiactiveยท/login200ยทcss?v=20260715d์๋น). - ๋จ์ ๋ฏธ๋ฐ์ 8๊ฑด = A ํ๋ฌผ์ฑ ๋ฐฐ์ฐจ 3๊ฑด(์๋ NOW, ํํ ์ก์ ๋๊ธฐ) ยท B ์๋ง๊ฐ 5๊ฑด(๐ด
patch41_monthly_close.sql์ด์ RDS ์ ํ + ๋ฉ๋ด ์๋ 46 ํ์). - ๊ด๋ฆฌ ํ์ด์ง ์ ์ค =
C:\dev\devplan\pfs.html(ํ๋ธ pfs ์นด๋ โ ๊ณํ ํ์ด์ง). ๋ฏธ๋ฐ์ ์ปค๋ฐ ๊ด๋ฆฌํ(์ํยท๋ฉ๋ชจ localStorage) + ๋ฐฐํฌ ์ ์ฒดํฌ๋ฆฌ์คํธ + ๋ฐฐํฌ์๋ฃ ์ด๋ ฅ + '์ฝ๋์ฉ ์ง์๋ฌธ ๋ณต์ฌ' ๋ฒํผ. ๋ฐ์ดํฐ ๊ฐฑ์ = ๊ทธ ํ์ผ์PENDING/DONE๋ฐฐ์ด ์์ . ์์ธ=session-2026-07-27-selective-deploy-cde.md.
NOW (2026-07-26) โ ๋ฐฐ์ฐจ ใํ๋ฌผ์ฑ ์ ์ใ ์ฐ๋ (ํ ์คํธ ์๋ฒ ์ ์ฉ)
- ๋ฐฐ์ฐจ ๋ชจ๋ฌ = ํ๋ฌผ์ฑ ์ ์ ํผ์ผ๋ก ํ์ฅ: ์ฐจ๋ 19์ข (์ฑ ํค์ 15 ๊ธฐ์ค)ยท์ฐจ๋์ข ๋ฅ(ํค์ ์ข ์)ยท์/ํ์ฐจ ๋ฐฉ๋ฒยท์ผ์, ํ๋ฌผ์ค๋์ ๊ท์น ์๋(๋ค๋ง์คยท๋ผ๋ณดยท1T=0.2, ๊ทธ ์ธ ํค์ร50%). ๋ฑ๋กยท์์ ๊ฐ์ ๋ชจ๋ฌ์ด๋ผ ์์ ํต์ผ. ๋ชฉ๋ก์ ํ๋ฌผ์ฑ ์งํ์ํ ๋ฐฐ์ง.
- ์คํค๋ง =
dispatch๋ฉฑ๋ฑ ALTER 8์ปฌ๋ผ(car_typeยทload_methodยทload_timeยทunload_methodยทunload_timeยทfreight_statusยทfreight_msgยทfreight_at). API =GET /api/dispatch/freight-queue,PATCH /api/dispatch/<no>/freight(์ํ ํ์ดํธ๋ฆฌ์คํธ). - ๊ทผ๋ณธ์์ 2๊ฑด: โ
insert_dispatch๊ฐ ๋dispatch_no=0๋ฐํ(SELECT LAST_INSERT_ID()๋ ์ปค๋ฅ์ ์ด ๋ฌ๋ผ 0) โMySQLUtil.execute_id(cursor.lastrowid) ์ ์คยท์ฌ์ฉ โกflask_restplus์์return jsonify(...), 400์ 500์ผ๋ก ํฐ์ง๋ค โ dict ๋ฐํ. (๊ฐ์ ํจํด์ดDispatchList.post๋ฑ์๋ ๋จ์ ์์ โ ๊ฑด๋๋ฆฌ์ง ์์.) - ๊ฒ์ฆ =
scripts/test_freight_api.py6ํญ๋ชฉ PASS(ํ ์คํธ์๋ฒ ์ค API) +scripts/test_freight_vehicle_map.js(์ฐจ๋/ํค์ ๋งคํยท์ค๋์). ์ค๊ธฐ๊ธฐ E2E๋ poin-agent handoff ์ฐธ์กฐ. ์ด์(deploy-live) ๋ฏธ๋ฐ์ โ ํํ ์ง์ ๋๊ธฐ.
ํ ์ค ๋งฅ๋ฝ
pfs(Flask/MySQL on EC2) ์น์ฑ์ ๊ฒฌ์ v2 + OMC ์ค์ฌ์ผ๋ก ๊ฐ์ . ์ฑํฐ ์ง๋จยท.md ์ง์๋ฌธ โ ์ฝ๋ ์คํยท๋ฐฐํฌ ๋ถ์ .
ํ์ ์ฌ์ค (์ธํ๋ผ ์์ธ = memory.md ยง1)
- ์ด์(8000/pfs/deploy-live/pfs.poin.co.kr) ยท ํ
์คํธ(8001/pfs-test/master/pfs-test.poin.co.kr). EC2
i-03225ba8bc12a929e, RDS 2๊ฐ. DBpfs/admin(๋ฏผ๊ฐ๊ฐ ๋ฏธ๊ธฐ์ฌ). - ๋ฐฐํฌ: pushโGitHub ActionsโSSM(reset --hard + systemctl restart). master=ํ ์คํธ, deploy-live=์ด์(์ฌ์ฉ์ ๋ช ์ ์๋ง).
- estimate v2: autosave ํ์ง(๋ช
์ ์ ์ฅ๋ง). v1 ๋ผ์ฐํธ ๋ณด์กด. ๋ชจ๋ฐ์ผ ๋ถ๊ธฐ =
common/utils/ua.pyis_mobile_ua()(๊ฐ์ URL ๋ค๋ฅธ ํ ํ๋ฆฟ). - AWS MCP SSM๋ก ์ด์/ํ
์คํธ RDS ์ฝ๊ธฐ ์กฐํ ๊ฐ๋ฅ(2026-06-09 ์ค์ธก): EC2์์ env source ํ
mysql๋ก์ปฌ ์กฐํ(๋ณต์ก ์ ธ์ base64). ์ฝ๊ธฐ SELECT๋ง(์ฐ๊ธฐ๋ ์ํ์์ ยท์น์ธ). 3306 ์ง๊ฒฐยทRDS Data API ๋ถ๊ฐ โ ๋ฐ๋์ SSM. - RDS ๊ด๊ณ๋(2026-06-30 ์ ์ค): ์ฝ๋ ์์
์ ์คํค๋ง/๊ด๊ณ ๋น ๋ฅธ ์ฐธ์กฐ =
pfs/tools/rds-map/docs/RDS_MAP.codi.md(๊ทธ๋ฃน๋ณ 70ํ ์ด๋ธยท์ปฌ๋ผยท์ถ๋ก ๊ด๊ณ). ํํ์ฉ ์ธํฐ๋ํฐ๋ธ ๋ค์ด์ด๊ทธ๋จ = ๊ฐ์ ํด๋rds-map.html. ๋น๋build_rds_map.py(์ด์ RDS information_schema SSM ๋คํโ์ถ๋ก ). MySQL์ด๋ผ ์ ์ธ FK 1๊ฐ๋ฟ โ ์ปฌ๋ผ๋ช (<x>_noโํด๋น PK)ยท๋๋ฉ์ธ ๊ท์น์ผ๋ก ๊ด๊ณ ์ถ๋ก (declared/domain/inferred/audit). ํ๋ธ=fieldยทcompanyยทestimateยทuser. ์์ปค=์ค์ผ์ค๋ํ์คํฌpfs_rds_map(์๊ฐ๋น, hidden VBSโrds_map_watch.py, ์คํค๋ง ๋ณ๊ฒฝ ์docs/watch.log๊ธฐ๋กยทlast_run.txtheartbeat). ์คํค๋ง ๋ฐ๋๋ฉด ์๋ ๊ฐฑ์ ๋๋ ์๋ ํธ์ง ๊ธ์ง. - ๊ฒฌ์ ํต์ฌ ์คํค๋ง(ํ์
ยทK/Fยท์์ยทUI์ปฌ๋ผยท๋ง์งยทRDS ์ค์ธก) =
schema-estimate.md(1๋ฒ ์์ ์ง๋จ ๊ทผ๊ฑฐ). - pfs UI ์๋ํ(๋ธ๋ผ์ฐ์ ) = Playwright MCP + ์ ์ฉ Chrome ํ๋กํ
C:\dev\pw-chrome-profile(2026-06-13 ๊ตฌ์ฑ). ๋ก๊ทธ์ธ์ ์ธ์ ์ฟ ํค๋ผ ์์ ์ ๋จ(๋ธ๋ผ์ฐ์ ๋ซ์ผ๋ฉด ์๋ฉธ). ๋ก๊ทธ์ธ ๋ฐฉ๋ฒ ์ฐ์ ์์(ํํ ์ง์ 2026-06-20): โ 1์์ = env ํ์ผC:\dev\.secrets\pfs_login.env(ํคPFS_TEST_URL/ID/PWยทPFS_PROD_URL/ID/PW, git ๋ฐ) โ ์ด ๊ฐ์ผ๋ก ๋ก๊ทธ์ธ ํผ ์ง์ ์ฑ์ ๋ก๊ทธ์ธ(ํ ์คํธยท์ด์ ๊ณตํต, ๊ฐ์ฅ ํ์ค). โก2์์ = Chrome ์๋์์ฑ(ํ๋กํ์ ์ ์ฅ๋ idpoin01+๋น๋ฒ, ํผ ๋ฏธ๋ฆฌ์ฑ์ โ ๋ก๊ทธ์ธ ๋ฒํผ ํด๋ฆญ). ์ ์ฐจ: ๋๋ฉ์ธ ์ด๊ธฐ โ (env๋ก ํผ ์ฑ์ ๋๋ ์๋์์ฑ) โ ๋ก๊ทธ์ธ ๋ฒํผ โ/field/list. ๋น๋ฒ ๊ฐ์ ์๋ยท๋ฆฌํฌํธยท์ปค๋ฐ์ ๋ฏธ๊ธฐ๋ก(env์์ ์ฝ์ด ํผ ์ ๋ ฅ๋ง, ์ถ๋ ฅ ์ ํ๋ฌธ ๊ธ์งยทํ์ํ๋ฉด base64 ๋ฑ์ผ๋ก ๋น๋ ธ์ถ ์ ๋ฌ). poin01 user_no=1(=PFS_USER_NO). MCP ์ค์ ยท๋ณต๊ตฌ๋ ธํธ =C:\dev\backup_startup\playwright_mcp_profile_change.txt. ์ด์ ์๋ํ๋ ์ํ์์ ๊ท์น ์ค์(์ฝ๊ธฐ/์กฐํ๋ ์์ , ์ฐ๊ธฐยท๋ฐฐํฌ๋ ์น์ธ). ์์ธ ๋ฉ๋ชจ๋ฆฌ = [[browser-automation-login-default]]. - ๋ก์ปฌ AWS/SSM ๋ณต๊ตฌ(2026-06-24) โ ๐์ ๊ท ์ค์น๋ก ์น๊ฒฉ(2026-07-25): ์ด PC(์ฝ๋ ๋ก์ปฌ)์ aws CLI v2
2.36.8์ ์ ์ค์น =C:\Program Files\Amazon\AWSCLIV2\(wingetAmazon.AWSCLI, ์์คํ PATH ๋ฑ๋ก๋จ โ ์ด๋ ์ ธ์์๋aws๊ทธ๋ฅ ํธ์ถ) +session-manager-plugin 1.2.835.0(wingetAmazon.SessionManagerPlugin,C:\Program Files\Amazon\SessionManagerPlugin\bin\, ์์คํ PATH ๋ฑ๋ก) โaws ssm start-session --target i-03225ba8bc12a929e๋ํํ ์ ์๊น์ง ๊ฐ๋ฅ. ์๊ฒฉ์ฆ๋ช~/.aws/credentials(IAMpoinadmin, account 708397632488; ํค๋ ์๋ ๋ฏธ๊ธฐ์ฌ),~/.aws/configregionap-northeast-2. ๊ฒ์ฆ(2026-07-25) =aws sts get-caller-identityโarn:aws:iam::708397632488:user/poinadmin,aws ssm describe-instance-informationโi-03225ba8bc12a929eOnline(Ubuntu). โ ๊ตฌ ๋ฐฉ์(pfs/.venvpip +export PATH=".../.venv/Scripts:$PATH")์ ๋ ์ด์ ๋ถํ์(๋จ์ ์์ด๋ ๋ฌดํด). โpython scripts/ssm_run.py <local.py> [remote.py]๋ก EC2 SSM ์ง์ ๊ฐ๋(ssm_run์ด base64โ/tmpโpython3). EC2๋ py3.6(capture_outputยทf-string ์ผ๋ถ ์ฃผ์), env=/home/ubuntu/env/pfs-test.env(ํ ์คํธ)ยทpfs-live.env(์ด์). ํ ์คํธ API๋ nginx 8001(Hostpfs-test.poin.co.krํ์) ๋๋https://pfs-test.poin.co.kr๊ณต๊ฐยท๋ก๊ทธ์ธ ๋ถ์(/api/...PATCH ๊ฐ๋ฅ). ์ฝ๊ธฐ ์์ ยท์ฐ๊ธฐ/DDL์ ์ํ์์ (์น์ธ). ๊ณผ๊ฑฐ "aws ๋ฏธ๋ณต๊ตฌ" ๋ฉ๋ชจ๋ ๋ฌดํจ. - ํ
์คํธ/์ด์ RDS๋ ๋ณ๊ฐ ์ธ์คํด์ค: ํ
์คํธ=
poin-dbinstance-test, ์ด์=poin-dbinstance(๋ ๋ค DB๋ชpfs). ํ ์คํธ DDL์ ์ด์ ๋ฌด์ํฅ. orderpaper.stock์ปฌ๋ผ์ ํ ์คํธยท์ด์ ์์ชฝ ์กด์ฌ(2026-06-24 ์ด์ ALTER ์๋ฃ, VARCHAR(50) NULL AFTER qty_user). ์ด์ env=/home/ubuntu/env/pfs-live.env(DBpfs)ยทํ ์คํธ=pfs-test.env. ~~SSM ๋ฌ๋ aws CLI๋pfs/.venv/Scripts๋ผexport PATH="/c/dev/pfs/.venv/Scripts:$PATH"์ ํ.~~ โ 2026-07-25 ๋ฌดํจ: aws CLI๊ฐC:\Program Files\Amazon\AWSCLIV2\์ ์ ์ ์ค์นยท์์คํ PATH ๋ฑ๋ก์ด๋ผ PATH ์ ํ ๋ถํ์(์ "๋ก์ปฌ AWS/SSM" ํญ๋ชฉ ์ฐธ์กฐ). stock ์๋ ์๋ฃ(2026-06-24): ์ด์ 187ํ=์์ ์ฌ๊ณ ๊ด๋ฆฌ '๋จ์์๋', ๋๋จธ์ง 0. ๋๊ธฐํ ์ ๊ทํญ๋ชฉ์ stock=qty ์๋๋ณต์ฌ(sync/upload INSERT, ์ฌ๋๊ธฐํ ๋ณด์กด) โ ๋ก์ปฌ ์ฌ์ด๋์นด ๊ฒฝ๋ก(์น ๋ฐฐํฌ ๋ฌด๊ด).
์งํ ์ค / ์ต๊ทผ ์๋ฃ
์๋ฃยท๋ฐฐํฌ ๋๋ ์์ธ ์ด๋ ฅ์ archive.md(์ ๊ฑด)์ sessions.md(์ธ์ ์ธ๋ฑ์ค)๋ก ์ด๊ดํจ. ์ฌ๊ธฐ์ NOWยท๋ฏธ๊ฒฐ๋ง.
โญ๏ธ ํ์ฑ / ๋ฏธ๊ฒฐ (2026-07-23 ๊ฐฑ์ )
- ๐ถํ์ฑ โ
/production/sticker1์ธต ์์ฐํ PC ๋ฐฐ์น ์์ (2026-08-10, ํํ ๋ฌธ์ โ ์ฝ๋ ์ค๋ช ). ๋ธ๋ผ์ฐ์ (ํฌ๋กฌ)+๋ก๊ทธ์ธ๋ง์ผ๋ก ๋์(๋ฐฐ์จ 140% ๋ธ๋ผ์ฐ์ ์ธ์ ํด๋ฐฑ). ์ ํํ ๋ผ๋ฒจ ํฌ๊ธฐ๋ฅผ ์ํ๋ฉดC:\dev\pfs\print-agent๋ณต์ฌ โinstall_print_agent.bat(๊ด๋ฆฌ์ ๋ถํ์, ์ ํ=Python 3.8+ PATH, pywin32ยทpillow ์๋์ค์น, ์์ํ๋ก๊ทธ๋จ ์จ๊น vbs, 127.0.0.1:17777). ๋ถํ์ = NASยทMSSQL ํด๋ผ์ด์ธํธยทVPNยท์์ (์ ๋ถ EC2/์ฌ๋ฌด์คPC ์ชฝ). ์ฃผ์ = ์ธ์์ค์ (์ฉ์งยท๋ฐฐ์จ)์ localStorage๋ผ PC๋ง๋ค ์ต์ด 1ํ ์กฐ์ ยท GT800 ๋๋ผ์ด๋ฒ ์ฉ์ง ์คํก 100ร100mm ยท ํ๋ ํธ์ฉ์ง๋ A4 ๊ฐ๋ก(์์ด์ ํธ ๋ฏธ์ง์, ๋ธ๋ผ์ฐ์ ์ธ์). โณ๋ฏธ๋ฐฐํฌ ์์ฌ =sticker_controllersync target ํ ์ค(์์ปค ์ด์ค๊ฒฐ์ ์ผ๋ก ๋์์ ์ ์, ์ค์น ์ ๋ฐฐํฌ ๊ถ์ฅ). - ๐ถํ์ฑยทํ
์คํธ ๋ฐฐํฌ ์๋ฃ โ ์๋ง๊ฐ ๊ธฐ๋ฅ ์ ๊ท + 26๋
1~7์ ๋ง๊ฐ 15๊ฑด ์๋ฉ (2026-07-22~23, ์ฝ๋, ํํ ์ง์). NAS
\\192.168.0.101\๊ณต์ ํด๋\2026ํ์ฅ\๊ฒฌ์ \{01~07์}๋ง๊ฐํ 23๊ฐ(๋ฅ์์ค7ยท์๋ฅ์ค7ยท๋ต์ค1 + ์ฐธ์กฐ/ํฌ์ธํ์ ๋ณธ) ํ์ฑํด ๊ธฐ๋ฅ ์ค๊ณยท๊ตฌํ. ํ์ด์ง/estimate/monthly-close(๊ฒฌ์ ์ ๊ทธ๋ฃน ๋ฉ๋ด 46): ์+๊ฑฐ๋์ฒ ์ ํโํ์ฅ๋ณ ๋ณธ๊ฑด/์ถ๊ฐ(+๊ตฌ๋ถ์ ๋ ฅ)/์๊ณต๋น/ํฉ๊ณ/ํ์ ํธ์งํโ๊ฒฌ์ ์๋์์ง(/candidates)โ๊ฒ์ฆ ๋ฐฐ์ง(๊ฒฌ์ ๊ฐ์กฑํฉ=๋ณธ๊ฒฌ์ +์๋ ๋์กฐ)โ๊ฑฐ๋์ฒ ์ ์ถ ์์ (์์์ ์ฌํ). ๊ท์น: ๋ฅ์์ค๋งconstruction_yn='1'์๊ณต๋น ๋ณ๋(์๊ณ+์๊ณต๋น ์ปฌ๋ผ), ํ์ ์ฒด ๋ฏธํ๊ธฐ. ํฉ๊ณ๋ ๋ช ์๊ฐ ์ฐ์ (์ด์ยท์ ์ง๊ธ ์ฌ๋ก ๋ณด์กด, ๋น๊ฐ๋ง ์๋๊ณ์ฐ). ํ ์ด๋ธmonthly_close/monthly_close_item(patch41, ํ ์คํธ RDS ์ ์ฉ,orderpaper-sync/monthly_close_seed.py). masterdae788eโ26c49cdโc684883โce9b34eโ34ab1c3(jQuery super()ํฝ์คยทDecimal 500ํฝ์คยท๊ฐ์กฑํฉ ๋ฐฐ์ง). ๋ฐ์ดํฐ ์๋ฉ(ํ ์คํธ): ๋ง๊ฐ 15๊ฑด(close_no 1~15, 1~7์) API ์๋ฉ ALL PASS โ 72ํ ์ค 70ํ ๊ฒฌ์ ์ฐ๊ฒฐ(๋ฏธ์ฐ๊ฒฐ 2=PFS์ ํ์ฅ ์์ฒด ์์: ๋ฐ๋ ๋ถ์ฐEDCยท์ผ๋ ๋ธ ์คํผ์คํ ). ๊ฒฌ์ ๋ฐฑํ: ์ํฌํ๋ก 31์์ด์ ํธ(๊ณํ15โ์ ๋๊ฒ์ฆ15โ์ ์ฉ) + 2์ฐจ ๋งค์นญ์ผ๋ก estimate ๋ฐฑํ 70๊ฑด(comment='2026 ์๋ง๊ฐ ๋ฐฑํ(์ฝ๋)', ๋ณธ๊ฒฌ์ 35+์ถ๊ฐ๊ฑด 35) + ๊ธฐ์กด 3๊ฑด ์ ๋ฐ์ดํธ(707 ํํฌ์ฌ์ด๋ยท710 GS์ค์ฐ cons 18,970,000/total 74,767,000ยท737 ์์ํ๋จ). ๊ฒฌ์ ๊ท์ฝ = ๋ณธ๊ฒฌ์ total=๋ณธ๊ฑด+์๊ณต๋น, ์ถ๊ฐ๊ฑด=์๋ (parent_estimate_no) โ ๊ฐ์กฑํฉ=๋ง๊ฐํ ํฉ๊ณ. ๋ฐฐ์ง ๋ถ์ผ์น 25๊ฑด = ์ ๋ถ ๊ตฌ์กฐ์ (๋ถ๋ถ์ฒญ๊ตฌยท์ด์ยท์ถ๊ฐ๊ฑด๋ง ์ฒญ๊ตฌ, ๋น๊ณ ๋ก ์ค๋ช ), ์ ์ก์ฒญ๊ตฌ 45๊ฑด ์ ๋ถ ์ผ์น. ์์ ์ถ๋ ฅ ์๋ณธ ๋ง๊ฐํ์ 1์ ๋จ์ ์ผ์น ์ค์ธก(7์ ๋ฅ์์ค 176,113,000ยท์๋ฅ์ค 57,844,000). โณ๋ค์=ํํ ์ก์(ํ ์คํธ), ์ด์๋ฐฐํฌ ๋ณ๋ ์ง์(์ฝ๋ cherry-pick+patch41 prod+์๋ฉ์ ์ด์๊ฒฌ์ ๊ธฐ์ค ์ฌํ๋จ ํ์), ์์ฌ=๋ฏธ์ฐ๊ฒฐ 2ํ ํ์ฅ ํ์ ์ ์ฌ์ ์ฉ(scratchpad monthclose/apply_plan.py๋ฉฑ๋ฑ).
โญ๏ธ ์ด์ ๋ฏธ๊ฒฐ (2026-07-20 ๊ฐฑ์ )
- ๐ถํ์ฑยทํ
์คํธ ๋ฐฐํฌ ์๋ฃ โ AL๋ฐ์ฃผ์ ํ์ด์ง ์ ๊ท(๋์ด์
๋ ฅโ๊ณ์ฐโ๋ฐ์ฃผ์ ์์
) (2026-07-19, ์ฝ๋, master
cc3bc10+9f452b0โํ ์คํธ์๋ฒ). ์ ๊ท ํจํค์งapi/pfs/al_orderpaper/(calcal_calc.py=์ค์ 49ยท6๊ณต์ / openpyxl ์์ฑ๊ธฐal_orderpaper_excel.py+ํ ํ๋ฆฟassets/al_order_template.xlsx/ 4๊ณ์ธต). ํ์ด์ง/field/al-orderpaper(field_al_orderpaper.html+al_orderpaper.js๋ผ์ด๋ธ๊ณ์ฐยท์ ์ฒด์๋์์ฑยท๋ฏธ๋ฆฌ๋ณด๊ธฐยทํ๊ธํ์ผ๋ช ). API/api/al-orderpaper(๋ชฉ๋ก/์ ์ฅ/์ญ์ /profiles/vendors/preview/excel). RDS(ํ ์คํธ)al_orderpaper+al_orderpaper_item(migrations/patch40)+menu 45. E2E PASS(profiles49ยทvendors381ยท์๋ฒ๊ณ์ฐ์ ํยท์์ RFC5987). ๐ถ๋ฏธ๊ฒฐ/๋ค์: โ ํฉ์ค๋ฐ์ก=๋ฒํผ ์คํ (๋ก์ปฌ ํฉ์ค์์ด์ ํธ print-agentํจํด) โกHTML๋ฏธ๋ฆฌ๋ณด๊ธฐ=๊ทผ์ฌ๋ฏธ๋ฌ โข์ด์๋ฐฐํฌ ๋ณด๋ฅ(ํํ "์ด์๋ฐฐํฌ" ์ cherry-pick) โฃ์ต์ข ๋น์ =๊ฐ๊ตฌ์์ด์ ํธ ๋๋ฉดํ๋ โ๋ฐ์ฃผ์ ์๋์์ฑ. ์์ธ=archive/sessions. KB=furniture-expert/06 ยง14+seoljeong_constants.json. -
๐์กฐ์ฌ์๋ฃยท์ค๊ณ ๊ทธ๋ฆด๋ง1ํฉ์ โ ์๋ถ์์ฌ๋ฐ์ฃผ์(ALยท์ ๋ฆฌ) ์๋์์ฑ ํ์ดํ๋ผ์ธ ์ฐ๊ตฌ (2026-07-19, ์ฝ๋). ํํ ์ง์=NAS ํ์ค์์
\\192.168.0.101\๊ณต์ ํด๋\์๋ถ์์ฌ๋ฐ์ฃผ์.xlsx(8ํญ) + ํ์ฅํ์ผ2026ํ์ฅ\์๋ถ์์ฌ๋ฐ์ฃผ์\{์}\*.xlsx(90์ฌ๊ฐ) ๊ตฌ์กฐํ์ โ์๋ํ ์ฐ๊ตฌ, pfs DB ์ฐธ์กฐ. ๊ตฌ์กฐ ํ์ : ๊ณ์ฐ๊ตฐ=์ค์ (ํ๋กํ์ผ ๊ณต์ ์์ 49์ข )รAL๋ง๊ฐ์ฌ์ด์ฆ(๋์ด1ํ ์ ๋ ฅโAL/๋ชฉ๋/์ ๋ฆฌ ์ฌ๋จ์น์ ์๋๊ณ์ฐ SSOT). ์ถ๋ ฅ๊ตฐ=AL์ ์ฒดยท์ ๋ฆฌ์ ์ฒด(AL๋ง๊ฐ์ฌ์ด์ฆ ๋ฏธ๋ฌ๋ทฐโ์ค์ ์ฒด๋ช rename, C2๊ฐ์ ์ฒด๋ง์คํฐ INDEX/MATCH ์กฐํ, ALยท์ ๋ฆฌ ๋์์์ฑ)+๋ฐ์ฃผ์(๊ธฐํ์์ฌ ๋ฒ์ฉ ์๊ธฐ)+์ค์ ์จ(๋ณด๋). ๊ณต์: ๊ท๊ฒฉW=(์ฅ์ธ๊ฒฝโ10โํฐ์๊ฐญ)/2, ๋ชฉ๋=(Wโ๋ชฉ๋๋บ)ร(Hโ๋ชฉ๋๋บ), ์ ๋ฆฌ=(Wโ์ ๋ฆฌ๋บ)ร(Hโ์ ๋ฆฌ๋บ), 3๋ฉด์ฃ์ง ํฐ์W=+ํฐ์๋ง๊ฐ. ๊ฒ์ฆ PASS(๋๋์ฃ์ง๋ฐ 800/400โ๋ชฉ๋390ร395ยท์ ๋ฆฌ392ร397). pfs ์ฐ๊ณ:orderpaper-sync/orderpaper_parse.py๊ฐ ์ด๋ฏธ ์ด ํ์ผ ํ์ฑ์ค(๊ณ์ฐ4ํญ EXCLUDE, rename์ถ๋ ฅํญ๋งโRDS orderpaper/op_material_spec, ๋น์ถฉ๋ ๋๊ธฐํ) โ pfs=ํ๋ฅ(๋ฐ์ฃผ์ถ์ ) ์๋น, ์๋ํ ๊ณต๋ฐฑ=์๋ฅ(๋์ด์คํโ๊ณ์ฐโ๋ฐ์ฃผ์์์ฑ). ๊ทธ๋ฆด๋งโ ํฉ์(ํํ): ์ ๋ ฅ์์ค=๋ณ๋ ์ ๋ ฅํผ(์น/์ํธ) ์ ๊ท(๋์ด๋ฐ์ฃผ์์ฐ๋/๊ฒฌ์ BOM ์๋). ๊ณ์ฐ๋ถ=์ค์ 49ํ+6๊ณต์ Python์ด์ ๋ฆฌ์คํฌ0, ์ถ๋ ฅ๋ถ=openpyxl ์๋ณธ์์ ์์ฑ, ๋๊ธฐํ=pfs ๋น์ถฉ๋ํจํด. ๋ค์=์ฐฉ์ ์ ๊ทธ๋ฆด๋งโก(์น vs ์์ ์ํธ, ์คํค๋ง/์ ์ฅ์์น) ํ์ โ ๋ฏธ์ฐฉ์(์ฐ๊ตฌยทํฉ์ ๋จ๊ณ). ์ง์ ๋ฐ์: ๊ฐ๊ตฌ์ ๋ฌธ๊ฐ KB06-aluminum-profile-handles.md ยง14+seoljeong_constants.json(49ํ), ๋ฉ๋ชจ๋ฆฌwonbujae-orderpaper-al-glass-engine. -
๋ฏธ๊ฒฐ2 โ ์ด์ ๋ฐฑ์ ํ ์ด๋ธ ์ ๋ฆฌ ๋๊ธฐ(์ํ์์ ): orderpaper_no ์ฌ๋ฒํธ ์ ๋ง๋ ๋กค๋ฐฑ์ฉ ๋ฐฑ์ 2๊ฐ๊ฐ ์ด์ RDS์ ๋จ์์์ โ
orderpaper_bak_20260707_renum,orderpaper_usage_history_bak_20260707_renum. ๋ฉฐ์น ๋ฌธ์ ์์ผ๋ฉด ํํ ์น์ธ ํ DROP ๊ฐ๋ฅ(ํ์ฌ ๋ณด์กด). ์ฌ๋ฒํธ ๊ฒฐ๊ณผ=orderpaper_no 1..1500 ์ฐ์, AUTO_INCREMENT=1501.
๐ถ ๋ฏธ๊ฒฐ(์ด์ ๋ฏธ๋ฐฐํฌยท์น์ธ ๋๊ธฐ) โ 06-20 ์งํ ์ค 2๊ฑด
์๋ 2๊ฑด์ ํ ์คํธ ๊ฒ์ฆ๊น์ง ๋๋ฌ์ผ๋ ํํ ์ด์๋ฐฐํฌ ์ง์ ๋๊ธฐ ์ํ. ์๋ฃ ์๋.
๐ถ ๋ฏธ๊ฒฐ(์งํ์ค, 2026-06-20) โ ์
์ฒด ๊ด๋ฆฌ ์
์ฒด๋ชฉ๋ก ์ ๋ ฌ(์ต๊ทผ ๋ฐ์ฃผ์ผ)+์ ์ฌ์
์ข
ํํฐ (์์ฌ๊ด๋ฆฌ ๋ฐ์ฃผ์ ๊ธฐ๋ฐ) ํ
์คํธ ๋ฐฐํฌยท1์ฐจ ์ด์ (master 5205da2, ?v=20260620e, ์ด์ ๋ฏธ๋ฐฐํฌ)
- ํํ: ์ ์ฒด๋ชฉ๋ก์ ์ ๋ ฌํํฐ โ โ ์์ฌ๊ด๋ฆฌ ๋ฐ์ฃผ์(orderpaper) ๊ธฐ์ค ์ต๊ทผ ๋ฐ์ฃผ์ผ ๋ด๋ฆผ์ฐจ์ โก์ฝ๋ ์ถ๋ก ์ ์ฌ์ ์ข ํํฐ. ๋ชฉ์ =์์ฌ๋ถ๋ฅ/ํญ๋ชฉ ๋น ๋ฅธ ์ ๋ฆฌ. "1์ฐจ๋ ์ฝ๋ ์ถ๋ก ์ด์". + "ํ ์คํธRDS๋ฅผ ์ด์RDS 26๋ ์๋ฃ๋ก ๊ฐฑ์ ํ๊ณ 26๋ ์๋ฃ ์ค์ฌ์ผ๋ก ํ ์คํธ๋ง ์์ ".
- โ ๏ธ ํ
์คํธ RDS ๊ฐฑ์ (2026-06-20): ์ด์(pfs-live) 2026 ์๋ฃ โ ํ
์คํธ(pfs-test).
company340 UPSERT(์ญ์ ์์, ํ์ฑ 329=์ด์),orderpaperํ ์คํธ ์ฌ๋ถ 3799๊ฑด ์ญ์ ํ ์ด์ active 2026 1009๊ฑด ํด๋ฆฐ๊ต์ฒด(๋ฒ์ 2026-01-02~06-19, vendor 59=์ด์ ๋์ผ). ์คํฌ๋ฆฝํธscripts/_rds_sync_prod2026_to_test.py(์ด์=SELECT๋ง, ํ ์คํธ=ํธ๋์ญ์ ์ฐ๊ธฐ). ์ด์์ ์ฝ๊ธฐ๋งยท๋ฌด๋ณ๊ฒฝ. โ ์ดํ ํ ์คํธ company/orderpaper = ์ด์ 2026 ์ค๋ ์ท(2026-06-20 ๊ธฐ์ค). - ๋ฐ์ดํฐ ๋ชจ๋ธ ํ์ธ: orderpaper.
vendor(๋ฐ์ฃผ์ฒ=์ ์ฒด๋ช ๋ฌธ์์ด, company_no ์๋)โcompany.name๋งค์นญ.order_date=๋ฐ์ฃผ์ผ,item_name=ํ๋ชฉ,material_type(R์์์ฌ/E์ฃ์ง/S๋ถ์์ฌ). ํ์ฑ์ ์ฒด 329 ์ค ๋ฐ์ฃผ์ด๋ ฅ ์๋ vendor 59(๋๋จธ์ง๋ ๋ฐ์ฃผ์ด๋ ฅ์์). - ๋ฐฑ์๋(3ํ์ผ):
orderpaper_daovendor๋ณ ์ต๊ทผ๋ฐ์ฃผ์ผยท๊ฑด์(select_vendor_order_summary) + ํ๋ชฉ๋ถํฌ(select_vendor_item_breakdown).user_admin_service์ ์ฌ์ ์ข ๋ถ๋ฅ๊ธฐ_classify_industry(INDUSTRY_RULES: ๋ณด๋/๋ชฉ์ฌยท์ํธ/ํ๋ฆยท์ฃ์งยท์ ๋ฆฌ/๊ฑฐ์ธยท๊ฐ์ฃฝ/ํจ๋ธ๋ฆญยทํ๋์จ์ด/๊ธ์ยท๊ธฐํ โ ์ ์ฒด๋ช ๊ฐ์ ํธ(50) + ํ๋ชฉ ํค์๋ + ์์ฌํ์ ํํธ(Eโ์ฃ์งยทRโ๋ณด๋), ์ฝ๋/๋ธ๋๋๋ช ํ๊ณ๋ ์ฌ์ฉ์ ๋ณด์ ์ ์ ) +get_company_order_stats. controllerGET /api/admin/company/order-stats. - ํ๋ก ํธ(2ํ์ผ): ์ข์ธก ์
์ฒด๋ชฉ๋ก ์๋จ
.cp-listbar(์ ๋ ฌ ์ ๋ ํธ ์ต๊ทผ๋ฐ์ฃผ์ผโ ๊ธฐ๋ณธ/์ ์ฒด๋ช /๋ฒํธ + ์ ์ฌ์ ์ข ํํฐ ์ ๋ ํธ), ํ์ ์ต๊ทผ๋ฐ์ฃผ์ผยท๊ฑด์ยท์์ ์ ์ข ๋ฐฐ์ง(indClass).loadOrderStats(์ ์ฒด๋ช ๋งค์นญ map),renderCompanyList์ฌ์์ฑ(์์ฌ ํญ์ ์ต์๋จ ๊ณ ์ ยทํํฐ/์ ๋ ฌ ๋ฌด๊ด, ๊ฑฐ๋์ฒ๋passIndustry+sortCmp). ์บ์๋ฒ์คํฐ dโe. - ํ ์คํธ Playwright ๊ฒ์ฆ PASS: ๊ธฐ๋ณธ ์ต๊ทผ๋ฐ์ฃผ์ผ์(ํผ์ค์ 06/19ยท53 > ๋ ธ๋ฆฌ์ฝ๋ ์ 51 > ์ ์ฌ๊ธฐ์ 35โฆ, ๋์ผ๋ ์ง๋ ๊ฑด์์), ์ ์ข ํํฐ ์ ๋ฆฌ/๊ฑฐ์ธโ4๊ฐ(์ ์ผ์ ๊ฒฝยท๋๋ฆผ์ ๋ฆฌยท์ ๋ก๊ธ๋ผ์คยท๋ฃจ๋ธ๊ธ๋ผ์ค, ๋ช ์ง=์ง๊ธ๋ผ์ค hinge๋ '๊ธ๋ผ์ค' ํค์๋ ์ ์ธ๋ก ์ ๋ฆฌ ์ค๋ถ๋ฅ ์ ๋จ), ์ ๋ ฌ ์ ์ฒด๋ช =๊ฐ๋๋ค์, ์์ฌ ํฌ์ธ ๊ธ์ ๊ณ ์ , ๋ฐฐ์ง ์์. ์ด์ ๋ฏธ๋ฐฐํฌ(ํ ์คํธ๋ง, ํํ ์ง์).
- ๋ฏธ๊ฒฐ/๋ณด์ ๊ฑฐ๋ฆฌ(1์ฐจ ์ด์): โ ๋ถ๋ฅ ๊ฒฝ๊ณ์ฌ๋ก(์กฐ์ดIMT ์ฝ๋๋งโ๊ธฐํ ์ค์ ์ํธ, ์ ์ฌ๊ธฐ์
๊ฐ์ฃฝ/์ฃ์ง ํผ์ฌ) ์ฌ์ฉ์ ๋ณด์ โกcompany ๋๋ช
์ค๋ณต(์ด์ง์จ์ดยท๋ด์ 2๊ฑด์ฉ) โ ๋ฐ์ดํฐ ์ ๋ฆฌ๋ ๋ณ๊ฑด โข์
์ข
๊ท์น์
INDUSTRY_RULES์์ ์ผ๋ก ์กฐ์ . ํํ ํผ๋๋ฐฑ ํ 2์ฐจ.
๐ถ ๋ฏธ๊ฒฐ(์งํ์ค, 2026-06-20) โ ์ฌ์ด๋๋ฐ 'ํ์ฅ ๊ธฐ๋ก' ์ ์ด์ ํ์ ๊ทธ๋ฃน(ํ์ฅ ๋ด์ฉ+๋ํ๋ฐฉ ์์ง๊ด๋ฆฌ ๋ฌถ๊ธฐ) โ ํ ์คํธ ๊ฒ์ฆ PASSยท์ด์ ์น์ธ ๋๊ธฐ
- ํํ ์ง์(QA ์ฝ๋ฉํธ): ํ์ฅ ๋ด์ฉ(/field/worklog)ยท๋ํ๋ฐฉ ์์ง๊ด๋ฆฌ(/field/kakao-rooms)๋ฅผ ํ์ฅ ๊ทธ๋ฃน ํ์๋ก ๋ถ๋ฆฌ, ์์์ด๋ฆ ์ถ์ฒ โ ํํ ์ ํ 'ํ์ฅ ๊ธฐ๋ก'.
- ๊ตฌ์กฐ: ์ฌ์ด๋๋ฐ
ํ์ฅ(nav-small-cap) ์๋ํ์ฅ ๋ชฉ๋ก(flat) โํ์ฅ ๊ธฐ๋ก์ ์ด์ ๊ทธ๋ฃน {ํ์ฅ ๋ด์ฉ, ๋ํ๋ฐฉ ์์ง๊ด๋ฆฌ} โ์์ฌ๊ด๋ฆฌ(flat). ๊ธฐ์กด์ ์ ๋ค ํ๋ฉด ๋์ด์ด์์. - ๊ตฌํ 2๊ณณ: โ
web/templates/base.htmlํํํ ๋ถ๊ธฐ์ ์์ ๋ฉ๋ด ์๋ ์์=์ ์ด์(<ul class="collapse">) ๋ ๋ ์ถ๊ฐ(OMC ํจํด ์ผ๋ฐํ). โก menu_catalog ์ ๊ทfield_log('ํ์ฅ ๊ธฐ๋ก', parent=field, url NULL, order 214) + field_worklog/field_kakao_rooms๋ฅผ parent='field_log'๋ก ์ด๋(scripts/codi_field_log_group.py, ๋ฉฑ๋ฑ). ๊ถํ ์ถ๊ฐํ ๋ถํ์(๋ฆฌํ์ ๋ถ๋ชจ๋parent_keys_needed๋ก ์๋ ํฌํจ, 3๋จ๊ณ๋ ๋์ ํ์ธ). - ํ
์คํธ ์ ์ฉยท๊ฒ์ฆ ์๋ฃ: ํ
์คํธ RDS ์ ์ฉ(SSM), master
4d82b04pushโํ ์คํธ ๋ฐฐํฌ ์ฑ๊ณต, Playwright๋ก/field/worklog์ฌ์ด๋๋ฐ ์ค์ธก โํ์ฅ ๊ธฐ๋ก์ ์ด์(javascript:void(0)) ํ์์ ํ์ฅ ๋ด์ฉยท๋ํ๋ฐฉ ์์ง๊ด๋ฆฌ ์ค์ฒฉยทํ์ฑ ํผ์นจ ํ์ธ. - ์ด์ ๋ฏธ์ ์ฉ(์น์ธ ๋๊ธฐ): ์ด์ = โ
scripts/codi_field_log_group_LIVE.py(์ด์ env baked) SSM ์คํ + โก deploy-live์ base.html ๋ฐ์. ํํ "์ด์ ๋ฐฐํฌํด์ค" ์ ์งํ.
โ ์๋ฃ ์ด๋ ฅ โ archive.md / sessions.md (2026-07-07 ์ ๋ฆฌ๋ก NOW์์ ์ด๊ด)
- 06-19~07-06 ์ ๊ฑด(์์ฌ๊ด๋ฆฌ ํญ ์ฑ๋ฅ ์๋ฆฌ์ฆ 07-07 6๊ฑดยทorderpaper_no ์ฌ๋ฒํธยท์์ฌ๊ด๋ฆฌ ์ด๊ธฐ๊ตฌ์ถ 06-24ยท์
์ฒด๊ด๋ฆฌ ์์ฌ๋ถ๋ฅ/๊ถํ๋งคํธ๋ฆญ์คยท์
๊ณ ์ผ์ ์ฌ์ค๊ณยท๊ฒฌ์ v2/์์
ยทworklogยท์
์ฒดํด๊ฐ์ผ์ ๋ฑ) + ๊ทธ ์ด์ ์ด์๋ฐฐํฌ ์ด๋ ฅ(์ฃ์งยท๋ถ๋ฅยทํํฐยท์์ฐํํฉ ์ฌ๊ตฌ์ถยท๊ถํยทdispatchยทtalklog ๋ฑ) โ
projects/pfs/archive.md. - ๊ฒฌ์ ๋ฑ๋ก/์์ , ๊ฒฌ์ ์ ์์ (๊ณต๊ธ์ ์ด๋ฏธ์งยท๋์ฅยทreference), estimate sub-item, OMC Phase 1~7(06-08~09) โ archive.md. ๋ถ๋ฅ ๋๋กญ๋ฐ์คยทsize_display ์์(06-09) โ sessions.md.
- 07-07 ์์ฌ๊ด๋ฆฌ ๊ตฌ์กฐ๊ฐ์ ์ต์ข ๋ณธ๋ง ์ NOW์ ์ ์ง(ํํ ์ก์ ๋๊ธฐ).
๋ฏธ๊ฒฐ / ํ์
- orderpaper ์ ํญ 'ํ์ฅ๋ณ ์
๊ณ ์ผ์ ' โ ๋ชฉ์
10์ข
์์ฑยท๊ฒํ ๋๊ธฐ(2026-06-19): ๋ฐ์ฃผ~์
๊ณ ๊ธฐ๊ฐ(๊ทธ๋ผ๋ฐ์ด์
๋ฐ) ๊ฐ์กฐ + ์์ฐจ์ผ(โ ๋ณ๋) ๊ฐ์กฐ. ํ์ฌ ํ์ด์ง์ ๋์ผ ํํฐ(ํ์ฅ๋ณโ์
์ฒด๋ณ ํ ๊ธยท์์ฌยท๋น ๋ฅธํํฐยท๋ฒ์) ๊ณต์ , ๋์ . ์คํ์ผ 10์ข
(โ ๊ฐํธ โก์ฃผ๊ฐ๋งคํธ๋ฆญ์ค โข์์บ๋ฆฐ๋ โฃD-Day๋ฆฌ์คํธ โค์
๊ณ ํํธ๋งต โฅ์์ ๋ค โฆ์นธ๋ฐ(์ฃผ์ฐจ) โง์ปดํฉํธํ+๋ฏธ๋๋ฐ โจ์
์ฒด์ค์๋ ์ธ โฉํ์ฅ์นด๋์คํ
ํผ)์ 1ํ์ผ ํญ์ค์์ฒ๋ก. ์ค๋์ ยท์ง์ฐ(์
๊ณ ๊ฒฝ๊ณผยท๋ฏธ์๋ฃ)๋นจ๊ฐยท์ฃผ๋ง์์ยทD-dayยท์ผ/์ฃผ์ค ๋ฐ์. ํ์ผ
pfs/mockups/orderpaper_schedule_mockup.html(gitignore). Playwright ์ ํญ ๊ฒ์ฆ(JS์๋ฌ0). GPT ์์ ๋ฐ์ ์ถ์ฒ์ =..._v2.html: ํต์ฌ ์ธ์ฌ์ดํธ="์ ๊ณ ์ง์ฐ?"๋ณด๋ค "์์ฐจ ์ ์ ๊ณ ๊ฐ๋ฅ?"(์์ฐจ ๋ฒํผ=์์ฐจ์ผโ๋ฏธ์๋ฃ ์์ฌ ์ต์ข ์ ๊ณ ์์ ์ผ)๊ฐ ๋ณธ์ง โ ์์ฐจ๋ฒํผ ํต์ฌ ์ปฌ๋ผยท์ ๋ ฌ ์ ์ค. ๊ธฐ๋ณธ=๋ฆฌ์คํฌ ํ(8 ์ปดํฉํธํ+4 D-Day ์ ๋ ฌ, ๋ธ๋ก๋จ์ ์ง๊ณ, riskRank ์์ฐจ์ด๊ณผ>์ง์ฐ+์์ฐจ์๋ฐ>์ง์ฐ>์์ฐจ์๋ฐ>๋ฒํผ๋ถ์กฑ>์ ๊ณ ์๋ฐ), ๋ณด์กฐ=ํ์๋ผ์ธ(1 ๊ฐํธ) ๋ทฐํ ๊ธ, ์๋จ KPI 4์ข (์ง์ฐยท์์ฐจ3์ผ๋ด ๋ฏธ์๋ฃํ์ฅยท๋ฒํผโค1ยท์ค๋์ ๊ณ ). ๊ทธ๋ฃนํ ๊ธ ์ฉ์ด ๋ช ํํ(ํ์ฅ/๊ฐ๊ตฌ์ ์ฒด/๋ฐ์ฃผ์ฒ โ ๊ธฐ์กด vendor=๋ฐ์ฃผ์ฒยทfurniture_company=๊ฐ๊ตฌ์ ์ฒด ํผ์ฉ ์ง์ ). ํํ ๋ณด์์ง์ ๋ฐ์(2026-06-19): ๊ธฐ๋ณธ ์ ๋ ฌ์ ์์ฐจ์ผ ์๋ฐ์(๊ฐ๊น์ด ๋จผ์ , 1์์)โ์ํ๋(2์์)๋ก ๋ณ๊ฒฝ(์์ฐํ๋ฆ=์๋ฐ ์์ฐจ ์ฐ์ ), ๊ทธ๋ฃน๋ ๊ฐ์ฅ ์๋ฐํ ์์ฐจ์ผ ๋จผ์ . ํ์๋ผ์ธ ์ผ์ ์ ์ ์งํ๊ฒ(#cdd5df, ์ฃผ ๊ฒฝ๊ณ 2px). ์์๊ณ์ธต(ํ์ฅ๋ช ) ๋ฐฐ๊ฒฝ ์งํ๊ฒ(#cdd7e3)ยท๊ธ์จ ํค์(ํ14.5/๊ฐํธ15px)+์๋จ border, ํ์ ์ ์ฒดํ ๋ค์ฌ์ฐ๊ธฐ๋ก ๊ณ์ธต ๊ตฌ๋ถ ๊ฐํ. 2์ฐจ ๋ณด์(2026-06-19): ๋ฐ์ฃผ~์ ๊ณ ๊ฒ์ด์ง๋ฅผ PFS UI ํค ํ์คํ ๋ก(์ํํธ ์ธ๋๊ณ #aab6f0โ๋ฏผํธ#7fd9bd, ์ง์ฐ=์ํํธ์ฝ๋ด, ์๋ฃ=์ํํธ๊ทธ๋ฆฐ, ์์ฐจ๋ง์ปค=์ํํธ์ค๋ ์ง#fb923c โ ์์ ํํผ). ํ์๋ผ์ธ ์์ฐจ์ผ์ ์ค๋์ ์ฒ๋ผ ์ธ๋ก ์ ์ (์ฃผํฉ dashed)+๋ค์ด์(+๋ผ๋ฒจ)๋ก ํ๋ณ ๊ฐ์กฐ โ ์ ์ฒด๋ณ ๋ชจ๋์์ ํ๋ง๋ค(์ด์ ์ ํ์ฅ๋ณ ๊ทธ๋ฃน์๋ง), ํ์ฅ๋ณ์ ๊ทธ๋ฃน~ํ์ํ ์ฐ์ ์ ์ . ๊ฐ์ ํ v3(..._v3.html, GPT 2์ฐจ ์์ + frontend-design ์คํฌ ๋ฐ์, 2026-06-19): GPT๊ฐ v2 ์ฝ๋ ์ง์ ์ฝ๊ณ P0/P1 ์ ์ โ โ ๊ทธ๋ฃน ํค๋ ์ํ ์์ฝ(์์ฐจ Dยท๋ฒํผยท๋ฏธ์ ๊ณ N/Mยท์์ฌ๋ณ open/totalยท๋ณ๋ชฉ ๋ฐ์ฃผ์ฒ) โกํ ํด๋ฆญ ํผ์นจ+์กฐ์น ๋ฒํผ(์ ๊ณ ์ผ ์ผ๊ด๋ณ๊ฒฝ/์๋ฃ/์๋ณธ) โข์ ๋ ฌ ๊ฐ๋ฅ ํค๋(์ํ๋/์ ๊ณ ์์ /์์ฐจ์ผ/์์ฐจ๋ฒํผ)+sticky ํค๋ยทํต์ฌ 2์ด+์คํฌ๋กค โฃํ์ฑ ํํฐ ์นฉ+๊ฒฐ๊ณผ ์นด์ดํธ โคKPI/ํํฐ ๋ฒ์ ์ ํฉ(shipSoon/buf/delay์ !done) โฅ๊ฒ์(/๋จ์ถํค)ยทlocalStorage ์ ์ฅ. frontend-design ๋ฐ์: ์ ์ฒดํ ๋นจ๊ฐโ์ข์ธก accent bar+์ ์ ๋ฐฐ๊ฒฝ(์์ฝ ๋๋น)ยท์ด๋ชจ์ง ์ ์ (CSS ์ )ยทtabular-numsยท์ ์ ๋ staggered ๋ก๋. frontend-design ํ๋ฌ๊ทธ์ธ์ ์ค์น๋จ(๋นํ์ฑ)ยทsettings ์๋ํ ๊ธ ์ฐจ๋จ๋์ด ์คํฌ ๊ฐ์ด๋๋ฅผ ๋์คํฌ์์ ์ฝ์ด ์ง์ ์ ์ฉ(์์ํ์ฑ์ /plugin). ํ์ผ v1(10์คํ์ผ)ยทv2(์ถ์ฒ์)ยทv3(๊ฐ์ ํ=์ต์ ). v3 ์ถ๊ฐ ๋ณด์(2026-06-19): โ ํ์ฅ๋ช ์ ๊ฐ๊ตฌ์ ์ฒด ์นฉ(amber, ํ์ฅ๋ณ ๊ทธ๋ฃนํค๋ยท๋ฐ์ฃผ์ฒ๋ณ ํยท๊ฐํธ ๋ผ๋ฒจ) โก์๋จ ํํฐ 2ํ ํตํฉ(๋ถ๋ฅ+์์ฌ+๊ฒ์+๋ทฐํ ๊ธ / ๋น ๋ฅธํํฐ โ ๋์ด ์ ์ฝ) โขv3 ๊ฐ์ ์๋ด๋ฐฐ๋(gptbox)ยท์ ๋ชฉ ๋ฌธ๊ตฌ ์ญ์ (์ค๋ฌผ ๋์ ๋ฐฉ์ง) โฃํ ์ด๋ธ ํค๋ sticky ๊ณ ์ ํ์ธ โค์์ฌ R/E/S ๋ฒํผ ๋์ด ํต์ผ(34px inline-flex) โฅ๊ฒ์ ์ ์ฒด ์ปฌ๋ผ ํตํฉ. ์ค์ ๊ตฌํ ์ ์ถ๊ฐ ์๊ตฌ(ํํ): ๊ธฐ์กด ๋ฐ์ฃผ์ ์ ๋ฆฌ ํ์ด์ง์๋ ์ ์ฒด ์ปฌ๋ผ ํตํฉ ์ธ๋ผ์ธ ๊ฒ์์ฐฝ ์ ์ค(ํ์ฌ ์์ธํํฐ ๋ชจ๋ฌ์ ํตํฉ๊ฒ์์ ์ธ๋ผ์ธ ๋ ธ์ถ). QA helper ๊ฒ์ฆ๋๊ตฌ ๋ถ์ฐฉ(2026-06-19): ๊ธฐ์กดweb/static/{css,js}/qa_helper.*(์ ํ์ด์ง ๊ณต์ฉ, element pickerโ์ฝ๋ฉํธ ์ฌ์ด๋๋ฐโ์ฑํฐ์ฉ ๋ณต์ฌ)๋ฅผ ๋ชฉ์ ์์ ์๋๊ฒฝ๋ก(../web/static/...)๋ก ์ฐธ์กฐ โ ์ค์ ํ์ด์ง์ ๋์ผ ๋์. ํํ๊ฐ ์ด๊ฑธ๋ก ์์ ์ฌํญ ์ ๋ฆฌํด ์ ๋ฌ ์์ (์ฐ์ธก ์๋จ ๐ ํ ๊ธ). localStorage ํคpfs.qa.items.v1(file:// ์ค๋ฆฌ์ง ๋ถ๋ฆฌ๋ผ ์ด์๊ณผ ๋ฌด์ถฉ๋). QA helper 1์ฐจ ์์ 7๊ฑด ๋ฐ์(2026-06-19): โ ๊ทธ๋ฃนํค๋ ๋ถ๊ฐ์ ๋ณด(์์ฐจ/๋ฒํผ/๋ฏธ์ ๊ณ /๋ณ๋ชฉ) ์ญ์ โ์ ์ฒด์นฉ+ํ์ฅ๋ช +์ํ๋๋ฐฐ์ง๋ง โก๋ฐ์ฃผ์ผ ํ๋ ์ง(26.6.16(ํ)) โข์์ฐจ๋ฒํผ ์ปฌ๋ผ ์ญ์ (์์ฐจ D-day์ ์ค๋ณต, KPI/ํํฐ๋ ์ ์ง) โฃ๋ฏธ์๋ฃ ์ปฌ๋ผ ์ญ์ โํ์๋ผ์ธ ์ปฌ๋ผ์ ์๋ฃ์๋/์ด ์นด์ดํฐ+๊ฒ์ด์ง ํตํฉ โค๊ฒ์ ๋จ์ถํค(/) ์ญ์ โฅ์ด์ค ์คํฌ๋กค ์ ๊ฑฐ(์ฑ์ ธ: body overflow hidden+wrap 100vh flex, ํ/๊ฐํธ๋ง ๋จ์ผ ์คํฌ๋กค)+์ปฌ๋ผ ํค๋ sticky ๊ณ ์ (ํ์๋ผ์ธ ๋์ผ) โฆ๋น ๋ฅธํํฐ/KPI ํ ๋ฒ์ ํ ์กฐ๊ฑด๋ง(๋ผ๋์ค์, AND๋ก ๋ฐ์ดํฐ ๋น๋ ๋ฌธ์ ํด์). ํ ์คํธ ๋ฐฐํฌ(2026-06-19): ๊ฒํ ์ฉ์ผ๋ก v3 ๋ชฉ์ ์ ํ ์คํธ ์๋ฒ ์ ์ ํ์ด์ง๋ก ๋ฐฐํฌ โhttp://pfs-test.poin.co.kr:8001/static/mockup/orderpaper_schedule_mockup_v3.html(๋ฌด๋ก๊ทธ์ธ ์ ๊ทผ). canonical ํธ์ง๋ณธ=pfs/mockups/(gitignore), ์๋ฒ ์ฌ๋ณธ=web/static/mockup/(qa_helper ์ฐธ์กฐ๋ฅผ../web/static/โ../css/ยท../js/๋ก ๊ต์ฒดํด ์๋ฒยท๋ก์ปฌ ์์ชฝ ๋์, masterbf3ccaa). ํฅํ ๋ชฉ์ ์์ ์ ๊ฐ์ ๋ฐฉ์ ์ฌ๋๊ธฐํ. ๋ค์=ํํ ์ถ๊ฐ QA ์์ โ ๋ฐ์, ์ดํ ์ค์ ํญ ๊ตฌํ(op-* ๋ค์์คํ์ด์คยทitem_receive_date ๊ธฐ์ค ์ง๊ณยท๋๋ฝ๋ฐ์ดํฐ ์ ๋ณด๋๋ฝ rankยท์ธ๋ผ์ธ ๊ฒ์)(๋ฐ์ดํฐ=orderpaper/all-items+field ์์ฐจ์ผ, ์ ๊ณ ๊ธฐ์ค=item_receive_date||receive_date, ๋ธ๋ก ๋ฆฌ์คํฌ=๋ฏธ์๋ฃ ์ต์ข ์ ๊ณ ์์ ์ผ). - C:\dev ๋ฃจํธ ๋น-pfs ํ์ผ(
dwg_convert.exeยทpoinwg.confยท_notify_*ยทPDFยท์ ํฌ) ์ด๋ ์์น ๋ฏธ์ โ ํํ ๊ฒฐ์ ๋๊ธฐ. - ์ถํ 'AL' ์์ฌ ๊ตฌ๋ถ ์ ์ค ์ ์ฃ์ง๋ฐยทAA-xxx ํ๋กํ์ผ์ ๊ทธ์ชฝ์ผ๋ก(์ฃ์ง์ ๋์ผ ๋ฐฉ์).
๋ฏธ๊ฒฐ ยท ๋ค์ ๋จ๊ณ
- ๊ฒฌ์ ํ์
SSOT โ ์ด์ DB ์์ฌ 2๊ฑด(์ํ์์
ยท๋ณ๋ ์น์ธ ๋๊ธฐ): โ ํ์ด์ฆ A ์๋ โ ์ด์ DB ์ ์ฉ ์คํ ๊ธฐ๋ก ์์(๋ฏธ์ ์ฉ ์ถ์ ยทํ์ธ ํ์) โก#7 ๋ง๊ฐ์ฌ ์จ๊น E โ ์ด์DB ui_column_setting finish 1โ0(ํ
์คํธ D๋ ์๋ฃยทํํ ํ์ธ๋จ). ์ฝ๋(ํ์ด์ฆ AยทB ๋ณธ์ฒด+ํ์ 5๊ฑด)๋
a523d39๋ก ์ด์ ๋ฐ์ ์๋ฃ โ ์ด๋ ฅ = archive.md /session-2026-06-10-phaseB-*.md. ์ง์๋ฌธCODI_estimate_type_order_phaseA_integrated.md(์คํ ์๋ฃ)ยท๊ตฌ..._fieldtype_seed.md๋ ํ๊ธฐยท์คํ๊ธ์ง. - estimate 2/3์ฐจ โ ์ธ์ํผ ์ฌ์์ฑ, ๋จ๊ฐํธ์ง ํ์ด์ง, ์ผ๋ ๋ฒค ๊ฐ๊ฒฉํ ๋ง์ด๊ทธ๋ ์ด์ .
- ์ฌ๋ฃ ์ง๊ณ product ํ ์ด๋ธ โ ๋ณด๋ฅ.
- ์์ฌ ์ ๋ฆฌ: ์ด์ ๊ฒ์ฆ์ฉ ๊ฒฌ์ 705 ์ํํธ ์ญ์ (์น์ธ ํ). ๋์ฅ ์ด๋ฏธ์ง๋ฅผ ๊ณต๊ธ์ ์ ๋ณด ์ด๋ฏธ์ง์ 1์ฅ ํฉ์ฑ(์๋ณธ ๊ณ ํด์๋ ํ๋ณด ํ).
๊ธฐ๋ณธ ์์ ์์คํ (ํญ์ ์ ์ฉ)
โ ์ง๋จ(์ฑํฐยท๋ถํ์ค์ฑ0) โ โก ํ์ ๋ณ๊ฒฝ ๋ฌถ์์์(์ฝ๋ .md, ๊ฒ์ฆ ๋๋ ๊ฒ๋ง) โ โข ์ํ์์
๋ถ๋ฆฌ์น์ธ. ์ฝ๋ ์ง์๋ฌธ: .mdยท์๋จ ์ฒซ ์ค "โฆํ์ธ ์์ด ๋ฐ๋ก ์งํํ์ธ์."ยท๋ณ๊ฒฝ ์ ์ฝ๋+์ด์ ์ฃผ์. ์ํ์์
(๋๋์ญ์ ยท์ด์๋ฐฐํฌยทDB๋ณ๊ฒฝยท๊ถํ๋ณ๊ฒฝ)์ ๋ณ๋ ์น์ธ. ์ธ์
๊ธฐ๋ก: session-YYYY-MM-DD-<์ฌ๋ฌ๊ทธ>.md ๊ฐ๋ณ ๋ฌธ์(register_doc.py --category archive) + sessions.md ์ธ๋ฑ์ค ๋งํฌ. ์์
ํจ์ = traps.md.
์ต์ข ๊ฐฑ์ : 2026-07-27 (KST) โ handoff ์๋ฃ์ด๋ ฅ 2์ฐจ ์ด๊ด(โ 11ํญ๋ชฉ 8,167์ โ archive.md). ์ฌ๊ธฐ์ NOWยทํ์ ์ฌ์คยท๋ฏธ๊ฒฐ๋ง ๋๋ค.