test_crm_contract_name_from_parties.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. """合同名称按供需方面板(partyA/partyB)解析简称。"""
  2. from app.crud.crm.contract import generate_contract_name, resolve_party_short_name
  3. def test_resolve_matches_supplier_exact_name():
  4. assert (
  5. resolve_party_short_name(
  6. "安庆市山峡化工有限公司",
  7. supplier_name="安庆市山峡化工有限公司",
  8. supplier_short_name="山峡",
  9. customer_name="安徽辉隆农资集团股份有限公司",
  10. customer_short_name="辉隆",
  11. )
  12. == "山峡"
  13. )
  14. def test_resolve_matches_customer_exact_name():
  15. assert (
  16. resolve_party_short_name(
  17. "安徽辉隆农资集团股份有限公司",
  18. supplier_name="安庆市山峡化工有限公司",
  19. supplier_short_name="山峡",
  20. customer_name="安徽辉隆农资集团股份有限公司",
  21. customer_short_name="辉隆",
  22. )
  23. == "辉隆"
  24. )
  25. def test_resolve_matches_customer_invoice_name():
  26. assert (
  27. resolve_party_short_name(
  28. "辉隆开票公司",
  29. supplier_name="安庆市山峡化工有限公司",
  30. supplier_short_name="山峡",
  31. customer_name="安徽辉隆农资集团股份有限公司",
  32. customer_short_name="辉隆",
  33. customer_invoice_name="辉隆开票公司",
  34. )
  35. == "辉隆"
  36. )
  37. def test_resolve_fallback_to_party_full_name():
  38. assert (
  39. resolve_party_short_name(
  40. "第三方单位",
  41. supplier_name="安庆市山峡化工有限公司",
  42. supplier_short_name="山峡",
  43. customer_name="安徽辉隆农资集团股份有限公司",
  44. customer_short_name="辉隆",
  45. )
  46. == "第三方单位"
  47. )
  48. def test_resolve_does_not_fuzzy_match_short_inside_longer_name():
  49. """避免「山峡」子串误匹配客户全称中的山峡二字到交易主体。"""
  50. assert (
  51. resolve_party_short_name(
  52. "安庆市山峡化工有限公司",
  53. supplier_name="其他主体",
  54. supplier_short_name="山峡",
  55. customer_name="安庆市山峡化工有限公司",
  56. customer_short_name="山峡客户",
  57. )
  58. == "山峡客户"
  59. )
  60. def test_generate_empty_uses_party_order_after_swap():
  61. """调换后供方=辉隆、需方=山峡 → 辉隆-山峡(编号),不因类型反序。"""
  62. name = generate_contract_name(
  63. "SX/X-JT20260804001",
  64. party_a="安徽辉隆农资集团股份有限公司",
  65. party_b="安庆市山峡化工有限公司",
  66. supplier_name="安庆市山峡化工有限公司",
  67. supplier_short_name="山峡",
  68. customer_name="安徽辉隆农资集团股份有限公司",
  69. customer_short_name="辉隆",
  70. user_contract_name="",
  71. )
  72. assert name == "辉隆-山峡(SX/X-JT20260804001)"
  73. def test_generate_empty_default_party_order():
  74. name = generate_contract_name(
  75. "SX/X-JT20260804001",
  76. party_a="安庆市山峡化工有限公司",
  77. party_b="安徽辉隆农资集团股份有限公司",
  78. supplier_name="安庆市山峡化工有限公司",
  79. supplier_short_name="山峡",
  80. customer_name="安徽辉隆农资集团股份有限公司",
  81. customer_short_name="辉隆",
  82. user_contract_name="",
  83. )
  84. assert name == "山峡-辉隆(SX/X-JT20260804001)"
  85. def test_generate_purchase_does_not_reverse_party_order():
  86. name = generate_contract_name(
  87. "SX/X-JT20260804001",
  88. party_a="安徽辉隆农资集团股份有限公司",
  89. party_b="安庆市山峡化工有限公司",
  90. supplier_name="安庆市山峡化工有限公司",
  91. supplier_short_name="山峡",
  92. customer_name="安徽辉隆农资集团股份有限公司",
  93. customer_short_name="辉隆",
  94. user_contract_name="",
  95. contract_type="purchase",
  96. )
  97. assert name == "辉隆-山峡(SX/X-JT20260804001)"
  98. def test_generate_user_name_keeps_body_and_syncs_no():
  99. name = generate_contract_name(
  100. "SX/X-JT20260804002",
  101. party_a="安徽辉隆农资集团股份有限公司",
  102. party_b="安庆市山峡化工有限公司",
  103. supplier_name="安庆市山峡化工有限公司",
  104. supplier_short_name="山峡",
  105. customer_name="安徽辉隆农资集团股份有限公司",
  106. customer_short_name="辉隆",
  107. user_contract_name="自定义合同名(SX/X-JT20260804001)",
  108. )
  109. assert name == "自定义合同名(SX/X-JT20260804002)"
  110. def test_generate_full_party_name_in_user_input_is_replaced_by_short():
  111. """前端误传全称时,后端按主数据简称重算(华尔泰生产案例)。"""
  112. name = generate_contract_name(
  113. "YD/X-JT20260731003",
  114. party_a="安徽华尔泰股份有限公司",
  115. party_b="安徽云栋化工有限公司",
  116. supplier_name="安徽云栋化工有限公司",
  117. supplier_short_name="云栋",
  118. customer_name="安徽华尔泰股份有限公司",
  119. customer_short_name="华尔泰",
  120. user_contract_name="安徽华尔泰股份有限公司-云栋(YD/X-JT20260731003)",
  121. )
  122. assert name == "华尔泰-云栋(YD/X-JT20260731003)"
  123. def test_generate_renewal_name_is_preserved():
  124. name = generate_contract_name(
  125. "YD/X-JT20260804001",
  126. party_a="安徽华尔泰股份有限公司",
  127. party_b="安徽云栋化工有限公司",
  128. supplier_name="安徽云栋化工有限公司",
  129. supplier_short_name="云栋",
  130. customer_name="安徽华尔泰股份有限公司",
  131. customer_short_name="华尔泰",
  132. user_contract_name="华尔泰-云栋(YD/X-JT20260731003)-续签1",
  133. )
  134. assert name == "华尔泰-云栋(YD/X-JT20260731003)-续签1(YD/X-JT20260804001)"
  135. def test_generate_fallback_when_parties_blank():
  136. name = generate_contract_name(
  137. "SX/X-JT20260804001",
  138. party_a="",
  139. party_b="",
  140. supplier_short_name="山峡",
  141. customer_short_name="辉隆",
  142. user_contract_name="",
  143. )
  144. assert name == "合同(SX/X-JT20260804001)"