@cosmicdrift/kumiko-samples 0.377.0 → 0.379.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.
- package/package.json +1 -1
- package/packages/bundled-features/package.json +18 -17
- package/packages/bundled-features/src/account-security/feature.ts +2 -2
- package/packages/bundled-features/src/account-security/index.ts +8 -8
- package/packages/bundled-features/src/account-security/{constants.ts → web/constants.ts} +0 -2
- package/packages/bundled-features/src/account-security/{i18n.ts → web/i18n.ts} +0 -1
- package/packages/bundled-features/src/admin-shell/feature.ts +10 -9
- package/packages/bundled-features/src/admin-shell/index.ts +8 -8
- package/packages/bundled-features/src/admin-shell/web/client-plugin.tsx +2 -3
- package/packages/bundled-features/src/admin-shell/{constants.ts → web/constants.ts} +0 -1
- package/packages/bundled-features/src/admin-shell/web/default-translations.ts +10 -0
- package/packages/bundled-features/src/admin-shell/web/i18n.ts +51 -9
- package/packages/bundled-features/src/admin-shell/web/index.ts +0 -1
- package/packages/bundled-features/src/audit/changes.json +7 -0
- package/packages/bundled-features/src/audit/feature.ts +72 -64
- package/packages/bundled-features/src/audit/handlers/audit-events.ts +153 -0
- package/packages/bundled-features/src/audit/handlers/audit-system-db.ts +13 -0
- package/packages/bundled-features/src/audit/handlers/details-all-tenants.query.ts +26 -0
- package/packages/bundled-features/src/audit/handlers/details.query.ts +11 -39
- package/packages/bundled-features/src/audit/handlers/list-all-tenants.query.ts +47 -0
- package/packages/bundled-features/src/audit/handlers/list.query.ts +16 -123
- package/packages/bundled-features/src/audit/handlers/resolve-audit-tenant.ts +21 -7
- package/packages/bundled-features/src/audit/index.ts +1 -1
- package/packages/bundled-features/src/audit/run-escape-hatch-retention.ts +4 -4
- package/packages/bundled-features/src/audit/screens.ts +82 -0
- package/packages/bundled-features/src/audit/web/client-plugin.tsx +2 -3
- package/packages/bundled-features/src/audit/{constants.ts → web/constants.ts} +11 -1
- package/packages/bundled-features/src/audit/web/default-translations.ts +7 -0
- package/packages/bundled-features/src/audit/web/i18n.ts +33 -7
- package/packages/bundled-features/src/audit/web/index.ts +0 -2
- package/packages/bundled-features/src/auth-email-password/bootstrap.ts +6 -6
- package/packages/bundled-features/src/auth-email-password/changes.json +6 -0
- package/packages/bundled-features/src/auth-email-password/errors.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/feature.ts +2 -2
- package/packages/bundled-features/src/auth-email-password/handlers/confirm-account-unlock.write.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/invite-accept-with-login.write.ts +4 -4
- package/packages/bundled-features/src/auth-email-password/handlers/invite-create.write.ts +3 -3
- package/packages/bundled-features/src/auth-email-password/handlers/invite-info.query.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/login.write.ts +38 -4
- package/packages/bundled-features/src/auth-email-password/handlers/request-account-unlock.write.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/request-email-verification.write.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/request-password-reset.write.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/reset-password.write.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/handlers/verify-email.write.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/index.ts +6 -1
- package/packages/bundled-features/src/auth-email-password/mail-notifications.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/signup-activation.ts +1 -1
- package/packages/bundled-features/src/auth-email-password/web/auth-client.ts +0 -1
- package/packages/bundled-features/src/auth-email-password/web/auth-form-logic.ts +0 -1
- package/packages/bundled-features/src/auth-email-password/web/auth-form-primitives.tsx +0 -1
- package/packages/bundled-features/src/auth-email-password/web/auth-gate.tsx +0 -1
- package/packages/bundled-features/src/auth-email-password/web/auth-redirect.ts +0 -1
- package/packages/bundled-features/src/auth-email-password/web/client-actions.ts +0 -1
- package/packages/bundled-features/src/auth-email-password/web/client-plugin.ts +1 -2
- package/packages/bundled-features/src/auth-email-password/web/confirm-account-unlock-screen.tsx +0 -1
- package/packages/bundled-features/src/auth-email-password/{constants.ts → web/constants.ts} +3 -6
- package/packages/bundled-features/src/auth-email-password/web/default-topbar-actions.tsx +0 -1
- package/packages/bundled-features/src/auth-email-password/web/forgot-password-screen.tsx +0 -1
- package/packages/bundled-features/src/auth-email-password/{i18n.ts → web/i18n.ts} +3 -4
- package/packages/bundled-features/src/auth-email-password/web/index.ts +1 -2
- package/packages/bundled-features/src/auth-email-password/web/invite-accept-screen.tsx +2 -3
- package/packages/bundled-features/src/auth-email-password/web/login-screen.tsx +0 -1
- package/packages/bundled-features/src/auth-email-password/{mail-i18n.ts → web/mail-i18n.ts} +0 -1
- package/packages/bundled-features/src/auth-email-password/web/request-account-unlock-screen.tsx +0 -1
- package/packages/bundled-features/src/auth-email-password/web/reset-password-screen.tsx +0 -1
- package/packages/bundled-features/src/auth-email-password/web/session-bootstrap-error.tsx +0 -1
- package/packages/bundled-features/src/auth-email-password/web/session.tsx +0 -1
- package/packages/bundled-features/src/auth-email-password/web/signup-complete-screen.tsx +2 -3
- package/packages/bundled-features/src/auth-email-password/web/signup-screen.tsx +0 -1
- package/packages/bundled-features/src/auth-email-password/web/tenant-menu-items.tsx +0 -1
- package/packages/bundled-features/src/auth-email-password/web/tenant-switcher.tsx +0 -1
- package/packages/bundled-features/src/auth-email-password/web/use-shell-user.ts +0 -1
- package/packages/bundled-features/src/auth-email-password/web/user-menu.tsx +0 -1
- package/packages/bundled-features/src/auth-email-password/web/verify-email-screen.tsx +0 -1
- package/packages/bundled-features/src/auth-mfa/changes.json +6 -0
- package/packages/bundled-features/src/auth-mfa/errors.ts +2 -2
- package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm-preauth.write.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/handlers/enable-start-preauth.write.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/handlers/enable-start.write.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/handlers/verify.write.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/index.ts +8 -8
- package/packages/bundled-features/src/auth-mfa/mfa-status-checker.ts +4 -4
- package/packages/bundled-features/src/auth-mfa/screens.ts +1 -1
- package/packages/bundled-features/src/auth-mfa/web/client-plugin.ts +0 -1
- package/packages/bundled-features/src/auth-mfa/{constants.ts → web/constants.ts} +0 -1
- package/packages/bundled-features/src/auth-mfa/web/i18n.ts +0 -1
- package/packages/bundled-features/src/auth-mfa/web/index.ts +0 -1
- package/packages/bundled-features/src/auth-mfa/web/mfa-client.ts +0 -1
- package/packages/bundled-features/src/auth-mfa/web/mfa-disable-dialog.tsx +1 -2
- package/packages/bundled-features/src/auth-mfa/web/mfa-recovery-codes-reveal.tsx +0 -1
- package/packages/bundled-features/src/auth-mfa/web/mfa-regenerate-recovery-dialog.tsx +1 -2
- package/packages/bundled-features/src/auth-mfa/web/mfa-setup-preauth-screen.tsx +21 -23
- package/packages/bundled-features/src/auth-mfa/web/mfa-verify-screen.tsx +0 -1
- package/packages/bundled-features/src/billing-foundation/changes.json +18 -0
- package/packages/bundled-features/src/billing-foundation/checkout-core.ts +3 -3
- package/packages/bundled-features/src/billing-foundation/consumer-protection/consent-text.ts +2 -2
- package/packages/bundled-features/src/billing-foundation/consumer-protection/issue-confirmation.ts +11 -3
- package/packages/bundled-features/src/billing-foundation/consumer-protection/mail-notifications.ts +11 -1
- package/packages/bundled-features/src/billing-foundation/consumer-protection/register-consent.ts +1 -1
- package/packages/bundled-features/src/billing-foundation/consumer-protection/register-termination.ts +12 -1
- package/packages/bundled-features/src/billing-foundation/consumer-protection/stored-user-email.ts +12 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-mail.ts +6 -1
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-notify.ts +1 -1
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-pages.ts +167 -28
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-record.ts +102 -3
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-request.ts +43 -12
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-revoke.ts +202 -0
- package/packages/bundled-features/src/billing-foundation/consumer-protection/termination-texts.ts +70 -0
- package/packages/bundled-features/src/billing-foundation/events.ts +20 -2
- package/packages/bundled-features/src/billing-foundation/feature.ts +5 -5
- package/packages/bundled-features/src/billing-foundation/handlers/process-event.write.ts +82 -9
- package/packages/bundled-features/src/billing-foundation/handlers/switch-plan.write.ts +1 -1
- package/packages/bundled-features/src/billing-foundation/handlers/sync-subscription.write.ts +1 -1
- package/packages/bundled-features/src/billing-foundation/index.ts +27 -27
- package/packages/bundled-features/src/billing-foundation/plan-catalog.ts +7 -7
- package/packages/bundled-features/src/billing-foundation/screens.ts +1 -1
- package/packages/bundled-features/src/billing-foundation/subscription-tier-sync.ts +1 -1
- package/packages/bundled-features/src/billing-foundation/types.ts +17 -3
- package/packages/bundled-features/src/billing-foundation/validate-options.ts +3 -3
- package/packages/bundled-features/src/billing-foundation/web/billing-contact-plan.tsx +1 -3
- package/packages/bundled-features/src/billing-foundation/web/billing-plans-panel.tsx +5 -7
- package/packages/bundled-features/src/billing-foundation/web/cancel-contract-dialog.tsx +1 -3
- package/packages/bundled-features/src/billing-foundation/web/checkout-consent-dialog.tsx +1 -3
- package/packages/bundled-features/src/billing-foundation/web/client-plugin.tsx +1 -2
- package/packages/bundled-features/src/billing-foundation/{constants.ts → web/constants.ts} +37 -31
- package/packages/bundled-features/src/billing-foundation/{consumer-protection → web/consumer-protection}/consent-locale.ts +0 -1
- package/packages/bundled-features/src/billing-foundation/{contact-card.ts → web/contact-card.ts} +0 -2
- package/packages/bundled-features/src/billing-foundation/web/index.ts +14 -15
- package/packages/bundled-features/src/billing-foundation/web/localized-params.ts +0 -2
- package/packages/bundled-features/src/billing-foundation/webhook-handler.ts +5 -2
- package/packages/bundled-features/src/cap-counter/changes.json +12 -0
- package/packages/bundled-features/src/cap-counter/stock-cap-guard.ts +9 -0
- package/packages/bundled-features/src/cap-overview/feature.ts +1 -1
- package/packages/bundled-features/src/cap-overview/handlers/caps-usage.query.ts +1 -1
- package/packages/bundled-features/src/cap-overview/handlers/tenant-caps-list.query.ts +2 -2
- package/packages/bundled-features/src/cap-overview/index.ts +9 -9
- package/packages/bundled-features/src/cap-overview/screens.ts +2 -2
- package/packages/bundled-features/src/cap-overview/web/cap-cards-panel.tsx +1 -2
- package/packages/bundled-features/src/cap-overview/web/cap-usage-bar.tsx +1 -2
- package/packages/bundled-features/src/cap-overview/web/cap-usage-cell.tsx +0 -2
- package/packages/bundled-features/src/cap-overview/web/client-plugin.tsx +3 -4
- package/packages/bundled-features/src/cap-overview/{constants.ts → web/constants.ts} +0 -1
- package/packages/bundled-features/src/cap-overview/web/index.ts +0 -1
- package/packages/bundled-features/src/cap-overview/{usage-math.ts → web/usage-math.ts} +1 -2
- package/packages/bundled-features/src/compliance-profiles/feature.ts +5 -5
- package/packages/bundled-features/src/compliance-profiles/index.ts +6 -6
- package/packages/bundled-features/src/compliance-profiles/web/client-plugin.tsx +2 -3
- package/packages/bundled-features/src/compliance-profiles/web/compliance-profile-catalog.tsx +1 -2
- package/packages/bundled-features/src/compliance-profiles/{constants.ts → web/constants.ts} +0 -1
- package/packages/bundled-features/src/compliance-profiles/web/i18n.ts +0 -1
- package/packages/bundled-features/src/compliance-profiles/web/index.ts +0 -1
- package/packages/bundled-features/src/config/index.ts +6 -6
- package/packages/bundled-features/src/config/web/client-plugin.ts +1 -2
- package/packages/bundled-features/src/config/{constants.ts → web/constants.ts} +0 -1
- package/packages/bundled-features/src/config/web/i18n.ts +1 -1
- package/packages/bundled-features/src/config/web/index.ts +1 -3
- package/packages/bundled-features/src/config/write-helpers.ts +1 -1
- package/packages/bundled-features/src/custom-fields/feature.ts +8 -8
- package/packages/bundled-features/src/custom-fields/handlers/clear-custom-field.write.ts +1 -1
- package/packages/bundled-features/src/custom-fields/handlers/define-tenant-field.write.ts +1 -1
- package/packages/bundled-features/src/custom-fields/handlers/delete-system-field.write.ts +1 -1
- package/packages/bundled-features/src/custom-fields/handlers/delete-tenant-field.write.ts +4 -4
- package/packages/bundled-features/src/custom-fields/handlers/set-custom-field.write.ts +1 -1
- package/packages/bundled-features/src/custom-fields/handlers/update-tenant-field.write.ts +1 -1
- package/packages/bundled-features/src/custom-fields/index.ts +8 -8
- package/packages/bundled-features/src/custom-fields/lib/value-schema.ts +1 -1
- package/packages/bundled-features/src/custom-fields/schemas.ts +1 -1
- package/packages/bundled-features/src/custom-fields/web/client-plugin.tsx +1 -2
- package/packages/bundled-features/src/custom-fields/{constants.ts → web/constants.ts} +18 -19
- package/packages/bundled-features/src/custom-fields/web/custom-fields-form-section.tsx +1 -2
- package/packages/bundled-features/src/custom-fields/web/i18n.ts +0 -1
- package/packages/bundled-features/src/custom-fields/web/index.ts +2 -3
- package/packages/bundled-features/src/custom-fields/wire-for-entity.ts +1 -2
- package/packages/bundled-features/src/delivery/address-opt-out.ts +1 -1
- package/packages/bundled-features/src/delivery/attempt-log-retention.ts +24 -8
- package/packages/bundled-features/src/delivery/changes.json +6 -0
- package/packages/bundled-features/src/delivery/constants.ts +2 -2
- package/packages/bundled-features/src/delivery/i18n.ts +1 -1
- package/packages/bundled-features/src/delivery/unsubscribe-page.ts +1 -1
- package/packages/bundled-features/src/delivery/web/client-plugin.tsx +6 -7
- package/packages/bundled-features/src/delivery/web/delivery-channel-cell.tsx +0 -1
- package/packages/bundled-features/src/delivery/web/delivery-error-cell.tsx +0 -1
- package/packages/bundled-features/src/delivery/web/delivery-status-cell.tsx +1 -2
- package/packages/bundled-features/src/delivery/web/delivery-time-cell.tsx +0 -1
- package/packages/bundled-features/src/delivery/web/delivery-type-cell.tsx +0 -1
- package/packages/bundled-features/src/delivery/web/index.ts +0 -1
- package/packages/bundled-features/src/delivery/{public-names.ts → web/public-names.ts} +0 -1
- package/packages/bundled-features/src/document-ingest-foundation/changes.json +6 -0
- package/packages/bundled-features/src/document-ingest-foundation/events.ts +4 -0
- package/packages/bundled-features/src/document-ingest-foundation/executor.ts +2 -1
- package/packages/bundled-features/src/document-ingest-foundation/feature.ts +18 -4
- package/packages/bundled-features/src/document-ingest-foundation/index.ts +1 -0
- package/packages/bundled-features/src/feature-toggles/feature.ts +7 -7
- package/packages/bundled-features/src/feature-toggles/handlers/list.query.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/handlers/registered.query.ts +1 -1
- package/packages/bundled-features/src/feature-toggles/handlers/set.write.ts +3 -3
- package/packages/bundled-features/src/feature-toggles/index.ts +6 -6
- package/packages/bundled-features/src/feature-toggles/web/client-plugin.tsx +1 -2
- package/packages/bundled-features/src/feature-toggles/{constants.ts → web/constants.ts} +0 -1
- package/packages/bundled-features/src/feature-toggles/web/i18n.ts +0 -1
- package/packages/bundled-features/src/feature-toggles/web/index.ts +0 -1
- package/packages/bundled-features/src/files/changes.json +7 -0
- package/packages/bundled-features/src/folders/feature.ts +1 -1
- package/packages/bundled-features/src/folders/handlers/clear-folder.write.ts +1 -1
- package/packages/bundled-features/src/folders/handlers/delete-folder.write.ts +1 -1
- package/packages/bundled-features/src/folders/handlers/set-folder.write.ts +1 -1
- package/packages/bundled-features/src/folders/index.ts +8 -8
- package/packages/bundled-features/src/folders/web/client-plugin.tsx +1 -3
- package/packages/bundled-features/src/folders/{constants.ts → web/constants.ts} +0 -1
- package/packages/bundled-features/src/folders/web/folder-manager.tsx +1 -2
- package/packages/bundled-features/src/folders/web/folder-section.tsx +1 -2
- package/packages/bundled-features/src/folders/web/i18n.ts +0 -1
- package/packages/bundled-features/src/folders/web/index.ts +1 -2
- package/packages/bundled-features/src/folders/web/tree.ts +0 -1
- package/packages/bundled-features/src/form-draft/changes.json +7 -0
- package/packages/bundled-features/src/form-draft/db/queries/cleanup.ts +25 -11
- package/packages/bundled-features/src/form-draft/decrypt-draft.ts +24 -0
- package/packages/bundled-features/src/form-draft/entity.ts +6 -9
- package/packages/bundled-features/src/form-draft/feature.ts +1 -1
- package/packages/bundled-features/src/form-draft/handlers/cleanup.job.ts +26 -5
- package/packages/bundled-features/src/form-draft/handlers/discard.write.ts +1 -1
- package/packages/bundled-features/src/form-draft/handlers/get.query.ts +6 -7
- package/packages/bundled-features/src/form-draft/handlers/list.query.ts +13 -7
- package/packages/bundled-features/src/form-draft/handlers/save.write.ts +5 -5
- package/packages/bundled-features/src/form-draft/index.ts +8 -8
- package/packages/bundled-features/src/form-draft/lookup.ts +10 -4
- package/packages/bundled-features/src/form-draft/schemas.ts +1 -1
- package/packages/bundled-features/src/form-draft/{constants.ts → web/constants.ts} +0 -1
- package/packages/bundled-features/src/form-draft-user-data/hooks.ts +2 -2
- package/packages/bundled-features/src/inbound-mail-foundation/changes.json +6 -0
- package/packages/bundled-features/src/inbound-mail-foundation/handlers/list-accounts.query.ts +11 -4
- package/packages/bundled-features/src/inbound-mail-foundation/retention-sweep.ts +10 -10
- package/packages/bundled-features/src/jobs/feature.ts +7 -7
- package/packages/bundled-features/src/jobs/handlers/retry.write.ts +1 -1
- package/packages/bundled-features/src/jobs/handlers/trigger.write.ts +1 -1
- package/packages/bundled-features/src/jobs/index.ts +1 -1
- package/packages/bundled-features/src/jobs/web/client-plugin.tsx +2 -3
- package/packages/bundled-features/src/jobs/{constants.ts → web/constants.ts} +0 -1
- package/packages/bundled-features/src/jobs/web/default-translations.ts +7 -0
- package/packages/bundled-features/src/jobs/web/i18n.ts +53 -7
- package/packages/bundled-features/src/jobs/web/index.ts +0 -1
- package/packages/bundled-features/src/ledger/changes.json +7 -0
- package/packages/bundled-features/src/ledger/entity.ts +1 -1
- package/packages/bundled-features/src/ledger/feature.ts +1 -1
- package/packages/bundled-features/src/ledger/handlers/confirm-schedule-period.write.ts +2 -10
- package/packages/bundled-features/src/ledger/handlers/create-transaction.write.ts +1 -1
- package/packages/bundled-features/src/ledger/handlers/reports.query.ts +1 -1
- package/packages/bundled-features/src/ledger/handlers/reverse-transaction.write.ts +1 -1
- package/packages/bundled-features/src/ledger/index.ts +13 -13
- package/packages/bundled-features/src/ledger/recurring.ts +1 -1
- package/packages/bundled-features/src/ledger/reports.ts +1 -1
- package/packages/bundled-features/src/ledger/schemas.ts +1 -1
- package/packages/bundled-features/src/ledger/{constants.ts → web/constants.ts} +0 -1
- package/packages/bundled-features/src/ledger/web/index.ts +11 -12
- package/packages/bundled-features/src/legal-pages/README.md +1 -1
- package/packages/bundled-features/src/legal-pages/feature.ts +5 -5
- package/packages/bundled-features/src/legal-pages/index.ts +11 -11
- package/packages/bundled-features/src/legal-pages/lib/boot-check.ts +1 -1
- package/packages/bundled-features/src/legal-pages/lib/validate-routes.ts +1 -1
- package/packages/bundled-features/src/legal-pages/web/client-plugin.ts +1 -2
- package/packages/bundled-features/src/legal-pages/{constants.ts → web/constants.ts} +6 -8
- package/packages/bundled-features/src/legal-pages/web/index.ts +0 -1
- package/packages/bundled-features/src/mail-foundation/changes.json +6 -0
- package/packages/bundled-features/src/mail-foundation/i18n.ts +3 -2
- package/packages/bundled-features/src/mail-transport-smtp/i18n.ts +1 -1
- package/packages/bundled-features/src/managed-pages/feature.ts +1 -1
- package/packages/bundled-features/src/managed-pages/web/client-plugin.tsx +1 -2
- package/packages/bundled-features/src/managed-pages/web/default-translations.ts +17 -0
- package/packages/bundled-features/src/managed-pages/web/i18n.ts +59 -16
- package/packages/bundled-features/src/managed-pages/web/index.ts +1 -2
- package/packages/bundled-features/src/metrics/compute.ts +1 -1
- package/packages/bundled-features/src/metrics/feature.ts +6 -6
- package/packages/bundled-features/src/metrics/index.ts +8 -8
- package/packages/bundled-features/src/metrics/types.ts +1 -1
- package/packages/bundled-features/src/metrics/validate.ts +1 -1
- package/packages/bundled-features/src/metrics/{constants.ts → web/constants.ts} +0 -1
- package/packages/bundled-features/src/metrics/window.ts +1 -1
- package/packages/bundled-features/src/notes-history/feature.ts +1 -1
- package/packages/bundled-features/src/notes-history/handlers/add-note.write.ts +1 -1
- package/packages/bundled-features/src/notes-history/index.ts +8 -8
- package/packages/bundled-features/src/notes-history/web/client-plugin.tsx +1 -3
- package/packages/bundled-features/src/notes-history/{constants.ts → web/constants.ts} +0 -1
- package/packages/bundled-features/src/notes-history/web/i18n.ts +0 -1
- package/packages/bundled-features/src/notes-history/web/index.ts +2 -3
- package/packages/bundled-features/src/notes-history/web/notes-section.tsx +2 -3
- package/packages/bundled-features/src/personal-access-tokens/feature.ts +12 -10
- package/packages/bundled-features/src/personal-access-tokens/handlers/available-scopes.query.ts +1 -1
- package/packages/bundled-features/src/personal-access-tokens/handlers/create.write.ts +1 -1
- package/packages/bundled-features/src/personal-access-tokens/handlers/revoke.write.ts +1 -1
- package/packages/bundled-features/src/personal-access-tokens/hash.ts +1 -1
- package/packages/bundled-features/src/personal-access-tokens/i18n.ts +2 -2
- package/packages/bundled-features/src/personal-access-tokens/index.ts +5 -5
- package/packages/bundled-features/src/personal-access-tokens/resolver.ts +1 -1
- package/packages/bundled-features/src/personal-access-tokens/schema/api-token.ts +1 -1
- package/packages/bundled-features/src/personal-access-tokens/screens.ts +2 -2
- package/packages/bundled-features/src/personal-access-tokens/{constants.ts → web/constants.ts} +0 -1
- package/packages/bundled-features/src/personal-access-tokens/{scopes.ts → web/scopes.ts} +0 -1
- package/packages/bundled-features/src/presets/changes.json +7 -0
- package/packages/bundled-features/src/presets/index.ts +0 -1
- package/packages/bundled-features/src/presets/security-baseline.ts +1 -1
- package/packages/bundled-features/src/renderer-foundation/types.ts +1 -1
- package/packages/bundled-features/src/secrets/feature.ts +1 -1
- package/packages/bundled-features/src/secrets/handlers/delete.write.ts +1 -1
- package/packages/bundled-features/src/secrets/handlers/list.query.ts +1 -1
- package/packages/bundled-features/src/secrets/handlers/set.write.ts +1 -1
- package/packages/bundled-features/src/secrets/i18n.ts +1 -1
- package/packages/bundled-features/src/secrets/index.ts +8 -8
- package/packages/bundled-features/src/secrets/{constants.ts → web/constants.ts} +0 -1
- package/packages/bundled-features/src/secrets/write-gate.ts +1 -1
- package/packages/bundled-features/src/sessions/feature.ts +7 -4
- package/packages/bundled-features/src/sessions/{i18n.ts → web/i18n.ts} +0 -1
- package/packages/bundled-features/src/shared/index.ts +6 -1
- package/packages/bundled-features/src/shared/purge-files-reaching-subject.ts +10 -2
- package/packages/bundled-features/src/shared/web/translate-or-raw.ts +0 -1
- package/packages/bundled-features/src/subscription-stripe/feature.ts +2 -0
- package/packages/bundled-features/src/subscription-stripe/plugin-methods.ts +19 -0
- package/packages/bundled-features/src/subscription-stripe/verify-webhook.ts +1 -0
- package/packages/bundled-features/src/tags/changes.json +6 -0
- package/packages/bundled-features/src/tags/feature.ts +1 -1
- package/packages/bundled-features/src/tags/handlers/assign-tag.write.ts +11 -7
- package/packages/bundled-features/src/tags/handlers/create-tag.write.ts +1 -1
- package/packages/bundled-features/src/tags/handlers/delete-tag.write.ts +4 -1
- package/packages/bundled-features/src/tags/handlers/remove-tag.write.ts +1 -1
- package/packages/bundled-features/src/tags/handlers/update-tag.write.ts +1 -1
- package/packages/bundled-features/src/tags/index.ts +12 -12
- package/packages/bundled-features/src/tags/screens.ts +1 -1
- package/packages/bundled-features/src/tags/web/client-plugin.tsx +1 -3
- package/packages/bundled-features/src/tags/{constants.ts → web/constants.ts} +4 -1
- package/packages/bundled-features/src/tags/web/entity-tags.tsx +1 -2
- package/packages/bundled-features/src/tags/web/i18n.ts +2 -2
- package/packages/bundled-features/src/tags/web/index.ts +2 -3
- package/packages/bundled-features/src/tags/web/tag-chip.tsx +0 -1
- package/packages/bundled-features/src/tags/web/tag-filter.tsx +1 -2
- package/packages/bundled-features/src/tags/web/tag-manager.tsx +5 -4
- package/packages/bundled-features/src/tags/web/tag-picker.tsx +0 -1
- package/packages/bundled-features/src/tags/web/tag-section.tsx +1 -2
- package/packages/bundled-features/src/tags/web/tags-cell.tsx +1 -2
- package/packages/bundled-features/src/template-resolver/README.md +1 -1
- package/packages/bundled-features/src/template-resolver/api.ts +75 -28
- package/packages/bundled-features/src/template-resolver/changes.json +63 -0
- package/packages/bundled-features/src/template-resolver/compile-document-body.ts +62 -4
- package/packages/bundled-features/src/template-resolver/compile-steps-block.ts +2 -2
- package/packages/bundled-features/src/template-resolver/document-ops.ts +5 -5
- package/packages/bundled-features/src/template-resolver/document-sanitizer.ts +39 -4
- package/packages/bundled-features/src/template-resolver/feature.ts +88 -38
- package/packages/bundled-features/src/template-resolver/handlers/by-slug.query.ts +6 -1
- package/packages/bundled-features/src/template-resolver/handlers/by-tenant.query.ts +6 -2
- package/packages/bundled-features/src/template-resolver/handlers/collection-item.query.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/collection-list.query.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/collection-set.write.ts +20 -7
- package/packages/bundled-features/src/template-resolver/handlers/collection-shared.ts +0 -6
- package/packages/bundled-features/src/template-resolver/handlers/copy-locale.write.ts +69 -60
- package/packages/bundled-features/src/template-resolver/handlers/diff-to-system.query.ts +7 -1
- package/packages/bundled-features/src/template-resolver/handlers/discard-draft.write.ts +37 -14
- package/packages/bundled-features/src/template-resolver/handlers/document-base.ts +8 -2
- package/packages/bundled-features/src/template-resolver/handlers/document-blocks.query.ts +2 -2
- package/packages/bundled-features/src/template-resolver/handlers/export-bundle.query.ts +5 -2
- package/packages/bundled-features/src/template-resolver/handlers/find-by-id.query.ts +4 -2
- package/packages/bundled-features/src/template-resolver/handlers/import-bundle.write.ts +37 -28
- package/packages/bundled-features/src/template-resolver/handlers/layout-source.query.ts +10 -5
- package/packages/bundled-features/src/template-resolver/handlers/list.query.ts +5 -2
- package/packages/bundled-features/src/template-resolver/handlers/overview.query.ts +132 -70
- package/packages/bundled-features/src/template-resolver/handlers/patch-draft.write.ts +106 -97
- package/packages/bundled-features/src/template-resolver/handlers/reset-to-system.write.ts +62 -49
- package/packages/bundled-features/src/template-resolver/handlers/resource-link-pdf.write.ts +44 -29
- package/packages/bundled-features/src/template-resolver/handlers/resource-remove.write.ts +52 -36
- package/packages/bundled-features/src/template-resolver/handlers/resource-shared.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/resource-upload.write.ts +127 -107
- package/packages/bundled-features/src/template-resolver/handlers/send-test-shared.ts +38 -0
- package/packages/bundled-features/src/template-resolver/handlers/send-test-status.query.ts +31 -0
- package/packages/bundled-features/src/template-resolver/handlers/send-test.write.ts +106 -112
- package/packages/bundled-features/src/template-resolver/handlers/set.write.ts +111 -104
- package/packages/bundled-features/src/template-resolver/handlers/shared.ts +1 -1
- package/packages/bundled-features/src/template-resolver/handlers/template-gates.ts +6 -6
- package/packages/bundled-features/src/template-resolver/handlers/template-write.ts +2 -2
- package/packages/bundled-features/src/template-resolver/handlers/toggle-status.write.ts +56 -28
- package/packages/bundled-features/src/template-resolver/handlers/upsert-tenant.write.ts +38 -29
- package/packages/bundled-features/src/template-resolver/handlers/usage.query.ts +8 -2
- package/packages/bundled-features/src/template-resolver/handlers/validate.query.ts +4 -2
- package/packages/bundled-features/src/template-resolver/i18n.ts +25 -0
- package/packages/bundled-features/src/template-resolver/index.ts +68 -60
- package/packages/bundled-features/src/template-resolver/layout-appearance.ts +1 -1
- package/packages/bundled-features/src/template-resolver/layout-regions.ts +1 -1
- package/packages/bundled-features/src/template-resolver/seeding.ts +16 -7
- package/packages/bundled-features/src/template-resolver/store-template-resource.ts +2 -2
- package/packages/bundled-features/src/template-resolver/table.ts +1 -1
- package/packages/bundled-features/src/template-resolver/template-bundle.ts +2 -2
- package/packages/bundled-features/src/template-resolver/template-delivery-policy.ts +82 -0
- package/packages/bundled-features/src/template-resolver/template-draft.ts +1 -1
- package/packages/bundled-features/src/template-resolver/template-edit-policy.ts +91 -0
- package/packages/bundled-features/src/template-resolver/template-meta.ts +2 -2
- package/packages/bundled-features/src/template-resolver/template-preview.ts +22 -12
- package/packages/bundled-features/src/template-resolver/template-usage.ts +1 -1
- package/packages/bundled-features/src/template-resolver/template-validation.ts +33 -12
- package/packages/bundled-features/src/template-resolver/testing.ts +2 -2
- package/packages/bundled-features/src/template-resolver/user-content-table.ts +1 -1
- package/packages/bundled-features/src/template-resolver/web/client-plugin.tsx +4 -5
- package/packages/bundled-features/src/template-resolver/{constants.ts → web/constants.ts} +10 -10
- package/packages/bundled-features/src/template-resolver/{document-blocks.ts → web/document-blocks.ts} +3 -2
- package/packages/bundled-features/src/template-resolver/web/document-editor-extensions.ts +31 -3
- package/packages/bundled-features/src/template-resolver/web/document-editor.tsx +0 -1
- package/packages/bundled-features/src/template-resolver/web/document-images.ts +28 -0
- package/packages/bundled-features/src/template-resolver/{document-schema.ts → web/document-schema.ts} +5 -1
- package/packages/bundled-features/src/template-resolver/{document-steps.ts → web/document-steps.ts} +0 -1
- package/packages/bundled-features/src/template-resolver/web/document-tiptap-editor.tsx +48 -11
- package/packages/bundled-features/src/template-resolver/web/document-toolbar-blocks.ts +4 -3
- package/packages/bundled-features/src/template-resolver/web/editor-handle.ts +1 -2
- package/packages/bundled-features/src/template-resolver/web/i18n.ts +8 -1
- package/packages/bundled-features/src/template-resolver/web/index.ts +13 -14
- package/packages/bundled-features/src/template-resolver/{mail-constants.ts → web/mail-constants.ts} +0 -1
- package/packages/bundled-features/src/template-resolver/{pdf-constants.ts → web/pdf-constants.ts} +0 -1
- package/packages/bundled-features/src/template-resolver/web/placeholder-line-editor-lazy.tsx +0 -1
- package/packages/bundled-features/src/template-resolver/web/placeholder-line-editor.tsx +5 -4
- package/packages/bundled-features/src/template-resolver/{placeholder-text.ts → web/placeholder-text.ts} +0 -1
- package/packages/bundled-features/src/template-resolver/{qualified-names.ts → web/qualified-names.ts} +2 -1
- package/packages/bundled-features/src/template-resolver/web/use-stable-by-key.ts +0 -1
- package/packages/bundled-features/src/tenant/handlers/add-member.write.ts +1 -1
- package/packages/bundled-features/src/tenant/index.ts +7 -7
- package/packages/bundled-features/src/tenant/invitation-table.ts +1 -1
- package/packages/bundled-features/src/tenant/invited-membership.ts +1 -1
- package/packages/bundled-features/src/tenant/last-tenant-admin.ts +1 -1
- package/packages/bundled-features/src/tenant/member-role-options.ts +1 -1
- package/packages/bundled-features/src/tenant/screens.ts +2 -2
- package/packages/bundled-features/src/tenant/web/client-plugin.tsx +1 -2
- package/packages/bundled-features/src/tenant/{constants.ts → web/constants.ts} +3 -6
- package/packages/bundled-features/src/tenant/web/index.ts +0 -1
- package/packages/bundled-features/src/tenant/web/member-roles-cell.tsx +0 -1
- package/packages/bundled-features/src/tenant/web/member-status-cell.tsx +0 -1
- package/packages/bundled-features/src/tenant-lifecycle/stages.ts +2 -2
- package/packages/bundled-features/src/tier-engine/entity.ts +1 -1
- package/packages/bundled-features/src/tier-engine/feature.ts +7 -7
- package/packages/bundled-features/src/tier-engine/handlers/set-tenant-tier.write.ts +1 -1
- package/packages/bundled-features/src/tier-engine/index.ts +8 -8
- package/packages/bundled-features/src/tier-engine/web/client-plugin.tsx +2 -3
- package/packages/bundled-features/src/tier-engine/{constants.ts → web/constants.ts} +2 -3
- package/packages/bundled-features/src/tier-engine/{i18n.ts → web/i18n.ts} +0 -1
- package/packages/bundled-features/src/tier-engine/web/index.ts +0 -1
- package/packages/bundled-features/src/user/handlers/create.write.ts +1 -1
- package/packages/bundled-features/src/user/handlers/update-roles.ts +1 -1
- package/packages/bundled-features/src/user/handlers/update.write.ts +1 -1
- package/packages/bundled-features/src/user/index.ts +1 -1
- package/packages/bundled-features/src/user/invited-global-roles.ts +1 -1
- package/packages/bundled-features/src/user/schema/user.ts +1 -1
- package/packages/bundled-features/src/user/{constants.ts → web/constants.ts} +0 -1
- package/packages/bundled-features/src/user-data-rights/changes.json +14 -0
- package/packages/bundled-features/src/user-data-rights/env.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/feature.ts +9 -9
- package/packages/bundled-features/src/user-data-rights/index.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/lib/resolve-tenant-model.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/mail-notifications.ts +1 -1
- package/packages/bundled-features/src/user-data-rights/web/client-plugin.tsx +2 -3
- package/packages/bundled-features/src/user-data-rights/web/confirm-deletion-screen.tsx +0 -1
- package/packages/bundled-features/src/user-data-rights/{constants.ts → web/constants.ts} +11 -12
- package/packages/bundled-features/src/user-data-rights/web/default-translations.ts +91 -0
- package/packages/bundled-features/src/user-data-rights/web/i18n.ts +41 -91
- package/packages/bundled-features/src/user-data-rights/web/index.ts +1 -2
- package/packages/bundled-features/src/user-data-rights/web/privacy-center-screen.tsx +1 -2
- package/packages/bundled-features/src/user-data-rights/web/public-deletion-gate.tsx +0 -1
- package/packages/bundled-features/src/user-data-rights/web/request-deletion-screen.tsx +0 -1
- package/packages/bundled-features/src/user-data-rights-defaults/hooks/file-ref.userdata-hook.ts +10 -1
- package/packages/bundled-features/src/user-profile/feature.ts +2 -2
- package/packages/bundled-features/src/user-profile/handlers/change-email.write.ts +1 -1
- package/packages/bundled-features/src/user-profile/index.ts +3 -2
- package/packages/bundled-features/src/user-profile/web/client-plugin.ts +2 -3
- package/packages/bundled-features/src/user-profile/{constants.ts → web/constants.ts} +0 -1
- package/packages/bundled-features/src/user-profile/{i18n.ts → web/i18n.ts} +0 -1
- package/packages/bundled-features/src/user-profile/web/profile-screen.tsx +2 -3
- package/packages/bundled-features/src/waitlist/changes.json +6 -0
- package/packages/bundled-features/src/waitlist/entity.ts +1 -1
- package/packages/bundled-features/src/waitlist/feature.ts +5 -5
- package/packages/bundled-features/src/waitlist/handlers/export-purge.write.ts +3 -3
- package/packages/bundled-features/src/waitlist/handlers/invite.write.ts +5 -1
- package/packages/bundled-features/src/waitlist/handlers/reject.write.ts +1 -1
- package/packages/bundled-features/src/waitlist/handlers/submit.write.ts +3 -3
- package/packages/bundled-features/src/waitlist/import.ts +1 -1
- package/packages/bundled-features/src/waitlist/index.ts +11 -11
- package/packages/bundled-features/src/waitlist/legacy-migrate.ts +1 -1
- package/packages/bundled-features/src/waitlist/link-on-signup.ts +1 -1
- package/packages/bundled-features/src/waitlist/mail.ts +7 -6
- package/packages/bundled-features/src/waitlist/payloads.ts +1 -1
- package/packages/bundled-features/src/waitlist/screens.ts +1 -1
- package/packages/bundled-features/src/waitlist/{constants.ts → web/constants.ts} +0 -1
- package/samples/apps/styleguide/src/features/content/web.tsx +0 -1
- package/samples/apps/ui-walkthrough/src/app/client.tsx +2 -0
- package/samples/apps/ui-walkthrough/src/app/help-action.tsx +37 -0
- package/samples/apps/ui-walkthrough/src/app/seed-rental.ts +17 -1
- package/samples/apps/ui-walkthrough/src/app/seed-templates.ts +13 -0
- package/samples/apps/ui-walkthrough/src/app/server.ts +2 -1
- package/samples/apps/ui-walkthrough/src/app/shell.tsx +6 -0
- package/samples/apps/ui-walkthrough/src/app/template-seed-data.ts +20 -0
- package/samples/apps/ui-walkthrough/src/features/billing/feature.ts +35 -7
- package/samples/apps/ui-walkthrough/src/features/billing/i18n.ts +6 -0
- package/samples/apps/ui-walkthrough/src/features/rental/entities.ts +27 -0
- package/samples/apps/ui-walkthrough/src/features/rental/feature.ts +120 -2
- package/samples/apps/ui-walkthrough/src/features/rental/i18n.ts +94 -0
- package/samples/apps/ui-walkthrough/src/features/rental/invoice-receive.ts +19 -0
- package/samples/apps/ui-walkthrough/src/features/rental/lease-support.ts +32 -1
- package/samples/apps/ui-walkthrough/src/features/rental/qualified-names.ts +5 -0
- package/samples/apps/ui-walkthrough/src/features/rental/receipts-upload.ts +70 -0
- package/samples/apps/ui-walkthrough/src/features/rental/screens.ts +156 -0
- package/samples/apps/ui-walkthrough/src/features/subscription-plans/feature.ts +103 -0
- package/samples/apps/ui-walkthrough/src/features/subscription-plans/i18n.ts +36 -0
- package/samples/apps/ui-walkthrough/src/features/subscription-plans/index.ts +2 -0
- package/samples/apps/ui-walkthrough/src/features/subscription-plans/seed.ts +21 -0
- package/samples/apps/ui-walkthrough/src/features/tasks/i18n.ts +8 -0
- package/samples/apps/ui-walkthrough/src/run-config.ts +43 -3
- package/samples/apps/use-all-bundled/e2e-billing-gallery/server.ts +1 -1
- package/samples/apps/use-all-bundled/feature-manifest.json +5 -5
- package/samples/apps/use-all-bundled/scripts/check-coverage.ts +1 -1
- package/samples/apps/use-all-bundled/src/app/dev-app-options.ts +3 -1
- package/samples/recipes/compose-stacks/README.md +1 -2
- package/samples/recipes/delivery-notifications/README.md +1 -1
- package/samples/recipes/embedded/README.md +8 -0
- package/samples/recipes/embedded/src/feature.ts +8 -0
- package/samples/recipes/embedded/src/handlers/invoice-receive.write.ts +37 -0
- package/samples/recipes/embedded/src/screens/invoice-receive.screen.ts +56 -0
- package/samples/recipes/legal-pages/README.md +2 -2
- package/samples/recipes/legal-pages/src/feature.ts +1 -1
- package/samples/recipes/reference-data/src/feature.ts +3 -7
- package/packages/bundled-features/src/admin-shell/i18n.ts +0 -54
- package/packages/bundled-features/src/audit/i18n.ts +0 -25
- package/packages/bundled-features/src/auth-mfa/web/qrcode-browser.d.ts +0 -11
- package/packages/bundled-features/src/jobs/i18n.ts +0 -55
- package/packages/bundled-features/src/managed-pages/i18n.ts +0 -63
- package/packages/bundled-features/src/presets/dsgvo-self-service.ts +0 -35
- package/packages/bundled-features/src/user-data-rights/i18n.ts +0 -44
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { fieldToZod, withFormDerivations } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { receiveInvoiceLines, receiveInvoiceScreen } from "./screens";
|
|
4
|
+
|
|
5
|
+
const moneyPayload = z.object({ amount: z.number(), currency: z.string().min(1) });
|
|
6
|
+
|
|
7
|
+
// Totals are recomputed from the lines before validation, so a client-sent
|
|
8
|
+
// total never reaches the handler.
|
|
9
|
+
export const receiveInvoicePayloadSchema = withFormDerivations(
|
|
10
|
+
z.object({
|
|
11
|
+
supplier: z.string().min(1),
|
|
12
|
+
invoiceNumber: z.string().min(1),
|
|
13
|
+
lines: fieldToZod(receiveInvoiceLines, ["EUR"]),
|
|
14
|
+
netTotal: moneyPayload,
|
|
15
|
+
vatTotal: moneyPayload,
|
|
16
|
+
grossTotal: moneyPayload,
|
|
17
|
+
}),
|
|
18
|
+
receiveInvoiceScreen,
|
|
19
|
+
);
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { createEntityExecutor } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
2
|
import { getTemporal } from "@cosmicdrift/kumiko-framework/time";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
leaseEntity,
|
|
6
|
+
leasePartyEntity,
|
|
7
|
+
leasePositionEntity,
|
|
8
|
+
managementProfileEntity,
|
|
9
|
+
} from "./entities";
|
|
5
10
|
|
|
6
11
|
export const { executor: leaseExecutor } = createEntityExecutor("lease", leaseEntity);
|
|
7
12
|
export const { executor: positionExecutor } = createEntityExecutor(
|
|
@@ -10,8 +15,34 @@ export const { executor: positionExecutor } = createEntityExecutor(
|
|
|
10
15
|
);
|
|
11
16
|
export const { executor: partyExecutor } = createEntityExecutor("leaseParty", leasePartyEntity);
|
|
12
17
|
|
|
18
|
+
export const { executor: managementProfileExecutor } = createEntityExecutor(
|
|
19
|
+
"managementProfile",
|
|
20
|
+
managementProfileEntity,
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
export const saveManagementProfilePayloadSchema = z.object({
|
|
24
|
+
name: z.string().min(1).max(200),
|
|
25
|
+
anschrift: z.string().max(400).optional(),
|
|
26
|
+
zahlungsziel: z.number().int().min(0).max(120),
|
|
27
|
+
});
|
|
28
|
+
|
|
13
29
|
export const idPayloadSchema = z.object({ id: z.uuid() });
|
|
14
30
|
|
|
31
|
+
// Walkthrough shortcut, not the pattern: a real handler reads the photo ids from the stored record, never from the client.
|
|
32
|
+
export const propertyExposePayloadSchema = z.object({
|
|
33
|
+
propertyAddress: z.string().min(1),
|
|
34
|
+
propertySummary: z.string().min(1),
|
|
35
|
+
photos: z.array(z.uuid()).max(10),
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// Walkthrough shortcut, not the pattern: real screens resolve FileRefs from the record, never from route-supplied ids.
|
|
39
|
+
export const fileRefIdsPayloadSchema = z.object({
|
|
40
|
+
id: z
|
|
41
|
+
.string()
|
|
42
|
+
.transform((raw) => raw.split(","))
|
|
43
|
+
.pipe(z.array(z.uuid()).min(1).max(10)),
|
|
44
|
+
});
|
|
45
|
+
|
|
15
46
|
export const rentAdjustPayloadSchema = z.object({
|
|
16
47
|
positionId: z.uuid(),
|
|
17
48
|
wirksamAb: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
export const RENTAL_QUERIES = {
|
|
2
2
|
leaseAkte: "rental:query:lease:akte",
|
|
3
|
+
leaseUnterlagen: "rental:query:lease:unterlagen",
|
|
3
4
|
partyList: "rental:query:lease-party:list",
|
|
4
5
|
positionList: "rental:query:lease:positions",
|
|
5
6
|
kennzahlen: "rental:query:lease:kennzahlen",
|
|
7
|
+
managementProfile: "rental:query:profile:current",
|
|
6
8
|
} as const;
|
|
7
9
|
|
|
8
10
|
export const RENTAL_WRITES = {
|
|
9
11
|
leaseTerminate: "rental:write:lease:terminate",
|
|
10
12
|
rentAdjust: "rental:write:rent:adjust",
|
|
11
13
|
positionsRecord: "rental:write:lease:record-positions",
|
|
14
|
+
invoiceReceive: "rental:write:invoice:receive",
|
|
15
|
+
receiptsUpload: "rental:write:receipts-upload",
|
|
16
|
+
managementProfileSave: "rental:write:profile:save",
|
|
12
17
|
} as const;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { createEntityExecutor, type WriteHandlerFn } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
|
+
import { UnprocessableError } from "@cosmicdrift/kumiko-framework/errors";
|
|
3
|
+
import {
|
|
4
|
+
bindPendingFileRef,
|
|
5
|
+
FILE_REF_ENTITY_NAME,
|
|
6
|
+
fileRefEntity,
|
|
7
|
+
loadPendingFileRef,
|
|
8
|
+
} from "@cosmicdrift/kumiko-framework/files";
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { receiptEntity } from "./entities";
|
|
11
|
+
|
|
12
|
+
const UPLOAD_SCREEN_QN = "rental:screen:upload-standard-layout";
|
|
13
|
+
const UPLOAD_FIELD = "belege";
|
|
14
|
+
|
|
15
|
+
const { executor: receiptExecutor } = createEntityExecutor("receipt", receiptEntity);
|
|
16
|
+
const { executor: fileRefExecutor } = createEntityExecutor(FILE_REF_ENTITY_NAME, fileRefEntity);
|
|
17
|
+
|
|
18
|
+
export const receiptsUploadPayloadSchema = z.object({
|
|
19
|
+
belege: z.array(z.uuid()).min(1).max(10),
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const unknownFile = () =>
|
|
23
|
+
new UnprocessableError("unknown_upload", { i18nKey: "rental.upload.unknownFile" });
|
|
24
|
+
|
|
25
|
+
// The form only carries file ids. Each one must be the caller's own, still unbound upload of this
|
|
26
|
+
// form; everything is checked before the first receipt is written so a bad id creates nothing.
|
|
27
|
+
export const uploadReceipts: WriteHandlerFn<z.infer<typeof receiptsUploadPayloadSchema>> = async (
|
|
28
|
+
event,
|
|
29
|
+
ctx,
|
|
30
|
+
) => {
|
|
31
|
+
const { user, payload } = event;
|
|
32
|
+
const pendingNames: { readonly fileRefId: string; readonly fileName: string }[] = [];
|
|
33
|
+
for (const fileRefId of new Set(payload.belege)) {
|
|
34
|
+
const pending = await loadPendingFileRef({
|
|
35
|
+
fileRefId,
|
|
36
|
+
entityName: UPLOAD_SCREEN_QN,
|
|
37
|
+
fieldName: UPLOAD_FIELD,
|
|
38
|
+
user,
|
|
39
|
+
db: ctx.db,
|
|
40
|
+
});
|
|
41
|
+
if (pending === undefined) throw unknownFile();
|
|
42
|
+
// fileName is personal data and may be encrypted, so only the executor's detail returns it.
|
|
43
|
+
const row = await fileRefExecutor.detail({ id: fileRefId }, user, ctx.db);
|
|
44
|
+
if (row === null) throw unknownFile();
|
|
45
|
+
pendingNames.push({ fileRefId, fileName: String(row["fileName"]) });
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const belege: { readonly label: string }[] = [];
|
|
49
|
+
for (const { fileRefId, fileName } of pendingNames) {
|
|
50
|
+
const created = await receiptExecutor.create(
|
|
51
|
+
{ datei: fileRefId, dateiname: fileName },
|
|
52
|
+
user,
|
|
53
|
+
ctx.db,
|
|
54
|
+
);
|
|
55
|
+
if (!created.isSuccess) return created;
|
|
56
|
+
const outcome = await bindPendingFileRef({
|
|
57
|
+
fileRefId,
|
|
58
|
+
entityName: UPLOAD_SCREEN_QN,
|
|
59
|
+
fieldName: UPLOAD_FIELD,
|
|
60
|
+
entityId: String(created.data.id),
|
|
61
|
+
bindTo: { entityName: "receipt", fieldName: "datei" },
|
|
62
|
+
registry: ctx.registry,
|
|
63
|
+
user,
|
|
64
|
+
db: ctx.db,
|
|
65
|
+
});
|
|
66
|
+
if (outcome !== "bound") throw unknownFile();
|
|
67
|
+
belege.push({ label: fileName });
|
|
68
|
+
}
|
|
69
|
+
return { isSuccess: true, data: { count: belege.length, belege } };
|
|
70
|
+
};
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createDateField,
|
|
3
3
|
createEmbeddedListField,
|
|
4
|
+
createFilesField,
|
|
5
|
+
createNumberField,
|
|
4
6
|
createSelectField,
|
|
5
7
|
createTextField,
|
|
6
8
|
} from "@cosmicdrift/kumiko-framework/engine";
|
|
@@ -11,6 +13,7 @@ import type {
|
|
|
11
13
|
EntityListScreenDefinition,
|
|
12
14
|
ProjectionDetailScreenDefinition,
|
|
13
15
|
} from "@cosmicdrift/kumiko-framework/ui-types";
|
|
16
|
+
import { RECEIPT_ACCEPT } from "./entities";
|
|
14
17
|
import { PAYMENT_METHODS, POSITION_KINDS, POSITION_MEASURES } from "./lease-support";
|
|
15
18
|
import { RENTAL_QUERIES, RENTAL_WRITES } from "./qualified-names";
|
|
16
19
|
|
|
@@ -361,10 +364,50 @@ export const rentalDashboardScreen: DashboardScreenDefinition = {
|
|
|
361
364
|
valueField: "rent",
|
|
362
365
|
subField: "rentSub",
|
|
363
366
|
},
|
|
367
|
+
{
|
|
368
|
+
kind: "text",
|
|
369
|
+
id: "profile-hint",
|
|
370
|
+
label: "rental.dashboard.profileHint.title",
|
|
371
|
+
blocks: [
|
|
372
|
+
{ kind: "paragraph", text: "rental.dashboard.profileHint.text" },
|
|
373
|
+
{
|
|
374
|
+
kind: "link",
|
|
375
|
+
text: "rental.dashboard.profileHint.link",
|
|
376
|
+
screen: "management-profile",
|
|
377
|
+
roles: ["Admin"],
|
|
378
|
+
},
|
|
379
|
+
],
|
|
380
|
+
},
|
|
364
381
|
],
|
|
365
382
|
access: OPEN_ACCESS,
|
|
366
383
|
};
|
|
367
384
|
|
|
385
|
+
export const managementProfileScreen: ActionFormScreenDefinition = {
|
|
386
|
+
id: "management-profile",
|
|
387
|
+
type: "actionForm",
|
|
388
|
+
handler: RENTAL_WRITES.managementProfileSave,
|
|
389
|
+
load: { query: RENTAL_QUERIES.managementProfile, singleton: true },
|
|
390
|
+
fields: {
|
|
391
|
+
name: createTextField({ personal: false, reason: "is_business_data", required: true }),
|
|
392
|
+
anschrift: createTextField({ personal: false, reason: "is_business_data" }),
|
|
393
|
+
zahlungsziel: createNumberField({ integer: true, required: true }),
|
|
394
|
+
},
|
|
395
|
+
fieldLabels: {
|
|
396
|
+
name: "rental:entity:__action-form__:field:profileName",
|
|
397
|
+
anschrift: "rental:entity:__action-form__:field:anschrift",
|
|
398
|
+
zahlungsziel: "rental:entity:__action-form__:field:zahlungsziel",
|
|
399
|
+
},
|
|
400
|
+
layout: {
|
|
401
|
+
sections: [
|
|
402
|
+
{
|
|
403
|
+
description: "rental.managementProfile.hint",
|
|
404
|
+
fields: ["name", "anschrift", "zahlungsziel"],
|
|
405
|
+
},
|
|
406
|
+
],
|
|
407
|
+
},
|
|
408
|
+
access: OPEN_ACCESS,
|
|
409
|
+
};
|
|
410
|
+
|
|
368
411
|
export const adjustRentScreen: ActionFormScreenDefinition = {
|
|
369
412
|
id: "adjust-rent",
|
|
370
413
|
type: "actionForm",
|
|
@@ -462,6 +505,63 @@ export const recordPositionsScreen: ActionFormScreenDefinition = {
|
|
|
462
505
|
access: OPEN_ACCESS,
|
|
463
506
|
};
|
|
464
507
|
|
|
508
|
+
const EUR = { kind: "literal", code: "EUR" } as const;
|
|
509
|
+
|
|
510
|
+
export const receiveInvoiceLines = createEmbeddedListField(
|
|
511
|
+
{
|
|
512
|
+
description: { type: "text", required: true },
|
|
513
|
+
amount: { type: "money", required: true },
|
|
514
|
+
vatRate: { type: "decimal", scale: 2, required: true },
|
|
515
|
+
vatAmount: { type: "money" },
|
|
516
|
+
},
|
|
517
|
+
{
|
|
518
|
+
minItems: 1,
|
|
519
|
+
derived: { vatAmount: { op: "percent", from: ["amount", "vatRate"] } },
|
|
520
|
+
totals: [
|
|
521
|
+
{ label: "rental.total.net", from: ["amount"] },
|
|
522
|
+
{ label: "rental.total.vat", from: ["vatAmount"] },
|
|
523
|
+
{ label: "rental.total.gross", from: ["amount", "vatAmount"] },
|
|
524
|
+
],
|
|
525
|
+
},
|
|
526
|
+
);
|
|
527
|
+
|
|
528
|
+
export const receiveInvoiceScreen: ActionFormScreenDefinition = {
|
|
529
|
+
id: "receive-invoice",
|
|
530
|
+
type: "actionForm",
|
|
531
|
+
handler: RENTAL_WRITES.invoiceReceive,
|
|
532
|
+
fields: {
|
|
533
|
+
supplier: createTextField({ personal: "tenant", find: "none", required: true }),
|
|
534
|
+
invoiceNumber: createTextField({
|
|
535
|
+
personal: false,
|
|
536
|
+
reason: "is_business_data",
|
|
537
|
+
required: true,
|
|
538
|
+
}),
|
|
539
|
+
lines: receiveInvoiceLines,
|
|
540
|
+
netTotal: { type: "money", currency: EUR },
|
|
541
|
+
vatTotal: { type: "money", currency: EUR },
|
|
542
|
+
grossTotal: { type: "money", currency: EUR },
|
|
543
|
+
},
|
|
544
|
+
derive: {
|
|
545
|
+
netTotal: { op: "listSum", list: "lines", cell: "amount" },
|
|
546
|
+
vatTotal: { op: "listSum", list: "lines", cell: "vatAmount" },
|
|
547
|
+
grossTotal: { op: "sum", from: ["netTotal", "vatTotal"] },
|
|
548
|
+
},
|
|
549
|
+
layout: {
|
|
550
|
+
width: "full",
|
|
551
|
+
sections: [
|
|
552
|
+
{ fields: ["supplier", "invoiceNumber"] },
|
|
553
|
+
{
|
|
554
|
+
title: "rental.section.invoiceLines",
|
|
555
|
+
description: "rental.section.invoiceLines.description",
|
|
556
|
+
columns: 1,
|
|
557
|
+
fields: ["lines"],
|
|
558
|
+
},
|
|
559
|
+
],
|
|
560
|
+
},
|
|
561
|
+
submitLabel: "rental.action.receiveInvoice",
|
|
562
|
+
access: OPEN_ACCESS,
|
|
563
|
+
};
|
|
564
|
+
|
|
465
565
|
// Fixtures for the UI-gap screenshots: a confirm-gated primary action that is
|
|
466
566
|
// visible only while the lease is active (a terminated lease falls back to edit
|
|
467
567
|
// as the main button), and a list that is empty because of its default filter.
|
|
@@ -518,3 +618,59 @@ export const leaseSuccessionListScreen: EntityListScreenDefinition = {
|
|
|
518
618
|
rowActions: [openLeaseDetail],
|
|
519
619
|
access: OPEN_ACCESS,
|
|
520
620
|
};
|
|
621
|
+
|
|
622
|
+
export const leaseUnterlagenScreen: ProjectionDetailScreenDefinition = {
|
|
623
|
+
id: "lease-unterlagen",
|
|
624
|
+
type: "projectionDetail",
|
|
625
|
+
dormant: true,
|
|
626
|
+
query: RENTAL_QUERIES.leaseUnterlagen,
|
|
627
|
+
recordTitleField: "titel",
|
|
628
|
+
fieldLabels: { unterlagen: "rental.unterlagen.label" },
|
|
629
|
+
layout: {
|
|
630
|
+
sections: [
|
|
631
|
+
{
|
|
632
|
+
title: "rental.unterlagen.section",
|
|
633
|
+
description: "rental.unterlagen.sectionDescription",
|
|
634
|
+
icon: "file",
|
|
635
|
+
fields: [{ field: "unterlagen", renderer: { format: "file" } }],
|
|
636
|
+
},
|
|
637
|
+
],
|
|
638
|
+
},
|
|
639
|
+
access: OPEN_ACCESS,
|
|
640
|
+
};
|
|
641
|
+
|
|
642
|
+
export const uploadReceiptsScreen: ActionFormScreenDefinition = {
|
|
643
|
+
id: "upload-standard-layout",
|
|
644
|
+
type: "actionForm",
|
|
645
|
+
description: "rental.upload.screenDescription",
|
|
646
|
+
handler: RENTAL_WRITES.receiptsUpload,
|
|
647
|
+
fields: {
|
|
648
|
+
belege: createFilesField({
|
|
649
|
+
personal: false,
|
|
650
|
+
reason: "is_business_data",
|
|
651
|
+
accept: RECEIPT_ACCEPT,
|
|
652
|
+
maxSize: "10MB",
|
|
653
|
+
maxCount: 10,
|
|
654
|
+
display: "dropzone",
|
|
655
|
+
}),
|
|
656
|
+
},
|
|
657
|
+
fieldLabels: { belege: "rental:entity:__action-form__:field:belege" },
|
|
658
|
+
layout: {
|
|
659
|
+
sections: [
|
|
660
|
+
{
|
|
661
|
+
icon: "upload",
|
|
662
|
+
title: "rental.upload.zoneTitle",
|
|
663
|
+
description: "rental.upload.description",
|
|
664
|
+
fields: ["belege"],
|
|
665
|
+
},
|
|
666
|
+
],
|
|
667
|
+
},
|
|
668
|
+
submitLabel: "rental.upload.submit",
|
|
669
|
+
successFacts: [
|
|
670
|
+
{ field: "count", label: "rental.upload.factCount" },
|
|
671
|
+
{ field: "belege", label: "rental.upload.factFiles" },
|
|
672
|
+
],
|
|
673
|
+
resetOnSuccess: true,
|
|
674
|
+
cancelTarget: false,
|
|
675
|
+
access: OPEN_ACCESS,
|
|
676
|
+
};
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createBillingFoundationFeature,
|
|
3
|
+
type ProviderPrice,
|
|
4
|
+
type SubscriptionProviderPlugin,
|
|
5
|
+
} from "@cosmicdrift/kumiko-bundled-features/billing-foundation";
|
|
6
|
+
import { defineFeature, i18nKey } from "@cosmicdrift/kumiko-framework/engine";
|
|
7
|
+
import { toKeyFirst } from "../translations";
|
|
8
|
+
import { subscriptionPlansTranslations } from "./i18n";
|
|
9
|
+
|
|
10
|
+
export const PLAN_PROVIDER = "nordlicht-mock-provider";
|
|
11
|
+
export const PLAN_TERMS_SLUG = "portal-terms";
|
|
12
|
+
const PLAN_PATH = "/billing-plans";
|
|
13
|
+
|
|
14
|
+
const PRICE_IDS = { starter: "price_portal_starter", pro: "price_portal_professional" };
|
|
15
|
+
|
|
16
|
+
const PRICES: readonly ProviderPrice[] = [
|
|
17
|
+
{
|
|
18
|
+
priceId: PRICE_IDS.starter,
|
|
19
|
+
unitAmount: 1900,
|
|
20
|
+
currency: "eur",
|
|
21
|
+
interval: "month",
|
|
22
|
+
intervalCount: 1,
|
|
23
|
+
active: true,
|
|
24
|
+
metadata: {},
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
priceId: PRICE_IDS.pro,
|
|
28
|
+
unitAmount: 4900,
|
|
29
|
+
currency: "eur",
|
|
30
|
+
interval: "month",
|
|
31
|
+
intervalCount: 1,
|
|
32
|
+
active: true,
|
|
33
|
+
metadata: {},
|
|
34
|
+
},
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
// The sample talks to no payment provider: prices are fixed and checkout just returns to the plans screen.
|
|
38
|
+
const mockProvider: SubscriptionProviderPlugin = {
|
|
39
|
+
verifyAndParseWebhook: async (rawBody) => JSON.parse(rawBody),
|
|
40
|
+
priceToTier: { [PRICE_IDS.starter]: "starter", [PRICE_IDS.pro]: "pro" },
|
|
41
|
+
retrievePrices: async (_ctx, priceIds) => PRICES.filter((p) => priceIds.includes(p.priceId)),
|
|
42
|
+
createCheckoutSession: async (_ctx, options) => ({ url: options.successUrl }),
|
|
43
|
+
cancelSubscription: async () => {},
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export function createPortalBillingFeature(baseUrl: string) {
|
|
47
|
+
return createBillingFoundationFeature({
|
|
48
|
+
baseUrl,
|
|
49
|
+
catalog: {
|
|
50
|
+
plans: ["starter", "pro"],
|
|
51
|
+
tierLabelKey: (tier) => `subscription-plans:plan.${tier}.label`,
|
|
52
|
+
benefits: (tier) => [
|
|
53
|
+
{ labelKey: `subscription-plans:plan.${tier}.benefit.units` },
|
|
54
|
+
{ labelKey: `subscription-plans:plan.${tier}.benefit.support` },
|
|
55
|
+
],
|
|
56
|
+
resolveCurrentTier: async () => "free",
|
|
57
|
+
viewRoles: ["TenantAdmin", "SystemAdmin"],
|
|
58
|
+
successPath: PLAN_PATH,
|
|
59
|
+
cancelPath: PLAN_PATH,
|
|
60
|
+
providerName: PLAN_PROVIDER,
|
|
61
|
+
contact: {
|
|
62
|
+
labelKey: "subscription-plans:plan.portfolio.label",
|
|
63
|
+
benefits: [{ labelKey: "subscription-plans:plan.portfolio.benefit" }],
|
|
64
|
+
actionLabelKey: "subscription-plans:plan.portfolio.action",
|
|
65
|
+
href: "mailto:vertrieb@nordlicht-immobilien.de",
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
consumerProtection: {
|
|
69
|
+
termsTextBlock: PLAN_TERMS_SLUG,
|
|
70
|
+
vatNote: { de: "Preise inkl. USt.", en: "Prices include VAT." },
|
|
71
|
+
operatorEmail: "abrechnung@nordlicht-immobilien.de",
|
|
72
|
+
legalLinks: {
|
|
73
|
+
de: {
|
|
74
|
+
terms: "https://nordlicht-immobilien.de/agb",
|
|
75
|
+
withdrawal: "https://nordlicht-immobilien.de/widerruf",
|
|
76
|
+
privacy: "https://nordlicht-immobilien.de/datenschutz",
|
|
77
|
+
},
|
|
78
|
+
en: {
|
|
79
|
+
terms: "https://nordlicht-immobilien.de/terms",
|
|
80
|
+
withdrawal: "https://nordlicht-immobilien.de/withdrawal",
|
|
81
|
+
privacy: "https://nordlicht-immobilien.de/privacy",
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Named after the screen it opens: "billing" already belongs to the invoice mails.
|
|
89
|
+
export const subscriptionPlansFeature = defineFeature("subscription-plans", (r) => {
|
|
90
|
+
r.describe("Plan overview of the tenant admin: nav entry, plan labels and the mock provider.");
|
|
91
|
+
r.requires({ features: ["billing-foundation"] });
|
|
92
|
+
r.translations({ keys: toKeyFirst(subscriptionPlansTranslations) });
|
|
93
|
+
r.useExtension("subscriptionProvider", PLAN_PROVIDER, mockProvider);
|
|
94
|
+
r.nav({
|
|
95
|
+
id: "subscription-plans",
|
|
96
|
+
label: i18nKey("subscription-plans.nav.plans"),
|
|
97
|
+
icon: "file",
|
|
98
|
+
screen: "billing-foundation:screen:billing-plans",
|
|
99
|
+
order: 50,
|
|
100
|
+
access: { roles: ["TenantAdmin", "SystemAdmin"] },
|
|
101
|
+
});
|
|
102
|
+
return {};
|
|
103
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
|
|
2
|
+
|
|
3
|
+
export const subscriptionPlansTranslations: TranslationsByLocale = {
|
|
4
|
+
de: {
|
|
5
|
+
"subscription-plans.nav.plans": "Tarif und Abrechnung",
|
|
6
|
+
"subscription-plans:plan.free.label": "Basis",
|
|
7
|
+
"subscription-plans:plan.free.benefit.units": "Bis zu 3 Wohneinheiten",
|
|
8
|
+
"subscription-plans:plan.free.benefit.support": "Hilfe-Center",
|
|
9
|
+
"subscription-plans:plan.starter.label": "Starter",
|
|
10
|
+
"subscription-plans:plan.starter.benefit.units": "Bis zu 25 Wohneinheiten",
|
|
11
|
+
"subscription-plans:plan.starter.benefit.support": "Support per E-Mail",
|
|
12
|
+
"subscription-plans:plan.pro.label": "Professional",
|
|
13
|
+
"subscription-plans:plan.pro.benefit.units": "Bis zu 150 Wohneinheiten",
|
|
14
|
+
"subscription-plans:plan.pro.benefit.support": "Telefonischer Support",
|
|
15
|
+
"subscription-plans:plan.portfolio.label": "Portfolio",
|
|
16
|
+
"subscription-plans:plan.portfolio.benefit":
|
|
17
|
+
"Größere Bestände mit individuellen Konditionen und festem Ansprechpartner",
|
|
18
|
+
"subscription-plans:plan.portfolio.action": "Vertrieb kontaktieren",
|
|
19
|
+
},
|
|
20
|
+
en: {
|
|
21
|
+
"subscription-plans.nav.plans": "Plan and billing",
|
|
22
|
+
"subscription-plans:plan.free.label": "Basic",
|
|
23
|
+
"subscription-plans:plan.free.benefit.units": "Up to 3 residential units",
|
|
24
|
+
"subscription-plans:plan.free.benefit.support": "Help center",
|
|
25
|
+
"subscription-plans:plan.starter.label": "Starter",
|
|
26
|
+
"subscription-plans:plan.starter.benefit.units": "Up to 25 residential units",
|
|
27
|
+
"subscription-plans:plan.starter.benefit.support": "Support by email",
|
|
28
|
+
"subscription-plans:plan.pro.label": "Professional",
|
|
29
|
+
"subscription-plans:plan.pro.benefit.units": "Up to 150 residential units",
|
|
30
|
+
"subscription-plans:plan.pro.benefit.support": "Support by phone",
|
|
31
|
+
"subscription-plans:plan.portfolio.label": "Portfolio",
|
|
32
|
+
"subscription-plans:plan.portfolio.benefit":
|
|
33
|
+
"Larger portfolios with individual terms and a dedicated contact",
|
|
34
|
+
"subscription-plans:plan.portfolio.action": "Contact sales",
|
|
35
|
+
},
|
|
36
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { seedTextBlock } from "@cosmicdrift/kumiko-bundled-features/template-resolver/seeding";
|
|
2
|
+
import type { SeedFn } from "@cosmicdrift/kumiko-dev-server";
|
|
3
|
+
import { SYSTEM_TENANT_ID } from "@cosmicdrift/kumiko-framework/engine";
|
|
4
|
+
import { PLAN_TERMS_SLUG } from "./feature";
|
|
5
|
+
|
|
6
|
+
const TERMS_BY_LOCALE: Readonly<Record<string, string>> = {
|
|
7
|
+
de: "Diese Bedingungen gelten für alle kostenpflichtigen Tarife des Nordlicht Mieterportals. Der Vertrag läuft monatlich und ist zum Ende des Abrechnungszeitraums kündbar.",
|
|
8
|
+
en: "These terms apply to every paid plan of the Nordlicht tenant portal. The contract renews monthly and can be terminated at the end of the billing period.",
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export const seedPlanTerms: SeedFn = async (stack) => {
|
|
12
|
+
for (const [locale, content] of Object.entries(TERMS_BY_LOCALE)) {
|
|
13
|
+
await seedTextBlock(stack.db, {
|
|
14
|
+
tenantId: SYSTEM_TENANT_ID,
|
|
15
|
+
slug: PLAN_TERMS_SLUG,
|
|
16
|
+
locale,
|
|
17
|
+
title: "Nutzungsbedingungen",
|
|
18
|
+
content,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
};
|
|
@@ -9,6 +9,10 @@ export const tasksTranslations: TranslationsByLocale = {
|
|
|
9
9
|
"tasks.assistant.label": "Assistent",
|
|
10
10
|
"tasks.assistant.description": "Der Assistent ist im Walkthrough nicht angebunden.",
|
|
11
11
|
"tasks.assistant.close": "Schließen",
|
|
12
|
+
"tasks.help.label": "Hilfe",
|
|
13
|
+
"tasks.help.description": "Kurzhilfe zur aktuellen Seite.",
|
|
14
|
+
"tasks.help.body":
|
|
15
|
+
"Die Seite bleibt bedienbar: Sie rückt neben das Hilfefenster, statt darunter zu verschwinden.",
|
|
12
16
|
"tasks.nav.group": "Allgemein",
|
|
13
17
|
"tasks.nav.list": "Aufgaben",
|
|
14
18
|
"tasks.nav.new": "Neue Aufgabe",
|
|
@@ -29,6 +33,10 @@ export const tasksTranslations: TranslationsByLocale = {
|
|
|
29
33
|
"tasks.assistant.label": "Assistant",
|
|
30
34
|
"tasks.assistant.description": "The assistant is not connected in the walkthrough.",
|
|
31
35
|
"tasks.assistant.close": "Close",
|
|
36
|
+
"tasks.help.label": "Help",
|
|
37
|
+
"tasks.help.description": "Quick help for the current page.",
|
|
38
|
+
"tasks.help.body":
|
|
39
|
+
"The page stays usable: it moves next to the help panel instead of disappearing under it.",
|
|
32
40
|
"tasks.nav.group": "General",
|
|
33
41
|
"tasks.nav.list": "Tasks",
|
|
34
42
|
"tasks.nav.new": "New task",
|
|
@@ -4,14 +4,22 @@
|
|
|
4
4
|
// from here — migration and runtime cannot drift.
|
|
5
5
|
|
|
6
6
|
import { createAuditFeature } from "@cosmicdrift/kumiko-bundled-features/audit";
|
|
7
|
+
import { AuthMailNotificationTypes } from "@cosmicdrift/kumiko-bundled-features/auth-email-password";
|
|
7
8
|
import {
|
|
8
9
|
createChannelEmailFeature,
|
|
9
10
|
createInMemoryTransport,
|
|
10
11
|
} from "@cosmicdrift/kumiko-bundled-features/channel-email";
|
|
12
|
+
import { createComplianceProfilesFeature } from "@cosmicdrift/kumiko-bundled-features/compliance-profiles";
|
|
11
13
|
import { createDeliveryFeature } from "@cosmicdrift/kumiko-bundled-features/delivery";
|
|
14
|
+
import { createFilesFeature } from "@cosmicdrift/kumiko-bundled-features/files";
|
|
12
15
|
import { createManagedPagesFeature } from "@cosmicdrift/kumiko-bundled-features/managed-pages";
|
|
13
16
|
import { createRendererFoundationFeature } from "@cosmicdrift/kumiko-bundled-features/renderer-foundation";
|
|
14
|
-
import {
|
|
17
|
+
import {
|
|
18
|
+
createTemplateResolverFeature,
|
|
19
|
+
type TenantEditableTemplate,
|
|
20
|
+
templateEditAccess,
|
|
21
|
+
} from "@cosmicdrift/kumiko-bundled-features/template-resolver";
|
|
22
|
+
import { createTenantLifecycleFeature } from "@cosmicdrift/kumiko-bundled-features/tenant-lifecycle";
|
|
15
23
|
import { createDocumentDesignerFeature } from "@cosmicdrift/kumiko-document-designer";
|
|
16
24
|
import { localeDe } from "@cosmicdrift/kumiko-locale-de";
|
|
17
25
|
import { localeEs } from "@cosmicdrift/kumiko-locale-es";
|
|
@@ -20,9 +28,34 @@ import { createRendererPuppeteerClientFeature } from "@cosmicdrift/kumiko-render
|
|
|
20
28
|
import { TENANT_ADMIN_EMAIL } from "./app/auth-constants";
|
|
21
29
|
import { billingFeature } from "./features/billing";
|
|
22
30
|
import { rentalFeature } from "./features/rental";
|
|
31
|
+
import {
|
|
32
|
+
createPortalBillingFeature,
|
|
33
|
+
subscriptionPlansFeature,
|
|
34
|
+
} from "./features/subscription-plans";
|
|
23
35
|
import { taskFeature } from "./features/tasks";
|
|
24
36
|
import { vehiclesFeature } from "./features/vehicles";
|
|
25
37
|
|
|
38
|
+
// The walkthrough shows the tenant admin editing these templates; every other template stays with the platform.
|
|
39
|
+
const TENANT_EDITABLE_TEMPLATES: readonly TenantEditableTemplate[] = [
|
|
40
|
+
...[
|
|
41
|
+
"billing:notify:invoice-issued",
|
|
42
|
+
"billing:notify:invoice-corrected",
|
|
43
|
+
"billing:notify:payment-reminder",
|
|
44
|
+
"billing:notify:terms-changed",
|
|
45
|
+
AuthMailNotificationTypes.passwordReset,
|
|
46
|
+
].map((slug) => ({ kind: "mail" as const, slug, access: { roles: ["TenantAdmin"] } })),
|
|
47
|
+
...["billing:invoice", "rental:utility-statement"].map((slug) => ({
|
|
48
|
+
kind: "document-pdf" as const,
|
|
49
|
+
slug,
|
|
50
|
+
access: { roles: ["TenantAdmin"] },
|
|
51
|
+
})),
|
|
52
|
+
...(["mail-layout", "pdf-layout"] as const).map((kind) => ({
|
|
53
|
+
kind,
|
|
54
|
+
slug: "default",
|
|
55
|
+
access: { roles: ["TenantAdmin"] },
|
|
56
|
+
})),
|
|
57
|
+
];
|
|
58
|
+
|
|
26
59
|
export const APP_FEATURES = [
|
|
27
60
|
localeDe(),
|
|
28
61
|
// Spanish mail copy: subscribers whose mails go out in Spanish land on Spanish unsubscribe pages.
|
|
@@ -31,11 +64,18 @@ export const APP_FEATURES = [
|
|
|
31
64
|
rentalFeature,
|
|
32
65
|
vehiclesFeature,
|
|
33
66
|
billingFeature,
|
|
34
|
-
|
|
67
|
+
createPortalBillingFeature(`http://localhost:${process.env["PORT"] ?? "4173"}`),
|
|
68
|
+
subscriptionPlansFeature,
|
|
69
|
+
// billing-foundation stores the subscription as tenant data and keeps the compliance profile.
|
|
70
|
+
createComplianceProfilesFeature(),
|
|
71
|
+
createTenantLifecycleFeature(),
|
|
72
|
+
createTemplateResolverFeature({ tenantEditable: TENANT_EDITABLE_TEMPLATES }),
|
|
35
73
|
// Only the branding rail of the layout editor needs managed-pages; the sample
|
|
36
74
|
// serves no public pages, so no host resolves to a tenant.
|
|
37
75
|
createManagedPagesFeature({ resolveApexTenant: () => null }),
|
|
38
|
-
|
|
76
|
+
// The mail editor offers uploads only when the files feature is mounted.
|
|
77
|
+
createFilesFeature(),
|
|
78
|
+
createDocumentDesignerFeature({ access: templateEditAccess(TENANT_EDITABLE_TEMPLATES) }),
|
|
39
79
|
// Mounted individually: composeRendererStack() would add a second template-resolver.
|
|
40
80
|
createRendererFoundationFeature(),
|
|
41
81
|
createRendererMailHtmlFeature({
|
|
@@ -72,7 +72,7 @@ await runDevApp({
|
|
|
72
72
|
},
|
|
73
73
|
extraContext: (deps) => ({
|
|
74
74
|
...createDeliveryTestContext(deps),
|
|
75
|
-
templateResolver: createTemplateResolverApi(deps.db),
|
|
75
|
+
templateResolver: createTemplateResolverApi(deps.db, deps.registry),
|
|
76
76
|
}),
|
|
77
77
|
extraRoutes: [
|
|
78
78
|
...createE2eSeedRoutes({ mailOutbox: galleryMailTransport }),
|