From 60168eb1d2dad95267b09cebc7c40e1b6fa7c258 Mon Sep 17 00:00:00 2001 From: b17301 Date: Fri, 10 Apr 2026 19:11:15 +0900 Subject: [PATCH] Polish project detail modals and data flows --- data.db | Bin 40525824 -> 40525824 bytes main.py | 570 +++++++++++- templates/annual_summary.html | 4 + templates/base.html | 41 +- templates/dashboard.html | 4 + templates/index.html | 35 + templates/projects.html | 1565 ++++++++++++++++++++++++++++++++- 7 files changed, 2166 insertions(+), 53 deletions(-) diff --git a/data.db b/data.db index 2205d0ef8080af4ba0e9a66ce8c6d990b4e289e5..858432b18c52128e0f87bd8e68dc868021a5a224 100644 GIT binary patch delta 253763 zcmbq+2bdJa)^<Hm=g*r zM%bCz*+o%NQ89BB1+!lN_pQ^_)3rc<-}C+KQ#G8oPgPe}Jay_+)ucu9I!%I`(yQY? zmbK;maC0on>Irw`&4X%u|2#hC-pzVHX(g&|w$eYRKTW@uzAwF7)y?U#=}oJCt$MTS zlZ9jZUF!QYvT!_pE(qUx^Y;C=J1TvJ)fq7u|GLHl+XcpsAAj7L<0qVY<{8JGI^m?# z&#@jq@zzha?;7sEu751B|E>LY=#fu9aEL#0Yp)&l^4)*y*c~Gp5 zht0x!_YMSh^5-AF=4W5GrcZXb`jZ`eaDKP|To5h<7lw<#Md4y_akvCr5-tT-1($~F z0M`+26Sz)ro#DE`b%pB&*B!10Tu-=OaJ}I+h3f;i8C+kuesG(^Z2{LGZUEeta9hC* zgxeZ!8@O%Z2ElCyw>=!wo`K84Rm0W5)xy=m)x$NwHNp*s+YxRjxFK*m!|ejME8I}H z-QaeI+XHS-xV_-^hT8{j7~H;a`@!uGcL3aha0kI13^yF^5V%9(4ucy3cR1V;a7V(8 zgc}7n8ty2#qv4K$I~MLZxG`{J;f{wp0q#V&li*Hg~*odI_y z+<3UN;Le6S2W|q~xp3#foey^b+=Xx#!CeeD5$+PWOW|^Gli)6cyBw|w?h3do;jV(a z8g4S&HE`F$T?cnP+zoIy!rcTn1@30JTi|Ymn+kUu-0g7F;HJaf0e2_dU2rqt?uNSu zE)O>oZWi3VaQDH@hMNO-KimUwbK&N}JqY&@+{18>zǻ~Fig$KjrUdlK#`xToQs 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 OOb3YYc&J}w^8PQx#-?=u delta 219113 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

