@mj-biz-apps/orders-ng 5.19.0 → 5.20.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 (88) hide show
  1. package/dist/checkout-element/main.js +1 -3
  2. package/dist/lib/checkout-widget/checkout-draft-line.d.ts +4 -1
  3. package/dist/lib/checkout-widget/checkout-draft-line.d.ts.map +1 -1
  4. package/dist/lib/checkout-widget/checkout-draft-line.js +5 -3
  5. package/dist/lib/checkout-widget/checkout-draft-line.js.map +1 -1
  6. package/dist/lib/custom/OrderHeader/order-header-form.component.d.ts +3 -1
  7. package/dist/lib/custom/OrderHeader/order-header-form.component.d.ts.map +1 -1
  8. package/dist/lib/custom/OrderHeader/order-header-form.component.js +29 -19
  9. package/dist/lib/custom/OrderHeader/order-header-form.component.js.map +1 -1
  10. package/dist/lib/custom/OrderHeader/order-lines-editor.component.d.ts +16 -0
  11. package/dist/lib/custom/OrderHeader/order-lines-editor.component.d.ts.map +1 -1
  12. package/dist/lib/custom/OrderHeader/order-lines-editor.component.js +169 -60
  13. package/dist/lib/custom/OrderHeader/order-lines-editor.component.js.map +1 -1
  14. package/dist/lib/custom/PaymentHeader/payment-header-form.component.d.ts +23 -0
  15. package/dist/lib/custom/PaymentHeader/payment-header-form.component.d.ts.map +1 -1
  16. package/dist/lib/custom/PaymentHeader/payment-header-form.component.js +276 -189
  17. package/dist/lib/custom/PaymentHeader/payment-header-form.component.js.map +1 -1
  18. package/dist/lib/form-panels/document-forms.module.d.ts +8 -7
  19. package/dist/lib/form-panels/document-forms.module.d.ts.map +1 -1
  20. package/dist/lib/form-panels/document-forms.module.js +10 -3
  21. package/dist/lib/form-panels/document-forms.module.js.map +1 -1
  22. package/dist/lib/form-panels/external-invoices.panel.d.ts +104 -0
  23. package/dist/lib/form-panels/external-invoices.panel.d.ts.map +1 -0
  24. package/dist/lib/form-panels/external-invoices.panel.js +667 -0
  25. package/dist/lib/form-panels/external-invoices.panel.js.map +1 -0
  26. package/dist/lib/generated/Entities/mjBizAppsOrdersExternalCustomer/mjbizappsordersexternalcustomer.form.component.d.ts +10 -0
  27. package/dist/lib/generated/Entities/mjBizAppsOrdersExternalCustomer/mjbizappsordersexternalcustomer.form.component.d.ts.map +1 -0
  28. package/dist/lib/generated/Entities/mjBizAppsOrdersExternalCustomer/mjbizappsordersexternalcustomer.form.component.js +65 -0
  29. package/dist/lib/generated/Entities/mjBizAppsOrdersExternalCustomer/mjbizappsordersexternalcustomer.form.component.js.map +1 -0
  30. package/dist/lib/generated/Entities/mjBizAppsOrdersExternalInvoice/mjbizappsordersexternalinvoice.form.component.d.ts +10 -0
  31. package/dist/lib/generated/Entities/mjBizAppsOrdersExternalInvoice/mjbizappsordersexternalinvoice.form.component.d.ts.map +1 -0
  32. package/dist/lib/generated/Entities/mjBizAppsOrdersExternalInvoice/mjbizappsordersexternalinvoice.form.component.js +95 -0
  33. package/dist/lib/generated/Entities/mjBizAppsOrdersExternalInvoice/mjbizappsordersexternalinvoice.form.component.js.map +1 -0
  34. package/dist/lib/generated/Entities/mjBizAppsOrdersExternalPayment/mjbizappsordersexternalpayment.form.component.d.ts +10 -0
  35. package/dist/lib/generated/Entities/mjBizAppsOrdersExternalPayment/mjbizappsordersexternalpayment.form.component.d.ts.map +1 -0
  36. package/dist/lib/generated/Entities/mjBizAppsOrdersExternalPayment/mjbizappsordersexternalpayment.form.component.js +83 -0
  37. package/dist/lib/generated/Entities/mjBizAppsOrdersExternalPayment/mjbizappsordersexternalpayment.form.component.js.map +1 -0
  38. package/dist/lib/generated/Entities/mjBizAppsOrdersOrderHeader/mjbizappsordersorderheader.form.component.d.ts.map +1 -1
  39. package/dist/lib/generated/Entities/mjBizAppsOrdersOrderHeader/mjbizappsordersorderheader.form.component.js +50 -14
  40. package/dist/lib/generated/Entities/mjBizAppsOrdersOrderHeader/mjbizappsordersorderheader.form.component.js.map +1 -1
  41. package/dist/lib/generated/Entities/mjBizAppsOrdersOrderLineProgressMeasurement/mjbizappsordersorderlineprogressmeasurement.form.component.d.ts +10 -0
  42. package/dist/lib/generated/Entities/mjBizAppsOrdersOrderLineProgressMeasurement/mjbizappsordersorderlineprogressmeasurement.form.component.d.ts.map +1 -0
  43. package/dist/lib/generated/Entities/mjBizAppsOrdersOrderLineProgressMeasurement/mjbizappsordersorderlineprogressmeasurement.form.component.js +85 -0
  44. package/dist/lib/generated/Entities/mjBizAppsOrdersOrderLineProgressMeasurement/mjbizappsordersorderlineprogressmeasurement.form.component.js.map +1 -0
  45. package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentHeader/mjbizappsorderspaymentheader.form.component.d.ts.map +1 -1
  46. package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentHeader/mjbizappsorderspaymentheader.form.component.js +25 -7
  47. package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentHeader/mjbizappsorderspaymentheader.form.component.js.map +1 -1
  48. package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentProvider/mjbizappsorderspaymentprovider.form.component.d.ts.map +1 -1
  49. package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentProvider/mjbizappsorderspaymentprovider.form.component.js +106 -27
  50. package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentProvider/mjbizappsorderspaymentprovider.form.component.js.map +1 -1
  51. package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentProviderSyncState/mjbizappsorderspaymentprovidersyncstate.form.component.d.ts +10 -0
  52. package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentProviderSyncState/mjbizappsorderspaymentprovidersyncstate.form.component.d.ts.map +1 -0
  53. package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentProviderSyncState/mjbizappsorderspaymentprovidersyncstate.form.component.js +67 -0
  54. package/dist/lib/generated/Entities/mjBizAppsOrdersPaymentProviderSyncState/mjbizappsorderspaymentprovidersyncstate.form.component.js.map +1 -0
  55. package/dist/lib/generated/Entities/mjBizAppsOrdersRevenueRecognitionType/mjbizappsordersrevenuerecognitiontype.form.component.d.ts.map +1 -1
  56. package/dist/lib/generated/Entities/mjBizAppsOrdersRevenueRecognitionType/mjbizappsordersrevenuerecognitiontype.form.component.js +29 -21
  57. package/dist/lib/generated/Entities/mjBizAppsOrdersRevenueRecognitionType/mjbizappsordersrevenuerecognitiontype.form.component.js.map +1 -1
  58. package/dist/lib/generated/generated-forms.module.d.ts +24 -19
  59. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  60. package/dist/lib/generated/generated-forms.module.js +17 -2
  61. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  62. package/dist/lib/pages/receivables/billing.page.d.ts +9 -0
  63. package/dist/lib/pages/receivables/billing.page.d.ts.map +1 -1
  64. package/dist/lib/pages/receivables/billing.page.js +49 -1
  65. package/dist/lib/pages/receivables/billing.page.js.map +1 -1
  66. package/dist/lib/pages/receivables/external-invoicing-queue.page.d.ts +85 -0
  67. package/dist/lib/pages/receivables/external-invoicing-queue.page.d.ts.map +1 -0
  68. package/dist/lib/pages/receivables/external-invoicing-queue.page.js +504 -0
  69. package/dist/lib/pages/receivables/external-invoicing-queue.page.js.map +1 -0
  70. package/dist/lib/pages/receivables/progress.page.d.ts +64 -0
  71. package/dist/lib/pages/receivables/progress.page.d.ts.map +1 -0
  72. package/dist/lib/pages/receivables/progress.page.js +383 -0
  73. package/dist/lib/pages/receivables/progress.page.js.map +1 -0
  74. package/dist/lib/panels/external-invoice-view.d.ts +70 -0
  75. package/dist/lib/panels/external-invoice-view.d.ts.map +1 -0
  76. package/dist/lib/panels/external-invoice-view.js +117 -0
  77. package/dist/lib/panels/external-invoice-view.js.map +1 -0
  78. package/dist/lib/sections/orders-sections.component.d.ts.map +1 -1
  79. package/dist/lib/sections/orders-sections.component.js +10 -4
  80. package/dist/lib/sections/orders-sections.component.js.map +1 -1
  81. package/dist/lib/sections/section-nav.model.d.ts.map +1 -1
  82. package/dist/lib/sections/section-nav.model.js +2 -0
  83. package/dist/lib/sections/section-nav.model.js.map +1 -1
  84. package/dist/public-api.d.ts +4 -0
  85. package/dist/public-api.d.ts.map +1 -1
  86. package/dist/public-api.js +4 -0
  87. package/dist/public-api.js.map +1 -1
  88. package/package.json +2 -2
@@ -37659,9 +37659,7 @@ function stripeConfirmAlreadyCollected(error) {
37659
37659
  return msg.includes("already succeeded") || msg.includes("already been confirmed") || msg.includes("already been captured");
37660
37660
  }
37661
37661
  function formatStripeError(error) {
37662
- const msg = error?.message?.trim() || "Payment failed.";
37663
- const code = error?.code?.trim();
37664
- return code && !msg.includes(code) ? `${msg} (${code})` : msg;
37662
+ return error?.message?.trim() || "Payment failed.";
37665
37663
  }
37666
37664
 
37667
37665
  // dist/lib/checkout-widget/checkout-public-host.component.js
@@ -18,8 +18,11 @@ export declare function stripeConfirmAlreadyCollected(error: {
18
18
  message?: string;
19
19
  decline_code?: string;
20
20
  } | null | undefined): boolean;
21
+ /**
22
+ * Buyer-facing text for a failed Stripe confirmation: the gateway's message only.
23
+ * The error code is for support, and the host logs the full error to the console.
24
+ */
21
25
  export declare function formatStripeError(error: {
22
- code?: string;
23
26
  message?: string;
24
27
  } | null | undefined): string;
25
28
  //# sourceMappingURL=checkout-draft-line.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkout-draft-line.d.ts","sourceRoot":"","sources":["../../../src/lib/checkout-widget/checkout-draft-line.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAE3E;;;;GAIG;AACH,wBAAgB,sBAAsB,CAClC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,uBAAuB,GAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAezB;AAED,sFAAsF;AACtF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAG/D;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAO3I;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAIvG"}
1
+ {"version":3,"file":"checkout-draft-line.d.ts","sourceRoot":"","sources":["../../../src/lib/checkout-widget/checkout-draft-line.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAE3E;;;;GAIG;AACH,wBAAgB,sBAAsB,CAClC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,uBAAuB,GAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAezB;AAED,sFAAsF;AACtF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAG/D;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAO3I;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAExF"}
@@ -38,9 +38,11 @@ export function stripeConfirmAlreadyCollected(error) {
38
38
  }
39
39
  return msg.includes('already succeeded') || msg.includes('already been confirmed') || msg.includes('already been captured');
40
40
  }
