diff --git a/.gitignore b/.gitignore index 826e7a7..2759f74 100755 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,6 @@ backend/data/ uploads/ snapshots/ node_modules/ - +incoming-files/*.Zone.Identifier +*:Zone.Identifier +incoming-files/~$* diff --git a/DashBoard-organization.html b/DashBoard-organization.html index 987d2ce..2ee57f5 100644 --- a/DashBoard-organization.html +++ b/DashBoard-organization.html @@ -8,8 +8,8 @@ - - + + @@ -60,6 +60,6 @@ - - + + diff --git a/backend/app/db.py b/backend/app/db.py index da2b11a..eea3c34 100755 --- a/backend/app/db.py +++ b/backend/app/db.py @@ -32,6 +32,48 @@ CREATE TABLE IF NOT EXISTS members ( updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); +CREATE TABLE IF NOT EXISTS member_overrides ( + id SERIAL PRIMARY KEY, + employee_id TEXT NOT NULL UNIQUE, + name TEXT NOT NULL DEFAULT '', + company TEXT, + rank TEXT, + role TEXT, + department TEXT, + grp TEXT, + division TEXT, + team TEXT, + cell TEXT, + work_status TEXT, + work_time TEXT, + phone TEXT, + email TEXT, + seat_label TEXT, + photo_url TEXT, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS member_retirements ( + id SERIAL PRIMARY KEY, + employee_id TEXT, + name TEXT NOT NULL, + note TEXT NOT NULL DEFAULT '', + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + UNIQUE (name) +); + +CREATE TABLE IF NOT EXISTS member_aliases ( + id SERIAL PRIMARY KEY, + alias_name TEXT NOT NULL UNIQUE, + canonical_name TEXT NOT NULL, + employee_id TEXT, + note TEXT NOT NULL DEFAULT '', + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + CREATE TABLE IF NOT EXISTS seat_maps ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, @@ -76,11 +118,252 @@ CREATE TABLE IF NOT EXISTS seat_slots ( updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), UNIQUE (seat_map_id, slot_key) ); + +CREATE TABLE IF NOT EXISTS integration_import_batches ( + id SERIAL PRIMARY KEY, + source_key TEXT NOT NULL UNIQUE, + source_name TEXT NOT NULL, + source_path TEXT NOT NULL, + imported_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + row_count INTEGER NOT NULL DEFAULT 0, + meta_json JSONB NOT NULL DEFAULT '{}'::jsonb +); + +CREATE TABLE IF NOT EXISTS integration_raw_organization_rows ( + id SERIAL PRIMARY KEY, + batch_id INTEGER NOT NULL REFERENCES integration_import_batches(id) ON DELETE CASCADE, + row_index INTEGER NOT NULL, + row_json JSONB NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS integration_raw_mh_rows ( + id SERIAL PRIMARY KEY, + batch_id INTEGER NOT NULL REFERENCES integration_import_batches(id) ON DELETE CASCADE, + row_index INTEGER NOT NULL, + row_json JSONB NOT NULL, + row_values_json JSONB NOT NULL DEFAULT '[]'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS integration_raw_mh_pm_rows ( + id SERIAL PRIMARY KEY, + batch_id INTEGER NOT NULL REFERENCES integration_import_batches(id) ON DELETE CASCADE, + row_index INTEGER NOT NULL, + row_values_json JSONB NOT NULL DEFAULT '[]'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS integration_raw_payment_rows ( + id SERIAL PRIMARY KEY, + batch_id INTEGER NOT NULL REFERENCES integration_import_batches(id) ON DELETE CASCADE, + row_index INTEGER NOT NULL, + row_json JSONB NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS integration_projects ( + id SERIAL PRIMARY KEY, + project_code TEXT NOT NULL UNIQUE, + project_name TEXT NOT NULL, + display_name TEXT NOT NULL DEFAULT '', + intranet_name TEXT NOT NULL DEFAULT '', + business_area TEXT NOT NULL DEFAULT '', + business_subarea TEXT NOT NULL DEFAULT '', + project_nature TEXT NOT NULL DEFAULT '', + main_category TEXT NOT NULL DEFAULT '', + middle_category TEXT NOT NULL DEFAULT '', + sub_category TEXT NOT NULL DEFAULT '', + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS integration_project_aliases ( + id SERIAL PRIMARY KEY, + project_id INTEGER NOT NULL REFERENCES integration_projects(id) ON DELETE CASCADE, + alias_name TEXT NOT NULL, + alias_type TEXT NOT NULL DEFAULT 'name', + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + UNIQUE (project_id, alias_name, alias_type) +); + +CREATE TABLE IF NOT EXISTS integration_project_category_mappings ( + id SERIAL PRIMARY KEY, + source_key TEXT NOT NULL DEFAULT 'ptj_csv', + project_name TEXT NOT NULL, + normalized_project_key TEXT NOT NULL, + mapped_d1 TEXT NOT NULL DEFAULT '', + mapped_d2 TEXT NOT NULL DEFAULT '', + mapped_d3 TEXT NOT NULL DEFAULT '', + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + UNIQUE (source_key, normalized_project_key) +); + +CREATE TABLE IF NOT EXISTS integration_project_pm_assignments ( + id SERIAL PRIMARY KEY, + project_id INTEGER NOT NULL REFERENCES integration_projects(id) ON DELETE CASCADE, + member_id INTEGER REFERENCES members(id) ON DELETE SET NULL, + pm_name TEXT NOT NULL, + source_label TEXT NOT NULL DEFAULT 'mh_sheet2', + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + UNIQUE (project_id, source_label) +); + +CREATE TABLE IF NOT EXISTS integration_work_logs ( + id SERIAL PRIMARY KEY, + work_date DATE NOT NULL, + employee_id TEXT NOT NULL, + member_id INTEGER REFERENCES members(id) ON DELETE SET NULL, + member_name TEXT NOT NULL, + title TEXT NOT NULL DEFAULT '', + team_category TEXT NOT NULL DEFAULT '', + team_name TEXT NOT NULL DEFAULT '', + user_state TEXT NOT NULL DEFAULT '', + shift_hours NUMERIC(10, 2) NOT NULL DEFAULT 0, + weekend_late_flag TEXT NOT NULL DEFAULT '', + review_status TEXT NOT NULL DEFAULT '', + source_row_index INTEGER NOT NULL DEFAULT 0, + raw_batch_id INTEGER REFERENCES integration_import_batches(id) ON DELETE SET NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + UNIQUE (work_date, employee_id, source_row_index) +); + +CREATE TABLE IF NOT EXISTS integration_work_log_segments ( + id SERIAL PRIMARY KEY, + work_log_id INTEGER NOT NULL REFERENCES integration_work_logs(id) ON DELETE CASCADE, + slot_name TEXT NOT NULL, + project_id INTEGER REFERENCES integration_projects(id) ON DELETE SET NULL, + project_code TEXT NOT NULL DEFAULT '', + project_name TEXT NOT NULL DEFAULT '', + business_type TEXT NOT NULL DEFAULT '', + activity_code TEXT NOT NULL DEFAULT '', + hours NUMERIC(10, 2) NOT NULL DEFAULT 0, + overtime_hours_raw NUMERIC(10, 2) NOT NULL DEFAULT 0, + overtime_hours_adjusted NUMERIC(10, 2) NOT NULL DEFAULT 0, + is_overtime BOOLEAN NOT NULL DEFAULT FALSE, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS integration_vouchers ( + id SERIAL PRIMARY KEY, + accounting_company TEXT NOT NULL DEFAULT '', + claim_date DATE, + issue_date DATE, + issue_month TEXT NOT NULL DEFAULT '', + account_code TEXT NOT NULL DEFAULT '', + management_account_code TEXT NOT NULL DEFAULT '', + account_name TEXT NOT NULL DEFAULT '', + project_id INTEGER REFERENCES integration_projects(id) ON DELETE SET NULL, + project_code TEXT NOT NULL DEFAULT '', + project_name TEXT NOT NULL DEFAULT '', + display_project_name TEXT NOT NULL DEFAULT '', + intranet_project_name TEXT NOT NULL DEFAULT '', + business_area TEXT NOT NULL DEFAULT '', + business_subarea TEXT NOT NULL DEFAULT '', + planning_dev_sales TEXT NOT NULL DEFAULT '', + main_category TEXT NOT NULL DEFAULT '', + middle_category TEXT NOT NULL DEFAULT '', + sub_category TEXT NOT NULL DEFAULT '', + department_name TEXT NOT NULL DEFAULT '', + team_name TEXT NOT NULL DEFAULT '', + customer_name TEXT NOT NULL DEFAULT '', + summary_text TEXT NOT NULL DEFAULT '', + debit_supply_amount NUMERIC(14, 2) NOT NULL DEFAULT 0, + credit_supply_amount NUMERIC(14, 2) NOT NULL DEFAULT 0, + expense_amount NUMERIC(14, 2) NOT NULL DEFAULT 0, + income_amount NUMERIC(14, 2) NOT NULL DEFAULT 0, + voucher_type TEXT NOT NULL DEFAULT '', + project_nature TEXT NOT NULL DEFAULT '', + raw_batch_id INTEGER REFERENCES integration_import_batches(id) ON DELETE SET NULL, + source_row_index INTEGER NOT NULL DEFAULT 0, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE SCHEMA IF NOT EXISTS auth; + +CREATE TABLE IF NOT EXISTS auth.users ( + id BIGSERIAL PRIMARY KEY, + username TEXT NOT NULL UNIQUE, + password_hash TEXT NOT NULL, + display_name TEXT NOT NULL, + role TEXT NOT NULL DEFAULT 'admin', + member_id INTEGER NULL REFERENCES members(id) ON DELETE SET NULL, + is_active BOOLEAN NOT NULL DEFAULT TRUE, + created_from TEXT NOT NULL DEFAULT 'manual', + last_login_at TIMESTAMPTZ, + password_changed_at TIMESTAMPTZ, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS auth.sessions ( + id UUID PRIMARY KEY, + user_id BIGINT NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE, + expires_at TIMESTAMPTZ NOT NULL, + revoked_at TIMESTAMPTZ, + ip_address INET, + user_agent TEXT, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS auth.login_audit_logs ( + id BIGSERIAL PRIMARY KEY, + username TEXT NOT NULL, + user_id BIGINT NULL REFERENCES auth.users(id) ON DELETE SET NULL, + success BOOLEAN NOT NULL, + failure_reason TEXT, + ip_address INET, + user_agent TEXT, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); """ MIGRATION_SQL = """ ALTER TABLE members ADD COLUMN IF NOT EXISTS employee_id TEXT; ALTER TABLE members ADD COLUMN IF NOT EXISTS sort_order INTEGER NOT NULL DEFAULT 0; +CREATE TABLE IF NOT EXISTS member_overrides ( + id SERIAL PRIMARY KEY, + employee_id TEXT NOT NULL UNIQUE, + name TEXT NOT NULL DEFAULT '', + company TEXT, + rank TEXT, + role TEXT, + department TEXT, + grp TEXT, + division TEXT, + team TEXT, + cell TEXT, + work_status TEXT, + work_time TEXT, + phone TEXT, + email TEXT, + seat_label TEXT, + photo_url TEXT, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS member_retirements ( + id SERIAL PRIMARY KEY, + employee_id TEXT, + name TEXT NOT NULL, + note TEXT NOT NULL DEFAULT '', + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + UNIQUE (name) +); + +CREATE TABLE IF NOT EXISTS member_aliases ( + id SERIAL PRIMARY KEY, + alias_name TEXT NOT NULL UNIQUE, + canonical_name TEXT NOT NULL, + employee_id TEXT, + note TEXT NOT NULL DEFAULT '', + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); ALTER TABLE seat_positions ADD COLUMN IF NOT EXISTS seat_map_id INTEGER REFERENCES seat_maps(id) ON DELETE CASCADE; ALTER TABLE seat_positions ADD COLUMN IF NOT EXISTS seat_slot_id INTEGER; ALTER TABLE seat_positions ADD COLUMN IF NOT EXISTS row_index INTEGER NOT NULL DEFAULT 0; @@ -136,14 +419,61 @@ BEGIN END IF; END $$; +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 + FROM information_schema.columns + WHERE table_name = 'integration_raw_mh_rows' AND column_name = 'row_values_json' + ) THEN + ALTER TABLE integration_raw_mh_rows + ADD COLUMN row_values_json JSONB NOT NULL DEFAULT '[]'::jsonb; + END IF; +END $$; + +DROP INDEX IF EXISTS seat_positions_map_cell_idx; CREATE UNIQUE INDEX IF NOT EXISTS seat_positions_map_cell_idx ON seat_positions (seat_map_id, row_index, col_index) -WHERE seat_map_id IS NOT NULL; +WHERE seat_map_id IS NOT NULL + AND seat_slot_id IS NULL; + +CREATE UNIQUE INDEX IF NOT EXISTS member_overrides_employee_id_idx +ON member_overrides (employee_id); + +CREATE UNIQUE INDEX IF NOT EXISTS member_retirements_name_idx +ON member_retirements (name); + +CREATE UNIQUE INDEX IF NOT EXISTS member_aliases_alias_name_idx +ON member_aliases (alias_name); CREATE UNIQUE INDEX IF NOT EXISTS seat_positions_slot_idx ON seat_positions (seat_slot_id) WHERE seat_slot_id IS NOT NULL; +CREATE UNIQUE INDEX IF NOT EXISTS integration_raw_organization_rows_batch_row_idx +ON integration_raw_organization_rows (batch_id, row_index); + +CREATE UNIQUE INDEX IF NOT EXISTS integration_raw_mh_rows_batch_row_idx +ON integration_raw_mh_rows (batch_id, row_index); + +CREATE UNIQUE INDEX IF NOT EXISTS integration_raw_mh_pm_rows_batch_row_idx +ON integration_raw_mh_pm_rows (batch_id, row_index); + +CREATE UNIQUE INDEX IF NOT EXISTS integration_raw_payment_rows_batch_row_idx +ON integration_raw_payment_rows (batch_id, row_index); + +CREATE INDEX IF NOT EXISTS integration_work_logs_employee_idx +ON integration_work_logs (employee_id, work_date); + +CREATE INDEX IF NOT EXISTS integration_work_log_segments_project_idx +ON integration_work_log_segments (project_code, project_name); + +CREATE INDEX IF NOT EXISTS integration_vouchers_project_idx +ON integration_vouchers (project_code, project_name); + +CREATE UNIQUE INDEX IF NOT EXISTS integration_project_category_mappings_key_idx +ON integration_project_category_mappings (source_key, normalized_project_key); + DO $$ BEGIN IF NOT EXISTS ( @@ -157,6 +487,58 @@ BEGIN FOREIGN KEY (seat_slot_id) REFERENCES seat_slots(id) ON DELETE CASCADE; END IF; END $$; + +CREATE SCHEMA IF NOT EXISTS auth; + +CREATE TABLE IF NOT EXISTS auth.users ( + id BIGSERIAL PRIMARY KEY, + username TEXT NOT NULL UNIQUE, + password_hash TEXT NOT NULL, + display_name TEXT NOT NULL, + role TEXT NOT NULL DEFAULT 'admin', + member_id INTEGER NULL REFERENCES members(id) ON DELETE SET NULL, + is_active BOOLEAN NOT NULL DEFAULT TRUE, + created_from TEXT NOT NULL DEFAULT 'manual', + last_login_at TIMESTAMPTZ, + password_changed_at TIMESTAMPTZ, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS auth.sessions ( + id UUID PRIMARY KEY, + user_id BIGINT NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE, + expires_at TIMESTAMPTZ NOT NULL, + revoked_at TIMESTAMPTZ, + ip_address INET, + user_agent TEXT, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS auth.login_audit_logs ( + id BIGSERIAL PRIMARY KEY, + username TEXT NOT NULL, + user_id BIGINT NULL REFERENCES auth.users(id) ON DELETE SET NULL, + success BOOLEAN NOT NULL, + failure_reason TEXT, + ip_address INET, + user_agent TEXT, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +ALTER TABLE auth.users ADD COLUMN IF NOT EXISTS role TEXT NOT NULL DEFAULT 'admin'; +ALTER TABLE auth.users ADD COLUMN IF NOT EXISTS member_id INTEGER NULL REFERENCES members(id) ON DELETE SET NULL; +ALTER TABLE auth.users ADD COLUMN IF NOT EXISTS is_active BOOLEAN NOT NULL DEFAULT TRUE; +ALTER TABLE auth.users ADD COLUMN IF NOT EXISTS created_from TEXT NOT NULL DEFAULT 'manual'; +ALTER TABLE auth.users ADD COLUMN IF NOT EXISTS last_login_at TIMESTAMPTZ; +ALTER TABLE auth.users ADD COLUMN IF NOT EXISTS password_changed_at TIMESTAMPTZ; +ALTER TABLE auth.sessions ADD COLUMN IF NOT EXISTS revoked_at TIMESTAMPTZ; +ALTER TABLE auth.sessions ADD COLUMN IF NOT EXISTS ip_address INET; +ALTER TABLE auth.sessions ADD COLUMN IF NOT EXISTS user_agent TEXT; +ALTER TABLE auth.login_audit_logs ADD COLUMN IF NOT EXISTS user_id BIGINT NULL REFERENCES auth.users(id) ON DELETE SET NULL; +ALTER TABLE auth.login_audit_logs ADD COLUMN IF NOT EXISTS failure_reason TEXT; +ALTER TABLE auth.login_audit_logs ADD COLUMN IF NOT EXISTS ip_address INET; +ALTER TABLE auth.login_audit_logs ADD COLUMN IF NOT EXISTS user_agent TEXT; """ diff --git a/backend/app/main.py b/backend/app/main.py index 9ebb03b..e10739a 100755 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -2,26 +2,30 @@ from __future__ import annotations import csv import base64 -from datetime import datetime +from datetime import date, datetime, time, timedelta, timezone +import hashlib +import hmac from io import BytesIO, StringIO import json import math from pathlib import Path import re +import secrets import shutil import struct +import unicodedata import uuid import ezdxf from ezdxf import recover -from fastapi import FastAPI, File, Form, HTTPException, UploadFile +from fastapi import FastAPI, File, Form, Header, HTTPException, Request, UploadFile from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import FileResponse, HTMLResponse from fastapi.staticfiles import StaticFiles from openpyxl import load_workbook from pydantic import BaseModel, Field -from .config import LEGACY_DIR, MOCK_LOGIN_ENABLED, UPLOAD_DIR +from .config import BASE_DIR, LEGACY_DIR, MOCK_LOGIN_ENABLED, UPLOAD_DIR from .db import get_conn, init_db @@ -36,10 +40,30 @@ app.add_middleware( ) LEGACY_STATIC_DIR = LEGACY_DIR / "static" +INCOMING_FILES_DIR = BASE_DIR / "incoming-files" FIXED_OFFICE_SOURCE_KEY = "technical-development-center" FIXED_OFFICE_NAME = "기술개발센터" FIXED_OFFICE_TEMPLATE_PATH = Path(__file__).with_name("center_chair_viewer_template.html") _fixed_office_cache: dict[str, object] | None = None +AUTH_DEFAULT_PASSWORD = "1111" +AUTH_PASSWORD_ITERATIONS = 390000 +AUTH_SESSION_HOURS = 12 +PAYMENT_HEADER_ORDER = [ + "상신회사", "청구일", "발행일", "발행월", "계정코드", "관리계정코드", "각사 계정명", "프로젝트코드", + "사업명", "사업명(표출PJT)", "사업명(인트라넷기준)", "사업분야", "세부분야", "기획/개발/영업", + "대분류", "중분류", "소분류", "부서명", "팀명", "거래처", "적요", "차변공급가", "대변공급가", + "지출", "수입", "특이사항", "구분", "프로젝트성격", "", "", "", "", "", "", "", "", "" +] +MH_HEADER_ORDER = [ + "No", "근무일자", "주말/지각", "팀 분류", "팀", "사원번호", "이름", "직책", "user_state", "시차시간", + "사업 종류", "메인업무 프로젝트 코드", "메인업무 프로젝트명", "메인업무 서브 코드", "메인업무 근무시간", "검토", + "사업 종류", "추가업무1 프로젝트 코드", "추가업무1 프로젝트명", "추가업무1 서브 코드", "추가업무1 근무시간", + "사업 종류", "추가업무2 프로젝트 코드", "추가업무2 프로젝트명", "추가업무2 서브 코드", "추가업무2 근무시간", + "사업 종류", "추가업무3 프로젝트 코드", "추가업무3 프로젝트명", "추가업무3 서브 코드", "추가업무3 근무시간", + "사업 종류", "추가업무4 프로젝트 코드", "추가업무4 프로젝트명", "추가업무4 서브 코드", "추가업무4 근무시간", + "사업 종류", "추가업무5 프로젝트 코드", "추가업무5 프로젝트명", "추가업무5 서브 코드", "추가업무5 근무시간", + "사업 종류", "연장근무 프로젝트 코드", "연장근무 프로젝트명", "연장근무 서브코드", "연장근무 시간(실제)", "연장근무 시간(가공)" +] class MemberPayload(BaseModel): @@ -177,6 +201,197 @@ def serialize_member_payload(item: MemberPayload, sort_order: int) -> tuple[obje ) +def _encode_auth_bytes(value: bytes) -> str: + return base64.urlsafe_b64encode(value).decode("ascii").rstrip("=") + + +def _decode_auth_bytes(value: str) -> bytes: + padded = value + "=" * (-len(value) % 4) + return base64.urlsafe_b64decode(padded.encode("ascii")) + + +def hash_password(password: str, *, salt: bytes | None = None) -> str: + actual_salt = salt or secrets.token_bytes(16) + digest = hashlib.pbkdf2_hmac( + "sha256", + password.encode("utf-8"), + actual_salt, + AUTH_PASSWORD_ITERATIONS, + ) + return f"pbkdf2_sha256${AUTH_PASSWORD_ITERATIONS}${_encode_auth_bytes(actual_salt)}${_encode_auth_bytes(digest)}" + + +def verify_password(password: str, stored_hash: str) -> bool: + try: + algorithm, iterations_raw, salt_raw, digest_raw = stored_hash.split("$", 3) + if algorithm != "pbkdf2_sha256": + return False + iterations = int(iterations_raw) + salt = _decode_auth_bytes(salt_raw) + expected = _decode_auth_bytes(digest_raw) + except Exception: + return False + + actual = hashlib.pbkdf2_hmac( + "sha256", + password.encode("utf-8"), + salt, + iterations, + ) + return hmac.compare_digest(actual, expected) + + +def serialize_auth_user(user: dict[str, object]) -> dict[str, object]: + return { + "id": int(user["id"]), + "username": str(user.get("username") or ""), + "display_name": str(user.get("display_name") or ""), + "role": str(user.get("role") or "admin"), + "member_id": int(user["member_id"]) if user.get("member_id") is not None else None, + "rank": str(user.get("rank") or ""), + } + + +def build_auth_session_payload(user: dict[str, object], session_id: uuid.UUID, expires_at: datetime) -> dict[str, object]: + expires_at_text = expires_at.astimezone(timezone.utc).isoformat().replace("+00:00", "Z") + return { + "token": str(session_id), + "user": serialize_auth_user(user), + "session_expires_at": expires_at_text, + } + + +def extract_bearer_token(authorization: str | None) -> str | None: + if not authorization: + return None + scheme, _, token = authorization.partition(" ") + if scheme.lower() != "bearer" or not token.strip(): + return None + return token.strip() + + +def ensure_default_admin_user(cur) -> None: + cur.execute( + """ + INSERT INTO auth.users ( + username, password_hash, display_name, role, member_id, is_active, created_from, password_changed_at + ) + VALUES (%s, %s, %s, %s, NULL, TRUE, 'seed_admin', NOW()) + ON CONFLICT (username) DO UPDATE + SET password_hash = EXCLUDED.password_hash, + display_name = EXCLUDED.display_name, + role = EXCLUDED.role, + is_active = TRUE, + updated_at = NOW() + """, + ("1", hash_password("1"), "System Admin", "admin"), + ) + + +def sync_auth_users_from_members(cur) -> None: + cur.execute( + """ + SELECT id, employee_id, name + FROM members + WHERE COALESCE(TRIM(employee_id), '') <> '' + ORDER BY id ASC + """ + ) + members = cur.fetchall() + + cur.execute( + """ + SELECT id, username, password_hash, display_name, role, member_id, is_active, created_from + FROM auth.users + """ + ) + existing_users = cur.fetchall() + existing_by_member_id: dict[int, dict[str, object]] = {} + existing_by_username: dict[str, dict[str, object]] = {} + for user in existing_users: + if user.get("member_id") is not None: + existing_by_member_id[int(user["member_id"])] = user + username = str(user.get("username") or "").strip().lower() + if username: + existing_by_username[username] = user + + matched_user_ids: set[int] = set() + seen_usernames: set[str] = set() + default_hash = hash_password(AUTH_DEFAULT_PASSWORD) + + for member in members: + member_id = int(member["id"]) + username = str(member.get("employee_id") or "").strip().lower() + display_name = str(member.get("name") or "").strip() or username + if username in seen_usernames: + raise HTTPException(status_code=400, detail=f"중복 사번이 있어 로그인 계정을 생성할 수 없습니다: {username}") + seen_usernames.add(username) + existing = existing_by_member_id.get(member_id) or existing_by_username.get(username) + + if existing is None: + cur.execute( + """ + INSERT INTO auth.users ( + username, password_hash, display_name, role, member_id, is_active, created_from, password_changed_at + ) + VALUES (%s, %s, %s, %s, %s, TRUE, 'member_import', NOW()) + RETURNING id + """, + (username, default_hash, display_name, "admin", member_id), + ) + matched_user_ids.add(int(cur.fetchone()["id"])) + continue + + matched_user_ids.add(int(existing["id"])) + password_hash = str(existing.get("password_hash") or "").strip() or default_hash + cur.execute( + """ + UPDATE auth.users + SET username = %s, + password_hash = %s, + display_name = %s, + member_id = %s, + is_active = TRUE, + updated_at = NOW() + WHERE id = %s + """, + ( + username, + password_hash, + display_name, + member_id, + int(existing["id"]), + ), + ) + + if matched_user_ids: + cur.execute( + """ + UPDATE auth.users + SET is_active = FALSE, + member_id = NULL, + updated_at = NOW() + WHERE created_from = 'member_import' + AND id <> ALL(%s) + AND member_id IS NOT NULL + """, + (sorted(matched_user_ids),), + ) + else: + cur.execute( + """ + UPDATE auth.users + SET is_active = FALSE, + member_id = NULL, + updated_at = NOW() + WHERE created_from = 'member_import' + AND member_id IS NOT NULL + """ + ) + + ensure_default_admin_user(cur) + + def fetch_members() -> list[dict[str, object]]: with get_conn() as conn: with conn.cursor() as cur: @@ -1374,9 +1589,9 @@ def save_seat_layout(seat_map_id: int, payload: SeatLayoutPayload) -> list[dict[ if len(member_ids) != len(set(member_ids)): raise HTTPException(status_code=400, detail="같은 구성원을 중복 배치할 수 없습니다.") - if member_ids: - with get_conn() as conn: - with conn.cursor() as cur: + with get_conn() as conn: + with conn.cursor() as cur: + if member_ids: cur.execute("SELECT id FROM members WHERE id = ANY(%s)", (member_ids,)) existing_ids = {int(row["id"]) for row in cur.fetchall()} missing_ids = sorted(set(member_ids) - existing_ids) @@ -1423,12 +1638,38 @@ def save_seat_layout(seat_map_id: int, payload: SeatLayoutPayload) -> list[dict[ seat_label, ), ) - conn.commit() - else: - with get_conn() as conn: - with conn.cursor() as cur: + else: cur.execute("DELETE FROM seat_positions WHERE seat_map_id = %s", (seat_map_id,)) - conn.commit() + + # Keep the denormalized member seat label in sync so organization views can + # immediately reflect the latest saved seat assignment after reload. + cur.execute( + """ + UPDATE members + SET seat_label = '', + updated_at = NOW() + WHERE id IN ( + SELECT DISTINCT member_id + FROM seat_positions + WHERE seat_map_id = %s + UNION + SELECT id + FROM members + WHERE COALESCE(seat_label, '') <> '' + ) + """, + (seat_map_id,), + ) + cur.execute( + """ + UPDATE members AS m + SET seat_label = sp.seat_label, + updated_at = NOW() + FROM seat_positions AS sp + WHERE sp.member_id = m.id + """ + ) + conn.commit() return fetch_seat_layout(seat_map_id)["placements"] @@ -1548,6 +1789,7 @@ def replace_members(items: list[MemberPayload]) -> list[dict[str, object]]: stale_ids = [int(member["id"]) for member in existing_members if int(member["id"]) not in matched_ids] if stale_ids: cur.execute("DELETE FROM members WHERE id = ANY(%s)", (stale_ids,)) + sync_auth_users_from_members(cur) conn.commit() return fetch_members() @@ -1556,15 +1798,7 @@ def rows_to_member_payloads(rows: list[list[object]]) -> list[MemberPayload]: def normalize_header(value: object) -> str: return str(value or "").strip().lower() - header_idx = next( - ( - idx - for idx, row in enumerate(rows) - if {"이름", "부서"}.issubset({str(value).strip() for value in row}) - or {"name", "part"}.issubset({normalize_header(value) for value in row}) - ), - -1, - ) + header_idx = detect_member_header_index(rows) if header_idx < 0: raise HTTPException(status_code=400, detail="지원하지 않는 파일 형식입니다. 필수 헤더(이름/부서 또는 name/part)를 찾지 못했습니다.") @@ -1603,11 +1837,1516 @@ def parse_import_rows(file: UploadFile, content: bytes) -> list[MemberPayload]: raise HTTPException(status_code=400, detail="xlsx 또는 csv 파일만 업로드할 수 있습니다.") +def detect_member_header_index(rows: list[list[object]]) -> int: + def normalize_header(value: object) -> str: + return str(value or "").strip().lower() + + return next( + ( + idx + for idx, row in enumerate(rows) + if {"이름", "부서"}.issubset({str(value).strip() for value in row}) + or {"name", "part"}.issubset({normalize_header(value) for value in row}) + ), + -1, + ) + + +def clean_text(value: object) -> str: + return str(value or "").strip() + + +def canonicalize_member_name( + employee_id: str, + name: str, + by_employee_id: dict[str, dict[str, object]] | None = None, + aliases_by_name: dict[str, dict[str, object]] | None = None, +) -> str: + employee_id = clean_text(employee_id) + name = clean_text(name) + if aliases_by_name: + alias = aliases_by_name.get(name) + if alias: + canonical = clean_text(alias.get("canonical_name")) + if canonical: + return canonical + if employee_id and by_employee_id and employee_id in by_employee_id: + canonical = clean_text(by_employee_id[employee_id].get("name")) + if canonical: + return canonical + return name + + +def merge_members_with_mh_source( + organization_members: list[MemberPayload], + mh_work_logs: list[dict[str, object]], + overrides_by_employee_id: dict[str, dict[str, object]] | None = None, + retired_member_names: set[str] | None = None, + aliases_by_name: dict[str, dict[str, object]] | None = None, +) -> list[MemberPayload]: + merged: list[MemberPayload] = [item.model_copy(deep=True) for item in organization_members] + by_employee_id: dict[str, MemberPayload] = {} + by_name: dict[str, list[MemberPayload]] = {} + lookup_by_employee_id = { + clean_text(item.employee_id): {"name": item.name} + for item in merged + if clean_text(item.employee_id) + } + for item in merged: + employee_id = clean_text(item.employee_id) + if employee_id: + by_employee_id[employee_id] = item + name = clean_text(item.name) + if name: + by_name.setdefault(name, []).append(item) + + for entry in mh_work_logs: + employee_id = clean_text(entry.get("employee_id")) + canonical_name = canonicalize_member_name(employee_id, str(entry.get("member_name") or ""), lookup_by_employee_id, aliases_by_name) + if canonical_name in (retired_member_names or set()): + continue + target = by_employee_id.get(employee_id) if employee_id else None + if target is None: + candidates = by_name.get(canonical_name, []) + if len(candidates) == 1: + target = candidates[0] + + rank = clean_text(entry.get("title")) + department = clean_text(entry.get("team_category")) + team = clean_text(entry.get("team_name")) + work_status = clean_text(entry.get("user_state")) + + if target is None: + target = MemberPayload( + name=canonical_name, + employee_id=employee_id, + rank=rank, + role=rank, + department=department, + team=team, + work_status=work_status, + ) + merged.append(target) + if employee_id: + by_employee_id[employee_id] = target + lookup_by_employee_id[employee_id] = {"name": canonical_name} + by_name.setdefault(canonical_name, []).append(target) + continue + + if employee_id and not clean_text(target.employee_id): + target.employee_id = employee_id + by_employee_id[employee_id] = target + lookup_by_employee_id[employee_id] = {"name": target.name} + if canonical_name and clean_text(target.name) != canonical_name and employee_id and clean_text(target.employee_id) == employee_id: + target.name = canonical_name + if rank and not clean_text(target.rank): + target.rank = rank + if rank and not clean_text(target.role): + target.role = rank + if department and not clean_text(target.department): + target.department = department + if team and not clean_text(target.team): + target.team = team + if work_status and not clean_text(target.work_status): + target.work_status = work_status + + override = (overrides_by_employee_id or {}).get(employee_id) + if override: + for field_name in ( + "name", + "company", + "rank", + "role", + "department", + "grp", + "division", + "team", + "cell", + "work_status", + "work_time", + "phone", + "email", + "seat_label", + "photo_url", + ): + if field_name in override and override[field_name] is not None: + setattr(target, field_name, str(override[field_name])) + + if overrides_by_employee_id: + for item in merged: + employee_id = clean_text(item.employee_id) + override = overrides_by_employee_id.get(employee_id) + if not override: + continue + for field_name in ( + "name", + "company", + "rank", + "role", + "department", + "grp", + "division", + "team", + "cell", + "work_status", + "work_time", + "phone", + "email", + "seat_label", + "photo_url", + ): + if field_name in override and override[field_name] is not None: + setattr(item, field_name, str(override[field_name])) + + return merged + + +def parse_numeric(value: object) -> float: + if value is None: + return 0.0 + if isinstance(value, (int, float)): + return float(value) + text = clean_text(value).replace(",", "") + if not text: + return 0.0 + try: + return float(text) + except ValueError: + return 0.0 + + +def normalize_key_for_source(value: object) -> str: + return str(value or "").strip().replace(" ", "").lower() + + +def normalize_project_key_for_analysis(value: object) -> str: + text = unicodedata.normalize("NFKC", str(value or "")).lower() + text = re.sub(r"[\u200b-\u200d\ufeff]", "", text) + return re.sub(r"[^0-9a-z가-힣]", "", text) + + +def parse_date_value(value: object) -> str | None: + if value is None: + return None + if isinstance(value, datetime): + return value.date().isoformat() + text = clean_text(value) + if not text: + return None + normalized = text.replace(". ", "-").replace(".", "-").replace("/", "-") + for fmt in ("%Y-%m-%d", "%Y-%m-%d %H:%M:%S"): + try: + return datetime.strptime(normalized, fmt).date().isoformat() + except ValueError: + continue + return None + + +def build_parsecsv_like_row(headers: list[str], row_json: dict[str, object]) -> dict[str, object]: + values = [clean_text(row_json.get(header, "")) for header in headers] + parsed: dict[str, object] = {"__values": values} + for index, header in enumerate(headers): + if header: + parsed[header] = values[index] + normalized = normalize_key_for_source(header) + if normalized: + parsed[f"__n_{normalized}"] = values[index] + return parsed + + +def build_parsecsv_like_row_from_values(headers: list[str], row_values: list[object]) -> dict[str, object]: + values = [clean_text(row_values[index] if index < len(row_values) else "") for index in range(len(headers))] + parsed: dict[str, object] = {"__values": values} + for index, header in enumerate(headers): + if header: + parsed[header] = values[index] + normalized = normalize_key_for_source(header) + if normalized: + parsed[f"__n_{normalized}"] = values[index] + return parsed + + +def build_sheet_row(headers: list[str], row_json: dict[str, object]) -> list[str]: + return [clean_text(row_json.get(header, "")) for header in headers] + + +def normalize_excel_cell(value: object) -> object: + if isinstance(value, datetime): + return value.isoformat(sep=" ") + if isinstance(value, (date, time)): + return value.isoformat() + return value + + +def parse_organization_source(path: Path) -> tuple[list[dict[str, object]], list[MemberPayload]]: + workbook = load_workbook(path, data_only=True) + sheet = workbook[workbook.sheetnames[0]] + rows = [list(row) for row in sheet.iter_rows(values_only=True)] + payloads = rows_to_member_payloads(rows) + header_idx = detect_member_header_index(rows) + headers = [clean_text(value).lower() for value in rows[header_idx]] + raw_rows: list[dict[str, object]] = [] + for index, row in enumerate(rows[header_idx + 1 :], start=header_idx + 2): + values = [clean_text(value) for value in row] + if not any(values): + continue + raw_rows.append( + { + "row_index": index, + "row_json": { + header: values[col_idx] if col_idx < len(values) else "" + for col_idx, header in enumerate(headers) + if header + }, + } + ) + return raw_rows, payloads + + +def parse_mh_source( + path: Path, +) -> tuple[list[dict[str, object]], list[dict[str, object]], list[dict[str, object]], list[dict[str, object]], list[dict[str, object]]]: + workbook = load_workbook(path, data_only=True) + sheet = workbook["Sheet1"] + rows = [list(row) for row in sheet.iter_rows(values_only=True)] + headers = [clean_text(value) for value in rows[0]] + header_index = {header: idx for idx, header in enumerate(headers) if header} + raw_rows: list[dict[str, object]] = [] + raw_pm_rows: list[dict[str, object]] = [] + work_logs: list[dict[str, object]] = [] + segments: list[dict[str, object]] = [] + slot_specs = [ + ("메인업무", "메인업무 프로젝트 코드", "메인업무 프로젝트명", "메인업무 서브 코드", "메인업무 근무시간", None), + ("추가업무1", "추가업무1 프로젝트 코드", "추가업무1 프로젝트명", "추가업무1 서브 코드", "추가업무1 근무시간", None), + ("추가업무2", "추가업무2 프로젝트 코드", "추가업무2 프로젝트명", "추가업무2 서브 코드", "추가업무2 근무시간", None), + ("추가업무3", "추가업무3 프로젝트 코드", "추가업무3 프로젝트명", "추가업무3 서브 코드", "추가업무3 근무시간", None), + ("추가업무4", "추가업무4 프로젝트 코드", "추가업무4 프로젝트명", "추가업무4 서브 코드", "추가업무4 근무시간", None), + ("추가업무5", "추가업무5 프로젝트 코드", "추가업무5 프로젝트명", "추가업무5 서브 코드", "추가업무5 근무시간", None), + ("연장근무", "연장근무 프로젝트 코드", "연장근무 프로젝트명", "연장근무 서브코드", "연장근무 시간(실제)", "연장근무 시간(가공)"), + ] + + raw_rows.append( + { + "row_index": 1, + "row_json": {f"col_{col_idx}": normalize_excel_cell(value) for col_idx, value in enumerate(rows[0])}, + "row_values": [normalize_excel_cell(value) for value in rows[0]], + } + ) + + for row_index, row in enumerate(rows[1:], start=2): + values = [clean_text(value) for value in row] + if not any(values): + continue + record = { + headers[col_idx]: values[col_idx] if col_idx < len(values) else "" + for col_idx in range(len(headers)) + if headers[col_idx] + } + raw_rows.append( + { + "row_index": row_index, + "row_json": record, + "row_values": [normalize_excel_cell(value) for value in row], + } + ) + work_logs.append( + { + "row_index": row_index, + "work_date": parse_date_value(row[header_index["근무일자"]]) if "근무일자" in header_index else None, + "employee_id": values[header_index["사원번호"]] if "사원번호" in header_index else "", + "member_name": values[header_index["이름"]] if "이름" in header_index else "", + "title": values[header_index["직책"]] if "직책" in header_index else "", + "team_category": values[header_index["팀 분류"]] if "팀 분류" in header_index else "", + "team_name": values[header_index["팀"]] if "팀" in header_index else "", + "user_state": values[header_index["user_state"]] if "user_state" in header_index else "", + "shift_hours": parse_numeric(row[header_index["시차시간"]]) if "시차시간" in header_index else 0.0, + "weekend_late_flag": values[header_index["주말/지각"]] if "주말/지각" in header_index else "", + "review_status": values[header_index["검토"]] if "검토" in header_index else "", + } + ) + for slot_name, code_header, name_header, activity_header, hours_header, adjusted_header in slot_specs: + code_idx = header_index.get(code_header) + name_idx = header_index.get(name_header) + activity_idx = header_index.get(activity_header) + hours_idx = header_index.get(hours_header) + if code_idx is None or name_idx is None or activity_idx is None or hours_idx is None: + continue + business_type_idx = code_idx - 1 + project_code = values[code_idx] + project_name = values[name_idx] + hours = parse_numeric(row[hours_idx]) + if not project_code and not project_name and hours <= 0: + continue + segments.append( + { + "row_index": row_index, + "employee_id": values[header_index["사원번호"]] if "사원번호" in header_index else "", + "slot_name": slot_name, + "business_type": values[business_type_idx] if business_type_idx < len(values) else "", + "project_code": project_code, + "project_name": project_name, + "activity_code": values[activity_idx], + "hours": hours, + "overtime_hours_raw": hours if slot_name == "연장근무" else 0.0, + "overtime_hours_adjusted": parse_numeric(row[header_index[adjusted_header]]) if adjusted_header and adjusted_header in header_index else 0.0, + "is_overtime": slot_name == "연장근무", + } + ) + + pm_assignments: list[dict[str, object]] = [] + if "Sheet2" in workbook.sheetnames: + pm_sheet = workbook["Sheet2"] + for row_index, row in enumerate(pm_sheet.iter_rows(values_only=True), start=1): + raw_pm_rows.append( + { + "row_index": row_index, + "row_values": [normalize_excel_cell(value) for value in row], + } + ) + project_code = clean_text(row[0] if len(row) > 0 else "") + pm_name = clean_text(row[1] if len(row) > 1 else "") + if not project_code or not pm_name: + continue + pm_assignments.append({"row_index": row_index, "project_code": project_code, "pm_name": pm_name}) + + return raw_rows, raw_pm_rows, work_logs, segments, pm_assignments + + +def parse_payment_source(path: Path) -> tuple[list[dict[str, object]], list[dict[str, object]]]: + encodings = ["cp949", "utf-8-sig", "utf-8"] + last_error: Exception | None = None + for encoding in encodings: + try: + with path.open("r", encoding=encoding, newline="") as handle: + reader = csv.DictReader(handle) + raw_rows: list[dict[str, object]] = [] + vouchers: list[dict[str, object]] = [] + for row_index, row in enumerate(reader, start=2): + normalized = {clean_text(key): clean_text(value) for key, value in row.items() if key is not None} + if not any(normalized.values()): + continue + raw_rows.append({"row_index": row_index, "row_json": normalized}) + vouchers.append( + { + "row_index": row_index, + "accounting_company": normalized.get("상신회사", ""), + "claim_date": parse_date_value(normalized.get("청구일")), + "issue_date": parse_date_value(normalized.get("발행일")), + "issue_month": normalized.get("발행월", ""), + "account_code": normalized.get("계정코드", ""), + "management_account_code": normalized.get("관리계정코드", ""), + "account_name": normalized.get("각사 계정명", ""), + "project_code": normalized.get("프로젝트코드", ""), + "project_name": normalized.get("사업명", ""), + "display_project_name": normalized.get("사업명(표출PJT)", ""), + "intranet_project_name": normalized.get("사업명(인트라넷기준)", ""), + "business_area": normalized.get("사업분야", ""), + "business_subarea": normalized.get("세부분야", ""), + "planning_dev_sales": normalized.get("기획/개발/영업", ""), + "main_category": normalized.get("대분류", ""), + "middle_category": normalized.get("중분류", ""), + "sub_category": normalized.get("소분류", ""), + "department_name": normalized.get("부서명", ""), + "team_name": normalized.get("팀명", ""), + "customer_name": normalized.get("거래처", ""), + "summary_text": normalized.get("적요", ""), + "debit_supply_amount": parse_numeric(normalized.get("차변공급가")), + "credit_supply_amount": parse_numeric(normalized.get("대변공급가")), + "expense_amount": parse_numeric(normalized.get("지출")), + "income_amount": parse_numeric(normalized.get("수입")), + "voucher_type": normalized.get("구분", ""), + "project_nature": normalized.get("프로젝트성격", ""), + } + ) + return raw_rows, vouchers + except UnicodeDecodeError as exc: + last_error = exc + continue + raise HTTPException(status_code=400, detail=f"payment.csv 디코딩에 실패했습니다: {last_error}") + + +def parse_project_category_mapping_source(path: Path) -> list[dict[str, str]]: + encodings = ["cp949", "utf-8-sig", "utf-8"] + last_error: Exception | None = None + for encoding in encodings: + try: + with path.open("r", encoding=encoding, newline="") as handle: + reader = csv.DictReader(handle) + mappings: list[dict[str, str]] = [] + for row in reader: + project_name = clean_text(row.get("프로젝트명")) + if not project_name: + continue + mappings.append( + { + "source_key": "ptj_csv", + "project_name": project_name, + "normalized_project_key": normalize_project_key_for_analysis(project_name), + "mapped_d1": clean_text(row.get("매출/비매출")), + "mapped_d2": clean_text(row.get("분야")), + "mapped_d3": clean_text(row.get("세부분야")), + } + ) + return mappings + except UnicodeDecodeError as exc: + last_error = exc + continue + raise HTTPException(status_code=400, detail=f"ptj.csv 디코딩에 실패했습니다: {last_error}") + + +def fetch_member_lookup() -> tuple[dict[str, dict[str, object]], dict[str, list[dict[str, object]]]]: + members = fetch_members() + by_employee_id = { + clean_text(member.get("employee_id")): member + for member in members + if clean_text(member.get("employee_id")) + } + by_name: dict[str, list[dict[str, object]]] = {} + for member in members: + name = clean_text(member.get("name")) + if name: + by_name.setdefault(name, []).append(member) + return by_employee_id, by_name + + +def fetch_member_overrides() -> dict[str, dict[str, object]]: + with get_conn() as conn: + with conn.cursor() as cur: + cur.execute( + """ + SELECT employee_id, name, company, rank, role, department, grp, division, team, cell, + work_status, work_time, phone, email, seat_label, photo_url + FROM member_overrides + """ + ) + return { + clean_text(row["employee_id"]): dict(row) + for row in cur.fetchall() + if clean_text(row["employee_id"]) + } + + +def fetch_retired_member_names() -> set[str]: + with get_conn() as conn: + with conn.cursor() as cur: + cur.execute( + """ + SELECT name + FROM member_retirements + """ + ) + return { + clean_text(row["name"]) + for row in cur.fetchall() + if clean_text(row["name"]) + } + + +def fetch_member_aliases() -> dict[str, dict[str, object]]: + with get_conn() as conn: + with conn.cursor() as cur: + cur.execute( + """ + SELECT alias_name, canonical_name, employee_id, note + FROM member_aliases + """ + ) + return { + clean_text(row["alias_name"]): dict(row) + for row in cur.fetchall() + if clean_text(row["alias_name"]) + } + + +def find_member_id(employee_id: str, name: str, by_employee_id: dict[str, dict[str, object]], by_name: dict[str, list[dict[str, object]]]) -> int | None: + employee_id = clean_text(employee_id) + if employee_id and employee_id in by_employee_id: + return int(by_employee_id[employee_id]["id"]) + candidates = by_name.get(clean_text(name), []) + if len(candidates) == 1: + return int(candidates[0]["id"]) + return None + + +def dedupe_member_payloads(items: list[MemberPayload]) -> tuple[list[MemberPayload], int]: + deduped: list[MemberPayload] = [] + seen_keys: set[tuple[str, str]] = set() + duplicate_count = 0 + for item in items: + key = (clean_text(item.employee_id), clean_text(item.name)) + if key in seen_keys: + duplicate_count += 1 + continue + seen_keys.add(key) + deduped.append(item) + return deduped, duplicate_count + + +def upsert_project( + cur, + project_cache: dict[str, int], + project_code: str, + project_name: str, + *, + display_name: str = "", + intranet_name: str = "", + business_area: str = "", + business_subarea: str = "", + project_nature: str = "", + main_category: str = "", + middle_category: str = "", + sub_category: str = "", +) -> int | None: + project_code = clean_text(project_code) + if not project_code: + return None + if project_code in project_cache: + return project_cache[project_code] + cur.execute( + """ + INSERT INTO integration_projects ( + project_code, project_name, display_name, intranet_name, business_area, business_subarea, + project_nature, main_category, middle_category, sub_category, updated_at + ) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW()) + ON CONFLICT (project_code) DO UPDATE + SET project_name = EXCLUDED.project_name, + display_name = EXCLUDED.display_name, + intranet_name = EXCLUDED.intranet_name, + business_area = EXCLUDED.business_area, + business_subarea = EXCLUDED.business_subarea, + project_nature = EXCLUDED.project_nature, + main_category = EXCLUDED.main_category, + middle_category = EXCLUDED.middle_category, + sub_category = EXCLUDED.sub_category, + updated_at = NOW() + RETURNING id + """, + ( + project_code, + clean_text(project_name) or project_code, + clean_text(display_name), + clean_text(intranet_name), + clean_text(business_area), + clean_text(business_subarea), + clean_text(project_nature), + clean_text(main_category), + clean_text(middle_category), + clean_text(sub_category), + ), + ) + project_id = int(cur.fetchone()["id"]) + for alias_name, alias_type in ( + (clean_text(project_name), "project_name"), + (clean_text(display_name), "display_name"), + (clean_text(intranet_name), "intranet_name"), + ): + if not alias_name: + continue + cur.execute( + """ + INSERT INTO integration_project_aliases (project_id, alias_name, alias_type) + VALUES (%s, %s, %s) + ON CONFLICT (project_id, alias_name, alias_type) DO NOTHING + """, + (project_id, alias_name, alias_type), + ) + project_cache[project_code] = project_id + return project_id + + +def import_integration_sources() -> dict[str, object]: + organization_path = INCOMING_FILES_DIR / "organization.xlsx" + mh_path = INCOMING_FILES_DIR / "MH.xlsx" + payment_path = INCOMING_FILES_DIR / "payment.csv" + project_mapping_path = INCOMING_FILES_DIR / "ptj.csv" + for required_path in (organization_path, mh_path, payment_path): + if not required_path.exists(): + raise HTTPException(status_code=404, detail=f"필수 통합 파일이 없습니다: {required_path.name}") + + mh_raw_rows, mh_raw_pm_rows, mh_work_logs, mh_segments, mh_pm_assignments = parse_mh_source(mh_path) + organization_raw_rows, organization_members = parse_organization_source(organization_path) + organization_members, duplicate_member_count = dedupe_member_payloads(organization_members) + member_overrides = fetch_member_overrides() + retired_member_names = fetch_retired_member_names() + member_aliases = fetch_member_aliases() + organization_members = merge_members_with_mh_source( + organization_members, + mh_work_logs, + member_overrides, + retired_member_names, + member_aliases, + ) + organization_members, duplicate_member_count = dedupe_member_payloads(organization_members) + payment_raw_rows, payment_vouchers = parse_payment_source(payment_path) + project_category_mappings = parse_project_category_mapping_source(project_mapping_path) if project_mapping_path.exists() else [] + + replace_members(organization_members) + members_by_employee_id, members_by_name = fetch_member_lookup() + + with get_conn() as conn: + with conn.cursor() as cur: + cur.execute( + """ + TRUNCATE TABLE + integration_raw_mh_pm_rows, + integration_project_category_mappings, + integration_project_pm_assignments, + integration_project_aliases, + integration_work_log_segments, + integration_work_logs, + integration_vouchers, + integration_projects, + integration_raw_organization_rows, + integration_raw_mh_rows, + integration_raw_payment_rows, + integration_import_batches + RESTART IDENTITY + """ + ) + + batch_ids: dict[str, int] = {} + for source_key, source_name, source_path, row_count, meta_json in ( + ("organization", "조직 정보", str(organization_path), len(organization_raw_rows), {"members": len(organization_members)}), + ("mh", "근무시간 데이터", str(mh_path), len(mh_raw_rows), {"work_logs": len(mh_work_logs), "segments": len(mh_segments), "pm_rows": len(mh_raw_pm_rows)}), + ("payment", "전표 데이터", str(payment_path), len(payment_raw_rows), {"vouchers": len(payment_vouchers)}), + ): + cur.execute( + """ + INSERT INTO integration_import_batches (source_key, source_name, source_path, row_count, meta_json) + VALUES (%s, %s, %s, %s, %s::jsonb) + RETURNING id + """, + (source_key, source_name, source_path, row_count, json.dumps(meta_json, ensure_ascii=False)), + ) + batch_ids[source_key] = int(cur.fetchone()["id"]) + + for item in organization_raw_rows: + cur.execute( + "INSERT INTO integration_raw_organization_rows (batch_id, row_index, row_json) VALUES (%s, %s, %s::jsonb)", + (batch_ids["organization"], item["row_index"], json.dumps(item["row_json"], ensure_ascii=False)), + ) + for item in mh_raw_rows: + cur.execute( + """ + INSERT INTO integration_raw_mh_rows (batch_id, row_index, row_json, row_values_json) + VALUES (%s, %s, %s::jsonb, %s::jsonb) + """, + ( + batch_ids["mh"], + item["row_index"], + json.dumps(item["row_json"], ensure_ascii=False), + json.dumps(item["row_values"], ensure_ascii=False), + ), + ) + for item in mh_raw_pm_rows: + cur.execute( + """ + INSERT INTO integration_raw_mh_pm_rows (batch_id, row_index, row_values_json) + VALUES (%s, %s, %s::jsonb) + """, + (batch_ids["mh"], item["row_index"], json.dumps(item["row_values"], ensure_ascii=False)), + ) + for item in payment_raw_rows: + cur.execute( + "INSERT INTO integration_raw_payment_rows (batch_id, row_index, row_json) VALUES (%s, %s, %s::jsonb)", + (batch_ids["payment"], item["row_index"], json.dumps(item["row_json"], ensure_ascii=False)), + ) + for item in project_category_mappings: + cur.execute( + """ + INSERT INTO integration_project_category_mappings ( + source_key, project_name, normalized_project_key, mapped_d1, mapped_d2, mapped_d3 + ) + VALUES (%s, %s, %s, %s, %s, %s) + ON CONFLICT (source_key, normalized_project_key) DO UPDATE + SET project_name = EXCLUDED.project_name, + mapped_d1 = EXCLUDED.mapped_d1, + mapped_d2 = EXCLUDED.mapped_d2, + mapped_d3 = EXCLUDED.mapped_d3, + updated_at = NOW() + """, + ( + item["source_key"], + item["project_name"], + item["normalized_project_key"], + item["mapped_d1"], + item["mapped_d2"], + item["mapped_d3"], + ), + ) + + project_cache: dict[str, int] = {} + for segment in mh_segments: + upsert_project(cur, project_cache, str(segment["project_code"]), str(segment["project_name"])) + for voucher in payment_vouchers: + upsert_project( + cur, + project_cache, + str(voucher["project_code"]), + str(voucher["project_name"]), + display_name=str(voucher["display_project_name"]), + intranet_name=str(voucher["intranet_project_name"]), + business_area=str(voucher["business_area"]), + business_subarea=str(voucher["business_subarea"]), + project_nature=str(voucher["project_nature"]), + main_category=str(voucher["main_category"]), + middle_category=str(voucher["middle_category"]), + sub_category=str(voucher["sub_category"]), + ) + + for item in mh_pm_assignments: + project_id = project_cache.get(str(item["project_code"])) + if not project_id: + project_id = upsert_project(cur, project_cache, str(item["project_code"]), str(item["project_code"])) + pm_name = canonicalize_member_name("", str(item["pm_name"]), members_by_employee_id, member_aliases) + member_id = find_member_id("", pm_name, members_by_employee_id, members_by_name) + cur.execute( + """ + INSERT INTO integration_project_pm_assignments (project_id, member_id, pm_name, source_label) + VALUES (%s, %s, %s, 'mh_sheet2') + ON CONFLICT (project_id, source_label) DO UPDATE + SET member_id = EXCLUDED.member_id, + pm_name = EXCLUDED.pm_name + """, + (project_id, member_id, pm_name), + ) + + work_log_id_by_row_index: dict[int, int] = {} + for item in mh_work_logs: + canonical_name = canonicalize_member_name(str(item["employee_id"]), str(item["member_name"]), members_by_employee_id, member_aliases) + member_id = find_member_id(str(item["employee_id"]), canonical_name, members_by_employee_id, members_by_name) + cur.execute( + """ + INSERT INTO integration_work_logs ( + work_date, employee_id, member_id, member_name, title, team_category, team_name, user_state, + shift_hours, weekend_late_flag, review_status, source_row_index, raw_batch_id + ) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + RETURNING id + """, + ( + item["work_date"], + str(item["employee_id"]), + member_id, + canonical_name, + str(item["title"]), + str(item["team_category"]), + str(item["team_name"]), + str(item["user_state"]), + item["shift_hours"], + str(item["weekend_late_flag"]), + str(item["review_status"]), + item["row_index"], + batch_ids["mh"], + ), + ) + work_log_id_by_row_index[int(item["row_index"])] = int(cur.fetchone()["id"]) + + for item in mh_segments: + work_log_id = work_log_id_by_row_index.get(int(item["row_index"])) + if not work_log_id: + continue + project_id = project_cache.get(str(item["project_code"])) + cur.execute( + """ + INSERT INTO integration_work_log_segments ( + work_log_id, slot_name, project_id, project_code, project_name, business_type, + activity_code, hours, overtime_hours_raw, overtime_hours_adjusted, is_overtime + ) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + """, + ( + work_log_id, + str(item["slot_name"]), + project_id, + str(item["project_code"]), + str(item["project_name"]), + str(item["business_type"]), + str(item["activity_code"]), + item["hours"], + item["overtime_hours_raw"], + item["overtime_hours_adjusted"], + bool(item["is_overtime"]), + ), + ) + + for item in payment_vouchers: + project_id = project_cache.get(str(item["project_code"])) + cur.execute( + """ + INSERT INTO integration_vouchers ( + accounting_company, claim_date, issue_date, issue_month, account_code, management_account_code, account_name, + project_id, project_code, project_name, display_project_name, intranet_project_name, business_area, + business_subarea, planning_dev_sales, main_category, middle_category, sub_category, department_name, + team_name, customer_name, summary_text, debit_supply_amount, credit_supply_amount, expense_amount, + income_amount, voucher_type, project_nature, raw_batch_id, source_row_index + ) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + """, + ( + str(item["accounting_company"]), + item["claim_date"], + item["issue_date"], + str(item["issue_month"]), + str(item["account_code"]), + str(item["management_account_code"]), + str(item["account_name"]), + project_id, + str(item["project_code"]), + str(item["project_name"]), + str(item["display_project_name"]), + str(item["intranet_project_name"]), + str(item["business_area"]), + str(item["business_subarea"]), + str(item["planning_dev_sales"]), + str(item["main_category"]), + str(item["middle_category"]), + str(item["sub_category"]), + str(item["department_name"]), + str(item["team_name"]), + str(item["customer_name"]), + str(item["summary_text"]), + item["debit_supply_amount"], + item["credit_supply_amount"], + item["expense_amount"], + item["income_amount"], + str(item["voucher_type"]), + str(item["project_nature"]), + batch_ids["payment"], + item["row_index"], + ), + ) + conn.commit() + + return { + "batches": { + "organization": len(organization_raw_rows), + "mh": len(mh_raw_rows), + "payment": len(payment_raw_rows), + }, + "members_synced": len(organization_members), + "deduped_members": duplicate_member_count, + "projects": len(project_cache), + "work_logs": len(mh_work_logs), + "work_log_segments": len(mh_segments), + "project_pm_assignments": len(mh_pm_assignments), + "vouchers": len(payment_vouchers), + "project_category_mappings": len(project_category_mappings), + } + + +def fetch_integration_summary() -> dict[str, object]: + with get_conn() as conn: + with conn.cursor() as cur: + counts: dict[str, int] = {} + for label, table_name in ( + ("members", "members"), + ("projects", "integration_projects"), + ("work_logs", "integration_work_logs"), + ("work_log_segments", "integration_work_log_segments"), + ("vouchers", "integration_vouchers"), + ("organization_rows", "integration_raw_organization_rows"), + ("mh_rows", "integration_raw_mh_rows"), + ("payment_rows", "integration_raw_payment_rows"), + ): + cur.execute(f"SELECT COUNT(*) AS count FROM {table_name}") + counts[label] = int(cur.fetchone()["count"]) + cur.execute( + """ + SELECT source_key, source_name, source_path, row_count, imported_at, meta_json + FROM integration_import_batches + ORDER BY id ASC + """ + ) + batches = cur.fetchall() + cur.execute( + """ + SELECT + MIN(work_date) AS min_work_date, + MAX(work_date) AS max_work_date + FROM integration_work_logs + """ + ) + work_range = cur.fetchone() + cur.execute( + """ + SELECT + MIN(COALESCE(issue_date, claim_date)) AS min_voucher_date, + MAX(COALESCE(issue_date, claim_date)) AS max_voucher_date + FROM integration_vouchers + """ + ) + voucher_range = cur.fetchone() + return { + "counts": counts, + "batches": batches, + "date_ranges": { + "work": work_range, + "voucher": voucher_range, + }, + } + + +def normalize_date_filter(value: str | None) -> str | None: + text = clean_text(value) + if not text: + return None + normalized = text.replace("/", "-").replace(".", "-") + try: + return datetime.strptime(normalized, "%Y-%m-%d").date().isoformat() + except ValueError as exc: + raise HTTPException(status_code=400, detail=f"잘못된 날짜 형식입니다: {value}") from exc + + +def fetch_project_metrics(limit: int = 500, start_date: str | None = None, end_date: str | None = None) -> list[dict[str, object]]: + start_date = normalize_date_filter(start_date) + end_date = normalize_date_filter(end_date) + with get_conn() as conn: + with conn.cursor() as cur: + cur.execute( + """ + WITH work_by_project AS ( + SELECT + COALESCE(project_code, '') AS project_code, + COALESCE(NULLIF(project_name, ''), COALESCE(project_code, '')) AS project_name, + SUM(hours) AS total_hours, + SUM(overtime_hours_adjusted) AS overtime_hours, + COUNT(DISTINCT work_log_id) AS work_log_count + FROM integration_work_log_segments + JOIN integration_work_logs ON integration_work_logs.id = integration_work_log_segments.work_log_id + WHERE (%s::date IS NULL OR integration_work_logs.work_date >= %s::date) + AND (%s::date IS NULL OR integration_work_logs.work_date <= %s::date) + GROUP BY 1, 2 + ), + voucher_by_project AS ( + SELECT + COALESCE(project_code, '') AS project_code, + COALESCE(NULLIF(project_name, ''), COALESCE(project_code, '')) AS project_name, + SUM(income_amount) AS total_income, + SUM(expense_amount) AS total_expense, + COUNT(*) AS voucher_count + FROM integration_vouchers + WHERE (%s::date IS NULL OR COALESCE(issue_date, claim_date) >= %s::date) + AND (%s::date IS NULL OR COALESCE(issue_date, claim_date) <= %s::date) + GROUP BY 1, 2 + ) + SELECT + COALESCE(p.project_code, w.project_code, v.project_code) AS project_code, + COALESCE(NULLIF(p.project_name, ''), NULLIF(v.project_name, ''), NULLIF(w.project_name, ''), COALESCE(p.project_code, w.project_code, v.project_code)) AS project_name, + COALESCE(NULLIF(p.display_name, ''), NULLIF(v.project_name, ''), NULLIF(w.project_name, ''), '') AS display_name, + COALESCE(p.business_area, '') AS business_area, + COALESCE(p.business_subarea, '') AS business_subarea, + COALESCE(v.total_income, 0) AS total_income, + COALESCE(v.total_expense, 0) AS total_expense, + COALESCE(v.total_income, 0) - COALESCE(v.total_expense, 0) AS profit, + COALESCE(w.total_hours, 0) AS total_hours, + COALESCE(w.overtime_hours, 0) AS overtime_hours, + COALESCE(v.voucher_count, 0) AS voucher_count, + COALESCE(w.work_log_count, 0) AS work_log_count + FROM integration_projects p + FULL OUTER JOIN work_by_project w ON w.project_code = p.project_code + FULL OUTER JOIN voucher_by_project v ON v.project_code = COALESCE(p.project_code, w.project_code) + ORDER BY project_code ASC + LIMIT %s + """, + (start_date, start_date, end_date, end_date, start_date, start_date, end_date, end_date, limit), + ) + return cur.fetchall() + + +def fetch_member_metrics(limit: int = 500, start_date: str | None = None, end_date: str | None = None) -> list[dict[str, object]]: + start_date = normalize_date_filter(start_date) + end_date = normalize_date_filter(end_date) + with get_conn() as conn: + with conn.cursor() as cur: + cur.execute( + """ + SELECT + COALESCE(w.employee_id, m.employee_id, '') AS employee_id, + COALESCE(NULLIF(w.member_name, ''), m.name, '') AS member_name, + COALESCE(m.rank, '') AS rank, + COALESCE(NULLIF(w.team_name, ''), m.team, '') AS team_name, + COALESCE(NULLIF(w.team_category, ''), m.department, '') AS team_category, + COUNT(DISTINCT w.id) AS work_day_count, + COALESCE(SUM(s.hours), 0) AS total_hours, + COALESCE(SUM(s.overtime_hours_adjusted), 0) AS overtime_hours, + COUNT(DISTINCT NULLIF(s.project_code, '')) AS project_count + FROM integration_work_logs w + LEFT JOIN integration_work_log_segments s ON s.work_log_id = w.id + LEFT JOIN members m ON m.id = w.member_id + WHERE (%s::date IS NULL OR w.work_date >= %s::date) + AND (%s::date IS NULL OR w.work_date <= %s::date) + GROUP BY 1, 2, 3, 4, 5 + ORDER BY member_name ASC + LIMIT %s + """, + (start_date, start_date, end_date, end_date, limit), + ) + return cur.fetchall() + + +def fetch_team_metrics(start_date: str | None = None, end_date: str | None = None) -> list[dict[str, object]]: + start_date = normalize_date_filter(start_date) + end_date = normalize_date_filter(end_date) + with get_conn() as conn: + with conn.cursor() as cur: + cur.execute( + """ + SELECT + COALESCE(NULLIF(w.team_name, ''), m.team, '미지정 팀') AS team_name, + COALESCE(NULLIF(w.team_category, ''), m.department, '미지정 분류') AS team_category, + COUNT(DISTINCT w.member_id) FILTER (WHERE w.member_id IS NOT NULL) AS member_count, + COUNT(DISTINCT w.id) AS work_day_count, + COALESCE(SUM(s.hours), 0) AS total_hours, + COALESCE(SUM(s.overtime_hours_adjusted), 0) AS overtime_hours, + COUNT(DISTINCT NULLIF(s.project_code, '')) AS project_count + FROM integration_work_logs w + LEFT JOIN integration_work_log_segments s ON s.work_log_id = w.id + LEFT JOIN members m ON m.id = w.member_id + WHERE (%s::date IS NULL OR w.work_date >= %s::date) + AND (%s::date IS NULL OR w.work_date <= %s::date) + GROUP BY 1, 2 + ORDER BY total_hours DESC, team_name ASC + """, + (start_date, start_date, end_date, end_date), + ) + return cur.fetchall() + + +def fetch_project_breakdowns(start_date: str | None = None, end_date: str | None = None) -> dict[str, list[dict[str, object]]]: + start_date = normalize_date_filter(start_date) + end_date = normalize_date_filter(end_date) + with get_conn() as conn: + with conn.cursor() as cur: + cur.execute( + """ + SELECT + COALESCE(project_code, '') AS project_code, + COALESCE(NULLIF(project_name, ''), COALESCE(project_code, '')) AS project_name, + COALESCE(NULLIF(activity_code, ''), '미지정') AS activity_name, + SUM(hours) AS total_hours, + COUNT(DISTINCT work_log_id) AS work_log_count + FROM integration_work_log_segments + JOIN integration_work_logs ON integration_work_logs.id = integration_work_log_segments.work_log_id + WHERE (%s::date IS NULL OR integration_work_logs.work_date >= %s::date) + AND (%s::date IS NULL OR integration_work_logs.work_date <= %s::date) + GROUP BY 1, 2, 3 + ORDER BY total_hours DESC, project_code ASC, activity_name ASC + """, + (start_date, start_date, end_date, end_date), + ) + activity_rows = cur.fetchall() + + cur.execute( + """ + SELECT + COALESCE(project_code, '') AS project_code, + COALESCE(NULLIF(project_name, ''), COALESCE(project_code, '')) AS project_name, + COALESCE(voucher_type, '미분류') AS expense_type, + SUM(expense_amount) AS total_expense + FROM integration_vouchers + WHERE (%s::date IS NULL OR COALESCE(issue_date, claim_date) >= %s::date) + AND (%s::date IS NULL OR COALESCE(issue_date, claim_date) <= %s::date) + AND COALESCE(voucher_type, '') <> '제외' + GROUP BY 1, 2, 3 + ORDER BY total_expense DESC, project_code ASC, expense_type ASC + """, + (start_date, start_date, end_date, end_date), + ) + expense_rows = cur.fetchall() + return {"activities": activity_rows, "expenses": expense_rows} + + +def payment_analysis_get_value(row: dict[str, object], candidates: list[str], fallback_idx: int = -1) -> object: + for candidate in candidates: + if candidate in row and row[candidate] not in (None, ""): + return row[candidate] + normalized = normalize_key_for_source(candidate) + if normalized: + key = f"__n_{normalized}" + if key in row and row[key] not in (None, ""): + return row[key] + values = row.get("__values") or [] + if isinstance(values, list) and 0 <= fallback_idx < len(values): + return values[fallback_idx] + return "" + + +def payment_analysis_parse_number(value: object) -> float: + text = clean_text(value) + if not text: + return 0.0 + filtered = re.sub(r"[^0-9.\-]", "", text) + if not filtered: + return 0.0 + try: + return float(filtered) + except ValueError: + return 0.0 + + +def build_payment_work_rows_from_raw_mh( + raw_rows: list[list[object]], + category_by_project_key: dict[str, dict[str, str]], + fallback_category_by_project_key: dict[str, dict[str, str]], +) -> list[dict[str, object]]: + project_fields = [ + {"name": "메인업무 프로젝트명", "hour": "메인업무 근무시간", "sub": "메인업무 서브 코드", "overtime": False, "name_idx": 10, "hour_idx": 12}, + {"name": "추가업무1 프로젝트명", "hour": "추가업무1 근무시간", "sub": "추가업무1 서브 코드", "overtime": False, "name_idx": 16, "hour_idx": 18}, + {"name": "추가업무2 프로젝트명", "hour": "추가업무2 근무시간", "sub": "추가업무2 서브 코드", "overtime": False, "name_idx": 21, "hour_idx": 23}, + {"name": "추가업무3 프로젝트명", "hour": "추가업무3 근무시간", "sub": "추가업무3 서브 코드", "overtime": False, "name_idx": 26, "hour_idx": 28}, + {"name": "추가업무4 프로젝트명", "hour": "추가업무4 근무시간", "sub": "추가업무4 서브 코드", "overtime": False, "name_idx": 31, "hour_idx": 33}, + {"name": "추가업무5 프로젝트명", "hour": "추가업무5 근무시간", "sub": "추가업무5 서브 코드", "overtime": False, "name_idx": 36, "hour_idx": 38}, + {"name": "연장근무 프로젝트명", "hour": "연장근무 시간(가공)", "sub": "연장근무 서브 코드", "overtime": True, "name_idx": 41, "hour_idx": 44}, + ] + work_rows: list[dict[str, object]] = [] + for row_values in raw_rows: + row = build_parsecsv_like_row_from_values(MH_HEADER_ORDER, row_values) + overtime_hours_from_row = payment_analysis_parse_number( + payment_analysis_get_value( + row, + ["연장근무 시간(가공)", "연장근무시간(가공)", "연장근무 시간", "연장근무시간", "추가근무"], + 44, + ) + ) + segments: list[dict[str, object]] = [] + for field in project_fields: + project_name = clean_text(payment_analysis_get_value(row, [field["name"]], field["name_idx"])) + hours = payment_analysis_parse_number(payment_analysis_get_value(row, [field["hour"]], field["hour_idx"])) + activity = clean_text( + payment_analysis_get_value( + row, + [field["sub"], field["sub"].replace(" ", ""), "서브 코드"], + ) + ) + if not project_name or hours <= 0: + continue + segments.append( + { + "project_name": project_name, + "activity": activity, + "hours": hours, + "overtime": field["overtime"], + } + ) + if overtime_hours_from_row > 0 and not any(segment["overtime"] for segment in segments): + fallback_project = clean_text( + payment_analysis_get_value( + row, + ["메인업무 프로젝트명", "프로젝트명", "사업명(표출PJT)", "D4"], + 10, + ) + ) + fallback_activity = clean_text( + payment_analysis_get_value( + row, + ["연장근무 서브 코드", "메인업무 서브 코드", "서브 코드"], + ) + ) + if fallback_project: + segments.append( + { + "project_name": fallback_project, + "activity": fallback_activity, + "hours": overtime_hours_from_row, + "overtime": True, + } + ) + + position = clean_text(payment_analysis_get_value(row, ["직책", "직급"])) + user_state = clean_text(payment_analysis_get_value(row, ["user_state", "User State", "user state", "userstate", "User_State"])) + weekend_flag = clean_text(payment_analysis_get_value(row, ["주말/지각"])) + member_name = clean_text(payment_analysis_get_value(row, ["이름"])) + work_date = clean_text(payment_analysis_get_value(row, ["근무일자", "날짜", "일자"])) + imported_labor = payment_analysis_parse_number(payment_analysis_get_value(row, ["산정금액", "인건비"])) + if "이사" in position or "수석" in position: + rate = 46600 + elif "책임" in position: + rate = 40500 + elif "선임" in position: + rate = 35300 + else: + rate = 28900 + + if imported_labor > 0 and segments: + weighted = [] + total_weight = 0.0 + for idx, segment in enumerate(segments): + multiplier = 1.5 if ("주말" in user_state or segment["overtime"]) else 1.0 + weight = segment["hours"] * multiplier + weighted.append((idx, weight)) + total_weight += weight + allocations = [0] * len(segments) + if total_weight > 0: + raw_allocations = [] + for idx, weight in weighted: + raw_value = (imported_labor * weight) / total_weight + base = math.floor(raw_value) + raw_allocations.append({"idx": idx, "base": base, "frac": raw_value - base}) + remain = int(round(imported_labor - sum(part["base"] for part in raw_allocations))) + if remain > 0: + raw_allocations.sort(key=lambda item: (-item["frac"], item["idx"])) + for item in raw_allocations[:remain]: + item["base"] += 1 + elif remain < 0: + raw_allocations.sort(key=lambda item: (item["frac"], item["idx"])) + for item in raw_allocations[: abs(remain)]: + item["base"] -= 1 + raw_allocations.sort(key=lambda item: item["idx"]) + allocations = [int(item["base"]) for item in raw_allocations] + else: + allocations = [] + + d1_from_row = clean_text(payment_analysis_get_value(row, ["D1", "매출/비매출"])) + d2_from_row = clean_text(payment_analysis_get_value(row, ["D2", "사업분야", "분야"])) + d3_from_row = clean_text(payment_analysis_get_value(row, ["D3", "세부분야"])) + for idx, segment in enumerate(segments): + project_key = normalize_project_key_for_analysis(segment["project_name"]) + matched = category_by_project_key.get(project_key) or fallback_category_by_project_key.get(project_key) or {} + hours = float(segment["hours"]) + if allocations: + labor = int(allocations[idx] or 0) + else: + multiplier = 1.5 if ("주말" in user_state or segment["overtime"]) else 1.0 + labor = round(hours * rate * multiplier) + parsed_row = { + "__values": [ + work_date, + member_name, + position, + user_state, + segment["project_name"], + segment["activity"], + f"{hours:g}", + str(labor), + clean_text(matched.get("D1") or d1_from_row), + clean_text(matched.get("D2") or d2_from_row), + clean_text(matched.get("D3") or d3_from_row), + ], + "근무일자": work_date, + "__n_근무일자": work_date, + "날짜": work_date, + "__n_날짜": work_date, + "이름": member_name, + "__n_이름": member_name, + "직책": position, + "__n_직책": position, + "직급": position, + "__n_직급": position, + "user_state": user_state, + "__n_user_state": user_state, + "프로젝트명 매칭": clean_text(matched.get("프로젝트명 매칭") or segment["project_name"]), + "__n_프로젝트명매칭": clean_text(matched.get("프로젝트명 매칭") or segment["project_name"]), + "프로젝트명": segment["project_name"], + "__n_프로젝트명": segment["project_name"], + "서브 코드": segment["activity"], + "__n_서브코드": segment["activity"], + "시간": f"{hours:g}", + "__n_시간": f"{hours:g}", + "근무시간": f"{hours:g}", + "__n_근무시간": f"{hours:g}", + "산정금액": str(labor), + "__n_산정금액": str(labor), + "인건비": str(labor), + "__n_인건비": str(labor), + "D1": clean_text(matched.get("D1") or d1_from_row), + "__n_d1": clean_text(matched.get("D1") or d1_from_row), + "매출/비매출": clean_text(matched.get("D1") or d1_from_row), + "__n_매출비매출": clean_text(matched.get("D1") or d1_from_row), + "D2": clean_text(matched.get("D2") or d2_from_row), + "__n_d2": clean_text(matched.get("D2") or d2_from_row), + "사업분야": clean_text(matched.get("D2") or d2_from_row), + "__n_사업분야": clean_text(matched.get("D2") or d2_from_row), + "분야": clean_text(matched.get("D2") or d2_from_row), + "__n_분야": clean_text(matched.get("D2") or d2_from_row), + "D3": clean_text(matched.get("D3") or d3_from_row), + "__n_d3": clean_text(matched.get("D3") or d3_from_row), + "세부분야": clean_text(matched.get("D3") or d3_from_row), + "__n_세부분야": clean_text(matched.get("D3") or d3_from_row), + "projectName": segment["project_name"], + "workDate": work_date, + "workerName": member_name, + "position": position, + "activity": segment["activity"], + "hours": hours, + "labor": labor, + "d1": clean_text(matched.get("D1") or d1_from_row), + "d2": clean_text(matched.get("D2") or d2_from_row), + "d3": clean_text(matched.get("D3") or d3_from_row), + } + work_rows.append(parsed_row) + return work_rows + + +def fetch_payment_source_rows() -> dict[str, object]: + summary = fetch_integration_summary() + with get_conn() as conn: + with conn.cursor() as cur: + cur.execute( + """ + SELECT row_json + FROM integration_raw_payment_rows + ORDER BY row_index ASC + """ + ) + expense_rows = [build_parsecsv_like_row(PAYMENT_HEADER_ORDER, dict(row["row_json"])) for row in cur.fetchall()] + category_by_project_key: dict[str, dict[str, str]] = {} + for row in expense_rows: + project_name = clean_text(row.get("사업명(인트라넷기준)") or row.get("사업명(인트라넷 기준)") or "") + project_key = normalize_project_key_for_analysis(project_name) + if not project_key: + continue + category_by_project_key[project_key] = { + "D1": clean_text(row.get("대분류") or row.get("D1") or row.get("매출/비매출") or ""), + "D2": clean_text(row.get("중분류") or row.get("D2") or ""), + "D3": clean_text(row.get("소분류") or row.get("D3") or ""), + "프로젝트명 매칭": project_name, + } + cur.execute( + """ + SELECT normalized_project_key, project_name, mapped_d1, mapped_d2, mapped_d3 + FROM integration_project_category_mappings + ORDER BY project_name ASC + """ + ) + fallback_category_by_project_key = { + clean_text(row["normalized_project_key"]): { + "D1": clean_text(row["mapped_d1"]), + "D2": clean_text(row["mapped_d2"]), + "D3": clean_text(row["mapped_d3"]), + "프로젝트명 매칭": clean_text(row["project_name"]), + } + for row in cur.fetchall() + } + cur.execute( + """ + SELECT + w.work_date, + w.member_name, + w.title, + w.user_state, + w.weekend_late_flag, + s.project_name, + s.activity_code, + s.hours, + s.overtime_hours_adjusted, + s.is_overtime + FROM integration_work_log_segments s + JOIN integration_work_logs w ON w.id = s.work_log_id + ORDER BY w.work_date ASC, w.member_name ASC, s.project_name ASC, s.id ASC + """ + ) + work_rows = [] + for row in cur.fetchall(): + project_name = clean_text(row["project_name"]) + project_key = normalize_project_key_for_analysis(project_name) + matched = category_by_project_key.get(project_key) or fallback_category_by_project_key.get(project_key) or {} + position = clean_text(row["title"]) + raw_hours = float(row["hours"] or 0) + adjusted_overtime_hours = float(row["overtime_hours_adjusted"] or 0) + hours = adjusted_overtime_hours if bool(row["is_overtime"]) and adjusted_overtime_hours > 0 else raw_hours + hours = round(hours, 2) + rate = 28900 + if "이사" in position or "수석" in position: + rate = 46600 + elif "책임" in position: + rate = 40500 + elif "선임" in position: + rate = 35300 + labor = round(hours * rate * (1.5 if bool(row["is_overtime"]) or "주말" in clean_text(row["weekend_late_flag"]) else 1)) + parsed_row = { + "__values": [ + clean_text(row["work_date"]), + clean_text(row["member_name"]), + position, + clean_text(row["user_state"]), + project_name, + clean_text(row["activity_code"]), + f"{hours:g}", + str(labor), + clean_text(matched.get("D1", "")), + clean_text(matched.get("D2", "")), + clean_text(matched.get("D3", "")), + ], + "근무일자": clean_text(row["work_date"]), + "__n_근무일자": clean_text(row["work_date"]), + "날짜": clean_text(row["work_date"]), + "__n_날짜": clean_text(row["work_date"]), + "이름": clean_text(row["member_name"]), + "__n_이름": clean_text(row["member_name"]), + "직책": position, + "__n_직책": position, + "직급": position, + "__n_직급": position, + "user_state": clean_text(row["user_state"]), + "__n_user_state": clean_text(row["user_state"]), + "프로젝트명 매칭": clean_text(matched.get("프로젝트명 매칭") or project_name), + "__n_프로젝트명매칭": clean_text(matched.get("프로젝트명 매칭") or project_name), + "프로젝트명": project_name, + "__n_프로젝트명": project_name, + "서브 코드": clean_text(row["activity_code"]), + "__n_서브코드": clean_text(row["activity_code"]), + "시간": f"{hours:g}", + "__n_시간": f"{hours:g}", + "근무시간": f"{hours:g}", + "__n_근무시간": f"{hours:g}", + "산정금액": str(labor), + "__n_산정금액": str(labor), + "인건비": str(labor), + "__n_인건비": str(labor), + "D1": clean_text(matched.get("D1", "")), + "__n_d1": clean_text(matched.get("D1", "")), + "D2": clean_text(matched.get("D2", "")), + "__n_d2": clean_text(matched.get("D2", "")), + "D3": clean_text(matched.get("D3", "")), + "__n_d3": clean_text(matched.get("D3", "")), + } + work_rows.append(parsed_row) + return { + "expense_rows": expense_rows, + "work_rows": work_rows, + "date_ranges": summary["date_ranges"], + } + + +def fetch_mh_source_rows() -> dict[str, object]: + summary = fetch_integration_summary() + with get_conn() as conn: + with conn.cursor() as cur: + cur.execute( + """ + SELECT row_values_json + FROM integration_raw_mh_rows + ORDER BY row_index ASC + """ + ) + sheet_rows = [list(row["row_values_json"]) for row in cur.fetchall()] + cur.execute( + """ + SELECT row_values_json + FROM integration_raw_mh_pm_rows + ORDER BY row_index ASC + """ + ) + pm_rows = [list(row["row_values_json"]) for row in cur.fetchall()] + return { + "teamData": sheet_rows, + "pmSheet": pm_rows, + "date_ranges": summary["date_ranges"], + } + + @app.on_event("startup") def startup() -> None: UPLOAD_DIR.mkdir(parents=True, exist_ok=True) LEGACY_STATIC_DIR.mkdir(parents=True, exist_ok=True) + INCOMING_FILES_DIR.mkdir(parents=True, exist_ok=True) init_db() + with get_conn() as conn: + with conn.cursor() as cur: + sync_auth_users_from_members(cur) + conn.commit() app.mount("/legacy/static", StaticFiles(directory=LEGACY_STATIC_DIR, check_dir=False), name="legacy-static") @@ -1635,6 +3374,148 @@ def health() -> dict[str, object]: } +@app.post("/api/auth/login") +def auth_login( + request: Request, + username: str = Form(...), + password: str = Form(...), +) -> dict[str, object]: + normalized_username = username.strip().lower() + if not normalized_username or not password.strip(): + raise HTTPException(status_code=400, detail="사번과 비밀번호를 입력해주세요.") + + ip_address = request.client.host if request.client else None + user_agent = request.headers.get("user-agent", "") + + with get_conn() as conn: + with conn.cursor() as cur: + cur.execute( + """ + SELECT u.id, u.username, u.password_hash, u.display_name, u.role, u.member_id, u.is_active, + m.rank + FROM auth.users u + LEFT JOIN members m ON m.id = u.member_id + WHERE LOWER(u.username) = %s + """, + (normalized_username,), + ) + user = cur.fetchone() + + if user is None: + cur.execute( + """ + INSERT INTO auth.login_audit_logs (username, success, failure_reason, ip_address, user_agent) + VALUES (%s, FALSE, %s, %s, %s) + """, + (normalized_username, "unknown_user", ip_address, user_agent), + ) + conn.commit() + raise HTTPException(status_code=401, detail="사번 또는 비밀번호가 올바르지 않습니다.") + + if not bool(user.get("is_active")): + cur.execute( + """ + INSERT INTO auth.login_audit_logs (username, user_id, success, failure_reason, ip_address, user_agent) + VALUES (%s, %s, FALSE, %s, %s, %s) + """, + (normalized_username, int(user["id"]), "inactive_user", ip_address, user_agent), + ) + conn.commit() + raise HTTPException(status_code=403, detail="비활성화된 계정입니다.") + + if not verify_password(password, str(user.get("password_hash") or "")): + cur.execute( + """ + INSERT INTO auth.login_audit_logs (username, user_id, success, failure_reason, ip_address, user_agent) + VALUES (%s, %s, FALSE, %s, %s, %s) + """, + (normalized_username, int(user["id"]), "invalid_password", ip_address, user_agent), + ) + conn.commit() + raise HTTPException(status_code=401, detail="사번 또는 비밀번호가 올바르지 않습니다.") + + expires_at = datetime.now(timezone.utc) + timedelta(hours=AUTH_SESSION_HOURS) + session_id = uuid.uuid4() + cur.execute( + """ + INSERT INTO auth.sessions (id, user_id, expires_at, ip_address, user_agent) + VALUES (%s, %s, %s, %s, %s) + """, + (session_id, int(user["id"]), expires_at, ip_address, user_agent), + ) + cur.execute( + "UPDATE auth.users SET last_login_at = NOW(), updated_at = NOW() WHERE id = %s", + (int(user["id"]),), + ) + cur.execute( + """ + INSERT INTO auth.login_audit_logs (username, user_id, success, failure_reason, ip_address, user_agent) + VALUES (%s, %s, TRUE, NULL, %s, %s) + """, + (normalized_username, int(user["id"]), ip_address, user_agent), + ) + conn.commit() + + return build_auth_session_payload(user, session_id, expires_at) + + +@app.post("/api/auth/logout") +def auth_logout(authorization: str | None = Header(default=None)) -> dict[str, bool]: + token = extract_bearer_token(authorization) + if not token: + return {"ok": True} + + with get_conn() as conn: + with conn.cursor() as cur: + cur.execute( + """ + UPDATE auth.sessions + SET revoked_at = NOW() + WHERE id = %s + AND revoked_at IS NULL + """, + (token,), + ) + conn.commit() + return {"ok": True} + + +@app.get("/api/auth/me") +def auth_me(authorization: str | None = Header(default=None)) -> dict[str, object]: + token = extract_bearer_token(authorization) + if not token: + raise HTTPException(status_code=401, detail="인증 정보가 없습니다.") + + with get_conn() as conn: + with conn.cursor() as cur: + cur.execute( + """ + SELECT s.id AS session_id, s.expires_at, s.revoked_at, + u.id, u.username, u.display_name, u.role, u.member_id, u.is_active, + m.rank + FROM auth.sessions s + JOIN auth.users u ON u.id = s.user_id + LEFT JOIN members m ON m.id = u.member_id + WHERE s.id = %s + """, + (token,), + ) + row = cur.fetchone() + + if row is None or row.get("revoked_at") is not None: + raise HTTPException(status_code=401, detail="세션이 유효하지 않습니다.") + + expires_at = row["expires_at"] + now_utc = datetime.now(timezone.utc) + if expires_at is None or expires_at <= now_utc: + raise HTTPException(status_code=401, detail="세션이 만료되었습니다.") + + if not bool(row.get("is_active")): + raise HTTPException(status_code=403, detail="비활성화된 계정입니다.") + + return build_auth_session_payload(row, uuid.UUID(str(row["session_id"])), expires_at) + + @app.post("/api/mock-login") def mock_login(username: str = Form(...), password: str = Form(...)) -> dict[str, object]: if not MOCK_LOGIN_ENABLED: @@ -1676,6 +3557,7 @@ def create_member(payload: MemberPayload) -> dict[str, object]: serialize_member_payload(payload, payload.sort_order if payload.sort_order is not None else next_order), ) member = cur.fetchone() + sync_auth_users_from_members(cur) conn.commit() return {"item": member} @@ -1720,6 +3602,7 @@ def update_member(member_id: int, payload: MemberPayload) -> dict[str, object]: member = cur.fetchone() if member is None: raise HTTPException(status_code=404, detail="Member not found.") + sync_auth_users_from_members(cur) conn.commit() return {"item": member} @@ -1730,6 +3613,8 @@ def delete_member(member_id: int) -> dict[str, bool]: with conn.cursor() as cur: cur.execute("DELETE FROM members WHERE id = %s", (member_id,)) deleted = cur.rowcount > 0 + if deleted: + sync_auth_users_from_members(cur) conn.commit() if not deleted: raise HTTPException(status_code=404, detail="Member not found.") @@ -1743,6 +3628,60 @@ async def import_members(file: UploadFile = File(...)) -> dict[str, list[dict[st return {"items": replace_members(items)} +@app.post("/api/integration/import") +def import_integration_data() -> dict[str, object]: + return import_integration_sources() + + +@app.get("/api/integration/summary") +def integration_summary() -> dict[str, object]: + return fetch_integration_summary() + + +@app.get("/api/integration/projects") +def integration_projects(limit: int = 500, start_date: str | None = None, end_date: str | None = None) -> dict[str, list[dict[str, object]]]: + safe_limit = max(1, min(limit, 5000)) + return {"items": fetch_project_metrics(safe_limit, start_date=start_date, end_date=end_date)} + + +@app.get("/api/integration/members") +def integration_members(limit: int = 500, start_date: str | None = None, end_date: str | None = None) -> dict[str, list[dict[str, object]]]: + safe_limit = max(1, min(limit, 5000)) + return {"items": fetch_member_metrics(safe_limit, start_date=start_date, end_date=end_date)} + + +@app.get("/api/integration/teams") +def integration_teams(start_date: str | None = None, end_date: str | None = None) -> dict[str, list[dict[str, object]]]: + return {"items": fetch_team_metrics(start_date=start_date, end_date=end_date)} + + +@app.get("/api/integration/project-breakdowns") +def integration_project_breakdowns(start_date: str | None = None, end_date: str | None = None) -> dict[str, list[dict[str, object]]]: + return fetch_project_breakdowns(start_date=start_date, end_date=end_date) + + +@app.get("/api/integration/payment-source") +def integration_payment_source() -> dict[str, object]: + return fetch_payment_source_rows() + + +@app.get("/api/integration/mh-source") +def integration_mh_source() -> dict[str, object]: + return fetch_mh_source_rows() + + +@app.get("/api/integration/mh-workbook") +def integration_mh_workbook() -> FileResponse: + target = INCOMING_FILES_DIR / "MH.xlsx" + if not target.exists(): + raise HTTPException(status_code=404, detail="MH workbook not found.") + return FileResponse( + target, + media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + filename="MH.xlsx", + ) + + @app.post("/api/uploads/profile-photo") def upload_profile_photo(file: UploadFile = File(...), member_name: str = Form("")) -> dict[str, str]: suffix = Path(file.filename or "").suffix.lower() @@ -1967,6 +3906,22 @@ def legacy_organization_backup() -> FileResponse: return FileResponse(target) +@app.get("/integrations/payment") +def integration_payment() -> FileResponse: + target = INCOMING_FILES_DIR / "payment.html" + if not target.exists(): + raise HTTPException(status_code=404, detail="Payment integration file not found.") + return FileResponse(target) + + +@app.get("/integrations/mh") +def integration_mh() -> FileResponse: + target = INCOMING_FILES_DIR / "mh.html" + if not target.exists(): + raise HTTPException(status_code=404, detail="MH integration file not found.") + return FileResponse(target) + + @app.get("/uploads/{filename}") def get_upload(filename: str) -> FileResponse: target = UPLOAD_DIR / filename diff --git a/docker-compose.yml b/docker-compose.yml index ca7a024..af205f2 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -47,6 +47,7 @@ services: - ./DashBoard-organization.html:/app/legacy/DashBoard-organization.html:ro - ./DashBoard-organization-backup.html:/app/legacy/DashBoard-organization-backup.html:ro - ./legacy/static:/app/legacy/static:ro + - ./incoming-files:/app/incoming-files:ro - uploads_data:/data/uploads restart: unless-stopped healthcheck: diff --git a/docs/AUTH_DB_DESIGN.md b/docs/AUTH_DB_DESIGN.md new file mode 100644 index 0000000..06d5554 --- /dev/null +++ b/docs/AUTH_DB_DESIGN.md @@ -0,0 +1,359 @@ +# Auth DB Design + +## Goal + +현재 조직도 업무 데이터와 로그인 데이터를 분리한다. + +분리 원칙: +- 업무 데이터는 기존 `public.members`, `seat_maps`, `seat_positions` 중심으로 유지 +- 인증/권한 데이터는 별도 `auth` 스키마로 분리 +- 로그인 사용자는 필요할 때만 `members.id` 와 연결 + +이 방식이면 비밀번호, 세션, 감사로그를 업무 데이터와 분리해서 관리할 수 있고, +엑셀 임포트로 `members` 가 갱신돼도 인증 체계가 직접 흔들리지 않는다. + +## Scope + +이번 설계의 대상: +- 사용자 계정 +- 비밀번호 해시 +- 세션 +- 역할과 권한 +- 로그인 감사로그 +- 사용자와 조직 구성원 연결 + +이번 설계에서 제외: +- SSO 연동 +- OAuth/OpenID Connect +- MFA +- 비밀번호 재설정 메일 발송 + +## Recommended Structure + +권장 구조는 "같은 PostgreSQL, 다른 스키마" 이다. + +- 업무 스키마: `public` +- 인증 스키마: `auth` + +초기 운영에서는 DB 인스턴스를 분리하지 않아도 된다. +대신 아래 원칙은 바로 적용한다. + +- 애플리케이션 계정도 가능하면 읽기/쓰기 범위를 분리 +- 인증 관련 쿼리는 `auth.*` 만 접근 +- 업무 API 는 `public.*` 중심으로 접근 + +## Core Tables + +### `auth.users` + +로그인 가능한 계정의 기준 테이블. + +주요 컬럼: +- `id BIGSERIAL PRIMARY KEY` +- `username TEXT NOT NULL UNIQUE` +- `password_hash TEXT NOT NULL` +- `display_name TEXT NOT NULL` +- `email TEXT` +- `status TEXT NOT NULL DEFAULT 'active'` +- `member_id INTEGER NULL REFERENCES public.members(id) ON DELETE SET NULL` +- `last_login_at TIMESTAMPTZ` +- `password_changed_at TIMESTAMPTZ` +- `created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()` +- `updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()` + +상태값 권장: +- `active` +- `locked` +- `disabled` + +원칙: +- `username` 는 로그인 식별자 +- `member_id` 는 선택 연결 +- 구성원이 퇴사하거나 엑셀에서 빠져도 계정 자체는 바로 삭제하지 않음 + +### `auth.roles` + +권한 묶음 정의. + +주요 컬럼: +- `id BIGSERIAL PRIMARY KEY` +- `code TEXT NOT NULL UNIQUE` +- `name TEXT NOT NULL` +- `description TEXT` + +초기 권장 역할: +- `super_admin` +- `org_admin` +- `viewer` + +### `auth.user_roles` + +사용자와 역할의 다대다 연결. + +주요 컬럼: +- `user_id BIGINT NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE` +- `role_id BIGINT NOT NULL REFERENCES auth.roles(id) ON DELETE CASCADE` +- `created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()` +- `PRIMARY KEY (user_id, role_id)` + +### `auth.permissions` + +세분화된 권한 코드 정의. + +주요 컬럼: +- `id BIGSERIAL PRIMARY KEY` +- `code TEXT NOT NULL UNIQUE` +- `name TEXT NOT NULL` +- `description TEXT` + +초기 권장 권한: +- `member.read` +- `member.write` +- `member.import` +- `seatmap.read` +- `seatmap.write` +- `photo.upload` +- `admin.user.manage` + +### `auth.role_permissions` + +역할과 권한의 다대다 연결. + +주요 컬럼: +- `role_id BIGINT NOT NULL REFERENCES auth.roles(id) ON DELETE CASCADE` +- `permission_id BIGINT NOT NULL REFERENCES auth.permissions(id) ON DELETE CASCADE` +- `created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()` +- `PRIMARY KEY (role_id, permission_id)` + +### `auth.sessions` + +서버 세션 저장 테이블. + +주요 컬럼: +- `id UUID PRIMARY KEY` +- `user_id BIGINT NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE` +- `refresh_token_hash TEXT` +- `issued_at TIMESTAMPTZ NOT NULL DEFAULT NOW()` +- `expires_at TIMESTAMPTZ NOT NULL` +- `revoked_at TIMESTAMPTZ` +- `ip_address INET` +- `user_agent TEXT` +- `created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()` + +원칙: +- 브라우저 쿠키에는 세션 식별자만 저장 +- 토큰 자체를 평문으로 DB에 저장하지 않음 +- 만료와 강제 로그아웃을 DB에서 통제 가능하게 함 + +### `auth.login_audit_logs` + +로그인 시도와 결과 기록. + +주요 컬럼: +- `id BIGSERIAL PRIMARY KEY` +- `username TEXT NOT NULL` +- `user_id BIGINT NULL REFERENCES auth.users(id) ON DELETE SET NULL` +- `success BOOLEAN NOT NULL` +- `failure_reason TEXT` +- `ip_address INET` +- `user_agent TEXT` +- `created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()` + +용도: +- 로그인 실패 추적 +- 계정 잠금 기준 판단 +- 보안 감사 대응 + +## Relationship To Current `members` + +핵심은 `auth.users.member_id -> public.members.id` 연결이다. + +의미: +- 로그인 계정과 조직도 인원을 분리한다 +- 로그인하지 않는 구성원은 `members` 에만 있어도 된다 +- 외부 관리자 계정은 `member_id` 없이 운영할 수 있다 + +권장 규칙: +- 일반 사내 사용자는 `employee_id` 기준으로 계정-구성원 연결 +- 엑셀 동기화 시 `members.id` 유지가 중요하므로 이미 반영한 비교 기반 동기화 방식을 유지 +- `member_id` 연결이 끊긴 계정은 자동 삭제하지 말고 관리자 검토 대상으로 둔다 + +## Login Flow + +### 1. 로그인 요청 + +입력: +- `username` +- `password` + +처리: +- `auth.users` 에서 `username` 조회 +- `status != active` 이면 거부 +- `password_hash` 검증 +- 성공 시 `auth.sessions` 생성 +- `auth.login_audit_logs` 기록 + +응답 권장: +- 사용자 기본 정보 +- 역할 목록 +- 권한 목록 +- 세션 만료 시각 + +### 2. 인증 확인 + +각 보호 API 요청 시: +- 세션 쿠키 또는 Bearer 토큰 확인 +- `auth.sessions` 조회 +- 만료/폐기 여부 확인 +- 사용자 상태와 역할 재검증 + +### 3. 로그아웃 + +처리: +- 현재 세션의 `revoked_at` 업데이트 +- 클라이언트 쿠키 제거 + +## Authorization Model + +초기에는 RBAC 기반으로 충분하다. + +권장 역할별 범위: + +`super_admin` +- 사용자 관리 +- 권한 관리 +- 조직도/사진/자리배치 전체 수정 + +`org_admin` +- 조직도 조회/수정 +- 엑셀 임포트 +- 사진 업로드 +- 자리배치 수정 + +`viewer` +- 조직도 조회 +- 자리배치 조회 + +API 보호 예시: +- `GET /api/members`: `member.read` +- `POST /api/members/import`: `member.import` +- `POST /api/uploads/profile-photo`: `photo.upload` +- `PUT /api/seat-maps/{seat_map_id}/layout`: `seatmap.write` +- 사용자 관리 API: `admin.user.manage` + +## Password Policy + +비밀번호는 평문 저장 금지. + +권장: +- `Argon2id` 우선 +- 대안으로 `bcrypt` + +추가 원칙: +- 첫 구현부터 해시 알고리즘 버전 정보 포함 +- 비밀번호 변경 시 `password_changed_at` 갱신 +- 실패 횟수 기반 잠금은 앱 로직 또는 별도 컬럼으로 확장 가능 + +## Migration Plan + +### Phase 1 + +인증 스키마와 기본 테이블만 추가. + +작업: +- `CREATE SCHEMA IF NOT EXISTS auth` +- `auth.users` +- `auth.roles` +- `auth.user_roles` +- `auth.permissions` +- `auth.role_permissions` +- `auth.sessions` +- `auth.login_audit_logs` + +이 단계에서는 기존 `/api/mock-login` 유지 가능. + +### Phase 2 + +관리자 1명 이상을 수동 생성하고 실제 로그인 API 추가. + +권장 추가 API: +- `POST /api/auth/login` +- `POST /api/auth/logout` +- `GET /api/auth/me` + +### Phase 3 + +기존 프론트엔드의 mock 로그인 제거. + +변경 대상: +- [frontend/public/app.js](/home/hyunho/projects/mh-dashboard-organization/frontend/public/app.js) +- [backend/app/main.py](/home/hyunho/projects/mh-dashboard-organization/backend/app/main.py) +- [backend/app/config.py](/home/hyunho/projects/mh-dashboard-organization/backend/app/config.py) + +### Phase 4 + +권한 기반으로 API 보호 적용. + +우선순위: +1. 쓰기 API 보호 +2. 업로드 API 보호 +3. 읽기 API 권한 정리 + +## Recommended SQL Skeleton + +```sql +CREATE SCHEMA IF NOT EXISTS auth; + +CREATE TABLE IF NOT EXISTS auth.users ( + id BIGSERIAL PRIMARY KEY, + username TEXT NOT NULL UNIQUE, + password_hash TEXT NOT NULL, + display_name TEXT NOT NULL, + email TEXT, + status TEXT NOT NULL DEFAULT 'active', + member_id INTEGER NULL REFERENCES public.members(id) ON DELETE SET NULL, + last_login_at TIMESTAMPTZ, + password_changed_at TIMESTAMPTZ, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS auth.roles ( + id BIGSERIAL PRIMARY KEY, + code TEXT NOT NULL UNIQUE, + name TEXT NOT NULL, + description TEXT +); + +CREATE TABLE IF NOT EXISTS auth.user_roles ( + user_id BIGINT NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE, + role_id BIGINT NOT NULL REFERENCES auth.roles(id) ON DELETE CASCADE, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + PRIMARY KEY (user_id, role_id) +); + +CREATE TABLE IF NOT EXISTS auth.sessions ( + id UUID PRIMARY KEY, + user_id BIGINT NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE, + refresh_token_hash TEXT, + issued_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + expires_at TIMESTAMPTZ NOT NULL, + revoked_at TIMESTAMPTZ, + ip_address INET, + user_agent TEXT, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); +``` + +## Operational Notes + +- 엑셀 임포트는 계속 `public.members` 기준으로 처리 +- 로그인 계정 생성은 엑셀 업로드와 분리 +- 프로필 사진은 현재처럼 파일 저장 + `members.photo_url` 참조 유지 가능 +- 감사로그와 세션은 삭제보다 보존 기간 정책으로 관리 + +## Decision + +현재 프로젝트의 권장안은 아래 한 줄로 정리된다. + +"로그인 DB는 `auth` 스키마로 분리하고, 업무 DB는 `public` 에 유지하며, 두 영역은 `auth.users.member_id` 로만 연결한다." diff --git a/docs/DEVELOPMENT_HISTORY.md b/docs/DEVELOPMENT_HISTORY.md new file mode 100644 index 0000000..6221b2a --- /dev/null +++ b/docs/DEVELOPMENT_HISTORY.md @@ -0,0 +1,177 @@ +# Development History + +## Purpose + +이 문서는 `total` 브랜치에서 진행한 통합 작업을 기능 단위로 정리한 개발 히스토리다. +목표는 다음 두 가지다. + +- 지금까지 어떤 기능을 어떤 방식으로 붙였는지 빠르게 파악 +- 이후 유지보수나 추가 개발 시, 왜 그렇게 구현했는지 추적 가능하게 하기 + +## 1. 대시보드 허브 통합 + +### 작업 내용 + +- `조직 현황`, `프로젝트별 분석`, `팀/개인별 분석`, `자리배치도`를 하나의 메인 허브에서 오갈 수 있도록 통합 +- 공통 헤더, 로그인 정보, 탭 전환, 공통 기간 캘린더 구성 +- `payment.html`, `mh.html`은 초기에는 iframe 연결 방식으로 편입 + +### 해결 방식 + +- 기존 화면을 새로 재개발하지 않고, 먼저 메인 허브 안에 편입 +- 이후 데이터는 공통 API/DB 기준으로 전환하는 2단계 방식 채택 + +## 2. 조직현황 고도화 + +### 작업 내용 + +- 조직도 레거시 화면을 메인 허브에 연결 +- 관리자/비관리자 모드 정리 +- 구성원 상세 프로필 개선 +- 프로필 사진 업로드 연동 +- `재석위치` 카드 추가 + +### 해결 방식 + +- 레거시 조직도 화면은 유지하되 API를 통해 `members`를 읽는 구조로 전환 +- 상세 프로필의 `재석위치`는 문자열이 아니라 실제 자리배치도 viewer preview를 붙이는 방식으로 변경 + +## 3. 자리배치도 기능 재구성 + +### 작업 내용 + +- `기술개발센터` 고정 도면 기준 자리배치도 viewer 구성 +- 관리자 편집 화면과 비관리자 열람 화면 분리 +- 조직도에서 `+` 버튼으로 자리배치도 진입 +- 배치된 좌석의 이름/직급 라벨 표시 +- 좌석 hover, 클릭, 자리 비우기, 미배치 목록 복귀 흐름 구현 + +### 해결 방식 + +- DXF 업로드 기반 편집을 그대로 밀기보다, 실제 업무에 맞는 고정 도면 중심 구조로 정리 +- viewer 코드는 공통으로 쓰되, 화면은 + - 관리자 편집 + - 비관리자 열람 + - 구성원 상세 preview + 로 역할 분리 + +## 4. 자리배치도 저장 문제 해결 + +### 문제 + +- 관리자 화면에서는 배치가 된 것처럼 보여도 저장 후 조직도 상세 프로필에서는 `미배치` +- 비관리자 자리배치도에서도 배치 결과가 보이지 않음 + +### 원인 + +- `seat_positions_map_cell_idx (seat_map_id, row_index, col_index)` 유니크 인덱스가 슬롯 기반 도면에도 그대로 적용됨 +- 고정 도면 배치는 실제로 `seat_slot_id` 기준 저장인데, 모든 배치가 `(row_index=0, col_index=0)`으로 들어가 충돌 +- 그 결과 두 번째 좌석부터 `500 Internal Server Error`로 저장 실패 + +### 해결 + +- 슬롯 기반 도면에서는 `(seat_map_id, row_index, col_index)` 인덱스가 적용되지 않도록 수정 +- `seat_positions` 저장 후 `members.seat_label`도 같이 동기화 +- 조직도 iframe은 저장 완료 후 `seatmap-layout-updated` 메시지를 받아 cache를 비우고 재조회 + +### 결과 + +- 관리자 자리배치 저장이 실제 DB까지 반영됨 +- 저장된 배치는 재접속 후에도 유지 +- 조직현황 상세 프로필과 비관리자 자리배치도에서도 같은 배치를 읽을 수 있는 구조가 됨 + +## 5. 통합 DB 구축 + +### 작업 내용 + +- `organization.xlsx` +- `MH.xlsx` +- `payment.csv` + +세 원본을 하나의 PostgreSQL 기준으로 적재 + +### 핵심 테이블 + +- `members` +- `seat_maps` +- `seat_slots` +- `seat_positions` +- `integration_raw_organization_rows` +- `integration_raw_mh_rows` +- `integration_raw_payment_rows` +- `integration_work_logs` +- `integration_work_log_segments` +- `integration_vouchers` +- `integration_projects` +- `integration_project_category_mappings` + +### 해결 방식 + +- 원본 보존용 raw 테이블과 운영용 표준 테이블을 분리 +- 화면이 직접 파일을 읽지 않고, DB와 API를 통해 같은 데이터를 보도록 정리 + +## 6. 프로젝트별 분석 통합 + +### 작업 내용 + +- `opayment.html` 원본 기준으로 화면, 카테고리, 계산식 복원 +- `payment.csv`와 `MH.xlsx`를 함께 쓰는 구조로 정리 +- `payment.csv` 분류를 1순위, `ptj.csv` 프로젝트 매핑을 2순위로 적용 + +### 해결한 문제 + +- 연장근무 시간을 `실제`가 아니라 `가공` 기준으로 써야 원본과 총합이 맞음 +- 프로젝트 분류는 `payment.csv`만으로 부족해 `ptj.csv` 보정이 필요 + +### 결과 + +- 총합과 대부분의 프로젝트 집계가 원본 `opayment` 기준에 가깝게 정렬됨 +- 남은 차이는 소수점 또는 추가 매핑 보정 수준으로 축소 + +## 7. 팀/개인별 분석 통합 + +### 작업 내용 + +- `omh.html` 원본 기준으로 화면, 카테고리, 계산식 복원 +- 업로드형이 아니라 통합 DB raw MH 데이터를 다시 공급하는 방식으로 전환 + +### 해결 방식 + +- 원본 `MH.xlsx` 시트 구조가 깨지지 않도록 row 배열 자체를 DB에 저장 +- 팀별 진행 프로젝트 등 원본 계산식이 기대하는 입력 구조를 그대로 재현 + +## 8. 조직 데이터 운영 정리 + +### 작업 내용 + +- 이름 alias, 퇴사 제외, 조직 override를 코드 상수에서 제거 +- DB 테이블 기반 운영으로 전환 + +### 운영 테이블 + +- `member_aliases` +- `member_retirements` +- `member_overrides` + +### 결과 + +- 이름 치환, 퇴사 제외, 팀/직책 예외를 코드 수정 없이 DB에서 관리 가능 + +## 9. 외부 접속 설정 + +### 작업 내용 + +- WSL 내부 `0.0.0.0:8080` 바인딩 확인 +- Windows host에서 `portproxy`와 방화벽 규칙으로 다른 PC 접속 가능하게 정리 + +### 유의사항 + +- Windows LAN IP 또는 WSL IP가 바뀌면 `portproxy`의 `connectaddress`는 다시 맞춰야 한다 +- 운영 안정성을 위해 향후 자동화 스크립트화가 필요함 + +## Next Focus + +- 프로젝트별 분석의 남은 소수점/분류 오차 정리 +- 자리배치도 색상/조직 트리 등 추가 UX 기능 고도화 +- 실제 인증 체계 전환 +- 나머지 사무실 도면 추가 diff --git a/docs/INTEGRATION_DB_PLAN.md b/docs/INTEGRATION_DB_PLAN.md new file mode 100644 index 0000000..06d78a1 --- /dev/null +++ b/docs/INTEGRATION_DB_PLAN.md @@ -0,0 +1,263 @@ +# Integration DB Plan + +## Goal + +`organization.xlsx`, `MH.xlsx`, `payment.csv`를 하나의 통합 DB로 수용하고, +`조직 현황`, `프로젝트별 분석`, `팀/개인별 분석`, `자리배치도`가 같은 기준 데이터를 바라보도록 정리한다. + +## Source Summary + +### 1. `organization.xlsx` + +용도: +- 인원 기본 정보 +- 조직 구조 + +주요 컬럼: +- `name` +- `tag` +- `rank` +- `pos` +- `co` +- `cell` +- `team` +- `div` +- `gr` +- `part` +- `ph` +- `mail` + +해석: +- `tag`는 사번 또는 내부 인원 식별자로 사용 +- 조직 정보는 `part > gr > div > team > cell` 구조 + +### 2. `MH.xlsx` + +용도: +- 일자별 인원 근무 실적 +- 프로젝트별 투입 시간 +- 연장근무 포함 세부 투입 슬롯 + +주요 컬럼: +- `근무일자` +- `팀 분류` +- `팀` +- `사원번호` +- `이름` +- `직책` +- `user_state` +- `시차시간` +- `메인업무/추가업무1~5/연장근무` + - `프로젝트 코드` + - `프로젝트명` + - `서브 코드` + - `근무시간` + +추가 시트: +- `Sheet2` + - 프로젝트 코드와 PM 이름 매핑으로 추정 + +### 3. `payment.csv` + +용도: +- 프로젝트별 수입/지출 전표 + +주요 컬럼: +- `프로젝트코드` +- `사업명` +- `사업명(표출PJT)` +- `사업명(인트라넷기준)` +- `사업분야` +- `세부분야` +- `부서명` +- `팀명` +- `거래처` +- `적요` +- `차변공급가` +- `대변공급가` +- `지출` +- `수입` +- `구분` +- `프로젝트성격` + +## Recommended Model + +### Raw Layer + +원본을 그대로 적재하는 영역. + +- `raw_organization_import` +- `raw_mh_import` +- `raw_payment_import` + +원칙: +- 원본 행을 최대한 손대지 않고 저장 +- 파일명, 업로드시각, 배치 ID 같이 저장 + +### Standard Layer + +정규화된 운영 테이블. + +#### Members + +- `members` + - `id` + - `employee_id` + - `name` + - `company` + - `rank` + - `position` + - `phone` + - `email` + - `active` + +#### Organization + +- `org_units` + - `id` + - `unit_type` + - `name` + - `parent_id` + +- `member_org_assignments` + - `id` + - `member_id` + - `part_name` + - `group_name` + - `division_name` + - `team_name` + - `cell_name` + - `effective_from` + - `effective_to` + +#### Projects + +- `projects` + - `id` + - `project_code` + - `project_name` + - `display_name` + - `intranet_name` + - `domain` + - `subdomain` + - `project_type` + - `project_nature` + +- `project_aliases` + - `id` + - `project_id` + - `alias_type` + - `alias_value` + +- `project_pm_assignments` + - `id` + - `project_id` + - `member_id` + - `source` + +#### Work Logs + +- `work_logs` + - `id` + - `member_id` + - `work_date` + - `team_category` + - `team_name` + - `user_state` + - `shift_hours` + - `late_flag` + +- `work_log_segments` + - `id` + - `work_log_id` + - `project_id` + - `activity_code` + - `hours` + - `is_overtime` + - `slot_type` + +#### Vouchers + +- `vouchers` + - `id` + - `company_name` + - `request_date` + - `issue_date` + - `issue_month` + - `account_code` + - `management_account_code` + - `project_id` + - `department_name` + - `team_name` + - `customer_name` + - `summary` + - `debit_amount` + - `credit_amount` + - `expense_amount` + - `income_amount` + - `voucher_type` + - `project_nature` + - `note` + +#### Reference + +- `member_cost_rates` + - 직급별 표준 인건비 + +## Matching Rules + +### Member Match + +우선순위: +1. `MH.xlsx.사원번호` +2. `organization.xlsx.tag` +3. 이름 단독 매칭은 보조 규칙으로만 사용 + +원칙: +- `employee_id`가 있으면 그 값으로 병합 +- 이름만 같은 경우 자동 병합 금지 + +### Project Match + +우선순위: +1. `project_code` +2. `사업명(인트라넷기준)` +3. `사업명(표출PJT)` +4. `프로젝트명` + +원칙: +- `project_code`를 정식 키로 사용 +- 이름 차이는 `project_aliases`로 흡수 + +## Migration Strategy + +### Phase 1 + +- `payment.html`, `mh.html`을 현재 대시보드 탭에 편입 +- 기존 HTML 기능은 유지 +- 파일은 backend route를 통해 iframe으로 연결 + +### Phase 2 + +- raw import 테이블 생성 +- 원본 3종 import 스크립트 작성 +- 파일별 업로드/재적재 배치 ID 관리 + +### Phase 3 + +- 표준 테이블 생성 +- raw -> standard 정규화 파이프라인 작성 +- 멤버/프로젝트 매핑 규칙 적용 + +### Phase 4 + +- `payment.html`, `mh.html`의 파일 직접 파싱 로직을 API 기반 조회로 전환 +- 프론트는 공통 DB 기준으로만 동작 + +## Immediate Next Tasks + +1. Postgres 스키마 초안 SQL 작성 +2. `payment.csv` import 파서 작성 +3. `MH.xlsx` import 파서 작성 +4. `organization.xlsx` import 파서 작성 +5. 멤버/프로젝트 중복 병합 규칙 구현 diff --git a/frontend/public/app.js b/frontend/public/app.js index e68e32f..ab0d877 100644 --- a/frontend/public/app.js +++ b/frontend/public/app.js @@ -8,9 +8,16 @@ const logoutBtn = document.getElementById("logout-btn"); const userBadge = document.getElementById("user-badge"); const userPopover = document.getElementById("user-popover"); const currentViewTitle = document.getElementById("current-view-title"); +const globalDateControls = document.getElementById("global-date-controls"); +const globalStartDateInput = document.getElementById("global-start-date"); +const globalEndDateInput = document.getElementById("global-end-date"); const navButtons = Array.from(document.querySelectorAll(".header-center [data-view]")); const organizationFrame = document.getElementById("organization-frame"); const organizationStage = document.getElementById("organization-stage"); +const projectFrame = document.getElementById("project-frame"); +const projectStage = document.getElementById("project-stage"); +const teamFrame = document.getElementById("team-frame"); +const teamStage = document.getElementById("team-stage"); const seatMapAdminStage = document.getElementById("seatmap-admin-stage"); const seatMapReadonlyStage = document.getElementById("seatmap-readonly-stage"); const emptyStage = document.getElementById("empty-stage"); @@ -142,6 +149,11 @@ const seatMapState = { }; let currentView = "organization"; +const globalDateState = { + loaded: true, + startDate: "2026-01-01", + endDate: "2026-01-31", +}; function getSession() { try { @@ -159,6 +171,71 @@ function clearSession() { sessionStorage.removeItem(sessionKey); } +function buildAuthHeaders(headers) { + const nextHeaders = new Headers(headers || {}); + const token = getSession()?.token; + if (token && !nextHeaders.has("Authorization")) { + nextHeaders.set("Authorization", `Bearer ${token}`); + } + return nextHeaders; +} + +function shouldShowGlobalDateControls() { + return currentView === "ledger" || currentView === "project" || currentView === "team" || currentView === "organization"; +} + +function syncGlobalDateControlVisibility() { + if (!globalDateControls) return; + globalDateControls.classList.toggle("hidden", !shouldShowGlobalDateControls()); +} + +function syncGlobalDateControlInputs() { + if (globalStartDateInput) globalStartDateInput.value = globalDateState.startDate || ""; + if (globalEndDateInput) globalEndDateInput.value = globalDateState.endDate || ""; +} + +function getGlobalDateRangePayload() { + return { + source: "total-control", + type: "date-range", + startDate: globalDateState.startDate || "", + endDate: globalDateState.endDate || "", + }; +} + +function postGlobalDateRangeToFrame(frame) { + if (!frame?.contentWindow || !globalDateState.loaded) return; + frame.contentWindow.postMessage(getGlobalDateRangePayload(), window.location.origin); +} + +function notifyEmbeddedTabActivated() { + if (currentView === "project" && projectFrame?.contentWindow) { + projectFrame.contentWindow.postMessage({ source: "total-control", type: "tab-activated", tab: "project" }, window.location.origin); + } + if (currentView === "team" && teamFrame?.contentWindow) { + teamFrame.contentWindow.postMessage({ source: "total-control", type: "tab-activated", tab: "mh" }, window.location.origin); + } +} + +async function ensureGlobalDateRangeLoaded() { + if (globalDateState.loaded) return; + try { + const payload = await fetchJson("/api/integration/summary"); + const work = payload?.date_ranges?.work || {}; + const voucher = payload?.date_ranges?.voucher || {}; + const starts = [work.min_work_date, voucher.min_voucher_date].filter(Boolean).sort(); + const ends = [work.max_work_date, voucher.max_voucher_date].filter(Boolean).sort(); + globalDateState.startDate = starts[0] ? String(starts[0]).slice(0, 10) : ""; + globalDateState.endDate = ends.length ? String(ends[ends.length - 1]).slice(0, 10) : ""; + globalDateState.loaded = true; + syncGlobalDateControlInputs(); + postGlobalDateRangeToFrame(projectFrame); + postGlobalDateRangeToFrame(teamFrame); + } catch (error) { + console.error("공통 기간을 불러오지 못했습니다.", error); + } +} + function hideUserPopover() { userPopover?.classList.add("hidden"); } @@ -1063,7 +1140,11 @@ function handleEmbeddedNavigationMessage(event) { } async function fetchJson(url, options) { - const response = await fetch(resolveAppUrl(url), options); + const requestOptions = { + ...options, + headers: buildAuthHeaders(options?.headers), + }; + const response = await fetch(resolveAppUrl(url), requestOptions); let payload = null; try { payload = await response.json(); @@ -1220,6 +1301,9 @@ async function saveSeatLayout() { body: JSON.stringify({ placements: seatMapState.draftPlacements }), }); await loadSeatMapData(true); + if (organizationFrame?.contentWindow) { + organizationFrame.contentWindow.postMessage({ type: "seatmap-layout-updated" }, window.location.origin); + } setSeatMapStatus("자리배치를 저장했습니다.", "success"); } catch (error) { setSeatMapStatus(error.message || "자리배치도 저장에 실패했습니다.", "error"); @@ -1285,6 +1369,10 @@ function setActiveView(view) { if (currentViewTitle) { currentViewTitle.textContent = viewLabels[currentView]; } + syncGlobalDateControlVisibility(); + if (shouldShowGlobalDateControls()) { + ensureGlobalDateRangeLoaded(); + } navButtons.forEach((button) => { const active = button.dataset.view === currentView; @@ -1293,12 +1381,22 @@ function setActiveView(view) { }); const isOrganization = currentView === "organization"; + const isProject = currentView === "project"; + const isTeam = currentView === "team"; const isSeatMapAdmin = currentView === "seatmap-admin"; const isSeatMapReadonly = currentView === "seatmap-readonly"; if (organizationStage) { organizationStage.hidden = !isOrganization; organizationStage.style.display = isOrganization ? "flex" : "none"; } + if (projectStage) { + projectStage.hidden = !isProject; + projectStage.style.display = isProject ? "flex" : "none"; + } + if (teamStage) { + teamStage.hidden = !isTeam; + teamStage.style.display = isTeam ? "flex" : "none"; + } if (seatMapAdminStage) { seatMapAdminStage.hidden = !isSeatMapAdmin; seatMapAdminStage.style.display = isSeatMapAdmin ? "flex" : "none"; @@ -1308,7 +1406,7 @@ function setActiveView(view) { seatMapReadonlyStage.style.display = isSeatMapReadonly ? "flex" : "none"; } if (emptyStage) { - const showEmpty = !isOrganization && !isSeatMapAdmin && !isSeatMapReadonly; + const showEmpty = !isOrganization && !isProject && !isTeam && !isSeatMapAdmin && !isSeatMapReadonly; emptyStage.hidden = !showEmpty; emptyStage.style.display = showEmpty ? "flex" : "none"; } @@ -1317,9 +1415,22 @@ function setActiveView(view) { const frameSrc = organizationFrame.dataset.src || organizationFrame.src; organizationFrame.src = resolveAppUrl(frameSrc); } + if (isProject && previousView !== "project" && projectFrame) { + const frameSrc = projectFrame.dataset.src || projectFrame.src; + projectFrame.src = resolveAppUrl(frameSrc); + } else if (isProject) { + postGlobalDateRangeToFrame(projectFrame); + } + if (isTeam && previousView !== "team" && teamFrame) { + const frameSrc = teamFrame.dataset.src || teamFrame.src; + teamFrame.src = resolveAppUrl(frameSrc); + } else if (isTeam) { + postGlobalDateRangeToFrame(teamFrame); + } if (isSeatMapAdmin || isSeatMapReadonly) { loadSeatMapData(); } + notifyEmbeddedTabActivated(); } function renderAuth() { @@ -1329,7 +1440,7 @@ function renderAuth() { dashboardPanel.classList.toggle("hidden", !authenticated); if (authenticated) { const displayName = session.user.display_name || "접속자"; - const rank = "-"; + const rank = session.user.rank || "-"; const employeeId = session.user.username || "-"; userBadge.innerHTML = `${escapeHtml(displayName)}${escapeHtml(rank)}`; userBadge.title = `${displayName} / -`; @@ -1363,7 +1474,7 @@ if (loginForm) { loginMessage.textContent = "로그인 처리 중입니다."; const formData = new FormData(loginForm); try { - const payload = await fetchJson("/api/mock-login", { + const payload = await fetchJson("/api/auth/login", { method: "POST", body: formData, }); @@ -1388,14 +1499,51 @@ if (userBadge) { } if (logoutBtn) { - logoutBtn.addEventListener("click", (event) => { + logoutBtn.addEventListener("click", async (event) => { event.stopPropagation(); + try { + await fetchJson("/api/auth/logout", { + method: "POST", + }); + } catch { + // Ignore logout API errors and clear the local session regardless. + } clearSession(); hideUserPopover(); renderAuth(); }); } +if (globalStartDateInput) { + globalStartDateInput.addEventListener("change", () => { + globalDateState.startDate = globalStartDateInput.value || ""; + postGlobalDateRangeToFrame(projectFrame); + postGlobalDateRangeToFrame(teamFrame); + }); +} + +if (globalEndDateInput) { + globalEndDateInput.addEventListener("change", () => { + globalDateState.endDate = globalEndDateInput.value || ""; + postGlobalDateRangeToFrame(projectFrame); + postGlobalDateRangeToFrame(teamFrame); + }); +} + +projectFrame?.addEventListener("load", () => { + postGlobalDateRangeToFrame(projectFrame); + if (currentView === "project") { + notifyEmbeddedTabActivated(); + } +}); + +teamFrame?.addEventListener("load", () => { + postGlobalDateRangeToFrame(teamFrame); + if (currentView === "team") { + notifyEmbeddedTabActivated(); + } +}); + navButtons.forEach((button) => { button.addEventListener("click", () => { hideUserPopover(); @@ -1549,6 +1697,7 @@ document.addEventListener("click", () => { window.addEventListener("message", handleEmbeddedNavigationMessage); +syncGlobalDateControlInputs(); setActiveView(currentView); renderAuth(); diff --git a/frontend/public/index.html b/frontend/public/index.html index aa9a8dc..e8b713c 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -8,7 +8,7 @@ - +
@@ -37,35 +37,60 @@ - + diff --git a/frontend/public/styles.css b/frontend/public/styles.css index 30f2e31..236edfe 100644 --- a/frontend/public/styles.css +++ b/frontend/public/styles.css @@ -180,12 +180,35 @@ body { backdrop-filter: blur(12px); } +.header-left, +.header-right, .brand-block, .header-actions { position: relative; z-index: 2; } +.header-left { + display: flex; + align-items: center; + gap: 18px; + flex: 0 0 auto; + min-width: 0; +} + +.header-right { + margin-left: auto; + display: flex; + align-items: center; + gap: 18px; + min-width: 0; +} + +.brand-block { + flex: 0 0 auto; + width: 180px; +} + .dashboard-header .eyebrow { color: var(--color-accent); margin-bottom: 2px; @@ -199,14 +222,13 @@ body { } .header-center { - margin-left: auto; - margin-right: 48px; display: inline-flex; - justify-content: center; + justify-content: flex-end; gap: 24px; flex-wrap: nowrap; white-space: nowrap; z-index: 1; + flex: 0 0 auto; } .nav-pill { @@ -246,6 +268,48 @@ body { align-items: center; gap: 6px; position: relative; + padding-left: 18px; + border-left: 1px solid #dbe2ea; +} + +.header-date-controls { + display: inline-flex; + align-items: center; + gap: 8px; + margin-left: 0; + flex: 0 0 auto; + min-width: 0; +} + +.header-date-label { + font-size: 12px; + font-weight: 800; + color: #64748b; +} + +.header-date-field { + display: inline-flex; + align-items: center; + min-height: 36px; + padding: 0 10px; + border: 1px solid #dbe2ea; + border-radius: 999px; + background: #fff; +} + +.header-date-field input { + border: 0; + background: transparent; + color: var(--color-text); + font-size: 12px; + font-weight: 700; + outline: none; +} + +.header-date-sep { + color: #94a3b8; + font-size: 12px; + font-weight: 800; } .ghost-button { @@ -1139,18 +1203,37 @@ body { justify-content: space-between; } + .header-left, + .header-right { + width: 100%; + } + + .header-right { + justify-content: space-between; + } + .header-center { position: static; transform: none; - order: 3; - width: 100%; - justify-content: flex-start; + order: 2; + width: auto; + justify-content: flex-end; margin-top: 8px; overflow-x: auto; } .header-actions { flex-wrap: wrap; + padding-left: 0; + border-left: 0; + } + + .header-date-controls { + order: 2; + width: auto; + justify-content: flex-start; + margin-left: 0; + margin-top: 8px; } .seatmap-content { diff --git a/incoming-files/MH.xlsx b/incoming-files/MH.xlsx new file mode 100644 index 0000000..73779fa Binary files /dev/null and b/incoming-files/MH.xlsx differ diff --git a/incoming-files/mh.html b/incoming-files/mh.html new file mode 100644 index 0000000..c7afcbc --- /dev/null +++ b/incoming-files/mh.html @@ -0,0 +1,3318 @@ + + + + + + + + + + + 팀/개인별 분석 + + + + + + + + + + + + + + + + + + + +
+
+

+
+
+

팀/개인별 분석

+
+
+
+ + +
+
+ +
+ +
+
+
+
+
+ +
+
+ + + + + +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+ +
+

+ + 팀별 진행 프로젝트 + +

+ + +
+ +
+ + + +
+ +
+ +
파일을 업로드하면 프로젝트 현황이 표시됩니다.
+ +
+ +
+ +
+
+ +
+
+ +
+ +
+ + + +
+ +
+ +

분석 데이터를 기다리는 중..

+ + +
+ +
+ +
+ +

※ 인정시간: 평일(8시간+연장 3시간) 및 주말(5시간)

+
+
+
+ +
+
+ + + +
+
+ +
+ + + + + diff --git a/incoming-files/omh.html b/incoming-files/omh.html new file mode 100644 index 0000000..9a90311 --- /dev/null +++ b/incoming-files/omh.html @@ -0,0 +1,3308 @@ + + + + + + + + + + + 팀/개인별 분석 + + + + + + + + + + + + + + + + + + + + + + +
+
+

+
+
+

팀/개인별 분석

+
+
+
+ + +
+
+ +
+ +
+
+
+ 기간 + + ~ + +
+ +
+
+
+ +
+
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+ +
+

+ + 팀별 진행 프로젝트 + +

+ + +
+ +
+ + + +
+ +
+ +
파일을 업로드하면 프로젝트 현황이 표시됩니다.
+ +
+ +
+ +
+
+ +
+
+ +
+ +
+ + + +
+ +
+ +

분석 데이터를 기다리는 중..

+ + +
+ +
+ +
+ +

※ 인정시간: 평일(8시간+연장 3시간) 및 주말(5시간)

+
+
+
+ +
+
+ + + +
+
+ +
+ + + + + diff --git a/incoming-files/opayment.html b/incoming-files/opayment.html new file mode 100644 index 0000000..fa9d254 --- /dev/null +++ b/incoming-files/opayment.html @@ -0,0 +1,1569 @@ + + + + + + 프로젝트 대시보드 + + + + + + + + +
+ + + + + + + + + + + + + + + + diff --git a/incoming-files/organization.xlsx b/incoming-files/organization.xlsx new file mode 100644 index 0000000..2de3fe0 Binary files /dev/null and b/incoming-files/organization.xlsx differ diff --git a/incoming-files/payment.csv b/incoming-files/payment.csv new file mode 100644 index 0000000..52aff40 --- /dev/null +++ b/incoming-files/payment.csv @@ -0,0 +1,865 @@ +ȸ,û,,,ڵ,ڵ, ,Ʈڵ,,(ǥPJT),(Ʈݱ),о,κо,ȹ//,з,ߺз,Һз,μ,,ŷó,,ް,뺯ް,,,Ư̻,,Ʈ,,,,,,,,, +ٷ,2025-12-08,2026-01-02,1,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"31,590",0,"31,590",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-08,2026-01-02,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"31,590",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-05,2026-01-02,1,10111101,REV-101,뿪̼(꼭),Y25040, о հǼ뿪(Ѹ//)-μ,䵵 ,䵵 ,,,,,ٷа, ,߼,,()Ͼ,䵵оհǼ뿪(Ѹ//)-μ,"1,815,000",0,0,"1,815,000",,,Ϲ,,,,,,,,, +ٷ,2025-12-05,2026-01-02,1,40110501,REV-101,߼,Y25040, о հǼ뿪(Ѹ//)-μ,䵵 ,䵵 ,,,,,ٷа, ,߼,,()Ͼ,䵵оհǼ뿪(Ѹ//)-μ,0,"1,650,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-05,2026-01-02,1,20112901,LIA-101,⼼,Y25040, о հǼ뿪(Ѹ//)-μ,䵵 ,䵵 ,,,,,ٷа, ,߼,,()Ͼ,"1,650,000*10%",0,"165,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-30,2026-01-02,1,10111101,REV-101,뿪̼(꼭),Y25008,-ȭ ӵ Ǽ ⺻ܰ BIM (5),~ȭ ӵ(5),-ȭ ӵ Ǽ ⺻ ǽ(5),,뿪,,,ٷа,뿪,߼,,()ձ,-ȭӵΰǼ⺻ܰ豳BIM(5),"28,500,000",0,0,"28,500,000",,,Ϲ,,,,,,,,, +ٷ,2025-12-30,2026-01-02,1,40110501,REV-101,߼,Y25008,-ȭ ӵ Ǽ ⺻ܰ BIM (5),~ȭ ӵ(5),-ȭ ӵ Ǽ ⺻ ǽ(5),,뿪,,,ٷа,뿪,߼,,()ձ,-ȭӵΰǼ⺻ܰ豳BIM(5),0,"25,909,091",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-30,2026-01-02,1,20112901,LIA-101,⼼,Y25008,-ȭ ӵ Ǽ ⺻ܰ BIM (5),~ȭ ӵ(5),-ȭ ӵ Ǽ ⺻ ǽ(5),,뿪,,,ٷа,뿪,߼,,()ձ,"25,909,091*10%",0,"2,590,909",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-15,2026-01-02,1,10111101,REV-101,뿪̼(꼭),Y25007,ERPý ,ERPý۱(),ERP(ѱտϾ),,S/WǸ,,,ٷа,Ǹ,߼,,()ѱտϾ,ERPý۱,"55,000,000",0,0,"55,000,000",,,Ϲ,,,,,,,,, +ٷ,2025-12-15,2026-01-02,1,40110501,REV-101,߼,Y25007,ERPý ,ERPý۱(),ERP(ѱտϾ),,S/WǸ,,,ٷа,Ǹ,߼,,()ѱտϾ,ERPý۱,0,"50,000,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-15,2026-01-02,1,20112901,LIA-101,⼼,Y25007,ERPý ,ERPý۱(),ERP(ѱտϾ),,S/WǸ,,,ٷа,Ǹ,߼,,()ѱտϾ,"50,000,000*10%",0,"5,000,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-29,2026-01-02,1,10111101,REV-101,뿪̼(꼭),Y25067,EG-BIM ,EG-BIM (ڸ),EG-BIM (ڸ),,S/WǸ,,,ٷа,Ǹ,߼,,ڸ,EG-BIM,"1,100,000",0,0,"1,100,000",,,Ϲ,,,,,,,,, +ٷ,2025-12-29,2026-01-02,1,40110601,REV-101,,Y25067,EG-BIM ,EG-BIM (ڸ),EG-BIM (ڸ),,S/WǸ,,,ٷа,Ǹ,߼,,ڸ,EG-BIM,0,"1,000,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-29,2026-01-02,1,20112901,LIA-101,⼼,Y25067,EG-BIM ,EG-BIM (ڸ),EG-BIM (ڸ),,S/WǸ,,,ٷа,Ǹ,߼,,ڸ,"1,000,000*10%",0,"100,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-02,1,20111103,LIA-101,ޱ(Ϲݹ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,ӹΰ,Ѱȹ ̳ ȸ,0,"570,500",0,0, λ米,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-02,1,60115705,WF-101,Ļ(ȸĴ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,ӹΰ,Ѱȹ ̳ ȸ,"570,500",0,"570,500",0, λ米,Ļ,Ϲ,,,,,,,,, +ٷ,2025-12-22,2026-01-02,1,60115903,WF-201,(),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,Ѱȹ,Ѱȹ,,,"30,400",0,"30,400",0,,,Ϲ,,,,,,,,, +ٷ,2025-12-22,2026-01-02,1,20111103,LIA-101,ޱ(Ϲݹ),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,Ѱȹ,Ѱȹ,, - ,0,"30,400",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-26,2026-01-02,1,60115903,WF-201,(),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,Ѱȹ,Ѱȹ,,,"106,200",0,"106,200",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-26,2026-01-02,1,20111103,LIA-101,ޱ(Ϲݹ),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,Ѱȹ,Ѱȹ,, - ,0,"106,200",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-02,1,20111103,LIA-101,ޱ(Ϲݹ),X25051,ȹ,ȹ,ȹ,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,Ѱȹ,,ó,0,"44,900",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-02,1,50152705,WF-201,)(ó),X25051,ȹ,ȹ,ȹ,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,Ѱȹ,,ó,"44,900",0,"44,900",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-02,1,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,ӹΰ,ȸ ٰ(1 2),0,"181,840",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-02,2026-01-07,1,60116399,IT-301,޼(Ÿ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,,"ٷ ΰ, ε ߱޼","6,000",0,"6,000",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-02,1,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,ӹΰ, ݼ ,0,"2,400",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-05,2026-01-15,1,60114398,OP-203,Ҹǰ(Ÿ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,,ٷ ΰ ,"78,800",0,"78,800",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-02,1,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,(),߼͵(12),0,"253,260",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-05,2026-01-15,1,60116399,IT-301,޼(Ÿ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,,"ٷ ε, ΰ ߱","25,000",0,"25,000",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-26,2026-01-02,1,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,ַ,A,ܺλ û ̳(ϽƮ ) ٰ,0,"26,200",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-16,2026-01-20,1,60116399,IT-301,޼(Ÿ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ıû,ٷ 2026 ϸ㼼 (),"27,000",0,"27,000",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-26,2026-01-02,1,20111103,LIA-101,ޱ(Ϲݹ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,," (25.12~25.12, 系̵)",0,"187,420",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-16,2026-01-20,1,60116399,IT-301,޼(Ÿ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ıû,ٷ 2026 ϸ㼼 (Ű),"54,000",0,"54,000",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-23,2026-01-02,1,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,,õ繫 α ,0,"60,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-16,2026-01-20,1,60116399,IT-301,޼(Ÿ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ıû,ٷ 2026 ϸ㼼 (ʰ淮ġ),"40,500",0,"40,500",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-24,2026-01-02,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,A,SW ġ USB ǽ Ŀġ (2),0,"31,700",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-21,2026-01-29,1,60116399,IT-301,޼(Ÿ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,, ,360,0,360,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-24,2026-01-02,1,20111105,LIA-101,ޱ(KBī),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,,ī(3866),Ÿ Ʈī ,0,"1,000,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-21,2026-01-29,1,60114301,OP-203,Ҹǰ(繫ǰ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,,ο (7),"20,900",0,"20,900",0,,,Ϲ,,,,,,,,, +ٷ,2025-12-16,2026-01-02,1,10111101,REV-101,뿪̼(꼭),Y25042,걹 2ǿ հǼ뿪(Ѹ//)-μ/,걹 2ǿ,걹 2ǿ,,,,,ٷа, ,߼,,ENG,걹2ǿհǼ뿪(Ѹ//)-μ/,"1,512,500",0,0,"1,512,500",,,Ϲ,,,,,,,,, +ٷ,2025-12-16,2026-01-02,1,40110501,REV-101,߼,Y25042,걹 2ǿ հǼ뿪(Ѹ//)-μ/,걹 2ǿ,걹 2ǿ,,,,,ٷа, ,߼,,ENG,걹2ǿհǼ뿪(Ѹ//)-μ/,0,"1,375,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-16,2026-01-02,1,20112901,LIA-101,⼼,Y25042,걹 2ǿ հǼ뿪(Ѹ//)-μ/,걹 2ǿ,걹 2ǿ,,,,,ٷа, ,߼,,ENG,"1,375,000*10%",0,"137,500",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-24,2026-01-07,1,60115903,WF-201,(),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,ȣ,,"52,600",0,"52,600",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-24,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,ȣ, - ȣ,0,"52,600",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-23,2026-01-07,1,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"23,630",0,"23,630",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-23,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"23,630",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-05,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,()̷ؿ, Ӵ ῡ ð ,0,"41,870",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-27,2026-01-29,1,60116399,IT-301,޼(Ÿ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,, ΰ ,"5,400",0,"5,400",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60116399,IT-301,޼(Ÿ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,, 系̻ ߱ ,"2,200",0,"2,200",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-02,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,,"ٷ ΰ, ε ߱޼",0,"6,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-20,2026-01-29,1,60116399,IT-301,޼(Ÿ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,,"θ/κ ߱ (ΰ 4,  2, ʺ 2)","4,000",0,"4,000",0,,,Ϲ,,,,,,,,, +ٷ,2025-12-19,2026-01-07,1,60115903,WF-201,(),X21012,XR Ǽ ý,XR Ǽ Žý,XR Ǽ Žý,,R&D,,, Ʈ,R&D,Ѱȹ,濵ȹ,ӹΰ,,"24,000",0,"24,000",0,,,R&D,,,,,,,,, +ٷ,2025-12-19,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X21012,XR Ǽ ý,XR Ǽ Žý,XR Ǽ Žý,,R&D,,, Ʈ,R&D,Ѱȹ,濵ȹ,ӹΰ, - ӹΰ,0,"24,000",0,0,,,R&D,,,,,,,,, +ٷ,2025-12-31,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,ֿϱ,Ѱȹ ܺ (5EA),0,"230,000",0,0,,,Ϲ,,,,,,,,, +,2026-01-22,2026-01-22,1,831,OUT-201,޼,X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,, ȣ,ֽȸ ȣ ݳ,"465,000",,"465,000",0,,,Ϲ,,,,,,,,, +ٷ,2025-12-30,2026-01-07,1,60115903,WF-201,(),X25020,TOVA,TOVA,TOVA,S/W,,ȹ,,S/W ,,Ѱȹ,ȹ,Ȳȯ,,"47,300",0,"47,300",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-30,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X25020,TOVA,TOVA,TOVA,S/W,,,,S/W ,,Ѱȹ,ȹ,, - ,0,"39,300",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-30,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X25020,TOVA,TOVA,TOVA,S/W,,,,S/W ,,Ѱȹ,ȹ,Ȳȯ, - Ȳȯ,0,"8,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-07,1,60115903,WF-201,(),X25037,ERP: ,ERP:,ERP: ,ȹ/, S/W,,,S/W ,S/W,Ѱȹ,ERPȹ,ǿ,,"190,040",0,"190,040",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X25037,ERP: ,ERP:,ERP: ,ȹ/, S/W,,,S/W ,S/W,Ѱȹ,ERPȹ,ȣ, - ȣ,0,"89,310",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X25037,ERP: ,ERP:,ERP: ,ȹ/, S/W,,,S/W ,S/W,Ѱȹ,ERPȹ,ǿ, - ǿ,0,"100,730",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-07,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ΰǰ,25 12 4뺸 (ü),0,"58,112,940",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-07,2026-01-07,1,50152527,HR-204,)Ļ(纸),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ٷκ,25 12 4뺸(纸/ȸδ),"2,725,290",0,"2,725,290",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-07,2026-01-07,1,50152521,HR-202,)Ļ(ǰ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ΰǰ,25 12 4뺸(ǰ/ȸδ),"12,218,640",0,"12,218,640",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-07,2026-01-07,1,20111505,HR-202,(ǰ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ΰǰ,25 12 4뺸(ǰ/δ),"12,218,640",0,"12,218,640",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-07,2026-01-07,1,50152521,HR-202,)Ļ(ǰ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ΰǰ,25 12 4뺸(纸/ȸδ),"1,581,980",0,"1,581,980",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-07,2026-01-07,1,20111505,HR-202,(ǰ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ΰǰ,25 12 4뺸(纸),"1,581,980",0,"1,581,980",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-07,2026-01-07,1,50151719,HR-201,)ݰ(ο),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,οݰ,25 12 4뺸(ο/ȸδ),"10,816,770",0,"10,816,770",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-07,2026-01-07,1,20111507,HR-201,(ο),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,οݰ,25 12 4뺸(ο/δ),"10,816,770",0,"10,816,770",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-07,2026-01-07,1,50152529,HR-203,)Ļ(뺸),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ٷκ,25 12 4뺸(뺸/ȸδ),"3,467,490",0,"3,467,490",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-07,2026-01-07,1,20111509,HR-203,(뺸()),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ٷκ,25 12 4뺸(뺸/δ),"2,685,380",0,"2,685,380",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-07,2026-01-09,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,Ѱȹ, BIM1,ȿ, Ҽ (ȿ ӿ ȥ),0,"500,000",0,0," Ʒ,",,Ÿ,,,,,,,,, +,2026-01-27,2026-01-27,1,831,OUT-201,޼,X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,, ȣ,ֽȸ Ʈʽ ,"6,680,000",,"6,680,000",0,,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-12,1,10111101,REV-101,뿪̼(꼭),Y25041,GAIA ,GAIA ,GAIA ,,S/WǸ,,,ٷа,Ǹ,߼,,()ī̿,GAIA ߰ ,"3,850,000",0,0,"3,850,000",,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-12,1,40110501,REV-101,߼,Y25041,GAIA ,GAIA ,GAIA ,,S/WǸ,,,ٷа,Ǹ,߼,,()ī̿,GAIA ߰ ,0,"3,500,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-12,1,20112901,LIA-101,⼼,Y25041,GAIA ,GAIA ,GAIA ,,S/WǸ,,,ٷа,Ǹ,߼,,()ī̿,"3,500,000*10%",0,"350,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-12,2026-01-12,1,10111101,REV-101,뿪̼(꼭),Y25041,GAIA ,GAIA ,GAIA ,,S/WǸ,,,ٷа,Ǹ,߼,,()ī̿,GAIA ߰ ,0,"3,850,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-12,2026-01-12,1,10110501,AST-101,뿹,Y25041,GAIA ,GAIA ,GAIA ,,S/WǸ,,,ٷа,Ǹ,߼,,(ְŷ),GAIA ߰ ,"3,850,000",0,0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-07,2026-01-14,1,20110101,LIA-101,ܻԱ,Y25019,ӱ 32ȣ ~ûּ ~ġ Ǽ(2) ƮȲ ,~ġ(2),ӱ 32ȣ ~ûּ ~ġ Ǽ(2),,뿪,,,ٷа,뿪,Ѱȹ,,ֽȸ ũ̿,-ƻ Ǽ ȸǽ ,0,"253,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-14,2026-01-14,1,50151399,OP-203,)Ҹǰ(Ÿ),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,Ѱȹ,,ũ ֽȸ, ǹ Ʈ (帱) ,"754,909",0,"754,909",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-14,2026-01-14,1,10115301,AST-106,Լ,Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,߼,,ũ ֽȸ, ǹ Ʈ (帱) ,"75,491",0,"75,491",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-11,2026-01-14,1,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,,Ҹǰ (â ǰ밡) ,0,"13,970",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-14,2026-01-21,1,50151399,OP-203,)Ҹǰ(Ÿ),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,߼,,()ڼ, ǹ Ʈ ,"349,910",0,"349,910",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-14,2026-01-14,1,20110101,LIA-101,ܻԱ,Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,Ѱȹ,,ũ ֽȸ, ǹ Ʈ (帱) ,0,"830,400",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-14,2026-01-21,1,10115301,AST-106,Լ,Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,߼,,()ڼ, ǹ Ʈ ,"34,990",0,"34,990",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-13,2026-01-20,1,50153199,IT-301,)޼(Ÿ),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,߼,Infra Solution ,,İη ߱޼,"47,400",0,"47,400",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-14,2026-01-15,1,20110101,LIA-101,ܻԱ,X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,Ÿ ֽȸ, BIM 1 3D 𵨸 ũ̼ ,0,"600,000",0,0,,,Ϲ,,,,,,,,, +Ѹ,2026-01-12,2026-01-14,1,60114599,WF-105,μ(Ÿ),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,Ѱȹ,,, ðBIM /μ,"306,240",,"306,240",0,,,Ϲ,,,,,,,,, +Ѹ,2026-01-12,2026-01-14,1,50151309,OP-203,)Ҹǰ(),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,Ѱȹ,,, ðBIM ,"390,940",,"390,940",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-11,2026-01-15,1,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,, 湮 ,0,"47,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-07,2026-01-14,1,50153199,IT-301,)޼(Ÿ),Y25019,ӱ 32ȣ ~ûּ ~ġ Ǽ(2) ƮȲ ,~ġ(2),ӱ 32ȣ ~ûּ ~ġ Ǽ(2),,뿪,,,ٷа,뿪,Ѱȹ,,ֽȸ ũ̿,-ƻ Ǽ ȸǽ ,"230,000",0,"230,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,20110101,LIA-101,ܻԱ,X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,SKε(),ٷ ǥȭ ź 26 01,0,"23,780",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-07,2026-01-14,1,10115301,AST-106,Լ,Y25019,ӱ 32ȣ ~ûּ ~ġ Ǽ(2) ƮȲ ,~ġ(2),ӱ 32ȣ ~ûּ ~ġ Ǽ(2),,뿪,,,ٷа,뿪,Ѱȹ,,ֽȸ ũ̿,-ƻ Ǽ ȸǽ ,"23,000",0,"23,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-19,2026-01-21,1,60116199,OP-204,ź(Ÿ),Y25019,ӱ 32ȣ ~ûּ ~ġ Ǽ(2) ƮȲ ,~ġ(2),ӱ 32ȣ ~ûּ ~ġ Ǽ(2),,뿪,,,ٷа,뿪,Ѱȹ,,SKε(),-ƻ Ǽ BIG ROOM VPN 26 01 ,"86,000",0,"86,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-19,2026-01-21,1,10115301,AST-106,Լ,Y25019,ӱ 32ȣ ~ûּ ~ġ Ǽ(2) ƮȲ ,~ġ(2),ӱ 32ȣ ~ûּ ~ġ Ǽ(2),,뿪,,,ٷа,뿪,Ѱȹ,,SKε(),-ƻ Ǽ BIG ROOM VPN 26 01 ,"8,600",0,"8,600",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,70111501,REV-501,,X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,SKε(),ٷ ǥȭ ź 26 01,0,8,0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-05,2026-01-15,1,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,,"ٷ ΰ , ε ߱޼",0,"103,800",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-07,2026-01-09,1,50152511,WF-106,)Ļ(),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,Ѱȹ, BIM1,ȿ, Ҽ (ȿ ӿ ȥ),"500,000",0,"500,000",0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2026-01-19,2026-01-19,1,60116399,IT-301,޼(Ÿ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,,ӿ CHAT GPT (1),"29,000",0,"29,000",0, 濵,,Ÿ,,,,,,,,, +ٷ,2026-01-19,2026-01-19,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,,ӿ CHAT GPT (1),0,"29,000",0,0, 濵,,Ÿ,,,,,,,,, +ٷ,2026-01-20,2026-01-27,1,60115798,WF-106,Ļ(),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,Ѱȹ,,ѻ,ǰ û(ѻ λ),"200,000",0,"200,000",0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2026-01-19,2026-01-19,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,, ȸ Ļ,0,"55,000",0,0, 濵,,Ÿ,,,,,,,,, +ٷ,2026-01-19,2026-01-19,1,60115705,WF-101,Ļ(ȸĴ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,, ȸ Ļ,"55,000",0,"55,000",0, 濵,Ļ,Ÿ,,,,,,,,, +ٷ,2026-01-20,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,ֽȸ _,"KB åӹ ű ( 2 / Matrice 300 RTK, Air2s)",0,"844,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-09,2026-01-28,1,60115798,WF-106,Ļ(),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,Ѱȹ,,ġǿ, ǰ(ġ) ( Ѱ 39),"195,000",0,"195,000",0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2026-01-07,2026-01-20,1,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"32,240",0,"32,240",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-07,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"32,240",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-08,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (01/07),0,"59,100",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-29,2026-01-29,1,60116399,IT-301,޼(Ÿ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,,ӿ AI (1),"29,000",0,"29,000",0, 濵,,Ÿ,,,,,,,,, +ٷ,2026-01-08,2026-01-20,1,20111105,LIA-101,ޱ(KBī),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,,ī(3866),Ÿ Ʈī ,0,"700,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-26,2026-01-29,1,60115798,WF-106,Ļ(),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,Ѱȹ,,ġǿ, ǰ(ġ) (ٷмҼ 3),"15,000",0,"15,000",0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2026-01-14,2026-01-20,1,60115903,WF-201,(),X25059,ERP: ,ERP:,ERP: (),ȹ/, S/W,,,S/W ,S/W,Ѱȹ,ȹ,,,"186,300",0,"186,300",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-14,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X25059,ERP: ,ERP:,ERP: (),ȹ/, S/W,,,S/W ,S/W,Ѱȹ,ȹ,, - ,0,"126,300",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-14,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X25059,ERP: ,ERP:,ERP: (),ȹ/, S/W,,,S/W ,S/W,Ѱȹ,ȹ,ȫƸ, - ȫƸ,0,"30,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-14,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X25059,ERP: ,ERP:,ERP: (),ȹ/, S/W,,,S/W ,S/W,Ѱȹ,ȹ,, - ,0,"30,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-14,2026-01-20,1,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"46,400",0,"46,400",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-14,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"46,400",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-08,2026-01-20,1,60115903,WF-201,(),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,,,"90,830",0,"90,830",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-08,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,, - ,0,"90,830",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-15,2026-01-20,1,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"36,470",0,"36,470",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-15,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"36,470",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-16,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,A,EG-BIM μ ǻڿ (),0,"39,820",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-16,2026-01-20,1,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,A,EG-BIM μ ǻڿ (),"39,820",0,"39,820",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-16,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ıû,ٷ 2026 ϸ㼼 (),0,"27,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-27,2026-01-29,1,60116399,IT-301,޼(Ÿ),ZZZZZZ,,(Ÿ),,ȹ/,,,,,,Ѱȹ,濵ȹ,ӹΰ,Ǽ ȸ() 2() ,"23,000",0,"23,000",0,,,,,,,,,,,, +ٷ,2026-01-16,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ıû,ٷ 2026 ϸ㼼 (Ű),0,"54,000",0,0,,,Ϲ,,,,,,,,, +Ѹ,2025-12-15,2026-01-08,1,50152599,WF-106,)Ļ(Ÿ),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,Ѱȹ,,,2025 ǰ,"200,000",,"200,000",0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2026-01-16,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ıû,ٷ 2026 ϸ㼼 (ʰ淮ġ),0,"40,500",0,0,,,Ϲ,,,,,,,,, +Ѹ,2025-12-31,2026-01-05,1,50152599,WF-106,)Ļ(Ÿ),ZZZZZZ,,(Ÿ),,ȹ/,,,,,,Ѱȹ,,,õ繫/Ŀǿ _25 12,"660,000",,"660,000",0,X,,,,,,,,,,, +ٷ,2026-01-09,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,A,߼Ʈ (01/9),0,"45,400",0,0,,,Ϲ,,,,,,,,, +Ѹ,2025-12-31,2026-01-05,1,50151309,OP-203,)Ҹǰ(),ZZZZZZ,,(Ÿ),,ȹ/,,,,,,Ѱȹ,,,õ繫/Ÿ (25 12),"140,800",,"140,800",0,X,,,,,,,,,,, +ٷ,2026-01-13,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,,ÿ ٰ ,0,"50,000",0,0,,,Ϲ,,,,,,,,, +Ѹ,2025-12-31,2026-01-05,1,50151101,OP-101,)(),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,Ѱȹ,,, : -(2) ðBIM 뿪 ,"3,479,500",,"3,479,500",0, BIM,,Ϲ,,,,,,,,, +ٷ,2026-01-09,2026-01-20,1,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"39,290",0,"39,290",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-09,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"39,290",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-12,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (01/09),0,"52,300",0,0,,,Ϲ,,,,,,,,, +Ѹ,2026-01-07,2026-01-08,1,50153103,OUT-102,)޼(뿪),ZZZZZZ,,(Ÿ),,ȹ/,,,,,,Ѱȹ,,,߼ ADTĸ _26 1,"99,000",,"99,000",0,X,,,,,,,,,,, +ٷ,2026-01-16,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,,"õ(), ȫõ(), ϻ()",0,"129,158",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-16,2026-01-20,1,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,,"õ(), ȫõ(), ϻ()","129,158",0,"129,158",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-16,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (01/15),0,"22,200",0,0,,,Ϲ,,,,,,,,, +Ѹ,2026-01-08,2026-01-08,1,60115707,WF-106,Ļ(),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,Ѱȹ,,,߼ ȿ ӿ ȥ DZ,"300,000",,"300,000",0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2026-01-15,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ERPȹ,۴, 2 (3),0,"141,020",0,0,,,Ϲ,,,,,,,,, +Ѹ,2026-01-09,2026-01-14,1,60116101,IT-401,"ź(ȭ,TV,ͳ)",ZZZZZZ,,(Ÿ),,ȹ/,,,,,,Ѱȹ,,,õ繫/ſ(26 01),"615,055",,"615,055",0,X,,,,,,,,,,, +ٷ,2026-01-19,2026-01-20,1,20111109,LIA-101,ޱ(ϳī),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ϰŹ(Űڳ),ϰ (12),0,"25,000",0,0,,,Ϲ,,,,,,,,, +Ѹ,2025-12-31,2026-01-06,1,60115707,WF-106,Ļ(),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,߼,,,Ȱ ģ/߾Ӵʽ1ȣ,"300,000",,"300,000",0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2026-01-13,2026-01-20,1,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"21,220",0,"21,220",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-13,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"21,220",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-12,2026-01-20,1,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"29,960",0,"29,960",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-12,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"29,960",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-15,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X25043,CivilEngineeringLab,CivilEngineeringLab,CivilEngineeringLab,ȹ/,ȹ&,,,S/W ,S/W,Ѱȹ,ERPȹ,۴,rightcivilengineering (3),0,"68,970",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115798,WF-106,Ļ(),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,12 ü´ܷú(),"601,400",0,"601,400",0,,,,,,,,,,,, +ٷ,2026-01-15,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X25051,ȹ,ȹ,ȹ,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,ȹ,,"ڵȭ ȹ AI(chatGPT, NotebookLM)",0,"61,200",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-20,2026-01-29,1,60116199,OP-204,ź(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,SKڷ(),12 ޴ (ִ뼱),"37,633",0,"37,633",0,,,,,,,,,,,, +ٷ,2025-12-31,2026-01-20,1,20110101,LIA-101,ܻԱ,X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,11 ٷ ,0,"99,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-20,2026-01-29,1,10115301,AST-106,Լ,OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,SKڷ(),12 ޴ (ִ뼱),"3,762",0,"3,762",0,,,,,,,,,,,, +ٷ,2026-01-20,2026-01-29,1,60116199,OP-204,ź(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,SKڷ(),12 ޴ (ִ뼱),"102,885",0,"102,885",0,,,,,,,,,,,, +ٷ,2026-01-20,2026-01-20,1,20110101,LIA-101,ܻԱ,X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,SKε(),ٷ ERP ͳ ȸ ź 26 01 ,0,"561,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-24,2026-01-02,1,50151399,OP-203,)Ҹǰ(Ÿ),X25028,ý(PM),ý(PM),ý(PM),S/W,ַ,,,S/W ,ַ,߼,GSIM ,ȣ,Ʈ Ŭ 丮 12 ݾ,"19,474",0,"19,474",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-24,2026-01-02,1,50152999,OP-204,)ź(Ÿ),X25028,ý(PM),ý(PM),ý(PM),S/W,ַ,,,S/W ,ַ,߼,GSIM ,ȣ,LTE º ź û(11),"35,200",0,"35,200",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-20,2026-01-20,1,20110101,LIA-101,ܻԱ,X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,߼,,The Intellicad Technology Consortium,EG-BIM ITC (IntelliCAD) οƼ (ȭ),0,"51,569,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-02,2026-01-09,1,50151399,OP-203,)Ҹǰ(Ÿ),X25028,ý(PM),ý(PM),ý(PM),S/W,ַ,,,S/W ,ַ,߼,GSIM ,ȣ,Ʈ Ŭ 12 ݾ,"290,556",0,"290,556",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-14,2026-01-21,1,20110101,LIA-101,ܻԱ,Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,߼,,()ڼ, ǹ Ʈ ,0,"384,900",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,50151399,OP-203,)Ҹǰ(Ÿ),X25028,ý(PM),ý(PM),ý(PM),S/W,ַ,,,S/W ,ַ,߼,GSIM ,ȣ,Ʈ Ŭ 丮 01 ݾ,"23,705",0,"23,705",0,")Ҹǰ(Ÿ) ڵ尡 ΰ 50151309, 50151399 (ϳ ʿ+ Ƿ 50151399 )",,Ϲ,,,,,,,,, +ٷ,2026-01-15,2026-01-20,1,50151399,OP-203,)Ҹǰ(Ÿ),X25051,ȹ,ȹ,ȹ,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,ȹ,,"ڵȭ ȹ AI(chatGPT, NotebookLM)","61,200",0,"61,200",0,)Ҹǰ(Ÿ) ڵ尡 ΰ,,Ϲ,,,,,,,,, +ٷ,2026-01-19,2026-01-21,1,20110101,LIA-101,ܻԱ,Y25019,ӱ 32ȣ ~ûּ ~ġ Ǽ(2) ƮȲ ,~ġ(2),ӱ 32ȣ ~ûּ ~ġ Ǽ(2),,뿪,,,ٷа,뿪,Ѱȹ,,SKε(),-ƻ Ǽ BIG ROOM VPN 26 01 ,0,"94,600",0,0,,,Ϲ,,,,,,,,, +Ѹ,2026-01-02,2026-01-08,1,60114733,IT-301,迬(޼),X25056,ƮǼ߻ 10(Ѹ///Ƽ),ƮǼ(10),ƮǼ(10),,R&D,,, Ʈ,R&D,Ѱȹ,,,ƮǼ10/Ư,"2,057,000",,"2,057,000",0,,,R&D,,,,,,,,, +Ѹ,2026-01-15,2026-01-15,1,60114733,IT-301,迬(޼),X25056,ƮǼ߻ 10(Ѹ///Ƽ),ƮǼ(10),ƮǼ(10),,R&D,,, Ʈ,R&D,Ѱȹ,,,ƮǼ10/繫ǰ ,"1,469,050",,"1,469,050",0,,,R&D,,,,,,,,, +ٷ,2026-01-20,2026-01-21,1,20110101,LIA-101,ܻԱ,X25054,AI,AI,AI,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,,Ŭ ڸ ȸ,Ŭ Ai (12),0,"115,624",0,0,,,Ϲ,,,,,,,,, +,2026-01-15,2026-01-20,1,823,OUT-101,ߺ,X25056,ƮǼ߻ 10(Ѹ///Ƽ),ƮǼ(10),ƮǼ(10),,R&D,,, Ʈ,R&D,߼,,帲,ƮǼ/繫ǰ (Ϻι),"937,530",,"937,530",0,=/ ǰ,,R&D,,,,,,,,, +,2026-01-20,2026-01-20,1,823,OUT-101,ߺ,X25056,ƮǼ߻ 10(Ѹ///Ƽ),ƮǼ(10),ƮǼ(10),,R&D,,, Ʈ,R&D,߼,,()䱳б,ƮǼ/4б(10~12) ΰ,"264,000",,"264,000",0,=/ ΰ,,R&D,,,,,,,,, +ٷ,2026-01-21,2026-01-21,1,20110101,LIA-101,ܻԱ,X25054,AI,AI,AI,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,,Ŭ ڸ ȸ,Ŭ Ai (11),0,589,0,0,,,Ϲ,,,,,,,,, +Ƽ,2026-01-05,2026-01-15,1,823,OUT-101,ߺ,X25056,ƮǼ߻ 10(Ѹ///Ƽ),ƮǼ(10),ƮǼ(10),,R&D,,, Ʈ,R&D,߼,,帲ſ,[ƮǼ] 12 繫ǰ(Ϻι),"1,908,170",,"1,908,170",0,=/ ǰ,,R&D,,,,,,,,, +ٷ,2025-12-31,2026-01-02,1,60115798,WF-106,Ļ(),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,ӹΰ,ȸ ٰ(1 2),"181,840",0,"181,840",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-21,2026-01-21,1,20111109,LIA-101,ޱ(ϳī),X25054,AI,AI,AI,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,,ϳī(6669),Ai Cloudflare (12),0,"8,375",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-02,1,60116399,IT-301,޼(Ÿ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,ӹΰ, ݼ ,"2,400",0,"2,400",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-21,2026-01-21,1,60110101,HR-101,޿(.),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,Ѱ/,26 1 ޿(ٷ),"388,889,600",0,"388,889,600",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-21,2026-01-21,1,20111501,LIA-101,(ٷμҵ漼),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,261 ޿ ٷμҵ漼(ٷ),0,"29,627,210",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-21,2026-01-21,1,20111503,LIA-101,(ٷμҵֹμ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,261 ޿ ٷμҵֹμ(ٷ),0,"2,962,370",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-21,2026-01-21,1,20111509,HR-203,(뺸()),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,261 ޿ 뺸(ٷ),0,"3,260,540",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-21,2026-01-21,1,20111505,HR-202,(ǰ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,"261 ޿ ǷẸ(ǰ+, ٷ)",0,"14,146,850",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-21,2026-01-21,1,20111507,HR-201,(ο),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,261 ޿ ο(ٷ),0,"11,756,650",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-21,2026-01-21,1,20111599,LIA-101,(Ÿ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,261 Ĵ Ÿ (ٷ),0,"1,988,400",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-21,2026-01-21,1,20111103,LIA-101,ޱ(Ϲݹ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,Ѱ/,261 ޿(ٷ),0,"325,147,580",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-22,2026-01-22,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,,1 ,0,"311,750",0,0, 濵,,Ÿ,,,,,,,,, +ٷ,2026-01-22,2026-01-22,1,60115999,WF-201,(Ÿ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,,1 ,"311,750",0,"311,750",0, 濵,,Ÿ,,,,,,,,, +ٷ,2026-01-22,2026-01-22,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,, ȸ Ļ,0,"27,000",0,0, 濵,,Ÿ,,,,,,,,, +ٷ,2026-01-22,2026-01-22,1,60115705,WF-101,Ļ(ȸĴ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,, ȸ Ļ,"27,000",0,"27,000",0, 濵,Ļ,Ÿ,,,,,,,,, +ٷ,2026-01-12,2026-01-22,1,20110101,LIA-101,ܻԱ,X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ֽȸ ,ٷƮ 2025 ʼ DZ,0,"1,332,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-02,1,60114503,WF-105,μ(Ժ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,(),߼͵(12),"253,260",0,"253,260",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-13,2026-01-23,1,10111101,REV-101,뿪̼(꼭),Y26008,2026 濵 (ѸƱ),,,,,,,,,Ѱȹ,,ѸƱ,2026濵ױ(ѸƱ),"122,916,200",0,0,"122,916,200",,,Ÿ,,,,,,,,, +ٷ,2026-01-13,2026-01-23,1,40110401,REV-101,뿪,Y26008,2026 濵 (ѸƱ),,,,,,,,,Ѱȹ,,ѸƱ,2026濵ױ(ѸƱ),0,"111,742,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-13,2026-01-23,1,20112901,LIA-101,⼼,Y26008,2026 濵 (ѸƱ),,,,,,,,,Ѱȹ,,ѸƱ,"111,742,000*10%",0,"11,174,200",0,0,,,Ÿ,,,,,,,,, +ٷ,2025-12-10,2026-01-23,1,10111101,REV-101,뿪̼(꼭),Y25039,濵 (),,,,,,,,,Ѱȹ,,,濵ױ(),"28,270,000",0,0,"28,270,000",,,Ÿ,,,,,,,,, +ٷ,2025-12-10,2026-01-23,1,40110401,REV-101,뿪,Y25039,濵 (),,,,,,,,,Ѱȹ,,,濵ױ(),0,"25,700,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2025-12-10,2026-01-23,1,20112901,LIA-101,⼼,Y25039,濵 (),,,,,,,,,Ѱȹ,,,"25,700,000*10%",0,"2,570,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-13,2026-01-23,1,10111101,REV-101,뿪̼(꼭),Y26011,2026 濵 (),,,,,,,,,Ѱȹ,,,2026濵ױ(),"294,607,500",0,0,"294,607,500",,,Ÿ,,,,,,,,, +ٷ,2026-01-13,2026-01-23,1,40110401,REV-101,뿪,Y26011,2026 濵 (),,,,,,,,,Ѱȹ,,,2026濵ױ(),0,"267,825,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-13,2026-01-23,1,20112901,LIA-101,⼼,Y26011,2026 濵 (),,,,,,,,,Ѱȹ,,,"267,825,000*10%",0,"26,782,500",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-23,2026-01-23,1,10111101,REV-101,뿪̼(꼭),Y26011,2026 濵 (),,,,,,,,,Ѱȹ,,,2026濵ױ(),0,"294,607,500",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-23,2026-01-23,1,10110501,AST-101,뿹,Y26011,2026 濵 (),,,,,,,,,Ѱȹ,,(ְŷ),2026濵ױ(),"294,607,500",0,0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-23,2026-01-23,1,10111101,REV-101,뿪̼(꼭),Y25039,濵 (),,,,,,,,,Ѱȹ,,,濵ױ(),0,"28,270,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-23,2026-01-23,1,10110501,AST-101,뿹,Y25039,濵 (),,,,,,,,,Ѱȹ,,(ְŷ),濵ױ(),"28,270,000",0,0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-23,2026-01-23,1,10111101,REV-101,뿪̼(꼭),Y26008,2026 濵 (ѸƱ),,,,,,,,,Ѱȹ,,ѸƱ,2026濵ױ(ѸƱ),0,"122,916,200",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-23,2026-01-23,1,10110501,AST-101,뿹,Y26008,2026 濵 (ѸƱ),,,,,,,,,Ѱȹ,,(ְŷ),2026濵ױ(ѸƱ),"122,916,200",0,0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-23,2026-01-23,1,10111101,REV-101,뿪̼(꼭),Y26012,2026 濵 (Ѷ),,,,,,,,,Ѱȹ,,Ѷ,2026濵ױ(Ѷ),0,"10,285,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-23,2026-01-23,1,10110501,AST-101,뿹,Y26012,2026 濵 (Ѷ),,,,,,,,,Ѱȹ,,(ְŷ),2026濵ױ(Ѷ),"10,285,000",0,0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-23,2026-01-23,1,10111101,REV-101,뿪̼(꼭),Y26010,2026 濵 (Ƽ),,,,,,,,,Ѱȹ,,Ƽ,2026濵ױ(Ƽ)1,0,"23,760,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-23,2026-01-23,1,10110501,AST-101,뿹,Y26010,2026 濵 (Ƽ),,,,,,,,,Ѱȹ,,(ְŷ),2026濵ױ(Ƽ)1,"23,760,000",0,0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-23,2026-01-23,1,10111101,REV-101,뿪̼(꼭),Y26013,Ѱ Ѵ Ǽ뿪(2)(ȭ30%)-μ/,Ѱ (2),Ѱ (2),,,,,ٷа, ,߼,,ȭENG,Ѱ簨ѴǼ뿪(2)(ȭ30%)-μ/,0,"1,815,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-23,2026-01-23,1,10110501,AST-101,뿹,Y26013,Ѱ Ѵ Ǽ뿪(2)(ȭ30%)-μ/,Ѱ (2),Ѱ (2),,,,,ٷа, ,߼,,(ְŷ),Ѱ簨ѴǼ뿪(2)(ȭ30%)-μ/,"1,815,000",0,0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-08,2026-01-23,1,60115903,WF-201,(),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,ֱ,,"82,000",0,"82,000",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-08,2026-01-23,1,20111103,LIA-101,ޱ(Ϲݹ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,ֱ, - ֱ,0,"82,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-20,2026-01-23,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,Ʈϰ (01/18),0,"100,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-26,2026-01-02,1,60115798,WF-106,Ļ(),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,ַ,A,ܺλ û ̳(ϽƮ ) ٰ,"26,200",0,"26,200",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-12,2026-01-23,1,10111101,REV-101,뿪̼(꼭),Y26013,Ѱ Ѵ Ǽ뿪(2)(ȭ30%)-μ/,Ѱ (2),Ѱ (2),,,,,ٷа, ,߼,,ȭENG,Ѱ簨ѴǼ뿪(2)(ȭ30%)-μ/,"1,815,000",0,0,"1,815,000",,,Ϲ,,,,,,,,, +ٷ,2026-01-12,2026-01-23,1,40110501,REV-101,߼,Y26013,Ѱ Ѵ Ǽ뿪(2)(ȭ30%)-μ/,Ѱ (2),Ѱ (2),,,,,ٷа, ,߼,,ȭENG,Ѱ簨ѴǼ뿪(2)(ȭ30%)-μ/,0,"1,650,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-12,2026-01-23,1,20112901,LIA-101,⼼,Y26013,Ѱ Ѵ Ǽ뿪(2)(ȭ30%)-μ/,Ѱ (2),Ѱ (2),,,,,ٷа, ,߼,,ȭENG,"1,650,000*10%",0,"165,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-13,2026-01-23,1,10111101,REV-101,뿪̼(꼭),Y26010,2026 濵 (Ƽ),,,,,,,,,Ѱȹ,,Ƽ,2026濵ױ(Ƽ)1,"23,760,000",0,0,"23,760,000",,,Ÿ,,,,,,,,, +ٷ,2026-01-13,2026-01-23,1,40110401,REV-101,뿪,Y26010,2026 濵 (Ƽ),,,,,,,,,Ѱȹ,,Ƽ,2026濵ױ(Ƽ)1,0,"21,600,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-13,2026-01-23,1,20112901,LIA-101,⼼,Y26010,2026 濵 (Ƽ),,,,,,,,,Ѱȹ,,Ƽ,"21,600,000*10%",0,"2,160,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-13,2026-01-23,1,10111101,REV-101,뿪̼(꼭),Y26012,2026 濵 (Ѷ),,,,,,,,,Ѱȹ,,Ѷ,2026濵ױ(Ѷ),"10,285,000",0,0,"10,285,000",,,Ÿ,,,,,,,,, +ٷ,2026-01-13,2026-01-23,1,40110401,REV-101,뿪,Y26012,2026 濵 (Ѷ),,,,,,,,,Ѱȹ,,Ѷ,2026濵ױ(Ѷ),0,"9,350,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-13,2026-01-23,1,20112901,LIA-101,⼼,Y26012,2026 濵 (Ѷ),,,,,,,,,Ѱȹ,,Ѷ,"9,350,000*10%",0,"935,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-21,2026-01-27,1,20111103,LIA-101,ޱ(Ϲݹ),X25051,ȹ,ȹ,ȹ,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,ȹ,,շα ȸ ȸĺ,0,"154,400",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-21,2026-01-27,1,60115705,WF-101,Ļ(ȸĴ),X25051,ȹ,ȹ,ȹ,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,ȹ,,շα ȸ ȸĺ,"154,400",0,"154,400",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-01-27,2026-01-27,1,20111103,LIA-101,ޱ(Ϲݹ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,() 2026 1 (43),0,"18,331,070",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-27,2026-01-27,1,60111101,HR-103,,X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,() 2026 1 (43),"18,331,070",0,"18,331,070",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-26,2026-01-27,1,20111103,LIA-101,ޱ(Ϲݹ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,() 2026 1 (6),0,"2,182,210",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-26,2026-01-27,1,60111101,HR-103,,X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,() 2026 1 (6),"2,182,210",0,"2,182,210",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-20,2026-01-27,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,Ѱȹ,,ѻ,ǰ û(ѻ λ),0,"200,000",0,0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2025-12-23,2026-01-02,1,60114301,OP-203,Ҹǰ(繫ǰ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,,õ繫 α ,"60,000",0,"60,000",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-09,2026-01-28,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,Ѱȹ,,ġǿ, ǰ(ġ) ( Ѱ 39),0,"195,000",0,0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2026-01-05,2026-01-07,1,60113105,OP-103,(ϼ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,()̷ؿ,11 ð ,"40,770",0,"40,770",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-20,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (01/15),0,"9,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-05,2026-01-07,1,60113105,OP-103,(ϼ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,()̷ؿ,12 ð ,"1,100",0,"1,100",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-21,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,," (, )",0,"21,260",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-07,1,60114398,OP-203,Ҹǰ(Ÿ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,ֿϱ,Ѱȹ ܺ (5EA),"230,000",0,"230,000",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-11,2026-01-14,1,60114301,OP-203,Ҹǰ(繫ǰ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,,Ҹǰ (â ǰ밡) ,"13,970",0,"13,970",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-22,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,A,SW ȫ ν Ŭ (100),0,"21,700",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-14,2026-01-15,1,60113707,IT-205,(),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,Ÿ ֽȸ, BIM 1 3D 𵨸 ũ̼ ,"545,455",0,"545,455",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-23,2026-01-29,1,60115903,WF-201,(),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,,( ),"30,000",0,"30,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-23,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,, - ,0,"30,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-23,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ERPȹ,۴,eg-bim Ȩ ȣ ׷̵,0,"38,140",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-14,2026-01-15,1,10115301,AST-106,Լ,X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,Ÿ ֽȸ, BIM 1 3D 𵨸 ũ̼ ,"54,545",0,"54,545",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-23,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ERPȹ,۴,egbim Ȩ Ʈ ʱȭ,0,"2,750",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-11,2026-01-15,1,50152599,WF-106,)Ļ(Ÿ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,, 湮 ,"47,000",0,"47,000",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-26,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,,Ѷ ( ) : BIM ī ,0,"168,330",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-26,2026-01-29,1,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,,Ѷ ( ) : BIM ī ,"168,330",0,"168,330",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-29,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,,ӿ AI (1),0,"29,000",0,0, 濵,,Ÿ,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,60116199,OP-204,ź(Ÿ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,SKε(),ٷ ǥȭ ź 26 01,"1,626",0,"1,626",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-22,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,ȸ Ļ,0,"15,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-22,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,A,ȸ Ļ,"15,000",0,"15,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-01-20,2026-01-29,1,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"64,030",0,"64,030",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-20,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"64,030",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-21,2026-01-29,1,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"25,120",0,"25,120",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-21,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"25,120",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-23,2026-01-29,1,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"99,830",0,"99,830",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-23,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"99,830",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,20111105,LIA-101,ޱ(KBī),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,ī(8824),12 (),0,"568,000",0,0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,12 (),"108,000",0,"108,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,12 (),"74,000",0,"74,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,12 (),"10,000",0,"10,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,12 (),"100,000",0,"100,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,12 (),"5,000",0,"5,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,12 (),"94,000",0,"94,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,12 (),"48,000",0,"48,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,12 (),"11,000",0,"11,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,12 (),"118,000",0,"118,000",0,,,,,,,,,,,, +ٷ,2026-01-26,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (01/09),0,"6,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,60116199,OP-204,ź(Ÿ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,SKε(),ٷ ǥȭ ܸҺα(ΰ),"22,000",0,"22,000",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-26,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,Ѱȹ,,ġǿ, ǰ(ġ) (ٷмҼ 3),0,"15,000",0,0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,10115301,AST-106,Լ,X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,SKε(),ް*10%,162,0,162,0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-26,2026-01-29,1,20111109,LIA-101,ޱ(ϳī),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ϰŹ(Űڳ),ϰ (26 1),0,"25,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-20,2026-01-20,1,50151999,OP-201,)(Ÿ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,ֽȸ _,"KB åӹ ű ( 2 / Matrice 300 RTK, Air2s)","844,000",0,"844,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-26,2026-01-29,1,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"21,440",0,"21,440",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-26,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"21,440",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-23,2026-01-29,1,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,A,2026 BIM ī (),"87,920",0,"87,920",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-23,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,A,2026 BIM ī (),0,"87,920",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,20111105,LIA-101,ޱ(KBī),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,ī(8824),12 Ĵ(),0,"988,600",0,0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,12 Ĵ(),"200,000",0,"200,000",0,,Ļ,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,12 Ĵ(),"61,000",0,"61,000",0,,Ļ,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,12 Ĵ(),"161,000",0,"161,000",0,,Ļ,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,12 Ĵ(),"35,500",0,"35,500",0,,Ļ,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,12 Ĵ(),"14,100",0,"14,100",0,,Ļ,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,12 Ĵ(),"67,000",0,"67,000",0,,Ļ,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,12 Ĵ(),"250,000",0,"250,000",0,,Ļ,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,12 Ĵ(),"200,000",0,"200,000",0,,Ļ,,,,,,,,,, +ٷ,2026-01-27,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,,(Ÿ),,ȹ/,,,,,,Ѱȹ,濵ȹ,ӹΰ,Ǽ ȸ() 2() ,0,"23,000",0,0,,,,,,,,,,,, +ٷ,2026-01-13,2026-01-20,1,60114301,OP-203,Ҹǰ(繫ǰ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,,ÿ ٰ ,"50,000",0,"50,000",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,ַ,A,1 Ѱȹ ǰ ٰ ,0,"162,220",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-19,2026-01-20,1,60114501,WF-301,μ(ŹⰣ๰),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ϰŹ(Űڳ),ϰ (12),"25,000",0,"25,000",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,20111105,LIA-101,ޱ(KBī),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,ī(8824),12 ü´ܷú(),0,"601,400",0,0,,,,,,,,,,,, +ٷ,2025-12-31,2026-01-20,1,50151507,MK-101,)μ(μ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,11 ٷ ,"90,000",0,"90,000",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,20111109,LIA-101,ޱ(ϳī),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,ϳī(7726),12 (ִ뼱),0,"493,000",0,0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,ִ뼱,12 (ִ뼱),"71,000",0,"71,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,ִ뼱,12 (ִ뼱),"72,000",0,"72,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,ִ뼱,12 (ִ뼱),"114,000",0,"114,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,ִ뼱,12 (ִ뼱),"76,000",0,"76,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,ִ뼱,12 (ִ뼱),"76,000",0,"76,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,ִ뼱,12 (ִ뼱),"84,000",0,"84,000",0,,,,,,,,,,,, +ٷ,2026-01-27,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,, ΰ ,0,"5,400",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-20,1,10115301,AST-106,Լ,X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,11 ٷ ,"9,000",0,"9,000",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,20111105,LIA-101,ޱ(KBī),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,ī(8824),1 (),0,"272,000",0,0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,1 (),"50,000",0,"50,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,1 (),"5,000",0,"5,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,1 (),"13,000",0,"13,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,1 (),"7,000",0,"7,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,1 (),"7,000",0,"7,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,1 (),"50,000",0,"50,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,1 (),"50,000",0,"50,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115999,WF-201,(Ÿ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,1 (),"90,000",0,"90,000",0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,, 系̻ ߱ ,0,"2,200",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-20,2026-01-20,1,60116199,OP-204,ź(Ÿ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,SKε(),ٷ ERP ͳ ȸ ź 26 01 ,"510,000",0,"510,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,20111105,LIA-101,ޱ(KBī),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,ī(8824),1 Ĵ(),0,"1,717,300",0,0,,,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,1 Ĵ(),"62,500",0,"62,500",0,,Ļ,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,1 Ĵ(),"28,000",0,"28,000",0,,Ļ,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,1 Ĵ(),"200,000",0,"200,000",0,,Ļ,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,1 Ĵ(),"221,000",0,"221,000",0,,Ļ,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,1 Ĵ(),"25,000",0,"25,000",0,,Ļ,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,1 Ĵ(),"250,000",0,"250,000",0,,Ļ,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,1 Ĵ(),"315,000",0,"315,000",0,,Ļ,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,1 Ĵ(),"242,000",0,"242,000",0,,Ļ,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,1 Ĵ(),"241,000",0,"241,000",0,,Ļ,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,1 Ĵ(),"100,000",0,"100,000",0,,Ļ,,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,,1 Ĵ(),"32,800",0,"32,800",0,,Ļ,,,,,,,,,, +ٷ,2026-01-12,2026-01-29,1,10111101,REV-101,뿪̼(꼭),Y25017,42ȣ 1 ǽü뿪(ͱ) BIM ,42 ~,42ȣ 1 ǽü뿪(),,뿪,,,ٷа,뿪,߼,,()ȭ,42ȣ1ұΰǽü뿪(ͱ)BIM,"14,520,000",0,0,"14,520,000",,,Ϲ,,,,,,,,, +ٷ,2026-01-12,2026-01-29,1,40110501,REV-101,߼,Y25017,42ȣ 1 ǽü뿪(ͱ) BIM ,42 ~,42ȣ 1 ǽü뿪(),,뿪,,,ٷа,뿪,߼,,()ȭ,42ȣ1ұΰǽü뿪(ͱ)BIM,0,"13,200,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-12,2026-01-29,1,20112901,LIA-101,⼼,Y25017,42ȣ 1 ǽü뿪(ͱ) BIM ,42 ~,42ȣ 1 ǽü뿪(),,뿪,,,ٷа,뿪,߼,,()ȭ,"13,200,000*10%",0,"1,320,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-19,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25051,ȹ,ȹ,ȹ,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,ȹ,ȫƸ,CELȸ ɽĴ (7),0,"100,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-19,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),X25051,ȹ,ȹ,ȹ,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,ȹ,ȫƸ,CELȸ ɽĴ (7),"100,000",0,"100,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-01-20,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,,"θ/κ ߱ (ΰ 4,  2, ʺ 2)",0,"4,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-20,2026-01-20,1,10115301,AST-106,Լ,X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,SKε(),ٷ ERP ͳ ȸ ź 26 01 ,"51,000",0,"51,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-20,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),OBOBOB,(OB),(OB),,ȹ/,,,,,,ӿ,,SKڷ(),12 ޴ (ִ뼱),0,"144,280",0,0,,,,,,,,,,,, +ٷ,2026-01-26,2026-01-29,1,60114501,WF-301,μ(ŹⰣ๰),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ϰŹ(Űڳ),ϰ (26 1),"25,000",0,"25,000",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115798,WF-106,Ļ(),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,ַ,A,1 Ѱȹ ǰ ٰ ,"162,220",0,"162,220",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-02,1,60114398,OP-203,Ҹǰ(Ÿ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼, BIM1,ȿ,GNSS ׽Ʈ ׳ ,"300,500",0,"300,500",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-19,2026-01-29,1,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"43,340",0,"43,340",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-19,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"43,340",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-16,2026-01-29,1,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"28,350",0,"28,350",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-16,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"28,350",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-02,2026-01-30,1,10111101,REV-101,뿪̼(꼭),Y25017,42ȣ 1 ǽü뿪(ͱ) BIM ,42 ~,42ȣ 1 ǽü뿪(),,뿪,,,ٷа,뿪,߼,,()ȭ,42ȣ1ұΰǽü뿪(ͱ)BIM,0,"14,520,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-02,2026-01-30,1,10110501,AST-101,뿹,Y25017,42ȣ 1 ǽü뿪(ͱ) BIM ,42 ~,42ȣ 1 ǽü뿪(),,뿪,,,ٷа,뿪,߼,,(ְŷ),42ȣ1ұΰǽü뿪(ͱ)BIM,"14,520,000",0,0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-02,2026-01-02,1,20110101,LIA-101,ܻԱ,X25055,GIS ,GIS 񰳹,GIS ,ȹ/,ȹ&,,,ȹ/,ȹ,߼,,,SatPointer ϵ ,0,"8,800,000",0,0,,,Ϲ,,,,,,,,, +Ѹ,2026-01-20,2026-01-20,1,50151309,OP-203,)Ҹǰ(),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,õ繫/Ÿ (25 12),"199,100",,"199,100",0,X,,Ϲ,,,,,,,,, +,2026-01-20,2026-01-20,1,60114733,IT-301,迬(޼),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,йåӺ ȯޱ ޿ ,"101,000",,"101,000",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-02,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,(׷),(׷),(׷),ȹ/,,,,,,߼,Ͼ ȹ׷,纴ȫ,12 ,0,"125,000",0,0, ׷,,Ÿ,,,,,,,,, +ٷ,2025-12-31,2026-01-02,1,60115903,WF-201,(),ZZZZZZ,(׷),(׷),(׷),ȹ/,,,,,,߼,Ͼ ȹ׷,纴ȫ,12 ,"125,000",0,"125,000",0, ׷,,Ÿ,,,,,,,,, +ٷ,2025-12-31,2026-01-02,1,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼, BIM1,ȿ,GNSS ׽Ʈ ׳ ,0,"300,500",0,0,,,Ϲ,,,,,,,,, +,2026-01-28,2026-01-27,1,60114739,IT-201,迬(Ҹǰ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,߼/Ż繫 Ŀǿ (1_ⱸ),"660,000",,"660,000",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-31,2026-01-02,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,(׷),(׷),(׷),ȹ/,,,,,,߼,Ͼ ȹ׷,纴ȫ,ȸ Ĵ,0,"185,300",0,0, ׷,,Ÿ,,,,,,,,, +ٷ,2025-12-31,2026-01-02,1,60115705,WF-101,Ļ(ȸĴ),ZZZZZZ,(׷),(׷),(׷),ȹ/,,,,,,߼,Ͼ ȹ׷,纴ȫ,ȸ Ĵ,"185,300",0,"185,300",0, ׷,Ļ,Ÿ,,,,,,,,, +ٷ,2025-12-24,2026-01-02,1,20111103,LIA-101,ޱ(Ϲݹ),X25028,ý(PM),ý(PM),ý(PM),S/W,ַ,,,S/W ,ַ,߼,GSIM ,ȣ,Ʈ Ŭ 丮 12 ûݾ,0,"19,474",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-26,2026-01-02,1,60116399,IT-301,޼(Ÿ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,," (25.12~25.12, 系̵)","187,420",0,"187,420",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-24,2026-01-02,1,20111103,LIA-101,ޱ(Ϲݹ),X25028,ý(PM),ý(PM),ý(PM),S/W,ַ,,,S/W ,ַ,߼,GSIM ,ȣ,ź,0,"35,200",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-12,2026-01-22,1,60117301,WF-301,Ʒú,X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ֽȸ ,ٷƮ 2025 ʼ DZ,"1,332,000",0,"1,332,000",0,,,Ϲ,,,,,,,,, +ٷ,2025-12-23,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X25008,WayPrimal,WayPrimal,WayPrimal,S/W,,,,S/W ,,߼,Infra Solution ,Ѽ,InfraSolution ȸĺ,0,"499,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-23,2026-01-07,1,60115705,WF-101,Ļ(ȸĴ),X25008,WayPrimal,WayPrimal,WayPrimal,S/W,,,,S/W ,,߼,Infra Solution ,Ѽ,InfraSolution ȸĺ,"499,000",0,"499,000",0,X,Ļ,Ϲ,,,,,,,,, +ٷ,2025-12-30,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X25032,ܰ/ solution,ܰ/ solution,ܰ/ solution,S/W,ַ,,,S/W ,ַ,߼,C.C.,, ȸĺ,0,"333,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-30,2026-01-07,1,60115705,WF-101,Ļ(ȸĴ),X25032,ܰ/ solution,ܰ/ solution,ܰ/ solution,S/W,ַ,ȹ,,S/W ,ַ,߼,C.C.,,Construction Control ȸĺ,"333,000",0,"333,000",0,X,Ļ,Ϲ,,,,,,,,, +ٷ,2025-12-17,2026-01-07,1,60115903,WF-201,(),25061,õ KTX ᱳ ð,õ KTX ð,õ KTX ᱳ ð,,ð,,, Ʈ,ð,߼, ,ɿǥ,,"98,240",0,"98,240",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-17,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),25061,õ KTX ᱳ ð,õ KTX ð,õ KTX ᱳ ð,,ð,,, Ʈ,ð,߼, ,ɿǥ, - ɿǥ,0,"98,240",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-23,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X25010,WayDraw,WayDraw,WayDraw,S/W,,,,S/W ,,߼,Infra Solution ,,4б ̳ ȸ,0,"505,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-23,2026-01-07,1,60115705,WF-101,Ļ(ȸĴ),X25010,WayDraw,WayDraw,WayDraw,S/W,,ȹ,,S/W ,,߼,Infra Solution ,,4б ̳ ȸ,"505,000",0,"505,000",0,X,Ļ,Ϲ,,,,,,,,, +ٷ,2025-12-24,2026-01-07,1,60115903,WF-201,(),25061,õ KTX ᱳ ð,õ KTX ð,õ KTX ᱳ ð,,ð,,, Ʈ,ð,߼,ǹ,̼,,"1,089,770",0,"1,089,770",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-24,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),25061,õ KTX ᱳ ð,õ KTX ð,õ KTX ᱳ ð,,ð,,, Ʈ,ð,߼,ǹ,̼, - ̼,0,"1,089,770",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-02,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X25030,GSIM,GSIM,GSIM,S/W,ַ,,,S/W ,ַ,߼,GSIM ,ȣ, ȸĺ,0,"313,200",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-02,2026-01-07,1,60115705,WF-101,Ļ(ȸĴ),X25030,GSIM,GSIM,GSIM,S/W,ַ,,,S/W ,ַ,߼,GSIM ,ȣ,GSIM ȸĺ,"313,200",0,"313,200",0,X,Ļ,Ϲ,,,,,,,,, +ٷ,2025-12-23,2026-01-07,1,60115903,WF-201,(),X25051,ȹ,ȹ,ȹ,ȹ/,ȹ&,,,ȹ/,ȹ,߼, BIM1,,,"425,620",0,"425,620",0,,,Ϲ,,,,,,,,, +ٷ,2025-12-23,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X25051,ȹ,ȹ,ȹ,ȹ/,ȹ&,,,ȹ/,ȹ,߼, BIM1,ȿ, - ȿ,0,"240,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-23,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X25051,ȹ,ȹ,ȹ,ȹ/,ȹ&,,,ȹ/,ȹ,߼, BIM1,, - ,0,"185,620",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-23,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X25046,,,,ȹ/, S/W,,,S/W ,S/W,߼,Web Solution,,Cursor AI Agent (ۺ),0,"137,666",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-23,2026-01-07,1,50153199,IT-301,)޼(Ÿ),X25046,,,,ȹ/, S/W,,,S/W ,S/W,߼,Web Solution,,Cursor AI Agent (ۺ),"137,666",0,"137,666",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-24,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X25021,LifeLine-Water,LifeLine-Water,LifeLine-Water,S/W,/,,,S/W ,/,߼,ϼ,, ̳ ȸǺ,0,"42,200",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-24,2026-01-07,1,50154701,WF-103,)ȸǺ,X25021,LifeLine-Water,LifeLine-Water,LifeLine-Water,S/W,/,ȹ,,S/W ,/,߼,ϼ,,&谳 ü ̳ ȸǺ,"42,200",0,"42,200",0,X,Ļ,Ϲ,,,,,,,,, +ٷ,2025-12-26,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X25022,찭 α׷,찭 α׷,찭 α׷,S/W,/,,,S/W ,/,߼,ڿ,,ڿ ȸĺ,0,"95,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-26,2026-01-07,1,60115705,WF-101,Ļ(ȸĴ),X25022,찭 α׷,찭 α׷,찭 α׷,S/W,/,ȹ,,S/W ,/,߼,ڿ,,ġŲ ſõ ڿ ȸĺ,"95,000",0,"95,000",0,X,Ļ,Ϲ,,,,,,,,, +ٷ,2025-12-23,2026-01-07,1,60115903,WF-201,(),Z25058,~õ ΰǼ ⺻ ǽü,~õ ⺻ ǽü,~õ ΰǼ ⺻ ǽü,,BIM,,, Ʈ,BIM ,߼, BIM1,̹,,"96,264",0,"96,264",0,,,Ϲ,,,,,,,,, +ٷ,2025-12-23,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),Z25058,~õ ΰǼ ⺻ ǽü,~õ ⺻ ǽü,~õ ΰǼ ⺻ ǽü,,BIM,,, Ʈ,BIM ,߼, BIM1,̹, - ̹,0,"96,264",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-26,2026-01-07,1,20111103,LIA-101,ޱ(Ϲݹ),X25024,HmEG(HmDraw),HmEG(HmDraw),HmEG(HmDraw),S/W,׷,,,S/W ,׷&ؼ,߼,׷Ƚ ,¹, ȸĺ,0,"201,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-26,2026-01-07,1,60115705,WF-101,Ļ(ȸĴ),X25024,HmEG(HmDraw),HmEG(HmDraw),HmEG(HmDraw),S/W,׷,,,S/W ,׷&ؼ,߼,׷Ƚ ,¹,HmEG ȸĺ,"201,000",0,"201,000",0,X,Ļ,Ϲ,,,,,,,,, +ٷ,2026-01-02,2026-01-09,1,20111103,LIA-101,ޱ(Ϲݹ),X25028,ý(PM),ý(PM),ý(PM),S/W,ַ,,,S/W ,ַ,߼,GSIM ,ȣ,Ʈ Ŭ 12 ݾ,0,"290,556",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-19,2026-01-29,1,60116399,IT-301,޼(Ÿ),X25046,,,,ȹ/, S/W,,,S/W ,S/W,߼,,¾ ֽȸ, ȭ 12 ,"362,300",0,"362,300",0,,,Ϲ,,,,,,,,, +ٷ,2025-12-30,2026-01-09,1,60115903,WF-201,(),Y25008,-ȭ ӵ Ǽ ⺻ܰ BIM (5),~ȭ ӵ(5),-ȭ ӵ Ǽ ⺻ ǽ(5),,뿪,,,ٷа,뿪,߼, BIM2,ǥ,,"142,310",0,"142,310",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-30,2026-01-09,1,20111103,LIA-101,ޱ(Ϲݹ),Y25008,-ȭ ӵ Ǽ ⺻ܰ BIM (5),~ȭ ӵ(5),-ȭ ӵ Ǽ ⺻ ǽ(5),,뿪,,,ٷа,뿪,߼, BIM2,ǥ, - ǥ,0,"142,310",0,0,,,Ϲ,,,,,,,,, +ٷ,2025-12-05,2026-01-09,1,60115903,WF-201,(),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,߼, BIM1,̱,,"60,000",0,"60,000",0,,,Ϲ,,,,,,,,, +ٷ,2025-12-05,2026-01-09,1,20111103,LIA-101,ޱ(Ϲݹ),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,߼, BIM1,̱,,0,"60,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,60115903,WF-201,(),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,/,"397,000",0,"397,000",0,HSJ,,Ÿ,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,,(Ÿ),,ȹ/,,,,,,߼,,,/,0,"397,000",0,0,,,,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,60115903,WF-201,(),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,/,"327,000",0,"327,000",0,HSJ,,Ÿ,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,,(Ÿ),,ȹ/,,,,,,߼,,,/,0,"327,000",0,0,,,,,,,,,,,, +ٷ,2025-12-22,2026-01-15,1,60115903,WF-201,(),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,߼, BIM1,̱,,"8,000",0,"8,000",0,,,Ϲ,,,,,,,,, +ٷ,2025-12-22,2026-01-15,1,20111103,LIA-101,ޱ(Ϲݹ),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,߼, BIM1,̱, - ̱,0,"8,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,60115903,WF-201,(),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,߼, BIM1,̱,,"16,000",0,"16,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,20111103,LIA-101,ޱ(Ϲݹ),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,߼, BIM1,̱,,0,"16,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,60115705,WF-101,Ļ(ȸĴ),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,׷ Ĵ,"267,000",0,"267,000",0,HSJ,Ļ,Ÿ,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,,(Ÿ),,ȹ/,,,,,,߼,,,׷ Ĵ,0,"267,000",0,0,,,,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,60115705,WF-101,Ļ(ȸĴ),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,Infra Solution ȸ Ĵ,"283,800",0,"283,800",0,HSJ,Ļ,Ÿ,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,,(Ÿ),,ȹ/,,,,,,߼,,,Infra Solution ȸ Ĵ,0,"283,800",0,0,,,,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,60115705,WF-101,Ļ(ȸĴ),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,Ͼ ߱׷ ȸ Ĵ,"485,000",0,"485,000",0,HSJ,Ļ,Ÿ,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,,(Ÿ),,ȹ/,,,,,,߼,,,Ͼ ߱׷ ȸ Ĵ,0,"485,000",0,0,,,,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,60115705,WF-101,Ļ(ȸĴ),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,Modeler Ĵ,"309,000",0,"309,000",0,HSJ,Ļ,Ÿ,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,,(Ÿ),,ȹ/,,,,,,߼,,,Modeler Ĵ,0,"309,000",0,0,,,,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,60115903,WF-201,(),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,/,"334,000",0,"334,000",0,HSJ,,Ÿ,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,,(Ÿ),,ȹ/,,,,,,߼,,,/,0,"334,000",0,0,,,,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,60115705,WF-101,Ļ(ȸĴ),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,Strana Ĵ,"284,800",0,"284,800",0,HSJ,Ļ,Ÿ,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,,(Ÿ),,ȹ/,,,,,,߼,,,Strana Ĵ,0,"284,800",0,0,,,,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,60115705,WF-101,Ļ(ȸĴ),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,EG-BIM ȸ,"266,000",0,"266,000",0,HSJ,Ļ,Ÿ,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,,(Ÿ),,ȹ/,,,,,,߼,,,EG-BIM ȸ,0,"266,000",0,0,,,,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,60115903,WF-201,(),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,/,"338,000",0,"338,000",0,HSJ,,Ÿ,,,,,,,,, +ٷ,2026-01-09,2026-01-15,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,,(Ÿ),,ȹ/,,,,,,߼,,,/,0,"338,000",0,0,,,,,,,,,,,, +ٷ,2026-01-08,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,(׷),(׷),(׷),ȹ/,,,,,,߼,Ͼ ߱׷,輮,ȸ Ĵ ,0,"88,100",0,0, ׷,,Ÿ,,,,,,,,, +ٷ,2026-01-08,2026-01-20,1,50152507,WF-101,)Ļ(ȸĴ),X25002,KNGIL,KNGIL,KNGIL,S/W,GIS,,,S/W , GIS,߼,Ͼ ߱׷,輮,(ȸ) ȸ Ĵ,"34,700",0,"34,700",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-01-08,2026-01-20,1,50152507,WF-101,)Ļ(ȸĴ),X25002,KNGIL,KNGIL,KNGIL,S/W,GIS,,,S/W , GIS,߼,Ͼ ߱׷,輮,(ȸ) ȸ ,"9,500",0,"9,500",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-01-08,2026-01-20,1,50152507,WF-101,)Ļ(ȸĴ),X25029,bCMf,bCMf,bCMf,S/W,ַ,,,S/W ,ַ,߼,Ͼ ߱׷,輮,BCMF ȸ Ļ,"20,000",0,"20,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-01-08,2026-01-20,1,50152507,WF-101,)Ļ(ȸĴ),X25042,ERP: ٷ,ERP:ٷ,ERP: ٷ,ȹ/, S/W,,,S/W ,S/W,߼,Ͼ ߱׷,輮,ձ Ĵ,"6,500",0,"6,500",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-01-08,2026-01-20,1,50152507,WF-101,)Ļ(ȸĴ),X25057, ߻ 1ٽɰ(), (1ٽ), ߻,,R&D,,, Ʈ,R&D,߼,Ͼ ߱׷,輮, GNSS ,"17,400",0,"17,400",0,,Ļ,R&D,,,,,,,,, +ٷ,2025-12-22,2026-01-20,1,60115903,WF-201,(),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,߼,ȹ,,,"16,500",0,"16,500",0,,,Ϲ,,,,,,,,, +ٷ,2025-12-22,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,߼,ȹ,, - ,0,"16,500",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-13,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,߼,Infra Solution ,, ߱޼,0,"47,400",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-19,2026-01-29,1,10115301,AST-106,Լ,X25046,,,,ȹ/, S/W,,,S/W ,S/W,߼,,¾ ֽȸ,"362,300*10%","36,230",0,"36,230",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-07,2026-01-20,1,20111103,LIA-101,ޱ(Ϲݹ),X25012,WallZainer,WallZainer,WallZainer,S/W,,,,S/W ,,߼, S/W,,SW ȸĺ,0,"103,600",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-07,2026-01-20,1,60115705,WF-101,Ļ(ȸĴ),X25012,WallZainer,WallZainer,WallZainer,S/W,,,,S/W ,,߼, S/W,,SW ȸĺ,"103,600",0,"103,600",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-01-19,2026-01-23,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,(׷),(׷),(׷),ȹ/,,,,,,߼,Ͼ ߱׷,輮,ȸ Ĵ ,0,"43,000",0,0, ׷,,Ÿ,,,,,,,,, +ٷ,2026-01-19,2026-01-23,1,50152507,WF-101,)Ļ(ȸĴ),ZZZZZZ,(׷),(׷),(׷),ȹ/,,,,,,߼,Ͼ ߱׷,輮,ʸ ȸ ,"5,000",0,"5,000",0, ׷,Ļ,Ÿ,,,,,,,,, +ٷ,2026-01-19,2026-01-23,1,50152507,WF-101,)Ļ(ȸĴ),ZZZZZZ,(׷),(׷),(׷),ȹ/,,,,,,߼,Ͼ ߱׷,輮,ȸ Ļ,"32,000",0,"32,000",0, ׷,Ļ,Ÿ,,,,,,,,, +ٷ,2026-01-19,2026-01-23,1,50152507,WF-101,)Ļ(ȸĴ),ZZZZZZ,(׷),(׷),(׷),ȹ/,,,,,,߼,Ͼ ߱׷,輮,ȸ ,"6,000",0,"6,000",0, ׷,Ļ,Ÿ,,,,,,,,, +ٷ,2026-01-22,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25053,ڿ ؿܻ,ڿ ؿܻ,ڿ ؿܻ,ȹ/,ȹ&,,,ȹ/,ȹ,߼,ڿ,,ڿ ο ȸ,0,"147,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-22,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),X25053,ڿ ؿܻ,ڿ ؿܻ,ڿ ؿܻ,ȹ/,ȹ&,,,ȹ/,ȹ,߼,ڿ,,ϼ ڿ ȸĺ,"147,000",0,"147,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-01-22,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25038,ERP: PTC,ERP:PTC,ERP: PTC,ȹ/, S/W,,,S/W ,S/W,߼,Web Solution,,PTC μΰ Ļ,0,"36,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-22,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),X25038,ERP: PTC,ERP:PTC,ERP: PTC,ȹ/, S/W,,,S/W ,S/W,߼,Web Solution,,PTC μΰ Ļ,"36,000",0,"36,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-01-23,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25029,bCMf,bCMf,bCMf,S/W,ַ,,,S/W ,ַ,߼,Web Solution,, ȸ,0,"65,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-23,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),X25029,bCMf,bCMf,bCMf,S/W,ַ,,,S/W ,ַ,߼,Web Solution,,BCMF μ ΰ Ļ,"65,000",0,"65,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-01-27,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25009,WayConfirm,WayConfirm,WayConfirm,S/W,,,,S/W ,,߼,Infra Solution ,̰,ַ Ż鼿 ȸĺ,0,"120,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-27,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),X25009,WayConfirm,WayConfirm,WayConfirm,S/W,,,,S/W ,,߼,Infra Solution ,̰,ַ Ż鼿 ȸĺ,"120,000",0,"120,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-01-27,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25033,WatchBIM,WatchBIM,WatchBIM,S/W,,,,S/W ,ַ,߼,Infra Solution ,,WatchBIM ȸ,0,"140,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-27,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),X25033,WatchBIM,WatchBIM,WatchBIM,S/W,,,,S/W ,ַ,߼,Infra Solution ,,WatchBIM ȸ,"140,000",0,"140,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-01-23,2026-01-29,1,60115903,WF-201,(),Y25004,"ϼý뿪(α׷ , ߾ )", ϼý, ϼ ý 뿪,,,,,ٷа,뿪,߼,Web Solution,̺,,"158,000",0,"158,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-23,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),Y25004,"ϼý뿪(α׷ , ߾ )", ϼý, ϼ ý 뿪,,,,,ٷа,뿪,߼,Ͼ ߱׷,輮, - 輮,0,"36,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-23,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),Y25004,"ϼý뿪(α׷ , ߾ )", ϼý, ϼ ý 뿪,,,,,ٷа,뿪,߼,Web Solution,ȣ, - ȣ,0,"113,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-23,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),Y25004,"ϼý뿪(α׷ , ߾ )", ϼý, ϼ ý 뿪,,,,,ٷа,뿪,߼,Web Solution,̺, - ̺,0,"9,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25028,ý(PM),ý(PM),ý(PM),S/W,ַ,,,S/W ,ַ,߼,GSIM ,ȣ,Ʈ Ŭ 丮 01 ûݾ,0,"23,705",0,0,,,Ϲ,,,,,,,,, +Ѹ,2025-12-22,2026-01-08,1,50153103,OUT-102,)޼(뿪),X25046,,,,ȹ/, S/W,,,S/W ,S/W,߼,,,ȭ 12,"55,000",,"55,000",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25030,GSIM,GSIM,GSIM,S/W,ַ,,,S/W ,ַ,߼,GSIM ,ȣ,ź,0,"26,110",0,0,,,Ϲ,,,,,,,,, +Ѹ,2025-12-23,2026-01-08,1,50153103,OUT-102,)޼(뿪),X25046,,,,ȹ/, S/W,,,S/W ,S/W,߼,,, () 12,"770,000",,"770,000",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25044,PQý,PQý,PQý,ȹ/, S/W,,,S/W ,S/W,߼,Web Solution,ȣ,PQα׷ ȸ ,0,"10,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115705,WF-101,Ļ(ȸĴ),X25044,PQý,PQý,PQý,ȹ/, S/W,,,S/W ,S/W,߼,Web Solution,ȣ,PQα׷ ȸ ,"10,000",0,"10,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-01-20,2026-01-21,1,50153199,IT-301,)޼(Ÿ),X25054,AI,AI,AI,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,,Ŭ ڸ ȸ,Ŭ Ai (12),"105,113",0,"105,113",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-20,2026-01-21,1,10115301,AST-106,Լ,X25054,AI,AI,AI,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,,Ŭ ڸ ȸ,Ŭ Ai (12),"10,511",0,"10,511",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-19,2026-01-29,1,20110101,LIA-101,ܻԱ,X25046,,,,ȹ/, S/W,,,S/W ,S/W,߼,,¾ ֽȸ, ȭ 12 ,0,"398,530",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),X25058, ߻ 2ٽɰ(), (2ٽ), 2ٽ,,R&D,,, Ʈ,R&D,߼,Ͼ ߱׷,輮, kickoff ,0,"47,400",0,0,,,R&D,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,60115903,WF-201,(),X25058, ߻ 2ٽɰ(), (2ٽ), 2ٽ,,R&D,,, Ʈ,R&D,߼,Ͼ ߱׷,輮, kickoff ,"47,400",0,"47,400",0,,,R&D,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,(׷),(׷),(׷),ȹ/,,,,,,߼,Ͼ ߱׷,輮, Ĵ,0,"111,600",0,0, ׷,,Ÿ,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,50152507,WF-101,)Ļ(ȸĴ),X25058, ߻ 2ٽɰ(), (2ٽ), 2ٽ,,R&D,,, Ʈ,R&D,߼,Ͼ ߱׷,輮, kickoff ,"11,700",0,"11,700",0,,Ļ,R&D,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,50152507,WF-101,)Ļ(ȸĴ),X25058, ߻ 2ٽɰ(), (2ٽ), 2ٽ,,R&D,,, Ʈ,R&D,߼,Ͼ ߱׷,輮,ETRI ȸ Ļ,"47,100",0,"47,100",0,,Ļ,R&D,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,50152507,WF-101,)Ļ(ȸĴ),X25058, ߻ 2ٽɰ(), (2ٽ), 2ٽ,,R&D,,, Ʈ,R&D,߼,Ͼ ߱׷,輮,ETRI ȸ Ļ,"15,500",0,"15,500",0,,Ļ,R&D,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,50152507,WF-101,)Ļ(ȸĴ),X25058, ߻ 2ٽɰ(), (2ٽ), 2ٽ,,R&D,,, Ʈ,R&D,߼,Ͼ ߱׷,輮,ETRI ȸ Ļ,"32,300",0,"32,300",0,,Ļ,R&D,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,50152507,WF-101,)Ļ(ȸĴ),ZZZZZZ,(׷),(׷),(׷),ȹ/,,,,,,߼,Ͼ ߱׷,輮, ü ,"5,000",0,"5,000",0, ׷,Ļ,Ÿ,,,,,,,,, +ٷ,2026-01-21,2026-01-21,1,50153199,IT-301,)޼(Ÿ),X25054,AI,AI,AI,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,,Ŭ ڸ ȸ,Ŭ Ai (11),535,0,535,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-21,2026-01-21,1,10115301,AST-106,Լ,X25054,AI,AI,AI,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,,Ŭ ڸ ȸ,Ŭ Ai (11),54,0,54,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-21,2026-01-21,1,50153199,IT-301,)޼(Ÿ),X25054,AI,AI,AI,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,,Cloudflare Inc.,Ai Cloudflare (12),"8,375",0,"8,375",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-15,2026-01-20,1,50153199,IT-301,)޼(Ÿ),X25043,CivilEngineeringLab,CivilEngineeringLab,CivilEngineeringLab,ȹ/,ȹ&,,,S/W ,S/W,Ѱȹ,ERPȹ,۴,rightcivilengineering (3),"68,970",0,"68,970",0,,,Ϲ,,,,,,,,, +ٷ,2025-12-24,2026-01-02,1,50151301,OP-203,)Ҹǰ(繫ǰ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,A,SW ġ USB ǽ Ŀġ (2),"31,700",0,"31,700",0,X,,Ϲ,,,,,,,,, +ٷ,2025-12-24,2026-01-02,1,60115798,WF-106,Ļ(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,A,Ÿ Ʈī ,"1,000,000",0,"1,000,000",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-08,2026-01-20,1,60115798,WF-106,Ļ(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (01/07),"59,100",0,"59,100",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-08,2026-01-20,1,60115798,WF-106,Ļ(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,A,Ÿ Ʈī ,"700,000",0,"700,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-09,2026-01-20,1,60115798,WF-106,Ļ(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,A,߼Ʈ (01/09),"45,400",0,"45,400",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-12,2026-01-20,1,60115798,WF-106,Ļ(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (01/09),"52,300",0,"52,300",0,,,Ϲ,,,,,,,,, +Ѹ,2026-01-13,2026-01-14,1,60114744,WF-103,迬(ȸǺ()),X25056,ƮǼ߻ 10(Ѹ///Ƽ),ƮǼ(10),ƮǼ(10),,R&D,,, Ʈ,R&D,Ѱȹ,,,ƮǼ10/ȸ Ĵ(12/02),"87,000",,"87,000",0,,Ļ,R&D,,,,,,,,, +Ѹ,2026-01-13,2026-01-14,1,60114744,WF-103,迬(ȸǺ()),X25056,ƮǼ߻ 10(Ѹ///Ƽ),ƮǼ(10),ƮǼ(10),,R&D,,, Ʈ,R&D,Ѱȹ,,,ƮǼ10/ȸ Ĵ(12/23),"355,000",,"355,000",0,,Ļ,R&D,,,,,,,,, +Ѹ,2026-01-13,2026-01-14,1,60114744,WF-103,迬(ȸǺ()),Y23113,ǵ Lv4. ɷ 򰡱 ,,,,,,,,,Ѱȹ,,,ǵαLV.4/ȸ Ĵ(12/12),"108,000",,"108,000",0,,Ļ,Ÿ,,,,,,,,, +Ѹ,2026-01-13,2026-01-14,1,60114744,WF-103,迬(ȸǺ()),Y23113,ǵ Lv4. ɷ 򰡱 ,,,,,,,,,Ѱȹ,,,ǵαLV.4/ȸ Ĵ(12/16),"218,000",,"218,000",0,,Ļ,Ÿ,,,,,,,,, +Ѹ,2026-01-13,2026-01-14,1,60114744,WF-103,迬(ȸǺ()),Y23113,ǵ Lv4. ɷ 򰡱 ,,,,,,,,,Ѱȹ,,,ǵαLV.4/ȸ Ĵ(12/23),"355,000",,"355,000",0,,Ļ,Ÿ,,,,,,,,, +ٷ,2026-01-16,2026-01-20,1,60115798,WF-106,Ļ(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (01/15),"22,200",0,"22,200",0,,,Ϲ,,,,,,,,, +Ѹ,2026-01-15,2026-01-15,1,10113701,AST-104,ޱ(Ϲ),X25056,ƮǼ߻ 10(Ѹ///Ƽ),ƮǼ(10),ƮǼ(10),,R&D,,, Ʈ,R&D,Ѱȹ,,,ƮǼ10/ΰ ȯ(12),"327,444",,0,"327,444",,,R&D,,,,,,,,, +Ѹ,2026-01-15,2026-01-15,1,10113701,AST-104,ޱ(Ϲ),Y23113,ǵ Lv4. ɷ 򰡱 ,,,,,,,,,Ѱȹ,,,ǵαLV.4/ΰ ȯ(10~12),"132,230",,0,"132,230",,,Ÿ,,,,,,,,, +Ѹ,2026-01-20,2026-01-20,1,50152705,WF-201,)(ó),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,õ繫/11 Ұ,0,,0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-15,2026-01-20,1,50153199,IT-301,)޼(Ÿ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ERPȹ,۴, 2 (3),"141,020",0,"141,020",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-20,2026-01-20,1,10352101,IT-101,Ʈ,X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,,The Intellicad Technology Consortium,EG-BIM ITC (IntelliCAD) οƼ (ȭ),"51,569,000",0,"51,569,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-20,2026-01-23,1,60115798,WF-106,Ļ(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,Ʈϰ (01/18),"100,000",0,"100,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-20,2026-01-29,1,60115798,WF-106,Ļ(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (01/15),"9,000",0,"9,000",0,,,Ϲ,,,,,,,,, +Ѹ,2026-01-05,2026-01-14,1,60115305,MK-201,(),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,߼,,, Ƶȥ/26.1.11 Ͽ 12:30/ ȸ 612 ,"500,000",,"500,000",0," Ʒ,",Ļ,Ÿ,,,,,,,,, +Ѹ,2026-01-09,2026-01-15,1,60115705,WF-101,Ļ(ȸĴ),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,浵647ȣ ȣ뱳/ ȸ,"283,000",,"283,000",0,HSJ,Ļ,Ÿ,,,,,,,,, +Ѹ,2026-01-09,2026-01-15,1,60115705,WF-101,Ļ(ȸĴ),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,¡ 3 ȹ ,"266,200",,"266,200",0,HSJ,Ļ,Ÿ,,,,,,,,, +Ѹ,2026-01-09,2026-01-15,1,60115705,WF-101,Ļ(ȸĴ),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,-õ ΰ ȸ,"65,000",,"65,000",0,HSJ,Ļ,Ÿ,,,,,,,,, +Ѹ,2026-01-09,2026-01-15,1,60115705,WF-101,Ļ(ȸĴ),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,õ Ϲ μȸ,"265,200",,"265,200",0,HSJ,Ļ,Ÿ,,,,,,,,, +Ѹ,2026-01-09,2026-01-15,1,60115705,WF-101,Ļ(ȸĴ),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,ﳲ ,"284,000",,"284,000",0,HSJ,Ļ,Ÿ,,,,,,,,, +Ѹ,2026-01-09,2026-01-15,1,60115705,WF-101,Ļ(ȸĴ),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,2023 ƻ ðȹ ,"241,000",,"241,000",0,HSJ,Ļ,Ÿ,,,,,,,,, +Ѹ,2026-01-09,2026-01-15,1,60115705,WF-101,Ļ(ȸĴ),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,걹 ,"216,000",,"216,000",0,HSJ,Ļ,Ÿ,,,,,,,,, +Ѹ,2026-01-09,2026-01-15,1,60115705,WF-101,Ļ(ȸĴ),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,õ ڹ븮Ϲݻ Ե ,"212,000",,"212,000",0,HSJ,Ļ,Ÿ,,,,,,,,, +Ѹ,2026-01-09,2026-01-15,1,60115705,WF-101,Ļ(ȸĴ),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,-θ ,"153,000",,"153,000",0,HSJ,Ļ,Ÿ,,,,,,,,, +Ѹ,2026-01-09,2026-01-15,1,60115705,WF-101,Ļ(ȸĴ),HSJHSJ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,,ݱǿ(õ) ⺻ȹ ,"223,000",,"223,000",0,HSJ,Ļ,Ÿ,,,,,,,,, +Ѹ,2026-01-13,2026-01-15,1,60115305,MK-201,(),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,߼,,,ﺸ μ (ֻZʹȭ 301ȣ),"100,000",,"100,000",0," Ʒ,",Ļ,Ÿ,,,,,,,,, +Ѹ,2026-01-22,2026-01-23,1,60115305,MK-201,(),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,߼,,,Ӹ ,"100,000",,"100,000",0," Ʒ,",Ļ,Ÿ,,,,,,,,, +,2026-01-09,2026-01-09,1,20111539,LIA-102,(),X25056,ƮǼ߻ 10(Ѹ///Ƽ),ƮǼ(10),ƮǼ(10),,R&D,,, Ʈ,R&D,߼,,,ƮǼ10 ΰ ȯ,"469,000",,0,"469,000",ΰȯ() ϱ LIA-102ڵ ,,R&D,,,,,,,,, +,2026-01-09,2026-01-09,1,20111539,LIA-102,(),X25057, ߻ 1ٽɰ(), (1ٽ), ߻,,R&D,,, Ʈ,R&D,߼,,,1ٽ/ ΰ ȯ(10~12),"682,394",,0,"682,394",ΰȯ() ϱ LIA-102ڵ ,,R&D,,,,,,,,, +,2026-01-09,2026-01-09,1,20111539,LIA-102,(),X25058, ߻ 2ٽɰ(), (2ٽ), 2ٽ,,R&D,,, Ʈ,R&D,߼,,,2ٽ/ ΰ ȯ(10~12),"300,000",,0,"300,000",ΰȯ() ϱ LIA-102ڵ ,,R&D,,,,,,,,, +,2026-01-19,2026-01-19,1,20111539,LIA-102,(),X25056,ƮǼ߻ 10(Ѹ///Ƽ),ƮǼ(10),ƮǼ(10),,R&D,,, Ʈ,R&D,߼,,,ƮǼ10 ΰ ȯ,"42,454",,0,"42,454",ΰȯ() ϱ LIA-102ڵ ,,R&D,,,,,,,,, +,2026-01-19,2026-01-19,1,20111539,LIA-102,(),X25057, ߻ 1ٽɰ(), (1ٽ), ߻,,R&D,,, Ʈ,R&D,߼,,,1ٽ/ ΰ ȯ(10~12),"48,380",,0,"48,380",ΰȯ() ϱ LIA-102ڵ ,,R&D,,,,,,,,, +ٷ,2026-01-22,2026-01-29,1,50151301,OP-203,)Ҹǰ(繫ǰ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,A,SW ȫ ν Ŭ (100),"21,700",0,"21,700",0,,,Ϲ,,,,,,,,, +,2026-01-22,2026-01-22,1,20111539,LIA-102,(),X25056,ƮǼ߻ 10(Ѹ///Ƽ),ƮǼ(10),ƮǼ(10),,R&D,,, Ʈ,R&D,߼,,,ƮǼ10 ΰ ȯ,"6,364",,0,"6,364",ΰȯ() ϱ LIA-102ڵ ,,R&D,,,,,,,,, +,2026-01-22,2026-01-22,1,20111539,LIA-102,(),X25057, ߻ 1ٽɰ(), (1ٽ), ߻,,R&D,,, Ʈ,R&D,߼,,,1ٽ/ ΰ ȯ(10~12),"45,411",,0,"45,411",ΰȯ() ϱ LIA-102ڵ ,,R&D,,,,,,,,, +,2026-01-23,2026-01-23,1,20111539,LIA-102,(),X25057, ߻ 1ٽɰ(), (1ٽ), ߻,,R&D,,, Ʈ,R&D,߼,,,1ٽ/ ΰ ȯ(10~12),"3,545",,0,"3,545",ΰȯ() ϱ LIA-102ڵ ,,R&D,,,,,,,,, +ٷ,2026-01-23,2026-01-29,1,50153199,IT-301,)޼(Ÿ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ERPȹ,۴,eg-bim Ȩ ȣ ׷̵,"38,140",0,"38,140",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-23,2026-01-29,1,50153199,IT-301,)޼(Ÿ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ERPȹ,۴,egbim Ȩ Ʈ ʱȭ,"2,750",0,"2,750",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-26,2026-01-29,1,60115798,WF-106,Ļ(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (01/09),"6,000",0,"6,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-02,2026-01-02,1,50170199,OUT-102,)º(Ÿֺ),X25055,GIS ,GIS 񰳹,GIS ,ȹ/,ȹ&,,,ȹ/,ȹ,߼,,,SatPointer ϵ ,"8,000,000",0,"8,000,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-02,2026-01-02,1,10115301,AST-106,Լ,X25055,GIS ,GIS 񰳹,GIS ,ȹ/,ȹ&,,,ȹ/,ȹ,߼,,,SatPointer ϵ ,"800,000",0,"800,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-01-29,1,50152999,OP-204,)ź(Ÿ),X25030,GSIM,GSIM,GSIM,S/W,ַ,,,S/W ,ַ,߼,GSIM ,ȣ,LTE º ź û(12),"26,110",0,"26,110",0,,,Ϲ,,,,,,,,, +,2026-01-28,2026-01-28,1,60114739,IT-201,迬(Ҹǰ),X25024,HmEG(HmDraw),HmEG(HmDraw),HmEG(HmDraw),S/W,׷,,,S/W ,׷&ؼ,߼,,,"(USD4,500*1,426.20)-Ʈ ODA SDK ","6,417,900",,"6,417,900",0,X,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-02-05,2,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,(׷),(׷),(׷),ȹ/,,,,,,߼,Ͼ ȹ׷,纴ȫ,1 ,0,"160,000",0,0, ׷,,Ÿ,,,,,,,,, +ٷ,2026-01-28,2026-02-05,2,60115903,WF-201,(),ZZZZZZ,(׷),(׷),(׷),ȹ/,,,,,,߼,Ͼ ȹ׷,纴ȫ,1 ,"160,000",0,"160,000",0, ׷,,Ÿ,,,,,,,,, +ٷ,2026-01-28,2026-02-05,2,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,(׷),(׷),(׷),ȹ/,,,,,,߼,Ͼ ȹ׷,纴ȫ,ȸ Ĵ,0,"151,000",0,0, ׷,,Ÿ,,,,,,,,, +ٷ,2026-01-28,2026-02-05,2,60115705,WF-101,Ļ(ȸĴ),ZZZZZZ,(׷),(׷),(׷),ȹ/,,,,,,߼,Ͼ ȹ׷,纴ȫ,ȸ Ĵ,"151,000",0,"151,000",0, ׷,Ļ,Ÿ,,,,,,,,, +ٷ,2026-01-26,2026-02-05,2,60115903,WF-201,(),X25057, ߻ 1ٽɰ(), (1ٽ), ߻,,R&D,,, Ʈ,R&D,߼,,̵A,,"76,800",0,"76,800",0,,,R&D,,,,,,,,, +ٷ,2026-01-26,2026-02-05,2,20111103,LIA-101,ޱ(Ϲݹ),X25057, ߻ 1ٽɰ(), (1ٽ), ߻,,R&D,,, Ʈ,R&D,߼,Ϲݱ ,̵, - ̵,0,"76,800",0,0,,,R&D,,,,,,,,, +ٷ,2026-01-30,2026-02-06,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,߼,׷Ƚ ,μ,"AI LLM SubScription 12, 1",0,"625,388",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-30,2026-02-06,2,60116399,IT-301,޼(Ÿ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,߼,׷Ƚ ,μ,"AI LLM SubScription 12, 1","625,388",0,"625,388",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-02,2026-02-06,2,20111103,LIA-101,ޱ(Ϲݹ),X25008,WayPrimal,WayPrimal,WayPrimal,S/W,,,,S/W ,,,Infra Solution ,뼷,"WayDraw, WayPrimal Ʈ ȸ",0,"192,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-02,2026-02-06,2,60115705,WF-101,Ļ(ȸĴ),X25008,WayPrimal,WayPrimal,WayPrimal,S/W,,,,S/W ,,,Infra Solution ,뼷,"׾Ƹ WayDraw, WayPrimal Ʈ ȸ","192,000",0,"192,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-02,2026-02-06,2,20111103,LIA-101,ޱ(Ϲݹ),X25028,ý(PM),ý(PM),ý(PM),S/W,ַ,,,S/W ,ַ,߼,GSIM ,ȣ,Ʈ Ŭ 1 ݾ,0,"167,818",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-02,2026-02-06,2,50151399,OP-203,)Ҹǰ(Ÿ),X25028,ý(PM),ý(PM),ý(PM),S/W,ַ,,,S/W ,ַ,߼,GSIM ,ȣ,Ʈ Ŭ 1 ݾ,"167,818",0,"167,818",0,ڵ (50151309 ȮκҰ),,Ϲ,,,,,,,,, +ٷ,2026-01-29,2026-02-06,2,20111103,LIA-101,ޱ(Ϲݹ),X25027,StrAna,StrAna,StrAna,S/W,ؼ,,,S/W ,׷&ؼ,߼,Strana ,ȣ, ȸĺ,0,"150,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-29,2026-02-06,2,60115705,WF-101,Ļ(ȸĴ),X25027,StrAna,StrAna,StrAna,S/W,ؼ,,,S/W ,׷&ؼ,߼,Strana ,ȣ,Strana ȸĺ,"150,000",0,"150,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-04,2026-02-06,2,20111103,LIA-101,ޱ(Ϲݹ),X25012,WallZainer,WallZainer,WallZainer,S/W,,,,S/W ,,߼, S/W,,SW ȸĺ,0,"161,400",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-04,2026-02-06,2,60115705,WF-101,Ļ(ȸĴ),X25012,WallZainer,WallZainer,WallZainer,S/W,,,,S/W ,,߼, S/W,,SW ȸĺ,"161,400",0,"161,400",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25002,KNGIL,KNGIL,KNGIL,S/W,GIS,,,S/W , GIS,߼,õ,տ,ȸĺ,0,"161,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-12,2,60115705,WF-101,Ļ(ȸĴ),X25002,KNGIL,KNGIL,KNGIL,S/W,GIS,,,S/W , GIS,߼,õ,տ,輿 ȸĺ,"161,000",0,"161,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25009,WayConfirm,WayConfirm,WayConfirm,S/W,,,,S/W ,,߼, BIM2,̵ȣ, ȸĺ,0,"221,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-12,2,60115705,WF-101,Ļ(ȸĴ),X25009,WayConfirm,WayConfirm,WayConfirm,S/W,,ȹ,,S/W ,,߼, BIM2,̵ȣ,BIM2 ȸĺ,"221,000",0,"221,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-03,2026-02-12,2,60115903,WF-201,(),X25057, ߻ 1ٽɰ(), (1ٽ), ߻,,R&D,,, Ʈ,R&D,߼,,̵A,,"88,520",0,"88,520",0,,,R&D,,,,,,,,, +ٷ,2026-02-03,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25057, ߻ 1ٽɰ(), (1ٽ), ߻,,R&D,,, Ʈ,R&D,߼,Ϲݱ ,̵,,0,"88,520",0,0,,,R&D,,,,,,,,, +ٷ,2026-02-06,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,߼,,()Ǽ,Ǽν±ޱ,0,"200,000",0,0,ðBIM Ʒ,,Ÿ,,,,,,,,, +ٷ,2026-02-06,2026-02-12,2,50153301,WF-301,)Ʒú,ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,߼,,()Ǽ,Ǽν±ޱ,"200,000",0,"200,000",0,ðBIM Ʒ,,Ÿ,,,,,,,,, +ٷ,2026-02-06,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),Y26018,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼, BIM1,Ȳ,μ ö о ȸ Ļ,0,"119,000",0,0,() ,,Ÿ,,,,,,,,, +ٷ,2026-02-06,2026-02-12,2,60115705,WF-101,Ļ(ȸĴ),Y26018,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼, BIM1,Ȳ,μ ö о ȸ Ļ,"119,000",0,"119,000",0,() ,Ļ,Ÿ,,,,,,,,, +ٷ,2026-02-06,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),Y26018,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼, BIM1,Ȳ,μ ȸ Ĵ,0,"35,500",0,0,() ,,Ÿ,,,,,,,,, +ٷ,2026-02-06,2026-02-12,2,60115705,WF-101,Ļ(ȸĴ),Y26018,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼, BIM1,Ȳ,μ ȸ Ĵ,"35,500",0,"35,500",0,() ,Ļ,Ÿ,,,,,,,,, +ٷ,2026-02-06,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25008,WayPrimal,WayPrimal,WayPrimal,S/W,,,,S/W ,,߼, BIM1,Ȳ,BIM 1 Way ȸ,0,"241,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-06,2026-02-12,2,60115705,WF-101,Ļ(ȸĴ),X25008,WayPrimal,WayPrimal,WayPrimal,S/W,,ȹ,,S/W ,,߼, BIM1,Ȳ,BIM 1 Way ȸ,"241,000",0,"241,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-12,2,60115903,WF-201,(),Z25059,~ܰȯ ӵ(1),ܰȯ(1),~ܰȯ ӵ(1),,BIM,,, Ʈ,BIM ,߼,ͳ,ȭ,,"33,200",0,"33,200",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),Z25059,~ܰȯ ӵ(1),ܰȯ(1),~ܰȯ ӵ(1),,BIM,,, Ʈ,BIM ,߼,ͳ,ȭ,,0,"33,200",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-03,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25046,,,,ȹ/, S/W,,,S/W ,S/W,߼,Web Solution,̺, Ĵ,0,"8,500",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-03,2026-02-12,2,50152507,WF-101,)Ļ(ȸĴ),X25046,,,,ȹ/, S/W,,,S/W ,S/W,߼,Web Solution,̺, ü ,"8,500",0,"8,500",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-09,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,߼,,()Ǽ,Ǽʱ,0,"200,000",0,0,ðBIM Ʒ,,Ÿ,,,,,,,,, +ٷ,2026-02-09,2026-02-12,2,50153301,WF-301,)Ʒú,ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,߼,,()Ǽ,Ǽʱ,"200,000",0,"200,000",0,ðBIM Ʒ,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25056,ƮǼ߻ 10(Ѹ///Ƽ),ƮǼ(10),ƮǼ(10),,R&D,,, Ʈ,R&D,߼,ƮǼ,,ƮǼ ȸ,0,"505,000",0,0,,,R&D,,,,,,,,, +ٷ,2026-02-10,2026-02-12,2,60115705,WF-101,Ļ(ȸĴ),X25056,ƮǼ߻ 10(Ѹ///Ƽ),ƮǼ(10),ƮǼ(10),,R&D,,, Ʈ,R&D,߼,ƮǼ,,ƮǼ ȸ,"505,000",0,"505,000",0,,Ļ,R&D,,,,,,,,, +ٷ,2026-02-10,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25056,ƮǼ߻ 10(Ѹ///Ƽ),ƮǼ(10),ƮǼ(10),,R&D,,, Ʈ,R&D,߼,ƮǼ,,10 ȸ ɽĴ,0,"113,000",0,0,,,R&D,,,,,,,,, +ٷ,2026-02-10,2026-02-12,2,60115705,WF-101,Ļ(ȸĴ),X25056,ƮǼ߻ 10(Ѹ///Ƽ),ƮǼ(10),ƮǼ(10),,R&D,,, Ʈ,R&D,߼,ƮǼ,,10 ȸ ɽĴ,"113,000",0,"113,000",0,,Ļ,R&D,,,,,,,,, +ٷ,2026-02-11,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25008,WayPrimal,WayPrimal,WayPrimal,S/W,,,,S/W ,,߼, BIM2,ǥ, ȸĺ,0,"190,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-12,2,60115705,WF-101,Ļ(ȸĴ),X25008,WayPrimal,WayPrimal,WayPrimal,S/W,,ȹ,,S/W ,,߼, BIM2,ǥ,BIM2 ȸĺ,"190,000",0,"190,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25025,EG-BIM Modeler,EG-BIM Modeler,EG-BIM Modeler,S/W,׷,,,S/W ,׷&ؼ,߼,׷Ƚ ,μ, ȸĺ,0,"100,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-12,2,60115705,WF-101,Ļ(ȸĴ),X25025,EG-BIM Modeler,EG-BIM Modeler,EG-BIM Modeler,S/W,׷,,,S/W ,׷&ؼ,߼,׷Ƚ ,μ,׷Ƚ ȸĺ,"100,000",0,"100,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-10,2026-02-12,2,60115903,WF-201,(),Y26018,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,,̵A,,"172,710",0,"172,710",0,ȹ μ(-),,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),Y26018,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,Ϲݱ ,̵, - ̵,0,"172,710",0,0,ȹ μ(-),,Ÿ,,,,,,,,, +ٷ,2026-02-03,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25058, ߻ 2ٽɰ(), (2ٽ), 2ٽ,,R&D,,, Ʈ,R&D,߼,Ͼ ߱׷,輮,𷦽 ,0,"61,800",0,0,,,R&D,,,,,,,,, +ٷ,2026-02-03,2026-02-12,2,50152507,WF-101,)Ļ(ȸĴ),X25058, ߻ 2ٽɰ(), (2ٽ), 2ٽ,,R&D,,, Ʈ,R&D,߼,Ͼ ߱׷,輮,𷦽 Ĵ,"61,800",0,"61,800",0,,Ļ,R&D,,,,,,,,, +ٷ,2026-02-13,2026-02-13,2,20111103,LIA-101,ޱ(Ϲݹ),X25028,ý(PM),ý(PM),ý(PM),S/W,ַ,,,S/W ,ַ,߼,GSIM ,ȣ, ȸĺ,0,"347,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-13,2026-02-13,2,60115705,WF-101,Ļ(ȸĴ),X25028,ý(PM),ý(PM),ý(PM),S/W,ַ,,,S/W ,ַ,߼,GSIM ,ȣ,GSIM ȸĺ,"347,000",0,"347,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-13,2,60115903,WF-201,(),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,߼,Ϻα,â,,"146,828",0,"146,828",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-13,2,20111103,LIA-101,ޱ(Ϲݹ),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,߼,Ϻα,â, - â,0,"146,828",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-20,2,60116399,IT-301,޼(Ÿ),X25046,,,,ȹ/, S/W,,,S/W ,S/W,߼,,¾ ֽȸ, ȭ 01 ,"361,900",0,"361,900",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-20,2,10115301,AST-106,Լ,X25046,,,,ȹ/, S/W,,,S/W ,S/W,߼,,¾ ֽȸ,"361,900*10%","36,190",0,"36,190",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-20,2,20110101,LIA-101,ܻԱ,X25046,,,,ȹ/, S/W,,,S/W ,S/W,߼,,¾ ֽȸ, ȭ 01 ,0,"398,090",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-19,2026-02-20,2,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,߼,,()Ǽ,Ǽν±ޱ,0,"200,000",0,0,ðBIM Ʒ,,Ÿ,,,,,,,,, +ٷ,2026-02-19,2026-02-20,2,50153301,WF-301,)Ʒú,ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,߼,,()Ǽ,Ǽν±ޱ,"200,000",0,"200,000",0,ðBIM Ʒ,,Ÿ,,,,,,,,, +ٷ,2026-02-13,2026-02-20,2,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,AbutZainer,AbutZainer,AbutZainer,S/W,,,,S/W ,,߼,Ϻα,ȣ,ȸĺ ø,0,"141,000",0,0, AbutZainer,,Ϲ,,,,,,,,, +ٷ,2026-02-13,2026-02-20,2,60115705,WF-101,Ļ(ȸĴ),ZZZZZZ,AbutZainer,AbutZainer,AbutZainer,S/W,,ȹ,,S/W ,,߼,Ϻα,ȣ,Ĵ Ϻα ȸĺ,"141,000",0,"141,000",0, AbutZainer,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-20,2,60115903,WF-201,(),Y26018,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼, BIM1,,,"147,490",0,"147,490",0,,,Ÿ,,,,,,,,, +ٷ,2026-02-12,2026-02-20,2,20111103,LIA-101,ޱ(Ϲݹ),Y26018,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼, BIM1,, - ,0,"147,490",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-13,2026-02-20,2,20111103,LIA-101,ޱ(Ϲݹ),X25027,StrAna,StrAna,StrAna,S/W,ؼ,,,S/W ,׷&ؼ,߼,Strana ,ȣ, ȸĺ,0,"132,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-13,2026-02-20,2,60115705,WF-101,Ļ(ȸĴ),X25027,StrAna,StrAna,StrAna,S/W,ؼ,,,S/W ,׷&ؼ,߼,Strana ,ȣ,Strana ȸĺ,"132,000",0,"132,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-13,2026-02-20,2,20111103,LIA-101,ޱ(Ϲݹ),Y26018,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,,Ŭ ڸ ȸ,μ Կ ϵ ,0,"59,500",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-13,2026-02-20,2,60114398,OP-203,Ҹǰ(Ÿ),Y26018,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,,Ŭ ڸ ȸ,μ Կ ϵ ,"59,500",0,"59,500",0,,,Ÿ,,,,,,,,, +ٷ,2026-02-24,2026-02-25,2,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,濵,,̿,ǰ û,0,"266,700",0,0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2026-02-24,2026-02-25,2,60115798,WF-106,Ļ(),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,濵,,̿,ǰ û,"266,700",0,"266,700",0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2026-02-24,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X25033,WatchBIM,WatchBIM,WatchBIM,S/W,,,,S/W ,ַ,߼,Infra Solution ,, ȸĺ,0,"112,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-24,2026-02-27,2,60115705,WF-101,Ļ(ȸĴ),X25033,WatchBIM,WatchBIM,WatchBIM,S/W,,,,S/W ,ַ,߼,Infra Solution ,, ȸĺ,"112,000",0,"112,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X25025,EG-BIM Modeler,EG-BIM Modeler,EG-BIM Modeler,S/W,׷,,,S/W ,׷&ؼ,߼,׷Ƚ ,, ȸĺ,0,"164,500",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,60115705,WF-101,Ļ(ȸĴ),X25025,EG-BIM Modeler,EG-BIM Modeler,EG-BIM Modeler,S/W,׷,,,S/W ,׷&ؼ,߼,׷Ƚ ,,׷Ƚ Modeler ȸĺ,"164,500",0,"164,500",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2025-12-15,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),Y26017,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,Ͼ ߱׷,輮, н ,0,"26,500",0,0,+μ ջ û ٹ(1/30) μ û,,Ÿ,,,,,,,,, +ٷ,2025-12-15,2026-02-27,2,60115903,WF-201,(),Y26017,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,Ͼ ߱׷,輮, н ,"26,500",0,"26,500",0,+μ ջ û ٹ(1/30) μ û,,Ÿ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),Y26017,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,Ͼ ߱׷,輮,ö Կ Ĵ ,0,"176,000",0,0, () ,,Ÿ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,50152507,WF-101,)Ļ(ȸĴ),Y26017,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,Ͼ ߱׷,輮,ö Կ Ĵ,"2,000",0,"2,000",0, () ,Ļ,Ÿ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,50152507,WF-101,)Ļ(ȸĴ),Y26017,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,Ͼ ߱׷,輮,ö Կ Ĵ,"81,000",0,"81,000",0, () ,Ļ,Ÿ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,50152507,WF-101,)Ļ(ȸĴ),Y26017,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,Ͼ ߱׷,輮,ö Կ Ĵ,"24,000",0,"24,000",0, () ,Ļ,Ÿ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,50152507,WF-101,)Ļ(ȸĴ),Y26017,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,Ͼ ߱׷,輮,ö Կ Ĵ,"69,000",0,"69,000",0, () ,Ļ,Ÿ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X25058, ߻ 2ٽɰ(), (2ٽ), 2ٽ,,R&D,,, Ʈ,R&D,߼,Ͼ ߱׷,輮, 2ٽ ,0,"120,330",0,0,,,R&D,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,60115903,WF-201,(),X25058, ߻ 2ٽɰ(), (2ٽ), 2ٽ,,R&D,,, Ʈ,R&D,߼,Ͼ ߱׷,輮, 2ٽ ,"120,330",0,"120,330",0,,,R&D,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X25058, ߻ 2ٽɰ(), (2ٽ), 2ٽ,,R&D,,, Ʈ,R&D,߼,Ͼ ߱׷,輮, Ĵ ,0,"36,800",0,0,,,R&D,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,50152507,WF-101,)Ļ(ȸĴ),X25058, ߻ 2ٽɰ(), (2ٽ), 2ٽ,,R&D,,, Ʈ,R&D,߼,Ͼ ߱׷,輮, Ĵ,"10,000",0,"10,000",0,,Ļ,R&D,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,50152507,WF-101,)Ļ(ȸĴ),X25058, ߻ 2ٽɰ(), (2ٽ), 2ٽ,,R&D,,, Ʈ,R&D,߼,Ͼ ߱׷,輮, ,"17,500",0,"17,500",0,,Ļ,R&D,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,50152507,WF-101,)Ļ(ȸĴ),X25058, ߻ 2ٽɰ(), (2ٽ), 2ٽ,,R&D,,, Ʈ,R&D,߼,Ͼ ߱׷,輮, ,"9,300",0,"9,300",0,,Ļ,R&D,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X25046,,,,ȹ/, S/W,,,S/W ,S/W,߼,Web Solution,ȣ, ű ü ,0,"7,200",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,50152507,WF-101,)Ļ(ȸĴ),X25046,,,,ȹ/, S/W,,,S/W ,S/W,߼,Web Solution,ȣ, ű ü ,"7,200",0,"7,200",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X25012,WallZainer,WallZainer,WallZainer,S/W,,,,S/W ,,߼, S/W,輼,AI LLM (ʰ API) 259 ~ 261 ,0,"522,590",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,60116399,IT-301,޼(Ÿ),X25012,WallZainer,WallZainer,WallZainer,S/W,,,,S/W ,,߼, S/W,輼,AI LLM (ʰ API) 259 ~ 261 ,"522,590",0,"522,590",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-27,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X25029,bCMf,bCMf,bCMf,S/W,ַ,,,S/W ,ַ,߼,Web Solution,, BCMFÿغ Ļ,0,"179,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-27,2026-02-27,2,60115705,WF-101,Ļ(ȸĴ),X25029,bCMf,bCMf,bCMf,S/W,ַ,,,S/W ,ַ,߼,Web Solution,, BCMFÿغ Ļ,"179,000",0,"179,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-02,2026-02-02,2,20110101,LIA-101,ܻԱ,X25051,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,()ý,(GNSS) CHCNAV i85 ,0,"5,500,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-02,2026-02-02,2,50151399,OP-203,)Ҹǰ(Ÿ),X25051,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,()ý,(GNSS) CHCNAV i85 ,"5,000,000",0,"5,000,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-02,2026-02-02,2,10115301,AST-106,Լ,X25051,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,()ý,(GNSS) CHCNAV i85 ,"500,000",0,"500,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-04,2026-02-04,2,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,뿪,ȫ (&ٷкν),0,"426,930",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-04,2026-02-04,2,60116399,IT-301,޼(Ÿ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,뿪,ȫ (&ٷкν),"388,119",0,"388,119",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-04,2026-02-04,2,10115301,AST-106,Լ,X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,뿪,"Լ(388,119*0.1)","38,811",0,"38,811",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-29,2026-02-05,2,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,Ѱȹ,,ѽ¹,"1 Ѹ 󱸵ȣȸ (2ȸ, 1/14, 28) / 2ȸ ",0,"320,000",0,0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2026-01-29,2026-02-05,2,60115798,WF-106,Ļ(),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,Ѱȹ,,ѽ¹,"1 Ѹ 󱸵ȣȸ (2ȸ, 1/14, 28) / 2ȸ ","320,000",0,"320,000",0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2026-01-29,2026-02-05,2,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,ӹΰ,ܺȸ ,0,"35,100",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-29,2026-02-05,2,60115705,WF-101,Ļ(ȸĴ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,ӹΰ,ܺȸ ,"35,100",0,"35,100",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-01-29,2026-02-05,2,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,ӹΰ,ܺνĻ (Ǽȸ),0,"37,500",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-29,2026-02-05,2,60115705,WF-101,Ļ(ȸĴ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,ӹΰ,ܺνĻ (Ǽȸ),"37,500",0,"37,500",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-01-21,2026-02-06,2,60115903,WF-201,(),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,ӹΰ,,"8,000",0,"8,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-21,2026-02-06,2,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,ӹΰ, - ӹΰ,0,"8,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-03,2026-02-06,2,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,() ڵ û,0,"19,500",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-03,2026-02-06,2,60115903,WF-201,(),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,() ڵ û,"19,500",0,"19,500",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-02-06,2,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"30,960",0,"30,960",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-28,2026-02-06,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"30,960",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-29,2026-02-06,2,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"113,850",0,"113,850",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-29,2026-02-06,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,, - ,0,"30,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-29,2026-02-06,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"83,850",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-30,2026-02-06,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (01/29),0,"65,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-30,2026-02-06,2,60115798,WF-106,Ļ(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (01/29),"65,000",0,"65,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-16,2026-02-06,2,60115903,WF-201,(),X26006,/,/,/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,ӹΰ,,"8,000",0,"8,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-16,2026-02-06,2,20111103,LIA-101,ޱ(Ϲݹ),X26006,/,/,/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,ӹΰ, - ӹΰ,0,"8,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-30,2026-02-06,2,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,ַ,A,1 Ѱȹ ǰ ٰ (߰),0,"58,128",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-30,2026-02-06,2,60115798,WF-106,Ļ(),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,ַ,A,1 Ѱȹ ǰ ٰ (߰),"58,128",0,"58,128",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-06,2,20111103,LIA-101,ޱ(Ϲݹ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ΰǰ,26 1 4뺸 (ü),0,"62,685,600",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-06,2,50152527,HR-204,)Ļ(纸),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ٷκ,26 1 4뺸(纸/ȸδ),"3,083,300",0,"3,083,300",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-06,2,50152521,HR-202,)Ļ(ǰ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ΰǰ,26 1 4뺸(ǰ/ȸδ),"12,661,000",0,"12,661,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-06,2,20111505,HR-202,(ǰ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ΰǰ,26 1 4뺸(ǰ/δ),"12,661,000",0,"12,661,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-06,2,50152521,HR-202,)Ļ(ǰ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ΰǰ,26 1 4뺸(纸/ȸδ),"1,663,310",0,"1,663,310",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-06,2,20111505,HR-202,(ǰ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ΰǰ,26 1 4뺸(纸),"1,663,310",0,"1,663,310",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-06,2,50151719,HR-201,)ݰ(ο),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,οݰ,26 1 4뺸(ο/ȸδ),"12,096,220",0,"12,096,220",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-06,2,20111507,HR-201,(ο),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,οݰ,26 1 4뺸(ο/δ),"12,096,220",0,"12,096,220",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-06,2,50152529,HR-203,)Ļ(뺸),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ٷκ,26 1 4뺸(뺸/ȸδ),"3,808,750",0,"3,808,750",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-06,2,20111509,HR-203,(뺸()),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ٷκ,26 1 4뺸(뺸/δ),"2,952,490",0,"2,952,490",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-04,2026-02-06,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,A,SW ġ USB (16GB*10),0,"79,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-04,2026-02-06,2,60114301,OP-203,Ҹǰ(繫ǰ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,A,SW ġ USB (16GB*10),"79,000",0,"79,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-02,2026-02-09,2,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,ֿϱ,ӿ ̺ ġ ΰ ǰ ,0,"142,290",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-02,2026-02-09,2,60114305,IT-201,Ҹǰ(ǰ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,ֿϱ,̴PC ,"16,500",0,"16,500",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-02,2026-02-09,2,60114305,IT-201,Ҹǰ(ǰ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,ֿϱ,Ƽ ,"16,790",0,"16,790",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-02,2026-02-09,2,60114305,IT-201,Ҹǰ(ǰ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,ֿϱ, 콺 (),"109,000",0,"109,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-10,2,10111101,REV-101,뿪̼(꼭),Y25039,濵 (),,,,,,,,,Ѱȹ,,,濵ױ(),0,"28,270,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-11,2026-02-10,2,10110501,AST-101,뿹,Y25039,濵 (),,,,,,,,,Ѱȹ,,(ְŷ),濵ױ(),"28,270,000",0,0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-10,2,10111101,REV-101,뿪̼(꼭),Y26009,2026 濵 (),,,,,,,,,Ѱȹ,,,2026濵ױ(),0,"18,241,300",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-10,2,10110501,AST-101,뿹,Y26009,2026 濵 (),,,,,,,,,Ѱȹ,,(ְŷ),2026濵ױ(),"18,241,300",0,0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-10,2,10111101,REV-101,뿪̼(꼭),Y26010,2026 濵 (Ƽ),,,,,,,,,Ѱȹ,,Ƽ,2026濵ױ(Ƽ),0,"23,760,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-10,2,10110501,AST-101,뿹,Y26010,2026 濵 (Ƽ),,,,,,,,,Ѱȹ,,(ְŷ),2026濵ױ(Ƽ),"23,760,000",0,0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-15,2026-02-10,2,10111101,REV-101,뿪̼(꼭),Y26014,Ѱ Ѵ Ǽ뿪(2)(30%)-μ/,Ѱ (2),Ѱ (2),,,,,ٷа, ,߼,,()쿣Ͼ,Ѱ簨ѴǼ뿪(2)(30%)-μ/,"1,815,000",0,0,"1,815,000",,,Ÿ,,,,,,,,, +ٷ,2026-01-15,2026-02-10,2,40110501,REV-101,߼,Y26014,Ѱ Ѵ Ǽ뿪(2)(30%)-μ/,Ѱ (2),Ѱ (2),,,,,ٷа, ,߼,,()쿣Ͼ,Ѱ簨ѴǼ뿪(2)(30%)-μ/,0,"1,650,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-15,2026-02-10,2,20112901,LIA-101,⼼,Y26014,Ѱ Ѵ Ǽ뿪(2)(30%)-μ/,Ѱ (2),Ѱ (2),,,,,ٷа, ,߼,,()쿣Ͼ,"1,650,000*10%",0,"165,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-10,2,10111101,REV-101,뿪̼(꼭),Y26009,2026 濵 (),,,,,,,,,Ѱȹ,,,2026濵ױ(),"18,241,300",0,0,"18,241,300",,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-10,2,40110401,REV-101,뿪,Y26009,2026 濵 (),,,,,,,,,Ѱȹ,,,2026濵ױ(),0,"16,583,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-10,2,20112901,LIA-101,⼼,Y26009,2026 濵 (),,,,,,,,,Ѱȹ,,,"16,583,000*10%",0,"1,658,300",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-10,2,10111101,REV-101,뿪̼(꼭),Y26010,2026 濵 (Ƽ),,,,,,,,,Ѱȹ,,Ƽ,2026濵ױ(Ƽ),"23,760,000",0,0,"23,760,000",,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-10,2,40110401,REV-101,뿪,Y26010,2026 濵 (Ƽ),,,,,,,,,Ѱȹ,,Ƽ,2026濵ױ(Ƽ),0,"21,600,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-10,2,20112901,LIA-101,⼼,Y26010,2026 濵 (Ƽ),,,,,,,,,Ѱȹ,,Ƽ,"21,600,000*10%",0,"2,160,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-13,2026-02-10,2,10111101,REV-101,뿪̼(꼭),Y26009,2026 濵 (),,,,,,,,,Ѱȹ,,,2026濵ױ(),"18,241,300",0,0,"18,241,300",,,Ÿ,,,,,,,,, +ٷ,2026-01-13,2026-02-10,2,40110401,REV-101,뿪,Y26009,2026 濵 (),,,,,,,,,Ѱȹ,,,2026濵ױ(),0,"16,583,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-01-13,2026-02-10,2,20112901,LIA-101,⼼,Y26009,2026 濵 (),,,,,,,,,Ѱȹ,,,"16,583,000*10%",0,"1,658,300",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-10,2,10111101,REV-101,뿪̼(꼭),Y26014,Ѱ Ѵ Ǽ뿪(2)(30%)-μ/,Ѱ (2),Ѱ (2),,,,,ٷа, ,߼,,()쿣Ͼ,Ѱ簨ѴǼ뿪(2)(30%)-μ/,0,"1,815,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-10,2,10110501,AST-101,뿹,Y26014,Ѱ Ѵ Ǽ뿪(2)(30%)-μ/,Ѱ (2),Ѱ (2),,,,,ٷа, ,߼,,(ְŷ),Ѱ簨ѴǼ뿪(2)(30%)-μ/,"1,815,000",0,0,0,,,Ÿ,,,,,,,,, +ٷ,2025-07-10,2026-02-11,2,10111101,REV-101,뿪̼(꼭),Y25039,濵 (),,,,,,,,,Ѱȹ,,,濵ױ(),"28,270,000",0,0,"28,270,000",,,Ÿ,,,,,,,,, +ٷ,2025-07-10,2026-02-11,2,40110401,REV-101,뿪,Y25039,濵 (),,,,,,,,,Ѱȹ,,,濵ױ(),0,"25,700,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2025-07-10,2026-02-11,2,20112901,LIA-101,⼼,Y25039,濵 (),,,,,,,,,Ѱȹ,,,"25,700,000*10%",0,"2,570,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-03,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,Ѱȹ,ȹ,ȣ, (ȣ ӿ ڳ ),0,"300,000",0,0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2026-02-03,2026-02-12,2,50152511,WF-106,)Ļ(),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,Ѱȹ,ȹ,ȣ, (ȣ ӿ ڳ ),"300,000",0,"300,000",0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2026-02-05,2026-02-12,2,20111109,LIA-101,ޱ(ϳī),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,,ϳī(6669),SW ġ USB 뷮 (4GB*100),0,"392,810",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-12,2,50151301,OP-203,)Ҹǰ(繫ǰ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,A,SW ġ USB 뷮 (4GB*100),"392,810",0,"392,810",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-04,2026-02-12,2,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"67,020",0,"67,020",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-04,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"67,020",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-10,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,̽繫,ٷ 漼 Ÿ ,0,"67,240",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-10,2026-02-12,2,60116399,IT-301,޼(Ÿ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,̽繫,ٷ 漼 Ÿ ,"67,240",0,"67,240",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-09,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,Ѱ,ȫ ,0,"1,232,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-09,2026-02-12,2,60114599,WF-105,μ(Ÿ),X25006,GAIA,GAIA,GAIA,S/W,GIS,,,S/W , GIS,Ѱȹ,,Ѱ,GAIA (ȫ ),"210,000",0,"210,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-09,2026-02-12,2,10115301,AST-106,Լ,X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,Ѱ,"Լ (210,000*0.1)","21,000",0,"21,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-09,2026-02-12,2,60114599,WF-105,μ(Ÿ),Y25013,iPipe α׷ (CAD),iPipe α׷ (CAD),iPipe α׷ (CAD),S/W,/,,,S/W ,/,Ѱȹ,,Ѱ,iPipeS (ȫ ),"210,000",0,"210,000",0,,,Ÿ,,,,,,,,, +ٷ,2026-02-09,2026-02-12,2,10115301,AST-106,Լ,X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,Ѱ,"Լ (210,000*0.1)","21,000",0,"21,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-09,2026-02-12,2,60114599,WF-105,μ(Ÿ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,Ѱ,Ʈ (ȫ ),"70,000",0,"70,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-09,2026-02-12,2,10115301,AST-106,Լ,X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,Ѱ,"Լ (70,000*0.1)","7,000",0,"7,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-09,2026-02-12,2,60114599,WF-105,μ(Ÿ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,,Ѱ,EG-BIM (ȫ ),"210,000",0,"210,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-09,2026-02-12,2,10115301,AST-106,Լ,X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,Ѱ,"Լ (210,000*0.1)","21,000",0,"21,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-09,2026-02-12,2,60114599,WF-105,μ(Ÿ),X25002,KNGIL,KNGIL,KNGIL,S/W,GIS,,,S/W , GIS,Ѱȹ,,Ѱ,KNGIL (ȫ ),"210,000",0,"210,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-09,2026-02-12,2,10115301,AST-106,Լ,X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,Ѱ,"Լ (210,000*0.1)","21,000",0,"21,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-09,2026-02-12,2,60114599,WF-105,μ(Ÿ),X25020,TOVA,TOVA,TOVA,S/W,,,,S/W ,,Ѱȹ,,Ѱ,TOVQ (ȫ ),"210,000",0,"210,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-09,2026-02-12,2,10115301,AST-106,Լ,X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,Ѱ,"Լ (210,000*0.1)","21,000",0,"21,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-09,2026-02-12,2,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"58,020",0,"58,020",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-09,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"58,020",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-12,2,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"189,900",0,"189,900",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,0,"189,900",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-06,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (02/04),0,"10,300",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-06,2026-02-12,2,60115798,WF-106,Ļ(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (02/04),"10,300",0,"10,300",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-10,2026-02-12,2,20110101,LIA-101,ܻԱ,Y26018,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,,(),μ -籸 ǽü о(),0,"26,950,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-12,2,50170199,OUT-102,)º(Ÿֺ),Y26018,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,,(),μ -籸 ǽü о(),"24,500,000",0,"24,500,000",0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-12,2,10115301,AST-106,Լ,Y26018,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,,(),μ -籸 ǽü о(),"2,450,000",0,"2,450,000",0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-12,2,20110101,LIA-101,ܻԱ,Y26017,μ 뷮-ñ ۾ ̵ Ȯ ǽü뿪,μ (뷮-) ,μ 뷮-ñ ۾ ̵ Ȯ ǽü뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,,ҵ ֽȸ,μ 뷮~籸 ۾ ̵ Ȯ ǽü뿪(),0,"25,575,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-12,2,50170199,OUT-102,)º(Ÿֺ),Y26017,μ 뷮-ñ ۾ ̵ Ȯ ǽü뿪,μ (뷮-) ,μ 뷮-ñ ۾ ̵ Ȯ ǽü뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,,ҵ ֽȸ,μ 뷮~籸 ۾ ̵ Ȯ ǽü뿪(),"23,250,000",0,"23,250,000",0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-12,2,10115301,AST-106,Լ,Y26017,μ 뷮-ñ ۾ ̵ Ȯ ǽü뿪,μ (뷮-) ,μ 뷮-ñ ۾ ̵ Ȯ ǽü뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,,ҵ ֽȸ,μ 뷮~籸 ۾ ̵ Ȯ ǽü뿪(),"2,325,000",0,"2,325,000",0,,,Ÿ,,,,,,,,, +ٷ,2026-02-03,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (01/30),0,"24,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-03,2026-02-12,2,60115798,WF-106,Ļ(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (01/30),"24,000",0,"24,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-10,2026-02-12,2,20110101,LIA-101,ܻԱ,Y26018,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,,ҵ ֽȸ,μ ~籸 ۾ ̵ Ȯ ǽü뿪(),0,"9,762,500",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-12,2,50170199,OUT-102,)º(Ÿֺ),Y26018,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,,ҵ ֽȸ,μ ~籸 ۾ ̵ Ȯ ǽü뿪(),"8,875,000",0,"8,875,000",0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-12,2,10115301,AST-106,Լ,Y26018,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,߼,,ҵ ֽȸ,μ ~籸 ۾ ̵ Ȯ ǽü뿪(),"887,500",0,"887,500",0,,,Ÿ,,,,,,,,, +ٷ,2026-02-06,2026-02-12,2,60115903,WF-201,(),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,ֱ,,"79,760",0,"79,760",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-06,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,ֱ, - ֱ,0,"79,760",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,,ٷ ε ߱ ,0,"10,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-12,2,60116399,IT-301,޼(Ÿ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,,ٷ ε ߱ ,"10,000",0,"10,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-30,2026-02-12,2,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"48,640",0,"48,640",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-30,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"48,640",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-12,2,20110101,LIA-101,ܻԱ,X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,SKε(),ٷ ȭ ź 26 02,0,"3,300",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-12,2,60116199,OP-204,ź(Ÿ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,SKε(),ٷ ȭ ź 26 02,"3,000",0,"3,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-12,2,10115301,AST-106,Լ,X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,SKε(),ް*10%,300,0,300,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,̽繫,ٷ (),0,"253,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-12,2,60116399,IT-301,޼(Ÿ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,̽繫,ٷ (),"230,000",0,"230,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-12,2,10115301,AST-106,Լ,X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,̽繫,"Լ(230,000*0.1)","23,000",0,"23,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-12,2,20111105,LIA-101,ޱ(KBī),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ī(3866), 濵 ȸ Ļ,0,"338,000",0,0, λ米,,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-12,2,60115705,WF-101,Ļ(ȸĴ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,ֱ, 濵 ȸ Ļ,"338,000",0,"338,000",0, λ米,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,ַ,, ̿(1),0,"99,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-12,2,60116399,IT-301,޼(Ÿ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,ַ,, ̿(1),"99,000",0,"99,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25051,ȹ,ȹ,ȹ,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,ȹ,,"ȹ AIȹ AI(chatGPT, NotebookLM)",0,"61,400",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-12,2,60114398,OP-203,Ҹǰ(Ÿ),X25051,ȹ,ȹ,ȹ,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,ȹ,,"ȹ AIȹ AI(chatGPT, NotebookLM)","61,400",0,"61,400",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25051,ȹ,ȹ,ȹ,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,ȹ,,ȹ ȸĺ(ȣ ް),0,"200,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-12,2,60115705,WF-101,Ļ(ȸĴ),X25051,ȹ,ȹ,ȹ,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,ȹ,,ȹ ȸĺ(ȣ ް),"200,000",0,"200,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,, (02/11) & ܱ Ʈī,0,"40,430",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-12,2,60115798,WF-106,Ļ(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,, (02/11) & ܱ Ʈī,"40,430",0,"40,430",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-31,2026-02-12,2,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"87,460",0,"87,460",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-31,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"87,460",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-12,2,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,ַ,A,() ν ù߼ ,0,"12,100",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-05,2026-02-12,2,50153199,IT-301,)޼(Ÿ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,ַ,A,() ν ù߼ ,"12,100",0,"12,100",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-13,2,20110101,LIA-101,ܻԱ,Y25019,ӱ 32ȣ ~ûּ ~ġ Ǽ(2) ƮȲ ,~ġ(2),ӱ 32ȣ ~ûּ ~ġ Ǽ(2),,뿪,,,ٷа,뿪,Ѱȹ,,SKε(),-ƻ Ǽ BIG ROOM VPN 26 02 ,0,"94,600",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-13,2,60116199,OP-204,ź(Ÿ),Y25019,ӱ 32ȣ ~ûּ ~ġ Ǽ(2) ƮȲ ,~ġ(2),ӱ 32ȣ ~ûּ ~ġ Ǽ(2),,뿪,,,ٷа,뿪,Ѱȹ,,SKε(),-ƻ Ǽ BIG ROOM VPN 26 02 ,"86,000",0,"86,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-13,2,10115301,AST-106,Լ,Y25019,ӱ 32ȣ ~ûּ ~ġ Ǽ(2) ƮȲ ,~ġ(2),ӱ 32ȣ ~ûּ ~ġ Ǽ(2),,뿪,,,ٷа,뿪,Ѱȹ,,SKε(),-ƻ Ǽ BIG ROOM VPN 26 02 ,"8,600",0,"8,600",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-13,2,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,ֱ,ܺ ,0,"179,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-13,2,60114398,OP-203,Ҹǰ(Ÿ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,ֱ,ܺ ,"100,000",0,"100,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-13,2,60114398,OP-203,Ҹǰ(Ÿ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,ֱ,ܺ ,"79,000",0,"79,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-13,2,20111103,LIA-101,ޱ(Ϲݹ),X25035,Domainer,Domainer,Domainer,S/W,ַ,,,S/W ,ַ,Ѱȹ,,, Ĵ,0,"112,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-13,2,60115705,WF-101,Ļ(ȸĴ),X25035,Domainer,Domainer,Domainer,S/W,ַ,ȹ,,S/W ,ַ,Ѱȹ,,, ȹȸ Ļ,"112,000",0,"112,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-13,2,20110101,LIA-101,ܻԱ,X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,SKε(),ٷ ERP ͳ ȸ ź 26 02 ,0,"561,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-13,2,60116199,OP-204,ź(Ÿ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,SKε(),ٷ ERP ͳ ȸ ź 26 02 ,"510,000",0,"510,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-13,2,10115301,AST-106,Լ,X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,SKε(),ٷ ERP ͳ ȸ ź 26 02 ,"51,000",0,"51,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-13,2,20111109,LIA-101,ޱ(ϳī),Y25019,ӱ 32ȣ ~ûּ ~ġ Ǽ(2) ƮȲ ,~ġ(2),ӱ 32ȣ ~ûּ ~ġ Ǽ(2),,뿪,,,ٷа,뿪,Ѱȹ,,ϳī(6669),-ƻ Ǽ ȭȸ S/W(Zoom) 1 ,0,"246,070",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-13,2,50153199,IT-301,)޼(Ÿ),Y25019,ӱ 32ȣ ~ûּ ~ġ Ǽ(2) ƮȲ ,~ġ(2),ӱ 32ȣ ~ûּ ~ġ Ǽ(2),,뿪,,,ٷа,뿪,Ѱȹ,,Zoom Video Communications Inc.,-ƻ Ǽ ȭȸ S/W(Zoom) 1 ,"246,070",0,"246,070",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-10,2026-02-13,2,10111101,REV-101,뿪̼(꼭),Y26008,2026 濵 (ѸƱ),,,,,,,,,Ѱȹ,,ѸƱ,2026濵ױ(ѸƱ)2,"122,916,200",0,0,"122,916,200",,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-13,2,40110401,REV-101,뿪,Y26008,2026 濵 (ѸƱ),,,,,,,,,Ѱȹ,,ѸƱ,2026濵ױ(ѸƱ)2,0,"111,742,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-13,2,20112901,LIA-101,⼼,Y26008,2026 濵 (ѸƱ),,,,,,,,,Ѱȹ,,ѸƱ,"111,742,000*10%",0,"11,174,200",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-13,2026-02-13,2,10111101,REV-101,뿪̼(꼭),Y26008,2026 濵 (ѸƱ),,,,,,,,,Ѱȹ,,ѸƱ,2026濵ױ(ѸƱ)2,0,"122,916,200",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-13,2026-02-13,2,10110501,AST-101,뿹,Y26008,2026 濵 (ѸƱ),,,,,,,,,Ѱȹ,,(ְŷ),2026濵ױ(ѸƱ)2,"122,916,200",0,0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-19,2026-02-19,2,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,,ӿ CHAT GPT (2),0,"29,000",0,0, 濵,,Ÿ,,,,,,,,, +ٷ,2026-02-19,2026-02-19,2,60116399,IT-301,޼(Ÿ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,,ӿ CHAT GPT (2),"29,000",0,"29,000",0, 濵,,Ÿ,,,,,,,,, +ٷ,2026-02-19,2026-02-19,2,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,,2 (),0,"324,500",0,0, 濵,,Ÿ,,,,,,,,, +ٷ,2026-02-19,2026-02-19,2,60115999,WF-201,(Ÿ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,,2 (),"324,500",0,"324,500",0, 濵,,Ÿ,,,,,,,,, +ٷ,2026-02-19,2026-02-20,2,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,Ѱȹ,ַ,,Ǽ ± ( ߱ : ƮǼ - BIM ) ( ð > > Ǽ ),0,"200,000",0,0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2026-02-19,2026-02-20,2,60117301,WF-301,Ʒú,ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,Ѱȹ,ַ,,Ǽ ± ( ߱ : ƮǼ - BIM ) ( ð > > Ǽ ),"200,000",0,"200,000",0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2026-02-19,2026-02-20,2,20111109,LIA-101,ޱ(ϳī),ZZZZZZ,(OB),(OB),,ȹ/,,,,,,ӿ,,ϳī(7726),1 Ĵ(ִ뼱),0,"380,000",0,0, OB,,,,,,,,,,, +ٷ,2026-02-19,2026-02-20,2,50152507,WF-101,)Ļ(ȸĴ),ZZZZZZ,(OB),(OB),,ȹ/,,,,,,ӿ,,ִ뼱,1 Ĵ(ִ뼱),"380,000",0,"380,000",0, OB,Ļ,,,,,,,,,, +ٷ,2026-02-19,2026-02-20,2,20111109,LIA-101,ޱ(ϳī),ZZZZZZ,(OB),(OB),,ȹ/,,,,,,ӿ,,ϳī(7726),1 (ִ뼱),0,"196,000",0,0, OB,,,,,,,,,,, +ٷ,2026-02-19,2026-02-20,2,60115999,WF-201,(Ÿ),ZZZZZZ,(OB),(OB),,ȹ/,,,,,,ӿ,,ִ뼱,1 (ִ뼱),"66,000",0,"66,000",0, OB,,,,,,,,,,, +ٷ,2026-02-19,2026-02-20,2,60115999,WF-201,(Ÿ),ZZZZZZ,(OB),(OB),,ȹ/,,,,,,ӿ,,ִ뼱,1 (ִ뼱),"60,000",0,"60,000",0, OB,,,,,,,,,,, +ٷ,2026-02-19,2026-02-20,2,60115999,WF-201,(Ÿ),ZZZZZZ,(OB),(OB),,ȹ/,,,,,,ӿ,,ִ뼱,1 (ִ뼱),"70,000",0,"70,000",0, OB,,,,,,,,,,, +ٷ,2026-02-19,2026-02-20,2,20111103,LIA-101,ޱ(Ϲݹ),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,Ѱȹ,Ѱȹ,,ó,0,"12,700",0,0, BIM,,Ϲ,,,,,,,,, +ٷ,2026-02-19,2026-02-20,2,50152705,WF-201,)(ó),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,Ѱȹ,Ѱȹ,,,"12,700",0,"12,700",0, BIM,,Ϲ,,,,,,,,, +ٷ,2026-02-19,2026-02-20,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,,"ü湮 Ĵ ( ٿźƮ, 6 )",0,"189,100",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-19,2026-02-20,2,60115705,WF-101,Ļ(ȸĴ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,,"ü湮 Ĵ ( ٿźƮ, 6 )","189,100",0,"189,100",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-01-08,2026-02-20,2,60115903,WF-201,(),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,Ѱȹ,Ѱȹ,,,"93,200",0,"93,200",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-08,2026-02-20,2,20111103,LIA-101,ޱ(Ϲݹ),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,Ѱȹ,Ѱȹ,, - ,0,"93,200",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-16,2026-02-20,2,60115903,WF-201,(),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,Ѱȹ,Ѱȹ,,,"113,300",0,"113,300",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-16,2026-02-20,2,20111103,LIA-101,ޱ(Ϲݹ),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,Ѱȹ,Ѱȹ,, - ,0,"113,300",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-01-30,2026-02-20,2,60115903,WF-201,(),Z25059,~ܰȯ ӵ(1),ܰȯ(1),~ܰȯ ӵ(1),,BIM,,, Ʈ,BIM ,Ѱȹ,Ѱȹ,,,"106,400",0,"106,400",0,,,Ϲ,,,,,,,,, +ٷ,2026-01-30,2026-02-20,2,20111103,LIA-101,ޱ(Ϲݹ),Z25059,~ܰȯ ӵ(1),ܰȯ(1),~ܰȯ ӵ(1),,BIM,,, Ʈ,BIM ,Ѱȹ,Ѱȹ,, - ,0,"106,400",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-20,2,60115903,WF-201,(),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,Ѱȹ,Ѱȹ,,,"97,000",0,"97,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-12,2026-02-20,2,20111103,LIA-101,ޱ(Ϲݹ),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,Ѱȹ,Ѱȹ,, - ,0,"97,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-23,2026-02-23,2,20111103,LIA-101,ޱ(Ϲݹ),Y26018,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,Ѱȹ, BIM1,A,μ Կ ʿ (),0,"2,000,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-23,2026-02-23,2,10114903,AST-105,(ұ),Y26018,μ -籸 ۾ ̵ Ȯ ǽü 뿪,μ (-) ,μ -籸 ۾ ̵ Ȯ ǽü 뿪-Կ/ڷۼ,,뿪,,,ٷа,뿪,Ѱȹ, BIM1,A,μ Կ ʿ (),"2,000,000",0,"2,000,000",0,,,Ÿ,,,,,,,,, +ٷ,2026-02-23,2026-02-23,2,60110101,HR-101,޿(.),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,Ѱ/,2026 2 ޿(ٷ),"393,784,100",0,"393,784,100",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-23,2026-02-23,2,20111503,LIA-101,(ٷμҵֹμ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,2025 (ֹμ),0,"-6,354,890",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-23,2026-02-23,2,20111507,HR-201,(ο),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,迹 ο ,0,"-688,020",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-23,2026-02-23,2,20111501,LIA-101,(ٷμҵ漼),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ٷκ,2026 2 ޿ ٷμҵ漼(ٷ),0,"26,421,200",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-23,2026-02-23,2,20111503,LIA-101,(ٷμҵֹμ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ٷκ,2026 2 ޿ ٷμҵֹμ(ٷ),0,"2,641,790",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-23,2026-02-23,2,20111509,HR-203,(뺸()),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,뵿,2026 2 ޿ 뺸(ٷ),0,"3,271,310",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-23,2026-02-23,2,20111505,HR-202,(ǰ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,ΰǰ,"2026 2 ޿ ǷẸ(ǰ+, ٷ)",0,"14,670,700",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-23,2026-02-23,2,20111507,HR-201,(ο),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,οݰ,2026 2 ޿ ο(ٷ),0,"11,935,950",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-23,2026-02-23,2,20111599,LIA-101,(Ÿ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,2026 2 Ĵ Ÿ (ٷ),0,"1,796,400",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-23,2026-02-23,2,20111103,LIA-101,ޱ(Ϲݹ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,Ѱ/,2026 2 ޿(ٷ),0,"403,645,110",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-23,2026-02-23,2,20111501,LIA-101,(ٷμҵ漼),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,2025 (ҵ漼),0,"-63,555,450",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-20,2026-02-24,2,20111103,LIA-101,ޱ(Ϲݹ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,,缺 ȸĺ(2026 2),0,"126,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-20,2026-02-24,2,60115705,WF-101,Ļ(ȸĴ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,,缺 ȸĺ(2026 2),"126,000",0,"126,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-23,2026-02-24,2,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,(OB),(OB),,ȹ/,,,,,,ӿ,,SKڷ(),2 ޴ (ִ뼱),0,"144,330",0,0, OB,,,,,,,,,,, +ٷ,2026-02-23,2026-02-24,2,60116199,OP-204,ź(Ÿ),ZZZZZZ,(OB),(OB),,ȹ/,,,,,,ӿ,,SKڷ(),2 ޴ (ִ뼱),"37,633",0,"37,633",0, OB,,,,,,,,,,, +ٷ,2026-02-23,2026-02-24,2,10115301,AST-106,Լ,ZZZZZZ,(OB),(OB),,ȹ/,,,,,,ӿ,,SKڷ(),2 ޴ (ִ뼱),"3,762",0,"3,762",0, OB,,,,,,,,,,, +ٷ,2026-02-23,2026-02-24,2,60116199,OP-204,ź(Ÿ),ZZZZZZ,(OB),(OB),,ȹ/,,,,,,ӿ,,SKڷ(),2 ޴ (ִ뼱),"102,935",0,"102,935",0, OB,,,,,,,,,,, +ٷ,2026-02-25,2026-02-25,2,10111101,REV-101,뿪̼(꼭),Y26012,2026 濵 (Ѷ),,,,,,,,,Ѱȹ,,Ѷ,2026濵ױ(Ѷ),0,"10,285,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-25,2026-02-25,2,10110501,AST-101,뿹,Y26012,2026 濵 (Ѷ),,,,,,,,,Ѱȹ,,(ְŷ),2026濵ױ(Ѷ),"10,285,000",0,0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-24,2026-02-25,2,20111103,LIA-101,ޱ(Ϲݹ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,() 2026 2 (44),0,"19,360,430",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-24,2026-02-25,2,60111101,HR-103,,X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,() 2026 2 (44),"19,360,430",0,"19,360,430",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-25,2026-02-25,2,20111103,LIA-101,ޱ(Ϲݹ),X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,() 2026 2 (6),0,"2,159,060",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-25,2026-02-25,2,60111101,HR-103,,X26003,λ/,λ/,λ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,,() 2026 2 (6),"2,159,060",0,"2,159,060",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-10,2026-02-25,2,10111101,REV-101,뿪̼(꼭),Y26011,2026 濵 (),,,,,,,,,Ѱȹ,,,2026濵ױ()2,"294,607,500",0,0,"294,607,500",,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-25,2,40110401,REV-101,뿪,Y26011,2026 濵 (),,,,,,,,,Ѱȹ,,,2026濵ױ()2,0,"267,825,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-25,2,20112901,LIA-101,⼼,Y26011,2026 濵 (),,,,,,,,,Ѱȹ,,,"267,825,000*10%",0,"26,782,500",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-25,2,10111101,REV-101,뿪̼(꼭),Y26012,2026 濵 (Ѷ),,,,,,,,,Ѱȹ,,Ѷ,2026濵ױ(Ѷ),"10,285,000",0,0,"10,285,000",,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-25,2,40110401,REV-101,뿪,Y26012,2026 濵 (Ѷ),,,,,,,,,Ѱȹ,,Ѷ,2026濵ױ(Ѷ),0,"9,350,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-10,2026-02-25,2,20112901,LIA-101,⼼,Y26012,2026 濵 (Ѷ),,,,,,,,,Ѱȹ,,Ѷ,"9,350,000*10%",0,"935,000",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-25,2026-02-25,2,10111101,REV-101,뿪̼(꼭),Y26011,2026 濵 (),,,,,,,,,Ѱȹ,,,2026濵ױ()2,0,"294,607,500",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-25,2026-02-25,2,10110501,AST-101,뿹,Y26011,2026 濵 (),,,,,,,,,Ѱȹ,,(ְŷ),2026濵ױ()2,"294,607,500",0,0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-25,2026-02-26,2,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,, ȸ Ļ,0,"37,000",0,0, 濵,,Ÿ,,,,,,,,, +ٷ,2026-02-25,2026-02-26,2,60115705,WF-101,Ļ(ȸĴ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,, ȸ Ļ,"37,000",0,"37,000",0, 濵,Ļ,Ÿ,,,,,,,,, +ٷ,2026-02-25,2026-02-26,2,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,,ӿ AI (2),0,"29,000",0,0, 濵,,Ÿ,,,,,,,,, +ٷ,2026-02-25,2026-02-26,2,60116399,IT-301,޼(Ÿ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,,ӿ AI (2),"29,000",0,"29,000",0, 濵,,Ÿ,,,,,,,,, +ٷ,2026-02-26,2026-02-26,2,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,, ȸ Ļ,0,"59,900",0,0, 濵,,Ÿ,,,,,,,,, +ٷ,2026-02-26,2026-02-26,2,60115705,WF-101,Ļ(ȸĴ),ZZZZZZ,濵,濵,濵,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ ,, ȸ Ļ,"59,900",0,"59,900",0, 濵,Ļ,Ÿ,,,,,,,,, +ٷ,2026-02-26,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,Ѱȹ,,ѽ¹,"2 Ѹ 󱸵ȣȸ (2ȸ, 2/11, 25)",0,"320,000",0,0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2026-02-26,2026-02-27,2,60115798,WF-106,Ļ(),ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,Ѱȹ,,ѽ¹,"2 Ѹ 󱸵ȣȸ (2ȸ, 2/11, 25)","320,000",0,"320,000",0," Ʒ,",,Ÿ,,,,,,,,, +ٷ,2026-02-11,2026-02-27,2,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"142,370",0,"142,370",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,, - ,0,"8,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-11,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"134,370",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-13,2026-02-27,2,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"69,920",0,"69,920",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-13,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"69,920",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,, Ļ(IP ),0,"36,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,60115705,WF-101,Ļ(ȸĴ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,, Ļ(IP ),"36,000",0,"36,000",0,,Ļ,Ϲ,,,,,,,,, +ٷ,2026-02-20,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (02/13),0,"34,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-20,2026-02-27,2,60115798,WF-106,Ļ(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (02/13),"34,000",0,"34,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-20,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (02/13),0,"3,400",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-20,2026-02-27,2,60115798,WF-106,Ļ(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (02/13),"3,400",0,"3,400",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-23,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,,ٷ ΰ ߱޼,0,"20,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-23,2026-02-27,2,60116399,IT-301,޼(Ÿ),X26002,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ,,ٷ ΰ ߱޼,"20,000",0,"20,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,DBغ,ٷƮ (168 2890) ڵ ,0,"743,590",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,60115103,OP-201,(ڵ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,,DBغ,ٷƮ (168 2890) ڵ ,"743,590",0,"743,590",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-24,2026-02-27,2,60115903,WF-201,(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ,,"111,950",0,"111,950",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-24,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,, - ,0,"30,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-24,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, - ȣ,0,"81,950",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (02/24),0,"34,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,60115798,WF-106,Ļ(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (02/24),"34,000",0,"34,000",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,αȹ,, DZ׸ (2026.2~2027.2),0,"625,209",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,60114399,OP-203,Ҹǰ(Ÿ()),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,αȹ,, DZ׸ (2026.2~2027.2),"625,209",0,"625,209",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-26,2026-02-27,2,20111109,LIA-101,ޱ(ϳī),X25030,GSIM,GSIM,GSIM,S/W,ַ,,,S/W ,ַ,߼,,ϳī(6669),GSIM AWS (26 1),0,"182,932",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-26,2026-02-27,2,50153199,IT-301,)޼(Ÿ),X25030,GSIM,GSIM,GSIM,S/W,ַ,,,S/W ,ַ,߼,,Amazon Web Services Inc.,GSIM AWS (26 1),"182,932",0,"182,932",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-27,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (02/26),0,"31,700",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-27,2026-02-27,2,60115798,WF-106,Ļ(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,ȣ, (02/26),"31,700",0,"31,700",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-27,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,A,DZб ,0,"16,940",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-27,2026-02-27,2,50152701,WF-201,)(),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,A,DZб ,"16,940",0,"16,940",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-26,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,A,SW ȫ ν ü ߼,0,"165,440",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-26,2026-02-27,2,60116399,IT-301,޼(Ÿ),X25026,EG-BIM Drawer,EG-BIM Drawer,EG-BIM Drawer,S/W,׷,,,S/W ,׷&ؼ,Ѱȹ,ַ,A,SW ȫ ν ü ߼,"165,440",0,"165,440",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-27,2026-02-27,2,10111101,REV-101,뿪̼(꼭),Y26009,2026 濵 (),,,,,,,,,Ѱȹ,,,2026濵ױ(),0,"18,241,300",0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-27,2026-02-27,2,10110501,AST-101,뿹,Y26009,2026 濵 (),,,,,,,,,Ѱȹ,,(ְŷ),2026濵ױ(),"18,241,300",0,0,0,,,Ÿ,,,,,,,,, +ٷ,2026-02-26,2026-02-27,2,20111109,LIA-101,ޱ(ϳī),X25054,AI,AI,AI,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,,ϳī(6669),Ai Cloudflare (26 1),0,"8,319",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-26,2026-02-27,2,50153199,IT-301,)޼(Ÿ),X25054,AI,AI,AI,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,,Cloudflare Inc.,Ai Cloudflare (26 1),"8,319",0,"8,319",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-26,2026-02-27,2,20110101,LIA-101,ܻԱ,X25054,AI,AI,AI,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,,Ŭ ڸ ȸ,Ai Ŭ Ai (26 1),0,"327,153",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-26,2026-02-27,2,50153199,IT-301,)޼(Ÿ),X25054,AI,AI,AI,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,,Ŭ ڸ ȸ,Ai Ŭ Ai (26 1),"297,412",0,"297,412",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-26,2026-02-27,2,10115301,AST-106,Լ,X25054,AI,AI,AI,ȹ/,ȹ&,,,ȹ/,ȹ,Ѱȹ,,Ŭ ڸ ȸ,Ai Ŭ Ai (26 1),"29,741",0,"29,741",0,,,Ϲ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,20111103,LIA-101,ޱ(Ϲݹ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,ֿϱ,߼ ī ,0,"34,000",0,0,,,Ϲ,,,,,,,,, +ٷ,2026-02-25,2026-02-27,2,60114301,OP-203,Ҹǰ(繫ǰ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,缺,ֿϱ,߼ ī ,"34,000",0,"34,000",0,,,Ϲ,,,,,,,,, +Ѹ,2026-02-10,2026-02-13,2,50152599,WF-106,)Ļ,ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,߼,,,纸 ȣ ,"220,000",,"220,000",0," Ʒ,",,Ÿ,,,,,,,,, +Ѹ,2026-02-19,2026-02-19,2,10113701,AST-104,ޱ,ZZZZZZ,,(Ÿ),,ȹ/,,,,,,߼,,,пϱ д(޿),"528,500",,0,"528,500", JM ( ϱݰ) ,,,,,,,,,,, +Ѹ,2026-02-26,2026-02-26,2,60115305,MK-201,,ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,߼,,, ģ/ƺʽ,"100,000",,"100,000",0," Ʒ,",Ļ,Ÿ,,,,,,,,, +Ѹ,2026-02-05,2026-02-13,2,50151101,OP-101,),Z25056,ӱ 30ȣ -(-) Ǽ ȯ ð BIM 뿪( 2),~(2) ðBIM,~ ð2 ðBIM ,,BIM,,, Ʈ,BIM ,Ѱȹ,,,(2) : -(2) ðBIM 뿪 ,"370,000",,"370,000",0,,,Ϲ,,,,,,,,, +Ѹ,2026-02-10,2026-02-13,2,50153103,OUT-102,)޼,ZZZZZZ,,(Ÿ),,ȹ/,,,,,,Ѱȹ,,,õ繫/1б īƮ û,"308,000",,"308,000",0,,,,,,,,,,,, +Ѹ,2026-02-10,2026-02-13,2,50153103,OUT-102,)޼,ZZZZZZ,,(Ÿ),,ȹ/,,,,,,Ѱȹ,,,߼ ADTĸ _26 2,"99,000",,"99,000",0,,,,,,,,,,,, +Ѹ,2026-02-11,2026-02-13,2,50151109,OP-202,),ZZZZZZ,,(Ÿ),,ȹ/,,,,,,Ѱȹ,,,õ繫/ 4 26 2 û,"137,400",,"137,400",0,,,,,,,,,,,, +Ѹ,2026-02-11,2026-02-13,2,50152705,WF-201,),ZZZZZZ,,(Ÿ),,ȹ/,,,,,,Ѱȹ,,,õ繫/2 ,"99,000",,"99,000",0,,,,,,,,,,,, +Ѹ,2026-02-11,2026-02-13,2,60116101,IT-401,ź,ZZZZZZ,,(Ÿ),,ȹ/,,,,,,Ѱȹ,,,õ繫/ſ(26 02),"614,900",,"614,900",0,,,,,,,,,,,, +Ѹ,2026-02-11,2026-02-13,2,50152705,WF-201,),ZZZZZZ,,(Ÿ),,ȹ/,,,,,,Ѱȹ,,,õ繫/2 ,"33,000",,"33,000",0,,,,,,,,,,,, +Ѹ,2026-02-19,2026-02-23,2,60114743,WF-103,迬,ZZZZZZ,"Ʒ,","Ʒ, ","Ʒ,",ȹ/,,,,,,Ѱȹ,,,߼ ̳ Ļ ٰ ,"732,000",,"732,000",0," Ʒ,",Ļ,Ÿ,,,,,,,,, +,2026-02-10,2026-01-29,1,60114739,IT-201,迬(Ҹǰ),X26005,(ѹ),(ѹ),(ѹ),ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,߼,,, Ҹǰ ٰ ,"4,128,674",,"4,128,674",0,,,Ϲ,,,,,,,,, +,2025-12-16,2026-01-20,1,823,OUT-201,ߺ,20--18,ƮǼ߻ 10(Ѹ///Ƽ),ƮǼ(10),ƮǼ(10),,R&D,,, Ʈ,R&D,,,MDPI,ƮǼ/MDPI (SCI),"4,870,413",,"4,870,413",0,,,R&D,,,,,,,,, +,2026-01-30,2026-02-04,2,831,OUT-201,޼,26--06,濵ȹ/,濵ȹ/,濵ȹ/,ȹ/,Ѱȹ,,Ѱȹ,Ѱȹ,Ѱȹ,Ѱȹ,, ȣ,ֽȸ Ʈʽ ߰(),"121,000",,"121,000",0,,,Ϲ,,,,,,,,, diff --git a/incoming-files/payment.html b/incoming-files/payment.html new file mode 100644 index 0000000..0b01dfa --- /dev/null +++ b/incoming-files/payment.html @@ -0,0 +1,1598 @@ + + + + + + 프로젝트 대시보드 + + + + + + + + +
+ + + + + + + + + + + + + + + + diff --git a/incoming-files/ptj.csv b/incoming-files/ptj.csv new file mode 100644 index 0000000..e8aed16 --- /dev/null +++ b/incoming-files/ptj.csv @@ -0,0 +1,90 @@ +/,о,κо,Ʈ, +,ٷа,Ǹ,EG-BIM (ڸ), +,ٷа,Ǹ,ERP(ѱտϾ), +,ٷа,Ǹ,GAIA , +,ٷа,뿪,-ȭ ӵ Ǽ ⺻ ǽ(5), +,ٷа,뿪,42ȣ 1 ǽü뿪(), +,ٷа,뿪,-ġ(1) ȸ ý ġ, +,ٷа,뿪,ӱ 32ȣ ~ûּ ~ġ Ǽ(2), +,ٷа,뿪,- 1 Conference Platform(BigRoom), +,ٷа,뿪,- 2 Conference Platform(BigRoom), +,ٷа,뿪,- 3-4 Conference Platform(BigRoom), +,ٷа,뿪,п ̴ ý ,2 ߰ +,ٷа, ,䵵 , +,ٷа, ,Ѱ (2), +,ٷа, ,걹 2ǿ, +,ٷа, , ϼ ý 뿪, +,ٷа, ,PQ(ī̿), +, Ʈ,BIM ,~ ð2 ðBIM , +, Ʈ,BIM ,~õ ΰǼ ⺻ ǽü, +, Ʈ,BIM ,~ܰȯ ӵ(1), +, Ʈ,BIM ,泲꽺Ʈ , +, Ʈ,BIM ,ȿ뱳ϴ , +, Ʈ,BIM ,õ ü PQ , +, Ʈ,ð,õ KTX ᱳ ð, +, Ʈ,, ø _PQ, +, Ʈ,,() 2026 濵ȹ ,2 ߰ +, Ʈ,R&D, ߻, +, Ʈ,R&D, 2ٽ, +, Ʈ,R&D,ƮǼ(10), +, Ʈ,R&D,XR Ǽ Žý, +,S/W , GIS,KNGIL, +,S/W , GIS,GIS Mapper, +,S/W , GIS,õ, +,S/W , GIS,Surveyor, +,S/W , GIS,GAIA, +,S/W ,,WayPrimal, +,S/W ,,WayConfirm, +,S/W ,,WayDraw, +,S/W ,,WayShop, +,S/W ,,WallZainer, +,S/W ,,Bridge planner, +,S/W ,,AbutZainer, +,S/W ,,BriZainer-DR, +,S/W ,,BriZainer-Nodular, +,S/W ,,TunnelZainer, +,S/W ,,BoxZainer,2 ߰ +,S/W ,,TOVA, +,S/W ,/,LifeLine-Water, +,S/W ,/,찭 α׷, +,S/W ,׷&ؼ,HmEG(HmDraw), +,S/W ,׷&ؼ,EG-BIM Modeler, +,S/W ,׷&ؼ,EG-BIM Drawer, +,S/W ,׷&ؼ,StrAna, +,S/W ,ַ,ý(PM), +,S/W ,ַ,bCMf, +,S/W ,ַ,GSIM, +,S/W ,ַ,CCP, +,S/W ,ַ,ܰ/ solution, +,S/W ,ַ,WatchBIM, +,S/W ,ַ,Twin Highway, +,S/W ,ַ,Domainer, +,S/W ,ַ,Cadaster,2 ߰ +,S/W ,S/W,(뿪/) ȸ ý, +,S/W ,S/W,ERP: , +,S/W ,S/W,ERP: PTC, +,S/W ,S/W,ERP: Ѷ, +,S/W ,S/W,ERP: , +,S/W ,S/W,ERP: Ѹ, +,S/W ,S/W,ERP: ٷ, +,S/W ,S/W,ERP: (), +,S/W ,S/W,ERP: ձ, +,S/W ,S/W,CivilEngineeringLab, +,S/W ,S/W,PQý, +,S/W ,S/W,BEPs, +,S/W ,S/W,, +,S/W ,S/W,Ѹư , +,ȹ/,ȹ,ȹ, +,ȹ/,ȹ,ûõ , +,ȹ/,ȹ,ڿ ؿܻ, +,ȹ/,ȹ,AI, +,ȹ/,ȹ,GIS , +,ȹ/,ȹ,ijƮ ڽ , +,ȹ/,ȹ,δ~ź ö ƮȲ , +,ȹ/,ȹ,ٷ SW Ż,2 ߰ +Ѱȹ,Ѱȹ,Ѱȹ,濵ȹ/, +Ѱȹ,Ѱȹ,Ѱȹ,λ/, +Ѱȹ,Ѱȹ,Ѱȹ,(ѹ), +Ѱȹ,Ѱȹ,Ѱȹ,/, +,,,"Ʒ,", +,,,, diff --git a/legacy/static/organization.css b/legacy/static/organization.css index bd52974..8e3ccc8 100644 --- a/legacy/static/organization.css +++ b/legacy/static/organization.css @@ -1,6 +1,6 @@ body { overflow-x: hidden; - overflow-y: hidden; + overflow-y: auto; } .org-canvas { @@ -420,8 +420,8 @@ body { align-items: start; } -.modal-form-grid > .col-span-1, -.modal-form-grid > .col-span-2 { +.modal-form-grid>.col-span-1, +.modal-form-grid>.col-span-2 { min-width: 0; } @@ -544,21 +544,17 @@ body { border-radius: 16px; border: 1px dashed #94a3b8; background: - linear-gradient(135deg, rgba(255,255,255,0.9), rgba(224,231,255,0.95)), - repeating-linear-gradient( - 0deg, - rgba(148,163,184,0.12), - rgba(148,163,184,0.12) 1px, + linear-gradient(135deg, rgba(255, 255, 255, 0.9), rgba(224, 231, 255, 0.95)), + repeating-linear-gradient(0deg, + rgba(148, 163, 184, 0.12), + rgba(148, 163, 184, 0.12) 1px, transparent 1px, - transparent 24px - ), - repeating-linear-gradient( - 90deg, - rgba(148,163,184,0.12), - rgba(148,163,184,0.12) 1px, + transparent 24px), + repeating-linear-gradient(90deg, + rgba(148, 163, 184, 0.12), + rgba(148, 163, 184, 0.12) 1px, transparent 1px, - transparent 24px - ); + transparent 24px); display: flex; align-items: center; justify-content: center; @@ -997,9 +993,20 @@ body { } @keyframes target-pulse { - 0% { box-shadow: 0 0 0 0 rgba(79, 70, 229, 0.7); transform: scale(1); } - 50% { box-shadow: 0 0 0 10px rgba(79, 70, 229, 0); transform: scale(1.05); } - 100% { box-shadow: 0 0 0 0 rgba(79, 70, 229, 0); transform: scale(1); } + 0% { + box-shadow: 0 0 0 0 rgba(79, 70, 229, 0.7); + transform: scale(1); + } + + 50% { + box-shadow: 0 0 0 10px rgba(79, 70, 229, 0); + transform: scale(1.05); + } + + 100% { + box-shadow: 0 0 0 0 rgba(79, 70, 229, 0); + transform: scale(1); + } } .search-target { @@ -1098,4 +1105,4 @@ body { color: white; border-color: #4f46e5; box-shadow: 0 4px 10px rgba(79, 70, 229, 0.2); -} +} \ No newline at end of file diff --git a/legacy/static/organization.js b/legacy/static/organization.js index 567261d..e4ce291 100644 --- a/legacy/static/organization.js +++ b/legacy/static/organization.js @@ -167,6 +167,11 @@ async function loadActiveSeatMapLayout(force = false) { } } +function handleSeatMapLayoutUpdated() { + seatMapLayoutCache = null; + loadMembers().catch(() => { }); +} + function getMemberSeatInfo(layout, memberId) { if (!layout || !memberId) { return null; @@ -610,6 +615,16 @@ function openSeatMapView(event) { } } +window.addEventListener('message', (event) => { + const data = event.data; + if (!data || typeof data !== 'object') { + return; + } + if (data.type === 'seatmap-layout-updated') { + handleSeatMapLayoutUpdated(); + } +}); + function triggerUpload(event) { if (event) { event.stopPropagation(); diff --git a/proxy/nginx.conf b/proxy/nginx.conf index 006a8b9..d71783c 100755 --- a/proxy/nginx.conf +++ b/proxy/nginx.conf @@ -25,6 +25,13 @@ server { proxy_set_header X-Forwarded-Proto $scheme; } + location /integrations/ { + proxy_pass http://backend:8000; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + location / { proxy_pass http://frontend:80; proxy_set_header Host $host;