@happyvertical/smrt-planner 0.0.2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (752) hide show
  1. package/README.md +81 -8
  2. package/app/404.html +42 -49
  3. package/app/_app/immutable/assets/0.BvXq1Svw.css +1 -0
  4. package/app/_app/immutable/assets/10.CdYxvH4G.css +1 -0
  5. package/app/_app/immutable/assets/11.nOT5Z4Fv.css +1 -0
  6. package/app/_app/immutable/assets/12.F7A7zP4J.css +1 -0
  7. package/app/_app/immutable/assets/13.JoySu8W5.css +1 -0
  8. package/app/_app/immutable/assets/14.nsp62-4b.css +1 -0
  9. package/app/_app/immutable/assets/2.CbPiqdz5.css +1 -0
  10. package/app/_app/immutable/assets/3.D518dbB5.css +1 -0
  11. package/app/_app/immutable/assets/4.B3vt1gMJ.css +1 -0
  12. package/app/_app/immutable/assets/AiSetup.4fXjMpTZ.css +1 -0
  13. package/app/_app/immutable/assets/AppShell.DKPbJFmw.css +1 -0
  14. package/app/_app/immutable/assets/ConnectTools.DTleL8YA.css +1 -0
  15. package/app/_app/immutable/assets/FieldMapForm.C8SZ3t4N.css +1 -0
  16. package/app/_app/immutable/assets/ModelPage.DzDhJQz3.css +1 -0
  17. package/app/_app/immutable/assets/SectionActions.BE1CPmxk.css +1 -0
  18. package/app/_app/immutable/assets/SectionIcons.BGFcFuOf.css +1 -0
  19. package/app/_app/immutable/assets/SegmentedControl.T_hJQXHk.css +1 -0
  20. package/app/_app/immutable/assets/app.BS7nbUi0.css +1 -0
  21. package/app/_app/immutable/assets/currency-metadata.CJIy0Dzm.css +1 -0
  22. package/app/_app/immutable/assets/data.DQcbQG_b.css +1 -0
  23. package/app/_app/immutable/assets/feedback.FjY5wqsa.css +1 -0
  24. package/app/_app/immutable/assets/forms.DA06CFM9.css +1 -0
  25. package/app/_app/immutable/assets/labels.Dny6zd23.css +1 -0
  26. package/app/_app/immutable/assets/percent.CBivq97O.css +1 -0
  27. package/app/_app/immutable/assets/state.C9Put0ur.css +1 -0
  28. package/app/_app/immutable/assets/webmcp-ui-context.CC5pQLNE.css +1 -0
  29. package/app/_app/immutable/assets/workspace.Dtoe2fRU.css +1 -0
  30. package/app/_app/immutable/chunks/3ouNUakh.js +1 -0
  31. package/app/_app/immutable/chunks/B3FAegW4.js +4 -0
  32. package/app/_app/immutable/chunks/B8iReL-r.js +1 -0
  33. package/app/_app/immutable/chunks/BCmdRE3j.js +4 -0
  34. package/app/_app/immutable/chunks/BV3NwM01.js +1 -0
  35. package/app/_app/immutable/chunks/BVicq_6F.js +1 -0
  36. package/app/_app/immutable/chunks/Ba1g71Sq.js +1 -0
  37. package/app/_app/immutable/chunks/BdjvgMW6.js +1 -0
  38. package/app/_app/immutable/chunks/BiO_bqNH.js +2 -0
  39. package/app/_app/immutable/chunks/{BnRri03M.js → BrorvU4B.js} +1 -1
  40. package/app/_app/immutable/chunks/By-QJdbA.js +980 -0
  41. package/app/_app/immutable/chunks/{CyUMm_Wp.js → BzITuwgY.js} +1 -1
  42. package/app/_app/immutable/chunks/BzMfoxBk.js +1 -0
  43. package/app/_app/immutable/chunks/C-AoRalq.js +1 -0
  44. package/app/_app/immutable/chunks/CGKL_Nlh.js +1 -0
  45. package/app/_app/immutable/chunks/CNj-_B0j.js +1 -0
  46. package/app/_app/immutable/chunks/CU8cbxOZ.js +1 -0
  47. package/app/_app/immutable/chunks/CZGhPAoL.js +2 -0
  48. package/app/_app/immutable/chunks/CaEdOwVf.js +1 -0
  49. package/app/_app/immutable/chunks/Cas1hq-y.js +1 -0
  50. package/app/_app/immutable/chunks/CfOMUCNN.js +1 -0
  51. package/app/_app/immutable/chunks/Cm0VMWZu.js +1 -0
  52. package/app/_app/immutable/chunks/CsmXMAyE.js +1 -0
  53. package/app/_app/immutable/chunks/{BWPhGFHl.js → D0FW0z6R.js} +1 -1
  54. package/app/_app/immutable/chunks/D3nyL-ZK.js +1 -0
  55. package/app/_app/immutable/chunks/DEe2Vsu9.js +1 -0
  56. package/app/_app/immutable/chunks/DTs3DOB0.js +10 -0
  57. package/app/_app/immutable/chunks/Dm6R8q7G.js +1 -0
  58. package/app/_app/immutable/chunks/Dreozana.js +1 -0
  59. package/app/_app/immutable/chunks/Dx8H44Wq.js +2 -0
  60. package/app/_app/immutable/chunks/DxR35SQx.js +24 -0
  61. package/app/_app/immutable/chunks/EcFojPiU.js +11 -0
  62. package/app/_app/immutable/chunks/JBS2nHGN.js +1 -0
  63. package/app/_app/immutable/chunks/TjbilXEg.js +1 -0
  64. package/app/_app/immutable/chunks/ZLqixH7j.js +9 -0
  65. package/app/_app/immutable/chunks/auwiz8v4.js +1 -0
  66. package/app/_app/immutable/chunks/dbZ3U29n.js +1 -0
  67. package/app/_app/immutable/chunks/{DkR8_Ws6.js → gHjidpzw.js} +2 -2
  68. package/app/_app/immutable/chunks/vNEnXNLV.js +3 -0
  69. package/app/_app/immutable/entry/app.vuScBcN4.js +2 -0
  70. package/app/_app/immutable/entry/start.C_vMied2.js +1 -0
  71. package/app/_app/immutable/nodes/0.BeNJfVow.js +9 -0
  72. package/app/_app/immutable/nodes/1.huiLmf4w.js +1 -0
  73. package/app/_app/immutable/nodes/10.B3buyRS-.js +3 -0
  74. package/app/_app/immutable/nodes/11.FNeDQehr.js +1 -0
  75. package/app/_app/immutable/nodes/12.umrKgKLQ.js +4 -0
  76. package/app/_app/immutable/nodes/13.DFr7i0IY.js +1 -0
  77. package/app/_app/immutable/nodes/14.BNgJ8cEq.js +1 -0
  78. package/app/_app/immutable/nodes/2.B3v0JtfB.js +24 -0
  79. package/app/_app/immutable/nodes/3.FLW3AkwU.js +1 -0
  80. package/app/_app/immutable/nodes/4.50B7EkB9.js +1 -0
  81. package/app/_app/immutable/nodes/5.Din7W_Et.js +1 -0
  82. package/app/_app/immutable/nodes/6.7dOUE7nr.js +1 -0
  83. package/app/_app/immutable/nodes/7.C4XsW0qI.js +1 -0
  84. package/app/_app/immutable/nodes/8.D_MREd8V.js +1 -0
  85. package/app/_app/immutable/nodes/9.cn87hhI-.js +1 -0
  86. package/app/_app/version.json +1 -1
  87. package/app/advanced-styles/index.html +84 -0
  88. package/app/ai/index.html +60 -52
  89. package/app/blueprint/index.html +46 -53
  90. package/app/cookbook/index.html +46 -53
  91. package/app/index.html +92 -64
  92. package/app/m/ads/AdDeliveryTier/index.html +52 -59
  93. package/app/m/ads/AdEvent/index.html +52 -59
  94. package/app/m/ads/AdFormat/index.html +52 -59
  95. package/app/m/ads/AdGroup/index.html +52 -59
  96. package/app/m/ads/AdVariation/index.html +52 -59
  97. package/app/m/analytics/AnalyticsDataStream/index.html +52 -59
  98. package/app/m/analytics/AnalyticsEvent/index.html +52 -59
  99. package/app/m/analytics/AnalyticsProperty/index.html +52 -59
  100. package/app/m/analytics/AnalyticsReport/index.html +52 -59
  101. package/app/m/approvals/ApprovalEvent/index.html +52 -59
  102. package/app/m/approvals/ApprovalPolicy/index.html +52 -59
  103. package/app/m/approvals/ApprovalRequest/index.html +52 -59
  104. package/app/m/assets/Asset/attachments/index.html +91 -0
  105. package/app/m/assets/Asset/index.html +52 -59
  106. package/app/m/assets/AssetAssociation/index.html +53 -60
  107. package/app/m/assets/AssetMetafield/index.html +52 -59
  108. package/app/m/assets/AssetStatus/index.html +52 -59
  109. package/app/m/assets/AssetType/index.html +52 -59
  110. package/app/m/assets/Folder/index.html +52 -59
  111. package/app/m/chat/AgentSession/index.html +52 -59
  112. package/app/m/chat/ChatMessage/index.html +53 -60
  113. package/app/m/chat/ChatParticipant/index.html +53 -60
  114. package/app/m/chat/ChatReaction/index.html +52 -59
  115. package/app/m/chat/ChatRoom/index.html +52 -59
  116. package/app/m/chat/ChatThread/index.html +53 -60
  117. package/app/m/chat/VoiceGatewayTurn/index.html +52 -59
  118. package/app/m/chat/VoiceSession/index.html +52 -59
  119. package/app/m/commerce/Agreement/index.html +52 -59
  120. package/app/m/commerce/Cart/index.html +52 -59
  121. package/app/m/commerce/Contract/index.html +52 -59
  122. package/app/m/commerce/ContractLineItem/index.html +53 -60
  123. package/app/m/commerce/Customer/index.html +52 -59
  124. package/app/m/commerce/DocumentTax/index.html +89 -0
  125. package/app/m/commerce/Estimate/index.html +52 -59
  126. package/app/m/commerce/Fulfillment/index.html +52 -59
  127. package/app/m/commerce/FulfillmentLineItem/index.html +53 -60
  128. package/app/m/commerce/Invoice/index.html +52 -59
  129. package/app/m/commerce/InvoiceLineItem/index.html +53 -60
  130. package/app/m/commerce/Lease/index.html +52 -59
  131. package/app/m/commerce/LicenseSale/index.html +52 -59
  132. package/app/m/commerce/Order/index.html +52 -59
  133. package/app/m/commerce/Payment/index.html +52 -59
  134. package/app/m/commerce/PaymentAllocation/index.html +53 -60
  135. package/app/m/commerce/PaymentInstrument/index.html +52 -59
  136. package/app/m/commerce/PaymentIntent/index.html +52 -59
  137. package/app/m/commerce/Payout/index.html +52 -59
  138. package/app/m/commerce/ProductionOrder/index.html +52 -59
  139. package/app/m/commerce/PurchaseContract/index.html +89 -0
  140. package/app/m/commerce/PurchaseOrder/index.html +52 -59
  141. package/app/m/commerce/SalesContract/index.html +89 -0
  142. package/app/m/commerce/SupplierQuote/index.html +89 -0
  143. package/app/m/commerce/TaxCode/index.html +89 -0
  144. package/app/m/commerce/TaxComponent/index.html +89 -0
  145. package/app/m/commerce/TaxSettings/index.html +89 -0
  146. package/app/m/commerce/TaxSummaryReport/index.html +89 -0
  147. package/app/m/commerce/Vendor/index.html +52 -59
  148. package/app/m/commerce/WholesaleOrder/index.html +52 -59
  149. package/app/m/content/Content/index.html +52 -59
  150. package/app/m/content/ContentContribution/index.html +52 -59
  151. package/app/m/content/ContentContributionAttachment/index.html +52 -59
  152. package/app/m/content/ContentContributionRevision/index.html +52 -59
  153. package/app/m/content/ContentContributionType/index.html +52 -59
  154. package/app/m/content/ContentContributor/index.html +52 -59
  155. package/app/m/content/ContentCorrection/index.html +52 -59
  156. package/app/m/content/ContentFeedSource/index.html +52 -59
  157. package/app/m/content/ContentGovernanceAssignment/index.html +52 -59
  158. package/app/m/content/ContentGovernancePolicy/index.html +52 -59
  159. package/app/m/content/ContentGovernanceProfile/index.html +52 -59
  160. package/app/m/content/ContentReference/index.html +52 -59
  161. package/app/m/content/ContentReview/index.html +52 -59
  162. package/app/m/content/ContentVersion/index.html +52 -59
  163. package/app/m/events/Event/index.html +52 -59
  164. package/app/m/events/EventParticipant/index.html +53 -60
  165. package/app/m/events/EventSeries/index.html +52 -59
  166. package/app/m/events/EventType/index.html +52 -59
  167. package/app/m/expenses/Expense/index.html +89 -0
  168. package/app/m/facts/Fact/index.html +52 -59
  169. package/app/m/facts/FactContent/index.html +52 -59
  170. package/app/m/facts/FactEvidence/index.html +52 -59
  171. package/app/m/facts/FactSource/index.html +52 -59
  172. package/app/m/facts/FactSubject/index.html +52 -59
  173. package/app/m/facts/FactTag/index.html +52 -59
  174. package/app/m/fields/FieldPolicy/index.html +52 -59
  175. package/app/m/fields/FieldPolicySuggestion/index.html +52 -59
  176. package/app/m/fields/FieldUsageCounter/index.html +52 -59
  177. package/app/m/images/Image/index.html +52 -59
  178. package/app/m/inventory/InventoryLocation/index.html +52 -59
  179. package/app/m/inventory/StockLevel/index.html +52 -59
  180. package/app/m/inventory/StockMovement/index.html +52 -59
  181. package/app/m/ledgers/Account/index.html +52 -59
  182. package/app/m/ledgers/Journal/index.html +52 -59
  183. package/app/m/ledgers/JournalEntry/index.html +53 -60
  184. package/app/m/manufacturing/Assembly/index.html +52 -59
  185. package/app/m/manufacturing/BillOfMaterials/index.html +52 -59
  186. package/app/m/manufacturing/BomLine/index.html +52 -59
  187. package/app/m/manufacturing/Operation/index.html +52 -59
  188. package/app/m/manufacturing/ProductionRun/index.html +52 -59
  189. package/app/m/manufacturing/ProductionRunCompletion/index.html +52 -59
  190. package/app/m/manufacturing/RoutingStep/index.html +52 -59
  191. package/app/m/marketing/Campaign/index.html +52 -59
  192. package/app/m/marketing/CampaignChannel/index.html +52 -59
  193. package/app/m/marketing/CampaignMetricSnapshot/index.html +52 -59
  194. package/app/m/messages/Account/index.html +52 -59
  195. package/app/m/messages/Attachment/index.html +52 -59
  196. package/app/m/messages/Blacklist/index.html +52 -59
  197. package/app/m/messages/Email/failed-sends/index.html +54 -59
  198. package/app/m/messages/Email/index.html +52 -59
  199. package/app/m/messages/Email/mailbox/index.html +54 -59
  200. package/app/m/messages/EmailAccount/index.html +52 -59
  201. package/app/m/messages/EmailAttachment/index.html +89 -0
  202. package/app/m/messages/EmailFolder/index.html +52 -59
  203. package/app/m/messages/Message/index.html +52 -59
  204. package/app/m/messages/MessagingEndpoint/index.html +52 -59
  205. package/app/m/messages/PersonaMessageRoute/index.html +52 -59
  206. package/app/m/messages/SlackAccount/index.html +52 -59
  207. package/app/m/messages/SlackMessage/index.html +52 -59
  208. package/app/m/messages/TelegramAccount/index.html +52 -59
  209. package/app/m/messages/Tweet/index.html +52 -59
  210. package/app/m/messages/TwitterAccount/index.html +52 -59
  211. package/app/m/messages/Whitelist/index.html +52 -59
  212. package/app/m/messages/ZulipAccount/index.html +52 -59
  213. package/app/m/places/Place/index.html +52 -59
  214. package/app/m/places/PlaceType/index.html +52 -59
  215. package/app/m/products/Category/index.html +52 -59
  216. package/app/m/products/Material/index.html +52 -59
  217. package/app/m/products/Product/index.html +52 -59
  218. package/app/m/products/Product/ingredients/index.html +54 -59
  219. package/app/m/products/ProductVariant/index.html +53 -60
  220. package/app/m/products/Sku/index.html +53 -60
  221. package/app/m/profiles/ApiKey/index.html +52 -59
  222. package/app/m/profiles/Bot/index.html +52 -59
  223. package/app/m/profiles/MagicLinkToken/index.html +52 -59
  224. package/app/m/profiles/NostrIdentity/index.html +52 -59
  225. package/app/m/profiles/OidcIdentity/index.html +52 -59
  226. package/app/m/profiles/Organization/index.html +52 -59
  227. package/app/m/profiles/Person/index.html +52 -59
  228. package/app/m/profiles/Profile/index.html +52 -59
  229. package/app/m/profiles/ProfileMetadata/index.html +52 -59
  230. package/app/m/profiles/ProfileMetafield/index.html +52 -59
  231. package/app/m/profiles/ProfileRelationship/index.html +52 -59
  232. package/app/m/profiles/ProfileRelationshipTerm/index.html +52 -59
  233. package/app/m/profiles/ProfileRelationshipType/index.html +52 -59
  234. package/app/m/profiles/ProfileType/index.html +52 -59
  235. package/app/m/projects/Comment/index.html +53 -60
  236. package/app/m/projects/Issue/index.html +52 -59
  237. package/app/m/projects/Label/index.html +52 -59
  238. package/app/m/projects/Project/index.html +52 -59
  239. package/app/m/projects/ProjectIntegration/index.html +52 -59
  240. package/app/m/projects/PullRequest/index.html +52 -59
  241. package/app/m/projects/Repository/index.html +52 -59
  242. package/app/m/properties/Property/index.html +52 -59
  243. package/app/m/properties/Zone/index.html +52 -59
  244. package/app/m/reports/RuntimeReport/index.html +52 -59
  245. package/app/m/reports/SmrtPrincipalReportRefreshTask/index.html +52 -59
  246. package/app/m/reports/SmrtReportLock/index.html +52 -59
  247. package/app/m/reports/SmrtReportRefreshTask/index.html +52 -59
  248. package/app/m/reports/SmrtReportRun/index.html +52 -59
  249. package/app/m/reports/SmrtReportSchedule/index.html +52 -59
  250. package/app/m/reports/SmrtReportWatermark/index.html +52 -59
  251. package/app/m/sales/AttributionException/index.html +52 -59
  252. package/app/m/sales/AttributionPolicy/index.html +52 -59
  253. package/app/m/sales/Commission/index.html +52 -59
  254. package/app/m/sales/CommissionAdjustment/index.html +52 -59
  255. package/app/m/sales/CommissionPayout/index.html +52 -59
  256. package/app/m/sales/CommissionPlan/index.html +52 -59
  257. package/app/m/sales/Earner/index.html +52 -59
  258. package/app/m/sales/EarnerSourceAttribution/index.html +52 -59
  259. package/app/m/sales/EarningEvent/index.html +52 -59
  260. package/app/m/sales/ExecutedAgreement/index.html +52 -59
  261. package/app/m/sales/Lead/index.html +52 -59
  262. package/app/m/sales/Opportunity/index.html +52 -59
  263. package/app/m/sales/OpportunityConversion/index.html +52 -59
  264. package/app/m/sales/PipelineDefinition/index.html +52 -59
  265. package/app/m/sales/PipelineStage/index.html +53 -60
  266. package/app/m/sales/Referral/index.html +52 -59
  267. package/app/m/sales/ReferralAgreement/index.html +52 -59
  268. package/app/m/sales/ReferralLink/index.html +52 -59
  269. package/app/m/sales/ReferralProgram/index.html +52 -59
  270. package/app/m/sales/ReferralTermSnapshot/index.html +52 -59
  271. package/app/m/sales/ReferralTouch/index.html +52 -59
  272. package/app/m/sales/Referrer/index.html +52 -59
  273. package/app/m/sales/SalesActivity/index.html +52 -59
  274. package/app/m/sales/SalesRepresentative/index.html +52 -59
  275. package/app/m/sites/Site/index.html +52 -59
  276. package/app/m/sites/SiteAgentBinding/index.html +52 -59
  277. package/app/m/social/OAuthState/index.html +52 -59
  278. package/app/m/social/SocialAccount/index.html +52 -59
  279. package/app/m/social/SocialPost/index.html +52 -59
  280. package/app/m/social/SocialPostAnalyticsSnapshot/index.html +52 -59
  281. package/app/m/subscriptions/BillingAdjustment/index.html +52 -59
  282. package/app/m/subscriptions/ClientCharge/index.html +52 -59
  283. package/app/m/subscriptions/CreditGrant/index.html +52 -59
  284. package/app/m/subscriptions/PricingRule/index.html +52 -59
  285. package/app/m/subscriptions/RetailCharge/index.html +52 -59
  286. package/app/m/subscriptions/SpendingPolicy/index.html +52 -59
  287. package/app/m/subscriptions/SubscriptionPlan/index.html +52 -59
  288. package/app/m/subscriptions/TenantSubscription/index.html +52 -59
  289. package/app/m/subscriptions/TenantUsageMetric/index.html +52 -59
  290. package/app/m/support/ServiceTimeEntry/index.html +52 -59
  291. package/app/m/support/SupportAiRun/index.html +52 -59
  292. package/app/m/support/SupportAvailability/index.html +52 -59
  293. package/app/m/support/SupportCase/index.html +52 -59
  294. package/app/m/support/SupportCaseEvent/index.html +52 -59
  295. package/app/m/support/SupportChannelBinding/index.html +52 -59
  296. package/app/m/support/SupportCharge/index.html +52 -59
  297. package/app/m/support/SupportCompensation/index.html +52 -59
  298. package/app/m/support/SupportCompensationPlan/index.html +52 -59
  299. package/app/m/support/SupportEscalation/index.html +52 -59
  300. package/app/m/support/SupportInteraction/index.html +52 -59
  301. package/app/m/support/SupportPlan/index.html +52 -59
  302. package/app/m/support/SupportPolicy/index.html +52 -59
  303. package/app/m/support/SupportQualification/index.html +52 -59
  304. package/app/m/support/SupportServiceTarget/index.html +52 -59
  305. package/app/m/support/SupportSpecialist/index.html +52 -59
  306. package/app/m/support/SupportWorkLink/index.html +52 -59
  307. package/app/m/tags/Tag/index.html +52 -59
  308. package/app/m/tags/TagAlias/index.html +52 -59
  309. package/app/m/timesheets/AttendanceBreak/index.html +52 -59
  310. package/app/m/timesheets/AttendancePunch/index.html +52 -59
  311. package/app/m/timesheets/AttendanceSegment/index.html +89 -0
  312. package/app/m/timesheets/ServiceChargeSnapshot/index.html +52 -59
  313. package/app/m/timesheets/ServiceCompensationSnapshot/index.html +52 -59
  314. package/app/m/timesheets/ServiceTimeEntry/index.html +52 -59
  315. package/app/m/users/Group/index.html +52 -59
  316. package/app/m/users/GroupMember/index.html +52 -59
  317. package/app/m/users/GroupRole/index.html +52 -59
  318. package/app/m/users/Membership/index.html +53 -60
  319. package/app/m/users/MembershipOverride/index.html +52 -59
  320. package/app/m/users/Permission/index.html +52 -59
  321. package/app/m/users/Role/index.html +52 -59
  322. package/app/m/users/RolePermission/index.html +52 -59
  323. package/app/m/users/Session/index.html +52 -59
  324. package/app/m/users/Tenant/index.html +52 -59
  325. package/app/m/users/TenantIntegration/index.html +52 -59
  326. package/app/m/users/TenantPermissionOverride/index.html +52 -59
  327. package/app/m/users/User/index.html +52 -59
  328. package/app/m/video/Character/index.html +52 -59
  329. package/app/m/video/CharacterAsset/index.html +52 -59
  330. package/app/m/video/CompositeJob/index.html +52 -59
  331. package/app/m/video/Performer/index.html +52 -59
  332. package/app/m/video/PerformerAsset/index.html +52 -59
  333. package/app/m/video/Scene/index.html +52 -59
  334. package/app/m/video/SceneAsset/index.html +52 -59
  335. package/app/m/video/VideoComposition/index.html +52 -59
  336. package/app/m/video/VideoCompositionAsset/index.html +52 -59
  337. package/app/m/video/VideoSequence/index.html +52 -59
  338. package/app/m/video/VideoSequenceAsset/index.html +52 -59
  339. package/app/m/video/VideoShot/index.html +52 -59
  340. package/app/m/video/VideoShotAsset/index.html +52 -59
  341. package/app/m/video/VideoShotCharacter/index.html +52 -59
  342. package/app/m/video/VideoWorkflow/index.html +52 -59
  343. package/app/m/voice/VoiceOutput/index.html +52 -59
  344. package/app/m/voice/VoiceProfile/index.html +52 -59
  345. package/app/m/voice/VoiceSample/index.html +52 -59
  346. package/app/packages/ads/index.html +50 -57
  347. package/app/packages/analytics/index.html +50 -57
  348. package/app/packages/approvals/index.html +50 -57
  349. package/app/packages/assets/index.html +50 -57
  350. package/app/packages/chat/index.html +50 -57
  351. package/app/packages/comments/index.html +50 -57
  352. package/app/packages/commerce/index.html +50 -57
  353. package/app/packages/content/index.html +50 -57
  354. package/app/packages/events/index.html +50 -57
  355. package/app/packages/expenses/index.html +50 -57
  356. package/app/packages/facts/index.html +50 -57
  357. package/app/packages/fields/index.html +50 -57
  358. package/app/packages/human-resources/index.html +50 -57
  359. package/app/packages/images/index.html +50 -57
  360. package/app/packages/index.html +49 -55
  361. package/app/packages/ingestion/index.html +85 -0
  362. package/app/packages/inventory/index.html +50 -57
  363. package/app/packages/ledgers/index.html +50 -57
  364. package/app/packages/manufacturing/index.html +50 -57
  365. package/app/packages/marketing/index.html +50 -57
  366. package/app/packages/messages/index.html +50 -57
  367. package/app/packages/places/index.html +50 -57
  368. package/app/packages/preferences/index.html +50 -57
  369. package/app/packages/products/index.html +50 -57
  370. package/app/packages/profiles/index.html +50 -57
  371. package/app/packages/projects/index.html +50 -57
  372. package/app/packages/properties/index.html +50 -57
  373. package/app/packages/reports/index.html +50 -57
  374. package/app/packages/sales/index.html +50 -57
  375. package/app/packages/sites/index.html +50 -57
  376. package/app/packages/social/index.html +50 -57
  377. package/app/packages/subscriptions/index.html +50 -57
  378. package/app/packages/support/index.html +50 -57
  379. package/app/packages/tags/index.html +50 -57
  380. package/app/packages/timesheets/index.html +50 -57
  381. package/app/packages/users/index.html +50 -57
  382. package/app/packages/video/index.html +50 -57
  383. package/app/packages/voice/index.html +50 -57
  384. package/app/packages/webhooks/index.html +85 -0
  385. package/app/recipes/account-access/help/index.html +52 -57
  386. package/app/recipes/account-access/index.html +57 -59
  387. package/app/recipes/activity/help/index.html +52 -57
  388. package/app/recipes/activity/index.html +57 -59
  389. package/app/recipes/agreements/help/index.html +52 -57
  390. package/app/recipes/agreements/index.html +57 -59
  391. package/app/recipes/analytics.reports/help/index.html +52 -57
  392. package/app/recipes/analytics.reports/index.html +57 -59
  393. package/app/recipes/assets/help/index.html +52 -57
  394. package/app/recipes/assets/index.html +57 -59
  395. package/app/recipes/billing/help/index.html +52 -57
  396. package/app/recipes/billing/index.html +57 -59
  397. package/app/recipes/chat.assistant/help/index.html +52 -57
  398. package/app/recipes/chat.assistant/index.html +57 -59
  399. package/app/recipes/comments/help/index.html +52 -57
  400. package/app/recipes/comments/index.html +57 -59
  401. package/app/recipes/commerce.customers/help/index.html +52 -57
  402. package/app/recipes/commerce.customers/index.html +57 -59
  403. package/app/recipes/commerce.estimates/help/index.html +52 -57
  404. package/app/recipes/commerce.estimates/index.html +57 -59
  405. package/app/recipes/commerce.purchases/help/index.html +52 -57
  406. package/app/recipes/commerce.purchases/index.html +57 -59
  407. package/app/recipes/commerce.sales/help/index.html +52 -57
  408. package/app/recipes/commerce.sales/index.html +57 -59
  409. package/app/recipes/commerce.vendors/help/index.html +52 -57
  410. package/app/recipes/commerce.vendors/index.html +57 -59
  411. package/app/recipes/commerce.wholesale/help/index.html +52 -57
  412. package/app/recipes/commerce.wholesale/index.html +57 -59
  413. package/app/recipes/events.calendar/help/index.html +52 -57
  414. package/app/recipes/events.calendar/index.html +57 -59
  415. package/app/recipes/expenses.tracking/help/index.html +88 -0
  416. package/app/recipes/expenses.tracking/index.html +92 -0
  417. package/app/recipes/fields.form-customization/help/index.html +52 -57
  418. package/app/recipes/fields.form-customization/index.html +57 -59
  419. package/app/recipes/ingestion/help/index.html +88 -0
  420. package/app/recipes/ingestion/index.html +93 -0
  421. package/app/recipes/integrations/help/index.html +88 -0
  422. package/app/recipes/integrations/index.html +92 -0
  423. package/app/recipes/inventory.stock/help/index.html +52 -57
  424. package/app/recipes/inventory.stock/index.html +57 -59
  425. package/app/recipes/ledgers.bookkeeping/help/index.html +52 -57
  426. package/app/recipes/ledgers.bookkeeping/index.html +57 -59
  427. package/app/recipes/messages/help/index.html +52 -57
  428. package/app/recipes/messages/index.html +57 -59
  429. package/app/recipes/products/help/index.html +52 -57
  430. package/app/recipes/products/index.html +57 -59
  431. package/app/recipes/projects.tracker/help/index.html +52 -57
  432. package/app/recipes/projects.tracker/index.html +57 -59
  433. package/app/recipes/reports.materialized/help/index.html +52 -57
  434. package/app/recipes/reports.materialized/index.html +57 -59
  435. package/app/recipes/reports.runtime/help/index.html +88 -0
  436. package/app/recipes/reports.runtime/index.html +92 -0
  437. package/app/recipes/sales.pipeline/help/index.html +52 -57
  438. package/app/recipes/sales.pipeline/index.html +57 -59
  439. package/app/recipes/tags.taxonomy/help/index.html +52 -57
  440. package/app/recipes/tags.taxonomy/index.html +57 -59
  441. package/app/recipes/team-collaboration/help/index.html +52 -57
  442. package/app/recipes/team-collaboration/index.html +57 -59
  443. package/app/recipes/timesheets.time-entries/help/index.html +88 -0
  444. package/app/recipes/timesheets.time-entries/index.html +92 -0
  445. package/app/s/custom-accounts/index.html +82 -0
  446. package/app/s/custom-appointments/index.html +82 -0
  447. package/app/s/custom-billing/index.html +47 -54
  448. package/app/s/custom-buying/index.html +47 -54
  449. package/app/s/custom-checkout/index.html +82 -0
  450. package/app/s/custom-classes/index.html +47 -54
  451. package/app/s/custom-clients/index.html +82 -0
  452. package/app/s/custom-events/index.html +82 -0
  453. package/app/s/custom-fleet/index.html +82 -0
  454. package/app/s/custom-giving/index.html +82 -0
  455. package/app/s/custom-jobs/index.html +47 -54
  456. package/app/s/custom-kitchen/index.html +47 -54
  457. package/app/s/custom-material/index.html +47 -54
  458. package/app/s/custom-meetings/index.html +82 -0
  459. package/app/s/custom-members/index.html +47 -54
  460. package/app/s/custom-parts/index.html +47 -54
  461. package/app/s/custom-rentals/index.html +82 -0
  462. package/app/s/custom-roastery/index.html +82 -0
  463. package/app/s/custom-schedule/index.html +47 -54
  464. package/app/s/custom-shelf/index.html +82 -0
  465. package/app/s/custom-shop/index.html +47 -54
  466. package/app/s/custom-wholesale/index.html +47 -54
  467. package/app/s/custom-work/index.html +82 -0
  468. package/app/s/custom-yard/index.html +82 -0
  469. package/app/s/section-access-control/index.html +47 -54
  470. package/app/s/section-account-security/index.html +47 -54
  471. package/app/s/section-accounting/index.html +47 -54
  472. package/app/s/section-activity/index.html +47 -54
  473. package/app/s/section-agreements/index.html +47 -54
  474. package/app/s/section-analytics/index.html +47 -54
  475. package/app/s/section-assets/index.html +47 -54
  476. package/app/s/section-billing/index.html +47 -54
  477. package/app/s/section-calendar/index.html +47 -54
  478. package/app/s/section-catalog/index.html +47 -54
  479. package/app/s/section-chat.assistant/index.html +47 -54
  480. package/app/s/section-comments/index.html +47 -54
  481. package/app/s/section-fields.form-customization/index.html +47 -54
  482. package/app/s/section-ingestion/index.html +82 -0
  483. package/app/s/section-integrations/index.html +82 -0
  484. package/app/s/section-messages/index.html +47 -54
  485. package/app/s/section-more/index.html +47 -54
  486. package/app/s/section-operations/index.html +47 -54
  487. package/app/s/section-projects/index.html +47 -54
  488. package/app/s/section-purchasing/index.html +47 -54
  489. package/app/s/section-reports.materialized/index.html +47 -54
  490. package/app/s/section-reports.runtime/index.html +82 -0
  491. package/app/s/section-sales/index.html +47 -54
  492. package/app/s/section-taxonomy/index.html +47 -54
  493. package/app/s/section-team/index.html +47 -54
  494. package/app/s/section-work/index.html +82 -0
  495. package/dist/ai/state.svelte.d.ts +13 -0
  496. package/dist/ai/state.svelte.js +33 -0
  497. package/dist/assistant/change.d.ts +14 -3
  498. package/dist/assistant/change.js +26 -3
  499. package/dist/assistant/engine.js +5 -1
  500. package/dist/assistant/prompt.js +7 -3
  501. package/dist/catalog/catalog.json +11244 -14189
  502. package/dist/catalog/generate/exclusions.d.ts +8 -0
  503. package/dist/catalog/generate/exclusions.js +29 -0
  504. package/dist/catalog/generate/extract.js +29 -8
  505. package/dist/catalog/types.d.ts +7 -0
  506. package/dist/components/AdvancedStyles.svelte +138 -0
  507. package/dist/components/AdvancedStyles.svelte.d.ts +6 -0
  508. package/dist/components/AiModelsPage.svelte +40 -0
  509. package/dist/components/AiModelsPage.svelte.d.ts +7 -0
  510. package/dist/components/AiSetup.svelte +9 -6
  511. package/dist/components/AiStatusIcons.svelte +8 -5
  512. package/dist/components/AppSettings.svelte +105 -1
  513. package/dist/components/BrowserAssistant.svelte +16 -17
  514. package/dist/components/BrowserAssistant.svelte.d.ts +2 -0
  515. package/dist/components/ChildRecords.svelte +61 -14
  516. package/dist/components/ChildRecords.svelte.d.ts +1 -0
  517. package/dist/components/ConnectTools.svelte +5 -2
  518. package/dist/components/CookbooksPanel.svelte +56 -33
  519. package/dist/components/CopyButton.svelte +65 -0
  520. package/dist/components/CopyButton.svelte.d.ts +24 -0
  521. package/dist/components/ExportPanel.svelte +292 -57
  522. package/dist/components/ExportPanel.svelte.d.ts +10 -1
  523. package/dist/components/FeatureCard.svelte +21 -10
  524. package/dist/components/FeaturesPanel.svelte +4 -1
  525. package/dist/components/FieldInput.svelte +6 -3
  526. package/dist/components/FieldMapForm.svelte +6 -10
  527. package/dist/components/FieldMapForm.svelte.d.ts +1 -0
  528. package/dist/components/FormWorkspace.svelte +80 -9
  529. package/dist/components/FormWorkspace.svelte.d.ts +1 -0
  530. package/dist/components/HeaderIconLink.svelte +86 -0
  531. package/dist/components/HeaderIconLink.svelte.d.ts +14 -0
  532. package/dist/components/HelpView.svelte +3 -0
  533. package/dist/components/ModelOptions.svelte +13 -2
  534. package/dist/components/ModelPage.svelte +33 -5
  535. package/dist/components/ModelPage.svelte.d.ts +4 -0
  536. package/dist/components/ModelWorkspace.svelte +148 -50
  537. package/dist/components/ModelWorkspace.svelte.d.ts +4 -0
  538. package/dist/components/PackagePage.svelte +96 -0
  539. package/dist/components/PackagePage.svelte.d.ts +9 -0
  540. package/dist/components/ProductMedia.svelte +95 -0
  541. package/dist/components/ProductMedia.svelte.d.ts +10 -0
  542. package/dist/components/RecipeCards.svelte +13 -1
  543. package/dist/components/RecipeHelp.svelte +3 -0
  544. package/dist/components/RecipeOptions.svelte +13 -1
  545. package/dist/components/RecordFeatures.svelte +22 -8
  546. package/dist/components/RecordView.svelte +354 -0
  547. package/dist/components/RecordView.svelte.d.ts +14 -0
  548. package/dist/components/RelationField.svelte +5 -2
  549. package/dist/components/SectionActions.svelte +8 -5
  550. package/dist/components/SectionHeading.svelte +63 -0
  551. package/dist/components/SectionHeading.svelte.d.ts +11 -0
  552. package/dist/components/SectionIcons.svelte +15 -3
  553. package/dist/components/SectionOverview.svelte +33 -3
  554. package/dist/components/SectionOverview.svelte.d.ts +4 -0
  555. package/dist/components/SectionPage.svelte +25 -165
  556. package/dist/components/SectionView.svelte +172 -0
  557. package/dist/components/SectionView.svelte.d.ts +18 -0
  558. package/dist/components/SettingsPanel.svelte +3 -9
  559. package/dist/components/SettingsPanel.svelte.d.ts +1 -5
  560. package/dist/components/ThemeBridge.svelte +80 -4
  561. package/dist/components/ThemeBridge.svelte.d.ts +5 -1
  562. package/dist/components/ThemeSection.svelte +208 -117
  563. package/dist/components/ThemeSection.svelte.d.ts +3 -7
  564. package/dist/components/VariantGridForm.svelte +9 -13
  565. package/dist/components/VariantGridForm.svelte.d.ts +1 -0
  566. package/dist/components/VoiceTyping.svelte +3 -0
  567. package/dist/cookbook/describe.d.ts +29 -0
  568. package/dist/cookbook/describe.js +164 -0
  569. package/dist/cookbook/file.d.ts +6 -0
  570. package/dist/cookbook/file.js +18 -4
  571. package/dist/cookbook/prompt.d.ts +49 -0
  572. package/dist/cookbook/prompt.js +100 -0
  573. package/dist/cookbook/store.svelte.d.ts +13 -0
  574. package/dist/cookbook/store.svelte.js +36 -8
  575. package/dist/core/prompt.js +10 -1
  576. package/dist/core/reply.d.ts +6 -1
  577. package/dist/data/children.d.ts +50 -6
  578. package/dist/data/children.js +146 -16
  579. package/dist/data/derived.d.ts +37 -29
  580. package/dist/data/derived.js +49 -30
  581. package/dist/data/display.d.ts +21 -8
  582. package/dist/data/display.js +74 -11
  583. package/dist/data/fakes.d.ts +48 -9
  584. package/dist/data/fakes.js +146 -22
  585. package/dist/data/labels.d.ts +7 -2
  586. package/dist/data/labels.js +12 -2
  587. package/dist/data/list-sort.d.ts +8 -0
  588. package/dist/data/list-sort.js +45 -0
  589. package/dist/data/money.d.ts +227 -0
  590. package/dist/data/money.js +413 -0
  591. package/dist/data/packs.d.ts +13 -0
  592. package/dist/data/packs.js +1224 -0
  593. package/dist/data/planner-source.js +123 -3
  594. package/dist/data/source.d.ts +13 -2
  595. package/dist/data/source.js +274 -40
  596. package/dist/features/palette.d.ts +2 -0
  597. package/dist/features/palette.js +1 -1
  598. package/dist/forms/stock.d.ts +1 -1
  599. package/dist/forms/stock.js +3 -1
  600. package/dist/index.d.ts +7 -2
  601. package/dist/index.js +6 -1
  602. package/dist/kitchen/LiveKitchenBridge.svelte +73 -0
  603. package/dist/kitchen/LiveKitchenBridge.svelte.d.ts +8 -0
  604. package/dist/kitchen/live.d.ts +7 -0
  605. package/dist/kitchen/live.js +51 -0
  606. package/dist/library/icons.js +34 -0
  607. package/dist/library/library.json +1546 -15
  608. package/dist/library/pending.json +5 -0
  609. package/dist/library/types.d.ts +4 -0
  610. package/dist/motion/tokens.d.ts +6 -0
  611. package/dist/motion/tokens.js +32 -0
  612. package/dist/motion/view-transition.d.ts +13 -0
  613. package/dist/motion/view-transition.js +17 -0
  614. package/dist/overviews/definitions.d.ts +41 -2
  615. package/dist/overviews/definitions.js +111 -4
  616. package/dist/overviews/models.d.ts +10 -0
  617. package/dist/overviews/models.js +19 -0
  618. package/dist/overviews/registry.d.ts +92 -5
  619. package/dist/overviews/registry.js +468 -58
  620. package/dist/overviews/validate.js +2 -2
  621. package/dist/planner/Planner.svelte +374 -166
  622. package/dist/planner/PlannerControls.svelte +255 -0
  623. package/dist/planner/PlannerControls.svelte.d.ts +17 -0
  624. package/dist/planner/PlannerLifecycle.svelte +73 -0
  625. package/dist/planner/PlannerLifecycle.svelte.d.ts +9 -0
  626. package/dist/planner/app.svelte.d.ts +12 -2
  627. package/dist/planner/app.svelte.js +13 -3
  628. package/dist/planner/assistant.js +20 -2
  629. package/dist/planner/commands/adapter.js +9 -2
  630. package/dist/planner/commands/types.d.ts +1 -1
  631. package/dist/planner/commands/types.js +1 -0
  632. package/dist/planner/header-icons.d.ts +12 -0
  633. package/dist/planner/header-icons.js +12 -0
  634. package/dist/planner/host/HostPlanner.svelte +70 -0
  635. package/dist/planner/host/HostPlanner.svelte.d.ts +17 -0
  636. package/dist/planner/host/session.svelte.d.ts +28 -0
  637. package/dist/planner/host/session.svelte.js +186 -0
  638. package/dist/planner/routes.d.ts +49 -0
  639. package/dist/planner/routes.js +64 -0
  640. package/dist/planner/shell.d.ts +40 -0
  641. package/dist/planner/shell.js +56 -0
  642. package/dist/planner/tab.svelte.d.ts +6 -3
  643. package/dist/planner/tab.svelte.js +11 -4
  644. package/dist/planner/title.d.ts +15 -0
  645. package/dist/planner/title.js +21 -0
  646. package/dist/planner/title.svelte.d.ts +6 -0
  647. package/dist/planner/title.svelte.js +11 -0
  648. package/dist/planner/types.d.ts +39 -7
  649. package/dist/products/media.d.ts +20 -0
  650. package/dist/products/media.js +65 -0
  651. package/dist/recipes/help/descriptions.json +1 -3
  652. package/dist/recipes/index.d.ts +2 -0
  653. package/dist/recipes/index.js +6 -0
  654. package/dist/recipes/plumbing.d.ts +35 -1
  655. package/dist/recipes/plumbing.js +74 -0
  656. package/dist/screens/definition.d.ts +35 -0
  657. package/dist/screens/definition.js +132 -0
  658. package/dist/screens/relations.d.ts +17 -0
  659. package/dist/screens/relations.js +98 -0
  660. package/dist/screens/totals.d.ts +37 -0
  661. package/dist/screens/totals.js +65 -0
  662. package/dist/sections/info.d.ts +1 -1
  663. package/dist/sections/info.js +2 -2
  664. package/dist/settings/app-settings.d.ts +17 -1
  665. package/dist/settings/app-settings.js +40 -3
  666. package/dist/smrt-version.d.ts +2 -0
  667. package/dist/smrt-version.js +4 -0
  668. package/dist/styles/planner-forms.css +53 -0
  669. package/dist/styles/planner-lists.css +43 -0
  670. package/dist/theme/css-highlight.d.ts +6 -0
  671. package/dist/theme/css-highlight.js +34 -0
  672. package/dist/theme/custom-css.svelte.d.ts +34 -0
  673. package/dist/theme/custom-css.svelte.js +246 -0
  674. package/dist/theme/runtime.js +25 -5
  675. package/dist/theme/theme.d.ts +26 -3
  676. package/dist/theme/theme.js +70 -2
  677. package/dist/upstream/overlay.d.ts +14 -5
  678. package/dist/upstream/overlay.js +20 -2
  679. package/package.json +12 -6
  680. package/app/_app/immutable/assets/0.B5zXkXe_.css +0 -1
  681. package/app/_app/immutable/assets/10.hpcnxvK1.css +0 -1
  682. package/app/_app/immutable/assets/11.D7zoXfVV.css +0 -1
  683. package/app/_app/immutable/assets/12.CPobm1ED.css +0 -1
  684. package/app/_app/immutable/assets/2.CyaWdRdI.css +0 -1
  685. package/app/_app/immutable/assets/3.BlPQOes8.css +0 -1
  686. package/app/_app/immutable/assets/8.2gQeKBp_.css +0 -1
  687. package/app/_app/immutable/assets/9.HOPT4xtg.css +0 -1
  688. package/app/_app/immutable/assets/AiSetup.Cb22AigN.css +0 -1
  689. package/app/_app/immutable/assets/Button.DkP0qkG9.css +0 -1
  690. package/app/_app/immutable/assets/ConnectTools.BgIJOOGW.css +0 -1
  691. package/app/_app/immutable/assets/FieldMapForm.BCU-4pO4.css +0 -1
  692. package/app/_app/immutable/assets/ModelPage.Dd3LcMta.css +0 -1
  693. package/app/_app/immutable/assets/SectionActions.CTkVuNMF.css +0 -1
  694. package/app/_app/immutable/assets/SectionIcons.5Udq9vN-.css +0 -1
  695. package/app/_app/immutable/assets/SegmentedControl.B8SrQacd.css +0 -1
  696. package/app/_app/immutable/assets/dist.C5nHBk_O.css +0 -1
  697. package/app/_app/immutable/assets/feedback.BVKAwFck.css +0 -1
  698. package/app/_app/immutable/assets/forms.BChZ2RWM.css +0 -1
  699. package/app/_app/immutable/assets/percent.LH0z-ozZ.css +0 -1
  700. package/app/_app/immutable/assets/store.CGDwHkkF.css +0 -1
  701. package/app/_app/immutable/assets/ui.B1A1Zl2p.css +0 -1
  702. package/app/_app/immutable/assets/workspace.BIMkuZDb.css +0 -1
  703. package/app/_app/immutable/chunks/1okeBSoq.js +0 -1
  704. package/app/_app/immutable/chunks/2jFBkS1C.js +0 -1
  705. package/app/_app/immutable/chunks/6P9zxrzU.js +0 -1
  706. package/app/_app/immutable/chunks/B32EWqI8.js +0 -9
  707. package/app/_app/immutable/chunks/B4Kevpe0.js +0 -1
  708. package/app/_app/immutable/chunks/BKwRT_1p.js +0 -1
  709. package/app/_app/immutable/chunks/BS4h9ES-.js +0 -1
  710. package/app/_app/immutable/chunks/CMhpRMKg.js +0 -1
  711. package/app/_app/immutable/chunks/CPRHZZeW.js +0 -1
  712. package/app/_app/immutable/chunks/CRQ1Pmzr.js +0 -1
  713. package/app/_app/immutable/chunks/CWtfVMDz.js +0 -1
  714. package/app/_app/immutable/chunks/Chyo8rdT.js +0 -3
  715. package/app/_app/immutable/chunks/Ci0DUht6.js +0 -34
  716. package/app/_app/immutable/chunks/CmmuWmp6.js +0 -2
  717. package/app/_app/immutable/chunks/CrFNLK0f.js +0 -1
  718. package/app/_app/immutable/chunks/CsprTb3f.js +0 -2
  719. package/app/_app/immutable/chunks/CygC84VT.js +0 -2
  720. package/app/_app/immutable/chunks/D0VgZnk1.js +0 -1
  721. package/app/_app/immutable/chunks/DD7gpKb2.js +0 -1
  722. package/app/_app/immutable/chunks/DNRgqfTx.js +0 -1
  723. package/app/_app/immutable/chunks/DVRKjN-E.js +0 -1
  724. package/app/_app/immutable/chunks/D_J_XtJy.js +0 -846
  725. package/app/_app/immutable/chunks/Dp9GVO-9.js +0 -1
  726. package/app/_app/immutable/chunks/DqcD-WtP.js +0 -1
  727. package/app/_app/immutable/chunks/QukgIHDX.js +0 -1
  728. package/app/_app/immutable/chunks/WxSPP8QW.js +0 -4
  729. package/app/_app/immutable/chunks/Xp1g1t4n.js +0 -3
  730. package/app/_app/immutable/chunks/leQCwW2d.js +0 -1
  731. package/app/_app/immutable/chunks/p6bgzXiY.js +0 -1
  732. package/app/_app/immutable/entry/app.IZIJXhgq.js +0 -2
  733. package/app/_app/immutable/entry/start.BuaYHD1N.js +0 -1
  734. package/app/_app/immutable/nodes/0.m_U8WC7E.js +0 -10
  735. package/app/_app/immutable/nodes/1.Crw8ULhB.js +0 -1
  736. package/app/_app/immutable/nodes/10.1nQxyH9H.js +0 -4
  737. package/app/_app/immutable/nodes/11.Cw0JnQF3.js +0 -1
  738. package/app/_app/immutable/nodes/12.BIocA1aI.js +0 -1
  739. package/app/_app/immutable/nodes/2.CR5BwGnt.js +0 -17
  740. package/app/_app/immutable/nodes/3.1B56hgAG.js +0 -1
  741. package/app/_app/immutable/nodes/4.SSIC7sUh.js +0 -1
  742. package/app/_app/immutable/nodes/5.DgdwleDQ.js +0 -1
  743. package/app/_app/immutable/nodes/6.DmD9rqLU.js +0 -1
  744. package/app/_app/immutable/nodes/7.DdngsBmo.js +0 -1
  745. package/app/_app/immutable/nodes/8.D2Mszsua.js +0 -3
  746. package/app/_app/immutable/nodes/9.CLYsywul.js +0 -1
  747. package/app/m/content/Contents/index.html +0 -96
  748. package/app/m/preferences/UiPreferenceRecord/index.html +0 -96
  749. package/app/m/users/AccessRequest/index.html +0 -96
  750. package/app/m/users/ResourceGrant/index.html +0 -96
  751. package/app/m/users/UsersCliAuthRequest/index.html +0 -96
  752. package/app/m/users/UsersMagicLinkToken/index.html +0 -96
