From 2762f91e58f6288256718cca8252e64dd67679f1 Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Tue, 1 Sep 2026 08:45:06 +0100 Subject: [PATCH] feat(templates): add the Workspace SaaS invoice preset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A violet-accented sheet: a brand masthead over a short accent bar, a half-split issuer and metadata header, two addressed parties on filled discs, a service-line table whose marks sit on coloured tiles, a settlement row pairing the bank details against the totals, and a closing band carrying the wordmark. Ships as invoice.presets.WorkspaceInvoice on the existing StructuredInvoiceData model. Like PaymentsInvoice it flows: the table's header repeats, a continuation page reserves a deeper bottom margin, and every page carries its number. The design's own closing band cannot be page chrome — a header footer zone takes only strings and the band holds a wordmark and a link — so it is body content and the number is the only chrome. This design states its currency once per money column and writes the figures under it bare, carrying the code only on the total, which is the opposite of what PaymentsInvoice does; a quantity is written with what it counts. Both parties print a registration under their address, and one with no number prints no label. Two of the design's type corrections are carried as measured constants: half a pixel of screenshot antialiasing in every cap, and the 6% the body face adds to an all-caps run at the same cap height. Guarded by a 16-case smoke test, an exact layout snapshot and a pixel-parity gate. --- CHANGELOG.md | 28 + .../readme/examples/invoice-workspace-v2.pdf | Bin 0 -> 30162 bytes .../demcha/examples/GenerateAllExamples.java | 2 + .../examples/support/ShowcaseMetadata.java | 1 + .../support/WorkspaceInvoiceSampleData.java | 141 + .../invoice/v2/WorkspaceInvoiceV2Example.java | 54 + .../presets/WorkspaceInvoiceFixtures.java | 140 + .../WorkspaceInvoiceLayoutSnapshotTest.java | 33 + .../presets/WorkspaceInvoiceSmokeTest.java | 269 + .../WorkspaceInvoiceVisualParityTest.java | 41 + .../invoice/workspace_invoice_layout.json | 6197 +++++++++++++++++ .../workspace_invoice-page-0.png | Bin 0 -> 87551 bytes .../invoice/presets/WorkspaceClosing.java | 172 + .../invoice/presets/WorkspaceIcons.java | 87 + .../invoice/presets/WorkspaceInvoice.java | 169 + .../invoice/presets/WorkspaceLines.java | 200 + .../invoice/presets/WorkspaceMasthead.java | 304 + .../invoice/presets/WorkspaceSettlement.java | 273 + .../invoice/presets/WorkspaceStyles.java | 344 + .../invoice/presets/WorkspaceText.java | 98 + .../invoice/presets/WorkspaceWidgets.java | 158 + .../invoice/workspace/icons/bank.svg | 1 + .../invoice/workspace/icons/bill-to.svg | 1 + .../invoice/workspace/icons/calendar.svg | 1 + .../invoice/workspace/icons/grid.svg | 1 + .../invoice/workspace/icons/info.svg | 1 + .../invoice/workspace/icons/search.svg | 1 + .../invoice/workspace/icons/shield.svg | 1 + .../invoice/workspace/icons/ship-to.svg | 1 + 29 files changed, 8719 insertions(+) create mode 100644 assets/readme/examples/invoice-workspace-v2.pdf create mode 100644 examples/src/main/java/com/demcha/examples/support/WorkspaceInvoiceSampleData.java create mode 100644 examples/src/main/java/com/demcha/examples/templates/invoice/v2/WorkspaceInvoiceV2Example.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoiceFixtures.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoiceLayoutSnapshotTest.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoiceSmokeTest.java create mode 100644 qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoiceVisualParityTest.java create mode 100644 qa/src/test/resources/layout-snapshots/canonical-templates/invoice/workspace_invoice_layout.json create mode 100644 qa/src/test/resources/visual-baselines/invoice-v2-layered/workspace_invoice-page-0.png create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceClosing.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceIcons.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoice.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceLines.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceMasthead.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceSettlement.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceStyles.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceText.java create mode 100644 templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceWidgets.java create mode 100644 templates/src/main/resources/templates/invoice/workspace/icons/bank.svg create mode 100644 templates/src/main/resources/templates/invoice/workspace/icons/bill-to.svg create mode 100644 templates/src/main/resources/templates/invoice/workspace/icons/calendar.svg create mode 100644 templates/src/main/resources/templates/invoice/workspace/icons/grid.svg create mode 100644 templates/src/main/resources/templates/invoice/workspace/icons/info.svg create mode 100644 templates/src/main/resources/templates/invoice/workspace/icons/search.svg create mode 100644 templates/src/main/resources/templates/invoice/workspace/icons/shield.svg create mode 100644 templates/src/main/resources/templates/invoice/workspace/icons/ship-to.svg diff --git a/CHANGELOG.md b/CHANGELOG.md index 67ab2e97d..7e4e28b36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -120,6 +120,34 @@ follow semantic versioning; release dates are ISO 8601. ### Templates +- **A violet SaaS invoice preset: `WorkspaceInvoice`.** A brand masthead over a short + accent bar, a half-split issuer and metadata header, two addressed parties on filled + discs, a service-line table whose marks sit on coloured tiles, a settlement row + pairing the bank details against the totals, and a closing band carrying the wordmark. + Ships as `invoice.presets.WorkspaceInvoice` on the existing `StructuredInvoiceData` + model, porting the rendered layout of a published standalone template. Like + `PaymentsInvoice` it flows — the table's header repeats on every page it reaches, a + continuation page reserves a deeper bottom margin, and every page carries its number, + which is a departure from the one-page design and the only way a lost page is + detectable. The sheet's own closing band cannot be page chrome, because a header + footer zone takes only strings and the band holds a wordmark and a link, so it is body + content and the number is the only chrome. Two of the design's own type corrections + are carried as measured constants rather than smoothed away: a cap read off a + screenshot includes half a pixel of antialiasing on each edge, and the body face sets + uppercase about 6% wider than the design's at the same cap height — measured across + three all-caps runs while mixed-case runs at the same sizes matched within 2%. This + design states its currency once per money column and writes the figures under it bare, + carrying the code only on the total, which is the opposite of what `PaymentsInvoice` + does and is why the two presets format money differently. A quantity is written with + what it counts. Both parties print a registration under their address through the pair + `InvoiceRecipient` gained for it, and a party with no number prints no label. Guarded + by a smoke test (including the unknown-mark data error, a line with no mark, the + wordmark fallback, the currency named once and not on every figure, the quantity with + its unit, both registrations and the absent one, the closing address as an annotation, + a missing ship-to, a payment card with no note, an empty document, and a thirty-line + invoice that runs on, repeats its column names and numbers its pages), an exact layout + snapshot and a pixel-parity gate; the examples showcase gains `invoice-workspace-v2`. + - **A paginating invoice preset: `PaymentsInvoice`.** A lavender-and-navy sheet with a diagonal band crossing the masthead, a half-split issuer and metadata header, two addressed parties on discs, a marked service-line table, a settlement row pairing bank diff --git a/assets/readme/examples/invoice-workspace-v2.pdf b/assets/readme/examples/invoice-workspace-v2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b12e2f8581bbe378f2d4711892dd275d6c843add GIT binary patch literal 30162 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 tags, String codeUrl invoice("invoice-consulting-v2", "v2/ConsultingInvoiceV2Example", "Consulting Invoice", "The ConsultingInvoice preset on the structured invoice model — brand lockup with the caller's logo, labelled masthead metadata, priced service lines with service periods, a totals stack and bank payment fields.", "invoice"); invoice("invoice-luma-studio-v2", "v2/LumaStudioInvoiceV2Example", "Luma Studio Invoice", "The LumaStudioInvoice preset on the structured invoice model — a cream sidebar carrying the brand lockup and its ornament, a billed-to / shipped-to pair, priced service lines with a VAT column, and the notes and bank details above a sign-off band.", "invoice"); invoice("invoice-payments-v2", "v2/PaymentsInvoiceV2Example", "Payments Invoice", "The PaymentsInvoice preset on the structured invoice model — a diagonal band crossing the masthead, a half-split issuer and metadata header, two addressed parties, marked service lines that repeat their header across pages, and a settlement row pairing bank details against the totals.", "invoice"); + invoice("invoice-workspace-v2", "v2/WorkspaceInvoiceV2Example", "Workspace Invoice", "The WorkspaceInvoice preset on the structured invoice model — a brand masthead over an accent bar, a half-split issuer and metadata header, two addressed parties on discs, service lines whose marks sit on coloured tiles, and a settlement row above a closing band.", "invoice"); invoice("invoice-modern-v2", "v2/ModernInvoiceV2Example", "Modern Invoice", "The ModernInvoice preset composed straight from an InvoiceDocumentSpec — line items, totals and payment block driven by the BrandTheme rather than per-document styling.", "invoice"); invoice("invoice-classic-v2", "v2/ClassicInvoiceV2Example", "Classic Invoice", "The ClassicInvoice preset — letterhead header band, TOTAL DUE hero strip, BILL TO / FROM columns, and a dedicated Summary table after the line items.", "invoice"); diff --git a/examples/src/main/java/com/demcha/examples/support/WorkspaceInvoiceSampleData.java b/examples/src/main/java/com/demcha/examples/support/WorkspaceInvoiceSampleData.java new file mode 100644 index 000000000..9a569a11e --- /dev/null +++ b/examples/src/main/java/com/demcha/examples/support/WorkspaceInvoiceSampleData.java @@ -0,0 +1,141 @@ +package com.demcha.examples.support; + +import com.demcha.compose.document.templates.data.invoice.InvoiceBrand; +import com.demcha.compose.document.templates.data.invoice.InvoiceContactBlock; +import com.demcha.compose.document.templates.data.invoice.InvoiceMasthead; +import com.demcha.compose.document.templates.data.invoice.InvoiceNotesBlock; +import com.demcha.compose.document.templates.data.invoice.InvoicePaymentBlock; +import com.demcha.compose.document.templates.data.invoice.InvoiceRecipient; +import com.demcha.compose.document.templates.data.invoice.InvoiceServiceLines; +import com.demcha.compose.document.templates.data.invoice.InvoiceSummaryBlock; +import com.demcha.compose.document.templates.data.invoice.InvoiceTotalsBlock; +import com.demcha.compose.document.templates.data.invoice.StructuredInvoiceData; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * Shared sample data for the Workspace invoice example. + * + *

Kept in lockstep with the qa module's {@code WorkspaceInvoiceFixtures} — + * the two modules cannot share a source file, so a content change here belongs + * there too.

