Skip to content

docs(quotes, approvals): describe the status edits that exist instead of buttons the app lacks - #2028

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-2024-quotes-approvals-docs
Oct 8, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-2024-quotes-approvals-docs

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #2024
Clause-②: no

The Quotes page, in all three locales, named a Send to Customer button, Mark Accepted / Mark Rejected buttons and a quote PDF template. The app has none of them. The Approvals page (en) said the pending status shows as In Approval, a label the field does not have. This PR rewrites those sentences so they describe the path that does exist. It was measured first on a seeded install, as the dispatch asked. It changes no src/** file: the app is right and the pages were wrong.

Measurement (seeded install, base 17e91ba6)

I started objectstack dev --ui --no-watch --no-compile --seed-admin -p 4939 on a scratch SQLite file and drove the console with Playwright Chromium (/opt/pw-browsers/chromium). The quote record route is /_console/apps/app.objectstack.hotcrm/crm_quote/record/ID.

persona quote header controls More actions menu
admin@objectos.ai QTE-0005 (draft), QTE-0003 (presented) Copy record ID, Add to favorites, Edit, More actions, Refresh Share, Delete
na.rep@objectos.ai (positions sales_rep, na_sales_team) on a quote under an account the rep created QTE-0007 (draft) Edit, More actions, Refresh Share
  • No status buttons and no quote actions. GET /api/v1/meta/action serves 22 actions and none of them is on crm_quote. In source, no src/*/actions/ action carries objectName: 'crm_quote', and send_to_customer does not occur in src/ at all. mark_rejected occurs only as a node id in three approval flows.
  • The status bar is display only. The Draft to Expired bar is a role=list of listitem spans with cursor: auto and no click handler.
  • Edit is the real path. Edit opens Edit Quote. Its Status select offers Draft, In Review, Presented, Accepted, Rejected and Expired. Update sends PATCH /api/v1/data/crm_quote/ID {"status": …} and gets 200. I drove it as the admin (QTE-0003 set to accepted) and as the rep (QTE-0007 set to in_review).
  • What Accepted does (QTE-0003, through the dialog). It drafted contract CTR-0005: draft, subscription, 12 months, value 99970, payment_terms net_60, description Auto-drafted from accepted quote QTE-0003 - …. The opportunity moved from qualification to closed_won, with close date today and win reason quote_accepted. A later PATCH {"status":"rejected"} answered 409 RECORD_LOCKED: … is accepted; only internal_notes may be edited. Attempted: status.
  • What Rejected does (QTE-0004). No contract was drafted and the opportunity stage stayed at negotiation. A later rejected to draft edit, with a discount change, answered 200.
  • Templates. The served sys_email_template rows include crm.quote_created in four locales (en-US label Quote Created). There is no PDF, cover or quote-document template. src/revenue/email-templates/* authors only crm.contract_expired, crm.contract_renewal and crm.quote_created.
  • zh labels. In a zh-CN browser the console shows 编辑, an 编辑报价单 dialog, 状态 and 更新. A zh-TW browser gets the same Simplified strings as a fallback, so the zh-Hant page names Edit and Update in English (AGENTS.md, Documentation discipline rule 6). It names app-pack nouns in Traditional (狀態, 聯絡人, 發送郵件, 生成報價單, 內部備註), as the page's own standing sentence says.

Before → after

where before after matches
sales/quotes Sending a quote to the customer (en :109, zh-Hans :106, zh-Hant :108) click Send to Customer; it sets Presented and emails the PDF using a quote-cover-email template HotCRM does not send the quote. The rep sends the document, then uses Edit, sets Status to Presented and clicks Update. That save is refused without Contact and emails no one. The covering email goes through Send Email on the contact (typed by the rep, nothing attached, delivered only with outgoing mail). The AI assistant can draft it but does not send it record-page measurement above; quote.object.ts crm_contact.requiredWhen; no hook or flow keys on presented; contact.actions.ts send_email; email-drafting.skill.ts
Mark as Accepted / Rejected (en :111-116, zh-Hans :108-113, zh-Hant :110-115) two buttons, Mark Accepted and Mark Rejected renamed Recording the customer's answer, with the same Edit to Status to Update path. Accepted drafts the contract and close-wins the deal, then freezes the quote except Internal Notes. Rejected changes nothing else and the deal keeps its stage: re-draft the quote, or run Generate Quote again. The status bar is a display quote.hook.ts quote_on_accepted and the quote_workflow freeze; measured above
Tips for sales reps (en :152) Generate Quote "auto-fills everything" it fills in the account, primary contact, dates, payment terms and opening price, and the line items are the rep's to add Generating a quote on the same page (#2023); quote-generation.flow.ts
Tips for admins (en :159) the quote PDF template is stored in your email-template settings there is no quote PDF template. The app produces no quote document, and its one quote email template is Quote Created src/revenue/email-templates/*; served sys_email_template rows
revenue/approvals (en :35) approval_status flips to pending (shown as In Approval) (shown as Pending) opportunity.object.ts approval_status options; en pack pending: 'Pending'

The zh Approvals pages say 审批中 / 審批中, which matches the zh-CN pack (pending: '审批中'), so I left them as they were. The zh headings I touched now carry the English anchor ids #sending-a-quote-to-the-customer and #recording-the-customers-answer (rule 6). No page links into either section. I left § Generating a quote untouched, as the dispatch asked.

NOT MEASURED: AI cover-note drafting. Reason: there is no model in this container. The sentence follows the skill's declared behaviour (it drafts, cannot send, and points at Send Email). Delivery of Send Email was not measured either, because no outgoing mail is configured. The page states that condition.

Acceptance notes (found while measuring, not fixed here)

  • Reps cannot see or add attachments on a quote. As na.rep the quote's Attachments tab says You don't have access to these attachments., and GET /api/v1/data/sys_attachment answers 403 PERMISSION_DENIED. /api/v1/auth/me/permissions shows no sys_attachment grant. That conflicts with Generating a quote's "attaches the quote document (a PDF) to the quote" and with the enable.files note in src/sales/objects/index.ts ("enabling files needs no new permission-set grant"). The admin gets an Upload control.
  • pnpm demo:staff stops at step 3. It fails with POST /api/v1/data/crm_account/query → 400: Invalid query request, because scripts/demo-staff.ts sends filters: [] and the server answers query.filters min_items. The two back-fill scripts were corrected for the same request shape in scripts/backfill-line-number.ts and scripts/backfill-owner-id.ts fail on 17.6.0 before writing anything: the query door refuses their request bodies (filters: [] and sort: 'id asc') #1999. I staffed the measurement by hand.
  • zh Generating a quote names the button 生成报价 / 生成報價. The zh-CN pack and the zh Opportunities pages say 生成报价单 / 生成報價單. My new zh sentences use the pack wording.
  • The zh Quotes pages omit the Contact requirement. en Built-in rules has it as bullet 4 and en Tips for admins repeats it; neither zh page carries either. My zh Sending paragraph states the requirement inline instead of linking to a section that lacks it.
  • The nightly expiration sweep is stated without the deployment gate. It appears in What happens automatically, Standard list views and Tips for admins. On this boot quote_expiration was not bound because OS_AUTOMATION_SCHEDULED_WORK_ENABLED is unset; Administration › Automation documents that switch. I left the sweep sentences as they were, because the app does have the flow.
  • Email & Calendar says "this app authors no templates". The app ships crm.* sys_email_template rows from src/*/email-templates/ (/docs/guides/email-and-calendar, en and zh-Hans).

