Repository navigation
docs(quotes, approvals): describe the status edits that exist instead of buttons the app lacks - #2028
Merged
objectstack-fleet[bot] merged 1 commit intoOct 8, 2026
Conversation
… 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>
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
This was referenced Oct 8, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 4939on 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.admin@objectos.aina.rep@objectos.ai(positionssales_rep,na_sales_team) on a quote under an account the rep createdGET /api/v1/meta/actionserves 22 actions and none of them is oncrm_quote. In source, nosrc/*/actions/action carriesobjectName: 'crm_quote', andsend_to_customerdoes not occur insrc/at all.mark_rejectedoccurs only as a node id in three approval flows.role=listoflistitemspans withcursor: autoand no click handler.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).payment_termsnet_60, description Auto-drafted from accepted quote QTE-0003 - …. The opportunity moved from qualification to closed_won, with close date today and win reasonquote_accepted. A laterPATCH {"status":"rejected"}answered 409RECORD_LOCKED: … is accepted; only internal_notes may be edited. Attempted: status.sys_email_templaterows includecrm.quote_createdin four locales (en-US label Quote Created). There is no PDF, cover or quote-document template.src/revenue/email-templates/*authors onlycrm.contract_expired,crm.contract_renewalandcrm.quote_created.Before → after
sales/quotesSending a quote to the customer (en:109, zh-Hans:106, zh-Hant:108)quote.object.tscrm_contact.requiredWhen; no hook or flow keys onpresented;contact.actions.tssend_email;email-drafting.skill.ts:111-116, zh-Hans:108-113, zh-Hant:110-115)quote.hook.tsquote_on_acceptedand thequote_workflowfreeze; measured above:152)quote-generation.flow.ts:159)src/revenue/email-templates/*; servedsys_email_templaterowsrevenue/approvals(en:35)approval_statusflips to pending (shown as In Approval)opportunity.object.tsapproval_statusoptions; en packpending: '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-customerand#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)
na.repthe quote's Attachments tab says You don't have access to these attachments., andGET /api/v1/data/sys_attachmentanswers 403PERMISSION_DENIED./api/v1/auth/me/permissionsshows nosys_attachmentgrant. That conflicts with Generating a quote's "attaches the quote document (a PDF) to the quote" and with theenable.filesnote insrc/sales/objects/index.ts("enabling files needs no new permission-set grant"). The admin gets an Upload control.pnpm demo:staffstops at step 3. It fails withPOST /api/v1/data/crm_account/query → 400: Invalid query request, becausescripts/demo-staff.tssendsfilters: []and the server answersquery.filters min_items. The two back-fill scripts were corrected for the same request shape inscripts/backfill-line-number.tsandscripts/backfill-owner-id.tsfail on 17.6.0 before writing anything: the query door refuses their request bodies (filters: []andsort: 'id asc') #1999. I staffed the measurement by hand.quote_expirationwas not bound becauseOS_AUTOMATION_SCHEDULED_WORK_ENABLEDis unset; Administration › Automation documents that switch. I left the sweep sentences as they were, because the app does have the flow.crm.*sys_email_templaterows fromsrc/*/email-templates/(/docs/guides/email-and-calendar, en and zh-Hans).Gates
pnpm verifyatd9c96814(git rev-parse --short HEAD; the log printsVERIFY-HEAD=d9c96814), run under the shared lock. Result:os-verify-lock: VERDICT command-exit 0. Within it: validate✓ Validation passed, lint:i18n-gate0 i18n/missing-* issues, hygiene✓ source hygiene clean, build✓ Build complete, and testTest 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-consistencyanddocs-view-rosters.pnpm changeset status --since=origin/mainexits 0. The changeset has empty frontmatter because the change is docs only.docs-app.ymlbuild (apps/docs, its own lockfile,types:check+next build). Reason: it is a separate package build that CI runs oncontent/docs/**. It is left to CI as a declared narrowing.Generated by Claude Code