feat: add intercompany loan document type

This commit is contained in:
2026-05-24 09:02:15 +08:00
parent 0d46a53e86
commit 1bc416da9d
7 changed files with 190 additions and 3 deletions
@@ -362,6 +362,74 @@ DEFAULT_ELEMENT_SCHEMAS: dict[str, dict[str, Any]] = {
},
]
},
"intercompany_loan_agreement": {
"sections": [
_party_section(),
{
"key": "relationship_and_approval",
"title": "关联关系与内部审批",
"fields": [
{"key": "relationship.description", "label": "关联关系说明", "type": "textarea", "required": True},
{"key": "internal_approval.confirmation", "label": "内部审批确认", "type": "textarea", "required": True},
],
},
{
"key": "loan_amount_and_purpose",
"title": "借款金额与资金用途",
"fields": [
{"key": "loan.amount", "label": "借款金额", "type": "money", "required": True},
{"key": "loan.purpose", "label": "借款用途", "type": "textarea", "required": True},
{"key": "fund.disbursement_account", "label": "资金划付账户", "type": "textarea", "required": True},
{"key": "fund.receipt_confirmation", "label": "资金到账确认", "type": "textarea", "required": True},
{"key": "fund.usage_restriction", "label": "资金用途限制说明", "type": "textarea", "required": False},
],
},
{
"key": "interest_and_term",
"title": "借款期限与计息",
"fields": [
{"key": "loan.term", "label": "借款期限", "type": "text", "required": True},
{"key": "interest.start_date", "label": "起息日", "type": "date", "required": True},
{"key": "interest.rate_method", "label": "年化利率/计息方式", "type": "textarea", "required": True},
{"key": "interest.payment_method", "label": "利息支付方式", "type": "textarea", "required": True},
],
},
{
"key": "repayment_arrangements",
"title": "还款安排",
"fields": [
{"key": "repayment.method", "label": "还款方式", "type": "textarea", "required": True},
{"key": "repayment.plan", "label": "还款计划", "type": "textarea", "required": True},
{"key": "repayment.account", "label": "还款账户", "type": "textarea", "required": True},
{"key": "prepayment.arrangement", "label": "提前还款安排", "type": "textarea", "required": False},
],
},
{
"key": "guarantee_and_compliance",
"title": "担保与合规",
"fields": [
{"key": "guarantee.method", "label": "担保方式", "type": "textarea", "required": True},
{"key": "guarantee.documents", "label": "担保文件", "type": "textarea", "required": False},
{"key": "regulatory_note", "label": "资金合规与监管说明", "type": "textarea", "required": False},
],
},
{
"key": "dispute_and_signature",
"title": "争议解决与签署",
"fields": [
{
"key": "dispute_resolution.method",
"label": "争议解决方式",
"type": "select",
"required": True,
"options": ["诉讼", "仲裁"],
},
{"key": "sign_date", "label": "签署日期", "type": "date", "required": True},
{"key": "e_signature_platform", "label": "电子签署平台", "type": "text", "required": False},
],
},
]
},
"rescission_notice": {
"sections": [
_party_section(),
@@ -114,6 +114,16 @@ DEFAULT_LEGAL_DOCUMENT_TYPES: list[dict[str, Any]] = [
"risk_level": "high",
"sort_order": 85,
},
{
"code": "intercompany_loan_agreement",
"name": "企业间借款合同",
"category": "investment-finance",
"industry": "general-enterprise",
"scenario": "intercompany-loan",
"description": "适用于企业间借款、关联交易、利率、担保、还款和资金合规场景。",
"risk_level": "critical",
"sort_order": 86,
},
{
"code": "valuation_adjustment_agreement",
"name": "对赌协议",
@@ -122,7 +132,7 @@ DEFAULT_LEGAL_DOCUMENT_TYPES: list[dict[str, Any]] = [
"scenario": "valuation-adjustment",
"description": "适用于投融资中的业绩承诺、估值调整、补偿和回购安排场景。",
"risk_level": "critical",
"sort_order": 86,
"sort_order": 87,
},
{
"code": "shareholder_resolution",
+60
View File
@@ -255,6 +255,66 @@ DEFAULT_TEMPLATES: list[dict[str, Any]] = [
{"name": "sign_date", "label": "签署日期"},
],
},
{
"name": "企业间借款合同模板",
"contract_type": "intercompany-loan",
"document_type_code": "intercompany_loan_agreement",
"template_category": "investment-finance",
"industry_category": "general-enterprise",
"description": "适用于企业间借款、关联交易、利率、还款、担保和资金合规场景。",
"content": (
"甲方(出借方):{{lender}}\n"
"乙方(借款方):{{borrower}}\n"
"关联关系说明:{{relationship_note}}\n"
"内部审批确认:{{internal_approval}}\n\n"
"一、借款金额与用途\n"
"借款金额:{{loan_amount}}\n"
"借款用途:{{loan_purpose}}\n"
"资金划付账户:{{disbursement_account}}\n"
"资金到账确认:{{receipt_confirmation}}\n\n"
"二、借款期限与利息\n"
"借款期限:{{loan_term}}\n"
"起息日:{{interest_start_date}}\n"
"年化利率/计息方式:{{interest_rate_method}}\n"
"利息支付方式:{{interest_payment_method}}\n\n"
"三、还款与担保\n"
"还款方式:{{repayment_method}}\n"
"还款计划:{{repayment_plan}}\n"
"还款账户:{{repayment_account}}\n"
"担保方式:{{guarantee_method}}\n"
"担保文件:{{guarantee_documents}}\n\n"
"四、合规、违约与争议解决\n"
"资金用途限制说明:{{fund_usage_restriction}}\n"
"违约责任:{{breach_liability}}\n"
"争议解决方式:{{dispute_resolution}}\n"
"电子签署平台:{{e_signature_platform}}\n"
"签署日期:{{sign_date}}"
),
"variables": [
{"name": "lender", "label": "甲方名称"},
{"name": "borrower", "label": "乙方名称"},
{"name": "relationship_note", "label": "关联关系说明"},
{"name": "internal_approval", "label": "内部审批确认"},
{"name": "loan_amount", "label": "借款金额"},
{"name": "loan_purpose", "label": "借款用途"},
{"name": "disbursement_account", "label": "资金划付账户"},
{"name": "receipt_confirmation", "label": "资金到账确认"},
{"name": "loan_term", "label": "借款期限"},
{"name": "interest_start_date", "label": "起息日"},
{"name": "interest_rate_method", "label": "年化利率/计息方式"},
{"name": "interest_payment_method", "label": "利息支付方式"},
{"name": "repayment_method", "label": "还款方式"},
{"name": "repayment_plan", "label": "还款计划"},
{"name": "repayment_account", "label": "还款账户"},
{"name": "guarantee_method", "label": "担保方式"},
{"name": "guarantee_documents", "label": "担保文件", "required": False},
{"name": "fund_usage_restriction", "label": "资金用途限制说明", "required": False},
{"name": "breach_liability", "label": "违约责任", "required": False},
{"name": "dispute_resolution", "label": "争议解决方式"},
{"name": "e_signature_platform", "label": "电子签署平台", "required": False},
{"name": "sign_date", "label": "签署日期"},
],
},
]
@@ -67,9 +67,16 @@ class StubDocumentTypeRepository:
"technical_service",
"lease_house",
"equity_transfer",
"intercompany_loan_agreement",
"cooperation_framework",
"demand_letter",
"rescission_notice",
"investment_agreement",
"valuation_adjustment_agreement",
"shareholder_resolution",
"power_of_attorney",
"legal_opinion",
"property_service_agreement",
}
def get_by_code(self, code):
@@ -162,6 +169,46 @@ class LegalDocumentElementSchemaServiceTestCase(unittest.TestCase):
self.assertFalse(percent_invalid["valid"])
self.assertTrue(any(item["field_key"] == "equity.percent" for item in percent_invalid["errors"]))
def test_intercompany_loan_schema_can_be_seeded_and_validated(self):
seeded = self.service.seed_default_element_schemas(self.admin_user, "intercompany_loan_agreement")
current = self.service.get_current_element_schema(self.member_user, "intercompany_loan_agreement")
self.assertEqual(seeded["created_count"], 1)
self.assertEqual(current["document_type_code"], "intercompany_loan_agreement")
self.assertEqual(
[section["key"] for section in current["schema_json"]["sections"]],
[
"parties",
"relationship_and_approval",
"loan_amount_and_purpose",
"interest_and_term",
"repayment_arrangements",
"guarantee_and_compliance",
"dispute_and_signature",
],
)
result = self.service.validate_element_values(
self.member_user,
"intercompany_loan_agreement",
{
"party_a": {"name": "甲方公司"},
"party_b": {"name": "乙方公司"},
"relationship": {"description": "同一控制下关联企业"},
"internal_approval": {"confirmation": "已完成董事会审批"},
"loan": {"amount": "5000000", "purpose": "流动资金周转", "term": "12个月"},
"fund": {"disbursement_account": "甲方对公账户", "receipt_confirmation": "已到账"},
"interest": {"start_date": "2026-05-24", "rate_method": "年化3.5%", "payment_method": "按季度支付"},
"repayment": {"method": "到期一次性还本付息", "plan": "12个月后结清", "account": "乙方对公账户"},
"guarantee": {"method": "无担保"},
"dispute_resolution": {"method": "诉讼"},
"sign_date": "2026-05-24",
},
)
self.assertTrue(result["valid"])
self.assertEqual(result["errors"], [])
def test_valid_element_values_pass(self):
self.service.seed_default_element_schemas(self.admin_user, "procurement_goods")
@@ -73,7 +73,7 @@ class LegalDocumentTypeServiceTestCase(unittest.TestCase):
industry="technology",
)
self.assertEqual(seeded["created_count"], 17)
self.assertEqual(seeded["created_count"], 18)
self.assertEqual(seeded["existing_count"], 0)
self.assertEqual(listed["total"], 2)
self.assertEqual([item["code"] for item in listed["items"]], ["technical_service", "software_development"])
@@ -83,7 +83,7 @@ class LegalDocumentTypeServiceTestCase(unittest.TestCase):
investment_list = self.service.list_document_types(self.member_user, category="investment-finance")
self.assertEqual(
[item["code"] for item in investment_list["items"]],
["equity_transfer", "investment_agreement", "valuation_adjustment_agreement"],
["equity_transfer", "investment_agreement", "intercompany_loan_agreement", "valuation_adjustment_agreement"],
)
property_list = self.service.list_document_types(self.member_user, category="real-estate")
self.assertEqual([item["code"] for item in property_list["items"]], ["lease_house", "property_service"])
@@ -76,6 +76,7 @@ const documentNameMap: Record<string, string> = {
nda_commercial: "保密协议",
lease_house: "房屋租赁合同",
equity_transfer: "股权转让协议",
intercompany_loan_agreement: "企业间借款合同",
cooperation_framework: "合作框架协议",
demand_letter: "催告函",
rescission_notice: "解除合同通知书",
+1
View File
@@ -57,6 +57,7 @@ const scenarioLabelMap: Record<string, string> = {
confidentiality: "商业保密",
lease: "租赁履约",
"equity-transfer": "股权交易",
"intercompany-loan": "企业间借款",
cooperation: "合作框架",
"demand-letter": "履约催告",
"rescission-notice": "解除通知",