+ */ +public final class WorkspaceInvoiceSampleData { + + private WorkspaceInvoiceSampleData() { + } + + /** + * The sample invoice — six metadata rows, two addressed parties, four + * marked service lines, eight payment fields, two summed rows and a closing + * line with an address inside it. + * + * @return the document the example renders + */ + public static StructuredInvoiceData sample() { + return new StructuredInvoiceData( + brand(), supplier(), masthead(), billTo(), shipTo(), + new InvoiceSummaryBlock("", "", ""), + serviceLines(), totals(), payment(), notes(), "USD"); + } + + /** No logo: the wordmark is what a document without one falls back to. */ + private static InvoiceBrand brand() { + return new InvoiceBrand(null, "kestrel", "", "", "", ""); + } + + private static InvoiceContactBlock supplier() { + return new InvoiceContactBlock( + "Kestrel Collaboration, Inc.", + List.of("500 Howard Street, 6th Floor", "San Francisco, CA 94105", + "United States"), + "", "", "kestrel.example", + "", "", + "VAT ID:", "US 77-0560185"); + } + + private static InvoiceMasthead masthead() { + List entries = new ArrayList<>(); + entries.add(new InvoiceMasthead.Entry("Invoice Number:", "INV-2024-0003521", true)); + entries.add(new InvoiceMasthead.Entry("Invoice Date:", "27 May 2024", false)); + entries.add(new InvoiceMasthead.Entry("Billing Period:", "1 - 31 May 2024", false)); + entries.add(new InvoiceMasthead.Entry("Workspace ID:", "T04FQ9L2M", false)); + entries.add(new InvoiceMasthead.Entry("Payment Terms:", "Net 30", false)); + entries.add(new InvoiceMasthead.Entry("Due Date:", "26 June 2024", false)); + return new InvoiceMasthead("INVOICE", entries); + } + + /** The registration is the labelled pair printed under the address. */ + private static InvoiceRecipient billTo() { + return new InvoiceRecipient("BILL TO", "Bright Future Ltd.", "", + List.of("45 King Street", "Manchester M2 7AZ", "United Kingdom"), + "", "", "VAT ID:", "GB 987 6543 21"); + } + + private static InvoiceRecipient shipTo() { + return new InvoiceRecipient("SHIP TO", "Bright Future Ltd.", "", + List.of("Unit 4, Riverside Park", "Leeds LS1 4AP", "United Kingdom"), + "", "", "", ""); + } + + private static InvoiceServiceLines serviceLines() { + // The currency is not in the labels: the preset names it once per money + // column, so a document states the code and nothing else. + InvoiceServiceLines.Columns columns = new InvoiceServiceLines.Columns( + "", "DESCRIPTION", "PLAN / SERVICE", "QTY", "UNIT PRICE", "AMOUNT", ""); + List lines = new ArrayList<>(); + lines.add(line(1, "Kestrel Business+", "Workspace subscription", + "Business+ Annual", "50", "Users", "8.75", "437.50", "grid")); + lines.add(line(2, "Enterprise Key Management", "Customer-managed encryption keys", + "Add-on", "1", "", "100.00", "100.00", "search")); + lines.add(line(3, "Priority Support", "Named engineer and response target", + "Standard", "1", "", "50.00", "50.00", "shield")); + lines.add(line(4, "Workflow Automation", "Templates and scheduled runs", + "Included", "1", "", "0.00", "0.00", "grid")); + return new InvoiceServiceLines(columns, lines); + } + + private static InvoiceServiceLines.Line line(int number, String title, String description, + String plan, String quantity, String unit, + String unitPrice, String amount, String icon) { + return new InvoiceServiceLines.Line(number, title, description, plan, + new BigDecimal(quantity), unit, decimal(unitPrice), decimal(amount), "", icon); + } + + private static InvoiceTotalsBlock totals() { + List rows = new ArrayList<>(); + rows.add(new InvoiceTotalsBlock.Row("Subtotal", decimal("587.50"))); + rows.add(new InvoiceTotalsBlock.Row("Tax (0%)", decimal("0.00"))); + return new InvoiceTotalsBlock(rows, "TOTAL DUE", decimal("587.50")); + } + + private static InvoicePaymentBlock payment() { + List fields = new ArrayList<>(); + fields.add(new InvoicePaymentBlock.Field("Bank Name:", "Bay Union Bank, N.A.")); + fields.add(new InvoicePaymentBlock.Field("Account Name:", "Kestrel Collaboration, Inc.")); + fields.add(new InvoicePaymentBlock.Field("Account Number:", "000000123456789")); + fields.add(new InvoicePaymentBlock.Field("Routing (ABA):", "021000021")); + fields.add(new InvoicePaymentBlock.Field("SWIFT / BIC:", "BAYUUS33")); + fields.add(new InvoicePaymentBlock.Field("Currency:", "USD")); + fields.add(new InvoicePaymentBlock.Field("Reference:", "INV-2024-0003521")); + fields.add(new InvoicePaymentBlock.Field("Bank Address:", "1 Market Plaza, San Francisco")); + return new InvoicePaymentBlock("PAYMENT DETAILS", fields, + "Please include the invoice number in your payment reference.", + "PAYMENT DUE BY", + "26 June 2024", + "", ""); + } + + private static InvoiceNotesBlock notes() { + return new InvoiceNotesBlock("Thank you for using Kestrel.", + List.of("Questions about this invoice? Reach us at billing@kestrel.example " + + "and we will get back to you within one business day."), + "billing@kestrel.example", ""); + } + + private static BigDecimal decimal(String printed) { + return new BigDecimal(printed.replace(",", "")); + } +} diff --git a/examples/src/main/java/com/demcha/examples/templates/invoice/v2/WorkspaceInvoiceV2Example.java b/examples/src/main/java/com/demcha/examples/templates/invoice/v2/WorkspaceInvoiceV2Example.java new file mode 100644 index 000000000..2a18cfb5d --- /dev/null +++ b/examples/src/main/java/com/demcha/examples/templates/invoice/v2/WorkspaceInvoiceV2Example.java @@ -0,0 +1,54 @@ +package com.demcha.examples.templates.invoice; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.templates.api.DocumentTemplate; +import com.demcha.compose.document.templates.data.invoice.StructuredInvoiceData; +import com.demcha.compose.document.templates.invoice.presets.WorkspaceInvoice; +import com.demcha.examples.support.ExampleOutputPaths; +import com.demcha.examples.support.WorkspaceInvoiceSampleData; + +import java.nio.file.Path; + +/** + * Renders the layered {@code invoice.v2} Workspace preset against the design + * sample. + * + *

Output: + * {@code examples/target/generated-pdfs/templates/invoice/invoice-workspace-v2.pdf}.

+ * + *

The preset owns its page geometry and its pagination — the table's header + * repeats and a continuation page reserves a deeper bottom margin — so the + * session starts unconfigured. The sample brings no logo, so the lockup box + * beside the title is filled with the brand's name as a wordmark.

+ */ +public final class WorkspaceInvoiceV2Example { + + private WorkspaceInvoiceV2Example() { + } + + /** + * @return absolute path of the rendered PDF + * @throws Exception if rendering fails + */ + public static Path generate() throws Exception { + Path outputFile = ExampleOutputPaths.prepare("templates/invoice", + "invoice-workspace-v2.pdf"); + StructuredInvoiceData data = WorkspaceInvoiceSampleData.sample(); + DocumentTemplate template = WorkspaceInvoice.create(); + + try (DocumentSession document = GraphCompose.document(outputFile).create()) { + template.compose(document, data); + document.buildPdf(); + } + return outputFile; + } + + /** + * @param args ignored + * @throws Exception if rendering fails + */ + public static void main(String[] args) throws Exception { + System.out.println("Generated: " + generate()); + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoiceFixtures.java b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoiceFixtures.java new file mode 100644 index 000000000..28fca8964 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoiceFixtures.java @@ -0,0 +1,140 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.templates.data.invoice.InvoiceBrand; +import com.demcha.compose.document.templates.data.invoice.InvoiceContactBlock; +import com.demcha.compose.document.templates.data.invoice.InvoiceMasthead; +import com.demcha.compose.document.templates.data.invoice.InvoiceNotesBlock; +import com.demcha.compose.document.templates.data.invoice.InvoicePaymentBlock; +import com.demcha.compose.document.templates.data.invoice.InvoiceRecipient; +import com.demcha.compose.document.templates.data.invoice.InvoiceServiceLines; +import com.demcha.compose.document.templates.data.invoice.InvoiceSummaryBlock; +import com.demcha.compose.document.templates.data.invoice.InvoiceTotalsBlock; +import com.demcha.compose.document.templates.data.invoice.StructuredInvoiceData; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * Shared fixture data for the {@link WorkspaceInvoice} gates — the SAME + * document feeds the pixel parity test and the layout snapshot test, so a + * geometry shift the pixel budget absorbs still trips the exact snapshot, and + * vice versa. + */ +final class WorkspaceInvoiceFixtures { + + private WorkspaceInvoiceFixtures() { + } + + /** + * The canonical one-page invoice — six metadata rows, two addressed parties + * each printing a registration, four marked service lines, eight payment + * fields, two summed rows and a closing line with an address inside it. + * + * @return the document + */ + static StructuredInvoiceData canonicalInvoice() { + return new StructuredInvoiceData( + brand(), supplier(), masthead(), billTo(), shipTo(), + new InvoiceSummaryBlock("", "", ""), + serviceLines(), totals(), payment(), notes(), "USD"); + } + + /** No logo: the wordmark is what a document without one falls back to. */ + static InvoiceBrand brand() { + return new InvoiceBrand(null, "kestrel", "", "", "", ""); + } + + static InvoiceContactBlock supplier() { + return new InvoiceContactBlock( + "Kestrel Collaboration, Inc.", + List.of("500 Howard Street, 6th Floor", "San Francisco, CA 94105", + "United States"), + "", "", "kestrel.example", + "", "", + "VAT ID:", "US 77-0560185"); + } + + static InvoiceMasthead masthead() { + List entries = new ArrayList<>(); + entries.add(new InvoiceMasthead.Entry("Invoice Number:", "INV-2024-0003521", true)); + entries.add(new InvoiceMasthead.Entry("Invoice Date:", "27 May 2024", false)); + entries.add(new InvoiceMasthead.Entry("Billing Period:", "1 - 31 May 2024", false)); + entries.add(new InvoiceMasthead.Entry("Workspace ID:", "T04FQ9L2M", false)); + entries.add(new InvoiceMasthead.Entry("Payment Terms:", "Net 30", false)); + entries.add(new InvoiceMasthead.Entry("Due Date:", "26 June 2024", false)); + return new InvoiceMasthead("INVOICE", entries); + } + + /** The registration is the labelled pair printed under the address. */ + static InvoiceRecipient billTo() { + return new InvoiceRecipient("BILL TO", "Bright Future Ltd.", "", + List.of("45 King Street", "Manchester M2 7AZ", "United Kingdom"), + "", "", "VAT ID:", "GB 987 6543 21"); + } + + static InvoiceRecipient shipTo() { + return new InvoiceRecipient("SHIP TO", "Bright Future Ltd.", "", + List.of("Unit 4, Riverside Park", "Leeds LS1 4AP", "United Kingdom"), + "", "", "", ""); + } + + static InvoiceServiceLines serviceLines() { + // The currency is not in the labels: the preset names it once per money + // column, so a document states the code and nothing else. + InvoiceServiceLines.Columns columns = new InvoiceServiceLines.Columns( + "", "DESCRIPTION", "PLAN / SERVICE", "QTY", "UNIT PRICE", "AMOUNT", ""); + List lines = new ArrayList<>(); + lines.add(line(1, "Kestrel Business+", "Workspace subscription", + "Business+ Annual", "50", "Users", "8.75", "437.50", "grid")); + lines.add(line(2, "Enterprise Key Management", "Customer-managed encryption keys", + "Add-on", "1", "", "100.00", "100.00", "search")); + lines.add(line(3, "Priority Support", "Named engineer and response target", + "Standard", "1", "", "50.00", "50.00", "shield")); + lines.add(line(4, "Workflow Automation", "Templates and scheduled runs", + "Included", "1", "", "0.00", "0.00", "grid")); + return new InvoiceServiceLines(columns, lines); + } + + private static InvoiceServiceLines.Line line(int number, String title, String description, + String plan, String quantity, String unit, + String unitPrice, String amount, String icon) { + return new InvoiceServiceLines.Line(number, title, description, plan, + new BigDecimal(quantity), unit, decimal(unitPrice), decimal(amount), "", icon); + } + + static InvoiceTotalsBlock totals() { + List rows = new ArrayList<>(); + rows.add(new InvoiceTotalsBlock.Row("Subtotal", decimal("587.50"))); + rows.add(new InvoiceTotalsBlock.Row("Tax (0%)", decimal("0.00"))); + return new InvoiceTotalsBlock(rows, "TOTAL DUE", decimal("587.50")); + } + + static InvoicePaymentBlock payment() { + List fields = new ArrayList<>(); + fields.add(new InvoicePaymentBlock.Field("Bank Name:", "Bay Union Bank, N.A.")); + fields.add(new InvoicePaymentBlock.Field("Account Name:", "Kestrel Collaboration, Inc.")); + fields.add(new InvoicePaymentBlock.Field("Account Number:", "000000123456789")); + fields.add(new InvoicePaymentBlock.Field("Routing (ABA):", "021000021")); + fields.add(new InvoicePaymentBlock.Field("SWIFT / BIC:", "BAYUUS33")); + fields.add(new InvoicePaymentBlock.Field("Currency:", "USD")); + fields.add(new InvoicePaymentBlock.Field("Reference:", "INV-2024-0003521")); + fields.add(new InvoicePaymentBlock.Field("Bank Address:", "1 Market Plaza, San Francisco")); + return new InvoicePaymentBlock("PAYMENT DETAILS", fields, + "Please include the invoice number in your payment reference.", + "PAYMENT DUE BY", + "26 June 2024", + "", ""); + } + + static InvoiceNotesBlock notes() { + return new InvoiceNotesBlock("Thank you for using Kestrel.", + List.of("Questions about this invoice? Reach us at billing@kestrel.example " + + "and we will get back to you within one business day."), + "billing@kestrel.example", ""); + } + + private static BigDecimal decimal(String printed) { + return new BigDecimal(printed.replace(",", "")); + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoiceLayoutSnapshotTest.java b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoiceLayoutSnapshotTest.java new file mode 100644 index 000000000..74c3e25fe --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoiceLayoutSnapshotTest.java @@ -0,0 +1,33 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.templates.TemplateTestSupport; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Exact layout snapshot gate for {@link WorkspaceInvoice} — freezes the resolved + * geometry of the canonical one-page invoice, which the pixel budget cannot + * see: a small column or spacing shift stays under the visual-diff budget but + * changes the snapshot. + * + *

The preset owns its page geometry, so the session starts unconfigured.

+ * + *

Refresh with {@code -Dgraphcompose.updateSnapshots=true} after a + * deliberate layout change, and commit the JSON with the change.

+ */ +class WorkspaceInvoiceLayoutSnapshotTest { + + @Test + void canonicalInvoiceMatchesLayoutSnapshot() throws Exception { + try (DocumentSession session = GraphCompose.document().create()) { + WorkspaceInvoice.create().compose(session, + WorkspaceInvoiceFixtures.canonicalInvoice()); + assertThat(session.layoutSnapshot().totalPages()).as("total pages").isEqualTo(1); + TemplateTestSupport.assertCanonicalSnapshot( + session, "workspace_invoice_layout", "invoice"); + } + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoiceSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoiceSmokeTest.java new file mode 100644 index 000000000..8dad4bc60 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoiceSmokeTest.java @@ -0,0 +1,269 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.templates.api.DocumentTemplate; +import com.demcha.compose.document.templates.data.invoice.InvoiceBrand; +import com.demcha.compose.document.templates.data.invoice.InvoiceNotesBlock; +import com.demcha.compose.document.templates.data.invoice.InvoicePaymentBlock; +import com.demcha.compose.document.templates.data.invoice.InvoiceRecipient; +import com.demcha.compose.document.templates.data.invoice.InvoiceServiceLines; +import com.demcha.compose.document.templates.data.invoice.InvoiceSummaryBlock; +import com.demcha.compose.document.templates.data.invoice.StructuredInvoiceData; +import org.apache.pdfbox.Loader; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.interactive.action.PDActionURI; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink; +import org.apache.pdfbox.text.PDFTextStripper; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +/** + * Smoke test for {@link WorkspaceInvoice} — proves the preset renders a + * {@link StructuredInvoiceData} end-to-end with its packaged marks, names the + * currency once per money column rather than on every figure, writes a quantity + * with what it counts, prints a billed party's registration under its address, + * reports an unknown mark as a data error, repeats the table header when the + * lines run past a page, and carries the closing address as a link annotation, + * which moves no pixel and no layout node so neither gate would notice it going + * missing. + */ +class WorkspaceInvoiceSmokeTest { + + private static byte[] render(StructuredInvoiceData data) throws Exception { + // The preset owns its page geometry, so the session starts unconfigured. + try (DocumentSession session = GraphCompose.document().create()) { + WorkspaceInvoice.create().compose(session, data); + assertThat(session.roots()).isNotEmpty(); + byte[] pdfBytes = session.toPdfBytes(); + assertThat(pdfBytes).isNotEmpty(); + return pdfBytes; + } + } + + private static String textOf(byte[] pdfBytes) throws Exception { + try (PDDocument document = Loader.loadPDF(pdfBytes)) { + return new PDFTextStripper().getText(document); + } + } + + private static int pagesOf(StructuredInvoiceData data) throws Exception { + try (DocumentSession session = GraphCompose.document().create()) { + WorkspaceInvoice.create().compose(session, data); + return session.layoutSnapshot().totalPages(); + } + } + + private static List linkTargets(byte[] pdfBytes) throws Exception { + List targets = new ArrayList<>(); + try (PDDocument document = Loader.loadPDF(pdfBytes)) { + for (PDPage page : document.getPages()) { + for (PDAnnotation annotation : page.getAnnotations()) { + if (annotation instanceof PDAnnotationLink link + && link.getAction() instanceof PDActionURI uri) { + targets.add(uri.getURI()); + } + } + } + } + return targets; + } + + /** The canonical invoice with its service lines replaced. */ + private static StructuredInvoiceData withLines(InvoiceServiceLines lines) { + StructuredInvoiceData base = WorkspaceInvoiceFixtures.canonicalInvoice(); + return new StructuredInvoiceData(base.brand(), base.supplier(), base.masthead(), + base.billTo(), base.shipTo(), base.summary(), lines, base.totals(), + base.payment(), base.notes(), base.currencyCode()); + } + + @Test + void exposesStableIdentity() { + DocumentTemplate template = WorkspaceInvoice.create(); + assertThat(template.id()).isEqualTo(WorkspaceInvoice.ID); + assertThat(template.displayName()).isEqualTo(WorkspaceInvoice.DISPLAY_NAME); + } + + @Test + void rendersCanonicalInvoiceWithPackagedMarks() throws Exception { + render(WorkspaceInvoiceFixtures.canonicalInvoice()); + } + + @Test + void canonicalRenderCarriesEveryBlocksText() throws Exception { + String text = textOf(render(WorkspaceInvoiceFixtures.canonicalInvoice())); + assertThat(text) + .contains("INVOICE") + .contains("Kestrel Collaboration, Inc.") + .contains("Invoice Number:") + .contains("BILL TO") + .contains("SHIP TO") + .contains("Bright Future Ltd.") + .contains("Kestrel Business+") + .contains("PAYMENT DETAILS") + .contains("BAYUUS33") + .contains("TOTAL DUE") + .contains("PAYMENT DUE BY") + .contains("Thank you for using Kestrel."); + } + + @Test + void bothPartiesPrintTheirOwnRegistration() throws Exception { + // The supplier's sits under its address in the header, the billed + // party's under its address in the split — both labelled pairs. + String text = textOf(render(WorkspaceInvoiceFixtures.canonicalInvoice())); + assertThat(text).contains("US 77-0560185").contains("GB 987 6543 21"); + } + + @Test + void aPartyWithNoRegistrationPrintsNoLabel() throws Exception { + // The ship-to has none, and a label over an absence would be worse than + // no row at all — so there is exactly one of each in the split. + String text = textOf(render(WorkspaceInvoiceFixtures.canonicalInvoice())); + assertThat(text.split("VAT ID:", -1)).hasSize(3); + } + + @Test + void theCurrencyIsNamedOncePerColumnAndNotOnEveryFigure() throws Exception { + // This design states the currency in the column head; the figures under + // it are bare, and only the total carries the code. + String text = textOf(render(WorkspaceInvoiceFixtures.canonicalInvoice())); + assertThat(text) + .contains("UNIT PRICE (USD)") + .contains("AMOUNT (USD)") + .contains("USD 587.50") + .doesNotContain("$437.50"); + assertThat(text).contains("437.50"); + } + + @Test + void aQuantityIsWrittenWithWhatItCounts() throws Exception { + String text = textOf(render(WorkspaceInvoiceFixtures.canonicalInvoice())); + assertThat(text).contains("50 Users"); + } + + @Test + void aDocumentWithNoLogoFallsBackToItsName() throws Exception { + // The preset carries no mark of its own, so a document that brings only + // a name still gets a lockup — and the closing band always sets it. + assertThat(textOf(render(WorkspaceInvoiceFixtures.canonicalInvoice()))) + .contains("kestrel"); + } + + @Test + void theClosingAddressIsClickable() throws Exception { + assertThat(linkTargets(render(WorkspaceInvoiceFixtures.canonicalInvoice()))) + .contains("mailto:billing@kestrel.example") + .contains("https://kestrel.example"); + } + + @Test + void anUnknownMarkIsReportedAsADataError() { + InvoiceServiceLines wrong = new InvoiceServiceLines( + WorkspaceInvoiceFixtures.serviceLines().columns(), + List.of(new InvoiceServiceLines.Line(1, "Telepathy", "Reading minds", "Add-on", + BigDecimal.ONE, "", BigDecimal.TEN, BigDecimal.TEN, "", "telescope"))); + + assertThatThrownBy(() -> render(withLines(wrong))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("telescope") + .hasMessageContaining("shield"); + } + + @Test + void aLineWithoutAMarkIsDrawnWithoutOne() throws Exception { + InvoiceServiceLines unmarked = new InvoiceServiceLines( + WorkspaceInvoiceFixtures.serviceLines().columns(), + List.of(new InvoiceServiceLines.Line(1, "Consulting", "A day of it", "Standard", + BigDecimal.ONE, "", new BigDecimal("1200"), new BigDecimal("1200"), ""))); + + assertThat(textOf(render(withLines(unmarked)))).contains("Consulting"); + } + + @Test + void aLongerInvoiceRunsOnAndRepeatsItsTableHeader() throws Exception { + List many = new ArrayList<>(); + for (int index = 1; index <= 30; index++) { + many.add(new InvoiceServiceLines.Line(index, "Service " + index, + "A line of description for it", "Standard", + BigDecimal.ONE, "", new BigDecimal("120"), new BigDecimal("120"), + "", "grid")); + } + StructuredInvoiceData longer = withLines(new InvoiceServiceLines( + WorkspaceInvoiceFixtures.serviceLines().columns(), many)); + + assertThat(pagesOf(longer)).isGreaterThan(1); + byte[] pdfBytes = render(longer); + assertThat(textOf(pdfBytes)).contains("Service 30"); + try (PDDocument document = Loader.loadPDF(pdfBytes)) { + PDFTextStripper stripper = new PDFTextStripper(); + stripper.setStartPage(2); + stripper.setEndPage(2); + assertThat(stripper.getText(document)) + .as("the second page names its columns") + .contains("DESCRIPTION") + .contains("PLAN / SERVICE"); + } + } + + @Test + void everyPageCarriesItsNumber() throws Exception { + List many = new ArrayList<>(); + for (int index = 1; index <= 30; index++) { + many.add(new InvoiceServiceLines.Line(index, "Service " + index, "", "Standard", + BigDecimal.ONE, "", new BigDecimal("120"), new BigDecimal("120"), + "", "grid")); + } + String text = textOf(render(withLines(new InvoiceServiceLines( + WorkspaceInvoiceFixtures.serviceLines().columns(), many)))); + assertThat(text).contains("Page 1 of").contains("Page 2 of"); + } + + @Test + void anInvoiceWithNoShipToDrawsOneParty() throws Exception { + StructuredInvoiceData base = WorkspaceInvoiceFixtures.canonicalInvoice(); + StructuredInvoiceData single = new StructuredInvoiceData(base.brand(), base.supplier(), + base.masthead(), base.billTo(), + new InvoiceRecipient("", "", "", List.of(), "", ""), + base.summary(), base.serviceLines(), base.totals(), base.payment(), + base.notes(), base.currencyCode()); + + String text = textOf(render(single)); + assertThat(text).contains("BILL TO").doesNotContain("SHIP TO"); + } + + @Test + void anInvoiceWithNoNoteDropsTheCardsRuleWithIt() throws Exception { + // The rule exists to separate the fields from the note; with no note it + // would close the card on nothing. + StructuredInvoiceData base = WorkspaceInvoiceFixtures.canonicalInvoice(); + InvoicePaymentBlock quiet = new InvoicePaymentBlock( + base.payment().heading(), base.payment().fields(), "", + base.payment().dueNotice(), base.payment().dueNoticeEmphasis(), "", ""); + StructuredInvoiceData bare = new StructuredInvoiceData(base.brand(), base.supplier(), + base.masthead(), base.billTo(), base.shipTo(), base.summary(), + base.serviceLines(), base.totals(), quiet, base.notes(), base.currencyCode()); + + assertThat(textOf(render(bare))) + .doesNotContain("Please include the invoice number"); + } + + @Test + void anEmptyDocumentStillRenders() throws Exception { + // Every block absent: the preset draws its furniture and nothing else, + // rather than failing on the first missing field. + render(new StructuredInvoiceData(new InvoiceBrand(null, "", "", ""), null, null, + null, null, new InvoiceSummaryBlock("", "", ""), + new InvoiceServiceLines(null, List.of()), null, + new InvoicePaymentBlock("", List.of(), "", "", "", "", ""), + new InvoiceNotesBlock("", List.of(), "", ""), "")); + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoiceVisualParityTest.java b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoiceVisualParityTest.java new file mode 100644 index 000000000..0a72411b1 --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoiceVisualParityTest.java @@ -0,0 +1,41 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.GraphCompose; +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.testing.visual.PdfVisualRegression; +import org.junit.jupiter.api.Test; + +import java.nio.file.Path; + +/** + * Pixel-diff visual parity gate for {@link WorkspaceInvoice} — the canonical + * one-page invoice against a checked-in baseline. + * + *

Re-blessing baselines — after a deliberate visual change, + * re-run with {@code -Dgraphcompose.visual.approve=true} and commit the updated + * PNG with the change.

+ */ +class WorkspaceInvoiceVisualParityTest { + + private static final Path BASELINE_ROOT = Path.of( + "src", "test", "resources", "visual-baselines", "invoice-v2-layered"); + + private static final long PIXEL_DIFF_BUDGET = 50_000L; + private static final int PER_PIXEL_TOLERANCE = 8; + + @Test + void rendersWithinPixelDiffBudget() throws Exception { + byte[] pdfBytes; + try (DocumentSession document = GraphCompose.document().create()) { + WorkspaceInvoice.create().compose(document, + WorkspaceInvoiceFixtures.canonicalInvoice()); + pdfBytes = document.toPdfBytes(); + } + + PdfVisualRegression.standard() + .baselineRoot(BASELINE_ROOT) + .perPixelTolerance(PER_PIXEL_TOLERANCE) + .mismatchedPixelBudget(PIXEL_DIFF_BUDGET) + .assertMatchesBaseline("workspace_invoice", pdfBytes); + } +} diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/workspace_invoice_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/workspace_invoice_layout.json new file mode 100644 index 000000000..eec8955b4 --- /dev/null +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/workspace_invoice_layout.json @@ -0,0 +1,6197 @@ +{ + "formatVersion" : "2.0", + "canvas" : { + "pageWidth" : 595.276, + "pageHeight" : 841.89, + "innerWidth" : 543.365, + "innerHeight" : 800.136, + "margin" : { + "top" : 25.955, + "right" : 26.519, + "bottom" : 15.799, + "left" : 25.391 + } + }, + "totalPages" : 1, + "nodes" : [ { + "path" : "WorkspaceInvoice[0]", + "entityName" : "WorkspaceInvoice", + "entityKind" : "ContainerNode", + "parentPath" : null, + "childIndex" : 0, + "depth" : 1, + "layer" : 1, + "computedX" : 25.391, + "computedY" : 18.885, + "placementX" : 25.391, + "placementY" : 18.885, + "placementWidth" : 543.365, + "placementHeight" : 797.05, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 543.365, + "contentHeight" : 797.05, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/Masthead[0]", + "entityName" : "Masthead", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]", + "childIndex" : 0, + "depth" : 2, + "layer" : 2, + "computedX" : 25.391, + "computedY" : 776.74, + "placementX" : 25.391, + "placementY" : 776.74, + "placementWidth" : 543.365, + "placementHeight" : 39.195, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 543.365, + "contentHeight" : 39.195, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/Masthead[0]/BrandLockup[0]", + "entityName" : "BrandLockup", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/Masthead[0]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 25.391, + "computedY" : 792.782, + "placementX" : 25.391, + "placementY" : 792.782, + "placementWidth" : 58.595, + "placementHeight" : 23.152, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 58.595, + "contentHeight" : 23.152, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/Masthead[0]/BrandLockup[0]/BrandWordmark[0]", + "entityName" : "BrandWordmark", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/Masthead[0]/BrandLockup[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 25.391, + "computedY" : 792.782, + "placementX" : 25.391, + "placementY" : 792.782, + "placementWidth" : 58.595, + "placementHeight" : 23.152, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 58.595, + "contentHeight" : 23.152, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/Masthead[0]/InvoiceTitle[1]", + "entityName" : "InvoiceTitle", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/Masthead[0]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 145.01, + "computedY" : 776.74, + "placementX" : 145.01, + "placementY" : 776.74, + "placementWidth" : 423.746, + "placementHeight" : 39.195, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 423.746, + "contentHeight" : 39.195, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : -4.119, + "right" : 7.335, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/Masthead[0]/InvoiceTitle[1]/InvoiceTitleText[0]", + "entityName" : "InvoiceTitleText", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/Masthead[0]/InvoiceTitle[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 145.01, + "computedY" : 776.74, + "placementX" : 145.01, + "placementY" : 776.74, + "placementWidth" : 416.411, + "placementHeight" : 43.314, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 416.411, + "contentHeight" : 43.314, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/BrandAccentRule[1]", + "entityName" : "BrandAccentRule", + "entityKind" : "LineNode", + "parentPath" : "WorkspaceInvoice[0]", + "childIndex" : 1, + "depth" : 2, + "layer" : 2, + "computedX" : 25.391, + "computedY" : 763.46, + "placementX" : 25.391, + "placementY" : 763.46, + "placementWidth" : 23.134, + "placementHeight" : 2.257, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 23.134, + "contentHeight" : 2.257, + "margin" : { + "top" : 11.023, + "right" : 0.0, + "bottom" : 8.592, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]", + "entityName" : "IssuerMetaRow", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]", + "childIndex" : 2, + "depth" : 2, + "layer" : 2, + "computedX" : 25.391, + "computedY" : 641.4, + "placementX" : 25.391, + "placementY" : 641.4, + "placementWidth" : 543.365, + "placementHeight" : 113.468, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 543.365, + "contentHeight" : 113.468, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]", + "entityName" : "IssuerAddress", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 25.391, + "computedY" : 662.841, + "placementX" : 25.391, + "placementY" : 662.841, + "placementWidth" : 271.683, + "placementHeight" : 92.027, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 271.683, + "contentHeight" : 92.027, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 6.771, + "right" : 0.0, + "bottom" : 0.0, + "left" : 1.128 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]/IssuerName[0]", + "entityName" : "IssuerName", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 26.519, + "computedY" : 734.805, + "placementX" : 26.519, + "placementY" : 734.805, + "placementWidth" : 127.608, + "placementHeight" : 13.291, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 127.608, + "contentHeight" : 13.291, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]/IssuerAddressLines[1]", + "entityName" : "IssuerAddressLines", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 26.519, + "computedY" : 684.282, + "placementX" : 26.519, + "placementY" : 684.282, + "placementWidth" : 122.916, + "placementHeight" : 42.373, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 122.916, + "contentHeight" : 42.373, + "margin" : { + "top" : 8.15, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]/IssuerAddressLines[1]/IssuerAddressLine1[0]", + "entityName" : "IssuerAddressLine1", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]/IssuerAddressLines[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 26.519, + "computedY" : 715.316, + "placementX" : 26.519, + "placementY" : 715.316, + "placementWidth" : 122.916, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 122.916, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]/IssuerAddressLines[1]/IssuerAddressLine2[1]", + "entityName" : "IssuerAddressLine2", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]/IssuerAddressLines[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 26.519, + "computedY" : 699.799, + "placementX" : 26.519, + "placementY" : 699.799, + "placementWidth" : 104.129, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 104.129, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]/IssuerAddressLines[1]/IssuerAddressLine3[2]", + "entityName" : "IssuerAddressLine3", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]/IssuerAddressLines[1]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 26.519, + "computedY" : 684.282, + "placementX" : 26.519, + "placementY" : 684.282, + "placementWidth" : 56.284, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 56.284, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]/IssuerTaxLineLayer[2]", + "entityName" : "IssuerTaxLineLayer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 26.519, + "computedY" : 662.841, + "placementX" : 26.519, + "placementY" : 662.841, + "placementWidth" : 270.554, + "placementHeight" : 21.441, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 270.554, + "contentHeight" : 21.441, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]/IssuerTaxLineLayer[2]/IssuerTaxLineHolder[0]", + "entityName" : "IssuerTaxLineHolder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]/IssuerTaxLineLayer[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 26.519, + "computedY" : 662.841, + "placementX" : 26.519, + "placementY" : 662.841, + "placementWidth" : 270.554, + "placementHeight" : 21.441, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 270.554, + "contentHeight" : 21.441, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]/IssuerTaxLineLayer[2]/IssuerTaxLineHolder[0]/IssuerTaxLine[0]", + "entityName" : "IssuerTaxLine", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]/IssuerTaxLineLayer[2]/IssuerTaxLineHolder[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 26.519, + "computedY" : 662.841, + "placementX" : 26.519, + "placementY" : 662.841, + "placementWidth" : 270.554, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 270.554, + "contentHeight" : 11.34, + "margin" : { + "top" : 10.101, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]/IssuerTaxLineLayer[2]/IssuerTaxLineHolder[0]/IssuerTaxLine[0]/IssuerTaxLabel[0]", + "entityName" : "IssuerTaxLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]/IssuerTaxLineLayer[2]/IssuerTaxLineHolder[0]/IssuerTaxLine[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 26.519, + "computedY" : 662.841, + "placementX" : 26.519, + "placementY" : 662.841, + "placementWidth" : 32.999, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 32.999, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]/IssuerTaxLineLayer[2]/IssuerTaxLineHolder[0]/IssuerTaxLine[0]/IssuerTaxValue[1]", + "entityName" : "IssuerTaxValue", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/IssuerAddress[0]/IssuerTaxLineLayer[2]/IssuerTaxLineHolder[0]/IssuerTaxLine[0]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 62.067, + "computedY" : 662.841, + "placementX" : 62.067, + "placementY" : 662.841, + "placementWidth" : 67.35, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 67.35, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]", + "entityName" : "InvoiceMeta", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 297.074, + "computedY" : 641.4, + "placementX" : 297.074, + "placementY" : 641.4, + "placementWidth" : 271.683, + "placementHeight" : 113.468, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 271.683, + "contentHeight" : 113.468, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 45.139 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]", + "entityName" : "InvoiceMetaRows", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 342.213, + "computedY" : 641.4, + "placementX" : 342.213, + "placementY" : 641.4, + "placementWidth" : 226.543, + "placementHeight" : 113.468, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 226.543, + "contentHeight" : 113.468, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow1Layer[0]", + "entityName" : "MetaRow1Layer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 342.213, + "computedY" : 743.528, + "placementX" : 342.213, + "placementY" : 743.528, + "placementWidth" : 226.543, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 226.543, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow1Layer[0]/MetaRow1Holder[0]", + "entityName" : "MetaRow1Holder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow1Layer[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 342.213, + "computedY" : 743.528, + "placementX" : 342.213, + "placementY" : 743.528, + "placementWidth" : 226.543, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 226.543, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow1Layer[0]/MetaRow1Holder[0]/MetaRow1[0]", + "entityName" : "MetaRow1", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow1Layer[0]/MetaRow1Holder[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 342.213, + "computedY" : 743.528, + "placementX" : 342.213, + "placementY" : 743.528, + "placementWidth" : 226.543, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 226.543, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow1Layer[0]/MetaRow1Holder[0]/MetaRow1[0]/MetaRow1Label[0]", + "entityName" : "MetaRow1Label", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow1Layer[0]/MetaRow1Holder[0]/MetaRow1[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 342.213, + "computedY" : 744.0, + "placementX" : 342.213, + "placementY" : 744.0, + "placementWidth" : 65.839, + "placementHeight" : 10.867, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 65.839, + "contentHeight" : 10.867, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow1Layer[0]/MetaRow1Holder[0]/MetaRow1[0]/MetaRow1Value[1]", + "entityName" : "MetaRow1Value", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow1Layer[0]/MetaRow1Holder[0]/MetaRow1[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 443.777, + "computedY" : 743.528, + "placementX" : 443.777, + "placementY" : 743.528, + "placementWidth" : 84.001, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 84.001, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow2Layer[1]", + "entityName" : "MetaRow2Layer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 342.213, + "computedY" : 723.102, + "placementX" : 342.213, + "placementY" : 723.102, + "placementWidth" : 226.543, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 226.543, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow2Layer[1]/MetaRow2Holder[0]", + "entityName" : "MetaRow2Holder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow2Layer[1]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 342.213, + "computedY" : 723.102, + "placementX" : 342.213, + "placementY" : 723.102, + "placementWidth" : 226.543, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 226.543, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow2Layer[1]/MetaRow2Holder[0]/MetaRow2[0]", + "entityName" : "MetaRow2", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow2Layer[1]/MetaRow2Holder[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 342.213, + "computedY" : 723.102, + "placementX" : 342.213, + "placementY" : 723.102, + "placementWidth" : 226.543, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 226.543, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow2Layer[1]/MetaRow2Holder[0]/MetaRow2[0]/MetaRow2Label[0]", + "entityName" : "MetaRow2Label", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow2Layer[1]/MetaRow2Holder[0]/MetaRow2[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 342.213, + "computedY" : 723.575, + "placementX" : 342.213, + "placementY" : 723.575, + "placementWidth" : 52.689, + "placementHeight" : 10.867, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 52.689, + "contentHeight" : 10.867, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow2Layer[1]/MetaRow2Holder[0]/MetaRow2[0]/MetaRow2Value[1]", + "entityName" : "MetaRow2Value", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow2Layer[1]/MetaRow2Holder[0]/MetaRow2[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 443.777, + "computedY" : 723.102, + "placementX" : 443.777, + "placementY" : 723.102, + "placementWidth" : 56.076, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 56.076, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow3Layer[2]", + "entityName" : "MetaRow3Layer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 342.213, + "computedY" : 702.677, + "placementX" : 342.213, + "placementY" : 702.677, + "placementWidth" : 226.543, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 226.543, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow3Layer[2]/MetaRow3Holder[0]", + "entityName" : "MetaRow3Holder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow3Layer[2]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 342.213, + "computedY" : 702.677, + "placementX" : 342.213, + "placementY" : 702.677, + "placementWidth" : 226.543, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 226.543, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow3Layer[2]/MetaRow3Holder[0]/MetaRow3[0]", + "entityName" : "MetaRow3", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow3Layer[2]/MetaRow3Holder[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 342.213, + "computedY" : 702.677, + "placementX" : 342.213, + "placementY" : 702.677, + "placementWidth" : 226.543, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 226.543, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow3Layer[2]/MetaRow3Holder[0]/MetaRow3[0]/MetaRow3Label[0]", + "entityName" : "MetaRow3Label", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow3Layer[2]/MetaRow3Holder[0]/MetaRow3[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 342.213, + "computedY" : 703.149, + "placementX" : 342.213, + "placementY" : 703.149, + "placementWidth" : 54.727, + "placementHeight" : 10.867, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 54.727, + "contentHeight" : 10.867, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow3Layer[2]/MetaRow3Holder[0]/MetaRow3[0]/MetaRow3Value[1]", + "entityName" : "MetaRow3Value", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow3Layer[2]/MetaRow3Holder[0]/MetaRow3[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 443.777, + "computedY" : 702.677, + "placementX" : 443.777, + "placementY" : 702.677, + "placementWidth" : 69.911, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 69.911, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow4Layer[3]", + "entityName" : "MetaRow4Layer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]", + "childIndex" : 3, + "depth" : 5, + "layer" : 5, + "computedX" : 342.213, + "computedY" : 682.251, + "placementX" : 342.213, + "placementY" : 682.251, + "placementWidth" : 226.543, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 226.543, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow4Layer[3]/MetaRow4Holder[0]", + "entityName" : "MetaRow4Holder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow4Layer[3]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 342.213, + "computedY" : 682.251, + "placementX" : 342.213, + "placementY" : 682.251, + "placementWidth" : 226.543, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 226.543, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow4Layer[3]/MetaRow4Holder[0]/MetaRow4[0]", + "entityName" : "MetaRow4", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow4Layer[3]/MetaRow4Holder[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 342.213, + "computedY" : 682.251, + "placementX" : 342.213, + "placementY" : 682.251, + "placementWidth" : 226.543, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 226.543, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow4Layer[3]/MetaRow4Holder[0]/MetaRow4[0]/MetaRow4Label[0]", + "entityName" : "MetaRow4Label", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow4Layer[3]/MetaRow4Holder[0]/MetaRow4[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 342.213, + "computedY" : 682.724, + "placementX" : 342.213, + "placementY" : 682.724, + "placementWidth" : 59.038, + "placementHeight" : 10.867, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 59.038, + "contentHeight" : 10.867, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow4Layer[3]/MetaRow4Holder[0]/MetaRow4[0]/MetaRow4Value[1]", + "entityName" : "MetaRow4Value", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow4Layer[3]/MetaRow4Holder[0]/MetaRow4[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 443.777, + "computedY" : 682.251, + "placementX" : 443.777, + "placementY" : 682.251, + "placementWidth" : 54.063, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 54.063, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow5Layer[4]", + "entityName" : "MetaRow5Layer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]", + "childIndex" : 4, + "depth" : 5, + "layer" : 5, + "computedX" : 342.213, + "computedY" : 661.825, + "placementX" : 342.213, + "placementY" : 661.825, + "placementWidth" : 226.543, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 226.543, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow5Layer[4]/MetaRow5Holder[0]", + "entityName" : "MetaRow5Holder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow5Layer[4]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 342.213, + "computedY" : 661.825, + "placementX" : 342.213, + "placementY" : 661.825, + "placementWidth" : 226.543, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 226.543, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow5Layer[4]/MetaRow5Holder[0]/MetaRow5[0]", + "entityName" : "MetaRow5", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow5Layer[4]/MetaRow5Holder[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 342.213, + "computedY" : 661.825, + "placementX" : 342.213, + "placementY" : 661.825, + "placementWidth" : 226.543, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 226.543, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow5Layer[4]/MetaRow5Holder[0]/MetaRow5[0]/MetaRow5Label[0]", + "entityName" : "MetaRow5Label", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow5Layer[4]/MetaRow5Holder[0]/MetaRow5[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 342.213, + "computedY" : 662.298, + "placementX" : 342.213, + "placementY" : 662.298, + "placementWidth" : 64.544, + "placementHeight" : 10.867, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 64.544, + "contentHeight" : 10.867, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow5Layer[4]/MetaRow5Holder[0]/MetaRow5[0]/MetaRow5Value[1]", + "entityName" : "MetaRow5Value", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow5Layer[4]/MetaRow5Holder[0]/MetaRow5[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 443.777, + "computedY" : 661.825, + "placementX" : 443.777, + "placementY" : 661.825, + "placementWidth" : 28.983, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 28.983, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow6Layer[5]", + "entityName" : "MetaRow6Layer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]", + "childIndex" : 5, + "depth" : 5, + "layer" : 5, + "computedX" : 342.213, + "computedY" : 641.4, + "placementX" : 342.213, + "placementY" : 641.4, + "placementWidth" : 226.543, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 226.543, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow6Layer[5]/MetaRow6Holder[0]", + "entityName" : "MetaRow6Holder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow6Layer[5]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 342.213, + "computedY" : 641.4, + "placementX" : 342.213, + "placementY" : 641.4, + "placementWidth" : 226.543, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 226.543, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow6Layer[5]/MetaRow6Holder[0]/MetaRow6[0]", + "entityName" : "MetaRow6", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow6Layer[5]/MetaRow6Holder[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 342.213, + "computedY" : 641.4, + "placementX" : 342.213, + "placementY" : 641.4, + "placementWidth" : 226.543, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 226.543, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow6Layer[5]/MetaRow6Holder[0]/MetaRow6[0]/MetaRow6Label[0]", + "entityName" : "MetaRow6Label", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow6Layer[5]/MetaRow6Holder[0]/MetaRow6[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 342.213, + "computedY" : 641.872, + "placementX" : 342.213, + "placementY" : 641.872, + "placementWidth" : 40.735, + "placementHeight" : 10.867, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 40.735, + "contentHeight" : 10.867, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow6Layer[5]/MetaRow6Holder[0]/MetaRow6[0]/MetaRow6Value[1]", + "entityName" : "MetaRow6Value", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/IssuerMetaRow[2]/InvoiceMeta[1]/InvoiceMetaRows[0]/MetaRow6Layer[5]/MetaRow6Holder[0]/MetaRow6[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 443.777, + "computedY" : 641.4, + "placementX" : 443.777, + "placementY" : 641.4, + "placementWidth" : 57.257, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 57.257, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRule[3]", + "entityName" : "PartiesRule", + "entityKind" : "LineNode", + "parentPath" : "WorkspaceInvoice[0]", + "childIndex" : 3, + "depth" : 2, + "layer" : 2, + "computedX" : 25.391, + "computedY" : 626.667, + "placementX" : 25.391, + "placementY" : 626.667, + "placementWidth" : 543.365, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 543.365, + "contentHeight" : 1.0, + "margin" : { + "top" : 13.733, + "right" : 0.0, + "bottom" : 13.542, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]", + "entityName" : "PartiesRow", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]", + "childIndex" : 4, + "depth" : 2, + "layer" : 2, + "computedX" : 25.391, + "computedY" : 499.093, + "placementX" : 25.391, + "placementY" : 499.093, + "placementWidth" : 543.365, + "placementHeight" : 114.032, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 543.365, + "contentHeight" : 114.032, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]", + "entityName" : "Party1", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 25.391, + "computedY" : 499.093, + "placementX" : 25.391, + "placementY" : 499.093, + "placementWidth" : 271.683, + "placementHeight" : 114.032, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 271.683, + "contentHeight" : 114.032, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyHeadLayer[0]", + "entityName" : "PartyHeadLayer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 25.391, + "computedY" : 589.427, + "placementX" : 25.391, + "placementY" : 589.427, + "placementWidth" : 271.683, + "placementHeight" : 23.698, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 271.683, + "contentHeight" : 23.698, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyHeadLayer[0]/PartyHeadHolder[0]", + "entityName" : "PartyHeadHolder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyHeadLayer[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 25.391, + "computedY" : 589.427, + "placementX" : 25.391, + "placementY" : 589.427, + "placementWidth" : 271.683, + "placementHeight" : 23.698, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 271.683, + "contentHeight" : 23.698, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]", + "entityName" : "PartyHead", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyHeadLayer[0]/PartyHeadHolder[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 25.391, + "computedY" : 589.427, + "placementX" : 25.391, + "placementY" : 589.427, + "placementWidth" : 271.683, + "placementHeight" : 23.698, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 271.683, + "contentHeight" : 23.698, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]", + "entityName" : "PartyDisc", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 25.391, + "computedY" : 589.427, + "placementX" : 25.391, + "placementY" : 589.427, + "placementWidth" : 23.698, + "placementHeight" : 23.698, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 23.698, + "contentHeight" : 23.698, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]/Discbill-to[0]", + "entityName" : "Discbill-to", + "entityKind" : "ShapeContainerNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 25.391, + "computedY" : 589.427, + "placementX" : 25.391, + "placementY" : 589.427, + "placementWidth" : 23.698, + "placementHeight" : 23.698, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 23.698, + "contentHeight" : 23.698, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]/Discbill-to[0]/Glyphbill-to[0]", + "entityName" : "Glyphbill-to", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]/Discbill-to[0]", + "childIndex" : 0, + "depth" : 9, + "layer" : 9, + "computedX" : 25.391, + "computedY" : 595.634, + "placementX" : 25.391, + "placementY" : 595.634, + "placementWidth" : 23.698, + "placementHeight" : 11.285, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 23.698, + "contentHeight" : 11.285, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]/Discbill-to[0]/Glyphbill-to[0]/Align[0]", + "entityName" : null, + "entityKind" : "Align", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]/Discbill-to[0]/Glyphbill-to[0]", + "childIndex" : 0, + "depth" : 10, + "layer" : 10, + "computedX" : 25.391, + "computedY" : 595.634, + "placementX" : 25.391, + "placementY" : 595.634, + "placementWidth" : 23.698, + "placementHeight" : 11.285, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 23.698, + "contentHeight" : 11.285, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]/Discbill-to[0]/Glyphbill-to[0]/Align[0]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]/Discbill-to[0]/Glyphbill-to[0]/Align[0]", + "childIndex" : 0, + "depth" : 11, + "layer" : 11, + "computedX" : 31.598, + "computedY" : 595.634, + "placementX" : 31.598, + "placementY" : 595.634, + "placementWidth" : 11.285, + "placementHeight" : 11.285, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 11.285, + "contentHeight" : 11.285, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]/Discbill-to[0]/Glyphbill-to[0]/Align[0]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]/Discbill-to[0]/Glyphbill-to[0]/Align[0]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 12, + "layer" : 12, + "computedX" : 31.598, + "computedY" : 595.634, + "placementX" : 31.598, + "placementY" : 595.634, + "placementWidth" : 11.285, + "placementHeight" : 11.285, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 11.285, + "contentHeight" : 11.285, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyLabel[1]", + "entityName" : "PartyLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 59.245, + "computedY" : 599.492, + "placementX" : 59.245, + "placementY" : 599.492, + "placementWidth" : 34.464, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 34.464, + "contentHeight" : 11.34, + "margin" : { + "top" : 2.293, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]", + "entityName" : "PartyBody", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 25.391, + "computedY" : 499.093, + "placementX" : 25.391, + "placementY" : 499.093, + "placementWidth" : 271.683, + "placementHeight" : 90.334, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 271.683, + "contentHeight" : 90.334, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 33.855 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]/PartyName[0]", + "entityName" : "PartyName", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 59.245, + "computedY" : 575.007, + "placementX" : 59.245, + "placementY" : 575.007, + "placementWidth" : 87.579, + "placementHeight" : 13.291, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 87.579, + "contentHeight" : 13.291, + "margin" : { + "top" : 1.128, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]/PartyAddressLines[1]", + "entityName" : "PartyAddressLines", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 59.245, + "computedY" : 525.613, + "placementX" : 59.245, + "placementY" : 525.613, + "placementWidth" : 86.108, + "placementHeight" : 42.938, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 86.108, + "contentHeight" : 42.938, + "margin" : { + "top" : 6.457, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]/PartyAddressLines[1]/PartyAddressLine1[0]", + "entityName" : "PartyAddressLine1", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]/PartyAddressLines[1]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 59.245, + "computedY" : 557.21, + "placementX" : 59.245, + "placementY" : 557.21, + "placementWidth" : 59.856, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 59.856, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]/PartyAddressLines[1]/PartyAddressLine2[1]", + "entityName" : "PartyAddressLine2", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]/PartyAddressLines[1]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 59.245, + "computedY" : 541.412, + "placementX" : 59.245, + "placementY" : 541.412, + "placementWidth" : 86.108, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 86.108, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]/PartyAddressLines[1]/PartyAddressLine3[2]", + "entityName" : "PartyAddressLine3", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]/PartyAddressLines[1]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 59.245, + "computedY" : 525.613, + "placementX" : 59.245, + "placementY" : 525.613, + "placementWidth" : 67.737, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 67.737, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]/PartyTaxLineLayer[2]", + "entityName" : "PartyTaxLineLayer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 59.245, + "computedY" : 499.093, + "placementX" : 59.245, + "placementY" : 499.093, + "placementWidth" : 237.828, + "placementHeight" : 26.519, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 237.828, + "contentHeight" : 26.519, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]/PartyTaxLineLayer[2]/PartyTaxLineHolder[0]", + "entityName" : "PartyTaxLineHolder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]/PartyTaxLineLayer[2]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 59.245, + "computedY" : 499.093, + "placementX" : 59.245, + "placementY" : 499.093, + "placementWidth" : 237.828, + "placementHeight" : 26.519, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 237.828, + "contentHeight" : 26.519, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]/PartyTaxLineLayer[2]/PartyTaxLineHolder[0]/PartyTaxLine[0]", + "entityName" : "PartyTaxLine", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]/PartyTaxLineLayer[2]/PartyTaxLineHolder[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 59.245, + "computedY" : 499.093, + "placementX" : 59.245, + "placementY" : 499.093, + "placementWidth" : 237.828, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 237.828, + "contentHeight" : 11.34, + "margin" : { + "top" : 15.179, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]/PartyTaxLineLayer[2]/PartyTaxLineHolder[0]/PartyTaxLine[0]/PartyTaxLabel[0]", + "entityName" : "PartyTaxLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]/PartyTaxLineLayer[2]/PartyTaxLineHolder[0]/PartyTaxLine[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 59.245, + "computedY" : 499.093, + "placementX" : 59.245, + "placementY" : 499.093, + "placementWidth" : 32.999, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 32.999, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]/PartyTaxLineLayer[2]/PartyTaxLineHolder[0]/PartyTaxLine[0]/PartyTaxValue[1]", + "entityName" : "PartyTaxValue", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party1[0]/PartyBody[1]/PartyTaxLineLayer[2]/PartyTaxLineHolder[0]/PartyTaxLine[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 103.821, + "computedY" : 499.093, + "placementX" : 103.821, + "placementY" : 499.093, + "placementWidth" : 69.609, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 69.609, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]", + "entityName" : "Party2", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 297.074, + "computedY" : 525.613, + "placementX" : 297.074, + "placementY" : 525.613, + "placementWidth" : 271.683, + "placementHeight" : 87.513, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 271.683, + "contentHeight" : 87.513, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 15.799 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyHeadLayer[0]", + "entityName" : "PartyHeadLayer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 312.872, + "computedY" : 589.427, + "placementX" : 312.872, + "placementY" : 589.427, + "placementWidth" : 255.884, + "placementHeight" : 23.698, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 255.884, + "contentHeight" : 23.698, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyHeadLayer[0]/PartyHeadHolder[0]", + "entityName" : "PartyHeadHolder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyHeadLayer[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 312.872, + "computedY" : 589.427, + "placementX" : 312.872, + "placementY" : 589.427, + "placementWidth" : 255.884, + "placementHeight" : 23.698, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 255.884, + "contentHeight" : 23.698, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]", + "entityName" : "PartyHead", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyHeadLayer[0]/PartyHeadHolder[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 312.872, + "computedY" : 589.427, + "placementX" : 312.872, + "placementY" : 589.427, + "placementWidth" : 255.884, + "placementHeight" : 23.698, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 255.884, + "contentHeight" : 23.698, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]", + "entityName" : "PartyDisc", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 312.872, + "computedY" : 589.427, + "placementX" : 312.872, + "placementY" : 589.427, + "placementWidth" : 23.698, + "placementHeight" : 23.698, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 23.698, + "contentHeight" : 23.698, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]/Discship-to[0]", + "entityName" : "Discship-to", + "entityKind" : "ShapeContainerNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 312.872, + "computedY" : 589.427, + "placementX" : 312.872, + "placementY" : 589.427, + "placementWidth" : 23.698, + "placementHeight" : 23.698, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 23.698, + "contentHeight" : 23.698, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]/Discship-to[0]/Glyphship-to[0]", + "entityName" : "Glyphship-to", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]/Discship-to[0]", + "childIndex" : 0, + "depth" : 9, + "layer" : 9, + "computedX" : 312.872, + "computedY" : 595.634, + "placementX" : 312.872, + "placementY" : 595.634, + "placementWidth" : 23.698, + "placementHeight" : 11.285, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 23.698, + "contentHeight" : 11.285, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]/Discship-to[0]/Glyphship-to[0]/Align[0]", + "entityName" : null, + "entityKind" : "Align", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]/Discship-to[0]/Glyphship-to[0]", + "childIndex" : 0, + "depth" : 10, + "layer" : 10, + "computedX" : 312.872, + "computedY" : 595.634, + "placementX" : 312.872, + "placementY" : 595.634, + "placementWidth" : 23.698, + "placementHeight" : 11.285, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 23.698, + "contentHeight" : 11.285, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]/Discship-to[0]/Glyphship-to[0]/Align[0]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]/Discship-to[0]/Glyphship-to[0]/Align[0]", + "childIndex" : 0, + "depth" : 11, + "layer" : 11, + "computedX" : 319.079, + "computedY" : 595.634, + "placementX" : 319.079, + "placementY" : 595.634, + "placementWidth" : 11.285, + "placementHeight" : 11.285, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 11.285, + "contentHeight" : 11.285, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]/Discship-to[0]/Glyphship-to[0]/Align[0]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyDisc[0]/Discship-to[0]/Glyphship-to[0]/Align[0]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 12, + "layer" : 12, + "computedX" : 319.079, + "computedY" : 595.634, + "placementX" : 319.079, + "placementY" : 595.634, + "placementWidth" : 11.285, + "placementHeight" : 11.285, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 11.285, + "contentHeight" : 11.285, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]/PartyLabel[1]", + "entityName" : "PartyLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyHeadLayer[0]/PartyHeadHolder[0]/PartyHead[0]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 346.727, + "computedY" : 599.492, + "placementX" : 346.727, + "placementY" : 599.492, + "placementWidth" : 36.732, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 36.732, + "contentHeight" : 11.34, + "margin" : { + "top" : 2.293, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyBody[1]", + "entityName" : "PartyBody", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 312.872, + "computedY" : 525.613, + "placementX" : 312.872, + "placementY" : 525.613, + "placementWidth" : 123.384, + "placementHeight" : 63.815, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 123.384, + "contentHeight" : 63.815, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 33.855 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyBody[1]/PartyName[0]", + "entityName" : "PartyName", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyBody[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 346.727, + "computedY" : 575.007, + "placementX" : 346.727, + "placementY" : 575.007, + "placementWidth" : 87.579, + "placementHeight" : 13.291, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 87.579, + "contentHeight" : 13.291, + "margin" : { + "top" : 1.128, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyBody[1]/PartyAddressLines[1]", + "entityName" : "PartyAddressLines", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyBody[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 346.727, + "computedY" : 525.613, + "placementX" : 346.727, + "placementY" : 525.613, + "placementWidth" : 89.529, + "placementHeight" : 42.938, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 89.529, + "contentHeight" : 42.938, + "margin" : { + "top" : 6.457, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyBody[1]/PartyAddressLines[1]/PartyAddressLine1[0]", + "entityName" : "PartyAddressLine1", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyBody[1]/PartyAddressLines[1]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 346.727, + "computedY" : 557.21, + "placementX" : 346.727, + "placementY" : 557.21, + "placementWidth" : 89.529, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 89.529, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyBody[1]/PartyAddressLines[1]/PartyAddressLine2[1]", + "entityName" : "PartyAddressLine2", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyBody[1]/PartyAddressLines[1]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 346.727, + "computedY" : 541.412, + "placementX" : 346.727, + "placementY" : 541.412, + "placementWidth" : 62.086, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 62.086, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyBody[1]/PartyAddressLines[1]/PartyAddressLine3[2]", + "entityName" : "PartyAddressLine3", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/PartiesRow[4]/Party2[1]/PartyBody[1]/PartyAddressLines[1]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 346.727, + "computedY" : 525.613, + "placementX" : 346.727, + "placementY" : 525.613, + "placementWidth" : 67.737, + "placementHeight" : 11.34, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 67.737, + "contentHeight" : 11.34, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/LineItemsBox[5]", + "entityName" : "LineItemsBox", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]", + "childIndex" : 5, + "depth" : 2, + "layer" : 2, + "computedX" : 25.391, + "computedY" : 279.879, + "placementX" : 25.391, + "placementY" : 279.879, + "placementWidth" : 543.365, + "placementHeight" : 196.171, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 543.365, + "contentHeight" : 196.171, + "margin" : { + "top" : 23.043, + "right" : 0.0, + "bottom" : 15.235, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/LineItemsBox[5]/LineItems[0]", + "entityName" : "LineItems", + "entityKind" : "TableNode", + "parentPath" : "WorkspaceInvoice[0]/LineItemsBox[5]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 25.391, + "computedY" : 279.879, + "placementX" : 25.391, + "placementY" : 279.879, + "placementWidth" : 543.365, + "placementHeight" : 196.171, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 543.365, + "contentHeight" : 196.171, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]", + "entityName" : "SettlementRow", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]", + "childIndex" : 6, + "depth" : 2, + "layer" : 2, + "computedX" : 25.391, + "computedY" : 87.384, + "placementX" : 25.391, + "placementY" : 87.384, + "placementWidth" : 543.365, + "placementHeight" : 177.261, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 543.365, + "contentHeight" : 177.261, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]", + "entityName" : "PaymentDetails", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 25.391, + "computedY" : 87.384, + "placementX" : 25.391, + "placementY" : 87.384, + "placementWidth" : 236.982, + "placementHeight" : 177.261, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 236.982, + "contentHeight" : 177.261, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 9.592, + "right" : 13.542, + "bottom" : 12.413, + "left" : 13.542 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardHeadLayer[0]", + "entityName" : "CardHeadLayer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 38.933, + "computedY" : 239.818, + "placementX" : 38.933, + "placementY" : 239.818, + "placementWidth" : 209.898, + "placementHeight" : 15.235, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 15.235, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardHeadLayer[0]/CardHeadHolder[0]", + "entityName" : "CardHeadHolder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardHeadLayer[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 38.933, + "computedY" : 239.818, + "placementX" : 38.933, + "placementY" : 239.818, + "placementWidth" : 209.898, + "placementHeight" : 15.235, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 15.235, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardHeadLayer[0]/CardHeadHolder[0]/CardHead[0]", + "entityName" : "CardHead", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardHeadLayer[0]/CardHeadHolder[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 38.933, + "computedY" : 239.818, + "placementX" : 38.933, + "placementY" : 239.818, + "placementWidth" : 209.898, + "placementHeight" : 15.235, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 15.235, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardHeadLayer[0]/CardHeadHolder[0]/CardHead[0]/CardIcon[0]", + "entityName" : "CardIcon", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardHeadLayer[0]/CardHeadHolder[0]/CardHead[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 38.933, + "computedY" : 239.818, + "placementX" : 38.933, + "placementY" : 239.818, + "placementWidth" : 15.235, + "placementHeight" : 15.235, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 15.235, + "contentHeight" : 15.235, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardHeadLayer[0]/CardHeadHolder[0]/CardHead[0]/CardIcon[0]/Glyphbank[0]", + "entityName" : "Glyphbank", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardHeadLayer[0]/CardHeadHolder[0]/CardHead[0]/CardIcon[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 38.933, + "computedY" : 239.818, + "placementX" : 38.933, + "placementY" : 239.818, + "placementWidth" : 15.235, + "placementHeight" : 15.235, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 15.235, + "contentHeight" : 15.235, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardHeadLayer[0]/CardHeadHolder[0]/CardHead[0]/CardIcon[0]/Glyphbank[0]/Align[0]", + "entityName" : null, + "entityKind" : "Align", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardHeadLayer[0]/CardHeadHolder[0]/CardHead[0]/CardIcon[0]/Glyphbank[0]", + "childIndex" : 0, + "depth" : 9, + "layer" : 9, + "computedX" : 38.933, + "computedY" : 239.818, + "placementX" : 38.933, + "placementY" : 239.818, + "placementWidth" : 15.235, + "placementHeight" : 15.235, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 15.235, + "contentHeight" : 15.235, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardHeadLayer[0]/CardHeadHolder[0]/CardHead[0]/CardIcon[0]/Glyphbank[0]/Align[0]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardHeadLayer[0]/CardHeadHolder[0]/CardHead[0]/CardIcon[0]/Glyphbank[0]/Align[0]", + "childIndex" : 0, + "depth" : 10, + "layer" : 10, + "computedX" : 38.933, + "computedY" : 239.818, + "placementX" : 38.933, + "placementY" : 239.818, + "placementWidth" : 15.235, + "placementHeight" : 15.235, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 15.235, + "contentHeight" : 15.235, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardHeadLayer[0]/CardHeadHolder[0]/CardHead[0]/CardIcon[0]/Glyphbank[0]/Align[0]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardHeadLayer[0]/CardHeadHolder[0]/CardHead[0]/CardIcon[0]/Glyphbank[0]/Align[0]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 11, + "layer" : 11, + "computedX" : 38.933, + "computedY" : 239.818, + "placementX" : 38.933, + "placementY" : 239.818, + "placementWidth" : 15.235, + "placementHeight" : 15.235, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 15.235, + "contentHeight" : 15.235, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardHeadLayer[0]/CardHeadHolder[0]/CardHead[0]/CardLabel[1]", + "entityName" : "CardLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardHeadLayer[0]/CardHeadHolder[0]/CardHead[0]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 66.016, + "computedY" : 241.195, + "placementX" : 66.016, + "placementY" : 241.195, + "placementWidth" : 77.407, + "placementHeight" : 10.215, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 77.407, + "contentHeight" : 10.215, + "margin" : { + "top" : 3.642, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]", + "entityName" : "CardFields", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 38.933, + "computedY" : 135.216, + "placementX" : 38.933, + "placementY" : 135.216, + "placementWidth" : 209.898, + "placementHeight" : 98.396, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 98.396, + "margin" : { + "top" : 6.207, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField1Layer[0]", + "entityName" : "CardField1Layer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 38.933, + "computedY" : 223.689, + "placementX" : 38.933, + "placementY" : 223.689, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField1Layer[0]/CardField1Holder[0]", + "entityName" : "CardField1Holder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField1Layer[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 38.933, + "computedY" : 223.689, + "placementX" : 38.933, + "placementY" : 223.689, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField1Layer[0]/CardField1Holder[0]/CardField1[0]", + "entityName" : "CardField1", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField1Layer[0]/CardField1Holder[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 38.933, + "computedY" : 223.689, + "placementX" : 38.933, + "placementY" : 223.689, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField1Layer[0]/CardField1Holder[0]/CardField1[0]/CardField1Label[0]", + "entityName" : "CardField1Label", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField1Layer[0]/CardField1Holder[0]/CardField1[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 38.933, + "computedY" : 223.689, + "placementX" : 38.933, + "placementY" : 223.689, + "placementWidth" : 44.056, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 44.056, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField1Layer[0]/CardField1Holder[0]/CardField1[0]/CardField1Value[1]", + "entityName" : "CardField1Value", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField1Layer[0]/CardField1Holder[0]/CardField1[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 130.34, + "computedY" : 223.689, + "placementX" : 130.34, + "placementY" : 223.689, + "placementWidth" : 78.032, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 78.032, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField2Layer[1]", + "entityName" : "CardField2Layer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 38.933, + "computedY" : 211.05, + "placementX" : 38.933, + "placementY" : 211.05, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField2Layer[1]/CardField2Holder[0]", + "entityName" : "CardField2Holder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField2Layer[1]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 38.933, + "computedY" : 211.05, + "placementX" : 38.933, + "placementY" : 211.05, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField2Layer[1]/CardField2Holder[0]/CardField2[0]", + "entityName" : "CardField2", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField2Layer[1]/CardField2Holder[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 38.933, + "computedY" : 211.05, + "placementX" : 38.933, + "placementY" : 211.05, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField2Layer[1]/CardField2Holder[0]/CardField2[0]/CardField2Label[0]", + "entityName" : "CardField2Label", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField2Layer[1]/CardField2Holder[0]/CardField2[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 38.933, + "computedY" : 211.05, + "placementX" : 38.933, + "placementY" : 211.05, + "placementWidth" : 56.169, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 56.169, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField2Layer[1]/CardField2Holder[0]/CardField2[0]/CardField2Value[1]", + "entityName" : "CardField2Value", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField2Layer[1]/CardField2Holder[0]/CardField2[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 130.34, + "computedY" : 211.05, + "placementX" : 130.34, + "placementY" : 211.05, + "placementWidth" : 93.585, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 93.585, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField3Layer[2]", + "entityName" : "CardField3Layer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]", + "childIndex" : 2, + "depth" : 5, + "layer" : 5, + "computedX" : 38.933, + "computedY" : 198.411, + "placementX" : 38.933, + "placementY" : 198.411, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField3Layer[2]/CardField3Holder[0]", + "entityName" : "CardField3Holder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField3Layer[2]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 38.933, + "computedY" : 198.411, + "placementX" : 38.933, + "placementY" : 198.411, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField3Layer[2]/CardField3Holder[0]/CardField3[0]", + "entityName" : "CardField3", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField3Layer[2]/CardField3Holder[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 38.933, + "computedY" : 198.411, + "placementX" : 38.933, + "placementY" : 198.411, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField3Layer[2]/CardField3Holder[0]/CardField3[0]/CardField3Label[0]", + "entityName" : "CardField3Label", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField3Layer[2]/CardField3Holder[0]/CardField3[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 38.933, + "computedY" : 198.411, + "placementX" : 38.933, + "placementY" : 198.411, + "placementWidth" : 64.314, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 64.314, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField3Layer[2]/CardField3Holder[0]/CardField3[0]/CardField3Value[1]", + "entityName" : "CardField3Value", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField3Layer[2]/CardField3Holder[0]/CardField3[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 130.34, + "computedY" : 198.411, + "placementX" : 130.34, + "placementY" : 198.411, + "placementWidth" : 71.938, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 71.938, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField4Layer[3]", + "entityName" : "CardField4Layer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]", + "childIndex" : 3, + "depth" : 5, + "layer" : 5, + "computedX" : 38.933, + "computedY" : 185.772, + "placementX" : 38.933, + "placementY" : 185.772, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField4Layer[3]/CardField4Holder[0]", + "entityName" : "CardField4Holder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField4Layer[3]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 38.933, + "computedY" : 185.772, + "placementX" : 38.933, + "placementY" : 185.772, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField4Layer[3]/CardField4Holder[0]/CardField4[0]", + "entityName" : "CardField4", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField4Layer[3]/CardField4Holder[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 38.933, + "computedY" : 185.772, + "placementX" : 38.933, + "placementY" : 185.772, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField4Layer[3]/CardField4Holder[0]/CardField4[0]/CardField4Label[0]", + "entityName" : "CardField4Label", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField4Layer[3]/CardField4Holder[0]/CardField4[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 38.933, + "computedY" : 185.772, + "placementX" : 38.933, + "placementY" : 185.772, + "placementWidth" : 53.499, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 53.499, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField4Layer[3]/CardField4Holder[0]/CardField4[0]/CardField4Value[1]", + "entityName" : "CardField4Value", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField4Layer[3]/CardField4Holder[0]/CardField4[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 130.34, + "computedY" : 185.772, + "placementX" : 130.34, + "placementY" : 185.772, + "placementWidth" : 43.163, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 43.163, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField5Layer[4]", + "entityName" : "CardField5Layer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]", + "childIndex" : 4, + "depth" : 5, + "layer" : 5, + "computedX" : 38.933, + "computedY" : 173.133, + "placementX" : 38.933, + "placementY" : 173.133, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField5Layer[4]/CardField5Holder[0]", + "entityName" : "CardField5Holder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField5Layer[4]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 38.933, + "computedY" : 173.133, + "placementX" : 38.933, + "placementY" : 173.133, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField5Layer[4]/CardField5Holder[0]/CardField5[0]", + "entityName" : "CardField5", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField5Layer[4]/CardField5Holder[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 38.933, + "computedY" : 173.133, + "placementX" : 38.933, + "placementY" : 173.133, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField5Layer[4]/CardField5Holder[0]/CardField5[0]/CardField5Label[0]", + "entityName" : "CardField5Label", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField5Layer[4]/CardField5Holder[0]/CardField5[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 38.933, + "computedY" : 173.133, + "placementX" : 38.933, + "placementY" : 173.133, + "placementWidth" : 48.165, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 48.165, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField5Layer[4]/CardField5Holder[0]/CardField5[0]/CardField5Value[1]", + "entityName" : "CardField5Value", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField5Layer[4]/CardField5Holder[0]/CardField5[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 130.34, + "computedY" : 173.133, + "placementX" : 130.34, + "placementY" : 173.133, + "placementWidth" : 42.361, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 42.361, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField6Layer[5]", + "entityName" : "CardField6Layer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]", + "childIndex" : 5, + "depth" : 5, + "layer" : 5, + "computedX" : 38.933, + "computedY" : 160.494, + "placementX" : 38.933, + "placementY" : 160.494, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField6Layer[5]/CardField6Holder[0]", + "entityName" : "CardField6Holder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField6Layer[5]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 38.933, + "computedY" : 160.494, + "placementX" : 38.933, + "placementY" : 160.494, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField6Layer[5]/CardField6Holder[0]/CardField6[0]", + "entityName" : "CardField6", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField6Layer[5]/CardField6Holder[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 38.933, + "computedY" : 160.494, + "placementX" : 38.933, + "placementY" : 160.494, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField6Layer[5]/CardField6Holder[0]/CardField6[0]/CardField6Label[0]", + "entityName" : "CardField6Label", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField6Layer[5]/CardField6Holder[0]/CardField6[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 38.933, + "computedY" : 160.494, + "placementX" : 38.933, + "placementY" : 160.494, + "placementWidth" : 35.423, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 35.423, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField6Layer[5]/CardField6Holder[0]/CardField6[0]/CardField6Value[1]", + "entityName" : "CardField6Value", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField6Layer[5]/CardField6Holder[0]/CardField6[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 130.34, + "computedY" : 160.494, + "placementX" : 130.34, + "placementY" : 160.494, + "placementWidth" : 16.868, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 16.868, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField7Layer[6]", + "entityName" : "CardField7Layer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]", + "childIndex" : 6, + "depth" : 5, + "layer" : 5, + "computedX" : 38.933, + "computedY" : 147.855, + "placementX" : 38.933, + "placementY" : 147.855, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField7Layer[6]/CardField7Holder[0]", + "entityName" : "CardField7Holder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField7Layer[6]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 38.933, + "computedY" : 147.855, + "placementX" : 38.933, + "placementY" : 147.855, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField7Layer[6]/CardField7Holder[0]/CardField7[0]", + "entityName" : "CardField7", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField7Layer[6]/CardField7Holder[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 38.933, + "computedY" : 147.855, + "placementX" : 38.933, + "placementY" : 147.855, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField7Layer[6]/CardField7Holder[0]/CardField7[0]/CardField7Label[0]", + "entityName" : "CardField7Label", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField7Layer[6]/CardField7Holder[0]/CardField7[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 38.933, + "computedY" : 147.855, + "placementX" : 38.933, + "placementY" : 147.855, + "placementWidth" : 39.194, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 39.194, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField7Layer[6]/CardField7Holder[0]/CardField7[0]/CardField7Value[1]", + "entityName" : "CardField7Value", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField7Layer[6]/CardField7Holder[0]/CardField7[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 130.34, + "computedY" : 147.855, + "placementX" : 130.34, + "placementY" : 147.855, + "placementWidth" : 73.137, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 73.137, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField8Layer[7]", + "entityName" : "CardField8Layer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]", + "childIndex" : 7, + "depth" : 5, + "layer" : 5, + "computedX" : 38.933, + "computedY" : 135.216, + "placementX" : 38.933, + "placementY" : 135.216, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField8Layer[7]/CardField8Holder[0]", + "entityName" : "CardField8Holder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField8Layer[7]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 38.933, + "computedY" : 135.216, + "placementX" : 38.933, + "placementY" : 135.216, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField8Layer[7]/CardField8Holder[0]/CardField8[0]", + "entityName" : "CardField8", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField8Layer[7]/CardField8Holder[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 38.933, + "computedY" : 135.216, + "placementX" : 38.933, + "placementY" : 135.216, + "placementWidth" : 209.898, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField8Layer[7]/CardField8Holder[0]/CardField8[0]/CardField8Label[0]", + "entityName" : "CardField8Label", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField8Layer[7]/CardField8Holder[0]/CardField8[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 38.933, + "computedY" : 135.216, + "placementX" : 38.933, + "placementY" : 135.216, + "placementWidth" : 51.853, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 51.853, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField8Layer[7]/CardField8Holder[0]/CardField8[0]/CardField8Value[1]", + "entityName" : "CardField8Value", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardFields[1]/CardField8Layer[7]/CardField8Holder[0]/CardField8[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 130.34, + "computedY" : 135.216, + "placementX" : 130.34, + "placementY" : 135.216, + "placementWidth" : 108.138, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 108.138, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardRule[2]", + "entityName" : "CardRule", + "entityKind" : "LineNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 38.933, + "computedY" : 131.161, + "placementX" : 38.933, + "placementY" : 131.161, + "placementWidth" : 209.898, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 1.0, + "margin" : { + "top" : 3.055, + "right" : 0.0, + "bottom" : 9.028, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardNoteLayer[3]", + "entityName" : "CardNoteLayer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 38.933, + "computedY" : 99.797, + "placementX" : 38.933, + "placementY" : 99.797, + "placementWidth" : 209.898, + "placementHeight" : 22.336, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 22.336, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardNoteLayer[3]/CardNoteHolder[0]", + "entityName" : "CardNoteHolder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardNoteLayer[3]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 38.933, + "computedY" : 99.797, + "placementX" : 38.933, + "placementY" : 99.797, + "placementWidth" : 209.898, + "placementHeight" : 22.336, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 22.336, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardNoteLayer[3]/CardNoteHolder[0]/CardNote[0]", + "entityName" : "CardNote", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardNoteLayer[3]/CardNoteHolder[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 38.933, + "computedY" : 99.797, + "placementX" : 38.933, + "placementY" : 99.797, + "placementWidth" : 209.898, + "placementHeight" : 22.336, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 209.898, + "contentHeight" : 22.336, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardNoteLayer[3]/CardNoteHolder[0]/CardNote[0]/CardNoteIcon[0]", + "entityName" : "CardNoteIcon", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardNoteLayer[3]/CardNoteHolder[0]/CardNote[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 38.933, + "computedY" : 110.848, + "placementX" : 38.933, + "placementY" : 110.848, + "placementWidth" : 16.927, + "placementHeight" : 11.285, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 16.927, + "contentHeight" : 11.285, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardNoteLayer[3]/CardNoteHolder[0]/CardNote[0]/CardNoteIcon[0]/Glyphinfo[0]", + "entityName" : "Glyphinfo", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardNoteLayer[3]/CardNoteHolder[0]/CardNote[0]/CardNoteIcon[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 38.933, + "computedY" : 110.848, + "placementX" : 38.933, + "placementY" : 110.848, + "placementWidth" : 16.927, + "placementHeight" : 11.285, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 16.927, + "contentHeight" : 11.285, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardNoteLayer[3]/CardNoteHolder[0]/CardNote[0]/CardNoteIcon[0]/Glyphinfo[0]/Align[0]", + "entityName" : null, + "entityKind" : "Align", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardNoteLayer[3]/CardNoteHolder[0]/CardNote[0]/CardNoteIcon[0]/Glyphinfo[0]", + "childIndex" : 0, + "depth" : 9, + "layer" : 9, + "computedX" : 38.933, + "computedY" : 110.848, + "placementX" : 38.933, + "placementY" : 110.848, + "placementWidth" : 16.927, + "placementHeight" : 11.285, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 16.927, + "contentHeight" : 11.285, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardNoteLayer[3]/CardNoteHolder[0]/CardNote[0]/CardNoteIcon[0]/Glyphinfo[0]/Align[0]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardNoteLayer[3]/CardNoteHolder[0]/CardNote[0]/CardNoteIcon[0]/Glyphinfo[0]/Align[0]", + "childIndex" : 0, + "depth" : 10, + "layer" : 10, + "computedX" : 38.933, + "computedY" : 110.848, + "placementX" : 38.933, + "placementY" : 110.848, + "placementWidth" : 11.285, + "placementHeight" : 11.285, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 11.285, + "contentHeight" : 11.285, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardNoteLayer[3]/CardNoteHolder[0]/CardNote[0]/CardNoteIcon[0]/Glyphinfo[0]/Align[0]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardNoteLayer[3]/CardNoteHolder[0]/CardNote[0]/CardNoteIcon[0]/Glyphinfo[0]/Align[0]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 11, + "layer" : 11, + "computedX" : 38.933, + "computedY" : 110.848, + "placementX" : 38.933, + "placementY" : 110.848, + "placementWidth" : 11.285, + "placementHeight" : 11.285, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 11.285, + "contentHeight" : 11.285, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardNoteLayer[3]/CardNoteHolder[0]/CardNote[0]/CardNoteText[1]", + "entityName" : "CardNoteText", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/PaymentDetails[0]/CardNoteLayer[3]/CardNoteHolder[0]/CardNote[0]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 55.86, + "computedY" : 99.797, + "placementX" : 55.86, + "placementY" : 99.797, + "placementWidth" : 185.062, + "placementHeight" : 22.336, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 185.062, + "contentHeight" : 22.336, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]", + "entityName" : "Settlement", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 324.439, + "computedY" : 104.36, + "placementX" : 324.439, + "placementY" : 104.36, + "placementWidth" : 244.317, + "placementHeight" : 160.284, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 244.317, + "contentHeight" : 160.284, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 16.363, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]", + "entityName" : "Totals", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 324.439, + "computedY" : 228.217, + "placementX" : 324.439, + "placementY" : 228.217, + "placementWidth" : 227.954, + "placementHeight" : 30.616, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 227.954, + "contentHeight" : 30.616, + "margin" : { + "top" : 5.812, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 5.642, + "bottom" : 0.0, + "left" : 3.385 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]/Total1Layer[0]", + "entityName" : "Total1Layer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 327.825, + "computedY" : 247.966, + "placementX" : 327.825, + "placementY" : 247.966, + "placementWidth" : 218.926, + "placementHeight" : 10.867, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 218.926, + "contentHeight" : 10.867, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]/Total1Layer[0]/Total1Holder[0]", + "entityName" : "Total1Holder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]/Total1Layer[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 327.825, + "computedY" : 247.966, + "placementX" : 327.825, + "placementY" : 247.966, + "placementWidth" : 218.926, + "placementHeight" : 10.867, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 218.926, + "contentHeight" : 10.867, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]/Total1Layer[0]/Total1Holder[0]/Total1[0]", + "entityName" : "Total1", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]/Total1Layer[0]/Total1Holder[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 327.825, + "computedY" : 247.966, + "placementX" : 327.825, + "placementY" : 247.966, + "placementWidth" : 218.926, + "placementHeight" : 10.867, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 218.926, + "contentHeight" : 10.867, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]/Total1Layer[0]/Total1Holder[0]/Total1[0]/Total1Label[0]", + "entityName" : "Total1Label", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]/Total1Layer[0]/Total1Holder[0]/Total1[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 327.825, + "computedY" : 247.966, + "placementX" : 327.825, + "placementY" : 247.966, + "placementWidth" : 33.318, + "placementHeight" : 10.867, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 33.318, + "contentHeight" : 10.867, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]/Total1Layer[0]/Total1Holder[0]/Total1[0]/Total1Value[1]", + "entityName" : "Total1Value", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]/Total1Layer[0]/Total1Holder[0]/Total1[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 437.288, + "computedY" : 247.966, + "placementX" : 437.288, + "placementY" : 247.966, + "placementWidth" : 109.463, + "placementHeight" : 10.867, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 109.463, + "contentHeight" : 10.867, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]/Total2Layer[1]", + "entityName" : "Total2Layer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 327.825, + "computedY" : 228.217, + "placementX" : 327.825, + "placementY" : 228.217, + "placementWidth" : 218.926, + "placementHeight" : 10.867, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 218.926, + "contentHeight" : 10.867, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]/Total2Layer[1]/Total2Holder[0]", + "entityName" : "Total2Holder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]/Total2Layer[1]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 327.825, + "computedY" : 228.217, + "placementX" : 327.825, + "placementY" : 228.217, + "placementWidth" : 218.926, + "placementHeight" : 10.867, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 218.926, + "contentHeight" : 10.867, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]/Total2Layer[1]/Total2Holder[0]/Total2[0]", + "entityName" : "Total2", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]/Total2Layer[1]/Total2Holder[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 327.825, + "computedY" : 228.217, + "placementX" : 327.825, + "placementY" : 228.217, + "placementWidth" : 218.926, + "placementHeight" : 10.867, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 218.926, + "contentHeight" : 10.867, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]/Total2Layer[1]/Total2Holder[0]/Total2[0]/Total2Label[0]", + "entityName" : "Total2Label", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]/Total2Layer[1]/Total2Holder[0]/Total2[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 327.825, + "computedY" : 228.217, + "placementX" : 327.825, + "placementY" : 228.217, + "placementWidth" : 34.033, + "placementHeight" : 10.867, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 34.033, + "contentHeight" : 10.867, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]/Total2Layer[1]/Total2Holder[0]/Total2[0]/Total2Value[1]", + "entityName" : "Total2Value", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/Totals[0]/Total2Layer[1]/Total2Holder[0]/Total2[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 437.288, + "computedY" : 228.217, + "placementX" : 437.288, + "placementY" : 228.217, + "placementWidth" : 109.463, + "placementHeight" : 10.867, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 109.463, + "contentHeight" : 10.867, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/TotalsRule[1]", + "entityName" : "TotalsRule", + "entityKind" : "LineNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 327.825, + "computedY" : 218.336, + "placementX" : 327.825, + "placementY" : 218.336, + "placementWidth" : 224.004, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 224.004, + "contentHeight" : 1.0, + "margin" : { + "top" : 8.881, + "right" : 0.0, + "bottom" : 13.711, + "left" : 3.385 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/TotalDue[2]", + "entityName" : "TotalDue", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 324.439, + "computedY" : 187.143, + "placementX" : 324.439, + "placementY" : 187.143, + "placementWidth" : 227.954, + "placementHeight" : 17.482, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 227.954, + "contentHeight" : 17.482, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 5.642, + "bottom" : 0.0, + "left" : 3.385 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/TotalDue[2]/TotalDueRowLayer[0]", + "entityName" : "TotalDueRowLayer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/TotalDue[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 327.825, + "computedY" : 187.143, + "placementX" : 327.825, + "placementY" : 187.143, + "placementWidth" : 218.926, + "placementHeight" : 17.482, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 218.926, + "contentHeight" : 17.482, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/TotalDue[2]/TotalDueRowLayer[0]/TotalDueRowHolder[0]", + "entityName" : "TotalDueRowHolder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/TotalDue[2]/TotalDueRowLayer[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 327.825, + "computedY" : 187.143, + "placementX" : 327.825, + "placementY" : 187.143, + "placementWidth" : 218.926, + "placementHeight" : 17.482, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 218.926, + "contentHeight" : 17.482, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/TotalDue[2]/TotalDueRowLayer[0]/TotalDueRowHolder[0]/TotalDueRow[0]", + "entityName" : "TotalDueRow", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/TotalDue[2]/TotalDueRowLayer[0]/TotalDueRowHolder[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 327.825, + "computedY" : 187.143, + "placementX" : 327.825, + "placementY" : 187.143, + "placementWidth" : 218.926, + "placementHeight" : 17.482, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 218.926, + "contentHeight" : 17.482, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/TotalDue[2]/TotalDueRowLayer[0]/TotalDueRowHolder[0]/TotalDueRow[0]/TotalDueLabel[0]", + "entityName" : "TotalDueLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/TotalDue[2]/TotalDueRowLayer[0]/TotalDueRowHolder[0]/TotalDueRow[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 327.825, + "computedY" : 189.444, + "placementX" : 327.825, + "placementY" : 189.444, + "placementWidth" : 59.518, + "placementHeight" : 12.88, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 59.518, + "contentHeight" : 12.88, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/TotalDue[2]/TotalDueRowLayer[0]/TotalDueRowHolder[0]/TotalDueRow[0]/TotalDueValue[1]", + "entityName" : "TotalDueValue", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/TotalDue[2]/TotalDueRowLayer[0]/TotalDueRowHolder[0]/TotalDueRow[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 437.288, + "computedY" : 187.143, + "placementX" : 437.288, + "placementY" : 187.143, + "placementWidth" : 109.463, + "placementHeight" : 17.482, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 109.463, + "contentHeight" : 17.482, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]", + "entityName" : "PaymentDuePanel", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 324.439, + "computedY" : 104.36, + "placementX" : 324.439, + "placementY" : 104.36, + "placementWidth" : 227.954, + "placementHeight" : 58.689, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 227.954, + "contentHeight" : 58.689, + "margin" : { + "top" : 24.093, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 14.106, + "right" : 13.542, + "bottom" : 15.799, + "left" : 12.978 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]", + "entityName" : "PaymentDueRowLayer", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 337.417, + "computedY" : 120.159, + "placementX" : 337.417, + "placementY" : 120.159, + "placementWidth" : 201.435, + "placementHeight" : 28.784, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 201.435, + "contentHeight" : 28.784, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]", + "entityName" : "PaymentDueRowHolder", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 337.417, + "computedY" : 120.159, + "placementX" : 337.417, + "placementY" : 120.159, + "placementWidth" : 201.435, + "placementHeight" : 28.784, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 201.435, + "contentHeight" : 28.784, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]/PaymentDueRow[0]", + "entityName" : "PaymentDueRow", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 337.417, + "computedY" : 120.159, + "placementX" : 337.417, + "placementY" : 120.159, + "placementWidth" : 201.435, + "placementHeight" : 28.784, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 201.435, + "contentHeight" : 28.784, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]/PaymentDueRow[0]/DueTile[0]", + "entityName" : "DueTile", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]/PaymentDueRow[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 337.417, + "computedY" : 127.502, + "placementX" : 337.417, + "placementY" : 127.502, + "placementWidth" : 21.441, + "placementHeight" : 21.441, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 21.441, + "contentHeight" : 21.441, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]/PaymentDueRow[0]/DueTile[0]/DueTileShape[0]", + "entityName" : "DueTileShape", + "entityKind" : "ShapeContainerNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]/PaymentDueRow[0]/DueTile[0]", + "childIndex" : 0, + "depth" : 9, + "layer" : 9, + "computedX" : 337.417, + "computedY" : 127.502, + "placementX" : 337.417, + "placementY" : 127.502, + "placementWidth" : 21.441, + "placementHeight" : 21.441, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 21.441, + "contentHeight" : 21.441, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]/PaymentDueRow[0]/DueTile[0]/DueTileShape[0]/Glyphcalendar[0]", + "entityName" : "Glyphcalendar", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]/PaymentDueRow[0]/DueTile[0]/DueTileShape[0]", + "childIndex" : 0, + "depth" : 10, + "layer" : 10, + "computedX" : 337.417, + "computedY" : 132.016, + "placementX" : 337.417, + "placementY" : 132.016, + "placementWidth" : 21.441, + "placementHeight" : 12.413, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 21.441, + "contentHeight" : 12.413, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]/PaymentDueRow[0]/DueTile[0]/DueTileShape[0]/Glyphcalendar[0]/Align[0]", + "entityName" : null, + "entityKind" : "Align", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]/PaymentDueRow[0]/DueTile[0]/DueTileShape[0]/Glyphcalendar[0]", + "childIndex" : 0, + "depth" : 11, + "layer" : 11, + "computedX" : 337.417, + "computedY" : 132.016, + "placementX" : 337.417, + "placementY" : 132.016, + "placementWidth" : 21.441, + "placementHeight" : 12.413, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 21.441, + "contentHeight" : 12.413, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]/PaymentDueRow[0]/DueTile[0]/DueTileShape[0]/Glyphcalendar[0]/Align[0]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]/PaymentDueRow[0]/DueTile[0]/DueTileShape[0]/Glyphcalendar[0]/Align[0]", + "childIndex" : 0, + "depth" : 12, + "layer" : 12, + "computedX" : 341.931, + "computedY" : 132.016, + "placementX" : 341.931, + "placementY" : 132.016, + "placementWidth" : 12.413, + "placementHeight" : 12.413, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 12.413, + "contentHeight" : 12.413, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]/PaymentDueRow[0]/DueTile[0]/DueTileShape[0]/Glyphcalendar[0]/Align[0]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]/PaymentDueRow[0]/DueTile[0]/DueTileShape[0]/Glyphcalendar[0]/Align[0]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 13, + "layer" : 13, + "computedX" : 341.931, + "computedY" : 132.016, + "placementX" : 341.931, + "placementY" : 132.016, + "placementWidth" : 12.413, + "placementHeight" : 12.413, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 12.413, + "contentHeight" : 12.413, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]/PaymentDueRow[0]/DueText[1]", + "entityName" : "DueText", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]/PaymentDueRow[0]", + "childIndex" : 1, + "depth" : 8, + "layer" : 8, + "computedX" : 372.4, + "computedY" : 120.159, + "placementX" : 372.4, + "placementY" : 120.159, + "placementWidth" : 73.945, + "placementHeight" : 27.964, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 73.945, + "contentHeight" : 27.964, + "margin" : { + "top" : 0.821, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]/PaymentDueRow[0]/DueText[1]/DueLabel[0]", + "entityName" : "DueLabel", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]/PaymentDueRow[0]/DueText[1]", + "childIndex" : 0, + "depth" : 9, + "layer" : 9, + "computedX" : 372.4, + "computedY" : 137.907, + "placementX" : 372.4, + "placementY" : 137.907, + "placementWidth" : 73.398, + "placementHeight" : 10.215, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 73.398, + "contentHeight" : 10.215, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]/PaymentDueRow[0]/DueText[1]/DueValue[1]", + "entityName" : "DueValue", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/SettlementRow[6]/Settlement[1]/PaymentDuePanel[3]/PaymentDueRowLayer[0]/PaymentDueRowHolder[0]/PaymentDueRow[0]/DueText[1]", + "childIndex" : 1, + "depth" : 9, + "layer" : 9, + "computedX" : 372.4, + "computedY" : 120.159, + "placementX" : 372.4, + "placementY" : 120.159, + "placementWidth" : 73.945, + "placementHeight" : 14.647, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 73.945, + "contentHeight" : 14.647, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/ClosingRule[7]", + "entityName" : "ClosingRule", + "entityKind" : "LineNode", + "parentPath" : "WorkspaceInvoice[0]", + "childIndex" : 7, + "depth" : 2, + "layer" : 2, + "computedX" : 25.391, + "computedY" : 84.465, + "placementX" : 25.391, + "placementY" : 84.465, + "placementWidth" : 543.365, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 543.365, + "contentHeight" : 1.0, + "margin" : { + "top" : 1.918, + "right" : 0.0, + "bottom" : 8.294, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/ThankYou[8]", + "entityName" : "ThankYou", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]", + "childIndex" : 8, + "depth" : 2, + "layer" : 2, + "computedX" : 25.391, + "computedY" : 53.652, + "placementX" : 25.391, + "placementY" : 53.652, + "placementWidth" : 543.365, + "placementHeight" : 22.519, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 543.365, + "contentHeight" : 22.519, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 3.385 + } + }, { + "path" : "WorkspaceInvoice[0]/ThankYou[8]/ThankYouRow[0]", + "entityName" : "ThankYouRow", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]/ThankYou[8]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 28.776, + "computedY" : 53.652, + "placementX" : 28.776, + "placementY" : 53.652, + "placementWidth" : 539.98, + "placementHeight" : 22.519, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 539.98, + "contentHeight" : 22.519, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/ThankYou[8]/ThankYouRow[0]/ThankYouIcon[0]", + "entityName" : "ThankYouIcon", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/ThankYou[8]/ThankYouRow[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 28.776, + "computedY" : 59.244, + "placementX" : 28.776, + "placementY" : 59.244, + "placementWidth" : 25.955, + "placementHeight" : 16.927, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 25.955, + "contentHeight" : 16.927, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/ThankYou[8]/ThankYouRow[0]/ThankYouIcon[0]/Glyphinfo[0]", + "entityName" : "Glyphinfo", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/ThankYou[8]/ThankYouRow[0]/ThankYouIcon[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 28.776, + "computedY" : 59.244, + "placementX" : 28.776, + "placementY" : 59.244, + "placementWidth" : 25.955, + "placementHeight" : 16.927, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 25.955, + "contentHeight" : 16.927, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/ThankYou[8]/ThankYouRow[0]/ThankYouIcon[0]/Glyphinfo[0]/Align[0]", + "entityName" : null, + "entityKind" : "Align", + "parentPath" : "WorkspaceInvoice[0]/ThankYou[8]/ThankYouRow[0]/ThankYouIcon[0]/Glyphinfo[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 28.776, + "computedY" : 59.244, + "placementX" : 28.776, + "placementY" : 59.244, + "placementWidth" : 25.955, + "placementHeight" : 16.927, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 25.955, + "contentHeight" : 16.927, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/ThankYou[8]/ThankYouRow[0]/ThankYouIcon[0]/Glyphinfo[0]/Align[0]/SvgIcon[0]", + "entityName" : "SvgIcon", + "entityKind" : "LayerStackNode", + "parentPath" : "WorkspaceInvoice[0]/ThankYou[8]/ThankYouRow[0]/ThankYouIcon[0]/Glyphinfo[0]/Align[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 28.776, + "computedY" : 59.244, + "placementX" : 28.776, + "placementY" : 59.244, + "placementWidth" : 16.927, + "placementHeight" : 16.927, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 16.927, + "contentHeight" : 16.927, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/ThankYou[8]/ThankYouRow[0]/ThankYouIcon[0]/Glyphinfo[0]/Align[0]/SvgIcon[0]/SvgLayer0[0]", + "entityName" : "SvgLayer0", + "entityKind" : "Path", + "parentPath" : "WorkspaceInvoice[0]/ThankYou[8]/ThankYouRow[0]/ThankYouIcon[0]/Glyphinfo[0]/Align[0]/SvgIcon[0]", + "childIndex" : 0, + "depth" : 8, + "layer" : 8, + "computedX" : 28.776, + "computedY" : 59.244, + "placementX" : 28.776, + "placementY" : 59.244, + "placementWidth" : 16.927, + "placementHeight" : 16.927, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 16.927, + "contentHeight" : 16.927, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/ThankYou[8]/ThankYouRow[0]/ThankYouText[1]", + "entityName" : "ThankYouText", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/ThankYou[8]/ThankYouRow[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 54.732, + "computedY" : 53.652, + "placementX" : 54.732, + "placementY" : 53.652, + "placementWidth" : 389.069, + "placementHeight" : 22.519, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 389.069, + "contentHeight" : 22.519, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/ThankYou[8]/ThankYouRow[0]/ThankYouText[1]/ThankYouTitle[0]", + "entityName" : "ThankYouTitle", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/ThankYou[8]/ThankYouRow[0]/ThankYouText[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 54.732, + "computedY" : 65.303, + "placementX" : 54.732, + "placementY" : 65.303, + "placementWidth" : 113.139, + "placementHeight" : 10.867, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 113.139, + "contentHeight" : 10.867, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/ThankYou[8]/ThankYouRow[0]/ThankYouText[1]/ThankYouBody[1]", + "entityName" : "ThankYouBody", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/ThankYou[8]/ThankYouRow[0]/ThankYouText[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 54.732, + "computedY" : 53.652, + "placementX" : 54.732, + "placementY" : 53.652, + "placementWidth" : 389.069, + "placementHeight" : 8.977, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 389.069, + "contentHeight" : 8.977, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/FooterRule[9]", + "entityName" : "FooterRule", + "entityKind" : "LineNode", + "parentPath" : "WorkspaceInvoice[0]", + "childIndex" : 9, + "depth" : 2, + "layer" : 2, + "computedX" : 25.391, + "computedY" : 44.552, + "placementX" : 25.391, + "placementY" : 44.552, + "placementWidth" : 543.365, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 543.365, + "contentHeight" : 1.0, + "margin" : { + "top" : 8.1, + "right" : 0.0, + "bottom" : 2.514, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/DocumentFooter[10]", + "entityName" : "DocumentFooter", + "entityKind" : "RowNode", + "parentPath" : "WorkspaceInvoice[0]", + "childIndex" : 10, + "depth" : 2, + "layer" : 2, + "computedX" : 25.391, + "computedY" : 18.885, + "placementX" : 25.391, + "placementY" : 18.885, + "placementWidth" : 543.365, + "placementHeight" : 23.152, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 543.365, + "contentHeight" : 23.152, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/DocumentFooter[10]/FooterWordmark[0]", + "entityName" : "FooterWordmark", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/DocumentFooter[10]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 25.391, + "computedY" : 18.885, + "placementX" : 25.391, + "placementY" : 18.885, + "placementWidth" : 58.595, + "placementHeight" : 23.152, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 58.595, + "contentHeight" : 23.152, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/DocumentFooter[10]/FooterAddress[1]", + "entityName" : "FooterAddress", + "entityKind" : "SectionNode", + "parentPath" : "WorkspaceInvoice[0]/DocumentFooter[10]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 106.642, + "computedY" : 19.011, + "placementX" : 106.642, + "placementY" : 19.011, + "placementWidth" : 255.901, + "placementHeight" : 22.9, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 255.901, + "contentHeight" : 22.9, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/DocumentFooter[10]/FooterAddress[1]/FooterName[0]", + "entityName" : "FooterName", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/DocumentFooter[10]/FooterAddress[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 106.642, + "computedY" : 31.989, + "placementX" : 106.642, + "placementY" : 31.989, + "placementWidth" : 95.264, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 95.264, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/DocumentFooter[10]/FooterAddress[1]/FooterAddressLine[1]", + "entityName" : "FooterAddressLine", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/DocumentFooter[10]/FooterAddress[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 106.642, + "computedY" : 19.011, + "placementX" : 106.642, + "placementY" : 19.011, + "placementWidth" : 255.901, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 255.901, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "WorkspaceInvoice[0]/DocumentFooter[10]/FooterSite[2]", + "entityName" : "FooterSite", + "entityKind" : "ParagraphNode", + "parentPath" : "WorkspaceInvoice[0]/DocumentFooter[10]", + "childIndex" : 2, + "depth" : 3, + "layer" : 3, + "computedX" : 484.12, + "computedY" : 25.5, + "placementX" : 484.12, + "placementY" : 25.5, + "placementWidth" : 81.251, + "placementHeight" : 9.922, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 81.251, + "contentHeight" : 9.922, + "margin" : { + "top" : 0.0, + "right" : 1.693, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + } ] +} diff --git a/qa/src/test/resources/visual-baselines/invoice-v2-layered/workspace_invoice-page-0.png b/qa/src/test/resources/visual-baselines/invoice-v2-layered/workspace_invoice-page-0.png new file mode 100644 index 0000000000000000000000000000000000000000..f55e72757621080833dc71ab661db7806f4371e4 GIT binary patch literal 87551 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 k+29dBHbeaXThe band is body content rather than page chrome — it carries a wordmark + * and a reachable address, and a header/footer zone takes only strings. Page + * identity on a continuation page is carried by the page number instead.

+ */ +final class WorkspaceClosing { + + private WorkspaceClosing() { + } + + /** + * Draws the closing blocks. + * + * @param page the page flow + * @param notes the closing words and the address inside them + * @param brand the wordmark the band opens with + * @param supplier who is invoicing, named again under the band + */ + static void render(PageFlowBuilder page, InvoiceNotesBlock notes, InvoiceBrand brand, + InvoiceContactBlock supplier) { + WorkspaceWidgets.fullWidthRule(page, "ClosingRule", HAIRLINE_STRONG, RULE_THIN, + px(12.4) - CLOSING_RULE_LIFT, px(19.2) - CLOSING_INNER_LIFT); + renderThankYou(page, notes); + WorkspaceWidgets.fullWidthRule(page, "FooterRule", HAIRLINE_STRONG, RULE_THIN, + blockGap(22.15, THANKS_BODY_SIZE, 0) - CLOSING_INNER_LIFT, + blockGap(7.9, 0, FOOTER_SIZE)); + renderBand(page, brand, supplier); + } + + /** + * The closing words, opened by a mark in its own column so a wrapped second + * line returns to the text axis rather than to the glyph's. + * + *

The address inside the sentence is a separate run, so it reaches the + * PDF as a real annotation rather than as coloured text.

+ */ + private static void renderThankYou(PageFlowBuilder page, InvoiceNotesBlock notes) { + List paragraphs = notes.paragraphs(); + String title = notes.heading(); + String body = paragraphs.isEmpty() ? "" : paragraphs.get(0); + page.addSection("ThankYou", block -> { + block.spacing(0) + .padding(new DocumentInsets(0, 0, 0, THANKS_INDENT)) + .keepWithNext(); + block.addRow("ThankYouRow", row -> { + row.spacing(0) + .columns(DocumentRowColumn.fixed(THANKS_ICON_COL), + DocumentRowColumn.weight(1)); + row.addSection("ThankYouIcon", glyph -> glyph + .spacing(0) + .add(WorkspaceWidgets.glyph(WorkspaceIcons.INFO, THANKS_ICON, + HorizontalAlign.LEFT))); + row.addSection("ThankYouText", text -> { + text.spacing(gap(24, THANKS_TITLE_SIZE)); + text.addParagraph(p -> p + .name("ThankYouTitle") + .text(title) + .textStyle(style(THANKS_TITLE_SIZE, INK, + DocumentTextDecoration.BOLD))); + text.addParagraph(p -> { + p.name("ThankYouBody"); + DocumentTextStyle plain = style(THANKS_BODY_SIZE, MUTED, + DocumentTextDecoration.DEFAULT); + String email = notes.contactEmail(); + if (email.isBlank() || !body.contains(email)) { + p.inlineText(body, plain); + return; + } + // The address is set apart inside the sentence, so the + // words on either side of it stay one paragraph. + int at = body.indexOf(email); + p.inlineText(body.substring(0, at), plain); + p.inlineText(email, + style(THANKS_BODY_SIZE, ACCENT, DocumentTextDecoration.DEFAULT), + new DocumentLinkOptions("mailto:" + email)); + p.inlineText(body.substring(at + email.length()), plain); + }); + }); + }); + }); + } + + /** The brand band: the wordmark, who is invoicing, and where to find them. */ + private static void renderBand(PageFlowBuilder page, InvoiceBrand brand, + InvoiceContactBlock supplier) { + String website = supplier.website(); + page.addRow("DocumentFooter", row -> { + row.spacing(0) + .verticalAlign(RowVerticalAlign.CENTER) + .columns(DocumentRowColumn.fixed(FOOTER_MARK_COL), + DocumentRowColumn.weight(1), + DocumentRowColumn.fixed(FOOTER_LINK_COL)); + row.addParagraph(p -> p + .name("FooterWordmark") + .text(brand.name()) + .textStyle(style(WORDMARK_SIZE, INK, DocumentTextDecoration.BOLD))); + row.addSection("FooterAddress", text -> { + text.spacing(gap(23, FOOTER_SIZE)); + text.addParagraph(p -> p + .name("FooterName") + .text(supplier.legalName()) + .textStyle(style(FOOTER_SIZE, BODY, DocumentTextDecoration.BOLD))); + text.addParagraph(p -> p + .name("FooterAddressLine") + .text(supplier.addressLines().isEmpty() + ? "" : String.join(", ", supplier.addressLines())) + .textStyle(style(FOOTER_SIZE, MUTED, DocumentTextDecoration.DEFAULT))); + }); + row.addParagraph(p -> { + p.name("FooterSite"); + DocumentTextStyle linkStyle = + style(FOOTER_SIZE, ACCENT, DocumentTextDecoration.DEFAULT); + if (website.isBlank()) { + p.text(""); + } else { + p.inlineText(website, linkStyle, new DocumentLinkOptions(uri(website))); + } + p.align(TextAlign.RIGHT); + p.margin(new DocumentInsets(0, px(3), 0, 0)); + }); + }); + } + + /** A written address as something a reader can follow. */ + private static String uri(String website) { + String trimmed = website.trim(); + return trimmed.startsWith("http://") || trimmed.startsWith("https://") + ? trimmed + : "https://" + trimmed; + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceIcons.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceIcons.java new file mode 100644 index 000000000..da19eb9b0 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceIcons.java @@ -0,0 +1,87 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.svg.SvgIcon; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.Map; + +/** + * Classpath loader for the Workspace invoice marks: the two party glyphs, the + * three a service line may take, and the three the preset places itself — the + * bank on the payment card, the information mark on its note, and the calendar + * on the due panel. + * + *

They ship inside the templates artifact under + * {@code templates/invoice/workspace/icons/} as SVG, so they scale with the box + * they are drawn into rather than being resampled. Parsed icons are cached per + * token, so a sheet that repeats a mark reads each file once per JVM.

+ * + *

The set is coloured, not tinted

+ * + *

Each glyph carries its colour in its own markup: white for the marks that + * are knocked out of a filled disc or tile, accent for the ones that stand on + * the page. A token therefore names a glyph and where it is meant to + * sit.

+ * + *

{@link #LINE_TOKENS} is the vocabulary a document names through + * {@code InvoiceServiceLines.Line.icon()}. It is scoped to this preset — + * another preset packages its own set.

+ */ +final class WorkspaceIcons { + + static final String BILL_TO = "bill-to"; + static final String SHIP_TO = "ship-to"; + static final String BANK = "bank"; + static final String INFO = "info"; + static final String CALENDAR = "calendar"; + + private static final String ICON_ROOT = "/templates/invoice/workspace/icons/"; + + /** The marks a document may name on a service line. */ + static final Set LINE_TOKENS = Set.of("search", "grid", "shield"); + + private static final Set TOKENS = Set.of( + BILL_TO, SHIP_TO, BANK, INFO, CALENDAR, "search", "grid", "shield"); + + private static final Map CACHE = new ConcurrentHashMap<>(); + + private WorkspaceIcons() { + } + + /** + * Reads one mark. + * + * @param token one of the packaged tokens + * @return the parsed icon + * @throws IllegalArgumentException when the token names no packaged mark, + * listing the ones a document may choose — an icon token is data, + * so a wrong one is a data error + */ + static SvgIcon icon(String token) { + if (!TOKENS.contains(token)) { + throw new IllegalArgumentException( + "Unknown workspace invoice icon token '" + token + + "'. This preset packages " + LINE_TOKENS.stream().sorted().toList() + + " for a service line's mark."); + } + return CACHE.computeIfAbsent(token, WorkspaceIcons::read); + } + + private static SvgIcon read(String token) { + String resourcePath = ICON_ROOT + token + ".svg"; + try (InputStream input = WorkspaceIcons.class.getResourceAsStream(resourcePath)) { + if (input == null) { + throw new IllegalStateException("Missing workspace invoice icon: " + resourcePath); + } + return SvgIcon.parse(new String(input.readAllBytes(), StandardCharsets.UTF_8)); + } catch (IOException e) { + throw new UncheckedIOException( + "Failed to read workspace invoice icon: " + resourcePath, e); + } + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoice.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoice.java new file mode 100644 index 000000000..7ffd4d03f --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceInvoice.java @@ -0,0 +1,169 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.api.DocumentSession; +import com.demcha.compose.document.api.PageMarginRule; +import com.demcha.compose.document.output.DocumentHeaderFooter; +import com.demcha.compose.document.output.DocumentHeaderFooterZone; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.templates.api.DocumentTemplate; +import com.demcha.compose.document.templates.data.invoice.StructuredInvoiceData; + +import java.util.List; +import java.util.Objects; + +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.CONTINUATION_MARGIN; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.MUTED; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.PAGE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.PAGE_MARGIN; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.PAGE_NUMBER_BAND; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.PAGE_NUMBER_SIZE; + +/** + * Workspace — a violet-accented SaaS invoice: a brand masthead over an accent + * bar, a half-split issuer and metadata header, two addressed parties on + * discs, a line-item table whose marks sit on coloured tiles, a settlement row + * pairing the bank details against the totals, and a closing band carrying the + * wordmark. + * + *

It flows

+ * + *

The design shows four service lines and real data brings dozens, so the + * table is the region that grows: its header repeats on every page it reaches, + * a continuation page reserves a deeper bottom margin than page one, and every + * page carries its number.

+ * + *

Numbering every page including the first is a departure from the design, + * which is a single sheet and has none. Suppressing page one would match it and + * still make a missing page detectable — a document that opens on "Page 2 of 3" + * is obviously incomplete — but a page without a number cannot be told from a + * page that was lost, so every page carries one.

+ * + *

One column, not five

+ * + *

The table has an outer box and a rule between every row and no interior + * verticals, which is exactly what a single-column table draws: a cell strokes + * all four of its own edges and a one-column table has no interior vertical + * edge. The five columns are a row inside each cell. Built the other way round + * — the box from a stroked section wrapped round the table — every continuation + * page would end in an empty bordered strip, and on page one that strip's + * bottom edge lands on the page number.

+ * + *

The lockup and the wordmark are the caller's

+ * + *

The design opens with a mark and closes with a wordmark. Both come from + * {@code InvoiceBrand}: the masthead draws the logo at the design's measured + * width, or the brand's name when there is no logo, and the closing band always + * sets the name. The templates artifact carries no mark of its own.

+ * + *

What the document says, and what the preset chooses

+ * + *

A service line names its own mark through + * {@code InvoiceServiceLines.Line.icon()}, from this preset's own vocabulary, + * and an unknown token is reported as a data error naming the set. A mark the + * design gives a colour is knocked out of a tile in it; one it does not is drawn + * bare. A line with no token is drawn without a mark. The party discs, the bank + * mark, the information mark and the calendar are the preset's: which glyph + * opens which block is a property of the design rather than of the document.

+ * + *

Figures are written with the locale stated rather than inherited, so the + * same data renders the same sheet on any machine.

+ * + *

Fonts

+ * + *

The sheet is set in Lato throughout, and the face was chosen by + * measurement: its natural widths for eight of the design's strings land within + * 2–5% of the measured ink, where other grotesques are 8–20% out at the same cap + * height. The templates artifact carries no fonts — register the family on the + * session, or the engine substitutes and the measured geometry no longer + * matches the type sitting in it.

+ * + *

Usage:

+ *
{@code
+ * DocumentTemplate template = WorkspaceInvoice.create();
+ * template.compose(session, invoice);
+ * }
+ * + * @since 2.2.3 + */ +public final class WorkspaceInvoice { + + /** Stable identifier of this preset. */ + public static final String ID = "workspace-invoice"; + + /** Human-readable name of this preset. */ + public static final String DISPLAY_NAME = "Workspace Invoice"; + + private WorkspaceInvoice() { + } + + /** + * Creates the template. + * + * @return a template composing a {@link StructuredInvoiceData} + */ + public static DocumentTemplate create() { + return new Template(); + } + + private record Template() implements DocumentTemplate { + + @Override + public String id() { + return ID; + } + + @Override + public String displayName() { + return DISPLAY_NAME; + } + + @Override + public void compose(DocumentSession document, StructuredInvoiceData data) { + Objects.requireNonNull(document, "document"); + Objects.requireNonNull(data, "data"); + + // Every length on the sheet is a share of the design's own grid, so + // the preset sets the page and its margins rather than following + // what the caller configured. + document.pageSize(PAGE); + document.margin(PAGE_MARGIN); + document.pageMargins(List.of(PageMarginRule.from(2, CONTINUATION_MARGIN))); + renderPageNumber(document); + + String currency = data.currencyCode(); + document.pageFlow(page -> { + page.name("WorkspaceInvoice").padding(DocumentInsets.zero()).spacing(0); + WorkspaceMasthead.renderHeader(page, data.brand(), data.supplier(), + data.masthead()); + WorkspaceMasthead.renderParties(page, data.billTo(), data.shipTo()); + WorkspaceLines.render(page, data.serviceLines(), currency); + WorkspaceSettlement.render(page, data.payment(), data.totals(), currency); + WorkspaceClosing.render(page, data.notes(), data.brand(), data.supplier()); + }); + } + + /** + * The only chrome the sheet has. The design's own closing band cannot be + * chrome — a header/footer zone carries left, centre and right strings + * and nothing else, and the band holds a wordmark and a link — so page + * identity is carried by the page number alone. + * + *

The height is stated because a default band is taller than the + * design leaves under its closing block, and a default-height band takes + * that much off the content area and pushes the band onto a second + * page. Sized to the bottom margin it sits inside the margin instead of + * taking content space, and the type is sized to the band rather than + * the other way round.

+ */ + private static void renderPageNumber(DocumentSession document) { + document.footer(DocumentHeaderFooter.builder() + .zone(DocumentHeaderFooterZone.FOOTER) + .centerText("Page {page} of {pages}") + .height((float) PAGE_NUMBER_BAND) + .fontSize((float) PAGE_NUMBER_SIZE) + .textColor(MUTED) + .showSeparator(false) + .build()); + } + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceLines.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceLines.java new file mode 100644 index 000000000..301593ccf --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceLines.java @@ -0,0 +1,200 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.dsl.PageFlowBuilder; +import com.demcha.compose.document.dsl.RowBuilder; +import com.demcha.compose.document.dsl.TableBuilder; +import com.demcha.compose.document.node.DocumentNode; +import com.demcha.compose.document.node.RowVerticalAlign; +import com.demcha.compose.document.node.TextAlign; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentRowColumn; +import com.demcha.compose.document.style.DocumentTextDecoration; +import com.demcha.compose.document.table.DocumentTableCell; +import com.demcha.compose.document.table.DocumentTableColumn; +import com.demcha.compose.document.templates.data.invoice.InvoiceServiceLines; + +import java.util.List; + +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.ACCENT; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.BODY_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.CELL_PAD_L; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.CELL_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.COLUMN_SHARES; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.CONTENT_W; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.HEADER_CELL_STYLE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.HEAD_PAD_L; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.INK; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.ITEM_CELL_STYLE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.ITEM_SUB_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.ITEM_TEXT_GAP; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.ITEM_TILE_D; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.ITEM_TITLE_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.MUTED; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.TABLE_HEAD_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.blockGap; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.gap; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.px; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.style; + +/** + * The service lines. + * + *

One column, not five

+ * + *

The design's table has an outer box and a rule between every row and + * no interior verticals — which is exactly the rule topology a + * single-column table draws, because a cell strokes all four of its own edges + * and a one-column table has no interior vertical edge to draw. The five + * columns are a row inside each cell, laid out on shares of the table's width, + * so they stay aligned down the page without the engine drawing a line between + * them.

+ * + *

Reaching the same topology the other way — unstroked cells, separators as + * full-width rule rows, and the outer box from a stroked section wrapped round + * the table — is wrong on a document that paginates: a section's box fills its + * page fragment rather than hugging its rows, so every continuation page would + * end with an empty bordered strip below its last line, and on page one that + * strip's bottom edge lands on the page number.

+ */ +final class WorkspaceLines { + + private WorkspaceLines() { + } + + /** + * Draws the table. + * + * @param page the page flow + * @param serviceLines the columns and the lines + * @param currencyCode the ISO code the figures are stated in + */ + static void render(PageFlowBuilder page, InvoiceServiceLines serviceLines, + String currencyCode) { + page.addSection("LineItemsBox", box -> { + box.spacing(0) + .padding(DocumentInsets.zero()) + .margin(new DocumentInsets(blockGap(45, BODY_SIZE, 0), 0, px(27), 0)); + box.addTable(table -> { + table.name("LineItems") + .width(CONTENT_W) + .columns(DocumentTableColumn.fixed(CONTENT_W)); + renderHeader(table, serviceLines.columns(), currencyCode); + List lines = serviceLines.lines(); + for (int i = 0; i < lines.size(); i++) { + table.rowCells(DocumentTableCell + .node(renderLine(lines.get(i), i)) + .withStyle(ITEM_CELL_STYLE)); + } + }); + }); + } + + /** + * The header repeats on every page its table reaches. It is one cell like + * every other row, so its own stroke draws the table's top edge and the rule + * under the band — in the accent's border step, which is what the design + * tints the band's edges with. + */ + private static void renderHeader(TableBuilder table, InvoiceServiceLines.Columns columns, + String currencyCode) { + RowBuilder row = new RowBuilder(); + row.name("LineItemsHeader").spacing(0).columns(columnWidths()); + row.addParagraph(p -> p + .name("HeadDescription") + .text(columns.description()) + .textStyle(style(TABLE_HEAD_SIZE, ACCENT, DocumentTextDecoration.BOLD)) + .margin(new DocumentInsets(0, 0, 0, HEAD_PAD_L))); + headCell(row, "HeadPlan", columns.servicePeriod()); + headCell(row, "HeadQuantity", columns.quantity()); + // The currency is named once per money column rather than on every + // figure under it, which is where this design states it. + headCell(row, "HeadUnitPrice", + WorkspaceText.labelWithCurrency(columns.unitPrice(), currencyCode)); + headCell(row, "HeadAmount", + WorkspaceText.labelWithCurrency(columns.amount(), currencyCode)); + table.headerCells(DocumentTableCell.node(row.build()).withStyle(HEADER_CELL_STYLE)) + .repeatHeader(); + } + + private static void headCell(RowBuilder row, String name, String label) { + row.addParagraph(p -> p + .name(name) + .text(label) + .textStyle(style(TABLE_HEAD_SIZE, ACCENT, DocumentTextDecoration.BOLD)) + .align(TextAlign.CENTER)); + } + + /** The five columns, as a row inside the row's single cell. */ + private static DocumentNode renderLine(InvoiceServiceLines.Line line, int index) { + int n = index + 1; + RowBuilder row = new RowBuilder(); + row.name("Item" + n) + .spacing(0) + .verticalAlign(RowVerticalAlign.CENTER) + .columns(columnWidths()); + row.addSection("ItemDescription" + n, cell -> { + cell.spacing(0).padding(new DocumentInsets(0, 0, 0, CELL_PAD_L)); + // Mark and text are a horizontal pair inside a row cell, which the + // layout compiler refuses as a bare row. + WorkspaceWidgets.layeredRow(cell, "ItemBody" + n, body -> { + body.spacing(ITEM_TEXT_GAP) + .verticalAlign(RowVerticalAlign.CENTER) + .columns(DocumentRowColumn.fixed(ITEM_TILE_D), + DocumentRowColumn.weight(1)); + body.addSection("ItemGlyph" + n, glyph -> { + glyph.spacing(0); + if (!line.icon().isBlank()) { + glyph.add(WorkspaceWidgets.tile(line.icon())); + } + }); + body.addSection("ItemText" + n, text -> { + text.spacing(gap(25, ITEM_TITLE_SIZE)); + text.addParagraph(p -> p + .name("ItemTitle" + n) + .text(line.title()) + .textStyle(style(ITEM_TITLE_SIZE, INK, + DocumentTextDecoration.BOLD))); + if (!line.description().isBlank()) { + text.addParagraph(p -> p + .name("ItemSubtitle" + n) + .text(line.description()) + .textStyle(style(ITEM_SUB_SIZE, MUTED, + DocumentTextDecoration.DEFAULT))); + } + }); + }); + }); + valueCell(row, "ItemPlan" + n, line.servicePeriod()); + valueCell(row, "ItemQuantity" + n, + WorkspaceText.quantityWithUnit(line.quantity(), line.unit())); + valueCell(row, "ItemUnitPrice" + n, WorkspaceText.money(line.unitPrice())); + valueCell(row, "ItemAmount" + n, WorkspaceText.money(line.amount())); + return row.build(); + } + + private static void valueCell(RowBuilder row, String name, String value) { + row.addParagraph(p -> p + .name(name) + .text(value) + .textStyle(style(CELL_SIZE, MUTED, DocumentTextDecoration.DEFAULT)) + .align(TextAlign.CENTER)); + } + + /** + * The five column widths as shares of the table's own width. The last takes + * whatever the others leave: five independently rounded shares sum to the + * width plus a half-thousandth of a point, and the engine refuses a row + * narrower than its columns. + */ + private static DocumentRowColumn[] columnWidths() { + DocumentRowColumn[] columns = new DocumentRowColumn[COLUMN_SHARES.length]; + double assigned = 0; + for (int i = 0; i < COLUMN_SHARES.length - 1; i++) { + double width = CONTENT_W * COLUMN_SHARES[i]; + assigned += width; + columns[i] = DocumentRowColumn.fixed(width); + } + columns[COLUMN_SHARES.length - 1] = DocumentRowColumn.fixed(CONTENT_W - assigned); + return columns; + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceMasthead.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceMasthead.java new file mode 100644 index 000000000..e3364d569 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceMasthead.java @@ -0,0 +1,304 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.dsl.ImageBuilder; +import com.demcha.compose.document.dsl.PageFlowBuilder; +import com.demcha.compose.document.dsl.SectionBuilder; +import com.demcha.compose.document.node.RowVerticalAlign; +import com.demcha.compose.document.node.TextAlign; +import com.demcha.compose.document.style.DocumentBorders; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentRowColumn; +import com.demcha.compose.document.style.DocumentStroke; +import com.demcha.compose.document.style.DocumentTextDecoration; +import com.demcha.compose.document.templates.data.invoice.InvoiceBrand; +import com.demcha.compose.document.templates.data.invoice.InvoiceContactBlock; +import com.demcha.compose.document.templates.data.invoice.InvoiceMasthead; +import com.demcha.compose.document.templates.data.invoice.InvoiceRecipient; + +import java.util.ArrayList; +import java.util.List; + +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.ACCENT; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.ACCENT_RULE_T; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.ACCENT_RULE_W; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.BODY_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.DISC_D; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.DISC_GAP; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.HAIRLINE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.HALF; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.INK; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.ISSUER_TAX_LABEL_W; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.LINE_BOX; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.LOCKUP_W; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.META_CELL_INSET; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.META_LABEL_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.META_LABEL_W; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.NAME_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.PARTY_TAX_LABEL_W; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.PARTY_TEXT_INDENT; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.RULE_THIN; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.SECTION_LABEL_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.TITLE_RIGHT_INSET; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.TITLE_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.TITLE_TOP_LIFT; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.WORDMARK_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.blockGap; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.capOffset; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.gap; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.px; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.style; + +/** + * The header and the two addressed parties: the lockup beside the title, the + * accent bar under it, the issuer against the metadata grid, and the bill-to / + * ship-to split. + * + *

Both splits divide the content box in half: measured, their two vertical + * dividers land on the same x. Neither divider is a node — each is the right + * cell's left border, which is why it begins and ends with that cell's + * content rather than running the row's full height.

+ */ +final class WorkspaceMasthead { + + private WorkspaceMasthead() { + } + + /** + * Draws the header, the accent bar, the issuer/metadata row and the rule + * that closes it. + * + * @param page the page flow + * @param brand the lockup + * @param supplier who is invoicing + * @param masthead the title and the metadata rows + */ + static void renderHeader(PageFlowBuilder page, InvoiceBrand brand, + InvoiceContactBlock supplier, InvoiceMasthead masthead) { + renderLockupRow(page, brand, masthead); + renderAccentBar(page); + page.addRow("IssuerMetaRow", row -> { + row.spacing(0).weights(HALF, HALF); + row.addSection("IssuerAddress", cell -> renderIssuer(cell, supplier)); + row.addSection("InvoiceMeta", cell -> { + cell.spacing(0) + .borders(DocumentBorders.left(DocumentStroke.of(HAIRLINE, RULE_THIN))) + .padding(new DocumentInsets(0, 0, 0, META_CELL_INSET)); + renderMeta(cell, masthead.entries()); + }); + }); + WorkspaceWidgets.fullWidthRule(page, "PartiesRule", HAIRLINE, RULE_THIN, + blockGap(28.5, BODY_SIZE, 0), px(24)); + } + + /** + * TOP, not CENTER: the title's line box is taller than the lockup, so + * centring pushes the lockup down the row it is supposed to set the top edge + * of. + * + *

What fills the lockup column comes from the brand — a logo drawn to the + * design's measured width, or the brand's name set as a wordmark. The + * templates artifact carries no mark of its own.

+ */ + private static void renderLockupRow(PageFlowBuilder page, InvoiceBrand brand, + InvoiceMasthead masthead) { + page.addRow("Masthead", row -> { + row.spacing(0) + .verticalAlign(RowVerticalAlign.TOP) + .columns(DocumentRowColumn.fixed(LOCKUP_W), DocumentRowColumn.weight(1)); + row.addSection("BrandLockup", cell -> { + cell.spacing(0); + if (brand.logo() != null) { + cell.add(new ImageBuilder() + .name("BrandLogo") + .source(brand.logo()) + .width(LOCKUP_W) + .build()); + } else if (!brand.name().isBlank()) { + cell.addParagraph(p -> p + .name("BrandWordmark") + .text(brand.name()) + .textStyle(style(WORDMARK_SIZE, INK, DocumentTextDecoration.BOLD))); + } + }); + row.addSection("InvoiceTitle", cell -> cell + .spacing(0) + .padding(new DocumentInsets(-TITLE_TOP_LIFT, TITLE_RIGHT_INSET, 0, 0)) + .addParagraph(p -> p + .name("InvoiceTitleText") + .text(masthead.title()) + .textStyle(style(TITLE_SIZE, INK, DocumentTextDecoration.BOLD)) + .align(TextAlign.RIGHT))); + }); + } + + /** + * The bar is anchored to the content box's left edge, not to the mark above + * it, so its width derives from the page rather than from the asset. Stating + * its own position rather than a gap keeps the two facts separable when + * either changes. + */ + private static void renderAccentBar(PageFlowBuilder page) { + page.addLine(line -> line + .name("BrandAccentRule") + .horizontal(ACCENT_RULE_W) + .thickness(ACCENT_RULE_T) + .color(ACCENT) + .margin(new DocumentInsets( + px(89) - (LINE_BOX * TITLE_SIZE - TITLE_TOP_LIFT), + 0, + blockGap(19, 0, META_LABEL_SIZE), + 0))); + } + + private static void renderIssuer(SectionBuilder cell, InvoiceContactBlock supplier) { + // The two cells of the split do not share a top edge: the metadata block + // starts above the issuer name, and the divider starts with it. + cell.spacing(0).padding(new DocumentInsets(px(12), 0, 0, px(2))); + cell.addParagraph(p -> p + .name("IssuerName") + .text(supplier.legalName()) + .textStyle(style(NAME_SIZE, INK, DocumentTextDecoration.BOLD))); + cell.addSection("IssuerAddressLines", lines -> { + lines.spacing(gap(27.5, BODY_SIZE)) + .margin(new DocumentInsets(gap(38, NAME_SIZE), 0, 0, 0)); + WorkspaceWidgets.textLines(lines, "IssuerAddressLine", supplier.addressLines(), + BODY_SIZE, INK); + }); + renderLabelledRow(cell, "Issuer", supplier.taxRegistrationLabel(), + supplier.taxRegistrationNumber(), ISSUER_TAX_LABEL_W, gap(38, BODY_SIZE)); + } + + private static void renderMeta(SectionBuilder cell, List entries) { + cell.addSection("InvoiceMetaRows", rows -> { + rows.spacing(gap(36.2, BODY_SIZE)); + int index = 0; + for (InvoiceMasthead.Entry entry : entries) { + String name = "MetaRow" + (++index); + WorkspaceWidgets.layeredRow(rows, name, row -> { + row.spacing(0) + .columns(DocumentRowColumn.fixed(META_LABEL_W), + DocumentRowColumn.weight(1)); + row.addParagraph(p -> p + .name(name + "Label") + .text(entry.label()) + .textStyle(style(META_LABEL_SIZE, INK, + DocumentTextDecoration.DEFAULT))); + row.addParagraph(p -> p + .name(name + "Value") + .text(entry.value()) + .textStyle(style(BODY_SIZE, + entry.emphasized() ? ACCENT : INK, + entry.emphasized() + ? DocumentTextDecoration.BOLD + : DocumentTextDecoration.DEFAULT))); + }); + } + }); + } + + /** + * Draws the two addressed parties. + * + * @param page the page flow + * @param billTo who is billed + * @param shipTo where the work went, or a party with no name when absent + */ + static void renderParties(PageFlowBuilder page, InvoiceRecipient billTo, + InvoiceRecipient shipTo) { + List parties = new ArrayList<>(); + parties.add(billTo); + if (!shipTo.name().isBlank()) { + parties.add(shipTo); + } + List tokens = List.of(WorkspaceIcons.BILL_TO, WorkspaceIcons.SHIP_TO); + + page.addRow("PartiesRow", row -> { + row.spacing(0).weights(WorkspaceWidgets.evenWeights(parties.size())); + for (int i = 0; i < parties.size(); i++) { + InvoiceRecipient party = parties.get(i); + String token = tokens.get(Math.min(i, tokens.size() - 1)); + boolean first = i == 0; + row.addSection("Party" + (i + 1), cell -> { + cell.spacing(0); + if (!first) { + // The divider belongs to the split, so it is the cell's + // own left edge rather than a rule drawn between them. + cell.borders(DocumentBorders.left(DocumentStroke.of(HAIRLINE, RULE_THIN))) + .padding(new DocumentInsets(0, 0, 0, px(28))); + } + renderParty(cell, party, token); + }); + } + }); + } + + /** + * One method for both parties: they are the same component with different + * data, down to the registration only one of them usually prints. + */ + private static void renderParty(SectionBuilder cell, InvoiceRecipient party, String token) { + WorkspaceWidgets.layeredRow(cell, "PartyHead", row -> { + row.spacing(DISC_GAP) + .verticalAlign(RowVerticalAlign.TOP) + .columns(DocumentRowColumn.fixed(DISC_D), DocumentRowColumn.weight(1)); + row.addSection("PartyDisc", disc -> disc + .spacing(0) + .add(WorkspaceWidgets.disc(token))); + row.addParagraph(p -> p + .name("PartyLabel") + .text(party.heading()) + .textStyle(style(SECTION_LABEL_SIZE, ACCENT, DocumentTextDecoration.BOLD)) + .margin(new DocumentInsets(capOffset(8, SECTION_LABEL_SIZE), 0, 0, 0))); + }); + cell.addSection("PartyBody", block -> { + block.spacing(0).padding(new DocumentInsets(0, 0, 0, PARTY_TEXT_INDENT)); + block.addParagraph(p -> p + .name("PartyName") + .text(party.name()) + .textStyle(style(NAME_SIZE, INK, DocumentTextDecoration.BOLD)) + .margin(new DocumentInsets(px(2), 0, 0, 0))); + if (!party.subline().isBlank()) { + block.addParagraph(p -> p + .name("PartySubline") + .text(party.subline()) + .textStyle(style(BODY_SIZE, INK, DocumentTextDecoration.DEFAULT)) + .margin(new DocumentInsets(gap(30, NAME_SIZE), 0, 0, 0))); + } + block.addSection("PartyAddressLines", lines -> { + lines.spacing(gap(28, BODY_SIZE)) + .margin(new DocumentInsets( + gap(35, party.subline().isBlank() ? NAME_SIZE : BODY_SIZE), + 0, 0, 0)); + WorkspaceWidgets.textLines(lines, "PartyAddressLine", party.addressLines(), + BODY_SIZE, INK); + }); + renderLabelledRow(block, "Party", party.registrationLabel(), + party.registrationNumber(), PARTY_TAX_LABEL_W, gap(47, BODY_SIZE)); + }); + } + + /** + * A labelled fact under an address — a registration, printed as a label + * column beside its value. Drawn only when there is a value: a label on its + * own is a heading over an absence. + */ + private static void renderLabelledRow(SectionBuilder parent, String prefix, String label, + String value, double labelWidth, double gapAbove) { + if (value == null || value.isBlank()) { + return; + } + WorkspaceWidgets.layeredRow(parent, prefix + "TaxLine", row -> { + row.spacing(0) + .margin(new DocumentInsets(gapAbove, 0, 0, 0)) + .columns(DocumentRowColumn.fixed(labelWidth), DocumentRowColumn.weight(1)); + row.addParagraph(p -> p + .name(prefix + "TaxLabel") + .text(label) + .textStyle(style(BODY_SIZE, INK, DocumentTextDecoration.DEFAULT))); + row.addParagraph(p -> p + .name(prefix + "TaxValue") + .text(value) + .textStyle(style(BODY_SIZE, INK, DocumentTextDecoration.DEFAULT))); + }); + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceSettlement.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceSettlement.java new file mode 100644 index 000000000..1e4a8ed77 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceSettlement.java @@ -0,0 +1,273 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.dsl.PageFlowBuilder; +import com.demcha.compose.document.dsl.SectionBuilder; +import com.demcha.compose.document.dsl.ShapeContainerBuilder; +import com.demcha.compose.document.node.HorizontalAlign; +import com.demcha.compose.document.node.RowVerticalAlign; +import com.demcha.compose.document.node.TextAlign; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentRowColumn; +import com.demcha.compose.document.style.DocumentStroke; +import com.demcha.compose.document.style.DocumentTextDecoration; +import com.demcha.compose.document.templates.data.invoice.InvoicePaymentBlock; +import com.demcha.compose.document.templates.data.invoice.InvoiceTotalsBlock; + +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.ACCENT; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.ACCENT_BORDER; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.ACCENT_SURFACE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.BODY; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.CARD_ICON; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.CARD_ICON_GAP; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.CARD_INNER_W; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.CARD_LABEL_W; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.CARD_PAD; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.CARD_RADIUS; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.CARD_TEXT_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.CARD_TITLE_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.DUE_GLYPH; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.DUE_LABEL_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.DUE_PAD; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.DUE_RADIUS; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.DUE_TILE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.DUE_TILE_GAP; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.DUE_TILE_RADIUS; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.DUE_VALUE_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.HAIRLINE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.HALF; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.INK; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.MUTED; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.NOTE_ICON; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.NOTE_ICON_COL; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.RULE_MED; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.RULE_THIN; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.SETTLEMENT_GUTTER; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.SETTLEMENT_LEFT; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.SETTLEMENT_RIGHT; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.SETTLEMENT_RIGHT_INSET; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.SURFACE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.TOTALS_PAD_L; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.TOTALS_PAD_R; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.TOTALS_RULE_W; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.TOTALS_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.TOTAL_LABEL_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.TOTAL_VALUE_SIZE; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.capOffset; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.gap; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.px; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.style; + +/** + * The settlement row: the payment card against the totals and the panel that + * closes them. + * + *

The split is not the half the two rows above it use — the left cell is + * narrower than the right, with a wide gutter between. That asymmetry is in the + * design.

+ */ +final class WorkspaceSettlement { + + private WorkspaceSettlement() { + } + + /** + * Draws the row. + * + * @param page the page flow + * @param payment the bank details, the note and the due notice + * @param totals the summed rows and the amount due + * @param currencyCode the ISO code the figures are stated in + */ + static void render(PageFlowBuilder page, InvoicePaymentBlock payment, + InvoiceTotalsBlock totals, String currencyCode) { + page.addRow("SettlementRow", row -> { + row.spacing(SETTLEMENT_GUTTER).weights(SETTLEMENT_LEFT, SETTLEMENT_RIGHT); + row.addSection("PaymentDetails", cell -> renderCard(cell, payment)); + row.addSection("Settlement", cell -> { + cell.spacing(0).padding(new DocumentInsets(0, SETTLEMENT_RIGHT_INSET, 0, 0)); + renderTotals(cell, totals, currencyCode); + renderDuePanel(cell, payment); + }); + }); + } + + /** + * An outlined rounded card. Built from a fill, a stroke, a radius and a + * padding rather than a panel helper, which takes one padding value where + * this card's insets are asymmetric. + */ + private static void renderCard(SectionBuilder cell, InvoicePaymentBlock payment) { + cell.spacing(0) + .fillColor(SURFACE) + .stroke(DocumentStroke.of(ACCENT_BORDER, RULE_MED)) + .cornerRadius(CARD_RADIUS) + .padding(CARD_PAD) + .keepTogether(); + + WorkspaceWidgets.layeredRow(cell, "CardHead", row -> { + row.spacing(CARD_ICON_GAP) + .verticalAlign(RowVerticalAlign.TOP) + .columns(DocumentRowColumn.fixed(CARD_ICON), DocumentRowColumn.weight(1)); + row.addSection("CardIcon", glyph -> glyph + .spacing(0) + .add(WorkspaceWidgets.glyph(WorkspaceIcons.BANK, CARD_ICON))); + row.addParagraph(p -> p + .name("CardLabel") + .text(payment.heading()) + .textStyle(style(CARD_TITLE_SIZE, ACCENT, DocumentTextDecoration.BOLD)) + .margin(new DocumentInsets(capOffset(10, CARD_TITLE_SIZE), 0, 0, 0))); + }); + + cell.addSection("CardFields", fields -> { + // The head row is as tall as its glyph, and the first field sits a + // measured distance below the head's top — not below the heading's + // own line box, which is shorter than the glyph. + fields.spacing(gap(22.4, CARD_TEXT_SIZE)) + .margin(new DocumentInsets(px(41 - 27 - 3), 0, 0, 0)); + int index = 0; + for (InvoicePaymentBlock.Field field : payment.fields()) { + String name = "CardField" + (++index); + WorkspaceWidgets.layeredRow(fields, name, row -> { + row.spacing(0) + .columns(DocumentRowColumn.fixed(CARD_LABEL_W), + DocumentRowColumn.weight(1)); + row.addParagraph(p -> p + .name(name + "Label") + .text(field.label()) + .textStyle(style(CARD_TEXT_SIZE, BODY, + DocumentTextDecoration.DEFAULT))); + row.addParagraph(p -> p + .name(name + "Value") + .text(field.value()) + .textStyle(style(CARD_TEXT_SIZE, BODY, + DocumentTextDecoration.DEFAULT))); + }); + } + }); + + if (payment.instruction().isBlank()) { + return; + } + cell.addLine(line -> line + .name("CardRule") + .horizontal(CARD_INNER_W) + .thickness(RULE_THIN) + .color(HAIRLINE) + .margin(new DocumentInsets(gap(23, CARD_TEXT_SIZE), 0, px(16), 0))); + + // Two cells rather than an inline glyph: the design's wrapped second + // line returns to the TEXT axis, not to the glyph's. + WorkspaceWidgets.layeredRow(cell, "CardNote", row -> { + row.spacing(0) + .columns(DocumentRowColumn.fixed(NOTE_ICON_COL), DocumentRowColumn.weight(1)); + row.addSection("CardNoteIcon", glyph -> glyph + .spacing(0) + .add(WorkspaceWidgets.glyph(WorkspaceIcons.INFO, NOTE_ICON, + HorizontalAlign.LEFT))); + row.addParagraph(p -> p + .name("CardNoteText") + .text(payment.instruction()) + .textStyle(style(CARD_TEXT_SIZE, MUTED, DocumentTextDecoration.DEFAULT)) + .lineSpacing(gap(22, CARD_TEXT_SIZE))); + }); + } + + private static void renderTotals(SectionBuilder cell, InvoiceTotalsBlock totals, + String currencyCode) { + cell.addSection("Totals", block -> { + block.spacing(gap(35, TOTALS_SIZE)) + .padding(new DocumentInsets(0, TOTALS_PAD_R, 0, TOTALS_PAD_L)) + .margin(new DocumentInsets(px(10.3), 0, 0, 0)) + .keepTogether(); + int index = 0; + for (InvoiceTotalsBlock.Row entry : totals.rows()) { + String name = "Total" + (++index); + WorkspaceWidgets.layeredRow(block, name, row -> { + row.spacing(0).weights(HALF, HALF); + row.addParagraph(p -> p + .name(name + "Label") + .text(entry.label()) + .textStyle(style(TOTALS_SIZE, INK, DocumentTextDecoration.DEFAULT))); + row.addParagraph(p -> p + .name(name + "Value") + .text(WorkspaceText.money(entry.amount())) + .textStyle(style(TOTALS_SIZE, INK, DocumentTextDecoration.DEFAULT)) + .align(TextAlign.RIGHT)); + }); + } + }); + + // Accent-coloured, not a grey hairline: a colour scan across it returns + // a clear violet hue. + cell.addLine(line -> line + .name("TotalsRule") + .horizontal(TOTALS_RULE_W) + .thickness(RULE_MED) + .color(ACCENT) + .margin(new DocumentInsets(gap(35, TOTALS_SIZE), 0, px(24.3), TOTALS_PAD_L))); + + cell.addSection("TotalDue", block -> { + block.spacing(0) + .padding(new DocumentInsets(0, TOTALS_PAD_R, 0, TOTALS_PAD_L)) + .keepTogether(); + WorkspaceWidgets.layeredRow(block, "TotalDueRow", row -> { + row.spacing(0).verticalAlign(RowVerticalAlign.CENTER).weights(HALF, HALF); + row.addParagraph(p -> p + .name("TotalDueLabel") + .text(totals.totalLabel()) + .textStyle(style(TOTAL_LABEL_SIZE, INK, DocumentTextDecoration.BOLD))); + row.addParagraph(p -> p + .name("TotalDueValue") + .text(WorkspaceText.coded(currencyCode, totals.totalAmount())) + .textStyle(style(TOTAL_VALUE_SIZE, ACCENT, DocumentTextDecoration.BOLD)) + .align(TextAlign.RIGHT)); + }); + }); + } + + /** + * The calendar tile has to be a shape: a bare glyph on the panel would lose + * the white square the design draws behind it, which is the only thing + * separating the glyph from the panel's tint. + */ + private static void renderDuePanel(SectionBuilder cell, InvoicePaymentBlock payment) { + if (payment.dueNotice().isBlank() && payment.dueNoticeEmphasis().isBlank()) { + return; + } + cell.addSection("PaymentDuePanel", panel -> { + panel.spacing(0) + .fillColor(ACCENT_SURFACE) + .stroke(DocumentStroke.of(ACCENT_BORDER, RULE_MED)) + .cornerRadius(DUE_RADIUS) + .padding(DUE_PAD) + .margin(new DocumentInsets(px(42.7), 0, 0, 0)) + .keepTogether(); + WorkspaceWidgets.layeredRow(panel, "PaymentDueRow", row -> { + row.spacing(DUE_TILE_GAP) + .verticalAlign(RowVerticalAlign.TOP) + .columns(DocumentRowColumn.fixed(DUE_TILE), DocumentRowColumn.weight(1)); + row.addSection("DueTile", tile -> tile + .spacing(0) + .add(new ShapeContainerBuilder() + .name("DueTileShape") + .roundedRect(DUE_TILE, DUE_TILE, DUE_TILE_RADIUS) + .fillColor(SURFACE) + .center(WorkspaceWidgets.glyph(WorkspaceIcons.CALENDAR, DUE_GLYPH)) + .build())); + row.addSection("DueText", text -> { + text.spacing(gap(23.6, DUE_LABEL_SIZE)) + .margin(new DocumentInsets(capOffset(5, DUE_LABEL_SIZE), 0, 0, 0)); + text.addParagraph(p -> p + .name("DueLabel") + .text(payment.dueNotice()) + .textStyle(style(DUE_LABEL_SIZE, INK, + DocumentTextDecoration.DEFAULT))); + text.addParagraph(p -> p + .name("DueValue") + .text(payment.dueNoticeEmphasis()) + .textStyle(style(DUE_VALUE_SIZE, INK, DocumentTextDecoration.BOLD))); + }); + }); + }); + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceStyles.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceStyles.java new file mode 100644 index 000000000..e0ccf1fa5 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceStyles.java @@ -0,0 +1,344 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.api.DocumentPageSize; +import com.demcha.compose.document.style.DocumentColor; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentStroke; +import com.demcha.compose.document.style.DocumentTextDecoration; +import com.demcha.compose.document.style.DocumentTextStyle; +import com.demcha.compose.document.table.DocumentTableStyle; +import com.demcha.compose.document.table.DocumentTableTextAnchor; +import com.demcha.compose.font.FontName; + +import java.util.Map; + +/** + * Design tokens for {@link WorkspaceInvoice} — the palette, the type scale and + * the geometry every part of the sheet measures against. + * + *

The design was drawn at 1055 px across an A4 page, so {@link #PX} converts + * every length below from that raster to points.

+ * + *

Sizes carry two corrections, both measured

+ * + *

A cap measured on a screenshot includes about half a pixel of antialiasing + * on each edge and the whole of it lands in the size, so {@link #sizeForCap} + * takes it back off. And the body face sets uppercase about 6% wider than the + * design's face at the same cap height — measured across three all-caps runs, + * while mixed-case runs at the same sizes matched within 2% — so + * {@link #sizeForCaps} carries that as a size correction. There is no + * letter-spacing API to take it out with instead.

+ */ +final class WorkspaceStyles { + + private WorkspaceStyles() { + } + + static final DocumentPageSize PAGE = DocumentPageSize.A4; + static final double PAGE_WIDTH = PAGE.width(); + + /** The design's raster is 1055 px wide; every length below came off it. */ + static final double PX = PAGE_WIDTH / 1055.0; + + static final double MARGIN_T = px(46); + static final double MARGIN_R = px(47); + static final double MARGIN_L = px(45); + + /** + * Page one's bottom margin is the page-number band: whatever else is on the + * page, the band has to be reserved, or a paginated invoice runs its last + * line straight through the number. + */ + static final double MARGIN_B_FIRST = px(28); + static final double PAGE_NUMBER_BAND = px(28); + + /** + * How far the closing rule, the thank-you block and the brand band sit above + * the design's own positions. It buys the page number a band to sit in; + * without it there is nowhere on the page for one, because the design's + * closing block runs to within 15 px of the paper. + * + *

Distributed rather than taken in one place, and the distribution is not + * arbitrary: the closing rule sits 17 px under the payment card, so taking + * the whole lift off its top margin would pull it into the card's bottom + * border. Nine px come off the rule — leaving it 8 px clear of the card — + * and the rest out of the two gaps below it. The three shares are not + * independent: a gap inside the block moves everything below it as well, so + * the band's total lift is their sum.

+ */ + static final double CLOSING_LIFT = px(18); + static final double CLOSING_RULE_LIFT = px(9); + static final double CLOSING_INNER_LIFT = (CLOSING_LIFT - CLOSING_RULE_LIFT) / 2.0; + + /** + * A continuation page reserves more: its last row would otherwise end + * against the paper rather than against a margin. + */ + static final double MARGIN_B_LATER = px(58); + + static final DocumentInsets PAGE_MARGIN = + new DocumentInsets(MARGIN_T, MARGIN_R, MARGIN_B_FIRST, MARGIN_L); + static final DocumentInsets CONTINUATION_MARGIN = + new DocumentInsets(MARGIN_T, MARGIN_R, MARGIN_B_LATER, MARGIN_L); + + /** Every width in this preset is a fraction of this. */ + static final double CONTENT_W = PAGE_WIDTH - MARGIN_L - MARGIN_R; + + /** + * The issuer/metadata and bill-to/ship-to rows both split the content box in + * half: measured, both vertical dividers land on the same x. + */ + static final double HALF = 0.5; + + static final DocumentColor ACCENT = DocumentColor.rgb(85, 42, 164); + static final DocumentColor ACCENT_SURFACE = DocumentColor.rgb(245, 242, 253); + static final DocumentColor ACCENT_BORDER = DocumentColor.rgb(199, 184, 236); + static final DocumentColor INK = DocumentColor.rgb(15, 16, 20); + static final DocumentColor BODY = DocumentColor.rgb(45, 47, 53); + static final DocumentColor MUTED = DocumentColor.rgb(100, 102, 108); + static final DocumentColor HAIRLINE = DocumentColor.rgb(232, 234, 238); + static final DocumentColor HAIRLINE_STRONG = DocumentColor.rgb(214, 216, 221); + static final DocumentColor SURFACE = DocumentColor.WHITE; + static final DocumentColor TILE_BLUE = DocumentColor.rgb(45, 90, 242); + static final DocumentColor TILE_GREEN = DocumentColor.rgb(31, 122, 85); + + static final FontName FACE = FontName.LATO; + + /** The face's cap height in ems, read off the TTF. */ + private static final double FACE_CAP_RATIO = 0.7165; + + /** The antialiasing a cap measured on a screenshot carries on each edge. */ + private static final double CAP_INK_BLEED = 0.5; + + /** How far below its own box top a line of text sits. */ + static final double TEXT_TOP_BEARING = 0.235; + + /** + * {@code lineSpacing} is points added between lines over a line box + * of 1.2× the type size, so a measured pitch converts as + * {@code pitch - 1.2 * size}, never as a ratio. + */ + static final double LINE_BOX = 1.2; + + /** + * The one size not taken straight from its cap. At the size its 45 px cap + * implies the title's ink came back 2.9% narrower than the design's with the + * right edges aligned, so it is set 3% larger — which costs 1.4 px of cap + * height to buy back 7 px of width. + */ + static final double TITLE_SIZE = sizeForCap(45) * 1.03; + + /** + * 3% under the size its 15 px cap implies. The two names set at it straddle + * the design — one comes back 1.9% wide and the other 6.9% — so the + * correction halves the larger error rather than making one exact and the + * other worse. + */ + static final double NAME_SIZE = sizeForCap(15) * 0.97; + static final double BODY_SIZE = sizeForCap(12.5); + static final double META_LABEL_SIZE = sizeForCap(12); + + /** + * The party labels keep the uncorrected size: measured against the design + * they come back 5% narrow plain and 11% narrow with the caps correction, so + * they are the one all-caps run the correction does not help. + */ + static final double SECTION_LABEL_SIZE = sizeForCap(12.5); + static final double TABLE_HEAD_SIZE = sizeForCaps(11); + static final double ITEM_TITLE_SIZE = sizeForCap(13); + static final double ITEM_SUB_SIZE = sizeForCap(11); + static final double CELL_SIZE = sizeForCaps(12); + static final double TOTALS_SIZE = sizeForCap(12); + static final double TOTAL_LABEL_SIZE = sizeForCaps(15); + static final double TOTAL_VALUE_SIZE = sizeForCap(19); + static final double CARD_TITLE_SIZE = sizeForCaps(12); + static final double CARD_TEXT_SIZE = sizeForCap(11); + static final double DUE_LABEL_SIZE = sizeForCaps(12); + static final double DUE_VALUE_SIZE = sizeForCap(16); + static final double THANKS_TITLE_SIZE = sizeForCap(12); + static final double THANKS_BODY_SIZE = sizeForCap(10); + static final double FOOTER_SIZE = sizeForCap(11); + static final double WORDMARK_SIZE = sizeForCap(25); + static final double PAGE_NUMBER_SIZE = sizeForCap(8); + + static final double RULE_THIN = px(1.4); + static final double RULE_MED = px(1.6); + static final double ACCENT_RULE_W = px(41); + static final double ACCENT_RULE_T = px(4); + + /** + * The lockup's box, measured off the design's own ink. A caller's logo is + * sized by the width, which is the dimension the design fixes. + */ + static final double LOCKUP_W = px(212); + + /** The title's ink stops short of the content box, not on it. */ + static final double TITLE_RIGHT_INSET = px(13); + + /** + * The lockup sets the row's top edge, so the title's own line box hangs its + * caps below where the design draws them. Nothing else in the row can absorb + * that, so the title is lifted by it. + */ + static final double TITLE_TOP_LIFT = px(7.3); + + static final double DISC_D = px(42); + static final double DISC_GLYPH = px(20); + static final double DISC_GAP = px(18); + + /** The party block's text sits on the label's axis, indented past the disc. */ + static final double PARTY_TEXT_INDENT = DISC_D + DISC_GAP; + static final double ISSUER_TAX_LABEL_W = px(63); + static final double PARTY_TAX_LABEL_W = px(79); + + /** Metadata labels start at the cell's edge and values 180 px along it. */ + static final double META_LABEL_W = px(180); + static final double META_CELL_INSET = px(80); + + /** + * Column shares of the content width, derived from the header labels' + * measured centres rather than from boundaries the design never draws. + */ + static final double[] COLUMN_SHARES = {0.383178, 0.176532, 0.118380, 0.172378, 0.149533}; + + static final double HEAD_PAD_V = px(18.4); + static final double HEAD_PAD_L = px(67); + + /** + * Asymmetric, measured: the design's row content sits 19 px below its top + * rule and 16 px above the next. Symmetric padding centres it and leaves the + * text about 3 px low. + */ + static final double CELL_PAD_T = px(17.0); + static final double CELL_PAD_B = px(14.0); + static final double CELL_PAD_L = px(15); + static final double ITEM_TILE_D = px(33); + static final double ITEM_TILE_RADIUS = px(8); + static final double ITEM_GLYPH = px(19); + static final double ITEM_TEXT_GAP = px(19); + + /** + * Every rule in the table comes from one of these two styles. A cell strokes + * all four of its own edges, and a one-column table has no interior vertical + * edge — so the same stroke that draws the separator between two rows draws + * the table's left and right sides, and nothing else. + */ + static final DocumentTableStyle HEADER_CELL_STYLE = DocumentTableStyle.builder() + .fillColor(ACCENT_SURFACE) + .stroke(DocumentStroke.of(ACCENT_BORDER, RULE_THIN)) + .padding(new DocumentInsets(HEAD_PAD_V, 0, HEAD_PAD_V, 0)) + .textAnchor(DocumentTableTextAnchor.CENTER_LEFT) + .build(); + + static final DocumentTableStyle ITEM_CELL_STYLE = DocumentTableStyle.builder() + .stroke(DocumentStroke.of(HAIRLINE, RULE_THIN)) + .padding(new DocumentInsets(CELL_PAD_T, 0, CELL_PAD_B, 0)) + .textAnchor(DocumentTableTextAnchor.CENTER_LEFT) + .build(); + + /** + * The settlement row is NOT the half split the two rows above it use: its + * left cell is 420 design px, its right 433, with a 110 px gutter. That + * asymmetry is in the design, not in the measurement. + */ + static final double SETTLEMENT_LEFT = px(420); + static final double SETTLEMENT_GUTTER = px(110); + static final double SETTLEMENT_RIGHT = px(433); + static final double SETTLEMENT_RIGHT_INSET = px(29); + + static final double CARD_RADIUS = px(12); + static final DocumentInsets CARD_PAD = new DocumentInsets(px(17), px(24), px(22), px(24)); + static final double CARD_LABEL_W = px(162); + + /** The card's inner width — what its interior rule spans. */ + static final double CARD_INNER_W = SETTLEMENT_LEFT - px(24) - px(24); + static final double CARD_ICON = px(27); + static final double CARD_ICON_GAP = px(21); + static final double NOTE_ICON_COL = px(30); + static final double NOTE_ICON = px(20); + + static final double TOTALS_PAD_L = px(6); + static final double TOTALS_PAD_R = px(10); + static final double TOTALS_RULE_W = px(397); + + static final double DUE_RADIUS = px(12); + static final DocumentInsets DUE_PAD = new DocumentInsets(px(25), px(24), px(28), px(23)); + static final double DUE_TILE = px(38); + static final double DUE_TILE_RADIUS = px(9); + static final double DUE_GLYPH = px(22); + static final double DUE_TILE_GAP = px(24); + + static final double THANKS_INDENT = px(6); + static final double THANKS_ICON_COL = px(46); + static final double THANKS_ICON = px(30); + + static final double FOOTER_MARK_COL = px(144); + static final double FOOTER_LINK_COL = px(150); + + /** + * Which surface a line's glyph is knocked out of. A token with no colour + * here is drawn bare, which is how the design sets a mark that carries its + * own. + */ + static final Map TILE_COLOR = Map.of( + "search", ACCENT, + "grid", TILE_BLUE, + "shield", TILE_GREEN); + + static double px(double designPixels) { + return designPixels * PX; + } + + /** A size named by the cap height it reproduces, in design px. */ + static double sizeForCap(double capPx) { + return px(capPx - CAP_INK_BLEED) / FACE_CAP_RATIO; + } + + /** The same for an all-caps run, which the face sets 6% wide. */ + static double sizeForCaps(double capPx) { + return sizeForCap(capPx) * 0.94; + } + + /** + * Where to start a text box so its caps land {@code capPx} below the top of + * the block it shares a row with — a label beside a glyph, whose design + * position is its own baseline rather than the glyph's centre. + */ + static double capOffset(double capPx, double size) { + return Math.max(0, px(capPx) - TEXT_TOP_BEARING * size); + } + + /** What a text box hangs below its last cap: the rest of the line box. */ + static double bottomBearing(double size) { + return (LINE_BOX - TEXT_TOP_BEARING - FACE_CAP_RATIO) * size; + } + + /** + * A block gap read ink-to-ink on the design, turned into the margin the + * engine wants. Pass 0 for a neighbour that is not text — a rule, a disc, a + * table — which has no bearing to lose. + */ + static double blockGap(double inkGapPx, double sizeAbove, double sizeBelow) { + return Math.max(0, px(inkGapPx) + - (sizeAbove > 0 ? bottomBearing(sizeAbove) : 0) + - (sizeBelow > 0 ? TEXT_TOP_BEARING * sizeBelow : 0)); + } + + /** + * A measured top-to-top pitch turned into the gap the engine wants: the + * first box's own height comes off it, because spacing is between boxes. + */ + static double gap(double pitchPx, double sizeOfFirst) { + return Math.max(0, px(pitchPx) - LINE_BOX * sizeOfFirst); + } + + static DocumentTextStyle style(double size, DocumentColor color, + DocumentTextDecoration decoration) { + return DocumentTextStyle.builder() + .fontName(FACE) + .size(size) + .color(color) + .decoration(decoration) + .build(); + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceText.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceText.java new file mode 100644 index 000000000..5111f41aa --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceText.java @@ -0,0 +1,98 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import java.math.BigDecimal; +import java.text.NumberFormat; +import java.util.Currency; +import java.util.Locale; + +/** + * How the Workspace sheet writes its figures. + * + *

The locale is stated, never inherited

+ * + *

Both the grouping of a number and the symbol for a currency code are + * locale-dependent — {@code USD} is {@code $} in English and {@code US$} in the + * root locale, {@code JPY} is {@code ¥} or {@code JP¥} — so a preset that let + * the JVM's default locale decide would render a different sheet on a different + * machine, and its baselines would move with the machine rather than with the + * design. Both helpers below pin {@link Locale#ENGLISH}.

+ */ +final class WorkspaceText { + + private WorkspaceText() { + } + + /** An amount, grouped and always to two places. */ + static String money(BigDecimal value) { + NumberFormat format = NumberFormat.getNumberInstance(Locale.ENGLISH); + format.setGroupingUsed(true); + format.setMinimumFractionDigits(2); + format.setMaximumFractionDigits(2); + return format.format(value); + } + + /** A quantity, written without trailing zeros a whole number does not need. */ + static String quantity(BigDecimal value) { + BigDecimal stripped = value.stripTrailingZeros(); + return stripped.scale() <= 0 ? stripped.toBigInteger().toString() : stripped.toPlainString(); + } + + /** + * The symbol for an ISO currency code, or the code itself when there is no + * symbol for it and the empty string when a document states no currency. + * + * @param currencyCode the ISO code the figures are stated in + * @return what to print before an amount + */ + static String symbol(String currencyCode) { + if (currencyCode == null || currencyCode.isBlank()) { + return ""; + } + try { + return Currency.getInstance(currencyCode.trim()).getSymbol(Locale.ENGLISH); + } catch (IllegalArgumentException notACurrency) { + return currencyCode.trim(); + } + } + + /** + * An amount named by its currency code rather than its symbol — this design + * writes {@code USD 587.50} on the one figure it names at all. + * + * @param currencyCode the ISO code the figures are stated in + * @param value the amount + * @return the amount behind its code, or bare when no currency is stated + */ + static String coded(String currencyCode, BigDecimal value) { + return currencyCode == null || currencyCode.isBlank() + ? money(value) + : currencyCode.trim() + " " + money(value); + } + + /** + * A column label with the currency named after it, which is where this + * design states it for the figures under it. + * + * @param label the column's own words + * @param currencyCode the ISO code the figures are stated in + * @return the label, with the code in brackets when there is one + */ + static String labelWithCurrency(String label, String currencyCode) { + return currencyCode == null || currencyCode.isBlank() + ? label + : label + " (" + currencyCode.trim() + ")"; + } + + /** + * A quantity and what it counts, as the design writes them: one run, so the + * column stays centred on the pair rather than on the number. + * + * @param value the quantity + * @param unit what it counts; blank when the number stands alone + * @return the written quantity + */ + static String quantityWithUnit(BigDecimal value, String unit) { + String written = quantity(value); + return unit == null || unit.isBlank() ? written : written + " " + unit; + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceWidgets.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceWidgets.java new file mode 100644 index 000000000..7bb318b4b --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/WorkspaceWidgets.java @@ -0,0 +1,158 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.dsl.PageFlowBuilder; +import com.demcha.compose.document.dsl.RowBuilder; +import com.demcha.compose.document.dsl.SectionBuilder; +import com.demcha.compose.document.dsl.ShapeContainerBuilder; +import com.demcha.compose.document.node.DocumentNode; +import com.demcha.compose.document.node.HorizontalAlign; +import com.demcha.compose.document.node.LayerAlign; +import com.demcha.compose.document.style.DocumentColor; +import com.demcha.compose.document.style.DocumentInsets; +import com.demcha.compose.document.style.DocumentTextDecoration; + +import java.util.List; +import java.util.function.Consumer; + +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.ACCENT; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.CONTENT_W; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.DISC_D; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.DISC_GLYPH; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.ITEM_GLYPH; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.ITEM_TILE_D; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.ITEM_TILE_RADIUS; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.TILE_COLOR; +import static com.demcha.compose.document.templates.invoice.presets.WorkspaceStyles.style; + +/** + * The pieces more than one part of the Workspace sheet draws: the wrapper every + * horizontal pair inside a cell goes through, the disc and the tile that own + * their glyphs, and the full-width rules that separate the closing blocks. + */ +final class WorkspaceWidgets { + + private WorkspaceWidgets() { + } + + /** + * A row that survives inside a row cell. + * + *

A row nested directly in a row cell is refused by the layout compiler. + * Every horizontal pair that lives inside a cell in this preset goes through + * here, wrapped in a single layer of a stack.

+ * + * @param parent the section to add the row to + * @param name the node name, for review and rollback + * @param spec describes the row + */ + static void layeredRow(SectionBuilder parent, String name, Consumer spec) { + SectionBuilder holder = new SectionBuilder(); + holder.name(name + "Holder"); + holder.addRow(name, spec); + DocumentNode node = holder.build(); + parent.addLayerStack(stack -> stack + .name(name + "Layer") + .layer(node, LayerAlign.TOP_LEFT, 0)); + } + + /** + * A filled disc that owns its glyph: the glyph is knocked out of the accent + * fill, so it is a child of the shape rather than a coloured circle with an + * icon dropped near it. + * + * @param token the packaged mark + * @return the disc node + */ + static DocumentNode disc(String token) { + return new ShapeContainerBuilder() + .name("Disc" + token) + .circle(DISC_D) + .fillColor(ACCENT) + .center(glyph(token, DISC_GLYPH)) + .build(); + } + + /** + * A line's mark on its coloured tile, or bare when the design gives that + * token no tile. + * + * @param token the packaged mark + * @return the tile node + */ + static DocumentNode tile(String token) { + DocumentColor fill = TILE_COLOR.get(token); + if (fill == null) { + return glyph(token, ITEM_TILE_D); + } + return new ShapeContainerBuilder() + .name("ItemTile" + token) + .roundedRect(ITEM_TILE_D, ITEM_TILE_D, ITEM_TILE_RADIUS) + .fillColor(fill) + .center(glyph(token, ITEM_GLYPH)) + .build(); + } + + /** A glyph centred in a box of its own, so a shape can own it. */ + static DocumentNode glyph(String token, double size) { + return glyph(token, size, HorizontalAlign.CENTER); + } + + /** + * The same, aligned. A glyph that leads a text row is left-aligned: its + * column's width is the distance to the text, not a box for the glyph to sit + * in the middle of. + * + * @param token the packaged mark + * @param size the glyph's box + * @param align where the glyph sits in it + * @return the glyph node + */ + static DocumentNode glyph(String token, double size, HorizontalAlign align) { + return new SectionBuilder() + .name("Glyph" + token) + .spacing(0) + .addSvgIcon(WorkspaceIcons.icon(token), size, align) + .build(); + } + + /** One method for all three full-width hairlines; the page uses two weights. */ + static void fullWidthRule(PageFlowBuilder page, String name, DocumentColor color, + double thickness, double gapAbove, double gapBelow) { + page.addLine(line -> line + .name(name) + .horizontal(CONTENT_W) + .thickness(thickness) + .color(color) + .margin(new DocumentInsets(gapAbove, 0, gapBelow, 0))); + } + + /** + * A block of plain lines, one paragraph each. + * + * @param block the section to fill + * @param prefix the node-name prefix, numbered from one + * @param lines the lines + * @param size their type size + * @param color their colour + */ + static void textLines(SectionBuilder block, String prefix, List lines, + double size, DocumentColor color) { + int index = 0; + for (String line : lines) { + String name = prefix + (++index); + block.addParagraph(p -> p + .name(name) + .text(line) + .textStyle(style(size, color, DocumentTextDecoration.DEFAULT))); + } + } + + /** Even weights for a row of {@code count} cells. */ + static double[] evenWeights(int count) { + double[] weights = new double[count]; + for (int i = 0; i < count; i++) { + weights[i] = 1.0 / count; + } + return weights; + } +} diff --git a/templates/src/main/resources/templates/invoice/workspace/icons/bank.svg b/templates/src/main/resources/templates/invoice/workspace/icons/bank.svg new file mode 100644 index 000000000..fbbc8fae9 --- /dev/null +++ b/templates/src/main/resources/templates/invoice/workspace/icons/bank.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/invoice/workspace/icons/bill-to.svg b/templates/src/main/resources/templates/invoice/workspace/icons/bill-to.svg new file mode 100644 index 000000000..a91fe98cf --- /dev/null +++ b/templates/src/main/resources/templates/invoice/workspace/icons/bill-to.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/invoice/workspace/icons/calendar.svg b/templates/src/main/resources/templates/invoice/workspace/icons/calendar.svg new file mode 100644 index 000000000..3233ebbb5 --- /dev/null +++ b/templates/src/main/resources/templates/invoice/workspace/icons/calendar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/invoice/workspace/icons/grid.svg b/templates/src/main/resources/templates/invoice/workspace/icons/grid.svg new file mode 100644 index 000000000..1e92b92da --- /dev/null +++ b/templates/src/main/resources/templates/invoice/workspace/icons/grid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/invoice/workspace/icons/info.svg b/templates/src/main/resources/templates/invoice/workspace/icons/info.svg new file mode 100644 index 000000000..b88a167fa --- /dev/null +++ b/templates/src/main/resources/templates/invoice/workspace/icons/info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/invoice/workspace/icons/search.svg b/templates/src/main/resources/templates/invoice/workspace/icons/search.svg new file mode 100644 index 000000000..d685eadd9 --- /dev/null +++ b/templates/src/main/resources/templates/invoice/workspace/icons/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/invoice/workspace/icons/shield.svg b/templates/src/main/resources/templates/invoice/workspace/icons/shield.svg new file mode 100644 index 000000000..878df61a1 --- /dev/null +++ b/templates/src/main/resources/templates/invoice/workspace/icons/shield.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/src/main/resources/templates/invoice/workspace/icons/ship-to.svg b/templates/src/main/resources/templates/invoice/workspace/icons/ship-to.svg new file mode 100644 index 000000000..924aa3b48 --- /dev/null +++ b/templates/src/main/resources/templates/invoice/workspace/icons/ship-to.svg @@ -0,0 +1 @@ + \ No newline at end of file