41
+ /**
42
+ * Buyer-facing text for a failed Stripe confirmation: the gateway's message only.
43
+ * The error code is for support, and the host logs the full error to the console.
44
+ */
41
45
  export function formatStripeError(error) {
42
- const msg = error?.message?.trim() || 'Payment failed.';
43
- const code = error?.code?.trim();
44
- return code && !msg.includes(code) ? `${msg} (${code})` : msg;
46
+ return error?.message?.trim() || 'Payment failed.';
45
47
  }
46
48
  //# sourceMappingURL=checkout-draft-line.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkout-draft-line.js","sourceRoot":"","sources":["../../../src/lib/checkout-widget/checkout-draft-line.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAClC,SAAiB,EACjB,KAA8B;IAE9B,MAAM,IAAI,GAA4B;QAClC,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;KAC3B,CAAC;IACF,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,EAAE,MAAM,CAAC;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC;IACzC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC,aAAa,GAAG;YACjB,UAAU,EAAE,KAAK,CAAC,aAAa,EAAE,UAAU;YAC3C,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,KAAK;SACf,CAAC;IACN,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,sBAAsB,CAAC,MAAe;IAClD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAO,CAAC,KAAK,WAAW,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAAC,KAAoF;IAC9H,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACrD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACvD,IAAI,IAAI,KAAK,iCAAiC,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,wBAAwB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;AAChI,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAA6D;IAC3F,MAAM,GAAG,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,iBAAiB,CAAC;IACxD,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACjC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAClE,CAAC"}
1
+ {"version":3,"file":"checkout-draft-line.js","sourceRoot":"","sources":["../../../src/lib/checkout-widget/checkout-draft-line.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAClC,SAAiB,EACjB,KAA8B;IAE9B,MAAM,IAAI,GAA4B;QAClC,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;KAC3B,CAAC;IACF,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,EAAE,MAAM,CAAC;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC;IACzC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC,aAAa,GAAG;YACjB,UAAU,EAAE,KAAK,CAAC,aAAa,EAAE,UAAU;YAC3C,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,KAAK;SACf,CAAC;IACN,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,sBAAsB,CAAC,MAAe;IAClD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAO,CAAC,KAAK,WAAW,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAAC,KAAoF;IAC9H,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACrD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACvD,IAAI,IAAI,KAAK,iCAAiC,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,wBAAwB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;AAChI,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAA8C;IAC5E,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,iBAAiB,CAAC;AACvD,CAAC"}
@@ -57,7 +57,7 @@ export declare class BizAppsOrderHeaderFormComponent extends mjBizAppsOrdersOrde
57
57
  AccountingAsOf: string | null;
58
58
  AccountingBasis: OrderJournalDateBasis;
59
59
  Confirming: boolean;
60
- ConfirmError: string | null;
60
+ StatusError: string | null;
61
61
  PaymentTypes: mjBizAppsOrdersPaymentTypeEntity[];
62
62
  get ContextTabs(): TabConfig[];
63
63
  /**
@@ -81,6 +81,8 @@ export declare class BizAppsOrderHeaderFormComponent extends mjBizAppsOrdersOrde
81
81
  get ShowConfirm(): boolean;
82
82
  get NeedsPaymentReference(): boolean;
83
83
  get ConfirmBlockedReason(): string | null;
84
+ /** Void or reopen. A refusal leaves the previous status in place and shows the reason. */
85
+ RunStatusChange(status: OrderHeaderEntity['Status'], fallbackMessage: string): Promise<void>;
84
86
  RunConfirm(): Promise<void>;
85
87
  SetAccountingView(view: OrderAccountingView): void;
86
88
  CardIsBalanced(card: OrderJournalCard): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"order-header-form.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/OrderHeader/order-header-form.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"order-header-form.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/OrderHeader/order-header-form.component.ts"],"names":[],"mappings":"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"}
@@ -5,11 +5,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { Component, inject } from '@angular/core';
8
- import { CompositeKey } from '@memberjunction/core';
8
+ import { CompositeKey, Metadata } from '@memberjunction/core';
9
9
  import { UserInfoEngine } from '@memberjunction/core-entities';
10
10
  import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
11
11
  import { BaseFormComponent } from '@memberjunction/ng-base-forms';
12
12
  import { NavigationService } from '@memberjunction/ng-shared';
13
+ import { LoadOrdersEngine } from '@mj-biz-apps/orders-entities';
13
14
  import { MJO_ACCOUNTING_ENTITIES, MJO_COMMON_ENTITIES, MJO_ENTITIES } from '../../data/entity-names.js';
14
15
  import { BuildOrderJournalEntryRows, BuildOrderJournalRollup, ExcludedEntriesLabel, GetOrderJournalOrigins, GetPaymentTypes, LoadOrderJournalData, LoadRevRecJournalEntries, SubscriptionViewParams, } from '../../data/orders-queries.js';
15
16
  import { FormatDate, FormatMoney, HasCents } from '../../panels/money-format.js';
@@ -172,7 +173,7 @@ function BizAppsOrderHeaderFormComponent_Conditional_0_Conditional_33_Conditiona
172
173
  } if (rf & 2) {
173
174
  const ctx_r1 = i0.ɵɵnextContext(3);
174
175
  i0.ɵɵadvance(3);
175
- i0.ɵɵtextInterpolate(ctx_r1.ConfirmError);
176
+ i0.ɵɵtextInterpolate(ctx_r1.StatusError);
176
177
  } }
177
178
  function BizAppsOrderHeaderFormComponent_Conditional_0_Conditional_33_Conditional_38_Conditional_4_Template(rf, ctx) { if (rf & 1) {
178
179
  const _r11 = i0.ɵɵgetCurrentView();
@@ -843,7 +844,7 @@ function BizAppsOrderHeaderFormComponent_Conditional_0_Conditional_33_Template(r
843
844
  i0.ɵɵadvance();
844
845
  i0.ɵɵconditional(ctx_r1.ConfirmBlockedReason ? 35 : -1);
845
846
  i0.ɵɵadvance();
846
- i0.ɵɵconditional(ctx_r1.ConfirmError ? 36 : -1);
847
+ i0.ɵɵconditional(ctx_r1.StatusError ? 36 : -1);
847
848
  i0.ɵɵadvance();
848
849
  i0.ɵɵproperty("Tabs", ctx_r1.ContextTabs)("ActiveKey", ctx_r1.ActiveTab ?? "");
849
850
  i0.ɵɵadvance();
@@ -995,7 +996,7 @@ let BizAppsOrderHeaderFormComponent = class BizAppsOrderHeaderFormComponent exte
995
996
  AccountingAsOf = null;
996
997
  AccountingBasis = 'effective';
997
998
  Confirming = false;
998
- ConfirmError = null;
999
+ StatusError = null;
999
1000
  PaymentTypes = [];
1000
1001
  get ContextTabs() {
1001
1002
  return OrderFormTabs(!!this.record?.IsSaved);
@@ -1035,6 +1036,8 @@ let BizAppsOrderHeaderFormComponent = class BizAppsOrderHeaderFormComponent exte
1035
1036
  await this.record.Lines.Load();
1036
1037
  }
1037
1038
  this.updateLineBadge();
1039
+ // `ConfirmEligibility` reads the catalog to tell which lines need a service period.
1040
+ await LoadOrdersEngine(Metadata.Provider, new Metadata().CurrentUser);
1038
1041
  await this.loadPaymentTypes();
1039
1042
  await this.refreshAccountingIfNeeded();
1040
1043
  this.RegisterToolbarItem({
@@ -1074,11 +1077,7 @@ let BizAppsOrderHeaderFormComponent = class BizAppsOrderHeaderFormComponent exte
1074
1077
  return !ord?.IsBookedOrder && ord?.Status !== 'Voided' && !!ord?.IsSaved;
1075
1078
  },
1076
1079
  OnClick: async () => {
1077
- if (!this.record)
1078
- return;
1079
- this.record.Status = 'Voided';
1080
- await this.record.Save();
1081
- this.cdr.detectChanges();
1080
+ await this.RunStatusChange('Voided', 'The order could not be voided.');
1082
1081
  },
1083
1082
  });
1084
1083
  this.RegisterToolbarItem({
@@ -1093,11 +1092,7 @@ let BizAppsOrderHeaderFormComponent = class BizAppsOrderHeaderFormComponent exte
1093
1092
  return ord?.Status === 'Voided' && !!ord?.IsSaved;
1094
1093
  },
1095
1094
  OnClick: async () => {
1096
- if (!this.record)
1097
- return;
1098
- this.record.Status = 'Draft';
1099
- await this.record.Save();
1100
- this.cdr.detectChanges();
1095
+ await this.RunStatusChange('Draft', 'The order could not be reopened as a draft.');
1101
1096
  },
1102
1097
  });
1103
1098
  this.cdr.detectChanges();
@@ -1139,7 +1134,7 @@ let BizAppsOrderHeaderFormComponent = class BizAppsOrderHeaderFormComponent exte
1139
1134
  if (!this.record)
1140
1135
  return;
1141
1136
  this.record.InitialPaymentReference = value;
1142
- this.ConfirmError = null;
1137
+ this.StatusError = null;
1143
1138
  }
1144
1139
  get ShowConfirm() {
1145
1140
  return !!this.record && this.record.ConfirmEligibility().Allowed && !this.NeedsPaymentReference;
@@ -1155,16 +1150,31 @@ let BizAppsOrderHeaderFormComponent = class BizAppsOrderHeaderFormComponent exte
1155
1150
  const verdict = this.record.ConfirmEligibility();
1156
1151
  return verdict.Allowed ? null : (verdict.Reason ?? 'Cannot confirm this order.');
1157
1152
  }
1153
+ /** Void or reopen. A refusal leaves the previous status in place and shows the reason. */
1154
+ async RunStatusChange(status, fallbackMessage) {
1155
+ if (!this.record)
1156
+ return;
1157
+ this.StatusError = null;
1158
+ try {
1159
+ await this.record.SaveStatus(status, fallbackMessage);
1160
+ }
1161
+ catch (error) {
1162
+ this.StatusError = error instanceof Error ? error.message : String(error);
1163
+ }
1164
+ finally {
1165
+ this.cdr.detectChanges();
1166
+ }
1167
+ }
1158
1168
  async RunConfirm() {
1159
1169
  if (!this.record || this.Confirming || !this.ShowConfirm)
1160
1170
  return;
1161
1171
  this.Confirming = true;
1162
- this.ConfirmError = null;
1172
+ this.StatusError = null;
1163
1173
  try {
1164
1174
  if (this.record.Dirty) {
1165
1175
  const saveResult = await this.record.Save();
1166
1176
  if (!saveResult) {
1167
- throw new Error(this.record.LatestResult?.Message ?? 'Failed to save order changes before confirming.');
1177
+ throw new Error(this.record.LatestResult?.CompleteMessage?.trim() || 'Failed to save order changes before confirming.');
1168
1178
  }
1169
1179
  }
1170
1180
  await this.record.Confirm();
@@ -1174,7 +1184,7 @@ let BizAppsOrderHeaderFormComponent = class BizAppsOrderHeaderFormComponent exte
1174
1184
  }
1175
1185
  }
1176
1186
  catch (error) {
1177
- this.ConfirmError = error instanceof Error ? error.message : String(error);
1187
+ this.StatusError = error instanceof Error ? error.message : String(error);
1178
1188
  }