@@ -1,16 +1,17 @@
1
- import { isLineModel, settleLine, withTotals } from "./derived.js";
2
- import { createRandom, fakeId, fakeRecord, hashString, packLine, } from "./fakes.js";
3
- import { getSamplePack } from "./packs.js";
1
+ import { isLineModel, lineAmount, settleWithLines } from "./derived.js";
2
+ import { createRandom, fakeId, fakeRecord, hashString, packLine, relatedIndex, } from "./fakes.js";
3
+ import { examplePackCodeFor, SEEDED_TAX_CODES, } from "./money.js";
4
+ import { getSamplePack, getSamplePricing } from "./packs.js";
4
5
  const MAX_CHILDREN = 4;
5
6
  const hasField = (model, name) => model.fields.some((f) => f.name === name);
6
7
  /**
7
8
  * Sample child rows for one parent record: one to four (journals, an even
8
9
  * number of balanced entries), each pointing at the parent through `fk`. Ids
9
10
  * and values are seeded from the parent's id, so the same parent always gets
10
- * the same children. A line item's `amount` is `quantity * unitPrice` so it
11
- * reads right next to the parent's totals.
11
+ * the same children. A line's money (`amount`, `taxAmount`, its tax code's
12
+ * snapshot) is settled with its document's other lines (`settleSample`).
12
13
  */