JErHnfjH2D(wuLeDLWbCf`d4Y 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

q*C&fexyK7V&2}a?Fp_75a4J z3^meiVW9sTApgs2|k50n;yha^m%~EhF@3Usb9?u+?{wRHZ>YYSOYF7N=#G&}I?8TW6 zGJ7a@U+kC2-Irny_k1Fj+?AY@+Zx}On}LK3|JR>M42*A!ua3`*kBhw*+ZkIMyEJx; z^`Z5Qb)PlgI$r%*bwBXAvnN_|2Hz`QcbyvvXB5ndJvi@r1`j z-qK*k)LuQqG|nyc9z>{#Ii5j73uoO!#D;qsiWwJ5tY9M$(}YP+52*)Ejl>s)D{yPu zGKrz(+54fP&8lh4M5PJxecUfm3J40=4*Wh4vW}HkObt+Tx9|a$Uv{3thxCw#GVs}P zhBcIokOI8}8 zJvba~;X}UZCqmYPTb)|t49`(AJnPqBajyL~TiPY!V{P^jV@Tf$$<>%%Wj7K58(T&j z=FpK8$Kl}RH8WQZeRwvjyZ&;>I;J6@OoN8K&Qn{H85e5iN> z@mUWdbfmL)+l-*z94oykoP^$tt~n!eck#%NWmy*b#+4%Wh>n;iD_RPHTgCb|pT;vpm~q8r;~nN0q$^uBZ{y%4E`zL?yW zoSFDr;)jW~iSrW;@o&Xd?4{TZv6S^y>u`KJ=qGFbvAk$~!8(C%Ye&Im*UzR6OmY~m zu40 zaE2dDgno7zf_M>WX-1&1#J=mI&n61c7wiz25uYL{gP?WyJ0=XB^CPeUK!^#W{PcIR z@77+}75{!Uz8_OlfOoq&NG z`yw2De3uwkCxFwJo;UzwCP&Ayd4sPpKuO5@wcSM!^H6Nb zt5D|;#(CPSHoSHq9EcCcLCYwCXT&$$zRb$}`8+G(_|?z19JYYcW)pJDA$a{%IMmYqGgWEUH`GtXf&o`?YQ@kSNX4Rwf$(4g_`t zQ}MrLI_@3w$nn-&F}G#M)?cT_i}mq~)p6EDel)e=T|{uvBdM$FmUtgVMKspZ_+R5k z#J(3hEf%wWVokKVtSe$S$KHznAbwAx33{x4I2Dmy^rN;%`WaE9TKB9+>Le5Sf5@dkaa|VF=!8aD3o$>v@6kl)G0lu>8OmLKYdc?G~=e(HT(m z5%C;F(FcxqBo^ilyw!-DRen>c!fSswZ%i&=hz-*)gLfx{Oc1GH&DG2NB5zU*Bm-}d z%IgJ+vc(C65Y!Lhinz+K(For45J=#f79!C~v`HanE+HlG2)MdOSi6IExSOp`APfPO zyhl-%)BMizKD^fa27TZJTi)=ri$qyP`9Qrqo=g*x4W8gMB7JbUpsz&e0C30Ibm2Qo zJ671!B_a|Hnd-NTsS|8p=hc!vG zUFzqlp3KDb`|0iJJG1d@Jd!p=%9O806|*L?^g^N9!*@V5ZIHgX7aulJ`{seFSikr1?H8Cqy%Dm}2+Hb2`*f!`heg|H_7r7W zU|Hido6!a1RMSIB7>zW65jiu)9yH=5I#`S>iL&rh5Bb5K$ON^m4QEH*puG8{=2rPz zn6V!vEk!O(%B~xoGqQKXo*6!6%x;a|@G&yVnuMt)yEU=B0F?(h^ZZ7;QoLlhHo(YC zG^P<@zCXc=c~ES$#e^p}voe}Iv!#Ib7`l$8v5SUddja8?qbjUh&?9SN5h>~@87&z}kf<{nLALGLZz&E1$L2G1kSN)2Fa|zPVp_^3H3JOI z!enqUJrwL1U+cs&>a3%}4 zxDAedC$KSN$!$J~l<-Kv7<`owmP`$n?L?5I9<}?e+1>?a_ek!j#u51lvnX~zJ>k+_ zyN~?fv5k1qboVg+Sb4&999?Uh&85SMC62<)ZcdmT$Ph&?n2{CkycW(WQzX%3L`7Xz zR7?lpkXQ-5jd;+>*_=X7OPWo9N8l8gk~KJXX?5eq`GBVc8ZChhfbgBpmo-(+vFhOY| z{dUp2!hdFAgdN#!?x8M1&WwRhOC1=hRt HDE9vXMDJzp diff --git a/main.py b/main.py index 9fadeda..1ca20c1 100644 --- a/main.py +++ b/main.py @@ -2,6 +2,7 @@ import os import logging import json import re +import time import zipfile from datetime import date, datetime from functools import lru_cache @@ -21,6 +22,11 @@ from sqlalchemy import create_engine, event, text logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) +_HEALTH_PAYLOAD_CACHE: dict[str, Any] = { + "expires_at": 0.0, + "payload": None, +} + app = FastAPI() BASE_DIR = Path(__file__).resolve().parent @@ -636,6 +642,27 @@ def init_db() -> None: """ ) ) + conn.execute( + text( + """ + CREATE TABLE IF NOT EXISTS project_analysis_settings ( + support_dept_code TEXT NOT NULL PRIMARY KEY, + detail_note TEXT DEFAULT '', + inactive_related_codes_json TEXT DEFAULT '[]', + labor_joint_exempt INTEGER DEFAULT 0, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + ) + """ + ) + ) + conn.execute( + text( + """ + CREATE INDEX IF NOT EXISTS idx_project_analysis_settings_code + ON project_analysis_settings (support_dept_code) + """ + ) + ) page_state_columns_before = { row[1] for row in conn.execute(text("PRAGMA table_info(project_page_state)")).fetchall() @@ -3339,6 +3366,16 @@ def normalize_account_display(account_code: Any, account_name: Any) -> tuple[str return normalized_code, normalized_name, label +def build_transaction_posting_display(voucher_number: Any, posting_date: Any) -> str: + year, month, day = extract_period(normalize_text(voucher_number), normalize_text(posting_date)) + if year and month and day: + return f"{year:04d}-{month:02d}-{day:02d}" + parsed_date = normalize_date_text(posting_date) + if re.match(r"^\d{4}-\d{2}-\d{2}$", parsed_date): + return parsed_date + return "-" + + def get_data_version() -> str: with engine.begin() as conn: transaction_updated = conn.execute(text("SELECT MAX(updated_at) FROM transactions")).scalar() @@ -3358,12 +3395,20 @@ def get_data_version() -> str: return max((version for version in versions if version), default="") -def build_health_payload() -> dict[str, str]: - return { +def build_health_payload(force: bool = False) -> dict[str, str]: + now = time.monotonic() + cached_payload = _HEALTH_PAYLOAD_CACHE.get("payload") + if not force and cached_payload and now < float(_HEALTH_PAYLOAD_CACHE.get("expires_at") or 0.0): + return dict(cached_payload) + + payload = { "status": "ok", "server_time": datetime.now().isoformat(timespec="seconds"), "data_version": get_data_version(), } + _HEALTH_PAYLOAD_CACHE["payload"] = payload + _HEALTH_PAYLOAD_CACHE["expires_at"] = now + 2.0 + return dict(payload) def check_record_revision(conn: Any, table_name: str, key_column: str, key_value: Any, edit_revision: str) -> None: @@ -3953,6 +3998,83 @@ def save_project_comparison_note(support_dept_code: str | None, item_key: str | ) +def get_project_analysis_settings_map() -> dict[str, dict[str, object]]: + with engine.begin() as conn: + rows = conn.execute( + text( + """ + SELECT + support_dept_code, + COALESCE(detail_note, '') AS detail_note, + COALESCE(inactive_related_codes_json, '[]') AS inactive_related_codes_json, + COALESCE(labor_joint_exempt, 0) AS labor_joint_exempt + FROM project_analysis_settings + WHERE COALESCE(support_dept_code, '') <> '' + """ + ) + ).mappings().all() + result: dict[str, dict[str, object]] = {} + for row in rows: + code = normalize_text(row.get("support_dept_code")) + if not code: + continue + try: + inactive_codes = json.loads(row.get("inactive_related_codes_json") or "[]") + except Exception: + inactive_codes = [] + result[code] = { + "detail_note": normalize_text(row.get("detail_note")), + "inactive_related_codes": [ + normalize_text(value) for value in (inactive_codes or []) if normalize_text(value) + ], + "labor_joint_exempt": bool(row.get("labor_joint_exempt")), + } + return result + + +def save_project_analysis_settings( + support_dept_code: str | None, + detail_note: str | None = None, + inactive_related_codes: list[str] | None = None, + labor_joint_exempt: bool | None = None, +) -> None: + code = normalize_text(support_dept_code) + if not code: + return + current = get_project_analysis_settings_map().get(code, {}) + next_detail_note = normalize_text(detail_note) if detail_note is not None else normalize_text(current.get("detail_note")) + current_inactive = current.get("inactive_related_codes", []) + next_inactive_related_codes = [ + normalize_text(value) + for value in (inactive_related_codes if inactive_related_codes is not None else current_inactive) + if normalize_text(value) + ] + next_labor_joint_exempt = bool(labor_joint_exempt) if labor_joint_exempt is not None else bool(current.get("labor_joint_exempt")) + with engine.begin() as conn: + conn.execute( + text( + """ + INSERT INTO project_analysis_settings ( + support_dept_code, detail_note, inactive_related_codes_json, labor_joint_exempt, updated_at + ) VALUES ( + :support_dept_code, :detail_note, :inactive_related_codes_json, :labor_joint_exempt, CURRENT_TIMESTAMP + ) + ON CONFLICT(support_dept_code) DO UPDATE SET + detail_note = excluded.detail_note, + inactive_related_codes_json = excluded.inactive_related_codes_json, + labor_joint_exempt = excluded.labor_joint_exempt, + updated_at = CURRENT_TIMESTAMP + """ + ), + { + "support_dept_code": code, + "detail_note": next_detail_note, + "inactive_related_codes_json": json.dumps(next_inactive_related_codes, ensure_ascii=False), + "labor_joint_exempt": 1 if next_labor_joint_exempt else 0, + }, + ) + + def get_project_status_for_edit(support_dept_code: str | None) -> dict[str, Any]: contract_info_map = get_project_contract_info_map() billing_summary_map = get_project_billing_summary_map() @@ -4931,12 +5053,128 @@ def get_project_account_breakdowns(selected_year: int | None) -> dict[str, dict[ normalized_result[code] = {} for kind, entries in buckets.items(): normalized_result[code][kind] = [ - {"label": label, "amount": amount} + { + "label": label, + "amount": amount, + "account_code": label.split(" · ", 1)[0] if " · " in label else "", + "account_name": label.split(" · ", 1)[1] if " · " in label else label, + } for label, amount in sorted(entries.items(), key=lambda item: item[1], reverse=True) ] return normalized_result +def parse_support_dept_codes_param(raw_codes: Any, fallback_code: Any = "") -> list[str]: + values: list[str] = [] + for chunk in re.split(r"[\s,]+", normalize_text(raw_codes)): + normalized = normalize_text(chunk) + if normalized and normalized not in values: + values.append(normalized) + normalized_fallback = normalize_text(fallback_code) + if normalized_fallback and normalized_fallback not in values: + values.insert(0, normalized_fallback) + return values + + +def build_in_clause(prefix: str, values: list[str]) -> tuple[str, dict[str, Any]]: + params: dict[str, Any] = {} + placeholders: list[str] = [] + for index, value in enumerate(values): + key = f"{prefix}_{index}" + placeholders.append(f":{key}") + params[key] = value + return ", ".join(placeholders), params + + +def fetch_project_expense_transaction_rows( + codes: list[str], + expense_group: str = "", + account_label: str = "", +) -> list[dict[str, Any]]: + normalized_codes = [normalize_text(code) for code in codes if normalize_text(code)] + if not normalized_codes: + return [] + in_clause, code_params = build_in_clause("project_code", normalized_codes) + query = text( + f""" + SELECT + COALESCE(voucher_number, '') AS voucher_number, + COALESCE(posting_date, '') AS posting_date, + COALESCE(partner_name, '') AS partner_name, + COALESCE(partner_code, '') AS partner_code, + COALESCE(cost_dept_name, '') AS cost_dept_name, + COALESCE(support_dept_code, '') AS support_dept_code, + COALESCE(support_dept_name, '') AS support_dept_name, + COALESCE(account_code, '') AS account_code, + COALESCE(account_name, '') AS account_name, + amount + FROM transactions + WHERE support_dept_code IN ({in_clause}) + AND accounting_category = '원가' + ORDER BY posting_date DESC, voucher_number DESC, partner_name, cost_dept_name, account_code + """ + ) + with engine.begin() as conn: + rows = conn.execute(query, code_params).mappings().all() + normalized_group = normalize_text(expense_group).lower() + normalized_account_label = normalize_text(account_label) + result: list[dict[str, Any]] = [] + for row in rows: + normalized_code, normalized_name, normalized_label = normalize_account_display( + row["account_code"], + row["account_name"], + ) + is_design_outsource = "기술협력비" in normalized_label or "기술협력비" in normalized_name + if normalized_group == "outsource" and not is_design_outsource: + continue + if normalized_group == "overhead" and is_design_outsource: + continue + if normalized_account_label and normalized_label != normalized_account_label: + continue + result.append( + { + "posting_date": build_transaction_posting_display(row["voucher_number"], row["posting_date"]), + "voucher_number": normalize_text(row["voucher_number"]), + "partner_name": normalize_text(row["partner_name"]), + "partner_code": normalize_text(row["partner_code"]), + "cost_dept_name": normalize_text(row["cost_dept_name"]), + "support_dept_code": normalize_text(row["support_dept_code"]), + "support_dept_name": normalize_text(row["support_dept_name"]), + "account_code": normalized_code, + "account_name": normalized_name, + "amount": int(round(float(row["amount"] or 0))), + } + ) + return result + + +def get_project_expense_date_range(codes: list[str]) -> tuple[str, str]: + normalized_codes = [normalize_text(code) for code in (codes or []) if normalize_text(code)] + if not normalized_codes: + return "", "" + in_clause, code_params = build_in_clause("project_code", normalized_codes) + query = text( + f""" + SELECT + COALESCE(voucher_number, '') AS voucher_number, + COALESCE(posting_date, '') AS posting_date + FROM transactions + WHERE support_dept_code IN ({in_clause}) + AND accounting_category = '원가' + """ + ) + dates: list[str] = [] + with engine.begin() as conn: + rows = conn.execute(query, code_params).mappings().all() + for row in rows: + display = build_transaction_posting_display(row["voucher_number"], row["posting_date"]) + if re.match(r"^\d{4}-\d{2}-\d{2}$", display): + dates.append(display) + if not dates: + return "", "" + return min(dates), max(dates) + + def get_recent_transactions(limit: int = 50) -> list[dict[str, Any]]: with engine.begin() as conn: rows = conn.execute( @@ -5862,6 +6100,7 @@ def render_projects_page( "project_account_breakdowns": get_project_account_breakdowns(selected_year), "project_status_rows": get_project_status_rows(), "project_comparison_notes": get_project_comparison_notes_map(), + "project_analysis_settings": get_project_analysis_settings_map(), "project_edit": get_project_status_for_edit(edit_code), "project_focus_code": normalize_text(focus_code), "project_page_state": get_project_page_state(), @@ -6049,6 +6288,329 @@ async def project_comparison_note_save(request: Request): return JSONResponse(content={"error": str(exc)}, status_code=500) +@app.post("/projects/analysis-settings") +async def project_analysis_settings_save(request: Request): + try: + payload = await request.json() + if not isinstance(payload, dict): + raise ValueError("잘못된 프로젝트 상세 설정 형식입니다.") + inactive_related_codes = payload.get("inactive_related_codes") + if inactive_related_codes is not None and not isinstance(inactive_related_codes, list): + raise ValueError("제외 연관 프로젝트 형식이 올바르지 않습니다.") + save_project_analysis_settings( + payload.get("support_dept_code"), + detail_note=payload.get("detail_note") if "detail_note" in payload else None, + inactive_related_codes=inactive_related_codes if isinstance(inactive_related_codes, list) else None, + labor_joint_exempt=payload.get("labor_joint_exempt") if "labor_joint_exempt" in payload else None, + ) + return JSONResponse(content={"status": "ok"}) + except Exception as exc: + logger.exception("프로젝트 상세 설정 저장 에러: %s", exc) + return JSONResponse(content={"error": str(exc)}, status_code=500) + + +@app.get("/projects/uncontracted-detail-transactions") +async def project_uncontracted_detail_transactions( + support_dept_code: str = "", + kind: str = "expense", + detail_type: str = "", + year: int | None = None, + month: int | None = None, + category: str | None = None, + start_year: int | None = None, + end_year: int | None = None, +): + try: + normalized_code = normalize_text(support_dept_code) + if not normalized_code: + raise ValueError("프로젝트 코드가 필요합니다.") + normalized_kind = normalize_text(kind).lower() + if normalized_kind not in {"expense", "revenue"}: + raise ValueError("조회 종류가 올바르지 않습니다.") + normalized_detail_type = normalize_text(detail_type).lower() + if normalized_detail_type not in {"year", "month", "category"}: + raise ValueError("세부 조회 형식이 올바르지 않습니다.") + + filters = ["support_dept_code = :support_dept_code"] + params: dict[str, Any] = {"support_dept_code": normalized_code} + + if normalized_kind == "expense": + filters.append("accounting_category IN ('원가', '판관비')") + else: + filters.append(REVENUE_SQL) + + if normalized_detail_type == "month": + if not year or not month: + raise ValueError("월별 세부 조회에는 연도와 월이 필요합니다.") + filters.append("year = :year") + filters.append("month = :month") + params["year"] = int(year) + params["month"] = int(month) + elif normalized_detail_type == "year": + if not year: + raise ValueError("연도별 세부 조회에는 연도가 필요합니다.") + filters.append("year = :year") + params["year"] = int(year) + else: + # category 상세는 프로젝트 생성 시기와 무관하게 선택된 연도 구간 안의 발생 전표를 모두 보여준다. + if start_year: + filters.append("year >= :start_year") + params["start_year"] = int(start_year) + if end_year: + filters.append("year <= :end_year") + params["end_year"] = int(end_year) + if category: + params["category"] = normalize_text(category) + + query = text( + f""" + SELECT + COALESCE(voucher_number, '') AS voucher_number, + COALESCE(posting_date, '') AS posting_date, + COALESCE(partner_name, '') AS partner_name, + COALESCE(partner_code, '') AS partner_code, + COALESCE(cost_dept_name, '') AS cost_dept_name, + COALESCE(support_dept_code, '') AS support_dept_code, + COALESCE(support_dept_name, '') AS support_dept_name, + COALESCE(account_code, '') AS account_code, + COALESCE(account_name, '') AS account_name, + amount + FROM transactions + WHERE {' AND '.join(filters)} + ORDER BY posting_date DESC, voucher_number DESC, partner_name, cost_dept_name, account_code + """ + ) + + with engine.begin() as conn: + rows = [ + { + "posting_date": build_transaction_posting_display(row["voucher_number"], row["posting_date"]), + "voucher_number": normalize_text(row["voucher_number"]), + "partner_name": normalize_text(row["partner_name"]), + "partner_code": normalize_text(row["partner_code"]), + "cost_dept_name": normalize_text(row["cost_dept_name"]), + "support_dept_code": normalize_text(row["support_dept_code"]), + "support_dept_name": normalize_text(row["support_dept_name"]), + "account_code": normalize_text(row["account_code"]), + "account_name": normalize_text(row["account_name"]), + "amount": int(round(float(row["amount"] or 0))), + } + for row in conn.execute(query, params).mappings() + ] + + return JSONResponse( + content={ + "rows": rows, + "total_amount": sum(int(row["amount"] or 0) for row in rows), + "support_dept_code": normalized_code, + "kind": normalized_kind, + "detail_type": normalized_detail_type, + "category": normalize_text(category), + } + ) + except Exception as exc: + logger.exception("미계약 세부 거래내역 조회 에러: %s", exc) + return JSONResponse(content={"error": str(exc)}, status_code=500) + + +@app.get("/projects/uncontracted-vendor-transactions") +async def project_uncontracted_vendor_transactions( + partner_code: str = "", + partner_name: str = "", + start_year: int | None = None, + end_year: int | None = None, +): + try: + normalized_partner_code = normalize_text(partner_code) + normalized_partner_name = normalize_text(partner_name) + if not normalized_partner_code and not normalized_partner_name: + raise ValueError("거래처 정보가 필요합니다.") + + filters = ["accounting_category IN ('원가', '판관비')"] + params: dict[str, Any] = {} + + if start_year: + filters.append("year >= :start_year") + params["start_year"] = int(start_year) + if end_year: + filters.append("year <= :end_year") + params["end_year"] = int(end_year) + if normalized_partner_code: + filters.append("COALESCE(partner_code, '') = :partner_code") + params["partner_code"] = normalized_partner_code + else: + filters.append("COALESCE(partner_name, '') = :partner_name") + params["partner_name"] = normalized_partner_name + + query = text( + f""" + SELECT + COALESCE(voucher_number, '') AS voucher_number, + COALESCE(posting_date, '') AS posting_date, + COALESCE(partner_name, '') AS partner_name, + COALESCE(partner_code, '') AS partner_code, + COALESCE(cost_dept_name, '') AS cost_dept_name, + COALESCE(support_dept_code, '') AS support_dept_code, + COALESCE(support_dept_name, '') AS support_dept_name, + COALESCE(account_code, '') AS account_code, + COALESCE(account_name, '') AS account_name, + amount + FROM transactions + WHERE {' AND '.join(filters)} + ORDER BY posting_date DESC, voucher_number DESC, cost_dept_name, account_code + """ + ) + + with engine.begin() as conn: + rows = [ + { + "posting_date": build_transaction_posting_display(row["voucher_number"], row["posting_date"]), + "voucher_number": normalize_text(row["voucher_number"]), + "partner_name": normalize_text(row["partner_name"]), + "partner_code": normalize_text(row["partner_code"]), + "cost_dept_name": normalize_text(row["cost_dept_name"]), + "support_dept_code": normalize_text(row["support_dept_code"]), + "support_dept_name": normalize_text(row["support_dept_name"]), + "account_code": normalize_text(row["account_code"]), + "account_name": normalize_text(row["account_name"]), + "amount": int(round(float(row["amount"] or 0))), + } + for row in conn.execute(query, params).mappings() + ] + + return JSONResponse( + content={ + "rows": rows, + "total_amount": sum(int(row["amount"] or 0) for row in rows), + "partner_code": normalized_partner_code, + "partner_name": normalized_partner_name, + } + ) + except Exception as exc: + logger.exception("거래처별 미계약 비용 상세 조회 에러: %s", exc) + return JSONResponse(content={"error": str(exc)}, status_code=500) + + +@app.get("/projects/comparison-actual-transactions") +async def project_comparison_actual_transactions( + support_dept_code: str = "", + codes: str = "", + group: str = "", + account_label: str = "", +): + try: + normalized_codes = parse_support_dept_codes_param(codes, support_dept_code) + if not normalized_codes: + raise ValueError("프로젝트 코드가 필요합니다.") + rows = fetch_project_expense_transaction_rows( + normalized_codes, + expense_group=group, + account_label=account_label, + ) + return JSONResponse( + content={ + "rows": rows, + "total_amount": sum(int(row["amount"] or 0) for row in rows), + "support_dept_code": normalize_text(support_dept_code), + "codes": normalized_codes, + "group": normalize_text(group).lower(), + "account_label": normalize_text(account_label), + } + ) + except Exception as exc: + logger.exception("비교 실제 집행 세부 거래내역 조회 에러: %s", exc) + return JSONResponse(content={"error": str(exc)}, status_code=500) + + +@app.get("/projects/comparison-vendor-transactions") +async def project_comparison_vendor_transactions( + support_dept_code: str = "", + codes: str = "", + partner_code: str = "", + partner_name: str = "", + start_date: str = "", + end_date: str = "", +): + try: + normalized_codes = parse_support_dept_codes_param(codes, support_dept_code) + if not normalized_codes: + raise ValueError("프로젝트 코드가 필요합니다.") + normalized_partner_code = normalize_text(partner_code) + normalized_partner_name = normalize_text(partner_name) + if not normalized_partner_code and not normalized_partner_name: + raise ValueError("거래처 정보가 필요합니다.") + project_start_date, project_end_date = get_project_expense_date_range(normalized_codes) + effective_start_date = normalize_text(start_date) or project_start_date + effective_end_date = normalize_text(end_date) or project_end_date + + filters = ["accounting_category IN ('원가', '판관비')"] + params: dict[str, Any] = {} + if effective_start_date: + filters.append("COALESCE(posting_date, '') >= :start_date") + params["start_date"] = effective_start_date + if effective_end_date: + filters.append("COALESCE(posting_date, '') <= :end_date") + params["end_date"] = effective_end_date + if normalized_partner_code: + filters.append("COALESCE(partner_code, '') = :partner_code") + params["partner_code"] = normalized_partner_code + else: + filters.append("COALESCE(partner_name, '') = :partner_name") + params["partner_name"] = normalized_partner_name + + query = text( + f""" + SELECT + COALESCE(voucher_number, '') AS voucher_number, + COALESCE(posting_date, '') AS posting_date, + COALESCE(partner_name, '') AS partner_name, + COALESCE(partner_code, '') AS partner_code, + COALESCE(cost_dept_name, '') AS cost_dept_name, + COALESCE(support_dept_code, '') AS support_dept_code, + COALESCE(support_dept_name, '') AS support_dept_name, + COALESCE(account_code, '') AS account_code, + COALESCE(account_name, '') AS account_name, + amount + FROM transactions + WHERE {' AND '.join(filters)} + ORDER BY posting_date DESC, voucher_number DESC, cost_dept_name, account_code + """ + ) + with engine.begin() as conn: + filtered_rows = [ + { + "posting_date": build_transaction_posting_display(row["voucher_number"], row["posting_date"]), + "voucher_number": normalize_text(row["voucher_number"]), + "partner_name": normalize_text(row["partner_name"]), + "partner_code": normalize_text(row["partner_code"]), + "cost_dept_name": normalize_text(row["cost_dept_name"]), + "support_dept_code": normalize_text(row["support_dept_code"]), + "support_dept_name": normalize_text(row["support_dept_name"]), + "account_code": normalize_text(row["account_code"]), + "account_name": normalize_text(row["account_name"]), + "amount": int(round(float(row["amount"] or 0))), + } + for row in conn.execute(query, params).mappings() + ] + return JSONResponse( + content={ + "rows": filtered_rows, + "total_amount": sum(int(row["amount"] or 0) for row in filtered_rows), + "support_dept_code": normalize_text(support_dept_code), + "codes": normalized_codes, + "partner_code": normalized_partner_code, + "partner_name": normalized_partner_name, + "start_date": effective_start_date, + "end_date": effective_end_date, + "project_start_date": project_start_date, + "project_end_date": project_end_date, + } + ) + except Exception as exc: + logger.exception("비교 거래처 세부 조회 에러: %s", exc) + return JSONResponse(content={"error": str(exc)}, status_code=500) + + @app.get("/annual-summary") async def annual_summary(request: Request): try: @@ -6125,7 +6687,7 @@ async def save_project_json(request: Request): form_data = parse_project_form(await request.body()) save_project_status(form_data) code = normalize_text(form_data.get("support_dept_code")) - health_payload = build_health_payload() + health_payload = build_health_payload(force=True) return JSONResponse( content=jsonable_encoder( { diff --git a/templates/annual_summary.html b/templates/annual_summary.html index 90ed07b..c549ce9 100644 --- a/templates/annual_summary.html +++ b/templates/annual_summary.html @@ -61,6 +61,8 @@ border-radius: 16px; padding: 18px 20px 20px; box-shadow: inset 0 1px 0 rgba(255,255,255,0.92); + content-visibility: auto; + contain-intrinsic-size: 620px; } .chart-legend { @@ -92,6 +94,8 @@ grid-template-rows: auto auto 1fr; gap: 14px; min-height: 100%; + content-visibility: auto; + contain-intrinsic-size: 760px; } .metric-grid { diff --git a/templates/base.html b/templates/base.html index 6451db4..aaab3c0 100644 --- a/templates/base.html +++ b/templates/base.html @@ -28,6 +28,16 @@ padding: 0; } + ::selection { + background: rgba(59, 130, 246, 0.18); + color: var(--ink); + } + + ::-moz-selection { + background: rgba(59, 130, 246, 0.18); + color: var(--ink); + } + body { font-family: "SUIT", "Noto Sans KR", "Malgun Gothic", sans-serif; color: var(--ink); @@ -241,6 +251,19 @@ box-shadow: inset 0 1px 2px rgba(16, 24, 40, 0.03); } + select option { + color: var(--ink); + background: #ffffff; + } + + select option:checked, + select option:hover, + select option:focus { + color: var(--ink); + background: #eef2f6; + box-shadow: inset 0 0 0 999px #eef2f6; + } + textarea { min-height: 96px; resize: vertical; @@ -293,6 +316,15 @@ box-shadow: none; } + .button-secondary:hover, + .button-secondary:focus-visible { + background: #eef2f6; + color: #111827; + border-color: #d6dde5; + transform: none; + box-shadow: none; + } + .button-icon { width: 38px; height: 38px; @@ -646,6 +678,9 @@ } async function pollHealth() { + if (document.hidden) { + return; + } try { const response = await fetch(`/health?ts=${Date.now()}`, { cache: "no-store" }); if (!response.ok) throw new Error(`HTTP ${response.status}`); @@ -675,7 +710,11 @@ pollHealth(); } }); - window.setInterval(pollHealth, 15000); + window.setInterval(() => { + if (!document.hidden) { + pollHealth(); + } + }, 15000); })(); diff --git a/templates/dashboard.html b/templates/dashboard.html index 0e91590..425809c 100644 --- a/templates/dashboard.html +++ b/templates/dashboard.html @@ -106,6 +106,8 @@ .chart-panel { display: grid; gap: 12px; + content-visibility: auto; + contain-intrinsic-size: 480px; } .chart-panel-header { @@ -138,6 +140,8 @@ box-shadow: inset 0 1px 0 rgba(255,255,255,0.92); display: grid; gap: 12px; + content-visibility: auto; + contain-intrinsic-size: 420px; } .legend-box { diff --git a/templates/index.html b/templates/index.html index e0c976c..997e0d4 100644 --- a/templates/index.html +++ b/templates/index.html @@ -29,6 +29,16 @@ padding: 0; } + ::selection { + background: rgba(11, 107, 99, 0.16); + color: var(--ink); + } + + ::-moz-selection { + background: rgba(11, 107, 99, 0.16); + color: var(--ink); + } + body { font-family: "Noto Sans KR", "Malgun Gothic", sans-serif; color: var(--ink); @@ -138,6 +148,8 @@ border: 1px dashed #a7d1c8; border-radius: 18px; padding: 18px; + content-visibility: auto; + contain-intrinsic-size: 240px; } .upload-box p { @@ -182,6 +194,7 @@ input[type="number"], input[type="date"], input[type="file"], + select, textarea { width: 100%; border: 1px solid var(--line); @@ -197,12 +210,26 @@ } input:focus, + select:focus, textarea:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 4px rgba(11, 107, 99, 0.12); } + select option { + color: var(--ink); + background: var(--white); + } + + select option:checked, + select option:hover, + select option:focus { + color: var(--ink); + background: #e7f0f5; + box-shadow: inset 0 0 0 999px #e7f0f5; + } + .actions { display: flex; flex-wrap: wrap; @@ -236,11 +263,19 @@ color: #204257; } + .button-secondary:hover, + .button-secondary:focus-visible { + background: #dbeaf2; + color: #163345; + } + .table-wrap { overflow: auto; border: 1px solid var(--line); border-radius: 18px; background: var(--white); + content-visibility: auto; + contain-intrinsic-size: 360px; } table { diff --git a/templates/projects.html b/templates/projects.html index 783feeb..cfb7df6 100644 --- a/templates/projects.html +++ b/templates/projects.html @@ -493,6 +493,12 @@ align-items: center; } + .related-tag-stack { + display: grid; + gap: 10px; + width: 100%; + } + .related-tag-label { color: var(--muted); font-size: 12px; @@ -513,6 +519,10 @@ line-height: 1.2; } + .related-project-tag.is-muted { + opacity: 0.72; + } + .related-project-tag button { width: 18px; height: 18px; @@ -530,16 +540,33 @@ background: rgba(41, 72, 95, 0.14); } + .related-project-toggle { + font-weight: 900; + } + + .analysis-inline-note { + width: 100%; + min-height: 40px; + padding: 8px 10px; + border: 1px solid #d7dfe7; + border-radius: 12px; + background: #fff; + font: inherit; + color: var(--ink); + resize: vertical; + } + .related-modal-card { width: min(680px, 100%); max-height: min(70vh, 760px); - overflow: auto; + overflow: hidden; background: #ffffff; border-radius: 16px; border: 1px solid var(--line); box-shadow: 0 24px 64px rgba(21, 24, 29, 0.18); padding: 14px; - display: grid; + display: flex; + flex-direction: column; gap: 12px; } @@ -548,6 +575,12 @@ justify-content: space-between; align-items: center; gap: 12px; + flex-wrap: wrap; + } + + .related-modal-head--singleline { + flex-wrap: nowrap; + align-items: center; } .related-modal-title { @@ -558,6 +591,17 @@ .related-modal-body { display: grid; gap: 10px; + overflow: auto; + min-height: 0; + overscroll-behavior: contain; + } + + .related-modal-body .compact-table thead th { + position: sticky; + top: 0; + z-index: 2; + background: #f5f8fb; + box-shadow: inset 0 -1px 0 #e5ebf0; } .related-search-results { @@ -664,6 +708,21 @@ padding: 8px 10px; } + .comparison-detail-head-inline { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + background: #f5f8fb; + padding: 8px 10px; + } + + .comparison-detail-head-inline h5 { + background: transparent; + padding: 0; + margin: 0; + } + .comparison-detail-list { display: grid; gap: 0; @@ -679,6 +738,15 @@ min-width: 0; } + .comparison-detail-checkbox { + display: inline-flex; + align-items: center; + gap: 6px; + font-size: 12px; + font-weight: 700; + color: #547085; + } + .comparison-detail-item { display: grid; grid-template-columns: minmax(0, 1fr) auto; @@ -761,6 +829,33 @@ text-align: center; } + .comparison-project-block { + display: grid; + gap: 0; + } + + .comparison-project-detail-area { + display: grid; + gap: 0; + position: relative; + align-content: start; + } + + .comparison-project-detail-area.is-empty { + position: relative; + } + + .comparison-project-warning-anchor { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + pointer-events: none; + padding: 8px 10px; + box-sizing: border-box; + } + .analysis-kpis { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); @@ -827,6 +922,15 @@ color: #9aa8b5; } + .comparison-note-auto { + margin-bottom: 6px; + color: #b91c1c; + font-size: 11px; + font-weight: 800; + line-height: 1.35; + text-align: left; + } + .delta-positive { color: #15803d; font-weight: 800; @@ -897,11 +1001,15 @@ position: relative; z-index: 40; overflow: visible; + content-visibility: auto; + contain-intrinsic-size: 1200px; } .project-uncontracted-panel { position: relative; z-index: 1; + content-visibility: auto; + contain-intrinsic-size: 960px; } .uncontracted-toolbar { @@ -1034,6 +1142,136 @@ width: 180px; } + .compact-table th.uncontracted-col-project, + .compact-table td.uncontracted-col-project { + width: auto; + } + + .compact-table th.uncontracted-col-amount, + .compact-table td.uncontracted-col-amount { + width: 180px; + white-space: nowrap; + } + + .compact-table th.uncontracted-col-amount { + text-align: center; + } + + .compact-table td.uncontracted-col-amount { + text-align: right; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + } + + .compact-table td.uncontracted-col-amount.is-clickable { + cursor: pointer; + } + + .compact-table td.uncontracted-col-amount::selection, + .compact-table td.uncontracted-col-amount *::selection { + background: transparent !important; + color: inherit !important; + } + + .compact-table td.uncontracted-col-amount::-moz-selection, + .compact-table td.uncontracted-col-amount *::-moz-selection { + background: transparent !important; + color: inherit !important; + } + + .detail-amount-trigger { + background: transparent; + color: inherit; + font: inherit; + font-weight: 700; + display: flex; + justify-content: flex-end; + align-items: center; + width: 100%; + user-select: none !important; + -webkit-user-select: none !important; + -moz-user-select: none !important; + -webkit-touch-callout: none; + caret-color: transparent; + -webkit-tap-highlight-color: transparent; + padding: 4px 8px; + border-radius: 8px; + transition: background 0.16s ease, color 0.16s ease; + text-align: right; + } + + .detail-amount-trigger * { + user-select: none !important; + -webkit-user-select: none !important; + -moz-user-select: none !important; + } + + .detail-amount-trigger::selection { + background: transparent; + color: inherit; + } + + .detail-amount-trigger::-moz-selection { + background: transparent; + color: inherit; + } + + .detail-amount-trigger:hover { + background: #eef2f6; + color: #1d4ed8; + } + + .detail-amount-trigger.is-empty { + justify-content: center; + color: #8aa0b5; + font-weight: 600; + } + + .uncontracted-col-amount.is-clickable:hover .detail-amount-trigger, + .uncontracted-col-amount.is-clickable:focus-within .detail-amount-trigger, + .uncontracted-col-amount.is-clickable.is-active .detail-amount-trigger { + background: #eef2f6; + color: #1d4ed8; + } + + .sortable-header { + display: inline-flex; + align-items: center; + gap: 6px; + } + + .sort-toggle { + display: inline-flex; + align-items: center; + justify-content: center; + width: 18px; + height: 18px; + padding: 0; + border: 0; + background: transparent; + color: #7b92a8; + cursor: pointer; + } + + .sort-toggle:hover { + color: #1d4ed8; + } + + .sort-toggle.is-active { + color: #1d4ed8; + } + + .sort-toggle svg { + width: 14px; + height: 14px; + stroke: currentColor; + stroke-width: 2; + fill: none; + stroke-linecap: round; + stroke-linejoin: round; + } + .detail-classification-select { width: 100%; min-width: 0; @@ -1045,6 +1283,93 @@ cursor: pointer; } + .modal-title-with-total { + display: flex; + align-items: baseline; + justify-content: space-between; + gap: 16px; + width: 100%; + } + + .modal-title-with-total--compact { + flex: 1 1 auto; + min-width: 0; + width: auto; + } + + .modal-title-with-total--compact .related-modal-title { + min-width: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .modal-inline-total { + font-size: 16px; + font-weight: 800; + color: #132238; + white-space: nowrap; + flex: 0 0 auto; + } + + .vendor-period-toolbar { + display: inline-flex; + align-items: center; + gap: 8px; + margin-left: auto; + flex-wrap: nowrap; + flex: 0 0 auto; + } + + .vendor-period-toolbar.is-hidden { + display: none; + } + + .vendor-period-check { + display: inline-flex; + align-items: center; + gap: 6px; + font-size: 13px; + color: #4b5563; + white-space: nowrap; + } + + .vendor-period-toolbar input[type="date"] { + width: 126px; + min-width: 126px; + height: 36px; + padding: 0 8px; + border: 1px solid #d7dfe7; + border-radius: 10px; + background: #fff; + font: inherit; + color: var(--ink); + } + + .related-modal-head--singleline > .button-icon { + flex: 0 0 auto; + } + + .vendor-period-toolbar input[type="date"]:disabled { + background: #f5f7fa; + color: #94a3b8; + cursor: not-allowed; + } + + .transaction-partner-link { + display: inline-flex; + align-items: center; + gap: 6px; + color: #0f172a; + text-decoration: underline; + text-underline-offset: 2px; + cursor: pointer; + } + + .transaction-partner-link:hover { + color: #1d4ed8; + } + .compact-table .interactive-row:hover { background: #f8fbfe; } @@ -1419,6 +1744,21 @@ border-bottom: none; } + .lookup-option:hover, + .lookup-option:focus-visible { + background: #eef2f6; + color: var(--ink); + outline: none; + } + + .lookup-option, + .sort-toggle, + .detail-amount-button, + .button-secondary, + .button-icon { + -webkit-tap-highlight-color: transparent; + } + .lookup-option strong, .lookup-option span { display: block; @@ -2696,6 +3036,13 @@

+ + + + + + + @@ -2712,6 +3059,213 @@ + +
프로젝트
+ + + + + + + + + + + + + + + + + + + +
+
+ 전표작성일 + +
+
+
+ 거래처 + +
+
+
+ 원가부서 + +
+
+
+ 계정명칭 + +
+
+
+ 금액 + +
+
표시할 거래내역이 없습니다.
+
+ + + + + {% endblock %} {% block script %} @@ -2735,6 +3289,7 @@ const projectMonthlyCostRows = {{ project_monthly_cost_rows | tojson }}; const projectStatusRows = {{ project_status_rows | tojson }}; const projectComparisonNotes = {{ project_comparison_notes | tojson }}; + const projectAnalysisSettings = {{ project_analysis_settings | tojson }}; const persistedProjectPageState = {{ project_page_state | tojson }}; const persistedProjectRelatedLinks = {{ project_related_links | tojson }}; const persistedUncontractedCategoryOverrides = {{ project_uncontracted_classifications | tojson }}; @@ -2797,8 +3352,56 @@ const closeExcludedDetailItemsModalButton = document.getElementById("closeExcludedDetailItemsModal"); const excludedDetailItemsSummary = document.getElementById("excludedDetailItemsSummary"); const excludedDetailItemsRows = document.getElementById("excludedDetailItemsRows"); + const uncontractedTransactionModal = document.getElementById("uncontractedTransactionModal"); + const closeUncontractedTransactionModalButton = document.getElementById("closeUncontractedTransactionModal"); + const uncontractedTransactionModalTitle = document.getElementById("uncontractedTransactionModalTitle"); + const uncontractedTransactionModalTotal = document.getElementById("uncontractedTransactionModalTotal"); + const uncontractedTransactionRows = document.getElementById("uncontractedTransactionRows"); + const vendorTransactionModal = document.getElementById("vendorTransactionModal"); + const closeVendorTransactionModalButton = document.getElementById("closeVendorTransactionModal"); + const vendorTransactionModalTitle = document.getElementById("vendorTransactionModalTitle"); + const vendorTransactionModalTotal = document.getElementById("vendorTransactionModalTotal"); + const vendorTransactionRows = document.getElementById("vendorTransactionRows"); + const vendorPeriodToolbar = document.getElementById("vendorPeriodToolbar"); + const vendorUseProjectPeriodCheckbox = document.getElementById("vendorUseProjectPeriod"); + const vendorPeriodStartInput = document.getElementById("vendorPeriodStart"); + const vendorPeriodEndInput = document.getElementById("vendorPeriodEnd"); + const vendorPeriodSearchButton = document.getElementById("vendorPeriodSearch"); let currentLaborRates = {}; let latestExcludedDetailRows = []; + let uncontractedDetailSort = { key: "code", direction: "asc" }; + let uncontractedTransactionSort = { key: "posting_date", direction: "desc" }; + let vendorTransactionSort = { key: "posting_date", direction: "desc" }; + let latestUncontractedTransactionRows = []; + let latestVendorTransactionRows = []; + let latestTransactionModalContext = { type: "uncontracted" }; + let latestVendorModalContext = { type: "uncontracted" }; + let uncontractedDashboardDataRevision = 0; + const uncontractedDashboardDataCache = new Map(); + + function bumpUncontractedDashboardRevision() { + uncontractedDashboardDataRevision += 1; + uncontractedDashboardDataCache.clear(); + } + + function buildUncontractedDashboardCacheKey(startYear, endYear) { + return JSON.stringify({ + revision: uncontractedDashboardDataRevision, + startYear: Number(startYear || 0), + endYear: Number(endYear || 0), + selection: { + type: String(uncontractedDetailSelection?.type || ""), + year: Number(uncontractedDetailSelection?.year || 0), + month: Number(uncontractedDetailSelection?.month || 0), + category: String(uncontractedDetailSelection?.category || ""), + }, + visible: Boolean(uncontractedDetailVisible), + sort: { + key: String(uncontractedDetailSort?.key || "code"), + direction: String(uncontractedDetailSort?.direction || "asc"), + }, + }); + } yearFilter?.addEventListener("change", (event) => { const nextYear = event.target.value; @@ -2834,6 +3437,213 @@ return formatNumber(numeric); } + function sortUncontractedDetailRows(rows = []) { + const items = [...rows]; + const key = uncontractedDetailSort?.key || "code"; + const direction = uncontractedDetailSort?.direction === "desc" ? -1 : 1; + if (key === "expense") { + return items.sort((a, b) => ( + (Number(a.expense_amount || 0) - Number(b.expense_amount || 0)) * direction + ) || String(a.support_dept_code || "").localeCompare(String(b.support_dept_code || ""), "ko", { numeric: true })); + } + if (key === "revenue") { + return items.sort((a, b) => ( + (Number(a.revenue_amount || 0) - Number(b.revenue_amount || 0)) * direction + ) || String(a.support_dept_code || "").localeCompare(String(b.support_dept_code || ""), "ko", { numeric: true })); + } + return items.sort((a, b) => String(a.support_dept_code || "").localeCompare(String(b.support_dept_code || ""), "ko", { numeric: true }) * direction); + } + + function renderSortToggle(key) { + const isActive = uncontractedDetailSort?.key === key; + const isDesc = isActive && uncontractedDetailSort?.direction === "desc"; + return ` + + `; + } + + function renderModalSortToggle(state, attrName, key) { + const isActive = state?.key === key; + return ` + + `; + } + + function compareTransactionRows(a, b, key, direction) { + const multiplier = direction === "asc" ? 1 : -1; + const getText = (value) => String(value || "").toLocaleLowerCase(); + if (key === "amount") { + return ((Number(a.amount || 0) - Number(b.amount || 0)) * multiplier) + || getText(a.partner_name).localeCompare(getText(b.partner_name), "ko", { numeric: true }); + } + const fieldMap = { + posting_date: "posting_date", + partner: "partner_name", + cost_dept: "cost_dept_name", + account: "account_name", + support_dept: "support_dept_name", + }; + const field = fieldMap[key] || "posting_date"; + return getText(a[field]).localeCompare(getText(b[field]), "ko", { numeric: true }) * multiplier; + } + + function sortTransactionRows(rows, sortState) { + return [...(rows || [])].sort((a, b) => + compareTransactionRows(a, b, sortState?.key || "posting_date", sortState?.direction || "desc") + ); + } + + function formatPartnerDisplay(name, code) { + const normalizedName = String(name || "").trim(); + const normalizedCode = String(code || "").trim(); + if (normalizedName && normalizedCode) return `${normalizedName} (${normalizedCode})`; + return normalizedName || normalizedCode || "-"; + } + + function formatAccountDisplay(name, code) { + const normalizedName = String(name || "").trim(); + const normalizedCode = String(code || "").trim(); + if (normalizedName && normalizedCode) return `${normalizedName} (${normalizedCode})`; + return normalizedName || normalizedCode || "-"; + } + + function formatSupportDeptDisplay(name, code) { + const normalizedName = String(name || "").trim(); + const normalizedCode = String(code || "").trim(); + if (normalizedName && normalizedCode) return `${normalizedName} (${normalizedCode})`; + return normalizedName || normalizedCode || "-"; + } + + function renderUncontractedTransactionRows() { + const rows = sortTransactionRows(latestUncontractedTransactionRows, uncontractedTransactionSort); + uncontractedTransactionRows.innerHTML = rows.length + ? rows.map((row) => ` + + ${escapeHtml(row.posting_date || "-")} + + ${escapeHtml(formatPartnerDisplay(row.partner_name, row.partner_code))} + + ${escapeHtml(row.cost_dept_name || "-")} + ${escapeHtml(formatAccountDisplay(row.account_name, row.account_code))} + ${formatNumber(row.amount || 0)} + + `).join("") + : `표시할 거래내역이 없습니다.`; + } + + function renderVendorTransactionRows() { + const rows = sortTransactionRows(latestVendorTransactionRows, vendorTransactionSort); + vendorTransactionRows.innerHTML = rows.length + ? rows.map((row) => ` + + ${escapeHtml(row.posting_date || "-")} + ${escapeHtml(formatPartnerDisplay(row.partner_name, row.partner_code))} + ${escapeHtml(row.cost_dept_name || "-")} + ${escapeHtml(formatAccountDisplay(row.account_name, row.account_code))} + ${escapeHtml(formatSupportDeptDisplay(row.support_dept_name, row.support_dept_code))} + ${formatNumber(row.amount || 0)} + + `).join("") + : `표시할 거래내역이 없습니다.`; + } + + function syncVendorPeriodToolbar() { + const isComparison = latestVendorModalContext?.type === "comparison"; + vendorPeriodToolbar?.classList.toggle("is-hidden", !isComparison); + const useProjectPeriod = vendorUseProjectPeriodCheckbox?.checked !== false; + if (vendorPeriodStartInput) vendorPeriodStartInput.disabled = !isComparison || useProjectPeriod; + if (vendorPeriodEndInput) vendorPeriodEndInput.disabled = !isComparison || useProjectPeriod; + if (vendorPeriodSearchButton) vendorPeriodSearchButton.disabled = !isComparison; + if (!isComparison) { + if (vendorUseProjectPeriodCheckbox) vendorUseProjectPeriodCheckbox.checked = true; + if (vendorPeriodStartInput) vendorPeriodStartInput.value = ""; + if (vendorPeriodEndInput) vendorPeriodEndInput.value = ""; + } + } + + async function loadComparisonVendorTransactionRows({ useProjectPeriod = true } = {}) { + const normalizedPartnerCode = String(latestVendorModalContext.partnerCode || "").trim(); + const normalizedPartnerName = String(latestVendorModalContext.partnerName || "").trim(); + const normalizedProjectCode = String(latestVendorModalContext.supportDeptCode || "").trim(); + const normalizedCodes = Array.isArray(latestVendorModalContext.codes) ? latestVendorModalContext.codes : []; + if ((!normalizedPartnerCode && !normalizedPartnerName) || !normalizedCodes.length) return; + const params = new URLSearchParams({ + support_dept_code: normalizedProjectCode, + codes: normalizedCodes.join(","), + partner_code: normalizedPartnerCode, + partner_name: normalizedPartnerName, + }); + if (!useProjectPeriod) { + const startDate = String(vendorPeriodStartInput?.value || "").trim(); + const endDate = String(vendorPeriodEndInput?.value || "").trim(); + if (startDate) params.set("start_date", startDate); + if (endDate) params.set("end_date", endDate); + } + vendorTransactionRows.innerHTML = `거래내역을 불러오는 중입니다.`; + vendorTransactionModalTotal.textContent = "0원"; + try { + const response = await fetch(`/projects/comparison-vendor-transactions?${params.toString()}`, { + credentials: "same-origin", + headers: { Accept: "application/json" }, + }); + const payload = await response.json(); + if (!response.ok || payload?.error) { + throw new Error(payload?.error || `HTTP ${response.status}`); + } + latestVendorTransactionRows = Array.isArray(payload?.rows) ? payload.rows : []; + latestVendorModalContext.defaultStartDate = String(payload?.project_start_date || payload?.start_date || "").trim(); + latestVendorModalContext.defaultEndDate = String(payload?.project_end_date || payload?.end_date || "").trim(); + if (vendorPeriodStartInput && useProjectPeriod) { + vendorPeriodStartInput.value = latestVendorModalContext.defaultStartDate || ""; + } + if (vendorPeriodEndInput && useProjectPeriod) { + vendorPeriodEndInput.value = latestVendorModalContext.defaultEndDate || ""; + } + vendorTransactionModalTotal.textContent = `${formatNumber(payload?.total_amount || 0)}원`; + renderVendorTransactionRows(); + } catch (error) { + console.error(error); + latestVendorTransactionRows = []; + vendorTransactionRows.innerHTML = `거래내역을 불러오지 못했습니다.`; + vendorTransactionModalTotal.textContent = "0원"; + } + } + + function formatUncontractedCellAmount(value) { + const numeric = Number(value || 0); + if (!numeric) { + return { text: "-", empty: true }; + } + return { text: formatNumber(numeric), empty: false }; + } + function formatCompactCurrency(value) { const numeric = Number(value || 0); if (!numeric) return "0원"; @@ -4086,6 +4896,12 @@ } const updatedEdit = cloneProjectEditData(payload?.project_edit || {}); const updatedRow = payload?.project_row || null; + const savedCode = String( + updatedRow?.support_dept_code + || updatedEdit?.support_dept_code + || formData.get("support_dept_code") + || "" + ).trim(); if (payload?.data_version && typeof window.__setPageDataVersion === "function") { window.__setPageDataVersion(payload.data_version); } @@ -4096,6 +4912,7 @@ applyProjectEditData(updatedEdit); } if (updatedRow?.support_dept_code) { + bumpUncontractedDashboardRevision(); const projectPageHelpers = window.__projectPageHelpers || null; if (projectPageHelpers?.upsertProjectStatusRow) { projectPageHelpers.upsertProjectStatusRow(updatedRow); @@ -4104,6 +4921,38 @@ projectPageHelpers.refreshAnalysisForCode(updatedRow.support_dept_code); } } + if (savedCode) { + selectedCode = savedCode; + currentSelectedProjectCode = savedCode; + analysisOpen = true; + const refreshedItem = getAnalysisItem(savedCode) || updatedRow || projectStatusMap[savedCode] || null; + if (refreshedItem) { + if (input) { + input.value = refreshedItem.support_dept_name || ""; + } + setAnalysisVisibility(true); + renderAnalysis(refreshedItem); + } + try { + const nextUrl = new URL(window.location.href); + nextUrl.searchParams.delete("edit_code"); + nextUrl.searchParams.set("focus_code", savedCode); + const currentYearValue = String(selectedYear || yearSelect?.value || "").trim(); + if (currentYearValue) { + nextUrl.searchParams.set("year", currentYearValue); + } else { + nextUrl.searchParams.delete("year"); + } + window.history.replaceState({}, "", nextUrl.toString()); + } catch (urlError) { + console.warn("저장 후 URL 상태를 갱신하지 못했습니다.", urlError); + } + try { + await saveProjectPageStateToServer(false); + } catch (stateError) { + console.warn("저장 후 페이지 상태를 저장하지 못했습니다.", stateError); + } + } } catch (error) { console.error(error); window.alert(error?.message || "사업현황 저장 중 오류가 발생했습니다."); @@ -4427,6 +5276,7 @@ type: "item", label: `${groupCode} · ${entry.label || "-"}`, amount: Number(entry.amount || 0), + clickMeta: entry.clickMeta || null, }); }); } else { @@ -4505,7 +5355,25 @@ return `
${escapeHtml(row.label || "-")} - ${row.amount === null || row.amount === undefined ? "" : formatNumber(row.amount)} + ${row.amount === null || row.amount === undefined + ? "" + : row.clickMeta + ? ` + ${formatNumber(row.amount)} + ` + : `${formatNumber(row.amount)}` + }
`; }).join(""); @@ -4589,46 +5457,133 @@ `; } - function renderLaborComparisonDetails(plannedEntries, erpEntries, jointEntries) { + function renderLaborComparisonDetails(baseCode, plannedEntries, erpEntries, jointEntries) { const plannedGrouped = buildGroupedComparisonEntries(plannedEntries); const erpGrouped = buildGroupedComparisonEntries(erpEntries); const jointGrouped = buildGroupedComparisonEntries(jointEntries); + const analysisSetting = getProjectAnalysisSetting(baseCode); + const laborJointExempt = Boolean(analysisSetting.labor_joint_exempt); const plannedMap = new Map(plannedGrouped.groups.map((group) => [group.code, group])); const erpMap = new Map(erpGrouped.groups.map((group) => [group.code, group])); const jointMap = new Map(jointGrouped.groups.map((group) => [group.code, group])); const order = getProjectPairOrder([...plannedEntries, ...erpEntries], jointEntries); - const plannedRows = []; - const erpRows = []; - const jointRows = []; + const detailRowHeight = 38; + + function renderProjectBlock(group, rowCount, mode = "default") { + const items = group.items || []; + const detailRows = []; + if (mode === "joint-warning" && !items.length) { + for (let index = 0; index < rowCount; index += 1) { + detailRows.push('
'); + } + const detailHeight = Math.max(rowCount, 1) * detailRowHeight; + return ` +
+
+ ${detailRows.join("")} +
+
+ 합사인건비 반영 필요 + (사업관리팀 자료 회신 대기 중) +
+
+
+
+ ${group.code} 소계 + ${formatNumber(group.subtotal || 0)} +
+
+ `; + } + + for (let index = 0; index < rowCount; index += 1) { + const item = items[index]; + if (item) { + detailRows.push(` +
+ ${item.label} + ${formatNumber(item.amount)} +
+ `); + } else { + detailRows.push('
'); + } + } + + return ` +
+
+ ${detailRows.join("")} +
+
+ ${group.code} 소계 + ${formatNumber(group.subtotal || 0)} +
+
+ `; + } + + const plannedBlocks = []; + const erpBlocks = []; + const jointBlocks = []; + order.forEach((projectCode) => { const plannedGroup = plannedMap.get(projectCode) || { code: projectCode, items: [], subtotal: 0 }; const erpGroup = erpMap.get(projectCode) || { code: projectCode, items: [], subtotal: 0 }; const jointGroup = jointMap.get(projectCode) || { code: projectCode, items: [], subtotal: 0 }; - const plannedCount = plannedGroup.items?.length ? plannedGroup.items.length : 1; - const erpCount = erpGroup.items?.length ? erpGroup.items.length : 1; - const jointCount = jointGroup.items?.length ? jointGroup.items.length : 1; - const maxCount = Math.max(plannedCount, erpCount, jointCount); - plannedRows.push(...buildComparisonSideRows(plannedGroup, "", maxCount - plannedCount)); - erpRows.push(...buildComparisonSideRows(erpGroup, "", maxCount - erpCount)); - jointRows.push(...buildComparisonSideRows( + const maxCount = Math.max( + (plannedGroup.items || []).length || 1, + (erpGroup.items || []).length || 1, + (jointGroup.items || []).length || 1, + ); + plannedBlocks.push(renderProjectBlock(plannedGroup, maxCount)); + erpBlocks.push(renderProjectBlock(erpGroup, maxCount)); + jointBlocks.push(renderProjectBlock( jointGroup, - "", - maxCount - jointCount, - !(jointGroup.items || []).length ? { - title: "합사인건비 반영 필요", - subtitle: "(사업관리팀 자료 회신 대기 중)", - rowSpan: maxCount, - } : null, + maxCount, + !(jointGroup.items || []).length && !laborJointExempt ? "joint-warning" : "default", )); }); + return `
- ${renderComparisonSideBox(plannedRows, plannedGrouped.total, "총계", "계획/입력 세부")}
-
실제 집행 세부
+
계획/입력 세부
+
+ ${plannedBlocks.join("")} +
+ 총계 + ${formatNumber(plannedGrouped.total)} +
+
+
+
+
+
실제 집행 세부
+ +
- ${renderComparisonSideBox(erpRows, erpGrouped.total, "인건비(ERP) 총계")} - ${renderComparisonSideBox(jointRows, jointGrouped.total, "인건비(합사) 총계")} +
+
+ ${erpBlocks.join("")} +
+ 인건비(ERP) 총계 + ${formatNumber(erpGrouped.total)} +
+
+
+
+
+ ${jointBlocks.join("")} +
+ 인건비(합사) 총계 + ${formatNumber(jointGrouped.total)} +
+
+
@@ -4891,9 +5846,37 @@ const costEntries = aggregateCodes.flatMap((code) => getCostBreakdownEntries(code).map((entry) => ({ label: `${code} · ${entry.label || "-"}`, amount: Number(entry.amount || 0), + account_label: String(entry.label || "").trim(), + account_code: String(entry.account_code || "").trim(), + account_name: String(entry.account_name || "").trim(), + support_dept_code: code, }))); - const outsourceActual = costEntries.filter(isDesignOutsourceEntry); - const overheadActual = costEntries.filter((entry) => !isDesignOutsourceEntry(entry)); + const outsourceActual = costEntries + .filter(isDesignOutsourceEntry) + .map((entry) => ({ + ...entry, + clickMeta: { + support_dept_code: item.support_dept_code, + codes: aggregateCodes, + group: "outsource", + account_label: entry.account_label || entry.account_name || "", + project_code: item.support_dept_code, + project_name: item.support_dept_name, + }, + })); + const overheadActual = costEntries + .filter((entry) => !isDesignOutsourceEntry(entry)) + .map((entry) => ({ + ...entry, + clickMeta: { + support_dept_code: item.support_dept_code, + codes: aggregateCodes, + group: "overhead", + account_label: entry.account_label || entry.account_name || "", + project_code: item.support_dept_code, + project_name: item.support_dept_name, + }, + })); return { collection: { planned: revenuePlanned, @@ -4998,12 +5981,62 @@ return /(\d+\s*차|[nN]\s*차|변경|보완|지연보상금|가칭|연차|년분)/.test(String(name || "")); } + function getProjectAnalysisSetting(code) { + const normalizedCode = String(code || "").trim(); + const source = (normalizedCode && projectAnalysisSettings?.[normalizedCode]) || {}; + const inactiveRelatedCodes = Array.isArray(source?.inactive_related_codes) + ? source.inactive_related_codes.map((value) => String(value || "").trim()).filter(Boolean) + : []; + return { + detail_note: String(source?.detail_note || ""), + inactive_related_codes: inactiveRelatedCodes, + labor_joint_exempt: Boolean(source?.labor_joint_exempt), + }; + } + + async function saveProjectAnalysisSettingsToServer(code, patch = {}) { + const normalizedCode = String(code || "").trim(); + if (!normalizedCode) return; + const current = getProjectAnalysisSetting(normalizedCode); + const payload = { + support_dept_code: normalizedCode, + detail_note: Object.prototype.hasOwnProperty.call(patch, "detail_note") ? patch.detail_note : current.detail_note, + inactive_related_codes: Object.prototype.hasOwnProperty.call(patch, "inactive_related_codes") ? patch.inactive_related_codes : current.inactive_related_codes, + labor_joint_exempt: Object.prototype.hasOwnProperty.call(patch, "labor_joint_exempt") ? patch.labor_joint_exempt : current.labor_joint_exempt, + }; + const response = await fetch("/projects/analysis-settings", { + method: "POST", + credentials: "same-origin", + headers: { + "Content-Type": "application/json", + "Accept": "application/json", + }, + body: JSON.stringify(payload), + }); + const result = await response.json().catch(() => ({})); + if (!response.ok || result?.error) { + throw new Error(result?.error || "프로젝트 상세 설정을 저장하지 못했습니다."); + } + projectAnalysisSettings[normalizedCode] = { + detail_note: String(payload.detail_note || ""), + inactive_related_codes: Array.isArray(payload.inactive_related_codes) ? payload.inactive_related_codes : [], + labor_joint_exempt: Boolean(payload.labor_joint_exempt), + }; + bumpUncontractedDashboardRevision(); + } + function getCurrentRelatedCodes(baseCode) { const selectionMap = window.__projectRelatedSelections; if (!(selectionMap instanceof Map)) return []; return [...(selectionMap.get(baseCode) || new Set())]; } + function getActiveRelatedCodes(baseCode) { + const allCodes = getCurrentRelatedCodes(baseCode); + const inactiveCodes = new Set(getProjectAnalysisSetting(baseCode).inactive_related_codes || []); + return allCodes.filter((code) => !inactiveCodes.has(code)); + } + let uncontractedDetailSelection = { type: "", year: null, month: null }; let uncontractedDetailVisible = false; @@ -5034,6 +6067,12 @@ function buildUncontractedDashboardData() { const { startYear, endYear } = getUncontractedYearRange(); + const cacheKey = buildUncontractedDashboardCacheKey(startYear, endYear); + const cached = uncontractedDashboardDataCache.get(cacheKey); + if (cached) { + latestExcludedDetailRows = cached.excludedDetailRows || []; + return cached; + } const filteredRows = projectCostRows.filter((row) => { const year = Number(row.year || 0); return year >= startYear && year <= endYear; @@ -5144,7 +6183,7 @@ current.expense_amount += Number(row.cost_sum || 0) + Number(row.sga_sum || 0); map.set(row.support_dept_code, current); }); - detailRows = [...map.values()].sort((a, b) => Number(b.expense_amount || 0) - Number(a.expense_amount || 0)); + detailRows = sortUncontractedDetailRows([...map.values()]); } else if (uncontractedDetailSelection.type === "year" && uncontractedDetailSelection.year) { const map = new Map(); const excludedMap = new Map(); @@ -5176,7 +6215,7 @@ current.revenue_amount += Number(row.revenue_amount || 0); map.set(row.support_dept_code, current); }); - detailRows = [...map.values()].sort((a, b) => Number(b.expense_amount || 0) - Number(a.expense_amount || 0)); + detailRows = sortUncontractedDetailRows([...map.values()]); excludedDetailRows = [...excludedMap.values()].sort((a, b) => Number(b.expense_amount || 0) - Number(a.expense_amount || 0)); } else if (uncontractedDetailSelection.type === "category" && uncontractedDetailSelection.category) { const map = new Map(); @@ -5190,7 +6229,7 @@ category: classifyUncontractedSpecialType(item), }); }); - detailRows = [...map.values()].sort((a, b) => Number(b.expense_amount || 0) - Number(a.expense_amount || 0)); + detailRows = sortUncontractedDetailRows([...map.values()]); } const selectedYearlyRow = uncontractedDetailSelection.type === "year" @@ -5199,7 +6238,7 @@ const detailExpenseTotal = detailRows.reduce((sum, row) => sum + Number(row.expense_amount || 0), 0); const detailExpenseGap = Math.max(0, Number(selectedYearlyRow?.expense_amount || 0) - detailExpenseTotal); - return { + const result = { startYear, endYear, summary, @@ -5211,6 +6250,8 @@ detailExpenseGap, detailTitle, }; + uncontractedDashboardDataCache.set(cacheKey, result); + return result; } function renderUncontractedDashboard() { @@ -5299,9 +6340,9 @@

세부 내역

- @@ -5327,18 +6368,43 @@ - - - ${uncontractedDetailSelection.type === "month" ? "" : ""} + + + ${uncontractedDetailSelection.type === "month" ? "" : ``} ${(data.detailRows || []).length ? data.detailRows.map((row) => ` - - - ${uncontractedDetailSelection.type === "month" ? "" : ``} + + + ${uncontractedDetailSelection.type === "month" ? "" : ` + + `} @@ -5475,6 +6553,7 @@ ${key === "labor" ? ` ${renderLaborComparisonDetails( + item.support_dept_code, plannedEntries, detail?.actual || [], detail?.actual_joint || [], @@ -5927,6 +7006,7 @@ if (result?.error) { throw new Error(result.error); } + bumpUncontractedDashboardRevision(); } async function saveProjectPageStateToServer(showFeedback = false) { @@ -6080,8 +7160,9 @@ return getCurrentRelatedCodes(baseCode); } - function getRelatedItems(baseCode) { - return getRelatedCodes(baseCode) + function getRelatedItems(baseCode, { includeInactive = false } = {}) { + const codes = includeInactive ? getRelatedCodes(baseCode) : getActiveRelatedCodes(baseCode); + return codes .map((code) => getAnalysisItem(code)) .filter(Boolean); } @@ -6134,6 +7215,187 @@ excludedDetailItemsModal?.classList.remove("open"); } + async function openUncontractedTransactionModal(code, kind) { + if (window.getSelection) { + const selection = window.getSelection(); + if (selection && typeof selection.removeAllRanges === "function") { + selection.removeAllRanges(); + } + } + const normalizedCode = String(code || "").trim(); + const normalizedKind = String(kind || "").trim().toLowerCase(); + if (!normalizedCode || !normalizedKind || !uncontractedDetailSelection.type) return; + const params = new URLSearchParams({ + support_dept_code: normalizedCode, + kind: normalizedKind, + detail_type: uncontractedDetailSelection.type, + start_year: String(getUncontractedYearRange().startYear || ""), + end_year: String(getUncontractedYearRange().endYear || ""), + }); + if (uncontractedDetailSelection.year) { + params.set("year", String(uncontractedDetailSelection.year)); + } + if (uncontractedDetailSelection.month) { + params.set("month", String(uncontractedDetailSelection.month)); + } + if (uncontractedDetailSelection.category) { + params.set("category", String(uncontractedDetailSelection.category)); + } + uncontractedTransactionModalTitle.textContent = `${normalizedCode} · ${normalizedKind === "expense" ? "발생 비용" : "관련 수금"} 세부내역`; + uncontractedTransactionModalTotal.textContent = "0원"; + uncontractedTransactionRows.innerHTML = ``; + latestTransactionModalContext = { + type: "uncontracted", + supportDeptCode: normalizedCode, + codes: [normalizedCode], + projectName: "", + }; + uncontractedTransactionModal?.classList.add("open"); + try { + const response = await fetch(`/projects/uncontracted-detail-transactions?${params.toString()}`, { + credentials: "same-origin", + headers: { Accept: "application/json" }, + }); + const payload = await response.json(); + if (!response.ok || payload?.error) { + throw new Error(payload?.error || `HTTP ${response.status}`); + } + latestUncontractedTransactionRows = Array.isArray(payload?.rows) ? payload.rows : []; + uncontractedTransactionModalTotal.textContent = `${formatNumber(payload?.total_amount || 0)}원`; + renderUncontractedTransactionRows(); + } catch (error) { + console.error(error); + uncontractedTransactionRows.innerHTML = ``; + uncontractedTransactionModalTotal.textContent = "0원"; + } + } + + function closeUncontractedTransactionModal() { + uncontractedTransactionModal?.classList.remove("open"); + } + + async function openComparisonTransactionModal({ supportDeptCode = "", codes = [], group = "", accountLabel = "", projectCode = "", projectName = "" } = {}) { + if (window.getSelection) { + const selection = window.getSelection(); + if (selection && typeof selection.removeAllRanges === "function") { + selection.removeAllRanges(); + } + } + const normalizedSupportDeptCode = String(supportDeptCode || "").trim(); + const normalizedCodes = (Array.isArray(codes) ? codes : String(codes || "").split(",")) + .map((code) => String(code || "").trim()) + .filter(Boolean); + const normalizedGroup = String(group || "").trim(); + const normalizedAccountLabel = String(accountLabel || "").trim(); + if (!normalizedSupportDeptCode || !normalizedCodes.length || !normalizedGroup) return; + const params = new URLSearchParams({ + support_dept_code: normalizedSupportDeptCode, + codes: normalizedCodes.join(","), + group: normalizedGroup, + account_label: normalizedAccountLabel, + }); + latestTransactionModalContext = { + type: "comparison", + supportDeptCode: normalizedSupportDeptCode, + codes: normalizedCodes, + projectName: String(projectName || "").trim(), + }; + uncontractedTransactionModalTitle.textContent = `${String(projectCode || normalizedSupportDeptCode).trim()} · 실제 집행 세부내역`; + uncontractedTransactionModalTotal.textContent = "0원"; + uncontractedTransactionRows.innerHTML = ``; + uncontractedTransactionModal?.classList.add("open"); + try { + const response = await fetch(`/projects/comparison-actual-transactions?${params.toString()}`, { + credentials: "same-origin", + headers: { Accept: "application/json" }, + }); + const payload = await response.json(); + if (!response.ok || payload?.error) { + throw new Error(payload?.error || `HTTP ${response.status}`); + } + latestUncontractedTransactionRows = Array.isArray(payload?.rows) ? payload.rows : []; + uncontractedTransactionModalTotal.textContent = `${formatNumber(payload?.total_amount || 0)}원`; + renderUncontractedTransactionRows(); + } catch (error) { + console.error(error); + latestUncontractedTransactionRows = []; + uncontractedTransactionRows.innerHTML = ``; + uncontractedTransactionModalTotal.textContent = "0원"; + } + } + + async function openVendorTransactionModal(partnerCode, partnerName, projectCode, projectName) { + const normalizedPartnerCode = String(partnerCode || "").trim(); + const normalizedPartnerName = String(partnerName || "").trim(); + const normalizedProjectCode = String(projectCode || "").trim(); + const normalizedProjectName = String(projectName || "").trim(); + if (!normalizedPartnerCode && !normalizedPartnerName) return; + latestVendorModalContext = { type: "uncontracted" }; + syncVendorPeriodToolbar(); + const range = getUncontractedYearRange(); + const params = new URLSearchParams({ + partner_code: normalizedPartnerCode, + partner_name: normalizedPartnerName, + start_year: String(range.startYear || ""), + end_year: String(range.endYear || ""), + }); + vendorTransactionModalTitle.textContent = "거래처 세부내역"; + vendorTransactionModalTotal.textContent = "0원"; + vendorTransactionRows.innerHTML = ``; + vendorTransactionModal?.classList.add("open"); + try { + const response = await fetch(`/projects/uncontracted-vendor-transactions?${params.toString()}`, { + credentials: "same-origin", + headers: { Accept: "application/json" }, + }); + const payload = await response.json(); + if (!response.ok || payload?.error) { + throw new Error(payload?.error || `HTTP ${response.status}`); + } + latestVendorTransactionRows = Array.isArray(payload?.rows) ? payload.rows : []; + vendorTransactionModalTotal.textContent = `${formatNumber(payload?.total_amount || 0)}원`; + renderVendorTransactionRows(); + } catch (error) { + console.error(error); + vendorTransactionRows.innerHTML = ``; + vendorTransactionModalTotal.textContent = "0원"; + } + } + + function closeVendorTransactionModal() { + vendorTransactionModal?.classList.remove("open"); + } + + async function openComparisonVendorTransactionModal(partnerCode, partnerName, projectCode, projectName, codes = []) { + const normalizedPartnerCode = String(partnerCode || "").trim(); + const normalizedPartnerName = String(partnerName || "").trim(); + const normalizedProjectCode = String(projectCode || "").trim(); + const normalizedCodes = (Array.isArray(codes) ? codes : String(codes || "").split(",")) + .map((code) => String(code || "").trim()) + .filter(Boolean); + if ((!normalizedPartnerCode && !normalizedPartnerName) || !normalizedCodes.length) return; + latestVendorModalContext = { + type: "comparison", + supportDeptCode: normalizedProjectCode, + codes: normalizedCodes, + partnerCode: normalizedPartnerCode, + partnerName: normalizedPartnerName, + projectName: String(projectName || "").trim(), + projectCode: normalizedProjectCode, + defaultStartDate: "", + defaultEndDate: "", + }; + vendorTransactionModalTitle.textContent = "거래처 세부내역"; + vendorTransactionModalTotal.textContent = "0원"; + vendorTransactionRows.innerHTML = ``; + if (vendorUseProjectPeriodCheckbox) vendorUseProjectPeriodCheckbox.checked = true; + if (vendorPeriodStartInput) vendorPeriodStartInput.value = ""; + if (vendorPeriodEndInput) vendorPeriodEndInput.value = ""; + syncVendorPeriodToolbar(); + vendorTransactionModal?.classList.add("open"); + await loadComparisonVendorTransactionRows({ useProjectPeriod: true }); + } + async function saveDetailYearSetting() { const numericYear = Number(detailVisibleMinYearInput?.value || 2023); if (!numericYear || numericYear < 2000 || numericYear > 2099) { @@ -6158,6 +7420,7 @@ throw new Error(payload?.error || `HTTP ${response.status}`); } Object.assign(projectRuntimeSettings, payload?.settings || {}, { detail_visible_min_year: String(numericYear) }); + bumpUncontractedDashboardRevision(); closeDetailYearSettingModal(); scheduleStandaloneUncontractedDashboardRender(); } catch (error) { @@ -6179,6 +7442,7 @@ console.error(error); window.alert("연관 프로젝트를 DB에 저장하지 못했습니다."); } + bumpUncontractedDashboardRevision(); closeRelatedProjectPicker(); renderAnalysis(getAnalysisItem(selectedCode)); } @@ -6200,6 +7464,7 @@ console.error(error); window.alert("연관 프로젝트 변경을 DB에 저장하지 못했습니다."); } + bumpUncontractedDashboardRevision(); renderAnalysis(getAnalysisItem(selectedCode)); } @@ -6379,9 +7644,14 @@ scheduleStandaloneUncontractedDashboardRender(); return; } + const allRelatedItems = getRelatedItems(item.support_dept_code, { includeInactive: true }); const relatedItems = getRelatedItems(item.support_dept_code); const aggregateItem = aggregateAnalysisItem(item, relatedItems); - relatedBarBox.innerHTML = renderRelatedProjectBar(item, relatedItems); + relatedBarBox.innerHTML = renderRelatedProjectBar(item, allRelatedItems); + const detailNoteInput = relatedBarBox.querySelector("[data-analysis-detail-note]"); + if (detailNoteInput) { + detailNoteInput.value = getProjectAnalysisSetting(item.support_dept_code).detail_note || ""; + } heroBox.innerHTML = renderAnalysisHero(aggregateItem); metricsBox.innerHTML = renderAnalysisMetrics(aggregateItem); comparisonBox.innerHTML = renderAnalysisComparison(aggregateItem); @@ -6392,9 +7662,51 @@ }); }); + relatedBarBox.querySelectorAll("[data-toggle-related]").forEach((button) => { + button.addEventListener("click", async (event) => { + event.preventDefault(); + event.stopPropagation(); + const toggleCode = String(button.dataset.toggleRelated || "").trim(); + if (!toggleCode || !item.support_dept_code) return; + const setting = getProjectAnalysisSetting(item.support_dept_code); + const nextInactive = new Set(setting.inactive_related_codes || []); + if (nextInactive.has(toggleCode)) { + nextInactive.delete(toggleCode); + } else { + nextInactive.add(toggleCode); + } + try { + await saveProjectAnalysisSettingsToServer(item.support_dept_code, { + inactive_related_codes: [...nextInactive], + }); + renderAnalysis(getAnalysisItem(item.support_dept_code)); + } catch (error) { + console.error(error); + window.alert(error.message || "연관 프로젝트 반영 설정을 저장하지 못했습니다."); + } + }); + }); relatedBarBox.querySelectorAll("[data-remove-related]").forEach((button) => { button.addEventListener("click", () => removeRelatedProject(button.dataset.removeRelated || "")); }); + relatedBarBox.querySelectorAll("[data-analysis-detail-note]").forEach((inputEl) => { + inputEl.addEventListener("focusout", async () => { + const baseCode = String(inputEl.dataset.analysisDetailNote || "").trim(); + if (!baseCode) return; + const note = inputEl.value || ""; + const previous = getProjectAnalysisSetting(baseCode).detail_note || ""; + if (note === previous) return; + try { + await saveProjectAnalysisSettingsToServer(baseCode, { + detail_note: note, + }); + } catch (error) { + console.error(error); + window.alert(error.message || "프로젝트 설명을 저장하지 못했습니다."); + inputEl.value = previous; + } + }); + }); comparisonBox.querySelectorAll(".comparison-main-row[data-detail-target]").forEach((row) => { row.addEventListener("click", () => { const key = row.dataset.detailTarget; @@ -6404,6 +7716,46 @@ detailRow?.classList.toggle("is-open", !isOpen); }); }); + comparisonBox.querySelectorAll("[data-labor-joint-exempt]").forEach((checkbox) => { + checkbox.addEventListener("change", async () => { + const code = String(checkbox.dataset.laborJointExempt || "").trim(); + if (!code) return; + const checked = Boolean(checkbox.checked); + try { + await saveProjectAnalysisSettingsToServer(code, { + labor_joint_exempt: checked, + }); + renderAnalysis(getAnalysisItem(code)); + } catch (error) { + console.error(error); + checkbox.checked = !checked; + window.alert(error.message || "합사없음 설정을 저장하지 못했습니다."); + } + }); + }); + comparisonBox.querySelectorAll("[data-comparison-open-transaction]").forEach((trigger) => { + const openModal = () => { + openComparisonTransactionModal({ + supportDeptCode: trigger.dataset.supportDeptCode || "", + codes: trigger.dataset.codes || "", + group: trigger.dataset.comparisonGroup || "", + accountLabel: trigger.dataset.accountLabel || "", + projectCode: trigger.dataset.projectCode || "", + projectName: trigger.dataset.projectName || "", + }); + }; + trigger.addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + openModal(); + }); + trigger.addEventListener("keydown", (event) => { + if (event.key !== "Enter" && event.key !== " ") return; + event.preventDefault(); + event.stopPropagation(); + openModal(); + }); + }); } window.__projectPageHelpers = { @@ -6515,6 +7867,7 @@ throw new Error(payload?.error || `HTTP ${response.status}`); } persistedUncontractedCategoryOverrides[supportDeptCode] = category; + bumpUncontractedDashboardRevision(); scheduleStandaloneUncontractedDashboardRender({ urgent: true }); } catch (error) { console.error(error); @@ -6542,6 +7895,8 @@ const toggleButton = event.target.closest("#toggleUncontractedDetail"); const saveFilterButton = event.target.closest("#saveUncontractedFilterState"); const excludedItemsButton = event.target.closest("#openExcludedDetailItems"); + const detailAmountButton = event.target.closest("[data-uncontracted-open-transaction]"); + const sortButton = event.target.closest("[data-uncontracted-sort]"); const openProjectRow = event.target.closest("[data-open-project-code]"); if (toggleButton) { uncontractedDetailVisible = !uncontractedDetailVisible; @@ -6556,6 +7911,27 @@ openExcludedDetailItemsModal(); return; } + if (sortButton) { + const nextKey = sortButton.dataset.uncontractedSort || "code"; + if (uncontractedDetailSort?.key === nextKey) { + uncontractedDetailSort = { + key: nextKey, + direction: uncontractedDetailSort.direction === "asc" ? "desc" : "asc", + }; + } else { + uncontractedDetailSort = { key: nextKey, direction: nextKey === "code" ? "asc" : "desc" }; + } + scheduleStandaloneUncontractedDashboardRender({ urgent: true }); + return; + } + if (detailAmountButton) { + event.stopPropagation(); + openUncontractedTransactionModal( + detailAmountButton.dataset.uncontractedCode || "", + detailAmountButton.dataset.uncontractedOpenTransaction || "expense", + ); + return; + } if (categoryButton) { uncontractedDetailSelection = { type: "category", @@ -6595,15 +7971,32 @@ renderAnalysis(getAnalysisItem(selectedCode)); } }); + uncontractedBox?.addEventListener("mousedown", (event) => { + const detailAmountButton = event.target.closest("[data-uncontracted-open-transaction]"); + if (!detailAmountButton) return; + event.preventDefault(); + }); + uncontractedBox?.addEventListener("pointerdown", (event) => { + const detailAmountButton = event.target.closest("[data-uncontracted-open-transaction]"); + if (!detailAmountButton) return; + event.preventDefault(); + }); uncontractedBox?.addEventListener("keydown", (event) => { const categoryButton = event.target.closest("[data-uncontracted-category]"); const excludedItemsButton = event.target.closest("#openExcludedDetailItems"); + const detailAmountButton = event.target.closest("[data-uncontracted-open-transaction]"); if (categoryButton) { if (event.key !== "Enter" && event.key !== " ") return; event.preventDefault(); categoryButton.click(); return; } + if (detailAmountButton) { + if (event.key !== "Enter" && event.key !== " ") return; + event.preventDefault(); + detailAmountButton.click(); + return; + } if (!excludedItemsButton) return; if (event.key !== "Enter" && event.key !== " ") return; event.preventDefault(); @@ -6662,6 +8055,82 @@ closeExcludedDetailItemsModal(); } }); + closeUncontractedTransactionModalButton?.addEventListener("click", closeUncontractedTransactionModal); + closeVendorTransactionModalButton?.addEventListener("click", closeVendorTransactionModal); + uncontractedTransactionModal?.addEventListener("click", (event) => { + const sortButton = event.target.closest("[data-uncontracted-transaction-sort]"); + const vendorLink = event.target.closest("[data-uncontracted-open-vendor]"); + const comparisonVendorLink = event.target.closest("[data-comparison-open-vendor]"); + if (sortButton) { + const nextKey = sortButton.dataset.uncontractedTransactionSort || "posting_date"; + if (uncontractedTransactionSort?.key === nextKey) { + uncontractedTransactionSort = { + key: nextKey, + direction: uncontractedTransactionSort.direction === "asc" ? "desc" : "asc", + }; + } else { + uncontractedTransactionSort = { key: nextKey, direction: nextKey === "amount" ? "desc" : "asc" }; + } + renderUncontractedTransactionRows(); + return; + } + if (vendorLink) { + openVendorTransactionModal( + vendorLink.dataset.uncontractedOpenVendor || "", + vendorLink.dataset.uncontractedVendorName || "", + vendorLink.dataset.uncontractedProjectCode || "", + vendorLink.dataset.uncontractedProjectName || "", + ); + return; + } + if (comparisonVendorLink) { + openComparisonVendorTransactionModal( + comparisonVendorLink.dataset.comparisonOpenVendor || "", + comparisonVendorLink.dataset.comparisonVendorName || "", + comparisonVendorLink.dataset.comparisonProjectCode || "", + comparisonVendorLink.dataset.comparisonProjectName || "", + comparisonVendorLink.dataset.comparisonCodes || "", + ); + return; + } + if (event.target === uncontractedTransactionModal) { + closeUncontractedTransactionModal(); + } + }); + vendorTransactionModal?.addEventListener("click", (event) => { + const sortButton = event.target.closest("[data-vendor-transaction-sort]"); + if (sortButton) { + const nextKey = sortButton.dataset.vendorTransactionSort || "posting_date"; + if (vendorTransactionSort?.key === nextKey) { + vendorTransactionSort = { + key: nextKey, + direction: vendorTransactionSort.direction === "asc" ? "desc" : "asc", + }; + } else { + vendorTransactionSort = { key: nextKey, direction: nextKey === "amount" ? "desc" : "asc" }; + } + renderVendorTransactionRows(); + return; + } + if (event.target === vendorTransactionModal) { + closeVendorTransactionModal(); + } + }); + vendorUseProjectPeriodCheckbox?.addEventListener("change", async () => { + syncVendorPeriodToolbar(); + if (latestVendorModalContext?.type !== "comparison") return; + if (vendorUseProjectPeriodCheckbox.checked) { + await loadComparisonVendorTransactionRows({ useProjectPeriod: true }); + } + }); + vendorPeriodSearchButton?.addEventListener("click", async () => { + if (latestVendorModalContext?.type !== "comparison") return; + if (vendorUseProjectPeriodCheckbox?.checked) { + await loadComparisonVendorTransactionRows({ useProjectPeriod: true }); + return; + } + await loadComparisonVendorTransactionRows({ useProjectPeriod: false }); + }); analysisToggle?.addEventListener("click", () => { const nextOpen = !analysisOpen; setAnalysisVisibility(nextOpen);
프로젝트발생 비용관련 수금 +
+ 구분 + ${renderSortToggle("code")} +
+
+
+ 발생 비용 + ${renderSortToggle("expense")} +
+
+
+ 관련 수금 + ${renderSortToggle("revenue")} +
+
섹터 수정
${escapeHtml(row.support_dept_code)} · ${escapeHtml(row.support_dept_name)}${formatNumber(row.expense_amount || 0)}${formatNumber(row.revenue_amount || 0)}${escapeHtml(row.support_dept_code)} · ${escapeHtml(row.support_dept_name)} + + ${formatUncontractedCellAmount(row.expense_amount || 0).text} + + + + ${formatUncontractedCellAmount(row.revenue_amount || 0).text} + + `; } @@ -5445,6 +6520,8 @@ const hasDetail = Boolean(detail); const plannedEntries = detail?.planned || []; const actualEntries = detail?.actual || []; + const analysisSetting = getProjectAnalysisSetting(item.support_dept_code); + const showLaborJointPending = key === "labor" && !analysisSetting.labor_joint_exempt; return `
@@ -5465,6 +6542,7 @@ class="comparison-note-input" data-comparison-note-code="${escapeHtml(item.support_dept_code)}" data-comparison-note-key="${escapeHtml(key)}" + placeholder="${showLaborJointPending ? "합사인건비 미반영" : ""}" >${escapeHtml(comparisonNotes[key] || "")}
거래내역을 불러오는 중입니다.
거래내역을 불러오지 못했습니다.
거래내역을 불러오는 중입니다.
거래내역을 불러오지 못했습니다.
거래내역을 불러오는 중입니다.
거래내역을 불러오지 못했습니다.
거래내역을 불러오는 중입니다.