"""合同名称按供需方面板(partyA/partyB)解析简称。""" from app.crud.crm.contract import generate_contract_name, resolve_party_short_name def test_resolve_matches_supplier_exact_name(): assert ( resolve_party_short_name( "安庆市山峡化工有限公司", supplier_name="安庆市山峡化工有限公司", supplier_short_name="山峡", customer_name="安徽辉隆农资集团股份有限公司", customer_short_name="辉隆", ) == "山峡" ) def test_resolve_matches_customer_exact_name(): assert ( resolve_party_short_name( "安徽辉隆农资集团股份有限公司", supplier_name="安庆市山峡化工有限公司", supplier_short_name="山峡", customer_name="安徽辉隆农资集团股份有限公司", customer_short_name="辉隆", ) == "辉隆" ) def test_resolve_matches_customer_invoice_name(): assert ( resolve_party_short_name( "辉隆开票公司", supplier_name="安庆市山峡化工有限公司", supplier_short_name="山峡", customer_name="安徽辉隆农资集团股份有限公司", customer_short_name="辉隆", customer_invoice_name="辉隆开票公司", ) == "辉隆" ) def test_resolve_fallback_to_party_full_name(): assert ( resolve_party_short_name( "第三方单位", supplier_name="安庆市山峡化工有限公司", supplier_short_name="山峡", customer_name="安徽辉隆农资集团股份有限公司", customer_short_name="辉隆", ) == "第三方单位" ) def test_resolve_does_not_fuzzy_match_short_inside_longer_name(): """避免「山峡」子串误匹配客户全称中的山峡二字到交易主体。""" assert ( resolve_party_short_name( "安庆市山峡化工有限公司", supplier_name="其他主体", supplier_short_name="山峡", customer_name="安庆市山峡化工有限公司", customer_short_name="山峡客户", ) == "山峡客户" ) def test_generate_empty_uses_party_order_after_swap(): """调换后供方=辉隆、需方=山峡 → 辉隆-山峡(编号),不因类型反序。""" name = generate_contract_name( "SX/X-JT20260804001", party_a="安徽辉隆农资集团股份有限公司", party_b="安庆市山峡化工有限公司", supplier_name="安庆市山峡化工有限公司", supplier_short_name="山峡", customer_name="安徽辉隆农资集团股份有限公司", customer_short_name="辉隆", user_contract_name="", ) assert name == "辉隆-山峡(SX/X-JT20260804001)" def test_generate_empty_default_party_order(): name = generate_contract_name( "SX/X-JT20260804001", party_a="安庆市山峡化工有限公司", party_b="安徽辉隆农资集团股份有限公司", supplier_name="安庆市山峡化工有限公司", supplier_short_name="山峡", customer_name="安徽辉隆农资集团股份有限公司", customer_short_name="辉隆", user_contract_name="", ) assert name == "山峡-辉隆(SX/X-JT20260804001)" def test_generate_purchase_does_not_reverse_party_order(): name = generate_contract_name( "SX/X-JT20260804001", party_a="安徽辉隆农资集团股份有限公司", party_b="安庆市山峡化工有限公司", supplier_name="安庆市山峡化工有限公司", supplier_short_name="山峡", customer_name="安徽辉隆农资集团股份有限公司", customer_short_name="辉隆", user_contract_name="", contract_type="purchase", ) assert name == "辉隆-山峡(SX/X-JT20260804001)" def test_generate_user_name_keeps_body_and_syncs_no(): name = generate_contract_name( "SX/X-JT20260804002", party_a="安徽辉隆农资集团股份有限公司", party_b="安庆市山峡化工有限公司", supplier_name="安庆市山峡化工有限公司", supplier_short_name="山峡", customer_name="安徽辉隆农资集团股份有限公司", customer_short_name="辉隆", user_contract_name="自定义合同名(SX/X-JT20260804001)", ) assert name == "自定义合同名(SX/X-JT20260804002)" def test_generate_full_party_name_in_user_input_is_replaced_by_short(): """前端误传全称时,后端按主数据简称重算(华尔泰生产案例)。""" name = generate_contract_name( "YD/X-JT20260731003", party_a="安徽华尔泰股份有限公司", party_b="安徽云栋化工有限公司", supplier_name="安徽云栋化工有限公司", supplier_short_name="云栋", customer_name="安徽华尔泰股份有限公司", customer_short_name="华尔泰", user_contract_name="安徽华尔泰股份有限公司-云栋(YD/X-JT20260731003)", ) assert name == "华尔泰-云栋(YD/X-JT20260731003)" def test_generate_renewal_name_is_preserved(): name = generate_contract_name( "YD/X-JT20260804001", party_a="安徽华尔泰股份有限公司", party_b="安徽云栋化工有限公司", supplier_name="安徽云栋化工有限公司", supplier_short_name="云栋", customer_name="安徽华尔泰股份有限公司", customer_short_name="华尔泰", user_contract_name="华尔泰-云栋(YD/X-JT20260731003)-续签1", ) assert name == "华尔泰-云栋(YD/X-JT20260731003)-续签1(YD/X-JT20260804001)" def test_generate_fallback_when_parties_blank(): name = generate_contract_name( "SX/X-JT20260804001", party_a="", party_b="", supplier_short_name="山峡", customer_short_name="辉隆", user_contract_name="", ) assert name == "合同(SX/X-JT20260804001)"