From a55975e62a8e37d2e7be31015bb748878027cd19 Mon Sep 17 00:00:00 2001 From: hbyang Date: Fri, 24 Jul 2026 15:17:13 +0900 Subject: [PATCH] =?UTF-8?q?[fix]=20negosium=20=EC=8B=9C=EB=93=9C:=20?= =?UTF-8?q?=ED=98=91=EC=83=81=EC=B9=B4=EB=93=9C=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A6=BD=ED=8A=B8=20=EA=B0=9C=EC=A0=95=20+=20=EB=AF=B8?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=20=EC=B9=B4=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 출처: '260716_AIO2O 수정 및 요청사항_v2_memo check.xlsx' > '협상카드 수정' 시트(D열). - 스크립트 개정: NGC-003(장기 관계 강조)·NGC-004(명분 제공)·NGC-007(예산 상한 안내)·NGC-008(시장가 근거 제시) - 미사용('IMK 거래 특성과 관련성 부족') 카드 삭제: NGC-006(총비용 가치 설명)·NGC-009(조건부 가격 조정) - init-data.sql(신규/초기화 설치 정본)에서 006·009 INSERT 제거 + 4개 멘트 갱신 - 동일 최종본을 기존 DB 보정용 alter(postgres-init/alters/2026-07-24-nego-card-scripts.sql)로도 제공(멱등) 검증: 시드 nego_cards VALUES 를 temp 테이블에 강제 평가 → 9행·전부 유효 jsonb. seed=alter=로컬 DB 일치. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../alters/2026-07-24-nego-card-scripts.sql | 43 +++++++++++++++++++ postgres-init/init-data/init-data.sql | 40 ++++------------- 2 files changed, 52 insertions(+), 31 deletions(-) create mode 100644 postgres-init/alters/2026-07-24-nego-card-scripts.sql diff --git a/postgres-init/alters/2026-07-24-nego-card-scripts.sql b/postgres-init/alters/2026-07-24-nego-card-scripts.sql new file mode 100644 index 0000000..686c762 --- /dev/null +++ b/postgres-init/alters/2026-07-24-nego-card-scripts.sql @@ -0,0 +1,43 @@ +-- 2026-07-24 · 협상카드 스크립트 개정 + 미사용 카드 정리 (기존 DB 보정) +-- 출처: '260716_AIO2O 수정 및 요청사항_v2_memo check.xlsx' > '협상카드 수정' 시트(D열). +-- 내용 정본은 init-data.sql(신규/초기화 설치). 이 파일은 그와 동일한 최종본을 기존 DB 에 반영한다. +-- - 스크립트 개정: NGC-003(장기 관계 강조)·NGC-004(명분 제공)·NGC-007(예산 상한 안내)·NGC-008(시장가 근거 제시) +-- - 미사용 카드 soft-delete: NGC-006(총비용 가치 설명)·NGC-009(조건부 가격 조정) +-- 멱등: number 기준 UPDATE — 여러 번 실행해도 안전. +-- 적용: psql -h -p -U -d -f postgres-init/alters/2026-07-24-nego-card-scripts.sql + +\connect negosium_db + +UPDATE card.nego_cards SET script='귀사와의 협력을 진심으로 소중하게 생각하고 있습니다. + +이번 거래가 단발성으로 끝나지 않고, 앞으로도 오랜 기간 협력하는 관계가 되기를 바랍니다. 그런 의미에서 양사가 모두 만족할 수 있는 합리적인 지점을 함께 찾고자 합니다. + +귀사께서 조금만 더 협조해 주신다면, 당사 역시 장기적인 관점에서 최선을 다해 화답하겠습니다. 좋은 합의를 기대합니다.', + edit_script='[{"type": "paragraph", "children": [{"text": "귀사와의 협력을 진심으로 소중하게 생각하고 있습니다."}]}, {"type": "paragraph", "children": [{"text": "이번 거래가 단발성으로 끝나지 않고, "}, {"bold": true, "text": "앞으로도 오랜 기간 협력하는 관계"}, {"text": "가 되기를 바랍니다. 그런 의미에서 양사가 모두 만족할 수 있는 합리적인 지점을 함께 찾고자 합니다."}]}, {"type": "paragraph", "children": [{"text": "귀사께서 조금만 더 협조해 주신다면, 당사 역시 장기적인 관점에서 최선을 다해 화답하겠습니다. 좋은 합의를 기대합니다."}]}]'::jsonb, updated_at=now() +WHERE number='NGC-003' AND deleted=false; + +UPDATE card.nego_cards SET script='그동안 귀사께서 제공해주신 전문성과 경쟁력에 감사드립니다. + +이번 합의는 귀사가 일방적으로 양보하는 것이 아니라, 양사가 장기적 협력을 위해 함께 내린 전략적 결정으로 이해해 주시면 감사하겠습니다. 당사 역시 이번 합의를 귀사와의 신뢰를 보여주는 기회로 삼겠습니다. + +서로의 입장을 존중하는 선에서 원만하게 마무리할 수 있기를 바랍니다.', + edit_script='[{"type": "paragraph", "children": [{"text": "그동안 귀사께서 제공해주신 전문성과 경쟁력에 감사드립니다."}]}, {"type": "paragraph", "children": [{"text": "이번 합의는 귀사가 일방적으로 양보하는 것이 아니라, "}, {"bold": true, "text": "양사가 장기적 협력을 위해 함께 내린 전략적 결정"}, {"text": "으로 이해해 주시면 감사하겠습니다. 당사 역시 이번 합의를 귀사와의 신뢰를 보여주는 기회로 삼겠습니다."}]}, {"type": "paragraph", "children": [{"text": "서로의 입장을 존중하는 선에서 원만하게 마무리할 수 있기를 바랍니다."}]}]'::jsonb, updated_at=now() +WHERE number='NGC-004' AND deleted=false; + +UPDATE card.nego_cards SET script='귀사와의 합의를 진심으로 바라고 있습니다. + +다만 당사 내부 사정상 본 건에 희망 가능한 금액은 {anchoring_price}원(VAT별도)이 한계입니다. 이는 담당자 개인의 재량을 넘어선것으로 너른 양해를 부탁드립니다. + +해당 범위 내에서 귀사가 수용 가능한 지점을 함께 찾을 수 있기를 바랍니다.', + edit_script='[{"type": "paragraph", "children": [{"text": "귀사와의 합의를 진심으로 바라고 있습니다."}]}, {"type": "paragraph", "children": [{"text": "다만 당사 내부 사정상 본 건에 희망 가능한 금액은 "}, {"name": "anchoring_price", "type": "variable", "label": "앵커링가격(고객사 하한)", "style": {"bold": true, "color": "red"}, "suffix": "원(VAT별도)", "children": [{"text": ""}]}, {"bold": true, "text": "이 한계입니다."}, {"text": " 이는 담당자 개인의 재량을 넘어선것으로 너른 양해를 부탁드립니다."}]}, {"type": "paragraph", "children": [{"text": "해당 범위 내에서 귀사가 수용 가능한 지점을 함께 찾을 수 있기를 바랍니다."}]}]'::jsonb, updated_at=now() +WHERE number='NGC-007' AND deleted=false; + +UPDATE card.nego_cards SET script='인터넷 시장 조사 결과, 동종 업계의 유사 거래에서도 본 건과 비슷한 사양은 {internet_lowest_price}원(VAT별도) 안팎에서 거래되고 있습니다. + +특정 업체만의 기준이 아니라 업계 전반의 관행에 근거한 가격인 만큼, 합리적으로 검토해 주시기를 부탁드립니다.', + edit_script='[{"type": "paragraph", "children": [{"text": "인터넷 시장 조사 결과, 동종 업계의 유사 거래에서도 본 건과 비슷한 사양은 "}, {"name": "internet_lowest_price", "type": "variable", "label": "인터넷 최저가", "style": {"bold": true, "color": "red"}, "suffix": "원(VAT별도)", "children": [{"text": ""}]}, {"text": " 안팎에서 거래되고 있습니다."}]}, {"type": "paragraph", "children": [{"text": "특정 업체만의 기준이 아니라 업계 전반의 관행에 근거한 가격인 만큼, 합리적으로 검토해 주시기를 부탁드립니다."}]}]'::jsonb, updated_at=now() +WHERE number='NGC-008' AND deleted=false; + +-- 미사용 카드 정리(soft-delete) +UPDATE card.nego_cards SET deleted=true, updated_at=now() +WHERE number IN ('NGC-006','NGC-009') AND deleted=false; diff --git a/postgres-init/init-data/init-data.sql b/postgres-init/init-data/init-data.sql index 2603309..22b1bbd 100644 --- a/postgres-init/init-data/init-data.sql +++ b/postgres-init/init-data/init-data.sql @@ -76,20 +76,20 @@ SELECT * FROM (VALUES (NULL::uuid, '장기 관계 강조', 'NGC-003', '귀사와의 협력을 진심으로 소중하게 생각하고 있습니다. -이번 거래가 단발성으로 끝나지 않고, 앞으로 오랜 기간 함께할 관계의 시작이 되기를 바랍니다. 그런 의미에서 양사가 모두 만족할 수 있는 합리적인 지점을 함께 찾고자 합니다. +이번 거래가 단발성으로 끝나지 않고, 앞으로도 오랜 기간 협력하는 관계가 되기를 바랍니다. 그런 의미에서 양사가 모두 만족할 수 있는 합리적인 지점을 함께 찾고자 합니다. 귀사께서 조금만 더 협조해 주신다면, 당사 역시 장기적인 관점에서 최선을 다해 화답하겠습니다. 좋은 합의를 기대합니다.', - '[{"type": "paragraph", "children": [{"text": "귀사와의 협력을 진심으로 소중하게 생각하고 있습니다."}]}, {"type": "paragraph", "children": [{"text": "이번 거래가 단발성으로 끝나지 않고, "}, {"text": "앞으로 오랜 기간 함께할 관계의 시작", "bold": true}, {"text": "이 되기를 바랍니다. 그런 의미에서 양사가 모두 만족할 수 있는 합리적인 지점을 함께 찾고자 합니다."}]}, {"type": "paragraph", "children": [{"text": "귀사께서 조금만 더 협조해 주신다면, 당사 역시 장기적인 관점에서 최선을 다해 화답하겠습니다. 좋은 합의를 기대합니다."}]}]'::jsonb, + '[{"type": "paragraph", "children": [{"text": "귀사와의 협력을 진심으로 소중하게 생각하고 있습니다."}]}, {"type": "paragraph", "children": [{"text": "이번 거래가 단발성으로 끝나지 않고, "}, {"text": "앞으로도 오랜 기간 협력하는 관계", "bold": true}, {"text": "가 되기를 바랍니다. 그런 의미에서 양사가 모두 만족할 수 있는 합리적인 지점을 함께 찾고자 합니다."}]}, {"type": "paragraph", "children": [{"text": "귀사께서 조금만 더 협조해 주신다면, 당사 역시 장기적인 관점에서 최선을 다해 화답하겠습니다. 좋은 합의를 기대합니다."}]}]'::jsonb, 1, 3, 2), -- 4. 명분 제공 — tone 2(정중) · strategy 2(수용) (NULL::uuid, '명분 제공', 'NGC-004', - '그동안 귀사께서 보여주신 협상 태도와 전문성을 높이 평가하고 있습니다. + '그동안 귀사께서 제공해주신 전문성과 경쟁력에 감사드립니다. -이번 조정은 귀사가 일방적으로 양보하는 것이 아니라, 양사가 장기적 협력을 위해 함께 내린 전략적 결정으로 이해해 주시면 감사하겠습니다. 당사 역시 이번 합의를 귀사와의 신뢰를 보여주는 기회로 삼겠습니다. +이번 합의는 귀사가 일방적으로 양보하는 것이 아니라, 양사가 장기적 협력을 위해 함께 내린 전략적 결정으로 이해해 주시면 감사하겠습니다. 당사 역시 이번 합의를 귀사와의 신뢰를 보여주는 기회로 삼겠습니다. 서로의 입장을 존중하는 선에서 원만하게 마무리할 수 있기를 바랍니다.', - '[{"type": "paragraph", "children": [{"text": "그동안 귀사께서 보여주신 협상 태도와 전문성을 높이 평가하고 있습니다."}]}, {"type": "paragraph", "children": [{"text": "이번 조정은 귀사가 일방적으로 양보하는 것이 아니라, "}, {"text": "양사가 장기적 협력을 위해 함께 내린 전략적 결정", "bold": true}, {"text": "으로 이해해 주시면 감사하겠습니다. 당사 역시 이번 합의를 귀사와의 신뢰를 보여주는 기회로 삼겠습니다."}]}, {"type": "paragraph", "children": [{"text": "서로의 입장을 존중하는 선에서 원만하게 마무리할 수 있기를 바랍니다."}]}]'::jsonb, + '[{"type": "paragraph", "children": [{"text": "그동안 귀사께서 제공해주신 전문성과 경쟁력에 감사드립니다."}]}, {"type": "paragraph", "children": [{"text": "이번 합의는 귀사가 일방적으로 양보하는 것이 아니라, "}, {"text": "양사가 장기적 협력을 위해 함께 내린 전략적 결정", "bold": true}, {"text": "으로 이해해 주시면 감사하겠습니다. 당사 역시 이번 합의를 귀사와의 신뢰를 보여주는 기회로 삼겠습니다."}]}, {"type": "paragraph", "children": [{"text": "서로의 입장을 존중하는 선에서 원만하게 마무리할 수 있기를 바랍니다."}]}]'::jsonb, 1, 2, 2), -- 5. 공정 합의 제안 — tone 4(중립) · strategy 2(수용) @@ -102,46 +102,24 @@ SELECT * FROM (VALUES '[{"type": "paragraph", "children": [{"text": "당사가 바라는 것은 어느 한쪽에 치우친 거래가 아니라, "}, {"text": "양사 모두가 공정하다고 느낄 수 있는 합의", "bold": true}, {"text": "입니다."}]}, {"type": "paragraph", "children": [{"text": "당사는 합리적인 근거 위에서 성실하게 조건을 제시해 왔으며, 귀사 역시 같은 자세로 임해 주시리라 믿습니다. 서로가 공정함을 기준으로 한 걸음씩 다가선다면, 양사 모두 납득할 수 있는 결론에 이를 수 있습니다."}]}, {"type": "paragraph", "children": [{"text": "공정한 합의를 향해 귀사의 전향적인 검토를 부탁드립니다."}]}]'::jsonb, 1, 4, 2), - -- 6. 총비용 가치 설명 — tone 4(중립) · strategy 3(고수) - (NULL::uuid, '총비용 가치 설명', 'NGC-006', - '제안 드린 가격에 대해 부담을 느끼시는 점 충분히 이해합니다. - -다만 당사의 제안 가격은 단순한 단가가 아니라 안정적인 품질과 납기 준수, 사후 지원까지 포함한 총비용 관점에서 산정된 것입니다. 초기 단가만을 기준으로 비교할 경우, 운영 과정에서 발생할 수 있는 추가 비용이나 리스크가 충분히 반영되지 않을 수 있습니다. - -가격 자체보다 귀사께서 얻으실 전체적인 가치를 함께 고려해 주시기를 부탁드립니다.', - '[{"type": "paragraph", "children": [{"text": "제안 드린 가격에 대해 부담을 느끼시는 점 충분히 이해합니다."}]}, {"type": "paragraph", "children": [{"text": "다만 당사의 제안 가격은 단순한 단가가 아니라 "}, {"text": "안정적인 품질과 납기 준수, 사후 지원까지 포함한 총비용 관점", "bold": true}, {"text": "에서 산정된 것입니다. 초기 단가만을 기준으로 비교할 경우, 운영 과정에서 발생할 수 있는 추가 비용이나 리스크가 충분히 반영되지 않을 수 있습니다."}]}, {"type": "paragraph", "children": [{"text": "가격 자체보다 귀사께서 얻으실 전체적인 가치를 함께 고려해 주시기를 부탁드립니다."}]}]'::jsonb, - 1, 4, 3), - -- 7. 예산 상한 안내 — tone 2(정중) · strategy 3(고수) (NULL::uuid, '예산 상한 안내', 'NGC-007', '귀사와의 합의를 진심으로 바라고 있습니다. -다만 당사 내부 예산 정책상 본 건에 책정 가능한 금액은 {anchoring_price}원(VAT별도)이 한계입니다. 이는 개인의 재량을 넘어선 내부 기준에 해당하여 조정이 어려운 부분이니 너른 양해를 부탁드립니다. +다만 당사 내부 사정상 본 건에 희망 가능한 금액은 {anchoring_price}원(VAT별도)이 한계입니다. 이는 담당자 개인의 재량을 넘어선것으로 너른 양해를 부탁드립니다. 해당 범위 내에서 귀사가 수용 가능한 지점을 함께 찾을 수 있기를 바랍니다.', - '[{"type": "paragraph", "children": [{"text": "귀사와의 합의를 진심으로 바라고 있습니다."}]}, {"type": "paragraph", "children": [{"text": "다만 당사 내부 예산 정책상 본 건에 책정 가능한 금액은 "}, {"type": "variable", "name": "anchoring_price", "label": "앵커링가격(고객사 하한)", "children": [{"text": ""}], "suffix": "원(VAT별도)", "style": {"bold": true, "color": "red"}}, {"text": "이 한계입니다.", "bold": true}, {"text": " 이는 개인의 재량을 넘어선 내부 기준에 해당하여 조정이 어려운 부분이니 너른 양해를 부탁드립니다."}]}, {"type": "paragraph", "children": [{"text": "해당 범위 내에서 귀사가 수용 가능한 지점을 함께 찾을 수 있기를 바랍니다."}]}]'::jsonb, + '[{"type": "paragraph", "children": [{"text": "귀사와의 합의를 진심으로 바라고 있습니다."}]}, {"type": "paragraph", "children": [{"text": "다만 당사 내부 사정상 본 건에 희망 가능한 금액은 "}, {"type": "variable", "name": "anchoring_price", "label": "앵커링가격(고객사 하한)", "children": [{"text": ""}], "suffix": "원(VAT별도)", "style": {"bold": true, "color": "red"}}, {"text": "이 한계입니다.", "bold": true}, {"text": " 이는 담당자 개인의 재량을 넘어선것으로 너른 양해를 부탁드립니다."}]}, {"type": "paragraph", "children": [{"text": "해당 범위 내에서 귀사가 수용 가능한 지점을 함께 찾을 수 있기를 바랍니다."}]}]'::jsonb, 1, 2, 3), -- 8. 시장가 근거 제시 — tone 4(중립) · strategy 3(고수) (NULL::uuid, '시장가 근거 제시', 'NGC-008', - '당사의 제안 가격이 시장에서 동떨어진 수준이 아님을 함께 확인해 보고자 합니다. - -인터넷 시장 조사 결과, 동종 업계의 유사 거래에서도 본 건과 비슷한 사양은 {internet_lowest_price}원(VAT별도) 안팎에서 합의되고 있습니다. 당사의 제안은 이러한 시장의 일반적인 수준을 충실히 반영한 것입니다. + '인터넷 시장 조사 결과, 동종 업계의 유사 거래에서도 본 건과 비슷한 사양은 {internet_lowest_price}원(VAT별도) 안팎에서 거래되고 있습니다. 특정 업체만의 기준이 아니라 업계 전반의 관행에 근거한 가격인 만큼, 합리적으로 검토해 주시기를 부탁드립니다.', - '[{"type": "paragraph", "children": [{"text": "당사의 제안 가격이 시장에서 동떨어진 수준이 아님을 함께 확인해 보고자 합니다."}]}, {"type": "paragraph", "children": [{"text": "인터넷 시장 조사 결과, 동종 업계의 유사 거래에서도 본 건과 비슷한 사양은 "}, {"type": "variable", "name": "internet_lowest_price", "label": "인터넷 최저가", "children": [{"text": ""}], "suffix": "원(VAT별도)", "style": {"bold": true, "color": "red"}}, {"text": " 안팎에서 합의되고 있습니다. 당사의 제안은 이러한 "}, {"text": "시장의 일반적인 수준을 충실히 반영", "bold": true}, {"text": "한 것입니다."}]}, {"type": "paragraph", "children": [{"text": "특정 업체만의 기준이 아니라 업계 전반의 관행에 근거한 가격인 만큼, 합리적으로 검토해 주시기를 부탁드립니다."}]}]'::jsonb, + '[{"type": "paragraph", "children": [{"text": "인터넷 시장 조사 결과, 동종 업계의 유사 거래에서도 본 건과 비슷한 사양은 "}, {"type": "variable", "name": "internet_lowest_price", "label": "인터넷 최저가", "children": [{"text": ""}], "suffix": "원(VAT별도)", "style": {"bold": true, "color": "red"}}, {"text": " 안팎에서 거래되고 있습니다."}]}, {"type": "paragraph", "children": [{"text": "특정 업체만의 기준이 아니라 업계 전반의 관행에 근거한 가격인 만큼, 합리적으로 검토해 주시기를 부탁드립니다."}]}]'::jsonb, 1, 4, 3), - -- 9. 조건부 가격 조정 — tone 4(중립) · strategy 4(협력) - (NULL::uuid, '조건부 가격 조정', 'NGC-009', - '귀사의 입장을 고려하여 당사가 한 걸음 더 나아가고자 합니다. - -귀사께서 {customer_condition}에 동의해 주신다면, 당사는 가격을 {target_price}원(VAT별도)까지 조정하겠습니다. - -당사가 양보하는 만큼 귀사께서도 의미 있는 조건으로 화답해 주신다면, 양사 모두 만족할 수 있는 합의가 될 것입니다. 위 전제에 동의하시는지 확인 부탁드립니다.', - '[{"type": "paragraph", "children": [{"text": "귀사의 입장을 고려하여 당사가 한 걸음 더 나아가고자 합니다."}]}, {"type": "paragraph", "children": [{"text": "귀사께서 "}, {"type": "variable", "name": "customer_condition", "label": "고객사 교환·요구 조건", "children": [{"text": ""}], "style": {"bold": true}}, {"text": "에 동의해 주신다면, 당사는 가격을 "}, {"type": "variable", "name": "target_price", "label": "목표가격(고객사 지향가)", "children": [{"text": ""}], "suffix": "원(VAT별도)", "style": {"bold": true, "color": "red"}}, {"text": "까지 조정하겠습니다.", "bold": true}]}, {"type": "paragraph", "children": [{"text": "당사가 양보하는 만큼 귀사께서도 의미 있는 조건으로 화답해 주신다면, 양사 모두 만족할 수 있는 합의가 될 것입니다. 위 전제에 동의하시는지 확인 부탁드립니다."}]}]'::jsonb, - 1, 4, 4), - -- 10. 향후 거래 연계 — tone 4(중립) · strategy 4(협력) (NULL::uuid, '향후 거래 연계', 'NGC-010', '이번 거래의 가격을 {target_price}원(VAT별도)으로 조정하는 대신, {customer_condition}을 함께 검토해 주실 것을 제안 드립니다.