diff --git a/CHANGELOG.md b/CHANGELOG.md index 58d990d2a..a14ebe003 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,21 @@ follow semantic versioning; release dates are ISO 8601. ### Public API +- **A structured invoice document model.** The invoice family's data layer knew one + shape — an invoice as pre-formatted display strings, with one address block per + party, line items whose quantity and money are already rendered, and a flat list of + summary rows. That cannot carry the structured business invoice: a brand lockup with + the sender's own logo, labelled masthead metadata, a contact block with a business + registration, priced service lines carrying `BigDecimal` figures and the unit they + are counted in, a totals stack with its own total band, bank payment fields, and a + footer line. `templates.data.invoice` now carries that second model — + `StructuredInvoiceData` (+ its section records) wrapped by + `StructuredInvoiceDocumentSpec` — alongside the display one; a preset consumes the + model whose shape it renders. The brand logo arrives as `DocumentImageData`, because + the logo is caller-supplied content rather than template chrome, and it stays + optional so a wordmark-only lockup composes. Every component normalizes `null` to + its empty form, money and quantities default to zero, and collections are frozen. + - **A structured proposal document model.** The proposal family's data layer knew one shape — a titled run of prose sections with a flat timeline and pricing list — which cannot carry the structured business proposal: brand marks, an authored multi-line @@ -21,6 +36,19 @@ follow semantic versioning; release dates are ISO 8601. ### Templates +- **A professional-services invoice preset: `ConsultingInvoice`.** A corporate masthead + — brand lockup and contact channels beside the document title and its metadata — + over priced service lines that carry a service period and a unit per line, closing + with an emphasized total band and the bank details beside the notes and the due-by + chip. Ships as `invoice.presets.ConsultingInvoice` consuming the new structured + invoice model, with its contact marks, bank badge and calendar packaged in the + templates artifact, porting the rendered layout of the published standalone + `northpoint-consulting-invoice` template. Long invoices flow: the line-items table + repeats its header and the totals stack stays whole. Guarded by a smoke test + (including the empty document, the wordmark fallback, the rendered figures and the + repeated header), exact layout snapshots for the single page and the overflow, and a + pixel-parity gate; the examples showcase gains `invoice-consulting-v2`. + - **A second invoice preset: `ClassicInvoice`.** The letterhead-style invoice — a header band with the company name and a 28pt INVOICE title, a TOTAL DUE hero strip, BILL TO / FROM party columns, and a dedicated Summary table composed after the diff --git a/assets/readme/examples/invoice-consulting-v2.pdf b/assets/readme/examples/invoice-consulting-v2.pdf new file mode 100644 index 000000000..0d832fbde Binary files /dev/null and b/assets/readme/examples/invoice-consulting-v2.pdf differ diff --git a/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java b/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java index 006ec548a..18548ddd7 100644 --- a/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java +++ b/examples/src/main/java/com/demcha/examples/GenerateAllExamples.java @@ -97,6 +97,7 @@ import com.demcha.examples.templates.cv.v2.CvSidebarPortraitExample; import com.demcha.examples.templates.cv.v2.CvTimelineMinimalExample; import com.demcha.examples.templates.invoice.ClassicInvoiceV2Example; +import com.demcha.examples.templates.invoice.ConsultingInvoiceV2Example; import com.demcha.examples.templates.invoice.InvoiceCinematicFileExample; import com.demcha.examples.templates.invoice.ModernInvoiceV2Example; import com.demcha.examples.templates.proposal.CinematicProposalFileExample; @@ -164,6 +165,7 @@ public static void main(String[] args) throws Exception { System.out.println("Generated: " + InvoiceCinematicFileExample.generate()); System.out.println("Generated: " + ModernInvoiceV2Example.generate()); System.out.println("Generated: " + ClassicInvoiceV2Example.generate()); + System.out.println("Generated: " + ConsultingInvoiceV2Example.generate()); // Proposals System.out.println("Generated: " + ProposalCinematicFileExample.generate()); diff --git a/examples/src/main/java/com/demcha/examples/support/ConsultingInvoiceSampleData.java b/examples/src/main/java/com/demcha/examples/support/ConsultingInvoiceSampleData.java new file mode 100644 index 000000000..ff61b3188 --- /dev/null +++ b/examples/src/main/java/com/demcha/examples/support/ConsultingInvoiceSampleData.java @@ -0,0 +1,127 @@ +package com.demcha.examples.support; + +import com.demcha.compose.document.image.DocumentImageData; +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 com.demcha.compose.document.templates.data.invoice.StructuredInvoiceDocumentSpec; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * Shared sample data for the Consulting Invoice example. + * + *
The sample is the preset's reference content: a + * professional-services invoice with a brand logo, five masthead metadata + * rows (one emphasized), five priced service lines, a subtotal / tax + * stack with the total band, five bank fields, and notes naming both query + * channels.
+ * + *Kept in lockstep with the qa module's + * {@code ConsultingInvoiceFixtures} — the two modules cannot share a + * source file, so a content change here belongs there too.
+ */ +public final class ConsultingInvoiceSampleData { + + private ConsultingInvoiceSampleData() { + } + + /** The single-page reference invoice. */ + public static StructuredInvoiceDocumentSpec sample() { + return StructuredInvoiceDocumentSpec.from(baseBuilder(serviceLines(5)).build()); + } + + /** The sample logo, read from the examples resources. */ + public static DocumentImageData sampleLogo() { + String path = "/consulting-invoice-logo.png"; + try (InputStream input = ConsultingInvoiceSampleData.class.getResourceAsStream(path)) { + if (input == null) { + throw new IllegalStateException("Missing sample logo: " + path); + } + return DocumentImageData.fromBytes(input.readAllBytes()); + } catch (IOException e) { + throw new UncheckedIOException("Failed to read sample logo: " + path, e); + } + } + + private static StructuredInvoiceData.Builder baseBuilder(InvoiceServiceLines lines) { + return StructuredInvoiceData.builder() + .brand(new InvoiceBrand(sampleLogo(), "NORTHPOINT", "CONSULTING", + "Strategy. Solutions. Results.")) + .supplier(new InvoiceContactBlock("Northpoint Consulting Pty Ltd", + List.of("Level 8, 1 Collins Street", "Melbourne VIC 3000 Australia"), + "+61 3 9876 5432", "hello@northpoint.com.au", "northpoint.com.au", + "ABN", "12 345 678 901")) + .masthead(new InvoiceMasthead("INVOICE", List.of( + new InvoiceMasthead.Entry("Invoice Number:", "INV-2025-0478", false), + new InvoiceMasthead.Entry("Issue Date:", "26 May 2025", false), + new InvoiceMasthead.Entry("Due Date:", "25 June 2025", true), + new InvoiceMasthead.Entry("Project:", "Digital Strategy Engagement", false), + new InvoiceMasthead.Entry("PO Number:", "PO-7892", false)))) + .billTo(new InvoiceRecipient("BILLED TO", "Greenfield Industries Ltd.", + "Accounts Payable Department", + List.of("12 Innovation Drive", "Melbourne VIC 3000", "Australia"), + "Email:", "ap@greenfield.com.au")) + .summary(new InvoiceSummaryBlock("INVOICE SUMMARY", + "Professional services rendered in accordance with the statement of " + + "work for the period", + "1 May 2025 – 25 May 2025.")) + .serviceLines(lines) + .totals(new InvoiceTotalsBlock(List.of( + new InvoiceTotalsBlock.Row("SUBTOTAL", new BigDecimal("14000.00")), + new InvoiceTotalsBlock.Row("GST (10%)", new BigDecimal("1400.00"))), + "TOTAL DUE", new BigDecimal("15400.00"))) + .payment(new InvoicePaymentBlock("PAYMENT INFORMATION", List.of( + new InvoicePaymentBlock.Field("Bank Name:", "Example Bank"), + new InvoicePaymentBlock.Field("Account Name:", + "Northpoint Consulting Pty Ltd"), + new InvoicePaymentBlock.Field("BSB:", "123-456"), + new InvoicePaymentBlock.Field("Account Number:", "12345678"), + new InvoicePaymentBlock.Field("Reference:", "INV-2025-0478")), + "Please ensure the invoice number is included in the payment reference.", + "Payment is due within 30 days from the issue date.", "30 days")) + .notes(new InvoiceNotesBlock("NOTES", List.of( + "Thank you for your business.", + "If you have any questions regarding this invoice, please contact us " + + "at accounts@northpoint.com.au or +61 3 9876 5432."), + "accounts@northpoint.com.au", "+61 3 9876 5432")) + .currencyCode("AUD"); + } + + private static InvoiceServiceLines serviceLines(int count) { + String[][] source = { + {"Strategic Consultation", "Leadership alignment workshops", "1–10 May 2025", + "10.00", "hrs", "250.00", "2500.00"}, + {"Market & Competitive Analysis", "Research and analysis report", "1–15 May 2025", + "1.00", "ea", "3500.00", "3500.00"}, + {"Digital Roadmap Development", "Strategy and roadmap creation", "5–20 May 2025", + "1.00", "ea", "4800.00", "4800.00"}, + {"Stakeholder Review Sessions", "Facilitation and documentation", "15–22 May 2025", + "6.00", "hrs", "220.00", "1320.00"}, + {"Presentation & Final Report", "Executive presentation and delivery", + "20–25 May 2025", "1.00", "ea", "1880.00", "1880.00"}}; + ListOutput: + * {@code examples/target/generated-pdfs/templates/invoice/invoice-consulting-v2.pdf}.
+ * + *The preset owns its page geometry — size, margins, the page fills and + * the footer band — so the session starts unconfigured; see + * {@code ConsultingInvoice.RECOMMENDED_MARGIN}. The brand logo is supplied + * through the data, the way a caller supplies its own.
+ */ +public final class ConsultingInvoiceV2Example { + + private ConsultingInvoiceV2Example() { + } + + /** + * @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-consulting-v2.pdf"); + StructuredInvoiceDocumentSpec spec = ConsultingInvoiceSampleData.sample(); + DocumentTemplateThe canonical fixture is the preset's reference content: a + * professional-services invoice with a brand logo, five masthead metadata + * rows (one emphasized), five priced service lines, a subtotal / tax + * stack with the total band, five bank fields, and notes naming both query + * channels. The overflow fixture repeats the service lines until the table + * paginates, which is what freezes the repeating table header.
+ * + *Kept in lockstep with the examples module's + * {@code ConsultingInvoiceSampleData} — the two modules cannot share a + * source file, so a content change here belongs there too.
+ */ +final class ConsultingInvoiceFixtures { + + private ConsultingInvoiceFixtures() { + } + + /** The single-page reference invoice. */ + static StructuredInvoiceDocumentSpec canonicalInvoice() { + return StructuredInvoiceDocumentSpec.from(baseBuilder(serviceLines(5)).build()); + } + + /** Enough service lines to push the table onto a second page. */ + static StructuredInvoiceDocumentSpec overflowInvoice() { + return StructuredInvoiceDocumentSpec.from(baseBuilder(serviceLines(26)).build()); + } + + /** The sample logo, read from the qa test resources. */ + static DocumentImageData sampleLogo() { + String path = "/sample-data/consulting-invoice-logo.png"; + try (InputStream input = ConsultingInvoiceFixtures.class.getResourceAsStream(path)) { + if (input == null) { + throw new IllegalStateException("Missing sample logo: " + path); + } + return DocumentImageData.fromBytes(input.readAllBytes()); + } catch (IOException e) { + throw new UncheckedIOException("Failed to read sample logo: " + path, e); + } + } + + private static StructuredInvoiceData.Builder baseBuilder(InvoiceServiceLines lines) { + return StructuredInvoiceData.builder() + .brand(new InvoiceBrand(sampleLogo(), "NORTHPOINT", "CONSULTING", + "Strategy. Solutions. Results.")) + .supplier(new InvoiceContactBlock("Northpoint Consulting Pty Ltd", + List.of("Level 8, 1 Collins Street", "Melbourne VIC 3000 Australia"), + "+61 3 9876 5432", "hello@northpoint.com.au", "northpoint.com.au", + "ABN", "12 345 678 901")) + .masthead(new InvoiceMasthead("INVOICE", List.of( + new InvoiceMasthead.Entry("Invoice Number:", "INV-2025-0478", false), + new InvoiceMasthead.Entry("Issue Date:", "26 May 2025", false), + new InvoiceMasthead.Entry("Due Date:", "25 June 2025", true), + new InvoiceMasthead.Entry("Project:", "Digital Strategy Engagement", false), + new InvoiceMasthead.Entry("PO Number:", "PO-7892", false)))) + .billTo(new InvoiceRecipient("BILLED TO", "Greenfield Industries Ltd.", + "Accounts Payable Department", + List.of("12 Innovation Drive", "Melbourne VIC 3000", "Australia"), + "Email:", "ap@greenfield.com.au")) + .summary(new InvoiceSummaryBlock("INVOICE SUMMARY", + "Professional services rendered in accordance with the statement of " + + "work for the period", + "1 May 2025 – 25 May 2025.")) + .serviceLines(lines) + .totals(new InvoiceTotalsBlock(List.of( + new InvoiceTotalsBlock.Row("SUBTOTAL", new BigDecimal("14000.00")), + new InvoiceTotalsBlock.Row("GST (10%)", new BigDecimal("1400.00"))), + "TOTAL DUE", new BigDecimal("15400.00"))) + .payment(new InvoicePaymentBlock("PAYMENT INFORMATION", List.of( + new InvoicePaymentBlock.Field("Bank Name:", "Example Bank"), + new InvoicePaymentBlock.Field("Account Name:", + "Northpoint Consulting Pty Ltd"), + new InvoicePaymentBlock.Field("BSB:", "123-456"), + new InvoicePaymentBlock.Field("Account Number:", "12345678"), + new InvoicePaymentBlock.Field("Reference:", "INV-2025-0478")), + "Please ensure the invoice number is included in the payment reference.", + "Payment is due within 30 days from the issue date.", "30 days")) + .notes(new InvoiceNotesBlock("NOTES", List.of( + "Thank you for your business.", + "If you have any questions regarding this invoice, please contact us " + + "at accounts@northpoint.com.au or +61 3 9876 5432."), + "accounts@northpoint.com.au", "+61 3 9876 5432")) + .currencyCode("AUD"); + } + + private static InvoiceServiceLines serviceLines(int count) { + String[][] source = { + {"Strategic Consultation", "Leadership alignment workshops", "1–10 May 2025", + "10.00", "hrs", "250.00", "2500.00"}, + {"Market & Competitive Analysis", "Research and analysis report", "1–15 May 2025", + "1.00", "ea", "3500.00", "3500.00"}, + {"Digital Roadmap Development", "Strategy and roadmap creation", "5–20 May 2025", + "1.00", "ea", "4800.00", "4800.00"}, + {"Stakeholder Review Sessions", "Facilitation and documentation", "15–22 May 2025", + "6.00", "hrs", "220.00", "1320.00"}, + {"Presentation & Final Report", "Executive presentation and delivery", + "20–25 May 2025", "1.00", "ea", "1880.00", "1880.00"}}; + ListRefresh with {@code -Dgraphcompose.updateSnapshots=true} after a + * deliberate layout change, and commit the JSON with the change.
+ */ +class ConsultingInvoiceLayoutSnapshotTest { + + @Test + void canonicalInvoiceMatchesLayoutSnapshot() throws Exception { + try (DocumentSession session = GraphCompose.document().create()) { + ConsultingInvoice.create().compose( + session, ConsultingInvoiceFixtures.canonicalInvoice()); + assertThat(session.layoutSnapshot().totalPages()).isEqualTo(1); + TemplateTestSupport.assertCanonicalSnapshot( + session, "consulting_invoice_layout", "invoice"); + } + } + + @Test + void overflowInvoicePaginatesOntoASecondPage() throws Exception { + try (DocumentSession session = GraphCompose.document().create()) { + ConsultingInvoice.create().compose( + session, ConsultingInvoiceFixtures.overflowInvoice()); + assertThat(session.layoutSnapshot().totalPages()).isGreaterThan(1); + TemplateTestSupport.assertCanonicalSnapshot( + session, "consulting_invoice_overflow_layout", "invoice"); + } + } +} diff --git a/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ConsultingInvoiceSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ConsultingInvoiceSmokeTest.java new file mode 100644 index 000000000..ed319022b --- /dev/null +++ b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ConsultingInvoiceSmokeTest.java @@ -0,0 +1,168 @@ +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.InvoiceContactBlock; +import com.demcha.compose.document.templates.data.invoice.InvoicePaymentBlock; +import com.demcha.compose.document.templates.data.invoice.StructuredInvoiceData; +import com.demcha.compose.document.templates.data.invoice.StructuredInvoiceDocumentSpec; +import org.apache.pdfbox.Loader; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.text.PDFTextStripper; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Smoke test for the structured invoice pipeline through + * {@link ConsultingInvoice} — proves the preset renders a + * {@link StructuredInvoiceDocumentSpec} end-to-end with the packaged icon + * set and a caller-supplied logo, falls back to the wordmark lockup when + * no logo is supplied, renders an empty document through its guards, and + * puts the priced figures on the text layer, where the layout snapshot + * cannot see inside the table. + */ +class ConsultingInvoiceSmokeTest { + + private static byte[] render(StructuredInvoiceDocumentSpec spec) throws Exception { + // The preset owns its page geometry, so the session starts unconfigured. + try (DocumentSession session = GraphCompose.document().create()) { + ConsultingInvoice.create().compose(session, spec); + 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); + } + } + + @Test + void exposesStableIdentity() { + DocumentTemplateSeparate from {@code InvoiceV2VisualParityTest} because that gate is + * parameterised on the display {@code InvoiceDocumentSpec} while this + * preset consumes the structured spec. Budget and tolerance mirror the + * other template parity gates.
+ * + *Re-blessing baselines — after a deliberate visual + * change, re-run with {@code -Dgraphcompose.visual.approve=true} and + * commit the updated PNGs with the change. Baselines live under + * {@code src/test/resources/visual-baselines/invoice-v2-layered/}.
+ */ +class ConsultingInvoiceVisualParityTest { + + 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()) { + ConsultingInvoice.create().compose( + document, ConsultingInvoiceFixtures.canonicalInvoice()); + pdfBytes = document.toPdfBytes(); + } + + PdfVisualRegression.standard() + .baselineRoot(BASELINE_ROOT) + .perPixelTolerance(PER_PIXEL_TOLERANCE) + .mismatchedPixelBudget(PIXEL_DIFF_BUDGET) + .assertMatchesBaseline("consulting_invoice", pdfBytes); + } +} diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/consulting_invoice_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/consulting_invoice_layout.json new file mode 100644 index 000000000..71f81a1bc --- /dev/null +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/consulting_invoice_layout.json @@ -0,0 +1,2867 @@ +{ + "formatVersion" : "2.0", + "canvas" : { + "pageWidth" : 595.276, + "pageHeight" : 841.89, + "innerWidth" : 534.276, + "innerHeight" : 780.89, + "margin" : { + "top" : 30.5, + "right" : 30.5, + "bottom" : 30.5, + "left" : 30.5 + } + }, + "totalPages" : 1, + "nodes" : [ { + "path" : "ConsultingInvoice[0]", + "entityName" : "ConsultingInvoice", + "entityKind" : "ContainerNode", + "parentPath" : null, + "childIndex" : 0, + "depth" : 1, + "layer" : 1, + "computedX" : 30.5, + "computedY" : 169.316, + "placementX" : 30.5, + "placementY" : 169.316, + "placementWidth" : 534.276, + "placementHeight" : 642.074, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 534.276, + "contentHeight" : 642.074, + "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" : "ConsultingInvoice[0]/Masthead[0]", + "entityName" : "Masthead", + "entityKind" : "RowNode", + "parentPath" : "ConsultingInvoice[0]", + "childIndex" : 0, + "depth" : 2, + "layer" : 2, + "computedX" : 30.5, + "computedY" : 675.406, + "placementX" : 30.5, + "placementY" : 675.406, + "placementWidth" : 534.276, + "placementHeight" : 135.984, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 534.276, + "contentHeight" : 135.984, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]", + "entityName" : "SupplierHeader", + "entityKind" : "SectionNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 30.5, + "computedY" : 682.39, + "placementX" : 30.5, + "placementY" : 682.39, + "placementWidth" : 259.731, + "placementHeight" : 129.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 259.731, + "contentHeight" : 129.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/BrandLogoBox[0]", + "entityName" : "BrandLogoBox", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 747.39, + "placementX" : 30.5, + "placementY" : 747.39, + "placementWidth" : 259.731, + "placementHeight" : 64.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 259.731, + "contentHeight" : 64.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/BrandLogoBox[0]/BrandLogo[0]", + "entityName" : "BrandLogo", + "entityKind" : "ImageNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/BrandLogoBox[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 30.5, + "computedY" : 747.39, + "placementX" : 30.5, + "placementY" : 747.39, + "placementWidth" : 164.874, + "placementHeight" : 64.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 164.874, + "contentHeight" : 64.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[1]", + "entityName" : "ContactBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 727.39, + "placementX" : 30.5, + "placementY" : 727.39, + "placementWidth" : 259.731, + "placementHeight" : 18.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 259.731, + "contentHeight" : 18.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[1]/Icon-location[0]", + "entityName" : "Icon-location", + "entityKind" : "ImageNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 30.5, + "computedY" : 731.39, + "placementX" : 30.5, + "placementY" : 731.39, + "placementWidth" : 10.0, + "placementHeight" : 10.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 10.0, + "contentHeight" : 10.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 53.5, + "computedY" : 725.088, + "placementX" : 53.5, + "placementY" : 725.088, + "placementWidth" : 100.555, + "placementHeight" : 20.302, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 100.555, + "contentHeight" : 20.302, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[2]", + "entityName" : "ContactBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 712.39, + "placementX" : 30.5, + "placementY" : 712.39, + "placementWidth" : 259.731, + "placementHeight" : 13.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 259.731, + "contentHeight" : 13.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[2]/Icon-phone[0]", + "entityName" : "Icon-phone", + "entityKind" : "ImageNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 30.5, + "computedY" : 714.29, + "placementX" : 30.5, + "placementY" : 714.29, + "placementWidth" : 9.2, + "placementHeight" : 9.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 9.2, + "contentHeight" : 9.2, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[2]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[2]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 53.5, + "computedY" : 714.102, + "placementX" : 53.5, + "placementY" : 714.102, + "placementWidth" : 53.974, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 53.974, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[3]", + "entityName" : "ContactBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 697.39, + "placementX" : 30.5, + "placementY" : 697.39, + "placementWidth" : 259.731, + "placementHeight" : 13.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 259.731, + "contentHeight" : 13.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[3]/Icon-email[0]", + "entityName" : "Icon-email", + "entityKind" : "ImageNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[3]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 30.5, + "computedY" : 699.29, + "placementX" : 30.5, + "placementY" : 699.29, + "placementWidth" : 9.2, + "placementHeight" : 9.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 9.2, + "contentHeight" : 9.2, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[3]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[3]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 53.5, + "computedY" : 699.102, + "placementX" : 53.5, + "placementY" : 699.102, + "placementWidth" : 86.464, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 86.464, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[4]", + "entityName" : "ContactBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]", + "childIndex" : 4, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 682.39, + "placementX" : 30.5, + "placementY" : 682.39, + "placementWidth" : 259.731, + "placementHeight" : 13.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 259.731, + "contentHeight" : 13.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[4]/Icon-website[0]", + "entityName" : "Icon-website", + "entityKind" : "ImageNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[4]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 30.5, + "computedY" : 684.19, + "placementX" : 30.5, + "placementY" : 684.19, + "placementWidth" : 9.4, + "placementHeight" : 9.4, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 9.4, + "contentHeight" : 9.4, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[4]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[4]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 53.5, + "computedY" : 684.102, + "placementX" : 53.5, + "placementY" : 684.102, + "placementWidth" : 63.174, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 63.174, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]", + "entityName" : "InvoiceHeader", + "entityKind" : "SectionNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 315.231, + "computedY" : 675.406, + "placementX" : 315.231, + "placementY" : 675.406, + "placementWidth" : 249.545, + "placementHeight" : 135.984, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 249.545, + "contentHeight" : 135.984, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 24.0 + } + }, { + "path" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 339.231, + "computedY" : 778.406, + "placementX" : 339.231, + "placementY" : 778.406, + "placementWidth" : 128.001, + "placementHeight" : 32.984, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 128.001, + "contentHeight" : 32.984, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 8.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[1]", + "entityName" : "MetadataBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 339.231, + "computedY" : 751.406, + "placementX" : 339.231, + "placementY" : 751.406, + "placementWidth" : 225.545, + "placementHeight" : 18.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 225.545, + "contentHeight" : 18.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 339.231, + "computedY" : 755.618, + "placementX" : 339.231, + "placementY" : 755.618, + "placementWidth" : 57.812, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 57.812, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 447.492, + "computedY" : 755.086, + "placementX" : 447.492, + "placementY" : 755.086, + "placementWidth" : 57.509, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 57.509, + "contentHeight" : 10.64, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[2]", + "entityName" : "MetadataBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 339.231, + "computedY" : 732.406, + "placementX" : 339.231, + "placementY" : 732.406, + "placementWidth" : 225.545, + "placementHeight" : 18.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 225.545, + "contentHeight" : 18.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[2]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 339.231, + "computedY" : 736.618, + "placementX" : 339.231, + "placementY" : 736.618, + "placementWidth" : 38.475, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 38.475, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[2]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[2]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 447.492, + "computedY" : 736.086, + "placementX" : 447.492, + "placementY" : 736.086, + "placementWidth" : 47.5, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 47.5, + "contentHeight" : 10.64, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[3]", + "entityName" : "MetadataBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 339.231, + "computedY" : 713.406, + "placementX" : 339.231, + "placementY" : 713.406, + "placementWidth" : 225.545, + "placementHeight" : 18.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 225.545, + "contentHeight" : 18.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[3]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[3]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 339.231, + "computedY" : 717.618, + "placementX" : 339.231, + "placementY" : 717.618, + "placementWidth" : 33.796, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 33.796, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[3]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[3]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 447.492, + "computedY" : 717.086, + "placementX" : 447.492, + "placementY" : 717.086, + "placementWidth" : 50.396, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 50.396, + "contentHeight" : 10.64, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[4]", + "entityName" : "MetadataBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]", + "childIndex" : 4, + "depth" : 4, + "layer" : 4, + "computedX" : 339.231, + "computedY" : 694.406, + "placementX" : 339.231, + "placementY" : 694.406, + "placementWidth" : 225.545, + "placementHeight" : 18.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 225.545, + "contentHeight" : 18.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[4]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[4]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 339.231, + "computedY" : 698.618, + "placementX" : 339.231, + "placementY" : 698.618, + "placementWidth" : 26.635, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 26.635, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[4]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[4]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 447.492, + "computedY" : 698.086, + "placementX" : 447.492, + "placementY" : 698.086, + "placementWidth" : 109.235, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 109.235, + "contentHeight" : 10.64, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[5]", + "entityName" : "MetadataBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]", + "childIndex" : 5, + "depth" : 4, + "layer" : 4, + "computedX" : 339.231, + "computedY" : 675.406, + "placementX" : 339.231, + "placementY" : 675.406, + "placementWidth" : 225.545, + "placementHeight" : 18.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 225.545, + "contentHeight" : 18.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[5]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[5]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 339.231, + "computedY" : 679.618, + "placementX" : 339.231, + "placementY" : 679.618, + "placementWidth" : 41.82, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 41.82, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[5]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[5]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 447.492, + "computedY" : 679.086, + "placementX" : 447.492, + "placementY" : 679.086, + "placementWidth" : 32.665, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 32.665, + "contentHeight" : 10.64, + "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" : "ConsultingInvoice[0]/SpacerNode[1]", + "entityName" : null, + "entityKind" : "SpacerNode", + "parentPath" : "ConsultingInvoice[0]", + "childIndex" : 1, + "depth" : 2, + "layer" : 2, + "computedX" : 30.5, + "computedY" : 659.406, + "placementX" : 30.5, + "placementY" : 659.406, + "placementWidth" : 0.0, + "placementHeight" : 16.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 0.0, + "contentHeight" : 16.0, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]", + "entityName" : "PartiesAndSummary", + "entityKind" : "RowNode", + "parentPath" : "ConsultingInvoice[0]", + "childIndex" : 2, + "depth" : 2, + "layer" : 2, + "computedX" : 30.5, + "computedY" : 561.63, + "placementX" : 30.5, + "placementY" : 561.63, + "placementWidth" : 534.276, + "placementHeight" : 97.776, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 534.276, + "contentHeight" : 97.776, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]", + "entityName" : "BilledTo", + "entityKind" : "SectionNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 30.5, + "computedY" : 561.63, + "placementX" : 30.5, + "placementY" : 561.63, + "placementWidth" : 116.538, + "placementHeight" : 97.776, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 116.538, + "contentHeight" : 97.776, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 647.17, + "placementX" : 30.5, + "placementY" : 647.17, + "placementWidth" : 56.469, + "placementHeight" : 12.236, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 56.469, + "contentHeight" : 12.236, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]/LineNode[1]", + "entityName" : null, + "entityKind" : "LineNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 640.47, + "placementX" : 30.5, + "placementY" : 640.47, + "placementWidth" : 30.0, + "placementHeight" : 1.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 30.0, + "contentHeight" : 1.2, + "margin" : { + "top" : 4.0, + "right" : 0.0, + "bottom" : 4.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 624.33, + "placementX" : 30.5, + "placementY" : 624.33, + "placementWidth" : 97.219, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 97.219, + "contentHeight" : 10.64, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]/ParagraphNode[3]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 612.19, + "placementX" : 30.5, + "placementY" : 612.19, + "placementWidth" : 116.538, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 116.538, + "contentHeight" : 10.64, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]/ParagraphNode[4]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]", + "childIndex" : 4, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 578.77, + "placementX" : 30.5, + "placementY" : 578.77, + "placementWidth" : 76.129, + "placementHeight" : 31.92, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 76.129, + "contentHeight" : 31.92, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]/ParagraphNode[5]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]", + "childIndex" : 5, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 561.63, + "placementX" : 30.5, + "placementY" : 561.63, + "placementWidth" : 114.008, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 114.008, + "contentHeight" : 10.64, + "margin" : { + "top" : 5.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/PartiesAndSummary[2]/InvoiceSummary[1]", + "entityName" : "InvoiceSummary", + "entityKind" : "SectionNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 340.102, + "computedY" : 601.7, + "placementX" : 340.102, + "placementY" : 601.7, + "placementWidth" : 205.246, + "placementHeight" : 57.706, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 205.246, + "contentHeight" : 57.706, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]/InvoiceSummary[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/InvoiceSummary[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 340.102, + "computedY" : 647.17, + "placementX" : 340.102, + "placementY" : 647.17, + "placementWidth" : 109.748, + "placementHeight" : 12.236, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 109.748, + "contentHeight" : 12.236, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]/InvoiceSummary[1]/LineNode[1]", + "entityName" : null, + "entityKind" : "LineNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/InvoiceSummary[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 340.102, + "computedY" : 640.97, + "placementX" : 340.102, + "placementY" : 640.97, + "placementWidth" : 30.0, + "placementHeight" : 1.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 30.0, + "contentHeight" : 1.2, + "margin" : { + "top" : 4.0, + "right" : 0.0, + "bottom" : 4.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/PartiesAndSummary[2]/InvoiceSummary[1]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/InvoiceSummary[1]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 340.102, + "computedY" : 613.34, + "placementX" : 340.102, + "placementY" : 613.34, + "placementWidth" : 205.246, + "placementHeight" : 22.63, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 205.246, + "contentHeight" : 22.63, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]/InvoiceSummary[1]/ParagraphNode[3]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/InvoiceSummary[1]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 340.102, + "computedY" : 601.7, + "placementX" : 340.102, + "placementY" : 601.7, + "placementWidth" : 100.259, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 100.259, + "contentHeight" : 10.64, + "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" : "ConsultingInvoice[0]/SpacerNode[3]", + "entityName" : null, + "entityKind" : "SpacerNode", + "parentPath" : "ConsultingInvoice[0]", + "childIndex" : 3, + "depth" : 2, + "layer" : 2, + "computedX" : 30.5, + "computedY" : 551.63, + "placementX" : 30.5, + "placementY" : 551.63, + "placementWidth" : 0.0, + "placementHeight" : 10.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 0.0, + "contentHeight" : 10.0, + "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" : "ConsultingInvoice[0]/LineItems[4]", + "entityName" : "LineItems", + "entityKind" : "TableNode", + "parentPath" : "ConsultingInvoice[0]", + "childIndex" : 4, + "depth" : 2, + "layer" : 2, + "computedX" : 30.5, + "computedY" : 368.328, + "placementX" : 30.5, + "placementY" : 368.328, + "placementWidth" : 534.276, + "placementHeight" : 183.302, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 534.276, + "contentHeight" : 183.302, + "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" : "ConsultingInvoice[0]/Totals[5]", + "entityName" : "Totals", + "entityKind" : "SectionNode", + "parentPath" : "ConsultingInvoice[0]", + "childIndex" : 5, + "depth" : 2, + "layer" : 2, + "computedX" : 340.38, + "computedY" : 299.328, + "placementX" : 340.38, + "placementY" : 299.328, + "placementWidth" : 224.396, + "placementHeight" : 63.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 224.396, + "contentHeight" : 63.0, + "margin" : { + "top" : 6.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 309.88 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/Totals[5]/TotalRow[0]", + "entityName" : "TotalRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 340.38, + "computedY" : 347.328, + "placementX" : 340.38, + "placementY" : 347.328, + "placementWidth" : 224.396, + "placementHeight" : 15.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 224.396, + "contentHeight" : 15.0, + "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" : "ConsultingInvoice[0]/Totals[5]/TotalRow[0]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]/TotalRow[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 340.38, + "computedY" : 350.04, + "placementX" : 340.38, + "placementY" : 350.04, + "placementWidth" : 48.301, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 48.301, + "contentHeight" : 9.576, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 13.0 + } + }, { + "path" : "ConsultingInvoice[0]/Totals[5]/TotalRow[0]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]/TotalRow[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 340.38, + "computedY" : 349.508, + "placementX" : 340.38, + "placementY" : 349.508, + "placementWidth" : 224.396, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 224.396, + "contentHeight" : 10.64, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 10.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/Totals[5]/TotalRow[1]", + "entityName" : "TotalRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 340.38, + "computedY" : 331.328, + "placementX" : 340.38, + "placementY" : 331.328, + "placementWidth" : 224.396, + "placementHeight" : 15.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 224.396, + "contentHeight" : 15.0, + "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" : "ConsultingInvoice[0]/Totals[5]/TotalRow[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]/TotalRow[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 340.38, + "computedY" : 334.04, + "placementX" : 340.38, + "placementY" : 334.04, + "placementWidth" : 47.419, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 47.419, + "contentHeight" : 9.576, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 13.0 + } + }, { + "path" : "ConsultingInvoice[0]/Totals[5]/TotalRow[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]/TotalRow[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 340.38, + "computedY" : 333.508, + "placementX" : 340.38, + "placementY" : 333.508, + "placementWidth" : 224.396, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 224.396, + "contentHeight" : 10.64, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 10.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/Totals[5]/LineNode[2]", + "entityName" : null, + "entityKind" : "LineNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]", + "childIndex" : 2, + "depth" : 3, + "layer" : 3, + "computedX" : 340.38, + "computedY" : 327.328, + "placementX" : 340.38, + "placementY" : 327.328, + "placementWidth" : 224.396, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 224.396, + "contentHeight" : 1.0, + "margin" : { + "top" : 2.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/Totals[5]/TotalDue[3]", + "entityName" : "TotalDue", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]", + "childIndex" : 3, + "depth" : 3, + "layer" : 3, + "computedX" : 340.38, + "computedY" : 299.328, + "placementX" : 340.38, + "placementY" : 299.328, + "placementWidth" : 224.396, + "placementHeight" : 27.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 224.396, + "contentHeight" : 27.0, + "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" : "ConsultingInvoice[0]/Totals[5]/TotalDue[3]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]/TotalDue[3]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 340.38, + "computedY" : 307.508, + "placementX" : 340.38, + "placementY" : 307.508, + "placementWidth" : 79.135, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 79.135, + "contentHeight" : 10.64, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 13.0 + } + }, { + "path" : "ConsultingInvoice[0]/Totals[5]/TotalDue[3]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]/TotalDue[3]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 340.38, + "computedY" : 303.252, + "placementX" : 340.38, + "placementY" : 303.252, + "placementWidth" : 224.396, + "placementHeight" : 19.152, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 224.396, + "contentHeight" : 19.152, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 10.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/LineNode[6]", + "entityName" : null, + "entityKind" : "LineNode", + "parentPath" : "ConsultingInvoice[0]", + "childIndex" : 6, + "depth" : 2, + "layer" : 2, + "computedX" : 30.5, + "computedY" : 293.328, + "placementX" : 30.5, + "placementY" : 293.328, + "placementWidth" : 534.276, + "placementHeight" : 1.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 534.276, + "contentHeight" : 1.0, + "margin" : { + "top" : 5.0, + "right" : 0.0, + "bottom" : 5.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/PaymentAndNotes[7]", + "entityName" : "PaymentAndNotes", + "entityKind" : "RowNode", + "parentPath" : "ConsultingInvoice[0]", + "childIndex" : 7, + "depth" : 2, + "layer" : 2, + "computedX" : 30.5, + "computedY" : 169.316, + "placementX" : 30.5, + "placementY" : 169.316, + "placementWidth" : 534.276, + "placementHeight" : 119.012, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 534.276, + "contentHeight" : 119.012, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]", + "entityName" : "PaymentInformation", + "entityKind" : "SectionNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 30.5, + "computedY" : 169.316, + "placementX" : 30.5, + "placementY" : 169.316, + "placementWidth" : 276.629, + "placementHeight" : 119.012, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 276.629, + "contentHeight" : 119.012, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 276.092, + "placementX" : 30.5, + "placementY" : 276.092, + "placementWidth" : 139.604, + "placementHeight" : 12.236, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 139.604, + "contentHeight" : 12.236, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/LineNode[1]", + "entityName" : null, + "entityKind" : "LineNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 267.892, + "placementX" : 30.5, + "placementY" : 267.892, + "placementWidth" : 30.0, + "placementHeight" : 1.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 30.0, + "contentHeight" : 1.2, + "margin" : { + "top" : 4.0, + "right" : 0.0, + "bottom" : 4.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]", + "entityName" : "BankInformationBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 185.892, + "placementX" : 30.5, + "placementY" : 185.892, + "placementWidth" : 276.629, + "placementHeight" : 75.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 276.629, + "contentHeight" : 75.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankBadge[0]", + "entityName" : "BankBadge", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 30.5, + "computedY" : 204.392, + "placementX" : 30.5, + "placementY" : 204.392, + "placementWidth" : 38.0, + "placementHeight" : 38.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 38.0, + "contentHeight" : 38.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankBadge[0]/Icon-bank[0]", + "entityName" : "Icon-bank", + "entityKind" : "ImageNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankBadge[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 39.75, + "computedY" : 213.642, + "placementX" : 39.75, + "placementY" : 213.642, + "placementWidth" : 19.5, + "placementHeight" : 19.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 19.5, + "contentHeight" : 19.5, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]", + "entityName" : "BankDetails", + "entityKind" : "SectionNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 88.5, + "computedY" : 185.892, + "placementX" : 88.5, + "placementY" : 185.892, + "placementWidth" : 215.629, + "placementHeight" : 75.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 215.629, + "contentHeight" : 75.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[0]", + "entityName" : "BankField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 88.5, + "computedY" : 245.892, + "placementX" : 88.5, + "placementY" : 245.892, + "placementWidth" : 215.629, + "placementHeight" : 15.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 215.629, + "contentHeight" : 15.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[0]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 88.5, + "computedY" : 248.604, + "placementX" : 88.5, + "placementY" : 248.604, + "placementWidth" : 42.627, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 42.627, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[0]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[0]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 164.5, + "computedY" : 248.604, + "placementX" : 164.5, + "placementY" : 248.604, + "placementWidth" : 47.545, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 47.545, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[1]", + "entityName" : "BankField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 88.5, + "computedY" : 230.892, + "placementX" : 88.5, + "placementY" : 230.892, + "placementWidth" : 215.629, + "placementHeight" : 15.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 215.629, + "contentHeight" : 15.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[1]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 88.5, + "computedY" : 233.604, + "placementX" : 88.5, + "placementY" : 233.604, + "placementWidth" : 54.31, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 54.31, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[1]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 164.5, + "computedY" : 233.604, + "placementX" : 164.5, + "placementY" : 233.604, + "placementWidth" : 98.845, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 98.845, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[2]", + "entityName" : "BankField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 88.5, + "computedY" : 215.892, + "placementX" : 88.5, + "placementY" : 215.892, + "placementWidth" : 215.629, + "placementHeight" : 15.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 215.629, + "contentHeight" : 15.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[2]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[2]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 88.5, + "computedY" : 218.604, + "placementX" : 88.5, + "placementY" : 218.604, + "placementWidth" : 15.164, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 15.164, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[2]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[2]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 164.5, + "computedY" : 218.604, + "placementX" : 164.5, + "placementY" : 218.604, + "placementWidth" : 26.861, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 26.861, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[3]", + "entityName" : "BankField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]", + "childIndex" : 3, + "depth" : 6, + "layer" : 6, + "computedX" : 88.5, + "computedY" : 200.892, + "placementX" : 88.5, + "placementY" : 200.892, + "placementWidth" : 215.629, + "placementHeight" : 15.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 215.629, + "contentHeight" : 15.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[3]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[3]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 88.5, + "computedY" : 203.604, + "placementX" : 88.5, + "placementY" : 203.604, + "placementWidth" : 61.847, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 61.847, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[3]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[3]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 164.5, + "computedY" : 203.604, + "placementX" : 164.5, + "placementY" : 203.604, + "placementWidth" : 31.143, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 31.143, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[4]", + "entityName" : "BankField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]", + "childIndex" : 4, + "depth" : 6, + "layer" : 6, + "computedX" : 88.5, + "computedY" : 185.892, + "placementX" : 88.5, + "placementY" : 185.892, + "placementWidth" : 215.629, + "placementHeight" : 15.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 215.629, + "contentHeight" : 15.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[4]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[4]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 88.5, + "computedY" : 188.604, + "placementX" : 88.5, + "placementY" : 188.604, + "placementWidth" : 37.394, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 37.394, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[4]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[4]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 164.5, + "computedY" : 188.604, + "placementX" : 164.5, + "placementY" : 188.604, + "placementWidth" : 51.758, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 51.758, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/ParagraphNode[3]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 169.316, + "placementX" : 30.5, + "placementY" : 169.316, + "placementWidth" : 246.452, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 246.452, + "contentHeight" : 9.576, + "margin" : { + "top" : 4.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]", + "entityName" : "Notes", + "entityKind" : "SectionNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 329.129, + "computedY" : 175.732, + "placementX" : 329.129, + "placementY" : 175.732, + "placementWidth" : 235.647, + "placementHeight" : 112.596, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 235.647, + "contentHeight" : 112.596, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 24.0 + } + }, { + "path" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 353.129, + "computedY" : 276.092, + "placementX" : 353.129, + "placementY" : 276.092, + "placementWidth" : 36.122, + "placementHeight" : 12.236, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 36.122, + "contentHeight" : 12.236, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/LineNode[1]", + "entityName" : null, + "entityKind" : "LineNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 353.129, + "computedY" : 267.892, + "placementX" : 353.129, + "placementY" : 267.892, + "placementWidth" : 30.0, + "placementHeight" : 1.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 30.0, + "contentHeight" : 1.2, + "margin" : { + "top" : 4.0, + "right" : 0.0, + "bottom" : 4.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 353.129, + "computedY" : 250.252, + "placementX" : 353.129, + "placementY" : 250.252, + "placementWidth" : 107.0, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 107.0, + "contentHeight" : 10.64, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/ParagraphNode[3]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 353.129, + "computedY" : 212.732, + "placementX" : 353.129, + "placementY" : 212.732, + "placementWidth" : 210.11, + "placementHeight" : 34.52, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 210.11, + "contentHeight" : 34.52, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/PaymentTerms[4]", + "entityName" : "PaymentTerms", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]", + "childIndex" : 4, + "depth" : 4, + "layer" : 4, + "computedX" : 353.129, + "computedY" : 175.732, + "placementX" : 353.129, + "placementY" : 175.732, + "placementWidth" : 211.647, + "placementHeight" : 34.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 211.647, + "contentHeight" : 34.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/PaymentTerms[4]/CalendarBadge[0]", + "entityName" : "CalendarBadge", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/PaymentTerms[4]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 361.129, + "computedY" : 181.232, + "placementX" : 361.129, + "placementY" : 181.232, + "placementWidth" : 23.0, + "placementHeight" : 23.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 23.0, + "contentHeight" : 23.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/PaymentTerms[4]/CalendarBadge[0]/Icon-payment-calendar[0]", + "entityName" : "Icon-payment-calendar", + "entityKind" : "ImageNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/PaymentTerms[4]/CalendarBadge[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 366.379, + "computedY" : 186.482, + "placementX" : 366.379, + "placementY" : 186.482, + "placementWidth" : 12.5, + "placementHeight" : 12.5, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 12.5, + "contentHeight" : 12.5, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/PaymentTerms[4]/DueNotice[1]", + "entityName" : "DueNotice", + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/PaymentTerms[4]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 395.129, + "computedY" : 188.689, + "placementX" : 395.129, + "placementY" : 188.689, + "placementWidth" : 150.049, + "placementHeight" : 8.086, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 150.049, + "contentHeight" : 8.086, + "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 + } + } ] +} diff --git a/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/consulting_invoice_overflow_layout.json b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/consulting_invoice_overflow_layout.json new file mode 100644 index 000000000..fda4ec506 --- /dev/null +++ b/qa/src/test/resources/layout-snapshots/canonical-templates/invoice/consulting_invoice_overflow_layout.json @@ -0,0 +1,2867 @@ +{ + "formatVersion" : "2.0", + "canvas" : { + "pageWidth" : 595.276, + "pageHeight" : 841.89, + "innerWidth" : 534.276, + "innerHeight" : 780.89, + "margin" : { + "top" : 30.5, + "right" : 30.5, + "bottom" : 30.5, + "left" : 30.5 + } + }, + "totalPages" : 2, + "nodes" : [ { + "path" : "ConsultingInvoice[0]", + "entityName" : "ConsultingInvoice", + "entityKind" : "ContainerNode", + "parentPath" : null, + "childIndex" : 0, + "depth" : 1, + "layer" : 1, + "computedX" : 30.5, + "computedY" : -478.114, + "placementX" : 30.5, + "placementY" : -478.114, + "placementWidth" : 534.276, + "placementHeight" : 1289.504, + "startPage" : 0, + "endPage" : 1, + "contentWidth" : 534.276, + "contentHeight" : 1289.504, + "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" : "ConsultingInvoice[0]/Masthead[0]", + "entityName" : "Masthead", + "entityKind" : "RowNode", + "parentPath" : "ConsultingInvoice[0]", + "childIndex" : 0, + "depth" : 2, + "layer" : 2, + "computedX" : 30.5, + "computedY" : 675.406, + "placementX" : 30.5, + "placementY" : 675.406, + "placementWidth" : 534.276, + "placementHeight" : 135.984, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 534.276, + "contentHeight" : 135.984, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]", + "entityName" : "SupplierHeader", + "entityKind" : "SectionNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 30.5, + "computedY" : 682.39, + "placementX" : 30.5, + "placementY" : 682.39, + "placementWidth" : 259.731, + "placementHeight" : 129.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 259.731, + "contentHeight" : 129.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/BrandLogoBox[0]", + "entityName" : "BrandLogoBox", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 747.39, + "placementX" : 30.5, + "placementY" : 747.39, + "placementWidth" : 259.731, + "placementHeight" : 64.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 259.731, + "contentHeight" : 64.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/BrandLogoBox[0]/BrandLogo[0]", + "entityName" : "BrandLogo", + "entityKind" : "ImageNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/BrandLogoBox[0]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 30.5, + "computedY" : 747.39, + "placementX" : 30.5, + "placementY" : 747.39, + "placementWidth" : 164.874, + "placementHeight" : 64.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 164.874, + "contentHeight" : 64.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[1]", + "entityName" : "ContactBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 727.39, + "placementX" : 30.5, + "placementY" : 727.39, + "placementWidth" : 259.731, + "placementHeight" : 18.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 259.731, + "contentHeight" : 18.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[1]/Icon-location[0]", + "entityName" : "Icon-location", + "entityKind" : "ImageNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 30.5, + "computedY" : 731.39, + "placementX" : 30.5, + "placementY" : 731.39, + "placementWidth" : 10.0, + "placementHeight" : 10.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 10.0, + "contentHeight" : 10.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 53.5, + "computedY" : 725.088, + "placementX" : 53.5, + "placementY" : 725.088, + "placementWidth" : 100.555, + "placementHeight" : 20.302, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 100.555, + "contentHeight" : 20.302, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[2]", + "entityName" : "ContactBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 712.39, + "placementX" : 30.5, + "placementY" : 712.39, + "placementWidth" : 259.731, + "placementHeight" : 13.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 259.731, + "contentHeight" : 13.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[2]/Icon-phone[0]", + "entityName" : "Icon-phone", + "entityKind" : "ImageNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 30.5, + "computedY" : 714.29, + "placementX" : 30.5, + "placementY" : 714.29, + "placementWidth" : 9.2, + "placementHeight" : 9.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 9.2, + "contentHeight" : 9.2, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[2]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[2]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 53.5, + "computedY" : 714.102, + "placementX" : 53.5, + "placementY" : 714.102, + "placementWidth" : 53.974, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 53.974, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[3]", + "entityName" : "ContactBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 697.39, + "placementX" : 30.5, + "placementY" : 697.39, + "placementWidth" : 259.731, + "placementHeight" : 13.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 259.731, + "contentHeight" : 13.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[3]/Icon-email[0]", + "entityName" : "Icon-email", + "entityKind" : "ImageNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[3]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 30.5, + "computedY" : 699.29, + "placementX" : 30.5, + "placementY" : 699.29, + "placementWidth" : 9.2, + "placementHeight" : 9.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 9.2, + "contentHeight" : 9.2, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[3]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[3]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 53.5, + "computedY" : 699.102, + "placementX" : 53.5, + "placementY" : 699.102, + "placementWidth" : 86.464, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 86.464, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[4]", + "entityName" : "ContactBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]", + "childIndex" : 4, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 682.39, + "placementX" : 30.5, + "placementY" : 682.39, + "placementWidth" : 259.731, + "placementHeight" : 13.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 259.731, + "contentHeight" : 13.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[4]/Icon-website[0]", + "entityName" : "Icon-website", + "entityKind" : "ImageNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[4]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 30.5, + "computedY" : 684.19, + "placementX" : 30.5, + "placementY" : 684.19, + "placementWidth" : 9.4, + "placementHeight" : 9.4, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 9.4, + "contentHeight" : 9.4, + "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" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[4]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/SupplierHeader[0]/ContactBand[4]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 53.5, + "computedY" : 684.102, + "placementX" : 53.5, + "placementY" : 684.102, + "placementWidth" : 63.174, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 63.174, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]", + "entityName" : "InvoiceHeader", + "entityKind" : "SectionNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 315.231, + "computedY" : 675.406, + "placementX" : 315.231, + "placementY" : 675.406, + "placementWidth" : 249.545, + "placementHeight" : 135.984, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 249.545, + "contentHeight" : 135.984, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 24.0 + } + }, { + "path" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 339.231, + "computedY" : 778.406, + "placementX" : 339.231, + "placementY" : 778.406, + "placementWidth" : 128.001, + "placementHeight" : 32.984, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 128.001, + "contentHeight" : 32.984, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 8.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[1]", + "entityName" : "MetadataBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 339.231, + "computedY" : 751.406, + "placementX" : 339.231, + "placementY" : 751.406, + "placementWidth" : 225.545, + "placementHeight" : 18.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 225.545, + "contentHeight" : 18.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[1]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 339.231, + "computedY" : 755.618, + "placementX" : 339.231, + "placementY" : 755.618, + "placementWidth" : 57.812, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 57.812, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[1]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 447.492, + "computedY" : 755.086, + "placementX" : 447.492, + "placementY" : 755.086, + "placementWidth" : 57.509, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 57.509, + "contentHeight" : 10.64, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[2]", + "entityName" : "MetadataBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 339.231, + "computedY" : 732.406, + "placementX" : 339.231, + "placementY" : 732.406, + "placementWidth" : 225.545, + "placementHeight" : 18.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 225.545, + "contentHeight" : 18.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[2]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 339.231, + "computedY" : 736.618, + "placementX" : 339.231, + "placementY" : 736.618, + "placementWidth" : 38.475, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 38.475, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[2]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[2]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 447.492, + "computedY" : 736.086, + "placementX" : 447.492, + "placementY" : 736.086, + "placementWidth" : 47.5, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 47.5, + "contentHeight" : 10.64, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[3]", + "entityName" : "MetadataBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 339.231, + "computedY" : 713.406, + "placementX" : 339.231, + "placementY" : 713.406, + "placementWidth" : 225.545, + "placementHeight" : 18.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 225.545, + "contentHeight" : 18.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[3]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[3]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 339.231, + "computedY" : 717.618, + "placementX" : 339.231, + "placementY" : 717.618, + "placementWidth" : 33.796, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 33.796, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[3]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[3]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 447.492, + "computedY" : 717.086, + "placementX" : 447.492, + "placementY" : 717.086, + "placementWidth" : 50.396, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 50.396, + "contentHeight" : 10.64, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[4]", + "entityName" : "MetadataBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]", + "childIndex" : 4, + "depth" : 4, + "layer" : 4, + "computedX" : 339.231, + "computedY" : 694.406, + "placementX" : 339.231, + "placementY" : 694.406, + "placementWidth" : 225.545, + "placementHeight" : 18.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 225.545, + "contentHeight" : 18.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[4]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[4]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 339.231, + "computedY" : 698.618, + "placementX" : 339.231, + "placementY" : 698.618, + "placementWidth" : 26.635, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 26.635, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[4]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[4]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 447.492, + "computedY" : 698.086, + "placementX" : 447.492, + "placementY" : 698.086, + "placementWidth" : 109.235, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 109.235, + "contentHeight" : 10.64, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[5]", + "entityName" : "MetadataBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]", + "childIndex" : 5, + "depth" : 4, + "layer" : 4, + "computedX" : 339.231, + "computedY" : 675.406, + "placementX" : 339.231, + "placementY" : 675.406, + "placementWidth" : 225.545, + "placementHeight" : 18.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 225.545, + "contentHeight" : 18.0, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[5]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[5]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 339.231, + "computedY" : 679.618, + "placementX" : 339.231, + "placementY" : 679.618, + "placementWidth" : 41.82, + "placementHeight" : 9.576, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 41.82, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[5]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Masthead[0]/InvoiceHeader[1]/MetadataBand[5]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 447.492, + "computedY" : 679.086, + "placementX" : 447.492, + "placementY" : 679.086, + "placementWidth" : 32.665, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 32.665, + "contentHeight" : 10.64, + "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" : "ConsultingInvoice[0]/SpacerNode[1]", + "entityName" : null, + "entityKind" : "SpacerNode", + "parentPath" : "ConsultingInvoice[0]", + "childIndex" : 1, + "depth" : 2, + "layer" : 2, + "computedX" : 30.5, + "computedY" : 659.406, + "placementX" : 30.5, + "placementY" : 659.406, + "placementWidth" : 0.0, + "placementHeight" : 16.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 0.0, + "contentHeight" : 16.0, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]", + "entityName" : "PartiesAndSummary", + "entityKind" : "RowNode", + "parentPath" : "ConsultingInvoice[0]", + "childIndex" : 2, + "depth" : 2, + "layer" : 2, + "computedX" : 30.5, + "computedY" : 561.63, + "placementX" : 30.5, + "placementY" : 561.63, + "placementWidth" : 534.276, + "placementHeight" : 97.776, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 534.276, + "contentHeight" : 97.776, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]", + "entityName" : "BilledTo", + "entityKind" : "SectionNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 30.5, + "computedY" : 561.63, + "placementX" : 30.5, + "placementY" : 561.63, + "placementWidth" : 116.538, + "placementHeight" : 97.776, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 116.538, + "contentHeight" : 97.776, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 647.17, + "placementX" : 30.5, + "placementY" : 647.17, + "placementWidth" : 56.469, + "placementHeight" : 12.236, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 56.469, + "contentHeight" : 12.236, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]/LineNode[1]", + "entityName" : null, + "entityKind" : "LineNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 640.47, + "placementX" : 30.5, + "placementY" : 640.47, + "placementWidth" : 30.0, + "placementHeight" : 1.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 30.0, + "contentHeight" : 1.2, + "margin" : { + "top" : 4.0, + "right" : 0.0, + "bottom" : 4.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 624.33, + "placementX" : 30.5, + "placementY" : 624.33, + "placementWidth" : 97.219, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 97.219, + "contentHeight" : 10.64, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]/ParagraphNode[3]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 612.19, + "placementX" : 30.5, + "placementY" : 612.19, + "placementWidth" : 116.538, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 116.538, + "contentHeight" : 10.64, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]/ParagraphNode[4]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]", + "childIndex" : 4, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 578.77, + "placementX" : 30.5, + "placementY" : 578.77, + "placementWidth" : 76.129, + "placementHeight" : 31.92, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 76.129, + "contentHeight" : 31.92, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]/ParagraphNode[5]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/BilledTo[0]", + "childIndex" : 5, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 561.63, + "placementX" : 30.5, + "placementY" : 561.63, + "placementWidth" : 114.008, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 114.008, + "contentHeight" : 10.64, + "margin" : { + "top" : 5.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/PartiesAndSummary[2]/InvoiceSummary[1]", + "entityName" : "InvoiceSummary", + "entityKind" : "SectionNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 340.102, + "computedY" : 601.7, + "placementX" : 340.102, + "placementY" : 601.7, + "placementWidth" : 205.246, + "placementHeight" : 57.706, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 205.246, + "contentHeight" : 57.706, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]/InvoiceSummary[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/InvoiceSummary[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 340.102, + "computedY" : 647.17, + "placementX" : 340.102, + "placementY" : 647.17, + "placementWidth" : 109.748, + "placementHeight" : 12.236, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 109.748, + "contentHeight" : 12.236, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]/InvoiceSummary[1]/LineNode[1]", + "entityName" : null, + "entityKind" : "LineNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/InvoiceSummary[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 340.102, + "computedY" : 640.97, + "placementX" : 340.102, + "placementY" : 640.97, + "placementWidth" : 30.0, + "placementHeight" : 1.2, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 30.0, + "contentHeight" : 1.2, + "margin" : { + "top" : 4.0, + "right" : 0.0, + "bottom" : 4.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/PartiesAndSummary[2]/InvoiceSummary[1]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/InvoiceSummary[1]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 340.102, + "computedY" : 613.34, + "placementX" : 340.102, + "placementY" : 613.34, + "placementWidth" : 205.246, + "placementHeight" : 22.63, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 205.246, + "contentHeight" : 22.63, + "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" : "ConsultingInvoice[0]/PartiesAndSummary[2]/InvoiceSummary[1]/ParagraphNode[3]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PartiesAndSummary[2]/InvoiceSummary[1]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 340.102, + "computedY" : 601.7, + "placementX" : 340.102, + "placementY" : 601.7, + "placementWidth" : 100.259, + "placementHeight" : 10.64, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 100.259, + "contentHeight" : 10.64, + "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" : "ConsultingInvoice[0]/SpacerNode[3]", + "entityName" : null, + "entityKind" : "SpacerNode", + "parentPath" : "ConsultingInvoice[0]", + "childIndex" : 3, + "depth" : 2, + "layer" : 2, + "computedX" : 30.5, + "computedY" : 551.63, + "placementX" : 30.5, + "placementY" : 551.63, + "placementWidth" : 0.0, + "placementHeight" : 10.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 0.0, + "contentHeight" : 10.0, + "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" : "ConsultingInvoice[0]/LineItems[4]", + "entityName" : "LineItems", + "entityKind" : "TableNode", + "parentPath" : "ConsultingInvoice[0]", + "childIndex" : 4, + "depth" : 2, + "layer" : 2, + "computedX" : 30.5, + "computedY" : 60.028, + "placementX" : 30.5, + "placementY" : 60.028, + "placementWidth" : 534.276, + "placementHeight" : 830.732, + "startPage" : 0, + "endPage" : 1, + "contentWidth" : 534.276, + "contentHeight" : 830.732, + "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" : "ConsultingInvoice[0]/Totals[5]", + "entityName" : "Totals", + "entityKind" : "SectionNode", + "parentPath" : "ConsultingInvoice[0]", + "childIndex" : 5, + "depth" : 2, + "layer" : 2, + "computedX" : 340.38, + "computedY" : 374.108, + "placementX" : 340.38, + "placementY" : 374.108, + "placementWidth" : 224.396, + "placementHeight" : 63.0, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 224.396, + "contentHeight" : 63.0, + "margin" : { + "top" : 6.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 309.88 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/Totals[5]/TotalRow[0]", + "entityName" : "TotalRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 340.38, + "computedY" : 422.108, + "placementX" : 340.38, + "placementY" : 422.108, + "placementWidth" : 224.396, + "placementHeight" : 15.0, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 224.396, + "contentHeight" : 15.0, + "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" : "ConsultingInvoice[0]/Totals[5]/TotalRow[0]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]/TotalRow[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 340.38, + "computedY" : 424.82, + "placementX" : 340.38, + "placementY" : 424.82, + "placementWidth" : 48.301, + "placementHeight" : 9.576, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 48.301, + "contentHeight" : 9.576, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 13.0 + } + }, { + "path" : "ConsultingInvoice[0]/Totals[5]/TotalRow[0]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]/TotalRow[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 340.38, + "computedY" : 424.288, + "placementX" : 340.38, + "placementY" : 424.288, + "placementWidth" : 224.396, + "placementHeight" : 10.64, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 224.396, + "contentHeight" : 10.64, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 10.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/Totals[5]/TotalRow[1]", + "entityName" : "TotalRow", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 340.38, + "computedY" : 406.108, + "placementX" : 340.38, + "placementY" : 406.108, + "placementWidth" : 224.396, + "placementHeight" : 15.0, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 224.396, + "contentHeight" : 15.0, + "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" : "ConsultingInvoice[0]/Totals[5]/TotalRow[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]/TotalRow[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 340.38, + "computedY" : 408.82, + "placementX" : 340.38, + "placementY" : 408.82, + "placementWidth" : 47.419, + "placementHeight" : 9.576, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 47.419, + "contentHeight" : 9.576, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 13.0 + } + }, { + "path" : "ConsultingInvoice[0]/Totals[5]/TotalRow[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]/TotalRow[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 340.38, + "computedY" : 408.288, + "placementX" : 340.38, + "placementY" : 408.288, + "placementWidth" : 224.396, + "placementHeight" : 10.64, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 224.396, + "contentHeight" : 10.64, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 10.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/Totals[5]/LineNode[2]", + "entityName" : null, + "entityKind" : "LineNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]", + "childIndex" : 2, + "depth" : 3, + "layer" : 3, + "computedX" : 340.38, + "computedY" : 402.108, + "placementX" : 340.38, + "placementY" : 402.108, + "placementWidth" : 224.396, + "placementHeight" : 1.0, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 224.396, + "contentHeight" : 1.0, + "margin" : { + "top" : 2.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/Totals[5]/TotalDue[3]", + "entityName" : "TotalDue", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]", + "childIndex" : 3, + "depth" : 3, + "layer" : 3, + "computedX" : 340.38, + "computedY" : 374.108, + "placementX" : 340.38, + "placementY" : 374.108, + "placementWidth" : 224.396, + "placementHeight" : 27.0, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 224.396, + "contentHeight" : 27.0, + "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" : "ConsultingInvoice[0]/Totals[5]/TotalDue[3]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]/TotalDue[3]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 340.38, + "computedY" : 382.288, + "placementX" : 340.38, + "placementY" : 382.288, + "placementWidth" : 79.135, + "placementHeight" : 10.64, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 79.135, + "contentHeight" : 10.64, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 13.0 + } + }, { + "path" : "ConsultingInvoice[0]/Totals[5]/TotalDue[3]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/Totals[5]/TotalDue[3]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 340.38, + "computedY" : 378.032, + "placementX" : 340.38, + "placementY" : 378.032, + "placementWidth" : 224.396, + "placementHeight" : 19.152, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 224.396, + "contentHeight" : 19.152, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 10.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/LineNode[6]", + "entityName" : null, + "entityKind" : "LineNode", + "parentPath" : "ConsultingInvoice[0]", + "childIndex" : 6, + "depth" : 2, + "layer" : 2, + "computedX" : 30.5, + "computedY" : 368.108, + "placementX" : 30.5, + "placementY" : 368.108, + "placementWidth" : 534.276, + "placementHeight" : 1.0, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 534.276, + "contentHeight" : 1.0, + "margin" : { + "top" : 5.0, + "right" : 0.0, + "bottom" : 5.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/PaymentAndNotes[7]", + "entityName" : "PaymentAndNotes", + "entityKind" : "RowNode", + "parentPath" : "ConsultingInvoice[0]", + "childIndex" : 7, + "depth" : 2, + "layer" : 2, + "computedX" : 30.5, + "computedY" : 244.096, + "placementX" : 30.5, + "placementY" : 244.096, + "placementWidth" : 534.276, + "placementHeight" : 119.012, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 534.276, + "contentHeight" : 119.012, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]", + "entityName" : "PaymentInformation", + "entityKind" : "SectionNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]", + "childIndex" : 0, + "depth" : 3, + "layer" : 3, + "computedX" : 30.5, + "computedY" : 244.096, + "placementX" : 30.5, + "placementY" : 244.096, + "placementWidth" : 276.629, + "placementHeight" : 119.012, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 276.629, + "contentHeight" : 119.012, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 350.872, + "placementX" : 30.5, + "placementY" : 350.872, + "placementWidth" : 139.604, + "placementHeight" : 12.236, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 139.604, + "contentHeight" : 12.236, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/LineNode[1]", + "entityName" : null, + "entityKind" : "LineNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 342.672, + "placementX" : 30.5, + "placementY" : 342.672, + "placementWidth" : 30.0, + "placementHeight" : 1.2, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 30.0, + "contentHeight" : 1.2, + "margin" : { + "top" : 4.0, + "right" : 0.0, + "bottom" : 4.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]", + "entityName" : "BankInformationBand", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 260.672, + "placementX" : 30.5, + "placementY" : 260.672, + "placementWidth" : 276.629, + "placementHeight" : 75.0, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 276.629, + "contentHeight" : 75.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankBadge[0]", + "entityName" : "BankBadge", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 30.5, + "computedY" : 279.172, + "placementX" : 30.5, + "placementY" : 279.172, + "placementWidth" : 38.0, + "placementHeight" : 38.0, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 38.0, + "contentHeight" : 38.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankBadge[0]/Icon-bank[0]", + "entityName" : "Icon-bank", + "entityKind" : "ImageNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankBadge[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 39.75, + "computedY" : 288.422, + "placementX" : 39.75, + "placementY" : 288.422, + "placementWidth" : 19.5, + "placementHeight" : 19.5, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 19.5, + "contentHeight" : 19.5, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]", + "entityName" : "BankDetails", + "entityKind" : "SectionNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 88.5, + "computedY" : 260.672, + "placementX" : 88.5, + "placementY" : 260.672, + "placementWidth" : 215.629, + "placementHeight" : 75.0, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 215.629, + "contentHeight" : 75.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[0]", + "entityName" : "BankField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 88.5, + "computedY" : 320.672, + "placementX" : 88.5, + "placementY" : 320.672, + "placementWidth" : 215.629, + "placementHeight" : 15.0, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 215.629, + "contentHeight" : 15.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[0]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[0]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 88.5, + "computedY" : 323.384, + "placementX" : 88.5, + "placementY" : 323.384, + "placementWidth" : 42.627, + "placementHeight" : 9.576, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 42.627, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[0]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[0]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 164.5, + "computedY" : 323.384, + "placementX" : 164.5, + "placementY" : 323.384, + "placementWidth" : 47.545, + "placementHeight" : 9.576, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 47.545, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[1]", + "entityName" : "BankField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]", + "childIndex" : 1, + "depth" : 6, + "layer" : 6, + "computedX" : 88.5, + "computedY" : 305.672, + "placementX" : 88.5, + "placementY" : 305.672, + "placementWidth" : 215.629, + "placementHeight" : 15.0, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 215.629, + "contentHeight" : 15.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[1]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 88.5, + "computedY" : 308.384, + "placementX" : 88.5, + "placementY" : 308.384, + "placementWidth" : 54.31, + "placementHeight" : 9.576, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 54.31, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[1]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[1]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 164.5, + "computedY" : 308.384, + "placementX" : 164.5, + "placementY" : 308.384, + "placementWidth" : 98.845, + "placementHeight" : 9.576, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 98.845, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[2]", + "entityName" : "BankField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]", + "childIndex" : 2, + "depth" : 6, + "layer" : 6, + "computedX" : 88.5, + "computedY" : 290.672, + "placementX" : 88.5, + "placementY" : 290.672, + "placementWidth" : 215.629, + "placementHeight" : 15.0, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 215.629, + "contentHeight" : 15.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[2]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[2]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 88.5, + "computedY" : 293.384, + "placementX" : 88.5, + "placementY" : 293.384, + "placementWidth" : 15.164, + "placementHeight" : 9.576, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 15.164, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[2]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[2]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 164.5, + "computedY" : 293.384, + "placementX" : 164.5, + "placementY" : 293.384, + "placementWidth" : 26.861, + "placementHeight" : 9.576, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 26.861, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[3]", + "entityName" : "BankField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]", + "childIndex" : 3, + "depth" : 6, + "layer" : 6, + "computedX" : 88.5, + "computedY" : 275.672, + "placementX" : 88.5, + "placementY" : 275.672, + "placementWidth" : 215.629, + "placementHeight" : 15.0, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 215.629, + "contentHeight" : 15.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[3]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[3]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 88.5, + "computedY" : 278.384, + "placementX" : 88.5, + "placementY" : 278.384, + "placementWidth" : 61.847, + "placementHeight" : 9.576, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 61.847, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[3]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[3]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 164.5, + "computedY" : 278.384, + "placementX" : 164.5, + "placementY" : 278.384, + "placementWidth" : 31.143, + "placementHeight" : 9.576, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 31.143, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[4]", + "entityName" : "BankField", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]", + "childIndex" : 4, + "depth" : 6, + "layer" : 6, + "computedX" : 88.5, + "computedY" : 260.672, + "placementX" : 88.5, + "placementY" : 260.672, + "placementWidth" : 215.629, + "placementHeight" : 15.0, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 215.629, + "contentHeight" : 15.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[4]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[4]", + "childIndex" : 0, + "depth" : 7, + "layer" : 7, + "computedX" : 88.5, + "computedY" : 263.384, + "placementX" : 88.5, + "placementY" : 263.384, + "placementWidth" : 37.394, + "placementHeight" : 9.576, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 37.394, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[4]/ParagraphNode[1]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/BankInformationBand[2]/BankDetails[1]/BankField[4]", + "childIndex" : 1, + "depth" : 7, + "layer" : 7, + "computedX" : 164.5, + "computedY" : 263.384, + "placementX" : 164.5, + "placementY" : 263.384, + "placementWidth" : 51.758, + "placementHeight" : 9.576, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 51.758, + "contentHeight" : 9.576, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]/ParagraphNode[3]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/PaymentInformation[0]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 30.5, + "computedY" : 244.096, + "placementX" : 30.5, + "placementY" : 244.096, + "placementWidth" : 246.452, + "placementHeight" : 9.576, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 246.452, + "contentHeight" : 9.576, + "margin" : { + "top" : 4.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]", + "entityName" : "Notes", + "entityKind" : "SectionNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]", + "childIndex" : 1, + "depth" : 3, + "layer" : 3, + "computedX" : 329.129, + "computedY" : 250.512, + "placementX" : 329.129, + "placementY" : 250.512, + "placementWidth" : 235.647, + "placementHeight" : 112.596, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 235.647, + "contentHeight" : 112.596, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 24.0 + } + }, { + "path" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/ParagraphNode[0]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]", + "childIndex" : 0, + "depth" : 4, + "layer" : 4, + "computedX" : 353.129, + "computedY" : 350.872, + "placementX" : 353.129, + "placementY" : 350.872, + "placementWidth" : 36.122, + "placementHeight" : 12.236, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 36.122, + "contentHeight" : 12.236, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/LineNode[1]", + "entityName" : null, + "entityKind" : "LineNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]", + "childIndex" : 1, + "depth" : 4, + "layer" : 4, + "computedX" : 353.129, + "computedY" : 342.672, + "placementX" : 353.129, + "placementY" : 342.672, + "placementWidth" : 30.0, + "placementHeight" : 1.2, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 30.0, + "contentHeight" : 1.2, + "margin" : { + "top" : 4.0, + "right" : 0.0, + "bottom" : 4.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/ParagraphNode[2]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]", + "childIndex" : 2, + "depth" : 4, + "layer" : 4, + "computedX" : 353.129, + "computedY" : 325.032, + "placementX" : 353.129, + "placementY" : 325.032, + "placementWidth" : 107.0, + "placementHeight" : 10.64, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 107.0, + "contentHeight" : 10.64, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/ParagraphNode[3]", + "entityName" : null, + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]", + "childIndex" : 3, + "depth" : 4, + "layer" : 4, + "computedX" : 353.129, + "computedY" : 287.512, + "placementX" : 353.129, + "placementY" : 287.512, + "placementWidth" : 210.11, + "placementHeight" : 34.52, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 210.11, + "contentHeight" : 34.52, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/PaymentTerms[4]", + "entityName" : "PaymentTerms", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]", + "childIndex" : 4, + "depth" : 4, + "layer" : 4, + "computedX" : 353.129, + "computedY" : 250.512, + "placementX" : 353.129, + "placementY" : 250.512, + "placementWidth" : 211.647, + "placementHeight" : 34.0, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 211.647, + "contentHeight" : 34.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/PaymentTerms[4]/CalendarBadge[0]", + "entityName" : "CalendarBadge", + "entityKind" : "ShapeContainerNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/PaymentTerms[4]", + "childIndex" : 0, + "depth" : 5, + "layer" : 5, + "computedX" : 361.129, + "computedY" : 256.012, + "placementX" : 361.129, + "placementY" : 256.012, + "placementWidth" : 23.0, + "placementHeight" : 23.0, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 23.0, + "contentHeight" : 23.0, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/PaymentTerms[4]/CalendarBadge[0]/Icon-payment-calendar[0]", + "entityName" : "Icon-payment-calendar", + "entityKind" : "ImageNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/PaymentTerms[4]/CalendarBadge[0]", + "childIndex" : 0, + "depth" : 6, + "layer" : 6, + "computedX" : 366.379, + "computedY" : 261.262, + "placementX" : 366.379, + "placementY" : 261.262, + "placementWidth" : 12.5, + "placementHeight" : 12.5, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 12.5, + "contentHeight" : 12.5, + "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" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/PaymentTerms[4]/DueNotice[1]", + "entityName" : "DueNotice", + "entityKind" : "ParagraphNode", + "parentPath" : "ConsultingInvoice[0]/PaymentAndNotes[7]/Notes[1]/PaymentTerms[4]", + "childIndex" : 1, + "depth" : 5, + "layer" : 5, + "computedX" : 395.129, + "computedY" : 263.469, + "placementX" : 395.129, + "placementY" : 263.469, + "placementWidth" : 150.049, + "placementHeight" : 8.086, + "startPage" : 1, + "endPage" : 1, + "contentWidth" : 150.049, + "contentHeight" : 8.086, + "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 + } + } ] +} diff --git a/qa/src/test/resources/sample-data/consulting-invoice-logo.png b/qa/src/test/resources/sample-data/consulting-invoice-logo.png new file mode 100644 index 000000000..e1a37e806 Binary files /dev/null and b/qa/src/test/resources/sample-data/consulting-invoice-logo.png differ diff --git a/qa/src/test/resources/visual-baselines/invoice-v2-layered/consulting_invoice-page-0.png b/qa/src/test/resources/visual-baselines/invoice-v2-layered/consulting_invoice-page-0.png new file mode 100644 index 000000000..d491ee7ed Binary files /dev/null and b/qa/src/test/resources/visual-baselines/invoice-v2-layered/consulting_invoice-page-0.png differ diff --git a/templates/src/main/java/com/demcha/compose/document/templates/data/invoice/InvoiceBrand.java b/templates/src/main/java/com/demcha/compose/document/templates/data/invoice/InvoiceBrand.java new file mode 100644 index 000000000..90fc685a0 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/data/invoice/InvoiceBrand.java @@ -0,0 +1,47 @@ +package com.demcha.compose.document.templates.data.invoice; + +import com.demcha.compose.document.image.DocumentImageData; + +import java.util.Objects; + +/** + * The sender's brand lockup on a structured invoice: the logo image and + * the wordmark lines beside it. + * + *The logo is caller-supplied content, not template chrome — the caller + * hands over a {@link DocumentImageData} built from its own bytes or path, + * the way it would for any other image it owns. It is optional: with no + * logo a preset falls back to the wordmark alone, so an invoice composes + * without one.
+ * + * @param logo the logo image, or {@code null} for the wordmark-only + * lockup + * @param name the brand name, set as the wordmark + * @param qualifier the second wordmark line under the name (e.g. the + * business type) + * @param tagline the tagline under the lockup + */ +public record InvoiceBrand( + DocumentImageData logo, + String name, + String qualifier, + String tagline) { + + /** + * Normalizes the optional text fields; the logo stays nullable. + */ + public InvoiceBrand { + name = Objects.requireNonNullElse(name, ""); + qualifier = Objects.requireNonNullElse(qualifier, ""); + tagline = Objects.requireNonNullElse(tagline, ""); + } + + /** + * Whether this lockup carries a logo image. + * + * @return {@code true} when a logo was supplied + */ + public boolean hasLogo() { + return logo != null; + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/data/invoice/InvoiceContactBlock.java b/templates/src/main/java/com/demcha/compose/document/templates/data/invoice/InvoiceContactBlock.java new file mode 100644 index 000000000..d31873d86 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/data/invoice/InvoiceContactBlock.java @@ -0,0 +1,45 @@ +package com.demcha.compose.document.templates.data.invoice; + +import java.util.List; +import java.util.Objects; + +/** + * The sender's address and contact channels on a structured invoice. + * + *Distinct from {@link InvoiceParty}, the narrative model's party + * record: this block carries a website channel and a labelled business + * registration (ABN, VAT or company number — the label is content because + * it differs by jurisdiction), which a structured invoice prints in its + * contact band and its footer.
+ * + * @param legalName the registered business name + * @param addressLines the address lines, in order + * @param phone the phone channel + * @param email the email channel + * @param website the website channel + * @param registrationLabel the label of the registration number + * (e.g. {@code "ABN"}) + * @param registrationNumber the registration number itself + */ +public record InvoiceContactBlock( + String legalName, + ListThe metadata is an authored list rather than fixed fields, so an + * invoice prints exactly the rows its business needs — number, dates, + * project, purchase order, contract reference — in the order and wording + * it uses. That is why the labels live in the data: they differ per + * sender, and a preset cannot know them.
+ * + * @param title the document title (e.g. {@code "INVOICE"}) + * @param entries the metadata rows, in print order + */ +public record InvoiceMasthead(String title, ListDistinct from the narrative model's + * {@link InvoiceData#paymentTerms()}, a list of prose bullets: the fields + * here are labelled values printed as a table (bank, account name, sort + * code or BSB, account number, payment reference), because a payer reads + * them one field at a time. The labels are content — they differ by + * banking system.
+ * + * @param heading the block heading + * (e.g. {@code "PAYMENT INFORMATION"}) + * @param fields the labelled payment fields, in print order + * @param instruction the sentence under the fields + * @param dueNotice the short due-by notice set apart from the rest + * @param dueNoticeEmphasis the run inside {@code dueNotice} that carries + * the emphasis — usually the term itself, as in + * {@code "30 days"}; empty leaves the notice + * evenly set + */ +public record InvoicePaymentBlock( + String heading, + ListThe block owns its heading, and the lines under the recipient's name + * come in two groups because a preset sets them apart: the {@code subline} + * is the single attention line — a department, a contact, a cost centre — + * that sits directly under the name, and {@code addressLines} is the + * address block under that.
+ * + * @param heading the block heading (e.g. {@code "BILLED TO"}) + * @param name the recipient's name, set apart from the lines below + * @param subline the attention line under the name; empty when the + * recipient has none + * @param addressLines the address lines, in order + * @param emailLabel the label printed before the email address + * @param email the recipient's email address + */ +public record InvoiceRecipient( + String heading, + String name, + String subline, + ListDistinct from the narrative model's {@link InvoiceLineItem}, whose + * quantity, unit price and amount are pre-formatted strings: a service + * line carries {@link BigDecimal} figures plus the unit they are counted + * in, so the preset formats them against the document's currency and the + * caller keeps the arithmetic. The column labels are content because the + * currency code and the wording appear inside them.
+ * + * @param columns the column labels + * @param lines the priced service lines, in print order + */ +public record InvoiceServiceLines(Columns columns, ListDistinct from the narrative model's {@link InvoiceSummaryRow} list, + * where the grand total is the last row and is recognised by convention: + * here the total is its own labelled band with its own amount, so a preset + * renders it without inspecting the list.
+ * + * @param rows the rows above the total (subtotal, tax, discounts), + * in print order + * @param totalLabel the label of the total band + * @param totalAmount the amount of the total band; {@code null} normalizes + * to {@link BigDecimal#ZERO} + */ +public record InvoiceTotalsBlock(ListThe display model ({@link InvoiceData}) carries an invoice as + * pre-formatted strings: one address block per party, line items whose + * quantity and money are already rendered, and a flat list of summary + * rows. This model is the structured business invoice: a brand lockup with + * the sender's own logo, labelled masthead metadata, a contact block with + * a business registration, priced service lines carrying + * {@link java.math.BigDecimal} figures and the unit they are counted in, a + * totals stack with its own total band, bank payment fields, and a footer + * line. Each block owns its heading and labels, so the wording is content + * rather than a preset choice.
+ * + *Both models stay: a preset consumes the one whose shape it renders. + * Every component normalizes {@code null} to its empty form, so a partial + * document composes without null checks in preset code. The section + * records construct positionally; this builder is where a document is + * assembled.
+ * + * @param brand the sender's brand lockup + * @param supplier the sender's address and contact channels + * @param masthead the document title and its metadata rows + * @param billTo the billed-to block + * @param summary what the invoice covers, and for which period + * @param serviceLines the line-items table + * @param totals the totals stack and its total band + * @param payment where to send the money, and by when + * @param notes the closing notes and query channels + * @param currencyCode the ISO currency code the figures are stated in + */ +public record StructuredInvoiceData( + InvoiceBrand brand, + InvoiceContactBlock supplier, + InvoiceMasthead masthead, + InvoiceRecipient billTo, + InvoiceSummaryBlock summary, + InvoiceServiceLines serviceLines, + InvoiceTotalsBlock totals, + InvoicePaymentBlock payment, + InvoiceNotesBlock notes, + String currencyCode) { + + /** + * Normalizes absent components to their empty forms. + */ + public StructuredInvoiceData { + brand = brand == null ? new InvoiceBrand(null, null, null, null) : brand; + supplier = supplier == null + ? new InvoiceContactBlock(null, null, null, null, null, null, null) : supplier; + masthead = masthead == null ? new InvoiceMasthead(null, null) : masthead; + billTo = billTo == null + ? new InvoiceRecipient(null, null, null, null, null, null) : billTo; + summary = summary == null ? new InvoiceSummaryBlock(null, null, null) : summary; + serviceLines = serviceLines == null + ? new InvoiceServiceLines(null, null) : serviceLines; + totals = totals == null ? new InvoiceTotalsBlock(null, null, null) : totals; + payment = payment == null + ? new InvoicePaymentBlock(null, null, null, null, null) : payment; + notes = notes == null ? new InvoiceNotesBlock(null, null, null, null) : notes; + currencyCode = Objects.requireNonNullElse(currencyCode, ""); + } + + /** + * Starts a fluent structured invoice data builder. + * + * @return structured invoice data builder + */ + public static Builder builder() { + return new Builder(); + } + + /** + * Fluent builder for complete structured invoice content. + */ + public static final class Builder { + private InvoiceBrand brand; + private InvoiceContactBlock supplier; + private InvoiceMasthead masthead; + private InvoiceRecipient billTo; + private InvoiceSummaryBlock summary; + private InvoiceServiceLines serviceLines; + private InvoiceTotalsBlock totals; + private InvoicePaymentBlock payment; + private InvoiceNotesBlock notes; + private String currencyCode; + + private Builder() { + } + + /** + * Sets the sender's brand lockup. + * + * @param brand brand lockup + * @return this builder + */ + public Builder brand(InvoiceBrand brand) { + this.brand = brand; + return this; + } + + /** + * Sets the sender's address and contact channels. + * + * @param supplier contact block + * @return this builder + */ + public Builder supplier(InvoiceContactBlock supplier) { + this.supplier = supplier; + return this; + } + + /** + * Sets the document title and its metadata rows. + * + * @param masthead masthead + * @return this builder + */ + public Builder masthead(InvoiceMasthead masthead) { + this.masthead = masthead; + return this; + } + + /** + * Sets the billed-to block. + * + * @param billTo recipient block + * @return this builder + */ + public Builder billTo(InvoiceRecipient billTo) { + this.billTo = billTo; + return this; + } + + /** + * Sets what the invoice covers, and for which period. + * + * @param summary summary block + * @return this builder + */ + public Builder summary(InvoiceSummaryBlock summary) { + this.summary = summary; + return this; + } + + /** + * Sets the line-items table. + * + * @param serviceLines service lines + * @return this builder + */ + public Builder serviceLines(InvoiceServiceLines serviceLines) { + this.serviceLines = serviceLines; + return this; + } + + /** + * Sets the totals stack and its total band. + * + * @param totals totals block + * @return this builder + */ + public Builder totals(InvoiceTotalsBlock totals) { + this.totals = totals; + return this; + } + + /** + * Sets where the money goes, and by when. + * + * @param payment payment block + * @return this builder + */ + public Builder payment(InvoicePaymentBlock payment) { + this.payment = payment; + return this; + } + + /** + * Sets the closing notes and query channels. + * + * @param notes notes block + * @return this builder + */ + public Builder notes(InvoiceNotesBlock notes) { + this.notes = notes; + return this; + } + + /** + * Sets the ISO currency code the figures are stated in. + * + * @param currencyCode currency code + * @return this builder + */ + public Builder currencyCode(String currencyCode) { + this.currencyCode = currencyCode; + return this; + } + + /** + * Builds the normalized structured invoice data. + * + * @return structured invoice data + */ + public StructuredInvoiceData build() { + return new StructuredInvoiceData(brand, supplier, masthead, billTo, summary, + serviceLines, totals, payment, notes, currencyCode); + } + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/data/invoice/StructuredInvoiceDocumentSpec.java b/templates/src/main/java/com/demcha/compose/document/templates/data/invoice/StructuredInvoiceDocumentSpec.java new file mode 100644 index 000000000..854d16464 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/data/invoice/StructuredInvoiceDocumentSpec.java @@ -0,0 +1,35 @@ +package com.demcha.compose.document.templates.data.invoice; + +/** + * Public compose-first input for structured invoice templates. + * + *Authoring role: the document-level object structured invoice + * presets are parameterised on, the way the display-oriented presets are + * parameterised on {@link InvoiceDocumentSpec}. Presets that render the + * structured shape — brand lockup, labelled masthead metadata, priced + * service lines with a numeric totals stack, bank payment fields — + * consume this spec; presets that render pre-formatted display strings + * stay on the other one.
+ * + * @param invoice normalized structured invoice content + */ +public record StructuredInvoiceDocumentSpec(StructuredInvoiceData invoice) { + + /** + * Creates a normalized structured invoice document spec. + */ + public StructuredInvoiceDocumentSpec { + invoice = invoice == null ? StructuredInvoiceData.builder().build() : invoice; + } + + /** + * Wraps existing structured invoice data in the document-level spec + * expected by structured invoice templates. + * + * @param invoice structured invoice data + * @return document spec + */ + public static StructuredInvoiceDocumentSpec from(StructuredInvoiceData invoice) { + return new StructuredInvoiceDocumentSpec(invoice); + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingBody.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingBody.java new file mode 100644 index 000000000..75c38b050 --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingBody.java @@ -0,0 +1,238 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.dsl.ParagraphBuilder; +import com.demcha.compose.document.dsl.SectionBuilder; +import com.demcha.compose.document.dsl.TableBuilder; +import com.demcha.compose.document.node.DocumentNode; +import com.demcha.compose.document.node.TextAlign; +import com.demcha.compose.document.style.ClipPolicy; +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.DocumentTextStyle; +import com.demcha.compose.document.style.ShapeOutline; +import com.demcha.compose.document.table.DocumentTableCell; +import com.demcha.compose.document.table.DocumentTableColumn; +import com.demcha.compose.document.table.DocumentTableStyle; +import com.demcha.compose.document.table.DocumentTableTextAnchor; +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.util.List; + +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.ACCENT_PRIMARY; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.BODY; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.BODY_ACCENT; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.BODY_BOLD; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.CONTENT_WIDTH; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.EMPHASIS_FILL; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.PAGE_BACKGROUND; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.ROW_ALT; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.SMALL; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.SMALL_BOLD; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.TABLE_HEADER; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.TABLE_RATIOS; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.TOTALS_WIDTH; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.TOTAL_AMOUNT; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.TOTAL_AMOUNT_RIGHT_INSET; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.TOTAL_LABEL_LEFT_INSET; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.tableStyle; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingText.decimal; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingText.link; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingText.money; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingText.titleBreakerWidth; + +/** + * The body of the Consulting Invoice: who is billed and for what, the + * priced service lines, and the totals stack. + */ +final class ConsultingBody { + + private ConsultingBody() { + } + + /** The billed-to block: name, attention line, address, then the email. */ + static void renderBilledTo(SectionBuilder section, StructuredInvoiceData data) { + InvoiceRecipient billTo = data.billTo(); + ConsultingMasthead.sectionHeading(section, billTo.heading()); + section.spacing(1.5).addParagraph(billTo.name(), BODY_BOLD); + // A recipient without an attention line gets no line box for it. + if (!billTo.subline().isBlank()) { + section.addParagraph(billTo.subline(), BODY); + } + section.addParagraph(String.join("\n", billTo.addressLines()), BODY); + if (!billTo.email().isBlank()) { + section.addParagraph(paragraph -> paragraph + .rich(rich -> rich + .style(billTo.emailLabel() + " ", BODY_BOLD) + .with(billTo.email(), BODY, link("mailto:" + billTo.email()))) + .margin(DocumentInsets.top(5))); + } + } + + /** What the invoice covers, and the period it covers. */ + static void renderSummary(SectionBuilder section, StructuredInvoiceData data) { + InvoiceSummaryBlock summary = data.summary(); + ConsultingMasthead.sectionHeading(section, summary.heading()); + section.spacing(1) + .addParagraph(paragraph -> paragraph + .text(summary.intro()) + .textStyle(BODY) + .lineSpacing(1.35) + .margin(DocumentInsets.zero())) + .addParagraph(paragraph -> paragraph + .text(summary.servicePeriod()) + .textStyle(BODY_BOLD) + .lineSpacing(1.15) + .margin(DocumentInsets.zero())); + } + + /** + * The line-items table: a repeating header on the accent fill, and one + * zebra-filled row per service line. The unit-price and amount headers + * carry the currency on their second line. + */ + static void renderServiceLines(TableBuilder table, StructuredInvoiceData data) { + InvoiceServiceLines serviceLines = data.serviceLines(); + InvoiceServiceLines.Columns columns = serviceLines.columns(); + // A document that states no currency prints no parenthetical. + String currency = data.currencyCode().isBlank() + ? "" : "(" + data.currencyCode() + ")"; + + DocumentTableStyle headerStyle = DocumentTableStyle.builder() + .padding(DocumentInsets.symmetric(4.5, 4.0)) + .fillColor(ACCENT_PRIMARY) + .stroke(DocumentStroke.of(ACCENT_PRIMARY, 0.6)) + .textStyle(TABLE_HEADER) + .textAnchor(DocumentTableTextAnchor.CENTER) + .lineSpacing(1.0) + .build(); + + table.name("LineItems") + .columns(column(0), column(1), column(2), column(3), column(4), column(5)) + .headerCells( + DocumentTableCell.text(columns.index()), + DocumentTableCell.text(columns.description()), + DocumentTableCell.text(columns.servicePeriod()), + DocumentTableCell.text(columns.quantity()), + DocumentTableCell.lines(columns.unitPrice(), currency), + DocumentTableCell.lines(columns.amount(), currency)) + .headerStyle(headerStyle) + .repeatHeader() + .padding(DocumentInsets.zero()) + .margin(DocumentInsets.zero()); + + ListThese are template chrome, not content: they ship inside the templates + * artifact under {@code templates/invoice/consulting/icons/} and are named + * by the preset, never by the data. Loaded bytes are cached per name, so a + * render reads each icon file once per JVM.
+ */ +final class ConsultingIcons { + + static final String LOCATION = "location"; + static final String PHONE = "phone"; + static final String EMAIL = "email"; + static final String WEBSITE = "website"; + static final String BANK = "bank"; + static final String CALENDAR = "payment-calendar"; + + private static final String ICON_ROOT = "/templates/invoice/consulting/icons/"; + private static final MapThe masthead pairs the sender's brand lockup and contact channels with + * the document title and its metadata; the body bills a recipient, states + * what the invoice covers, and prices the work line by line with a service + * period and a unit against each line; the totals stack closes with an + * emphasized total band. Long invoices flow: the line-items table repeats + * its header on the next page, and the totals stack stays whole.
+ * + *The preset owns its session geometry — A4, the margin published as + * {@link #RECOMMENDED_MARGIN}, the near-white page fill and the quiet + * footer band — and draws the legal line and page numbers as footer chrome + * rather than flow content, so they repeat on every page. The legal line is + * composed from the supplier's registered name and registration, so those + * are stated once. A session margin set by the caller is overwritten.
+ * + *The preset draws in {@code FontName.POPPINS} and consumes the + * structured invoice model ({@link StructuredInvoiceDocumentSpec}): its + * headings, labels and column titles are content, so the same composition + * prints an invoice in another business's wording without a fork. The + * brand logo arrives through the data as an image the caller owns; a + * document without one falls back to the wordmark lockup. The contact + * marks, the bank badge and the calendar are template chrome and ship + * inside the artifact.
+ */ +public final class ConsultingInvoice { + + /** + * Stable template identifier. + */ + public static final String ID = "invoice-consulting"; + + /** + * Human-readable display name. + */ + public static final String DISPLAY_NAME = "Consulting Invoice"; + + /** + * The session margin (in points) the preset sets. It is published so a + * caller can measure against the same frame; the preset applies it + * itself inside {@code compose}, together with the page size and the + * page fills, so callers leave the session unconfigured. + */ + public static final double RECOMMENDED_MARGIN = ConsultingStyles.PAGE_MARGIN; + + private ConsultingInvoice() { + } + + /** + * Builds the preset. + * + * @return ready-to-use template + */ + public static DocumentTemplateBoth halves are shape containers with anchored children rather than + * rows, because a row is refused inside a row cell and the masthead itself + * is one row of the page flow.
+ */ +final class ConsultingMasthead { + + private ConsultingMasthead() { + } + + /** The sender's half: brand lockup, then one band per contact channel. */ + static void renderSupplier(SectionBuilder section, StructuredInvoiceData data) { + InvoiceBrand brand = data.brand(); + InvoiceContactBlock supplier = data.supplier(); + + section.spacing(2); + if (brand.hasLogo()) { + section.add(logoLockup(brand)); + } else { + renderTextLockup(section, brand); + } + // A channel the sender did not supply gets no band: an empty band + // would print a mark with nothing beside it, and an empty value has + // no address to link to. + String address = String.join("\n", supplier.addressLines()); + if (!address.isBlank()) { + contactBand(section, ConsultingIcons.LOCATION, 10.0, address, + CONTACT_ROW_HEIGHT + 5.0, null); + } + if (!supplier.phone().isBlank()) { + contactBand(section, ConsultingIcons.PHONE, 9.2, supplier.phone(), + CONTACT_ROW_HEIGHT, telUri(supplier.phone())); + } + if (!supplier.email().isBlank()) { + contactBand(section, ConsultingIcons.EMAIL, 9.2, supplier.email(), + CONTACT_ROW_HEIGHT, "mailto:" + supplier.email()); + } + if (!supplier.website().isBlank()) { + contactBand(section, ConsultingIcons.WEBSITE, 9.4, supplier.website(), + CONTACT_ROW_HEIGHT, websiteUri(supplier.website())); + } + } + + /** + * The logo in its box. Height-only sizing lets the engine derive the + * width from the image's own metadata, so a wider or narrower logo + * stays on the same baseline as the contact bands below it. + */ + private static DocumentNode logoLockup(InvoiceBrand brand) { + DocumentNode logo = new ImageBuilder() + .name("BrandLogo") + .source(brand.logo()) + .height(BRAND_LOGO_BOX_HEIGHT) + .build(); + return new ShapeContainerBuilder() + .name("BrandLogoBox") + .rectangle(SUPPLIER_WIDTH, BRAND_LOGO_BOX_HEIGHT) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .centerLeft(logo) + .build(); + } + + /** + * The wordmark-only lockup a document without a logo falls back to: the + * brand's initial as a mark, the name beside it, the qualifier tracked + * between rules, and the tagline. + */ + private static void renderTextLockup(SectionBuilder section, InvoiceBrand brand) { + String mark = brand.name().isBlank() ? "" : brand.name().substring(0, 1); + section.addParagraph(paragraph -> paragraph + .rich(rich -> rich + .style(mark, BRAND_MARK) + .space() + .style(brand.name(), BRAND_NAME)) + .lineSpacing(1.0) + .margin(DocumentInsets.zero())) + .addParagraph(paragraph -> paragraph + .text(brand.qualifier().isBlank() + ? "" : "— " + tracked(brand.qualifier()) + " —") + .textStyle(BRAND_QUALIFIER) + .align(TextAlign.CENTER) + .margin(DocumentInsets.zero())) + .addParagraph(paragraph -> paragraph + .text(brand.tagline()) + .textStyle(BODY_ACCENT) + .align(TextAlign.CENTER) + .margin(DocumentInsets.symmetric(5, 0))); + } + + /** One contact line: the channel mark, and the value anchored beside it. */ + private static void contactBand(SectionBuilder section, + String iconName, + double iconSize, + String text, + double height, + String linkUri) { + DocumentNode contactText = linkUri == null + ? paragraph(text, SMALL) + : linkedParagraph(text, SMALL, linkUri); + section.addContainer(container -> container + .name("ContactBand") + .rectangle(SUPPLIER_WIDTH, height) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .centerLeft(ConsultingIcons.icon(iconName, iconSize)) + .position(contactText, 23, 0, LayerAlign.CENTER_LEFT)); + } + + /** The document half: the tracked title, then one band per metadata row. */ + static void renderInvoiceHeader(SectionBuilder section, StructuredInvoiceData data) { + InvoiceMasthead masthead = data.masthead(); + section.accentLeft(HAIRLINE, 1.1) + .padding(0, 0, 0, 24) + .spacing(1) + .addParagraph(paragraph -> paragraph + .text(tracked(masthead.title())) + .textStyle(INVOICE_TITLE) + .margin(DocumentInsets.bottom(8))); + for (InvoiceMasthead.Entry entry : masthead.entries()) { + metadataBand(section, entry); + } + } + + /** One metadata row: the label at the left, the value at the 48% mark. */ + private static void metadataBand(SectionBuilder section, InvoiceMasthead.Entry entry) { + double width = INVOICE_WIDTH - 24; + section.addContainer(container -> container + .name("MetadataBand") + .rectangle(width, METADATA_ROW_HEIGHT) + .clipPolicy(ClipPolicy.OVERFLOW_VISIBLE) + .centerLeft(paragraph(entry.label(), SMALL_BOLD)) + .position(paragraph(entry.value(), entry.emphasized() ? BODY_ACCENT : BODY), + width * 0.48, + 0, + LayerAlign.CENTER_LEFT)); + } + + /** A plain left-aligned paragraph node on the shared line spacing. */ + static DocumentNode paragraph(String text, DocumentTextStyle style) { + return new ParagraphBuilder() + .text(text) + .textStyle(style) + .align(TextAlign.LEFT) + .lineSpacing(1.15) + .margin(DocumentInsets.zero()) + .build(); + } + + private static DocumentNode linkedParagraph(String text, DocumentTextStyle style, String uri) { + return new ParagraphBuilder() + .text(text) + .textStyle(style) + .align(TextAlign.LEFT) + .link(link(uri)) + .lineSpacing(1.15) + .margin(DocumentInsets.zero()) + .build(); + } + + /** + * The heading every lower region opens with: tracked capitals over a + * short accent rule. + */ + static void sectionHeading(SectionBuilder section, String heading) { + if (heading.isBlank()) { + // No heading, no rule: an orphan rule reads as a divider. + return; + } + section.addParagraph(paragraph -> paragraph + .text(tracked(heading)) + .textStyle(SECTION_HEADING) + .lineSpacing(1.0) + .margin(DocumentInsets.zero())) + .addLine(line -> line + .horizontal(30) + .thickness(1.2) + .color(ACCENT_PRIMARY) + .margin(DocumentInsets.symmetric(4, 0))); + } + +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingStyles.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingStyles.java new file mode 100644 index 000000000..722332b7d --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingStyles.java @@ -0,0 +1,149 @@ +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; + +/** + * The Consulting Invoice look: page geometry, the colour roles, the Poppins + * type scale, and the derived widths every region measures against. + * + *Preset-local rather than a {@code BrandTheme}: every value below was + * measured against the ported template's reference render, and the type + * scale derives from a single {@link #BODY_SIZE} step that no other family + * shares. A theme slot would add indirection without a second consumer.
+ */ +final class ConsultingStyles { + + private ConsultingStyles() { + } + + // --- page --------------------------------------------------------------- + static final DocumentPageSize PAGE = DocumentPageSize.A4; + static final double PAGE_MARGIN = 30.5; + /** The denominator of every derived width below. */ + static final double CONTENT_WIDTH = PAGE.width() - 2.0 * PAGE_MARGIN; + + // --- band splits, measured from the reference --------------------------- + static final double HEADER_LEFT_WEIGHT = 0.51; + static final double HEADER_RIGHT_WEIGHT = 1.0 - HEADER_LEFT_WEIGHT; + static final double HEADER_GAP = 25.0; + static final double SUPPLIER_WIDTH = (CONTENT_WIDTH - HEADER_GAP) * HEADER_LEFT_WEIGHT; + static final double INVOICE_WIDTH = (CONTENT_WIDTH - HEADER_GAP) * HEADER_RIGHT_WEIGHT; + static final double PARTIES_LEFT_WEIGHT = 0.55; + static final double LOWER_LEFT_WEIGHT = 0.54; + static final double LOWER_GAP = 22.0; + static final double PAYMENT_WIDTH = (CONTENT_WIDTH - LOWER_GAP) * LOWER_LEFT_WEIGHT; + static final double NOTES_WIDTH = (CONTENT_WIDTH - LOWER_GAP) * (1.0 - LOWER_LEFT_WEIGHT); + static final double TOTALS_WIDTH = CONTENT_WIDTH * 0.42; + + /** #, description, service period, qty, unit price, amount. */ + static final double[] TABLE_RATIOS = {0.050, 0.341, 0.218, 0.110, 0.154, 0.127}; + + static final double TABLE_CELL_HORIZONTAL_PADDING = 5.0; + static final double DESCRIPTION_CONTENT_WIDTH = + CONTENT_WIDTH * TABLE_RATIOS[1] - 2.0 * TABLE_CELL_HORIZONTAL_PADDING; + + // --- independent dimensions --------------------------------------------- + static final double CONTACT_ROW_HEIGHT = 13.0; + static final double METADATA_ROW_HEIGHT = 18.0; + static final double FOOTER_BAND_RATIO = 0.039; + static final double FOOTER_ZONE_HEIGHT = 22.0; + static final double FOOTER_TEXT_SIZE = 7.0; + static final double BRAND_LOGO_BOX_HEIGHT = 64.0; + static final double TOTAL_LABEL_LEFT_INSET = 13.0; + static final double TOTAL_AMOUNT_RIGHT_INSET = 10.0; + + // --- type scale, all derived from one step ------------------------------ + static final double BODY_SIZE = 7.6; + static final double SMALL_SIZE = BODY_SIZE * 0.90; + static final double SECTION_SIZE = BODY_SIZE * 1.15; + static final double TITLE_SIZE = BODY_SIZE * 3.10; + static final double TOTAL_SIZE = BODY_SIZE * 1.80; + + // --- colour roles: named for the job, not the hue ----------------------- + static final DocumentColor PAGE_BACKGROUND = DocumentColor.rgb(254, 254, 254); + static final DocumentColor ACCENT_PRIMARY = DocumentColor.rgb(7, 86, 86); + static final DocumentColor INK = DocumentColor.rgb(35, 43, 54); + static final DocumentColor MUTED = DocumentColor.rgb(83, 91, 100); + static final DocumentColor ROW_ALT = DocumentColor.rgb(248, 248, 248); + static final DocumentColor EMPHASIS_FILL = DocumentColor.rgb(237, 246, 245); + static final DocumentColor FOOTER_FILL = DocumentColor.rgb(238, 246, 246); + static final DocumentColor HAIRLINE = DocumentColor.rgb(225, 229, 229); + + static final FontName TEXT_FONT = FontName.POPPINS; + + // --- text roles ---------------------------------------------------------- + static final DocumentTextStyle BODY = style(BODY_SIZE, DocumentTextDecoration.DEFAULT, INK); + static final DocumentTextStyle BODY_BOLD = style(BODY_SIZE, DocumentTextDecoration.BOLD, INK); + static final DocumentTextStyle BODY_ACCENT = + style(BODY_SIZE, DocumentTextDecoration.BOLD, ACCENT_PRIMARY); + static final DocumentTextStyle BODY_LINK = + style(BODY_SIZE, DocumentTextDecoration.DEFAULT, ACCENT_PRIMARY); + static final DocumentTextStyle SMALL = style(SMALL_SIZE, DocumentTextDecoration.DEFAULT, INK); + static final DocumentTextStyle SMALL_BOLD = style(SMALL_SIZE, DocumentTextDecoration.BOLD, INK); + static final DocumentTextStyle SMALL_ITALIC = + style(SMALL_SIZE, DocumentTextDecoration.ITALIC, INK); + static final DocumentTextStyle NOTICE_BOLD = + style(BODY_SIZE * 0.76, DocumentTextDecoration.BOLD, INK); + static final DocumentTextStyle NOTICE_ACCENT = + style(BODY_SIZE * 0.76, DocumentTextDecoration.BOLD, ACCENT_PRIMARY); + static final DocumentTextStyle SECTION_HEADING = + style(SECTION_SIZE, DocumentTextDecoration.BOLD, ACCENT_PRIMARY); + static final DocumentTextStyle INVOICE_TITLE = + style(TITLE_SIZE, DocumentTextDecoration.BOLD, ACCENT_PRIMARY); + static final DocumentTextStyle BRAND_NAME = + style(BODY_SIZE * 2.45, DocumentTextDecoration.BOLD, INK); + static final DocumentTextStyle BRAND_MARK = + style(BODY_SIZE * 3.25, DocumentTextDecoration.BOLD, ACCENT_PRIMARY); + static final DocumentTextStyle BRAND_QUALIFIER = + style(BODY_SIZE * 1.20, DocumentTextDecoration.DEFAULT, INK); + static final DocumentTextStyle TABLE_HEADER = + style(SMALL_SIZE, DocumentTextDecoration.BOLD, DocumentColor.WHITE); + static final DocumentTextStyle TOTAL_AMOUNT = + style(TOTAL_SIZE, DocumentTextDecoration.BOLD, ACCENT_PRIMARY); + + /** + * One line-item cell style: the zebra fill it sits on and where its value + * is anchored. + * + * @param fill the row fill + * @param anchor where the value sits in the cell + * @return the cell style + */ + static DocumentTableStyle tableStyle(DocumentColor fill, DocumentTableTextAnchor anchor) { + return DocumentTableStyle.builder() + .padding(DocumentInsets.symmetric(4.2, TABLE_CELL_HORIZONTAL_PADDING)) + .fillColor(fill) + .stroke(DocumentStroke.of(HAIRLINE, 0.55)) + .textStyle(BODY) + .textAnchor(anchor) + .lineSpacing(1.15) + .build(); + } + + /** + * Composes a text style in the preset's face. + * + * @param size type size in points + * @param decoration weight or slant + * @param color ink colour + * @return the composed style + */ + static DocumentTextStyle style(double size, + DocumentTextDecoration decoration, + DocumentColor color) { + return DocumentTextStyle.builder() + .fontName(TEXT_FONT) + .size(size) + .decoration(decoration) + .color(color) + .build(); + } +} diff --git a/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingText.java b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingText.java new file mode 100644 index 000000000..6e873e2ad --- /dev/null +++ b/templates/src/main/java/com/demcha/compose/document/templates/invoice/presets/ConsultingText.java @@ -0,0 +1,169 @@ +package com.demcha.compose.document.templates.invoice.presets; + +import com.demcha.compose.document.node.DocumentLinkOptions; + +import java.awt.Font; +import java.awt.font.FontRenderContext; +import java.io.InputStream; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.NumberFormat; +import java.util.Locale; +import java.util.Objects; + +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.DESCRIPTION_CONTENT_WIDTH; +import static com.demcha.compose.document.templates.invoice.presets.ConsultingStyles.SMALL_SIZE; + +/** + * The text and number utilities the Consulting Invoice regions share: + * money and quantity formatting, link URIs, and the measurement behind the + * line-item title breaker. + */ +final class ConsultingText { + + /** + * The face the line-item title is measured in. + * + *The templates artifact does not carry it. The + * face ships in {@code graph-compose-fonts}, which this module does not + * depend on, so a caller that adds only the templates artifact measures + * in the platform's {@code SansSerif} instead — a different width, and + * one that differs between operating systems. That caller also renders + * the document in a substituted face, so the page is already not the + * designed one; what the fallback adds is that the description column's + * break lands differently per platform. Put the font artifact on the + * classpath to get the designed render.
+ */ + private static final Font DESCRIPTION_BOLD_FONT = loadDescriptionBoldFont(); + + private static final FontRenderContext FONT_RENDER_CONTEXT = + new FontRenderContext(null, true, true); + + private ConsultingText() { + } + + /** + * Width of the invisible breaker that pushes a line item's description + * onto its own line: what is left of the description column once the + * title has been set. + * + *A rich run cannot carry a line break — the engine strips a newline + * inside one — so the description column ends its title run with a + * zero-height rectangle wide enough to fill the line instead. Sizing + * that rectangle needs the rendered title width, which is measured here + * rather than laid out.
+ * + * @param title the line-item title + * @return the breaker width, never below one point + */ + static double titleBreakerWidth(String title) { + double titleWidth = DESCRIPTION_BOLD_FONT + .deriveFont((float) SMALL_SIZE) + .getStringBounds(Objects.requireNonNullElse(title, ""), FONT_RENDER_CONTEXT) + .getWidth(); + return Math.max(1.0, DESCRIPTION_CONTENT_WIDTH - titleWidth - 4.0); + } + + private static Font loadDescriptionBoldFont() { + try (InputStream stream = ConsultingText.class.getClassLoader() + .getResourceAsStream("fonts/google/poppins/Poppins-Bold.ttf")) { + if (stream != null) { + return Font.createFont(Font.TRUETYPE_FONT, stream); + } + } catch (Exception cause) { + // A present-but-unreadable font is worth saying out loud; a + // missing one is the documented fallback below. + System.getLogger(ConsultingText.class.getName()) + .log(System.Logger.Level.WARNING, + "Falling back to the platform face: the packaged Poppins Bold " + + "could not be read", + cause); + } + return new Font("SansSerif", Font.BOLD, 1); + } + + /** + * Spaces a value out into tracked capitals (the heading treatment). + * + * @param value the text, already in the case it is set in + * @return the tracked text + */ + static String tracked(String value) { + StringBuilder tracked = new StringBuilder(value.length() * 2); + for (int index = 0; index < value.length(); index++) { + if (index > 0) { + tracked.append(' '); + } + tracked.append(value.charAt(index)); + } + return tracked.toString(); + } + + /** + * Formats a quantity at two decimal places, without grouping. + * + * @param value the quantity + * @return the formatted quantity + */ + static String decimal(BigDecimal value) { + return value.setScale(2, RoundingMode.HALF_UP).toPlainString(); + } + + /** + * Formats an amount with thousands grouping and two decimal places. The + * currency itself is printed in the column header, not per figure. + * + * @param value the amount + * @return the formatted amount + */ + static String money(BigDecimal value) { + NumberFormat format = NumberFormat.getNumberInstance(Locale.ENGLISH); + format.setGroupingUsed(true); + format.setMinimumFractionDigits(2); + format.setMaximumFractionDigits(2); + return format.format(value); + } + + /** + * Wraps a URI as link options. + * + * @param uri the target + * @return the link options + */ + static DocumentLinkOptions link(String uri) { + return new DocumentLinkOptions(uri); + } + + /** + * Builds the {@code tel:} URI of a printed phone number. + * + * @param phone the printed number + * @return the dial URI + */ + static String telUri(String phone) { + return "tel:" + phone.replace(" ", ""); + } + + /** + * Builds the browsable URI of a printed website, adding the scheme when + * the printed form omits it. + * + * @param website the printed website + * @return the browsable URI + */ + static String websiteUri(String website) { + return website.startsWith("http://") || website.startsWith("https://") + ? website + : "https://" + website; + } + + /** + * Keeps a printed phone number on one line. + * + * @param phone the printed number + * @return the number with non-breaking spaces + */ + static String nonBreakingPhone(String phone) { + return phone.replace(' ', '\u00A0'); + } +} diff --git a/templates/src/main/resources/templates/invoice/consulting/icons/bank.png b/templates/src/main/resources/templates/invoice/consulting/icons/bank.png new file mode 100644 index 000000000..0abf6a0a9 Binary files /dev/null and b/templates/src/main/resources/templates/invoice/consulting/icons/bank.png differ diff --git a/templates/src/main/resources/templates/invoice/consulting/icons/email.png b/templates/src/main/resources/templates/invoice/consulting/icons/email.png new file mode 100644 index 000000000..7ba93e4c7 Binary files /dev/null and b/templates/src/main/resources/templates/invoice/consulting/icons/email.png differ diff --git a/templates/src/main/resources/templates/invoice/consulting/icons/location.png b/templates/src/main/resources/templates/invoice/consulting/icons/location.png new file mode 100644 index 000000000..23be9cdad Binary files /dev/null and b/templates/src/main/resources/templates/invoice/consulting/icons/location.png differ diff --git a/templates/src/main/resources/templates/invoice/consulting/icons/payment-calendar.png b/templates/src/main/resources/templates/invoice/consulting/icons/payment-calendar.png new file mode 100644 index 000000000..cf8d11a51 Binary files /dev/null and b/templates/src/main/resources/templates/invoice/consulting/icons/payment-calendar.png differ diff --git a/templates/src/main/resources/templates/invoice/consulting/icons/phone.png b/templates/src/main/resources/templates/invoice/consulting/icons/phone.png new file mode 100644 index 000000000..3f55069b7 Binary files /dev/null and b/templates/src/main/resources/templates/invoice/consulting/icons/phone.png differ diff --git a/templates/src/main/resources/templates/invoice/consulting/icons/website.png b/templates/src/main/resources/templates/invoice/consulting/icons/website.png new file mode 100644 index 000000000..1605a03ab Binary files /dev/null and b/templates/src/main/resources/templates/invoice/consulting/icons/website.png differ diff --git a/templates/src/test/java/com/demcha/compose/document/templates/data/invoice/StructuredInvoiceDataTest.java b/templates/src/test/java/com/demcha/compose/document/templates/data/invoice/StructuredInvoiceDataTest.java new file mode 100644 index 000000000..6a513dfdb --- /dev/null +++ b/templates/src/test/java/com/demcha/compose/document/templates/data/invoice/StructuredInvoiceDataTest.java @@ -0,0 +1,173 @@ +package com.demcha.compose.document.templates.data.invoice; + +import com.demcha.compose.document.image.DocumentImageData; +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; + +/** + * Normalization and immutability contract of the structured invoice model: + * absent components become their empty forms, leaf strings never surface as + * {@code null}, money and quantities default to zero rather than null, the + * brand logo stays optional, and every collection is frozen at construction. + */ +class StructuredInvoiceDataTest { + + @Test + void emptyBuilderYieldsEmptyFormsForEveryComponent() { + StructuredInvoiceData data = StructuredInvoiceData.builder().build(); + + assertThat(data.brand().name()).isEmpty(); + assertThat(data.brand().hasLogo()).isFalse(); + assertThat(data.supplier().addressLines()).isEmpty(); + assertThat(data.masthead().entries()).isEmpty(); + assertThat(data.billTo().addressLines()).isEmpty(); + assertThat(data.summary().intro()).isEmpty(); + assertThat(data.serviceLines().lines()).isEmpty(); + assertThat(data.serviceLines().columns().amount()).isEmpty(); + assertThat(data.totals().rows()).isEmpty(); + assertThat(data.totals().totalAmount()).isEqualByComparingTo(BigDecimal.ZERO); + assertThat(data.payment().fields()).isEmpty(); + assertThat(data.notes().paragraphs()).isEmpty(); + assertThat(data.currencyCode()).isEmpty(); + } + + @Test + void leafRecordsNormalizeNullStringsToEmpty() { + InvoiceBrand brand = new InvoiceBrand(null, null, null, null); + assertThat(brand.name()).isEmpty(); + assertThat(brand.qualifier()).isEmpty(); + assertThat(brand.tagline()).isEmpty(); + + InvoiceContactBlock supplier = + new InvoiceContactBlock(null, null, null, null, null, null, null); + assertThat(supplier.legalName()).isEmpty(); + assertThat(supplier.website()).isEmpty(); + assertThat(supplier.registrationLabel()).isEmpty(); + + InvoiceMasthead.Entry entry = new InvoiceMasthead.Entry(null, null, false); + assertThat(entry.label()).isEmpty(); + assertThat(entry.value()).isEmpty(); + + InvoiceRecipient recipient = new InvoiceRecipient(null, null, null, null, null, null); + assertThat(recipient.heading()).isEmpty(); + assertThat(recipient.emailLabel()).isEmpty(); + assertThat(recipient.subline()).isEmpty(); + + InvoicePaymentBlock.Field field = new InvoicePaymentBlock.Field(null, null); + assertThat(field.label()).isEmpty(); + assertThat(field.value()).isEmpty(); + } + + @Test + void moneyAndQuantitiesDefaultToZeroRatherThanNull() { + InvoiceServiceLines.Line line = new InvoiceServiceLines.Line( + 1, null, null, null, null, null, null, null); + assertThat(line.quantity()).isEqualByComparingTo(BigDecimal.ZERO); + assertThat(line.unitPrice()).isEqualByComparingTo(BigDecimal.ZERO); + assertThat(line.amount()).isEqualByComparingTo(BigDecimal.ZERO); + + InvoiceTotalsBlock.Row row = new InvoiceTotalsBlock.Row("Subtotal", null); + assertThat(row.amount()).isEqualByComparingTo(BigDecimal.ZERO); + + InvoiceTotalsBlock totals = new InvoiceTotalsBlock(null, null, null); + assertThat(totals.totalAmount()).isEqualByComparingTo(BigDecimal.ZERO); + } + + @Test + void brandLogoIsOptionalAndReportedByHasLogo() { + DocumentImageData logo = DocumentImageData.fromBytes(new byte[] {1, 2, 3}); + InvoiceBrand withLogo = new InvoiceBrand(logo, "Northpoint", "Consulting", "Tagline"); + assertThat(withLogo.hasLogo()).isTrue(); + assertThat(withLogo.logo()).isSameAs(logo); + + assertThat(new InvoiceBrand(null, "Northpoint", "", "").hasLogo()).isFalse(); + } + + @Test + void everyCollectionIsFrozenAtConstruction() { + List