13
- export function fakeChildrenOf(child, fk, parent, seed) {
14
+ export function fakeChildrenOf(child, fk, parent, seed, rows) {
14
15
  const random = createRandom(hashString(`${seed}:${child.id}:${parent.id}`));
15
16
  const ledger = hasField(child, 'debit') && hasField(child, 'credit');
16
17
  const count = ledger
@@ -21,7 +22,7 @@ export function fakeChildrenOf(child, fk, parent, seed) {
21
22
  return Array.from({ length: count }, (_, i) => {
22
23
  const index = hashString(`${parent.id}:${i}`) % 997;
23
24
  const record = {
24
- ...fakeRecord(child, index, seed),
25
+ ...fakeRecord(child, index, seed, rows),
25
26
  id: fakeId(`${child.id}:${parent.id}:${i}`),
26
27
  [fk]: parent.id,
27
28
  };
@@ -32,7 +33,11 @@ export function fakeChildrenOf(child, fk, parent, seed) {
32
33
  const productField = child.fields.find((f) => f.related?.endsWith(':Product') && f.name in record);
33
34
  const pack = getSamplePack();
34
35
  const { products } = pack;
35
- const item = products[(index % 5) % products.length];
36
+ // The same row the line's `productId` was pointed at (`relatedIndex`).
37
+ const item = productField
38
+ ? products[relatedIndex(productField, { modelId: child.id, index, rows }) %
39
+ products.length]
40
+ : products[index % products.length];
36
41
  const described = packLine(index);
37
42
  if (described) {
38
43
  // Labour and fabrication are not products: no product to point at.
@@ -57,9 +62,8 @@ export function fakeChildrenOf(child, fk, parent, seed) {
57
62
  const quantity = low + Math.floor(random() * (high - low + 1));
58
63
  if (hasField(child, 'quantity'))
59
64
  record.quantity = quantity;
60
- if (hasField(child, 'discount'))
61
- record.discount = 0;
62
- record.amount = settleLine(record).amount;
65
+ Object.assign(record, sampleLineMoney(child, parent, i, quantity, Number(record.unitPrice ?? 0)));
66
+ record.amount = lineAmount(record);
63
67
  }
64
68
  if (ledger) {
65
69
  const debit = i % 2 === 0;
@@ -69,12 +73,138 @@ export function fakeChildrenOf(child, fk, parent, seed) {
69
73
  return record;
70
74
  });
71
75
  }
76
+ /** Does a sample document give a discount (about one in three, by its id)? */
77
+ export function discounted(parent) {
78
+ return hashString(`discount:${parent.id}`) % 3 === 0;
79
+ }
80
+ /** A tenth off the line's price, in whole currency units. */
81
+ function lineDiscount(quantity, unitPrice) {
82
+ return Math.round((quantity * unitPrice) / 1000) * 100;
83
+ }
84
+ /**
85
+ * Does a sample line carry its own tax code (`taxMode: 'override'`), about one
86
+ * line in seven by its document and position, never a document's first line?
87
+ */
88
+ export function overridesTax(parent, index) {
89
+ return (index > 0 && hashString(`tax-override:${parent.id}:${index}`) % 7 === 0);
90
+ }
72
91
  /**
73
- * Bring a parent's totals in line with the line items just generated for it
74
- * (see `withTotals`).
92
+ * The code an overriding sample line chooses, by line: in an app whose
93
+ * currency an example-pack code names, that code half the time (BC GST + PST
94
+ * for CAD, so its components show apart); otherwise exempt or zero-rated.
75
95
  */
76
- export function syncTotals(parent, parentModel, items) {
77
- if (!items.length || !items.every((r) => 'unitPrice' in r))
96
+ export function overrideTaxCode(parent, index, currency = getSamplePricing().currency) {
97
+ const draw = hashString(`tax-override-kind:${parent.id}:${index}`) % 4;
98
+ const pack = examplePackCodeFor(currency);
99
+ if (pack && draw < 2)
100
+ return pack;
101
+ const kind = draw % 2 === 0 ? 'exempt' : 'zero-rated';
102
+ return SEEDED_TAX_CODES.find((c) => c.kind === kind);
103
+ }
104
+ /**
105
+ * The money inputs of a sample line, for the fields the line has: a
106
+ * discounted document's first line takes a tenth off, as a percentage
107
+ * (`discountType: 'percent'`, `discountRate: '10'`) or a whole-unit amount
108
+ * (`'amount'`, `discount` in minor units), alternating by document; a few
109
+ * lines carry a tax code of their own (`overrideTaxCode`); every other line
110
+ * inherits its code. What the line then comes to is the document's to settle.
111
+ */
112
+ function sampleLineMoney(child, parent, index, quantity, unitPrice) {
113
+ const money = {};
114
+ const discount = index === 0 && discounted(parent);
115
+ const percent = hashString(`discount-kind:${parent.id}`) % 2 === 0;
116
+ if (hasField(child, 'discountType')) {
117
+ money.discountType = discount ? (percent ? 'percent' : 'amount') : 'none';
118
+ }
119
+ if (hasField(child, 'discountRate')) {
120
+ money.discountRate = discount && percent ? '10' : null;
121
+ }
122
+ if (hasField(child, 'discount')) {
123
+ money.discount =
124
+ discount && !(percent && hasField(child, 'discountType'))
125
+ ? lineDiscount(quantity, unitPrice)
126
+ : 0;
127
+ }
128
+ // A line with a `discount` but no `discountType` field cannot say which
129
+ // kind it is: an amount is the only one the model can read from it.
130
+ if (!hasField(child, 'discountType') && money.discount) {
131
+ money.discountType = 'amount';
132
+ }
133
+ const override = overridesTax(parent, index)
134
+ ? overrideTaxCode(parent, index)
135
+ : undefined;
136
+ if (hasField(child, 'taxMode')) {
137
+ money.taxMode = override ? 'override' : 'inherit';
138
+ }
139
+ if (hasField(child, 'taxCodeId'))
140
+ money.taxCodeId = override?.id ?? null;
141
+ return money;
142
+ }
143
+ /**
144
+ * A sample line once the app's hidden fields' values are applied (`carried`):
145
+ * where the app hides the line's `discount`, an amount discount could not be
146
+ * seen or entered, so the line takes its tenth off as a percentage instead,
147
+ * and where it hides `discountRate` too, the line has no discount.
148
+ */
149
+ export function withCarried(item, carried) {
150
+ const next = { ...item, ...carried };
151
+ if ('discount' in carried &&
152
+ !('discountType' in carried) &&
153
+ next.discountType === 'amount') {
154
+ next.discountType = 'percent';
155
+ next.discountRate = '10';
156
+ next.discount = 0;
157
+ }
158
+ // Neither kind can be seen: no discount at all.
159
+ if ('discountRate' in carried && next.discountType === 'percent') {
160
+ next.discountType = 'none';
161
+ next.discountRate = null;
162
+ next.discount = 0;
163
+ }
164
+ return next;
165
+ }
166
+ /**
167
+ * The sample documents whose stored totals deliberately disagree with their
168
+ * lines, so the record page's mismatch flag has something to show: the third
169
+ * Order and the third Invoice (row index 2), drafts whose subtotal and total
170
+ * were left stale by an edit made elsewhere. Only a draft's totals are read
171
+ * against its lines (an issued document shows its frozen figures as they
172
+ * are), so these two are drafts. Their own fields stay authoritative; the
173
+ * page only flags the difference. Editing a line recomputes the totals and
174
+ * clears it.
175
+ */
176
+ export const MISMATCH_MODELS = [
177
+ '@happyvertical/smrt-commerce:Order',
178
+ '@happyvertical/smrt-commerce:Invoice',
179
+ ];
180
+ export const MISMATCH_ROW = 2;
181
+ /** What the stale total is off by, in minor units. */
182
+ export const MISMATCH_AMOUNT = 2500;
183
+ /** Leave one document's total stale (see {@link MISMATCH_MODELS}). */
184
+ export function seedMismatch(parent, parentModel, index) {
185
+ if (index !== MISMATCH_ROW ||
186
+ !MISMATCH_MODELS.includes(parentModel.id) ||
187
+ typeof parent.subtotal !== 'number' ||
188
+ typeof parent.totalAmount !== 'number') {
78
189
  return;
79
- Object.assign(parent, withTotals(parentModel, parent, items));
190
+ }
191
+ if (parentModel.fields.some((f) => f.name === 'status' && f.enum?.includes('draft'))) {
192
+ parent.status = 'draft';
193
+ }
194
+ // Stale but self-consistent: subtotal and total moved together.
195
+ parent.subtotal += MISMATCH_AMOUNT;
196
+ parent.totalAmount += MISMATCH_AMOUNT;
197
+ }
198
+ /**
199
+ * Settle the line items just generated for a parent with it (see
200
+ * `settleWithLines`): the parent's totals are set in place and the settled
201
+ * lines returned.
202
+ */
203
+ export function settleSample(parent, parentModel, items, context) {
204
+ if (!items.length || !items.every((r) => 'unitPrice' in r)) {
205
+ return [...items];
206
+ }
207
+ const settled = settleWithLines(parentModel, parent, items, context);
208
+ Object.assign(parent, settled.row);
209
+ return settled.lines;
80
210
  }
@@ -1,37 +1,45 @@
1
1
  /**
2
- * Amounts the commerce models derive rather than take as input, mirrored from
3
- * `ContractLineItem` / `InvoiceLineItem` / `Invoice` in smrt-commerce:
2
+ * Amounts a document's lines derive rather than take as input, on
3
+ * smrt-commerce's money model (released in 0.56.1; `money.ts` holds the
4
+ * mapping to the package's own calculator):
4
5
  *
5
- * line subtotal = round(quantity * unitPrice) - discount (minor units)
6
- * line tax = round(line subtotal * taxRate) (taxRate is a fraction)
7
- * line amount = line subtotal + line tax
6
+ * line amount = quantity x unitPrice - discount
7
+ * (prices without tax: the line's net; with tax: its gross)
8
+ * line tax = from the line's resolved tax code, per component
9
+ * subtotal = sum of the lines' net
10
+ * taxAmount = sum of the lines' tax
11
+ * totalAmount = subtotal + taxAmount
12
+ * discountTotal = sum of the lines' discounts, informational: already
13
+ * inside the line amounts, never subtracted again
8
14
  *
9
- * and a parent with line items takes `subtotal`, `taxAmount` and `totalAmount`
10
- * from the sum of its lines, ignoring what a form sent.
15
+ * A parent with line items takes these from its lines, ignoring what a form
16
+ * sent. See AGENTS.md.
11
17
  */
12
18
  import type { CatalogModel } from '../catalog/types.ts';
19
+ import { type LineAmountType, type MoneyContext, type SettledDocument, type TaxRoundingScope } from './money.ts';
20
+ export { lineAmount } from './money.ts';
13
21
  type Row = Readonly<Record<string, unknown>>;
14
22
  /** A line item: it prices a quantity of something. */
15
23
  export declare function isLineModel(model: CatalogModel): boolean;
16
- export interface LineAmounts {
17
- subtotal: number;
18
- tax: number;
19
- amount: number;
20
- }
21
- export declare function lineAmounts(line: Row): LineAmounts;
22
- /** The line with its `amount` brought in line with its other fields. */
23
- export declare function settleLine<T extends Row>(line: T): T & {
24
- amount: number;
25
- };
26
- export interface ParentTotals {
27
- subtotal: number;
28
- taxAmount: number;
29
- totalAmount: number;
30
- }
31
- export declare function totalsOf(lines: readonly Row[]): ParentTotals;
24
+ /** The totals a document's summary shows: subtotal, tax, total. */
32
25
  export declare const TOTAL_FIELDS: readonly ["subtotal", "taxAmount", "totalAmount"];
33
- /** `row` with the model's total fields set from `lines`. */
34
- export declare function withTotals<T extends Record<string, unknown>>(model: CatalogModel, row: T, lines: readonly Row[]): T;
26
+ /** Every header field its lines decide, `discountTotal` included. */
27
+ export declare const DOCUMENT_MONEY_FIELDS: readonly ["subtotal", "taxAmount", "totalAmount", "discountTotal"];
28
+ /** The fields of a line its document's calculation writes. */
29
+ export declare const LINE_MONEY_FIELDS: readonly ["amount", "taxAmount", "taxRate", "taxCodeCode", "taxCodeName"];
30
+ /** The document's own pricing mode, else `fallback` (the app's). */
31
+ export declare function documentLineAmountType(row: Row, fallback: LineAmountType): LineAmountType;
32
+ /** The document's own rounding scope, else `fallback` (the app's). */
33
+ export declare function documentRoundingScope(row: Row, fallback: TaxRoundingScope): TaxRoundingScope;
34
+ /**
35
+ * `row` and its `lines` settled together: the lines' derived fields, and the
36
+ * model's header money fields (`subtotal`, `discountTotal`, `taxAmount`,
37
+ * `totalAmount`, where the model has them).
38
+ */
39
+ export declare function settleWithLines<T extends Record<string, unknown>, L extends Row>(model: CatalogModel, row: T, lines: readonly L[], context: MoneyContext): {
40
+ row: T;
41
+ lines: SettledDocument<L>['lines'];
42
+ };
35
43
  /** A record that tracks what has been paid against it (an Invoice). */
36
44
  export declare function tracksPayments(model: CatalogModel): boolean;
37
45
  /** The field of a payment allocation that points at its payment. */
@@ -59,9 +67,10 @@ export declare function settleInvoice(invoice: Row, counted: readonly {
59
67
  at: string;
60
68
  }[], now: number): Settlement;
61
69
  /**
62
- * The fields a form shows but does not let anyone type: a line's `amount`, a
63
- * parent's totals when it has line items, and what an invoice has paid (and
64
- * when) when it has payment allocations.
70
+ * The fields a form shows but does not let anyone type: a line's money (its
71
+ * amount, tax and the tax code's snapshot), a parent's totals when it has line
72
+ * items, and what an invoice has paid (and when) when it has payment
73
+ * allocations.
65
74
  */
66
75
  export declare function derivedFieldNames(model: CatalogModel, hasLineChildren: boolean, hasPaymentChildren?: boolean): ReadonlySet<string>;
67
76
  /** Does the field of a line item point at a product? */
@@ -76,4 +85,3 @@ export declare function isProductField(field: {
76
85
  * editable. A product with no name or price fills nothing.
77
86
  */
78
87
  export declare function productPrefill(line: CatalogModel, product: Row | undefined): Record<string, unknown>;
79
- export {};
@@ -1,3 +1,5 @@
1
+ import { settleDocument, } from "./money.js";
2
+ export { lineAmount } from "./money.js";
1
3
  const num = (value) => {
2
4
  const n = Number(value ?? 0);
3
5
  return Number.isFinite(n) ? n : 0;
@@ -7,35 +9,47 @@ const has = (model, name) => model.fields.some((f) => f.name === name);
7
9
  export function isLineModel(model) {
8
10
  return ['quantity', 'unitPrice', 'amount'].every((n) => has(model, n));
9
11
  }
10
- export function lineAmounts(line) {
11
- const subtotal = Math.round(num(line.quantity) * num(line.unitPrice)) - num(line.discount);
12
- const tax = Math.round(subtotal * num(line.taxRate));
13
- return { subtotal, tax, amount: subtotal + tax };
14
- }
15
- /** The line with its `amount` brought in line with its other fields. */
16
- export function settleLine(line) {
17
- return { ...line, amount: lineAmounts(line).amount };
12
+ /** The totals a document's summary shows: subtotal, tax, total. */
13
+ export const TOTAL_FIELDS = ['subtotal', 'taxAmount', 'totalAmount'];
14
+ /** Every header field its lines decide, `discountTotal` included. */
15
+ export const DOCUMENT_MONEY_FIELDS = [
16
+ ...TOTAL_FIELDS,
17
+ 'discountTotal',
18
+ ];
19
+ /** The fields of a line its document's calculation writes. */
20
+ export const LINE_MONEY_FIELDS = [
21
+ 'amount',
22
+ 'taxAmount',
23
+ 'taxRate',
24
+ 'taxCodeCode',
25
+ 'taxCodeName',
26
+ ];
27
+ const LINE_AMOUNT_TYPES = ['exclusive', 'inclusive', 'none'];
28
+ /** The document's own pricing mode, else `fallback` (the app's). */
29
+ export function documentLineAmountType(row, fallback) {
30
+ const value = row.lineAmountType;
31
+ return typeof value === 'string' && LINE_AMOUNT_TYPES.includes(value)
32
+ ? value
33
+ : fallback;
18
34
  }
19
- export function totalsOf(lines) {
20
- let subtotal = 0;
21
- let taxAmount = 0;
22
- for (const line of lines) {
23
- const parts = lineAmounts(line);
24
- subtotal += parts.subtotal;
25
- taxAmount += parts.tax;
26
- }
27
- return { subtotal, taxAmount, totalAmount: subtotal + taxAmount };
35
+ /** The document's own rounding scope, else `fallback` (the app's). */
36
+ export function documentRoundingScope(row, fallback) {
37
+ const value = row.taxRoundingScope;
38
+ return value === 'line' || value === 'document' ? value : fallback;
28
39
  }
29
- export const TOTAL_FIELDS = ['subtotal', 'taxAmount', 'totalAmount'];
30
- /** `row` with the model's total fields set from `lines`. */
31
- export function withTotals(model, row, lines) {
32
- const totals = totalsOf(lines);
40
+ /**
41
+ * `row` and its `lines` settled together: the lines' derived fields, and the
42
+ * model's header money fields (`subtotal`, `discountTotal`, `taxAmount`,
43
+ * `totalAmount`, where the model has them).
44
+ */
45
+ export function settleWithLines(model, row, lines, context) {
46
+ const settled = settleDocument(lines, context);
33
47
  const next = { ...row };
34
- for (const name of TOTAL_FIELDS) {
48
+ for (const name of DOCUMENT_MONEY_FIELDS) {
35
49
  if (has(model, name))
36
- next[name] = totals[name];
50
+ next[name] = settled[name];
37
51
  }
38
- return next;
52
+ return { row: next, lines: settled.lines };
39
53
  }
40
54
  /** A record that tracks what has been paid against it (an Invoice). */
41
55
  export function tracksPayments(model) {
@@ -91,18 +105,23 @@ export function settleInvoice(invoice, counted, now) {
91
105
  };
92
106
  }
93
107
  /**
94
- * The fields a form shows but does not let anyone type: a line's `amount`, a
95
- * parent's totals when it has line items, and what an invoice has paid (and
96
- * when) when it has payment allocations.
108
+ * The fields a form shows but does not let anyone type: a line's money (its
109
+ * amount, tax and the tax code's snapshot), a parent's totals when it has line
110
+ * items, and what an invoice has paid (and when) when it has payment
111
+ * allocations.
97
112
  */
98
113
  export function derivedFieldNames(model, hasLineChildren, hasPaymentChildren = false) {
99
114
  const names = new Set();
100
- if (isLineModel(model))
101
- names.add('amount');
115
+ if (isLineModel(model)) {
116
+ for (const name of LINE_MONEY_FIELDS)
117
+ if (has(model, name))
118
+ names.add(name);
119
+ }
102
120
  if (hasLineChildren) {
103
- for (const name of TOTAL_FIELDS)
121
+ for (const name of DOCUMENT_MONEY_FIELDS) {
104
122
  if (has(model, name))
105
123
  names.add(name);
124
+ }
106
125
  }
107
126
  if (hasPaymentChildren && tracksPayments(model)) {
108
127
  for (const name of ['amountPaid', 'paidDate']) {
@@ -1,8 +1,3 @@
1
- /**
2
- * Which field labels a record in pickers. `model.display` comes from the
3
- * manifest's `displayLabelField` (happyvertical/smrt#3611); a model that
4
- * declares none falls back to the first of `name`, `title`, `label`, `code`.
5
- */
6
1
  import type { CatalogField, CatalogModel } from '../catalog/types.ts';
7
2
  export declare const DEFAULT_LABEL_FIELDS: readonly ["name", "title", "label", "code"];
8
3
  /** The fields that may label a record of the model, best first. */
@@ -11,13 +6,31 @@ export declare function labelFields(model: CatalogModel): string[];
11
6
  export declare function displayLabel(model: CatalogModel, record: Readonly<Record<string, unknown>>): string | undefined;
12
7
  /** Finds the label of the record a relation field points at. */
13
8
  export type RelatedLabel = (field: CatalogField, id: string) => string | undefined;
9
+ /**
10
+ * The field that identifies a document to a person (`invoiceNumber`, an
11
+ * order's `reference`): the first field the framework's field roles
12
+ * (`deriveFieldRoles`, smrt#3718) give the `identifier` role. `undefined`
13
+ * for a model with a name of its own: a product's `code` is a detail, its
14
+ * `name` is what it is called.
15
+ */
16
+ export declare function identifierField(model: CatalogModel): CatalogField | undefined;
17
+ /** A document's identifier value, e.g. `WIL-1133`; `undefined` when empty. */
18
+ export declare function identifierOf(model: CatalogModel, record: Readonly<Record<string, unknown>>): string | undefined;
14
19
  /** A record's own number, e.g. `invoiceNumber` or `number`. */
15
20
  export declare function numberOf(model: CatalogModel, record: Readonly<Record<string, unknown>>): string | undefined;
16
21
  /** The relation field that best says what a record is about, if it has one. */
17
22
  export declare function partyField(fields: readonly CatalogField[], record: Readonly<Record<string, unknown>>): CatalogField | undefined;
18
23
  /**
19
- * The text that names a record: its label field, else its number (plus the
20
- * party it is for), else the party, with the amount and date for a money record
21
- * such as a payment. `undefined` when nothing names it.
24
+ * The text that names a record: its label field, else its identifier (a
25
+ * document is its number: `GRA-3159`, never `Ridgeline Construction ·
26
+ * GRA-3159`), else, for a money record such as a payment allocation, the party
27
+ * it is for with its amount and date, else the party and a description.
28
+ * `undefined` when nothing names it.
22
29
  */
23
30
  export declare function recordName(model: CatalogModel, record: Readonly<Record<string, unknown>>, related: RelatedLabel, fields?: readonly CatalogField[]): string | undefined;
31
+ /**
32
+ * A record page's heading: a document is its kind and identifier
33
+ * (`Order GRA-3159`), anything else its name. `kind` is the model's name
34
+ * as a person reads it ("Order", "Purchase order").
35
+ */
36
+ export declare function recordHeading(model: CatalogModel, record: Readonly<Record<string, unknown>>, name: string, kind: string): string;
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Which field labels a record in pickers. `model.display` comes from the
3
+ * manifest's `displayLabelField` (happyvertical/smrt#3611); a model that
4
+ * declares none falls back to the first of `name`, `title`, `label`, `code`.
5
+ */
6
+ import { deriveFieldRoles, fieldWithRole, } from '@happyvertical/smrt-svelte/screens';
1
7
  import { formatMoney } from "./format.js";
2
8
  export const DEFAULT_LABEL_FIELDS = ['name', 'title', 'label', 'code'];
3
9
  /** The fields that may label a record of the model, best first. */
@@ -27,11 +33,55 @@ const PARTY_ORDER = [
27
33
  /^payment/i,
28
34
  /^contract/i,
29
35
  ];
36
+ /** A document's own number, e.g. `invoiceNumber` or `number`. */
37
+ const NUMBER_NAME = /(^|[a-z])Number$|^number$/;
38
+ /**
39
+ * The field that identifies a document to a person (`invoiceNumber`, an
40
+ * order's `reference`): the first field the framework's field roles
41
+ * (`deriveFieldRoles`, smrt#3718) give the `identifier` role. `undefined`
42
+ * for a model with a name of its own: a product's `code` is a detail, its
43
+ * `name` is what it is called.
44
+ */
45
+ export function identifierField(model) {
46
+ if (labelFields(model).some((name) => name !== 'code'))
47
+ return undefined;
48
+ const own = model.fields.filter((f) => !f.system);
49
+ const roles = deriveFieldRoles({
50
+ objectRef: model.id,
51
+ className: model.name,
52
+ fields: Object.fromEntries(own.map((f) => [
53
+ f.name,
54
+ {
55
+ type: SCREEN_TYPES.has(f.type) ? f.type : 'text',
56
+ ...(f.enum?.length ? { enum: f.enum } : {}),
57
+ ...(f.ui ? { ui: { ...f.ui } } : {}),
58
+ },
59
+ ])),
60
+ });
61
+ const name = fieldWithRole(roles, 'identifier');
62
+ return name ? own.find((f) => f.name === name) : undefined;
63
+ }
64
+ const SCREEN_TYPES = new Set([
65
+ 'text',
66
+ 'integer',
67
+ 'decimal',
68
+ 'boolean',
69
+ 'datetime',
70
+ 'json',
71
+ 'foreignKey',
72
+ 'crossPackageRef',
73
+ ]);
74
+ /** A document's identifier value, e.g. `WIL-1133`; `undefined` when empty. */
75
+ export function identifierOf(model, record) {
76
+ const field = identifierField(model);
77
+ const value = field ? record[field.name] : undefined;
78
+ return typeof value === 'string' && value.trim() !== '' ? value : undefined;
79
+ }
30
80
  /** A record's own number, e.g. `invoiceNumber` or `number`. */
31
81
  export function numberOf(model, record) {
32
82
  const field = model.fields.find((f) => !f.system &&
33
83
  f.type === 'text' &&
34
- /(^|[a-z])Number$|^number$/.test(f.name) &&
84
+ NUMBER_NAME.test(f.name) &&
35
85
  typeof record[f.name] === 'string' &&
36
86
  String(record[f.name]).trim() !== '');
37
87
  return field ? String(record[field.name]) : undefined;
@@ -48,21 +98,23 @@ export function partyField(fields, record) {
48
98
  }
49
99
  const DATE_NAME = /(paid|allocated|issue|^date$|createdat)/i;
50
100
  /**
51
- * The text that names a record: its label field, else its number (plus the
52
- * party it is for), else the party, with the amount and date for a money record
53
- * such as a payment. `undefined` when nothing names it.
101
+ * The text that names a record: its label field, else its identifier (a
102
+ * document is its number: `GRA-3159`, never `Ridgeline Construction ·
103
+ * GRA-3159`), else, for a money record such as a payment allocation, the party
104
+ * it is for with its amount and date, else the party and a description.
105
+ * `undefined` when nothing names it.
54
106
  */
55
107
  export function recordName(model, record, related, fields = model.fields) {
56
108
  const own = displayLabel(model, record);
57
109
  if (own)
58
110
  return own;
111
+ const identifier = identifierOf(model, record);
112
+ if (identifier)
113
+ return identifier;
59
114
  const partyOf = partyField(fields, record);
60
115
  const party = partyOf?.related
61
116
  ? related(partyOf, String(record[partyOf.name]))
62
117
  : undefined;
63
- const number = numberOf(model, record);
64
- if (number)
65
- return unique([number, party]);
66
118
  const moneyField = model.fields.find((f) => f.name === 'amount' && f.type === 'integer');
67
119
  if (moneyField && typeof record.amount === 'number') {
68
120
  const dateField = model.fields.find((f) => f.type === 'datetime' && DATE_NAME.test(f.name) && record[f.name]);
@@ -72,10 +124,21 @@ export function recordName(model, record, related, fields = model.fields) {
72
124
  dateField ? String(record[dateField.name]).slice(0, 10) : undefined,
73
125
  ]);
74
126
  }
75
- const reference = ['reference', 'description']
76
- .map((name) => record[name])
77
- .find((v) => typeof v === 'string' && v.trim() !== '');
78
- return unique([party, reference]);
127
+ const description = typeof record.description === 'string' && record.description.trim() !== ''
128
+ ? record.description
129
+ : undefined;
130
+ return unique([party, description]);
131
+ }
132
+ /**
133
+ * A record page's heading: a document is its kind and identifier
134
+ * (`Order GRA-3159`), anything else its name. `kind` is the model's name
135
+ * as a person reads it ("Order", "Purchase order").
136
+ */
137
+ export function recordHeading(model, record, name, kind) {
138
+ if (displayLabel(model, record))
139
+ return name;
140
+ const identifier = identifierOf(model, record);
141
+ return identifier && identifier === name ? `${kind} ${identifier}` : name;
79
142
  }
80
143
  function unique(parts) {
81
144
  const kept = parts.filter((p) => Boolean(p));
@@ -10,8 +10,10 @@ export declare function createRandom(seed: number): () => number;
10
10
  /** FNV-1a hash of a string, for seeding. */
11
11
  export declare function hashString(value: string): number;
12
12
  /**
13
- * Money is stored as integer minor units (cents). A field is money when it is
14
- * an integer whose name says so; everything else numeric is a plain number.
13
+ * Money is stored as integer minor units (cents). An integer field is money
14
+ * when the manifest says so (`ui.format === 'money'`); a field that declares
15
+ * any other format is not, and neither is a framework-managed one. With no
16
+ * declared format the field's name decides.
15
17
  */
16
18
  export declare function isMoneyField(field: CatalogField): boolean;
17
19
  /**
@@ -25,18 +27,53 @@ export declare const PRODUCT_CATALOG: readonly {
25
27
  }[];
26
28
  /** Fixed clock so seeded timestamps never change between runs. */
27
29
  export declare const EPOCH: number;
30
+ /** Sample rows per model unless a pack or {@link SAMPLE_ROW_COUNTS} says otherwise. */
31
+ export declare const DEFAULT_SAMPLE_ROWS = 8;
28
32
  /** A UUID-shaped id derived from a seed string. */
29
33
  export declare function fakeId(seed: string): string;
30
34
  /** Fractions a tax rate takes: 0%, 5%, 8.25%, 13% and 20%. */
31
35
  export declare const TAX_RATES: readonly [0, 0.05, 0.0825, 0.13, 0.2];
36
+ /**
37
+ * The sample tax rate when neither the app's setting nor the pack names one:
38
+ * every line of every document is taxed at it, so a document's tax is one
39
+ * rate of its subtotal, as on a real invoice.
40
+ */
41
+ export declare const DEFAULT_SAMPLE_TAX_RATE = 0.05;
32
42
  export declare const SAMPLE_ROW_COUNTS: Readonly<Record<string, number>>;
33
- /** Sample rows for a model: the pack's count, else the shared one, else `fallback`. */
43
+ /**
44
+ * How many rows of each customer-linked model (orders, quotes, invoices,
45
+ * payments: any model with a FK to a Customer) point at each sample customer:
46
+ * 3 to 6, uneven, seeded by the customer's index so it never changes. The
47
+ * slots interleave (every customer once, then again...), so a list's first
48
+ * rows still show different customers and row `n < customers` points at
49
+ * customer `n`.
50
+ */
51
+ export declare function customerSlots(customers: number): readonly number[];
52
+ /**
53
+ * Sample rows for a model: the pack's count, else the shared one, else, for a
54
+ * customer-linked model, one per {@link customerSlots} slot, else `fallback`.
55
+ */
34
56
  export declare function sampleRowCount(modelId: string, fallback: number): number;
35
- /** One fake value for a field. Money is an integer number of minor units. */
36
- export declare function fakeValue(field: CatalogField, random: () => number, context: {
57
+ /**
58
+ * Which row of the target a sample relation points at. Rows are seeded with
59
+ * ids from `(model, index)`, so pointing at index `n` points at a real row;
60
+ * spread over every row of the target, so each sample record has related
61
+ * records (a customer several orders, quotes and invoices), not just the
62
+ * first few.
63
+ */
64
+ export declare function relatedIndex(field: CatalogField, context: FakeContext): number;
65
+ /**
66
+ * Where a fake value is made: the model, the row's index and the data
67
+ * source's rows per model (default {@link DEFAULT_SAMPLE_ROWS}), so a
68
+ * reference points at a row the source actually made.
69
+ */
70
+ export interface FakeContext {
37
71
  modelId: string;
38
72
  index: number;
39
- }): unknown;
73
+ rows?: number;
74
+ }
75
+ /** One fake value for a field. Money is an integer number of minor units. */
76
+ export declare function fakeValue(field: CatalogField, random: () => number, context: FakeContext): unknown;
40
77
  /** Fields a person edits: everything the framework does not manage. */
41
78
  export declare function editableFields(model: CatalogModel): CatalogField[];
42
79
  export declare const DAY: number;
@@ -47,6 +84,8 @@ export declare const DAY: number;
47
84
  */
48
85
  export declare function packLine(index: number): PackLine | undefined;
49
86
  /** A single seeded record for a model. */
50
- export declare function fakeRecord(model: CatalogModel, index: number, seed: number): ModelRecord;
51
- /** `count` seeded records for a model. */
52
- export declare function fakeRecords(model: CatalogModel, count: number, seed?: number): ModelRecord[];
87
+ export declare function fakeRecord(model: CatalogModel, index: number, seed: number, rows?: number): ModelRecord;
88
+ /** Every `EXEMPT_EVERY`th sample customer does not pay sales tax. */
89
+ export declare const EXEMPT_EVERY = 8;
90
+ /** `count` seeded records for a model; `rows` is the source's rows per model. */
91
+ export declare function fakeRecords(model: CatalogModel, count: number, seed?: number, rows?: number): ModelRecord[];