/* ============================================================================= * M02_MasterTemplete_Labor_SkPick.ts * 일위대가 [+ 줄] 단가산출 = 그 층 SK 참조 한 행(PLAN 811-1 · 요구 707-1 · 681) — 일위대가 표(`Labor_Table`)가 부름. * · M01 기초 고름 = 그 층에 SK 사본을 만듦(`POST …/sangeun/from-logic` · 같은 내용 SK 있으면 물음 = 그것을 씀 · 그래도 새로) * · M02 단가산출 고름 = 같은 층 · 같은 주인 = 그대로 참조 · 다른 층(위 층 = 읽기 전용) = 이 층에 사본(`newLibrary` 본뜬) 뒤 참조 * · 답 = 넣을 참조 {층, 주인, 키} · 취소 = null(일위대가 문서는 화면 [저장] 때 바뀜) * ========================================================================== */ import { fetchSessionUser } from "../A06_Login/A06_Login_Api_Fetch"; import { call, newLibrary, type Layer } from "./M02_MasterTemplete_Api_Fetch"; import type { LaborRef } from "./M02_MasterTemplete_Labor_Calc"; import { withSameAsk } from "./M02_MasterTemplete_Library_SameAsk"; export interface SkPickScope { layer: Layer; owner: string | null; } const q = (s: SkPickScope): string => s.owner && s.layer !== "system" ? `?owner=${encodeURIComponent(s.owner)}` : ""; /** M01 기초 → 이 층 SK 사본 참조 */ export const skFromLogic = async (s: SkPickScope, code: string): Promise => ( await withSameAsk((extra) => call<{ 이름: string; 참조: LaborRef }>(`/layers/${s.layer}/sangeun/from-logic${q(s)}`, { method: "POST", body: JSON.stringify({ 로직: code, ...extra }), }), ) )?.참조 ?? null; /** 이 층 주인 — 주인 null = 로그인 사용자 자기 층(회사 「C」 · 개인 「C/U」 · 서버 참조 꼴) */ async function ownerOf(s: SkPickScope): Promise { if (s.layer === "system" || s.owner) return s.layer === "system" ? null : s.owner; const me = await fetchSessionUser(); if (!me) throw new Error("로그인이 끊김"); return s.layer === "company" ? String(me.company_id) : `${me.company_id}/${me.id}`; } /** 고른 SK — 이 층 것이면 그대로 · 다른 층이면 이 층 사본 */ export async function ownSk(s: SkPickScope, ref: LaborRef): Promise { const owner = await ownerOf(s); if (ref.층 === s.layer && (ref.주인 ?? null) === owner) return ref; const 본뜬 = { ...ref, 층: ref.층 as Layer }; const got = await newLibrary(s.layer, "sangeun", { 본뜬 }, s.owner); return { 층: s.layer, 주인: owner, 키: got.이름 }; }