Gates

  • pnpm verify at d9c96814 (git rev-parse --short HEAD; the log prints VERIFY-HEAD=d9c96814), run under the shared lock. Result: os-verify-lock: VERDICT command-exit 0. Within it: validate ✓ Validation passed, lint:i18n-gate 0 i18n/missing-* issues, hygiene ✓ source hygiene clean, build ✓ Build complete, and test Test Files 172 passed (172) / Tests 3575 passed | 1 skipped (3576). The test run includes the docs guards that read these pages: docs-anchor-links, which also checks that every page parses as MDX, docs-object-term-consistency and docs-view-rosters.
  • pnpm changeset status --since=origin/main exits 0. The changeset has empty frontmatter because the change is docs only.
  • NOT MEASURED: the docs-app.yml build (apps/docs, its own lockfile, types:check + next build). Reason: it is a separate package build that CI runs on content/docs/**. It is left to CI as a declared narrowing.

Generated by Claude Code

… of buttons the app lacks

The Quotes page promised a Send to Customer button that emails a PDF
through a quote-cover template, Mark Accepted / Mark Rejected buttons, and
a quote PDF template in the email-template settings. None of them ships:
no action targets crm_quote, the app produces no quote document, and its
one quote email template is the Quote Created notification. Measured on a
seeded install, the quote record page offers Edit and a More actions menu
(Share, plus Delete for an admin); its status bar is display-only.

The sections after Generating a quote now say how a quote's status is
really changed (Edit, Status, Update), what each change does (Presented
needs a contact and emails no one; Accepted drafts the contract and
freezes the quote; Rejected changes nothing else), and that the covering
email goes through Send Email on the contact. The rep tip no longer says
Generate Quote fills in everything. Approvals (en) names the pending label
the app shows, Pending, not In Approval.

Claude-Session: https://claude.ai/code/session_012zh91QzFgePbkmuHnugLN3
Co-authored-by: Claude <noreply@anthropic.com>
@vercel

vercel Bot commented Oct 8, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
hotcrm Ignored Ignored Oct 8, 2026 4:36pm UTC

Request Review

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation

Projects

None yet

2 participants