1179
1189
  finally {
1180
1190
  this.Confirming = false;
@@ -1539,7 +1549,7 @@ BizAppsOrderHeaderFormComponent = __decorate([
1539
1549
  export { BizAppsOrderHeaderFormComponent };
1540
1550
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BizAppsOrderHeaderFormComponent, [{
1541
1551
  type: Component,
1542
- args: [{ standalone: false, selector: 'bizapps-order-header-form', template: "@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"before-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <div class=\"mjo-oh-hero\" [class.is-collapsed]=\"!HeaderExpanded\">\n <div class=\"mjo-oh-hero__top\">\n <div class=\"mjo-oh-who\">\n <div class=\"mjo-oh-avatar\"><i class=\"fa-solid fa-file-invoice-dollar\"></i></div>\n <div>\n <div class=\"mjo-oh-title-row\">\n <h1 class=\"mjo-oh-title\">{{ HeaderTitle }}</h1>\n @if (ShowStatusChip) {\n <span [class]=\"StatusChipClass\">{{ record.Status }}</span>\n }\n </div>\n <div class=\"mjo-oh-sub\">{{ HeaderExpanded ? HeaderSubtitle : HeaderCollapsedMeta }}</div>\n </div>\n </div>\n <div class=\"mjo-oh-hero__aside\">\n <div class=\"mjo-oh-money\">\n <div>\n <span class=\"mjo-oh-kicker\">{{ TotalLabel }}</span>\n <span class=\"mjo-oh-amt\">{{ Money('total') }}</span>\n </div>\n <div>\n <span class=\"mjo-oh-kicker\">Paid</span>\n <span class=\"mjo-oh-amt\">{{ Money('paid') }}</span>\n </div>\n <div>\n <span class=\"mjo-oh-kicker\">Balance</span>\n <span class=\"mjo-oh-amt\">{{ Money('balance') }}</span>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"mjo-oh-hero__toggle\"\n (click)=\"ToggleHeader()\"\n [attr.aria-expanded]=\"HeaderExpanded\"\n [attr.aria-label]=\"HeaderExpanded ? 'Collapse header' : 'Expand header'\"\n [title]=\"HeaderExpanded ? 'Collapse header' : 'Expand header'\">\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"HeaderExpanded\" [class.fa-chevron-down]=\"!HeaderExpanded\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n @if (HeaderExpanded) {\n <div class=\"mjo-oh-facts\">\n <div class=\"mjo-oh-fact\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OrderType\" Type=\"select\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n </div>\n <div class=\"mjo-oh-fact\">\n <bizapps-selling-company-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"CompanyID\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></bizapps-selling-company-field>\n </div>\n <div class=\"mjo-oh-fact\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OrderDate\" Type=\"datepicker\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n </div>\n </div>\n @if (EditMode && record.MoneyLocked) {\n <div class=\"mjo-oh-hint\"><i class=\"fa-solid fa-lock\" aria-hidden=\"true\"></i> This order is booked, so its type, selling company, order date and bill-to are locked. Corrections go through a reversal order.</div>\n }\n\n <div class=\"mjo-oh-parties\" [class.is-ship]=\"ExpandedParty === 'ship'\" [class.is-bill]=\"ExpandedParty === 'bill'\" [class.is-none]=\"ExpandedParty === null\">\n <div class=\"mjo-oh-bubble\" [class.is-open]=\"ExpandedParty === 'ship'\" [class.is-rail]=\"ExpandedParty === 'bill'\">\n <div\n class=\"mjo-oh-bubble__hit\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"ExpandedParty === 'ship'\"\n (click)=\"SelectParty('ship')\"\n (keydown.enter)=\"SelectParty('ship')\"\n (keydown.space)=\"SelectParty('ship'); $event.preventDefault()\">\n <span class=\"mjo-oh-bubble__ic\"><i class=\"fa-solid fa-truck-fast\"></i></span>\n <span class=\"mjo-oh-bubble__copy\">\n <span class=\"mjo-oh-bubble__role\">Ship to</span>\n @if (ShipToIsSame) {\n <span class=\"mjo-oh-bubble__name\">{{ ShipToName }}</span>\n } @else {\n <button type=\"button\" class=\"mjo-oh-link mjo-oh-bubble__name\" (click)=\"OpenShipTo($event)\">{{ ShipToName }}</button>\n }\n <span class=\"mjo-oh-bubble__detail\">{{ ShipToDetail }}</span>\n </span>\n <i class=\"fa-solid mjo-oh-bubble__chev\" [class.fa-chevron-up]=\"ExpandedParty === 'ship'\" [class.fa-chevron-down]=\"ExpandedParty !== 'ship'\"></i>\n </div>\n @if (ExpandedParty === 'ship') {\n <div class=\"mjo-oh-bubble__edit\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ShipToOrganizationID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ShipToPersonID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\" (ValueChange)=\"OnPartyPersonChange('ShipTo')\"></mj-form-field>\n <mjo-party-address-picker\n [Order]=\"record\"\n Side=\"ship\"\n [EditMode]=\"ComposeMode\"\n [PersonName]=\"record.ShipToPerson\"\n [OrganizationName]=\"record.ShipToOrganization\">\n </mjo-party-address-picker>\n </div>\n }\n </div>\n\n <div class=\"mjo-oh-bubble\" [class.is-open]=\"ExpandedParty === 'bill'\" [class.is-rail]=\"ExpandedParty === 'ship'\" [class.is-needed]=\"NeedsBillTo\">\n <div\n class=\"mjo-oh-bubble__hit\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"ExpandedParty === 'bill'\"\n (click)=\"SelectParty('bill')\"\n (keydown.enter)=\"SelectParty('bill')\"\n (keydown.space)=\"SelectParty('bill'); $event.preventDefault()\">\n <span class=\"mjo-oh-bubble__ic\"><i class=\"fa-solid fa-file-invoice-dollar\"></i></span>\n <span class=\"mjo-oh-bubble__copy\">\n <span class=\"mjo-oh-bubble__role\">Bill to</span>\n @if (hasBillTo) {\n <button type=\"button\" class=\"mjo-oh-link mjo-oh-bubble__name\" (click)=\"OpenBillTo($event)\">{{ BillToName }}</button>\n } @else {\n <span class=\"mjo-oh-bubble__name\">{{ BillToName }}</span>\n }\n <span class=\"mjo-oh-bubble__detail\">{{ BillToDetail }}</span>\n </span>\n <i class=\"fa-solid mjo-oh-bubble__chev\" [class.fa-chevron-up]=\"ExpandedParty === 'bill'\" [class.fa-chevron-down]=\"ExpandedParty !== 'bill'\"></i>\n </div>\n @if (ExpandedParty === 'bill') {\n <div class=\"mjo-oh-bubble__edit\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"BillToOrganizationID\" Type=\"textbox\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"BillToPersonID\" Type=\"textbox\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\" (ValueChange)=\"OnPartyPersonChange('BillTo')\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"PaymentTermsTypeID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mjo-party-address-picker\n [Order]=\"record\"\n Side=\"bill\"\n [EditMode]=\"ComposeMode\"\n [PersonName]=\"record.BillToPerson\"\n [OrganizationName]=\"record.BillToOrganization\">\n </mjo-party-address-picker>\n </div>\n }\n </div>\n </div>\n\n @if (ConfirmBlockedReason) {\n <div class=\"mjo-oh-todo\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>Before this can be confirmed</span>\n @if (NeedsBillTo) {\n <button type=\"button\" (click)=\"JumpToBill()\">Need a bill-to party</button>\n } @else if (NeedsPaymentReference) {\n <button type=\"button\" (click)=\"JumpToPayment()\">Need a check / ACH reference</button>\n } @else {\n <span class=\"mjo-oh-todo__hint\">{{ ConfirmBlockedReason }}</span>\n }\n </div>\n }\n\n @if (ConfirmError) {\n <div class=\"mjo-oh-todo mjo-oh-todo--err\" role=\"alert\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ ConfirmError }}</span>\n </div>\n }\n\n <mj-tab-nav\n class=\"mjo-oh-tabs\"\n [Tabs]=\"ContextTabs\"\n [ActiveKey]=\"ActiveTab ?? ''\"\n (TabChange)=\"SelectTab($event)\">\n </mj-tab-nav>\n\n @if (ActiveTab === 'payment') {\n <div class=\"mjo-oh-tabpane\">\n <div class=\"mjo-oh-fields\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"InitialPaymentTypeID\" Type=\"textbox\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"InitialPaymentAmount\" Type=\"number\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n @if (PaymentRequiresReference) {\n <label class=\"mjo-oh-ref\">\n <span class=\"mjo-oh-ref__label\">Check / ACH reference</span>\n <input\n class=\"mj-input\"\n [ngModel]=\"PaymentReference\"\n (ngModelChange)=\"SetPaymentReference($event)\"\n [disabled]=\"!ComposeMode\"\n placeholder=\"Check number or confirmation ID\"\n autocomplete=\"off\"\n aria-label=\"Check or ACH reference\">\n </label>\n }\n </div>\n @if (record.IsSaved && PaymentParams) {\n <mj-explorer-entity-data-grid\n [Params]=\"PaymentParams\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"true\"\n [ShowNewButton]=\"false\"\n [ShowDeleteButton]=\"false\"\n [Height]=\"'fit-content'\"\n [MaxHeight]=\"RelatedGridHeight\"\n (Navigate)=\"OnFormNavigate($event)\">\n </mj-explorer-entity-data-grid>\n } @else {\n <div class=\"mjo-oh-hint\">Intent only \u2014 the payment is created when the order is confirmed.</div>\n }\n </div>\n }\n\n @if (ActiveTab === 'details') {\n <div class=\"mjo-oh-tabpane\">\n <div class=\"mjo-oh-fields\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"RequestedDeliveryDate\" Type=\"datepicker\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"DueDate\" Type=\"datepicker\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ExternalDocumentNumber\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"FulfillmentStatus\" Type=\"select\" [EditMode]=\"false\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Status\" Type=\"select\" [EditMode]=\"false\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"SalesRepUserID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Description\" Type=\"textarea\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Notes\" Type=\"textarea\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n </div>\n </div>\n }\n\n @if (ActiveTab === 'charges' && record.IsSaved) {\n <div class=\"mjo-oh-tabpane\">\n @if (ChargeParams) {\n <mj-explorer-entity-data-grid\n [Params]=\"ChargeParams\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"true\"\n [ShowNewButton]=\"false\"\n [ShowDeleteButton]=\"false\"\n [Height]=\"'fit-content'\"\n [MaxHeight]=\"RelatedGridHeight\"\n (Navigate)=\"OnFormNavigate($event)\">\n </mj-explorer-entity-data-grid>\n @if (record.MoneyLocked) {\n <div class=\"mjo-oh-hint\">Charges were booked with the order and cannot be edited.</div>\n }\n }\n </div>\n }\n\n @if (ActiveTab === 'accounting' && record.IsSaved) {\n <div class=\"mjo-oh-tabpane\">\n <div class=\"mjo-oh-acct__bar\">\n <div>\n <h2>{{ AccountingView === 'summary' ? 'Order journal' : 'Journal entries' }}</h2>\n <p>\n @if (AccountingView === 'summary') {\n Gross debits and credits per account over this order's whole life \u2014 not a stored row\n } @else {\n Every stored journal this order caused, unnetted \u2014 open a row to drill in\n }\n </p>\n </div>\n <div class=\"mjo-oh-switch\" role=\"group\" aria-label=\"Accounting view\">\n <button type=\"button\" [class.is-on]=\"AccountingView === 'summary'\" (click)=\"SetAccountingView('summary')\">Rolled up</button>\n <button type=\"button\" [class.is-on]=\"AccountingView === 'detail'\" (click)=\"SetAccountingView('detail')\">\n By line\n @if (RollupJournalCount) {\n <span class=\"mjo-oh-switch__n\">{{ RollupJournalCount }}</span>\n }\n </button>\n <button type=\"button\" [class.is-on]=\"AccountingView === 'waterfall'\" (click)=\"SetAccountingView('waterfall')\">\n <i class=\"fa-solid fa-chart-line\"></i> Rev-Rec Waterfall\n </button>\n </div>\n </div>\n\n <!-- One set of controls for both views, so they can never disagree about what is in. -->\n @if (AccountingView !== 'waterfall') {\n <div class=\"mjo-oh-acct__controls\">\n <label class=\"mjo-oh-asof\">\n <span>As of</span>\n <input\n type=\"date\"\n [value]=\"AccountingAsOf ?? ''\"\n (change)=\"OnAccountingAsOfChanged($any($event.target).value)\"\n aria-label=\"Include entries dated on or before\" />\n </label>\n @if (AccountingAsOf) {\n <button type=\"button\" class=\"mjo-oh-asof__clear\" (click)=\"OnAccountingAsOfChanged('')\">\n Lifetime\n </button>\n }\n <div class=\"mjo-oh-switch mjo-oh-switch--sm\" role=\"group\" aria-label=\"Date basis\">\n <button type=\"button\" [class.is-on]=\"AccountingBasis === 'effective'\" (click)=\"SetAccountingBasis('effective')\">\n Effective date\n </button>\n <button type=\"button\" [class.is-on]=\"AccountingBasis === 'posting'\" (click)=\"SetAccountingBasis('posting')\">\n Posting date\n </button>\n </div>\n <span class=\"mjo-oh-acct__basis\">\n @if (AccountingBasis === 'posting') {\n GL date of the batch \u2014 Posted batches only\n } @else {\n Subledger date on the entry itself\n }\n </span>\n </div>\n }\n\n @if (AccountingView === 'waterfall') {\n <div style=\"padding: 12px 0;\">\n <mj-deferred-revenue-waterfall\n [JournalEntries]=\"RevRecJournalEntries\"\n [Title]=\"'Order Rev-Rec &amp; Deferred Revenue Schedule'\"\n (JournalEntrySelected)=\"OnJournalEntrySelected($event)\">\n </mj-deferred-revenue-waterfall>\n </div>\n } @else if (AccountingView === 'summary') {\n @if (RollupLoading) {\n <div class=\"mjo-oh-hint\">Rolling up journals\u2026</div>\n } @else if (RollupError) {\n <div class=\"mjo-oh-hint\">{{ RollupError }}</div>\n } @else if (RollupCards.length === 0) {\n <div class=\"mjo-oh-hint\">\n @if (RollupExcludedLabel) {\n Nothing in view \u2014 {{ RollupExcludedLabel }}.\n } @else {\n No journals yet \u2014 they appear when the order is confirmed.\n }\n </div>\n } @else {\n @for (card of RollupCards; track card.CompanyID) {\n <article class=\"mjo-oh-jecard\">\n <header class=\"mjo-oh-jecard__head\">\n <div>\n <span class=\"mjo-oh-jecard__co\">{{ card.Company }}</span>\n <span class=\"mjo-oh-jecard__sub\">{{ card.Rows.length }} {{ card.Rows.length === 1 ? 'line' : 'lines' }}</span>\n </div>\n <span class=\"mjo-oh-chip\" [class.mjo-oh-chip--ok]=\"CardIsBalanced(card)\">\n {{ CardIsBalanced(card) ? 'Balanced' : 'Out of balance' }}\n </span>\n </header>\n <table class=\"mjo-oh-je__table\">\n <thead>\n <tr>\n <th>Account</th>\n <th class=\"is-num\">Debit</th>\n <th class=\"is-num\">Credit</th>\n </tr>\n </thead>\n <tbody>\n @for (row of card.Rows; track row.Key) {\n <tr>\n <td>\n <div class=\"mjo-oh-acctline\">\n @if (row.AccountCode) {\n <span class=\"mjo-oh-acctline__code\">{{ row.AccountCode }}</span>\n }\n <span class=\"mjo-oh-acctline__name\">{{ row.AccountName }}</span>\n </div>\n <div class=\"mjo-oh-acctline__meta\">\n @for (dim of row.Dimensions; track dim.Name + dim.Value) {\n <span class=\"mjo-oh-dim\">{{ dim.Name }} \u00B7 {{ dim.Value }}</span>\n }\n <span class=\"mjo-oh-je__src\">{{ SourceLineLabel(row.SourceLineCount) }}</span>\n </div>\n </td>\n <td class=\"is-num\" [class.is-quiet]=\"!row.Debit\">{{ RollupAmount(row.Debit) }}</td>\n <td class=\"is-num\" [class.is-quiet]=\"!row.Credit\">{{ RollupAmount(row.Credit) }}</td>\n </tr>\n }\n </tbody>\n <tfoot>\n <tr>\n <th>Total</th>\n <td class=\"is-num\">{{ RollupAmount(card.TotalDebit) }}</td>\n <td class=\"is-num\">{{ RollupAmount(card.TotalCredit) }}</td>\n </tr>\n </tfoot>\n </table>\n </article>\n }\n @for (note of RollupSharedNotes; track note) {\n <p class=\"mjo-oh-acct__note\">{{ note }}</p>\n }\n }\n @if (RollupExcludedLabel) {\n <p class=\"mjo-oh-acct__excluded\">\n {{ RollupExcludedLabel }} \u2014\n <button type=\"button\" class=\"mjo-oh-linkbtn\" (click)=\"SetAccountingView('detail')\">see By line</button>\n </p>\n }\n } @else {\n @if (RollupLoading) {\n <div class=\"mjo-oh-hint\">Loading journals\u2026</div>\n } @else if (RollupError) {\n <div class=\"mjo-oh-hint\">{{ RollupError }}</div>\n } @else if (JournalRows.length === 0) {\n <div class=\"mjo-oh-hint\">\n @if (RollupExcludedLabel) {\n Nothing in view \u2014 {{ RollupExcludedLabel }}.\n } @else {\n No journals yet \u2014 they appear when the order is confirmed.\n }\n </div>\n } @else {\n <table class=\"mjo-oh-je__table mjo-oh-je__table--detail\">\n <thead>\n <tr>\n <th>Entry</th>\n <th>Effective</th>\n <th>Batch</th>\n <th>Batch status</th>\n <th>Posting date</th>\n <th class=\"is-num\">Debit</th>\n <th class=\"is-num\">Credit</th>\n </tr>\n </thead>\n <tbody>\n @for (row of JournalRows; track row.ID) {\n <tr class=\"is-clickable\" (click)=\"OnJournalRowSelected(row.ID)\">\n <td>\n <div class=\"mjo-oh-acctline__name\">{{ row.EntryNumber }}</div>\n <div class=\"mjo-oh-acctline__meta\">\n <span>{{ row.Description }}</span>\n @if (row.SharedWithOtherOrders) {\n <span class=\"mjo-oh-dim\">{{ SharedOrdersLabel(row.SharedWithOtherOrders) }}</span>\n }\n </div>\n </td>\n <td>{{ JournalDate(row.EffectiveDate) }}</td>\n <td>{{ row.BatchNumber || '\u2014' }}</td>\n <td>{{ row.BatchStatus || 'Not batched' }}</td>\n <td>{{ JournalDate(row.BatchPostingDate) }}</td>\n <td class=\"is-num\" [class.is-quiet]=\"!row.Debit\">{{ RollupAmount(row.Debit) }}</td>\n <td class=\"is-num\" [class.is-quiet]=\"!row.Credit\">{{ RollupAmount(row.Credit) }}</td>\n </tr>\n }\n </tbody>\n </table>\n @if (RollupExcludedLabel) {\n <p class=\"mjo-oh-acct__excluded\">{{ RollupExcludedLabel }}, not listed above.</p>\n }\n }\n }\n </div>\n }\n\n @if (ActiveTab === 'subs' && record.IsSaved) {\n <div class=\"mjo-oh-tabpane\">\n @if (SubscriptionParams) {\n <mj-explorer-entity-data-grid\n [Params]=\"SubscriptionParams\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"true\"\n [ShowNewButton]=\"false\"\n [Height]=\"'fit-content'\"\n [MaxHeight]=\"RelatedGridHeight\"\n (Navigate)=\"OnFormNavigate($event)\">\n </mj-explorer-entity-data-grid>\n }\n </div>\n }\n }\n </div>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <mj-collapsible-panel\n SectionKey=\"mJBizAppsOrdersOrderLines\"\n SectionName=\"Lines\"\n Icon=\"fa fa-list-ol\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"LineBadge\"\n [DefaultExpanded]=\"true\">\n <mjo-order-lines-editor\n [Order]=\"record\"\n [EditMode]=\"ComposeMode\"\n (PricingChanged)=\"OnPricingChanged($event)\"\n (Navigate)=\"OnFormNavigate($event)\">\n </mjo-order-lines-editor>\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-related\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-everything\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n</mj-record-form-container>\n}\n", styles: ["/* mj-form-field uses display:contents + a 200px|1fr internal grid.\n Wrap each field; never place the host as a CSS-grid item. */\n\n:host ::ng-deep .mj-forms-panel-body:not(.mj-forms-panel-body--collapsed) {\n max-height: none;\n}\n\n:host ::ng-deep .mj-forms-panel-body:not(.mj-forms-panel-body--collapsed) .mj-forms-panel-content {\n max-height: none;\n overflow: visible;\n}\n\n/* Product search results sit `position: absolute` under the add-product\n input at the bottom of Lines. The panel card and body both use\n overflow:hidden (rounded-corner clip + collapse animation), which\n shears the list off at the section edge. Collapse still forces\n overflow:hidden on the collapsed body. */\n:host ::ng-deep mj-collapsible-panel:has(mjo-order-lines-editor) .mj-forms-panel {\n overflow: visible;\n}\n\n:host ::ng-deep mj-collapsible-panel:has(mjo-order-lines-editor) .mj-forms-panel-body:not(.mj-forms-panel-body--collapsed) {\n overflow: visible;\n}\n\n:host ::ng-deep mj-collapsible-panel:has(.mj-typeahead-list.is-open) {\n position: relative;\n z-index: 30;\n}\n\n.mjo-oh-hero {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n padding: var(--mj-space-4) var(--mj-space-5);\n margin-bottom: var(--mj-space-4);\n}\n\n.mjo-oh-hero.is-collapsed {\n padding: var(--mj-space-2) var(--mj-space-4);\n}\n\n.mjo-oh-hero.is-collapsed .mjo-oh-hero__top {\n align-items: center;\n}\n\n.mjo-oh-hero.is-collapsed .mjo-oh-avatar {\n width: 32px;\n height: 32px;\n font-size: 14px;\n}\n\n.mjo-oh-hero.is-collapsed .mjo-oh-title {\n font-size: var(--mj-text-base);\n}\n\n.mjo-oh-hero__toggle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n flex: 0 0 auto;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.mjo-oh-hero__toggle:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-hero__top {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--mj-space-4);\n flex-wrap: wrap;\n}\n\n.mjo-oh-hero__aside {\n display: flex;\n align-items: flex-start;\n gap: var(--mj-space-4);\n flex-wrap: wrap;\n}\n\n.mjo-oh-confirm {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: var(--mj-space-1);\n min-width: 11rem;\n}\n\n.mjo-oh-confirm__hint {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n text-align: right;\n max-width: 14rem;\n line-height: 1.35;\n}\n\n.mjo-oh-who {\n display: flex;\n align-items: center;\n gap: var(--mj-space-3);\n min-width: 0;\n}\n\n.mjo-oh-avatar {\n width: 44px;\n height: 44px;\n border-radius: var(--mj-radius-md);\n display: grid;\n place-items: center;\n flex: 0 0 auto;\n background: color-mix(in srgb, var(--mj-brand-primary) 18%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 18px;\n}\n\n.mjo-oh-title-row {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n flex-wrap: wrap;\n}\n\n.mjo-oh-title {\n margin: 0;\n font-size: var(--mj-text-lg);\n font-weight: var(--mj-font-bold);\n color: var(--mj-text-primary);\n letter-spacing: -0.02em;\n}\n\n.mjo-oh-sub {\n margin-top: 2px;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n}\n\n.mjo-oh-kicker {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-chip {\n display: inline-flex;\n align-items: center;\n padding: 2px 10px;\n border-radius: var(--mj-radius-full);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n}\n\n.mjo-oh-chip--ok {\n color: var(--mj-status-success-text);\n background: var(--mj-status-success-bg);\n border-color: var(--mj-status-success-border);\n}\n\n.mjo-oh-chip--void {\n color: var(--mj-status-error-text);\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n}\n\n.mjo-oh-money {\n display: flex;\n gap: var(--mj-space-5);\n padding: var(--mj-space-2) var(--mj-space-3);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n}\n\n.mjo-oh-money > div {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mjo-oh-amt {\n font-variant-numeric: tabular-nums;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-facts {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: var(--mj-space-3) var(--mj-space-4);\n margin-top: var(--mj-space-4);\n padding: var(--mj-space-3);\n border: 1px solid var(--mj-border-subtle);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface-sunken);\n}\n\n.mjo-oh-fact ::ng-deep .mj-forms-field {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 4px;\n padding: 0;\n}\n\n.mjo-oh-fact ::ng-deep .mj-forms-field-label {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n/* The shared field hover adds negative margin + extra padding, which shoves\n the three header facts down. Keep the tint, drop the layout shift. */\n.mjo-oh-fact ::ng-deep .mj-forms-field--editing:hover {\n margin: 0;\n padding: 0;\n}\n\n.mjo-oh-fields {\n display: flex;\n flex-direction: column;\n}\n\n.mjo-oh-parties {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n gap: var(--mj-space-3);\n align-items: start;\n margin: var(--mj-space-4) 0 var(--mj-space-3);\n}\n\n.mjo-oh-parties.is-bill {\n grid-template-columns: auto minmax(0, 1fr);\n}\n\n.mjo-oh-parties.is-none {\n grid-template-columns: 1fr 1fr;\n}\n\n.mjo-oh-bubble {\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n min-width: 0;\n}\n\n.mjo-oh-bubble.is-open {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 45%, var(--mj-border-default));\n}\n\n.mjo-oh-bubble.is-rail {\n width: 3.25rem;\n flex: 0 0 auto;\n}\n\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__hit {\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n gap: var(--mj-space-2);\n padding: var(--mj-space-2);\n min-height: 5.5rem;\n}\n\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__copy {\n flex: 0 0 auto;\n align-items: center;\n}\n\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__role {\n writing-mode: vertical-rl;\n transform: rotate(180deg);\n letter-spacing: 0.08em;\n}\n\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__name,\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__detail,\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__chev {\n display: none;\n}\n\n@media (max-width: 720px) {\n .mjo-oh-parties,\n .mjo-oh-parties.is-bill,\n .mjo-oh-parties.is-none {\n grid-template-columns: 1fr;\n }\n\n .mjo-oh-bubble.is-rail {\n width: auto;\n }\n\n .mjo-oh-bubble.is-rail .mjo-oh-bubble__hit {\n flex-direction: row;\n min-height: 0;\n padding: var(--mj-space-2) var(--mj-space-3);\n }\n\n .mjo-oh-bubble.is-rail .mjo-oh-bubble__copy {\n align-items: flex-start;\n }\n\n .mjo-oh-bubble.is-rail .mjo-oh-bubble__role {\n writing-mode: horizontal-tb;\n transform: none;\n }\n}\n\n.mjo-oh-bubble.is-needed {\n border-color: color-mix(in srgb, var(--mj-status-warning) 45%, var(--mj-border-default));\n}\n\n.mjo-oh-bubble__hit {\n display: flex;\n align-items: center;\n gap: var(--mj-space-3);\n width: 100%;\n padding: var(--mj-space-3);\n border: 0;\n background: transparent;\n color: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.mjo-oh-bubble__name.mjo-oh-link {\n display: inline;\n padding: 0;\n border: 0;\n background: transparent;\n font: inherit;\n font-size: inherit;\n font-weight: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.mjo-oh-bubble__hit:hover { background: var(--mj-bg-surface-hover); }\n\n.mjo-oh-bubble__ic {\n width: var(--mj-space-8);\n height: var(--mj-space-8);\n border-radius: var(--mj-radius-sm);\n display: grid;\n place-items: center;\n flex: 0 0 auto;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n}\n\n.mjo-oh-bubble__copy {\n min-width: 0;\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mjo-oh-bubble__role {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-bubble__name {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-bubble__detail {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mjo-oh-bubble__chev {\n color: var(--mj-text-muted);\n font-size: var(--mj-text-xs);\n}\n\n.mjo-oh-bubble__edit {\n padding: var(--mj-space-3);\n border-top: 1px solid var(--mj-border-subtle);\n display: flex;\n flex-direction: column;\n}\n\n.mjo-oh-addr {\n margin-top: var(--mj-space-2);\n padding-top: var(--mj-space-2);\n border-top: 1px dashed var(--mj-border-subtle);\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1);\n}\n\n.mjo-oh-addr__bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n}\n\n.mjo-oh-addr__label {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-addr__btn {\n border: 0;\n background: transparent;\n color: var(--mj-text-link);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n cursor: pointer;\n padding: 0;\n}\n\n.mjo-oh-addr__btn:disabled {\n color: var(--mj-text-disabled);\n cursor: default;\n}\n\n.mjo-oh-addr__row {\n display: grid;\n grid-template-columns: minmax(0, 1.4fr) minmax(0, 0.8fr) minmax(0, 0.8fr);\n gap: var(--mj-space-2);\n}\n\n.mjo-oh-link {\n color: var(--mj-text-link);\n text-decoration: none;\n}\n\n.mjo-oh-link:hover { text-decoration: underline; }\n\n.mjo-oh-todo {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n flex-wrap: wrap;\n margin-bottom: var(--mj-space-3);\n font-size: var(--mj-text-sm);\n color: var(--mj-status-warning-text);\n}\n\n.mjo-oh-todo button,\n.mjo-oh-todo__hint {\n background: var(--mj-status-warning-bg);\n border: 1px solid var(--mj-status-warning-border);\n color: var(--mj-status-warning-text);\n border-radius: var(--mj-radius-full);\n padding: 2px 8px;\n font: inherit;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n}\n\n.mjo-oh-todo button { cursor: pointer; }\n\n.mjo-oh-todo--err {\n color: var(--mj-status-error-text);\n}\n\n.mjo-oh-ref {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin-top: var(--mj-space-3);\n}\n\n.mjo-oh-ref__label {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-ref .mj-input {\n max-width: 22rem;\n}\n\n.mjo-oh-tabs {\n display: block;\n margin-top: var(--mj-space-2);\n}\n\n.mjo-oh-tabpane { margin-top: var(--mj-space-3); }\n\n.mjo-oh-tabpane mj-explorer-entity-data-grid {\n display: block;\n}\n\n.mjo-oh-hint {\n margin-top: var(--mj-space-2);\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-acct__bar {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--mj-space-3);\n flex-wrap: wrap;\n margin-bottom: var(--mj-space-3);\n}\n\n.mjo-oh-acct__bar h2 {\n margin: 0;\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-acct__bar p {\n margin: 2px 0 0;\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-switch {\n display: inline-flex;\n padding: 2px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n}\n\n.mjo-oh-switch button {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--mj-text-secondary);\n font: inherit;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n padding: 5px 12px;\n border-radius: var(--mj-radius-full);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.mjo-oh-switch button.is-on {\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n box-shadow: 0 0 0 1px var(--mj-border-subtle);\n}\n\n.mjo-oh-switch__n {\n min-width: 1.25em;\n padding: 0 5px;\n border-radius: var(--mj-radius-full);\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-variant-numeric: tabular-nums;\n text-align: center;\n}\n\n/* As-of + basis controls: one row above whichever of the two views is showing. */\n.mjo-oh-acct__controls {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--mj-space-2) var(--mj-space-3);\n margin-bottom: var(--mj-space-3);\n}\n\n.mjo-oh-asof {\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-2);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n}\n\n.mjo-oh-asof input {\n font: inherit;\n font-weight: var(--mj-font-normal);\n padding: 4px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-asof__clear,\n.mjo-oh-linkbtn {\n appearance: none;\n border: 0;\n background: transparent;\n padding: 0;\n font: inherit;\n font-size: var(--mj-text-xs);\n color: var(--mj-brand-primary);\n cursor: pointer;\n text-decoration: underline;\n}\n\n.mjo-oh-switch--sm button {\n padding: 4px 10px;\n}\n\n.mjo-oh-acct__basis,\n.mjo-oh-acct__note,\n.mjo-oh-acct__excluded {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-acct__note,\n.mjo-oh-acct__excluded {\n margin: var(--mj-space-2) 0 0;\n}\n\n.mjo-oh-je__table--detail tbody tr.is-clickable {\n cursor: pointer;\n}\n\n.mjo-oh-je__table--detail tbody tr.is-clickable:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.mjo-oh-jecard {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n overflow: hidden;\n}\n\n.mjo-oh-jecard + .mjo-oh-jecard {\n margin-top: var(--mj-space-3);\n}\n\n.mjo-oh-jecard__head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n padding: var(--mj-space-2) var(--mj-space-3);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.mjo-oh-jecard__co {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-jecard__sub {\n margin-left: var(--mj-space-2);\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-je__table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--mj-text-sm);\n}\n\n.mjo-oh-je__table th,\n.mjo-oh-je__table td {\n padding: var(--mj-space-2) var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-subtle);\n text-align: left;\n vertical-align: top;\n}\n\n.mjo-oh-je__table thead th {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-je__table tfoot th {\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n border-bottom: 0;\n background: var(--mj-bg-surface-sunken);\n}\n\n.mjo-oh-je__table .is-num {\n text-align: right;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n.mjo-oh-je__table .is-quiet {\n color: var(--mj-text-disabled);\n}\n\n.mjo-oh-acctline {\n display: flex;\n align-items: baseline;\n gap: var(--mj-space-2);\n flex-wrap: wrap;\n}\n\n.mjo-oh-acctline__code {\n font-variant-numeric: tabular-nums;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n letter-spacing: 0.02em;\n}\n\n.mjo-oh-acctline__name {\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-acctline__meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n margin-top: 4px;\n}\n\n.mjo-oh-dim {\n display: inline-flex;\n align-items: center;\n padding: 1px 8px;\n border-radius: var(--mj-radius-full);\n border: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n font-size: var(--mj-text-xs);\n}\n\n.mjo-oh-je__src {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n}\n\n@media (max-width: 760px) {\n .mjo-oh-parties,\n .mjo-oh-facts {\n grid-template-columns: 1fr;\n }\n .mjo-oh-money { margin-left: 0; }\n}\n"] }]
1552
+ args: [{ standalone: false, selector: 'bizapps-order-header-form', template: "@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"before-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <div class=\"mjo-oh-hero\" [class.is-collapsed]=\"!HeaderExpanded\">\n <div class=\"mjo-oh-hero__top\">\n <div class=\"mjo-oh-who\">\n <div class=\"mjo-oh-avatar\"><i class=\"fa-solid fa-file-invoice-dollar\"></i></div>\n <div>\n <div class=\"mjo-oh-title-row\">\n <h1 class=\"mjo-oh-title\">{{ HeaderTitle }}</h1>\n @if (ShowStatusChip) {\n <span [class]=\"StatusChipClass\">{{ record.Status }}</span>\n }\n </div>\n <div class=\"mjo-oh-sub\">{{ HeaderExpanded ? HeaderSubtitle : HeaderCollapsedMeta }}</div>\n </div>\n </div>\n <div class=\"mjo-oh-hero__aside\">\n <div class=\"mjo-oh-money\">\n <div>\n <span class=\"mjo-oh-kicker\">{{ TotalLabel }}</span>\n <span class=\"mjo-oh-amt\">{{ Money('total') }}</span>\n </div>\n <div>\n <span class=\"mjo-oh-kicker\">Paid</span>\n <span class=\"mjo-oh-amt\">{{ Money('paid') }}</span>\n </div>\n <div>\n <span class=\"mjo-oh-kicker\">Balance</span>\n <span class=\"mjo-oh-amt\">{{ Money('balance') }}</span>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"mjo-oh-hero__toggle\"\n (click)=\"ToggleHeader()\"\n [attr.aria-expanded]=\"HeaderExpanded\"\n [attr.aria-label]=\"HeaderExpanded ? 'Collapse header' : 'Expand header'\"\n [title]=\"HeaderExpanded ? 'Collapse header' : 'Expand header'\">\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"HeaderExpanded\" [class.fa-chevron-down]=\"!HeaderExpanded\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n @if (HeaderExpanded) {\n <div class=\"mjo-oh-facts\">\n <div class=\"mjo-oh-fact\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OrderType\" Type=\"select\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n </div>\n <div class=\"mjo-oh-fact\">\n <bizapps-selling-company-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"CompanyID\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></bizapps-selling-company-field>\n </div>\n <div class=\"mjo-oh-fact\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OrderDate\" Type=\"datepicker\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n </div>\n </div>\n @if (EditMode && record.MoneyLocked) {\n <div class=\"mjo-oh-hint\"><i class=\"fa-solid fa-lock\" aria-hidden=\"true\"></i> This order is booked, so its type, selling company, order date and bill-to are locked. Corrections go through a reversal order.</div>\n }\n\n <div class=\"mjo-oh-parties\" [class.is-ship]=\"ExpandedParty === 'ship'\" [class.is-bill]=\"ExpandedParty === 'bill'\" [class.is-none]=\"ExpandedParty === null\">\n <div class=\"mjo-oh-bubble\" [class.is-open]=\"ExpandedParty === 'ship'\" [class.is-rail]=\"ExpandedParty === 'bill'\">\n <div\n class=\"mjo-oh-bubble__hit\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"ExpandedParty === 'ship'\"\n (click)=\"SelectParty('ship')\"\n (keydown.enter)=\"SelectParty('ship')\"\n (keydown.space)=\"SelectParty('ship'); $event.preventDefault()\">\n <span class=\"mjo-oh-bubble__ic\"><i class=\"fa-solid fa-truck-fast\"></i></span>\n <span class=\"mjo-oh-bubble__copy\">\n <span class=\"mjo-oh-bubble__role\">Ship to</span>\n @if (ShipToIsSame) {\n <span class=\"mjo-oh-bubble__name\">{{ ShipToName }}</span>\n } @else {\n <button type=\"button\" class=\"mjo-oh-link mjo-oh-bubble__name\" (click)=\"OpenShipTo($event)\">{{ ShipToName }}</button>\n }\n <span class=\"mjo-oh-bubble__detail\">{{ ShipToDetail }}</span>\n </span>\n <i class=\"fa-solid mjo-oh-bubble__chev\" [class.fa-chevron-up]=\"ExpandedParty === 'ship'\" [class.fa-chevron-down]=\"ExpandedParty !== 'ship'\"></i>\n </div>\n @if (ExpandedParty === 'ship') {\n <div class=\"mjo-oh-bubble__edit\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ShipToOrganizationID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ShipToPersonID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\" (ValueChange)=\"OnPartyPersonChange('ShipTo')\"></mj-form-field>\n <mjo-party-address-picker\n [Order]=\"record\"\n Side=\"ship\"\n [EditMode]=\"ComposeMode\"\n [PersonName]=\"record.ShipToPerson\"\n [OrganizationName]=\"record.ShipToOrganization\">\n </mjo-party-address-picker>\n </div>\n }\n </div>\n\n <div class=\"mjo-oh-bubble\" [class.is-open]=\"ExpandedParty === 'bill'\" [class.is-rail]=\"ExpandedParty === 'ship'\" [class.is-needed]=\"NeedsBillTo\">\n <div\n class=\"mjo-oh-bubble__hit\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"ExpandedParty === 'bill'\"\n (click)=\"SelectParty('bill')\"\n (keydown.enter)=\"SelectParty('bill')\"\n (keydown.space)=\"SelectParty('bill'); $event.preventDefault()\">\n <span class=\"mjo-oh-bubble__ic\"><i class=\"fa-solid fa-file-invoice-dollar\"></i></span>\n <span class=\"mjo-oh-bubble__copy\">\n <span class=\"mjo-oh-bubble__role\">Bill to</span>\n @if (hasBillTo) {\n <button type=\"button\" class=\"mjo-oh-link mjo-oh-bubble__name\" (click)=\"OpenBillTo($event)\">{{ BillToName }}</button>\n } @else {\n <span class=\"mjo-oh-bubble__name\">{{ BillToName }}</span>\n }\n <span class=\"mjo-oh-bubble__detail\">{{ BillToDetail }}</span>\n </span>\n <i class=\"fa-solid mjo-oh-bubble__chev\" [class.fa-chevron-up]=\"ExpandedParty === 'bill'\" [class.fa-chevron-down]=\"ExpandedParty !== 'bill'\"></i>\n </div>\n @if (ExpandedParty === 'bill') {\n <div class=\"mjo-oh-bubble__edit\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"BillToOrganizationID\" Type=\"textbox\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"BillToPersonID\" Type=\"textbox\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\" (ValueChange)=\"OnPartyPersonChange('BillTo')\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"PaymentTermsTypeID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mjo-party-address-picker\n [Order]=\"record\"\n Side=\"bill\"\n [EditMode]=\"ComposeMode\"\n [PersonName]=\"record.BillToPerson\"\n [OrganizationName]=\"record.BillToOrganization\">\n </mjo-party-address-picker>\n </div>\n }\n </div>\n </div>\n\n @if (ConfirmBlockedReason) {\n <div class=\"mjo-oh-todo\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>Before this can be confirmed</span>\n @if (NeedsBillTo) {\n <button type=\"button\" (click)=\"JumpToBill()\">Need a bill-to party</button>\n } @else if (NeedsPaymentReference) {\n <button type=\"button\" (click)=\"JumpToPayment()\">Need a check / ACH reference</button>\n } @else {\n <span class=\"mjo-oh-todo__hint\">{{ ConfirmBlockedReason }}</span>\n }\n </div>\n }\n\n @if (StatusError) {\n <div class=\"mjo-oh-todo mjo-oh-todo--err\" role=\"alert\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ StatusError }}</span>\n </div>\n }\n\n <mj-tab-nav\n class=\"mjo-oh-tabs\"\n [Tabs]=\"ContextTabs\"\n [ActiveKey]=\"ActiveTab ?? ''\"\n (TabChange)=\"SelectTab($event)\">\n </mj-tab-nav>\n\n @if (ActiveTab === 'payment') {\n <div class=\"mjo-oh-tabpane\">\n <div class=\"mjo-oh-fields\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"InitialPaymentTypeID\" Type=\"textbox\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"InitialPaymentAmount\" Type=\"number\" [EditMode]=\"ComposeMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n @if (PaymentRequiresReference) {\n <label class=\"mjo-oh-ref\">\n <span class=\"mjo-oh-ref__label\">Check / ACH reference</span>\n <input\n class=\"mj-input\"\n [ngModel]=\"PaymentReference\"\n (ngModelChange)=\"SetPaymentReference($event)\"\n [disabled]=\"!ComposeMode\"\n placeholder=\"Check number or confirmation ID\"\n autocomplete=\"off\"\n aria-label=\"Check or ACH reference\">\n </label>\n }\n </div>\n @if (record.IsSaved && PaymentParams) {\n <mj-explorer-entity-data-grid\n [Params]=\"PaymentParams\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"true\"\n [ShowNewButton]=\"false\"\n [ShowDeleteButton]=\"false\"\n [Height]=\"'fit-content'\"\n [MaxHeight]=\"RelatedGridHeight\"\n (Navigate)=\"OnFormNavigate($event)\">\n </mj-explorer-entity-data-grid>\n } @else {\n <div class=\"mjo-oh-hint\">Intent only \u2014 the payment is created when the order is confirmed.</div>\n }\n </div>\n }\n\n @if (ActiveTab === 'details') {\n <div class=\"mjo-oh-tabpane\">\n <div class=\"mjo-oh-fields\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"RequestedDeliveryDate\" Type=\"datepicker\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"DueDate\" Type=\"datepicker\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ExternalDocumentNumber\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"FulfillmentStatus\" Type=\"select\" [EditMode]=\"false\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Status\" Type=\"select\" [EditMode]=\"false\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"SalesRepUserID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Description\" Type=\"textarea\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Notes\" Type=\"textarea\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" (Navigate)=\"OnFormNavigate($event)\"></mj-form-field>\n </div>\n </div>\n }\n\n @if (ActiveTab === 'charges' && record.IsSaved) {\n <div class=\"mjo-oh-tabpane\">\n @if (ChargeParams) {\n <mj-explorer-entity-data-grid\n [Params]=\"ChargeParams\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"true\"\n [ShowNewButton]=\"false\"\n [ShowDeleteButton]=\"false\"\n [Height]=\"'fit-content'\"\n [MaxHeight]=\"RelatedGridHeight\"\n (Navigate)=\"OnFormNavigate($event)\">\n </mj-explorer-entity-data-grid>\n @if (record.MoneyLocked) {\n <div class=\"mjo-oh-hint\">Charges were booked with the order and cannot be edited.</div>\n }\n }\n </div>\n }\n\n @if (ActiveTab === 'accounting' && record.IsSaved) {\n <div class=\"mjo-oh-tabpane\">\n <div class=\"mjo-oh-acct__bar\">\n <div>\n <h2>{{ AccountingView === 'summary' ? 'Order journal' : 'Journal entries' }}</h2>\n <p>\n @if (AccountingView === 'summary') {\n Gross debits and credits per account over this order's whole life \u2014 not a stored row\n } @else {\n Every stored journal this order caused, unnetted \u2014 open a row to drill in\n }\n </p>\n </div>\n <div class=\"mjo-oh-switch\" role=\"group\" aria-label=\"Accounting view\">\n <button type=\"button\" [class.is-on]=\"AccountingView === 'summary'\" (click)=\"SetAccountingView('summary')\">Rolled up</button>\n <button type=\"button\" [class.is-on]=\"AccountingView === 'detail'\" (click)=\"SetAccountingView('detail')\">\n By line\n @if (RollupJournalCount) {\n <span class=\"mjo-oh-switch__n\">{{ RollupJournalCount }}</span>\n }\n </button>\n <button type=\"button\" [class.is-on]=\"AccountingView === 'waterfall'\" (click)=\"SetAccountingView('waterfall')\">\n <i class=\"fa-solid fa-chart-line\"></i> Rev-Rec Waterfall\n </button>\n </div>\n </div>\n\n <!-- One set of controls for both views, so they can never disagree about what is in. -->\n @if (AccountingView !== 'waterfall') {\n <div class=\"mjo-oh-acct__controls\">\n <label class=\"mjo-oh-asof\">\n <span>As of</span>\n <input\n type=\"date\"\n [value]=\"AccountingAsOf ?? ''\"\n (change)=\"OnAccountingAsOfChanged($any($event.target).value)\"\n aria-label=\"Include entries dated on or before\" />\n </label>\n @if (AccountingAsOf) {\n <button type=\"button\" class=\"mjo-oh-asof__clear\" (click)=\"OnAccountingAsOfChanged('')\">\n Lifetime\n </button>\n }\n <div class=\"mjo-oh-switch mjo-oh-switch--sm\" role=\"group\" aria-label=\"Date basis\">\n <button type=\"button\" [class.is-on]=\"AccountingBasis === 'effective'\" (click)=\"SetAccountingBasis('effective')\">\n Effective date\n </button>\n <button type=\"button\" [class.is-on]=\"AccountingBasis === 'posting'\" (click)=\"SetAccountingBasis('posting')\">\n Posting date\n </button>\n </div>\n <span class=\"mjo-oh-acct__basis\">\n @if (AccountingBasis === 'posting') {\n GL date of the batch \u2014 Posted batches only\n } @else {\n Subledger date on the entry itself\n }\n </span>\n </div>\n }\n\n @if (AccountingView === 'waterfall') {\n <div style=\"padding: 12px 0;\">\n <mj-deferred-revenue-waterfall\n [JournalEntries]=\"RevRecJournalEntries\"\n [Title]=\"'Order Rev-Rec &amp; Deferred Revenue Schedule'\"\n (JournalEntrySelected)=\"OnJournalEntrySelected($event)\">\n </mj-deferred-revenue-waterfall>\n </div>\n } @else if (AccountingView === 'summary') {\n @if (RollupLoading) {\n <div class=\"mjo-oh-hint\">Rolling up journals\u2026</div>\n } @else if (RollupError) {\n <div class=\"mjo-oh-hint\">{{ RollupError }}</div>\n } @else if (RollupCards.length === 0) {\n <div class=\"mjo-oh-hint\">\n @if (RollupExcludedLabel) {\n Nothing in view \u2014 {{ RollupExcludedLabel }}.\n } @else {\n No journals yet \u2014 they appear when the order is confirmed.\n }\n </div>\n } @else {\n @for (card of RollupCards; track card.CompanyID) {\n <article class=\"mjo-oh-jecard\">\n <header class=\"mjo-oh-jecard__head\">\n <div>\n <span class=\"mjo-oh-jecard__co\">{{ card.Company }}</span>\n <span class=\"mjo-oh-jecard__sub\">{{ card.Rows.length }} {{ card.Rows.length === 1 ? 'line' : 'lines' }}</span>\n </div>\n <span class=\"mjo-oh-chip\" [class.mjo-oh-chip--ok]=\"CardIsBalanced(card)\">\n {{ CardIsBalanced(card) ? 'Balanced' : 'Out of balance' }}\n </span>\n </header>\n <table class=\"mjo-oh-je__table\">\n <thead>\n <tr>\n <th>Account</th>\n <th class=\"is-num\">Debit</th>\n <th class=\"is-num\">Credit</th>\n </tr>\n </thead>\n <tbody>\n @for (row of card.Rows; track row.Key) {\n <tr>\n <td>\n <div class=\"mjo-oh-acctline\">\n @if (row.AccountCode) {\n <span class=\"mjo-oh-acctline__code\">{{ row.AccountCode }}</span>\n }\n <span class=\"mjo-oh-acctline__name\">{{ row.AccountName }}</span>\n </div>\n <div class=\"mjo-oh-acctline__meta\">\n @for (dim of row.Dimensions; track dim.Name + dim.Value) {\n <span class=\"mjo-oh-dim\">{{ dim.Name }} \u00B7 {{ dim.Value }}</span>\n }\n <span class=\"mjo-oh-je__src\">{{ SourceLineLabel(row.SourceLineCount) }}</span>\n </div>\n </td>\n <td class=\"is-num\" [class.is-quiet]=\"!row.Debit\">{{ RollupAmount(row.Debit) }}</td>\n <td class=\"is-num\" [class.is-quiet]=\"!row.Credit\">{{ RollupAmount(row.Credit) }}</td>\n </tr>\n }\n </tbody>\n <tfoot>\n <tr>\n <th>Total</th>\n <td class=\"is-num\">{{ RollupAmount(card.TotalDebit) }}</td>\n <td class=\"is-num\">{{ RollupAmount(card.TotalCredit) }}</td>\n </tr>\n </tfoot>\n </table>\n </article>\n }\n @for (note of RollupSharedNotes; track note) {\n <p class=\"mjo-oh-acct__note\">{{ note }}</p>\n }\n }\n @if (RollupExcludedLabel) {\n <p class=\"mjo-oh-acct__excluded\">\n {{ RollupExcludedLabel }} \u2014\n <button type=\"button\" class=\"mjo-oh-linkbtn\" (click)=\"SetAccountingView('detail')\">see By line</button>\n </p>\n }\n } @else {\n @if (RollupLoading) {\n <div class=\"mjo-oh-hint\">Loading journals\u2026</div>\n } @else if (RollupError) {\n <div class=\"mjo-oh-hint\">{{ RollupError }}</div>\n } @else if (JournalRows.length === 0) {\n <div class=\"mjo-oh-hint\">\n @if (RollupExcludedLabel) {\n Nothing in view \u2014 {{ RollupExcludedLabel }}.\n } @else {\n No journals yet \u2014 they appear when the order is confirmed.\n }\n </div>\n } @else {\n <table class=\"mjo-oh-je__table mjo-oh-je__table--detail\">\n <thead>\n <tr>\n <th>Entry</th>\n <th>Effective</th>\n <th>Batch</th>\n <th>Batch status</th>\n <th>Posting date</th>\n <th class=\"is-num\">Debit</th>\n <th class=\"is-num\">Credit</th>\n </tr>\n </thead>\n <tbody>\n @for (row of JournalRows; track row.ID) {\n <tr class=\"is-clickable\" (click)=\"OnJournalRowSelected(row.ID)\">\n <td>\n <div class=\"mjo-oh-acctline__name\">{{ row.EntryNumber }}</div>\n <div class=\"mjo-oh-acctline__meta\">\n <span>{{ row.Description }}</span>\n @if (row.SharedWithOtherOrders) {\n <span class=\"mjo-oh-dim\">{{ SharedOrdersLabel(row.SharedWithOtherOrders) }}</span>\n }\n </div>\n </td>\n <td>{{ JournalDate(row.EffectiveDate) }}</td>\n <td>{{ row.BatchNumber || '\u2014' }}</td>\n <td>{{ row.BatchStatus || 'Not batched' }}</td>\n <td>{{ JournalDate(row.BatchPostingDate) }}</td>\n <td class=\"is-num\" [class.is-quiet]=\"!row.Debit\">{{ RollupAmount(row.Debit) }}</td>\n <td class=\"is-num\" [class.is-quiet]=\"!row.Credit\">{{ RollupAmount(row.Credit) }}</td>\n </tr>\n }\n </tbody>\n </table>\n @if (RollupExcludedLabel) {\n <p class=\"mjo-oh-acct__excluded\">{{ RollupExcludedLabel }}, not listed above.</p>\n }\n }\n }\n </div>\n }\n\n @if (ActiveTab === 'subs' && record.IsSaved) {\n <div class=\"mjo-oh-tabpane\">\n @if (SubscriptionParams) {\n <mj-explorer-entity-data-grid\n [Params]=\"SubscriptionParams\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"true\"\n [ShowNewButton]=\"false\"\n [Height]=\"'fit-content'\"\n [MaxHeight]=\"RelatedGridHeight\"\n (Navigate)=\"OnFormNavigate($event)\">\n </mj-explorer-entity-data-grid>\n }\n </div>\n }\n }\n </div>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <mj-collapsible-panel\n SectionKey=\"mJBizAppsOrdersOrderLines\"\n SectionName=\"Lines\"\n Icon=\"fa fa-list-ol\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"LineBadge\"\n [DefaultExpanded]=\"true\">\n <mjo-order-lines-editor\n [Order]=\"record\"\n [EditMode]=\"ComposeMode\"\n (PricingChanged)=\"OnPricingChanged($event)\"\n (Navigate)=\"OnFormNavigate($event)\">\n </mjo-order-lines-editor>\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-related\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-everything\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n</mj-record-form-container>\n}\n", styles: ["/* mj-form-field uses display:contents + a 200px|1fr internal grid.\n Wrap each field; never place the host as a CSS-grid item. */\n\n:host ::ng-deep .mj-forms-panel-body:not(.mj-forms-panel-body--collapsed) {\n max-height: none;\n}\n\n:host ::ng-deep .mj-forms-panel-body:not(.mj-forms-panel-body--collapsed) .mj-forms-panel-content {\n max-height: none;\n overflow: visible;\n}\n\n/* Product search results sit `position: absolute` under the add-product\n input at the bottom of Lines. The panel card and body both use\n overflow:hidden (rounded-corner clip + collapse animation), which\n shears the list off at the section edge. Collapse still forces\n overflow:hidden on the collapsed body. */\n:host ::ng-deep mj-collapsible-panel:has(mjo-order-lines-editor) .mj-forms-panel {\n overflow: visible;\n}\n\n:host ::ng-deep mj-collapsible-panel:has(mjo-order-lines-editor) .mj-forms-panel-body:not(.mj-forms-panel-body--collapsed) {\n overflow: visible;\n}\n\n:host ::ng-deep mj-collapsible-panel:has(.mj-typeahead-list.is-open) {\n position: relative;\n z-index: 30;\n}\n\n.mjo-oh-hero {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n padding: var(--mj-space-4) var(--mj-space-5);\n margin-bottom: var(--mj-space-4);\n}\n\n.mjo-oh-hero.is-collapsed {\n padding: var(--mj-space-2) var(--mj-space-4);\n}\n\n.mjo-oh-hero.is-collapsed .mjo-oh-hero__top {\n align-items: center;\n}\n\n.mjo-oh-hero.is-collapsed .mjo-oh-avatar {\n width: 32px;\n height: 32px;\n font-size: 14px;\n}\n\n.mjo-oh-hero.is-collapsed .mjo-oh-title {\n font-size: var(--mj-text-base);\n}\n\n.mjo-oh-hero__toggle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n flex: 0 0 auto;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.mjo-oh-hero__toggle:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-hero__top {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--mj-space-4);\n flex-wrap: wrap;\n}\n\n.mjo-oh-hero__aside {\n display: flex;\n align-items: flex-start;\n gap: var(--mj-space-4);\n flex-wrap: wrap;\n}\n\n.mjo-oh-confirm {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: var(--mj-space-1);\n min-width: 11rem;\n}\n\n.mjo-oh-confirm__hint {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n text-align: right;\n max-width: 14rem;\n line-height: 1.35;\n}\n\n.mjo-oh-who {\n display: flex;\n align-items: center;\n gap: var(--mj-space-3);\n min-width: 0;\n}\n\n.mjo-oh-avatar {\n width: 44px;\n height: 44px;\n border-radius: var(--mj-radius-md);\n display: grid;\n place-items: center;\n flex: 0 0 auto;\n background: color-mix(in srgb, var(--mj-brand-primary) 18%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 18px;\n}\n\n.mjo-oh-title-row {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n flex-wrap: wrap;\n}\n\n.mjo-oh-title {\n margin: 0;\n font-size: var(--mj-text-lg);\n font-weight: var(--mj-font-bold);\n color: var(--mj-text-primary);\n letter-spacing: -0.02em;\n}\n\n.mjo-oh-sub {\n margin-top: 2px;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n}\n\n.mjo-oh-kicker {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-chip {\n display: inline-flex;\n align-items: center;\n padding: 2px 10px;\n border-radius: var(--mj-radius-full);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n}\n\n.mjo-oh-chip--ok {\n color: var(--mj-status-success-text);\n background: var(--mj-status-success-bg);\n border-color: var(--mj-status-success-border);\n}\n\n.mjo-oh-chip--void {\n color: var(--mj-status-error-text);\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n}\n\n.mjo-oh-money {\n display: flex;\n gap: var(--mj-space-5);\n padding: var(--mj-space-2) var(--mj-space-3);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n}\n\n.mjo-oh-money > div {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mjo-oh-amt {\n font-variant-numeric: tabular-nums;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-facts {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: var(--mj-space-3) var(--mj-space-4);\n margin-top: var(--mj-space-4);\n padding: var(--mj-space-3);\n border: 1px solid var(--mj-border-subtle);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface-sunken);\n}\n\n.mjo-oh-fact ::ng-deep .mj-forms-field {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 4px;\n padding: 0;\n}\n\n.mjo-oh-fact ::ng-deep .mj-forms-field-label {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n/* The shared field hover adds negative margin + extra padding, which shoves\n the three header facts down. Keep the tint, drop the layout shift. */\n.mjo-oh-fact ::ng-deep .mj-forms-field--editing:hover {\n margin: 0;\n padding: 0;\n}\n\n.mjo-oh-fields {\n display: flex;\n flex-direction: column;\n}\n\n.mjo-oh-parties {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n gap: var(--mj-space-3);\n align-items: start;\n margin: var(--mj-space-4) 0 var(--mj-space-3);\n}\n\n.mjo-oh-parties.is-bill {\n grid-template-columns: auto minmax(0, 1fr);\n}\n\n.mjo-oh-parties.is-none {\n grid-template-columns: 1fr 1fr;\n}\n\n.mjo-oh-bubble {\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n min-width: 0;\n}\n\n.mjo-oh-bubble.is-open {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 45%, var(--mj-border-default));\n}\n\n.mjo-oh-bubble.is-rail {\n width: 3.25rem;\n flex: 0 0 auto;\n}\n\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__hit {\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n gap: var(--mj-space-2);\n padding: var(--mj-space-2);\n min-height: 5.5rem;\n}\n\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__copy {\n flex: 0 0 auto;\n align-items: center;\n}\n\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__role {\n writing-mode: vertical-rl;\n transform: rotate(180deg);\n letter-spacing: 0.08em;\n}\n\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__name,\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__detail,\n.mjo-oh-bubble.is-rail .mjo-oh-bubble__chev {\n display: none;\n}\n\n@media (max-width: 720px) {\n .mjo-oh-parties,\n .mjo-oh-parties.is-bill,\n .mjo-oh-parties.is-none {\n grid-template-columns: 1fr;\n }\n\n .mjo-oh-bubble.is-rail {\n width: auto;\n }\n\n .mjo-oh-bubble.is-rail .mjo-oh-bubble__hit {\n flex-direction: row;\n min-height: 0;\n padding: var(--mj-space-2) var(--mj-space-3);\n }\n\n .mjo-oh-bubble.is-rail .mjo-oh-bubble__copy {\n align-items: flex-start;\n }\n\n .mjo-oh-bubble.is-rail .mjo-oh-bubble__role {\n writing-mode: horizontal-tb;\n transform: none;\n }\n}\n\n.mjo-oh-bubble.is-needed {\n border-color: color-mix(in srgb, var(--mj-status-warning) 45%, var(--mj-border-default));\n}\n\n.mjo-oh-bubble__hit {\n display: flex;\n align-items: center;\n gap: var(--mj-space-3);\n width: 100%;\n padding: var(--mj-space-3);\n border: 0;\n background: transparent;\n color: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.mjo-oh-bubble__name.mjo-oh-link {\n display: inline;\n padding: 0;\n border: 0;\n background: transparent;\n font: inherit;\n font-size: inherit;\n font-weight: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.mjo-oh-bubble__hit:hover { background: var(--mj-bg-surface-hover); }\n\n.mjo-oh-bubble__ic {\n width: var(--mj-space-8);\n height: var(--mj-space-8);\n border-radius: var(--mj-radius-sm);\n display: grid;\n place-items: center;\n flex: 0 0 auto;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n}\n\n.mjo-oh-bubble__copy {\n min-width: 0;\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mjo-oh-bubble__role {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-bubble__name {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-bubble__detail {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mjo-oh-bubble__chev {\n color: var(--mj-text-muted);\n font-size: var(--mj-text-xs);\n}\n\n.mjo-oh-bubble__edit {\n padding: var(--mj-space-3);\n border-top: 1px solid var(--mj-border-subtle);\n display: flex;\n flex-direction: column;\n}\n\n.mjo-oh-addr {\n margin-top: var(--mj-space-2);\n padding-top: var(--mj-space-2);\n border-top: 1px dashed var(--mj-border-subtle);\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1);\n}\n\n.mjo-oh-addr__bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n}\n\n.mjo-oh-addr__label {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-addr__btn {\n border: 0;\n background: transparent;\n color: var(--mj-text-link);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n cursor: pointer;\n padding: 0;\n}\n\n.mjo-oh-addr__btn:disabled {\n color: var(--mj-text-disabled);\n cursor: default;\n}\n\n.mjo-oh-addr__row {\n display: grid;\n grid-template-columns: minmax(0, 1.4fr) minmax(0, 0.8fr) minmax(0, 0.8fr);\n gap: var(--mj-space-2);\n}\n\n.mjo-oh-link {\n color: var(--mj-text-link);\n text-decoration: none;\n}\n\n.mjo-oh-link:hover { text-decoration: underline; }\n\n.mjo-oh-todo {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n flex-wrap: wrap;\n margin-bottom: var(--mj-space-3);\n font-size: var(--mj-text-sm);\n color: var(--mj-status-warning-text);\n}\n\n.mjo-oh-todo button,\n.mjo-oh-todo__hint {\n background: var(--mj-status-warning-bg);\n border: 1px solid var(--mj-status-warning-border);\n color: var(--mj-status-warning-text);\n border-radius: var(--mj-radius-full);\n padding: 2px 8px;\n font: inherit;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n}\n\n.mjo-oh-todo button { cursor: pointer; }\n\n.mjo-oh-todo--err {\n color: var(--mj-status-error-text);\n}\n\n.mjo-oh-ref {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin-top: var(--mj-space-3);\n}\n\n.mjo-oh-ref__label {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-ref .mj-input {\n max-width: 22rem;\n}\n\n.mjo-oh-tabs {\n display: block;\n margin-top: var(--mj-space-2);\n}\n\n.mjo-oh-tabpane { margin-top: var(--mj-space-3); }\n\n.mjo-oh-tabpane mj-explorer-entity-data-grid {\n display: block;\n}\n\n.mjo-oh-hint {\n margin-top: var(--mj-space-2);\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-acct__bar {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--mj-space-3);\n flex-wrap: wrap;\n margin-bottom: var(--mj-space-3);\n}\n\n.mjo-oh-acct__bar h2 {\n margin: 0;\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-acct__bar p {\n margin: 2px 0 0;\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-switch {\n display: inline-flex;\n padding: 2px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n}\n\n.mjo-oh-switch button {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--mj-text-secondary);\n font: inherit;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n padding: 5px 12px;\n border-radius: var(--mj-radius-full);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.mjo-oh-switch button.is-on {\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n box-shadow: 0 0 0 1px var(--mj-border-subtle);\n}\n\n.mjo-oh-switch__n {\n min-width: 1.25em;\n padding: 0 5px;\n border-radius: var(--mj-radius-full);\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-variant-numeric: tabular-nums;\n text-align: center;\n}\n\n/* As-of + basis controls: one row above whichever of the two views is showing. */\n.mjo-oh-acct__controls {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--mj-space-2) var(--mj-space-3);\n margin-bottom: var(--mj-space-3);\n}\n\n.mjo-oh-asof {\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-2);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n}\n\n.mjo-oh-asof input {\n font: inherit;\n font-weight: var(--mj-font-normal);\n padding: 4px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-asof__clear,\n.mjo-oh-linkbtn {\n appearance: none;\n border: 0;\n background: transparent;\n padding: 0;\n font: inherit;\n font-size: var(--mj-text-xs);\n color: var(--mj-brand-primary);\n cursor: pointer;\n text-decoration: underline;\n}\n\n.mjo-oh-switch--sm button {\n padding: 4px 10px;\n}\n\n.mjo-oh-acct__basis,\n.mjo-oh-acct__note,\n.mjo-oh-acct__excluded {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-acct__note,\n.mjo-oh-acct__excluded {\n margin: var(--mj-space-2) 0 0;\n}\n\n.mjo-oh-je__table--detail tbody tr.is-clickable {\n cursor: pointer;\n}\n\n.mjo-oh-je__table--detail tbody tr.is-clickable:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.mjo-oh-jecard {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n overflow: hidden;\n}\n\n.mjo-oh-jecard + .mjo-oh-jecard {\n margin-top: var(--mj-space-3);\n}\n\n.mjo-oh-jecard__head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mj-space-2);\n padding: var(--mj-space-2) var(--mj-space-3);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.mjo-oh-jecard__co {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-jecard__sub {\n margin-left: var(--mj-space-2);\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-je__table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--mj-text-sm);\n}\n\n.mjo-oh-je__table th,\n.mjo-oh-je__table td {\n padding: var(--mj-space-2) var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-subtle);\n text-align: left;\n vertical-align: top;\n}\n\n.mjo-oh-je__table thead th {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mjo-oh-je__table tfoot th {\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n border-bottom: 0;\n background: var(--mj-bg-surface-sunken);\n}\n\n.mjo-oh-je__table .is-num {\n text-align: right;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n.mjo-oh-je__table .is-quiet {\n color: var(--mj-text-disabled);\n}\n\n.mjo-oh-acctline {\n display: flex;\n align-items: baseline;\n gap: var(--mj-space-2);\n flex-wrap: wrap;\n}\n\n.mjo-oh-acctline__code {\n font-variant-numeric: tabular-nums;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-secondary);\n letter-spacing: 0.02em;\n}\n\n.mjo-oh-acctline__name {\n color: var(--mj-text-primary);\n}\n\n.mjo-oh-acctline__meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n margin-top: 4px;\n}\n\n.mjo-oh-dim {\n display: inline-flex;\n align-items: center;\n padding: 1px 8px;\n border-radius: var(--mj-radius-full);\n border: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n font-size: var(--mj-text-xs);\n}\n\n.mjo-oh-je__src {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n}\n\n@media (max-width: 760px) {\n .mjo-oh-parties,\n .mjo-oh-facts {\n grid-template-columns: 1fr;\n }\n .mjo-oh-money { margin-left: 0; }\n}\n"] }]
1543
1553
  }], null, null); })();
1544
1554
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(BizAppsOrderHeaderFormComponent, { className: "BizAppsOrderHeaderFormComponent", filePath: "lib/custom/OrderHeader/order-header-form.component.ts", lineNumber: 87 }); })();
1545
1555
  /** Tree-shaking prevention anchor. */