diff --git a/.changeset/leads-help-import-owner.md b/.changeset/leads-help-import-owner.md new file mode 100644 index 00000000..9575a6d4 --- /dev/null +++ b/.changeset/leads-help-import-owner.md @@ -0,0 +1,8 @@ +--- +"hotcrm": patch +--- + +Clause-②: no +Metadata-protocol: none + +**The Leads help page no longer says imported leads are spread across the sales reps (#2360).** It listed CSV import and API capture among the ways a lead arrives without an owner and is round-robined to the least-loaded rep. Measured on ObjectStack 18.2.0, only a web-to-lead form submission arrives ownerless and reaches the round-robin. A lead created in the UI, sent through the API under a sign-in or API key, or imported from a file is owned by the person who put it in. For an import that is the person who ran it. The English and Chinese pages now say so, and they link the Admin Manual's *Importing Data* page, which already described this. Lead assignment itself is unchanged. diff --git a/src/docs/crm_sales_leads.md b/src/docs/crm_sales_leads.md index a02af970..689a09b7 100644 --- a/src/docs/crm_sales_leads.md +++ b/src/docs/crm_sales_leads.md @@ -29,11 +29,17 @@ automatically: **Lead Score** is the 1–5 star field on each lead (shown as *Lead Score* in the UI). A score of 4★ or more marks the lead "hot" and triggers the 1-day SLA. -A lead created without an owner (web-to-lead, CSV import, API capture) is -**auto-assigned to the sales rep with the fewest open leads** — a self-balancing -round-robin over everyone holding the *Sales Rep* position. Leads created in the -UI keep their creator as owner. Only when no rep pool exists yet does a lead -stay ownerless for a manager to claim. +A lead submitted through a web-to-lead form arrives with nobody behind it, so +it is **auto-assigned to the sales rep with the fewest open leads** — a +self-balancing round-robin over everyone holding the *Sales Rep* position. Only +when no rep pool exists yet does such a lead stay ownerless for a manager to +claim. + +A lead that a person puts in keeps that person as owner: one created in the UI, +one sent through the API under their sign-in or API key, and one imported from +a file. A file import never goes to the round-robin — a row with a blank owner +is owned by whoever ran the import, and the leads can be reassigned afterwards +(see the administrator's [Importing Data](./crm_admin_data_import.md) page). ## Lead status diff --git a/src/docs/crm_sales_leads.zh.md b/src/docs/crm_sales_leads.zh.md index c8d43b8d..2d3f6f0e 100644 --- a/src/docs/crm_sales_leads.zh.md +++ b/src/docs/crm_sales_leads.zh.md @@ -18,7 +18,9 @@ description: 新线索如何获得跟进期限和负责人,以及转化一条 **线索评分**是每条线索上的 1–5 星字段(界面上显示为*线索评分*)。4★ 或以上即视为"热线索",触发 1 天的 SLA。 -没有负责人的线索(网页转线索、CSV 导入、API 采集)会**自动分配给名下未结线索最少的销售代表**——在所有持有*销售代表*岗位的人之间自我均衡地轮询。在界面里创建的线索保留创建人为负责人。只有在还没有任何销售代表时,线索才会暂时无人负责,等待经理认领。 +通过网页表单提交的线索(网页转线索)背后没有具体的人,所以会**自动分配给名下未结线索最少的销售代表**——在所有持有*销售代表*岗位的人之间自我均衡地轮询。只有在还没有任何销售代表时,这类线索才会暂时无人负责,等待经理认领。 + +由某个人录入的线索以这个人为负责人:在界面里创建的、用本人登录或 API 密钥通过 API 提交的、以及从文件导入的都是如此。文件导入从不进入轮询——负责人留空的行归执行导入的人所有,之后可以再重新分配(见管理员的[导入数据](./crm_admin_data_import.md)页面)。 ## 线索状态 diff --git a/src/sales/objects/task.hook.ts b/src/sales/objects/task.hook.ts index 6c02a2f0..f1a5be21 100644 --- a/src/sales/objects/task.hook.ts +++ b/src/sales/objects/task.hook.ts @@ -7,7 +7,7 @@ import type { HookApi } from './_hook-api'; * Task lifecycle hook. * * - On `completed` transition, stamps `completed_date` and `progress_percent=100`. - * - Warns when `reminder_date` is after `due_date`. + * - Refuses (`VALIDATION_FAILED` / 400) when `reminder_date` is after `due_date`. * - Bubbles activity to the polymorphic parent (account `last_activity_date`, * lead `last_contacted_date`). * - Refuses to SCHEDULE a phone touch against a person flagged `do_not_call`