generated: '2026-08-11' method: derived source: openapi/_original/d-tools-cloud-openapi.json, openapi/_original/d-tools-si-openapi.json note: 'Entity-relationship graph derived from $ref edges in both D-Tools OpenAPI documents. Relationships are only recorded where the specification actually declares a $ref; the many id-shaped scalar fields (clientId, projectId, taxId, phaseId, laborTypeId, catalogId, ...) are listed per entity as identifier_fields but are NOT promoted to relationships, because neither specification declares what they reference. That is the central modelling gap here: the two APIs share the same business nouns (Client, Project, Quote/Opportunity, Change Order, Purchase Order, Product/Catalog, Time Entry/Time Sheet, Service) but define them as two independent, non-interoperable schema sets with no shared identifier space.' apis: - api: D-Tools Cloud API entity_count: 92 relationship_count: 96 core_entities: - ClientDetail - ProductDetail - OpportunityDetail - QuoteDetail - ProjectDetail - ChangeOrderDetail - PurchaseOrderDetail - ServiceContractDetail - TimeEntryDetail - FileDetail - api: D-Tools SI API entity_count: 93 relationship_count: 25 core_entities: - Project - SITask - NewTask - ServiceOrder - ServicePlan - PurchaseOrder - TimeSheet - ProductCatalog - Client - Vendor entities: - name: Address api: cloud fields: 7 root: false - name: AddressDetail api: cloud fields: 7 root: false - name: ChangeOrderAdjustment api: cloud fields: 7 root: false identifier_fields: - taxId - name: ChangeOrderDetail api: cloud fields: 26 root: true identifier_fields: - id - projectId - number - name: ChangeOrderDiscount api: cloud fields: 8 root: false identifier_fields: - id - name: ChangeOrderItem api: cloud fields: 47 root: false identifier_fields: - id - catalogId - laborTypeId - partNumber - lengthId - discountId - taxId - locationId - systemId - phaseId - name: ChangeOrderItemLaborItem api: cloud fields: 7 root: false identifier_fields: - laborTypeId - phaseId - name: ChangeOrderLaborType api: cloud fields: 13 root: false identifier_fields: - id - catalogId - taxId - name: ChangeOrderLength api: cloud fields: 3 root: false identifier_fields: - id - name: ChangeOrderLite api: cloud fields: 9 root: false identifier_fields: - id - number - name: ChangeOrderLocation api: cloud fields: 6 root: false identifier_fields: - id - number - parentId - name: ChangeOrderPayment api: cloud fields: 20 root: false identifier_fields: - id - number - integrationNumber - isAutoPaid - name: ChangeOrderPaymentTerm api: cloud fields: 8 root: false identifier_fields: - paymentTermId - name: ChangeOrderPhase api: cloud fields: 2 root: false identifier_fields: - id - name: ChangeOrderSystem api: cloud fields: 3 root: false identifier_fields: - id - name: ChangeOrderTax api: cloud fields: 7 root: false identifier_fields: - id - childIds - name: ChangeOrderTaxSettings api: cloud fields: 3 root: false identifier_fields: - taxId - laborTaxId - name: Client api: cloud fields: 15 root: true identifier_fields: - number - name: ClientDetail api: cloud fields: 22 root: true identifier_fields: - id - number - parentId - name: ClientLite api: cloud fields: 13 root: false identifier_fields: - id - number - name: Contact api: cloud fields: 20 root: false identifier_fields: - id - name: ContactDetail api: cloud fields: 20 root: false identifier_fields: - id - name: FileDetail api: cloud fields: 5 root: true identifier_fields: - id - parentObjectId - name: FileInfo api: cloud fields: 3 root: false identifier_fields: - id - name: GetClientsResult api: cloud fields: 2 root: true - name: GetOpportunitiesResult api: cloud fields: 2 root: true - name: GetProductsResult api: cloud fields: 2 root: true - name: GetProjectsResult api: cloud fields: 2 root: true - name: GetPurchaseOrdersResult api: cloud fields: 2 root: true - name: GetServiceContractsResult api: cloud fields: 2 root: true - name: GetTimeEntriesResult api: cloud fields: 2 root: true - name: NewOpportunity api: cloud fields: 25 root: true identifier_fields: - associatedProjectId - clientId - number - name: OpportunityDetail api: cloud fields: 42 root: true identifier_fields: - id - clientId - clientNumber - number - quoteIds - name: OpportunityLite api: cloud fields: 23 root: false identifier_fields: - id - clientId - clientNumber - number - name: ProductAccessory api: cloud fields: 8 root: false identifier_fields: - itemId - name: ProductBarcode api: cloud fields: 4 root: true identifier_fields: - id - name: ProductDetail api: cloud fields: 47 root: true identifier_fields: - id - partNumber - name: ProductImage api: cloud fields: 3 root: false - name: ProductLaborItem api: cloud fields: 7 root: false - name: ProductPrice api: cloud fields: 4 root: true identifier_fields: - id - name: ProductSpecification api: cloud fields: 2 root: false - name: ProductStatus api: cloud fields: 3 root: true identifier_fields: - id - name: ProductSubscription api: cloud fields: 3 root: false identifier_fields: - itemId - name: ProjectAdjustment api: cloud fields: 7 root: false identifier_fields: - taxId - name: ProjectDetail api: cloud fields: 45 root: true identifier_fields: - id - clientId - clientNumber - number - changeOrderIds - name: ProjectDiscount api: cloud fields: 8 root: false identifier_fields: - id - name: ProjectItem api: cloud fields: 46 root: false identifier_fields: - id - catalogId - laborTypeId - partNumber - lengthId - discountId - taxId - locationId - systemId - phaseId - name: ProjectItemLaborItem api: cloud fields: 7 root: false identifier_fields: - laborTypeId - phaseId - name: ProjectLaborType api: cloud fields: 13 root: false identifier_fields: - id - catalogId - taxId - name: ProjectLength api: cloud fields: 3 root: false identifier_fields: - id - name: ProjectLite api: cloud fields: 16 root: false identifier_fields: - id - clientId - clientNumber - number - name: ProjectLocation api: cloud fields: 6 root: false identifier_fields: - id - number - parentId - name: ProjectPayment api: cloud fields: 20 root: false identifier_fields: - id - number - integrationNumber - isAutoPaid - name: ProjectPaymentTerm api: cloud fields: 8 root: false identifier_fields: - paymentTermId - name: ProjectPhase api: cloud fields: 2 root: false identifier_fields: - id - name: ProjectSystem api: cloud fields: 3 root: false identifier_fields: - id - name: ProjectTax api: cloud fields: 7 root: false identifier_fields: - id - childIds - name: ProjectTaxSettings api: cloud fields: 3 root: false identifier_fields: - taxId - laborTaxId - name: PurchaseOrderDealerContact api: cloud fields: 6 root: false - name: PurchaseOrderDetail api: cloud fields: 30 root: true identifier_fields: - id - number - quoteNumber - accountNumber - shipmentTrackingNumber - name: PurchaseOrderLite api: cloud fields: 11 root: false identifier_fields: - id - number - name: PurchaseOrderProduct api: cloud fields: 19 root: false identifier_fields: - catalogId - partNumber - supplierPartNumber - shipmentTrackingNumber - projectId - projectNumber - name: PurchaseOrderSupplierContact api: cloud fields: 9 root: false - name: QuoteAdjustment api: cloud fields: 7 root: false identifier_fields: - taxId - name: QuoteAlternateSet api: cloud fields: 6 root: false identifier_fields: - id - name: QuoteDetail api: cloud fields: 36 root: true identifier_fields: - id - opportunityId - number - name: QuoteDiscount api: cloud fields: 8 root: false identifier_fields: - id - name: QuoteItem api: cloud fields: 51 root: false identifier_fields: - id - catalogId - laborTypeId - partNumber - lengthId - discountId - taxId - locationId - systemId - phaseId - name: QuoteItemLaborItem api: cloud fields: 7 root: false identifier_fields: - laborTypeId - phaseId - name: QuoteLaborType api: cloud fields: 13 root: false identifier_fields: - id - catalogId - taxId - name: QuoteLength api: cloud fields: 3 root: false identifier_fields: - id - name: QuoteLite api: cloud fields: 14 root: false identifier_fields: - id - number - name: QuoteLocation api: cloud fields: 8 root: false identifier_fields: - id - number - parentId - name: QuotePaymentTerm api: cloud fields: 7 root: false identifier_fields: - paymentTermId - name: QuotePhase api: cloud fields: 2 root: false identifier_fields: - id - name: QuoteServicePlan api: cloud fields: 32 root: false identifier_fields: - dynamicPriceFieldId - clusterId - name: QuoteServicePlanBillingFrequency api: cloud fields: 3 root: false - name: QuoteServicePlanFeature api: cloud fields: 21 root: false - name: QuoteServicePlanLength api: cloud fields: 3 root: false - name: QuoteSystem api: cloud fields: 5 root: false identifier_fields: - id - name: QuoteTax api: cloud fields: 7 root: false identifier_fields: - id - childIds - name: QuoteTaxSettings api: cloud fields: 3 root: false identifier_fields: - taxId - laborTaxId - name: ResourceDetail api: cloud fields: 6 root: false - name: ServiceContractDetail api: cloud fields: 44 root: true identifier_fields: - id - clientId - clientNumber - projectId - projectNumber - number - dynamicPriceFieldId - name: ServiceContractFeature api: cloud fields: 21 root: false - name: ServiceContractLite api: cloud fields: 18 root: false identifier_fields: - id - clientId - clientNumber - projectId - projectNumber - number - name: ServiceContractPayment api: cloud fields: 20 root: false identifier_fields: - id - number - integrationNumber - isAutoPaid - name: ServiceContractPaymentSchedule api: cloud fields: 6 root: false identifier_fields: - paymentTermId - name: TimeEntryDetail api: cloud fields: 24 root: false identifier_fields: - clientId - clientNumber - projectId - projectNumber - serviceCallId - serviceCallNumber - name: UpdateOpportunity api: cloud fields: 26 root: true identifier_fields: - associatedProjectId - clientId - number - name: UpdateProject api: cloud fields: 15 root: true identifier_fields: - clientId - number - name: Microsoft.AspNetCore.Mvc.ProblemDetails api: cloud fields: 5 root: true - name: Address api: si fields: 8 root: false - name: AppProjectComment api: si fields: 3 root: true identifier_fields: - projectId - name: CatalogInfo api: si fields: 5 root: false identifier_fields: - id - name: CatalogsResult api: si fields: 2 root: true - name: Client api: si fields: 42 root: false identifier_fields: - id - number - integrationId - name: ClientAddress api: si fields: 10 root: false identifier_fields: - typeId - name: ClientContact api: si fields: 15 root: false - name: ClientInfo api: si fields: 7 root: false identifier_fields: - id - name: ClientList api: si fields: 4 root: true identifier_fields: - id - name: ClientsResult api: si fields: 2 root: true - name: Contact api: si fields: 6 root: false - name: ContactInfo api: si fields: 5 root: false - name: DeleteTasksRequest api: si fields: 1 root: true identifier_fields: - ids - name: ItemLaborType api: si fields: 3 root: false - name: Location api: si fields: 7 root: false identifier_fields: - id - number - fullNumber - parentId - name: LockChangeOrderInfo api: si fields: 4 root: false identifier_fields: - integrationChangeOrderId - number - name: LockChangeOrderStatus api: si fields: 4 root: true identifier_fields: - projectId - messageId - name: LockChangeOrderStatusInfo api: si fields: 4 root: false identifier_fields: - integrationChangeOrderId - number - name: MessageResponse api: si fields: 2 root: true - name: MessageStatus api: si fields: 5 root: true identifier_fields: - id - typeId - statusId - name: MiscItem api: si fields: 4 root: false - name: NewChangeOrderInfo api: si fields: 70 root: true identifier_fields: - projectId - integrationChangeOrderId - typeId - name: NewServiceOrder api: si fields: 9 root: true identifier_fields: - integrationId - clientNumber - name: NewTask api: si fields: 35 root: true identifier_fields: - integrationId - projectId - name: NewTimeSheet api: si fields: 48 root: false identifier_fields: - entityId - entitySourceId - typeId - name: NewTimeSheetsRequest api: si fields: 2 root: true - name: Package api: si fields: 84 root: false identifier_fields: - id - typeId - componentId - partNumber - locationId - systemId - parentId - name: PartialProjectInfo api: si fields: 18 root: false identifier_fields: - id - integrationProjectId - messageId - clientId - clientNumber - number - coNumber - name: PartialProjectsResult api: si fields: 2 root: true - name: PaymentTerm api: si fields: 6 root: false identifier_fields: - coNumber - name: Product api: si fields: 131 root: false identifier_fields: - id - integrationProductId - manufacturerId - partNumber - vendorNumber - name: ProductCatalog api: si fields: 9 root: true identifier_fields: - id - deletedProductIds - name: Project api: si fields: 210 root: true identifier_fields: - id - integrationProjectId - clientId - integrationClientId - clientNumber - number - clientPONumber - productTaxId - laborTaxId - coNumber - name: ProjectComment api: si fields: 3 root: false - name: ProjectCommentsResult api: si fields: 2 root: true - name: ProjectInfo api: si fields: 18 root: false identifier_fields: - id - integrationProjectId - messageId - clientId - clientNumber - number - coNumber - name: ProjectItem api: si fields: 152 root: false identifier_fields: - id - typeId - siItemId - coChangeTypeId - manufacturerId - partNumber - componentId - serialNumber - laborCalculationMethodId - taxId - name: ProjectItemInfo api: si fields: 3 root: false - name: ProjectsResult api: si fields: 2 root: true - name: PublishProjectResponse api: si fields: 3 root: true identifier_fields: - projectId - messageId - name: PublishResponse api: si fields: 2 root: true identifier_fields: - messageId - name: PublishTaskResponse api: si fields: 3 root: true identifier_fields: - taskId - messageId - name: PurchaseOrder api: si fields: 28 root: true identifier_fields: - id - number - vendorRefNumber - trackingNumber - acctgNumber - name: PurchaseOrderContact api: si fields: 9 root: false - name: PurchaseOrderInfo api: si fields: 8 root: false identifier_fields: - id - number - name: PurchaseOrderItem api: si fields: 26 root: false identifier_fields: - id - typeId - manufacturerId - catalogId - partNumber - projectId - projectSIItemIds - serviceOrderId - trackingNumber - taxId - name: PurchaseOrderTax api: si fields: 5 root: false identifier_fields: - taxId - name: PurchaseOrdersResult api: si fields: 2 root: true - name: Resource api: si fields: 4 root: false - name: ResourceInfo api: si fields: 2 root: false - name: SITask api: si fields: 51 root: true identifier_fields: - id - projectId - projectNumber - number - name: ServiceOrder api: si fields: 62 root: true identifier_fields: - servicePlanNumber - id - clientNumber - clientId - acctgEstNumber - projectId - projectNumber - number - name: ServiceOrderInfo api: si fields: 10 root: false identifier_fields: - id - number - name: ServiceOrderLabor api: si fields: 45 root: false identifier_fields: - id - orderNumber - name: ServiceOrderProduct api: si fields: 42 root: false identifier_fields: - id - partNumber - orderNumber - name: ServiceOrderRepairItem api: si fields: 11 root: false identifier_fields: - id - partNumber - componentId - serialNumber - name: ServiceOrderResource api: si fields: 7 root: false - name: ServiceOrdersResult api: si fields: 2 root: true - name: ServicePlan api: si fields: 90 root: true identifier_fields: - id - clientNumber - clientId - projectId - projectNumber - number - name: ServicePlanFeature api: si fields: 3 root: false identifier_fields: - id - name: ServicePlanInfo api: si fields: 10 root: false identifier_fields: - id - number - name: ServicePlanItem api: si fields: 9 root: false identifier_fields: - id - name: ServicePlanProjectItem api: si fields: 21 root: false identifier_fields: - id - typeId - siItemId - partNumber - componentId - serialNumber - name: ServicePlansResult api: si fields: 2 root: true - name: ShipToAddress api: si fields: 9 root: false - name: SiteNote api: si fields: 3 root: false - name: System api: si fields: 5 root: false identifier_fields: - id - parentId - name: TaskInfo api: si fields: 10 root: false identifier_fields: - id - number - name: TaskItem api: si fields: 22 root: false identifier_fields: - id - siItemId - typeId - partNumber - componentId - serialNumber - name: TaskResource api: si fields: 7 root: false - name: TasksResult api: si fields: 2 root: true - name: Tax api: si fields: 6 root: false identifier_fields: - id - name: TimeSheet api: si fields: 57 root: true identifier_fields: - id - entityId - entitySourceId - projectNumber - taskOrSVONumber - name: TimeSheetEntry api: si fields: 11 root: false identifier_fields: - id - typeId - name: TimeSheetInfo api: si fields: 7 root: false identifier_fields: - id - number - name: TimeSheetsResult api: si fields: 2 root: true - name: UpdateClient api: si fields: 5 root: true identifier_fields: - integrationId - number - name: UpdateClientField api: si fields: 2 root: false identifier_fields: - clientFieldId - name: UpdateProject api: si fields: 21 root: true identifier_fields: - projectId - messageId - updateProjectItemFieldIds - name: UpdateProjectField api: si fields: 2 root: false identifier_fields: - projectFieldId - name: UpdateProjectItem api: si fields: 111 root: false identifier_fields: - componentId - siItemId - serialNumber - laborCalculationMethodId - orderNumber - trackingNumber - name: UpdateServiceOrder api: si fields: 5 root: true identifier_fields: - serviceOrderId - name: UpdateServiceOrderField api: si fields: 2 root: false identifier_fields: - serviceOrderFieldId - name: UpdateTask api: si fields: 6 root: true identifier_fields: - taskId - name: UpdateTaskField api: si fields: 2 root: false identifier_fields: - taskFieldId - name: UpdateTimeSheet api: si fields: 47 root: false identifier_fields: - id - typeId - name: UpdateTimeSheetsRequest api: si fields: 2 root: true - name: UpdateVendor api: si fields: 5 root: true identifier_fields: - integrationId - number - name: UpdateVendorField api: si fields: 2 root: false identifier_fields: - vendorFieldId - name: Vendor api: si fields: 15 root: false identifier_fields: - id - number - integrationId - name: VendorAddress api: si fields: 10 root: false identifier_fields: - typeId - name: VendorContact api: si fields: 15 root: false - name: VendorList api: si fields: 4 root: true identifier_fields: - id relationships: - from: ChangeOrderDetail kind: has_many to: ChangeOrderLocation via: locations api: cloud source: $ref - from: ChangeOrderDetail kind: has_many to: ChangeOrderSystem via: systems api: cloud source: $ref - from: ChangeOrderDetail kind: has_many to: ChangeOrderPhase via: phases api: cloud source: $ref - from: ChangeOrderDetail kind: has_many to: ChangeOrderLaborType via: laborTypes api: cloud source: $ref - from: ChangeOrderDetail kind: has_many to: ChangeOrderLength via: lengths api: cloud source: $ref - from: ChangeOrderDetail kind: has_many to: ChangeOrderDiscount via: discounts api: cloud source: $ref - from: ChangeOrderDetail kind: has_many to: ChangeOrderItem via: items api: cloud source: $ref - from: ChangeOrderDetail kind: has_many to: ChangeOrderAdjustment via: adjustments api: cloud source: $ref - from: ChangeOrderDetail kind: has_one to: ChangeOrderTaxSettings via: taxSettings api: cloud source: $ref - from: ChangeOrderDetail kind: has_many to: ChangeOrderTax via: taxes api: cloud source: $ref - from: ChangeOrderDetail kind: has_many to: ChangeOrderPaymentTerm via: paymentTerms api: cloud source: $ref - from: ChangeOrderDetail kind: has_many to: ChangeOrderPayment via: payments api: cloud source: $ref - from: ChangeOrderItem kind: has_many to: ChangeOrderItemLaborItem via: laborItems api: cloud source: $ref - from: Client kind: has_one to: Address via: billingAddress api: cloud source: $ref - from: Client kind: has_many to: Address via: siteAddresses api: cloud source: $ref - from: Client kind: has_many to: Contact via: contacts api: cloud source: $ref - from: ClientDetail kind: has_one to: AddressDetail via: billingAddress api: cloud source: $ref - from: ClientDetail kind: has_many to: AddressDetail via: siteAddresses api: cloud source: $ref - from: ClientDetail kind: has_many to: ContactDetail via: contacts api: cloud source: $ref - from: ClientDetail kind: has_many to: FileInfo via: files api: cloud source: $ref - from: GetClientsResult kind: has_many to: ClientLite via: clients api: cloud source: $ref - from: GetOpportunitiesResult kind: has_many to: OpportunityLite via: opportunities api: cloud source: $ref - from: GetProductsResult kind: has_many to: ProductDetail via: products api: cloud source: $ref - from: GetProjectsResult kind: has_many to: ProjectLite via: projects api: cloud source: $ref - from: GetPurchaseOrdersResult kind: has_many to: PurchaseOrderLite via: purchaseOrders api: cloud source: $ref - from: GetServiceContractsResult kind: has_many to: ServiceContractLite via: serviceContracts api: cloud source: $ref - from: GetTimeEntriesResult kind: has_many to: TimeEntryDetail via: timeEntries api: cloud source: $ref - from: NewOpportunity kind: has_one to: Address via: billingAddress api: cloud source: $ref - from: NewOpportunity kind: has_one to: Address via: siteAddress api: cloud source: $ref - from: NewOpportunity kind: has_many to: Contact via: contacts api: cloud source: $ref - from: OpportunityDetail kind: has_one to: AddressDetail via: billingAddress api: cloud source: $ref - from: OpportunityDetail kind: has_one to: AddressDetail via: siteAddress api: cloud source: $ref - from: OpportunityDetail kind: has_many to: ContactDetail via: contacts api: cloud source: $ref - from: OpportunityDetail kind: has_many to: ResourceDetail via: resources api: cloud source: $ref - from: OpportunityDetail kind: has_many to: FileInfo via: files api: cloud source: $ref - from: ProductDetail kind: has_many to: ProductImage via: images api: cloud source: $ref - from: ProductDetail kind: has_many to: ProductSpecification via: specifications api: cloud source: $ref - from: ProductDetail kind: has_many to: ProductLaborItem via: laborItems api: cloud source: $ref - from: ProductDetail kind: has_many to: ProductAccessory via: accessories api: cloud source: $ref - from: ProductDetail kind: has_many to: ProductSubscription via: subscriptions api: cloud source: $ref - from: ProjectDetail kind: has_one to: AddressDetail via: billingAddress api: cloud source: $ref - from: ProjectDetail kind: has_one to: AddressDetail via: siteAddress api: cloud source: $ref - from: ProjectDetail kind: has_many to: ContactDetail via: contacts api: cloud source: $ref - from: ProjectDetail kind: has_many to: ResourceDetail via: resources api: cloud source: $ref - from: ProjectDetail kind: has_many to: FileInfo via: files api: cloud source: $ref - from: ProjectDetail kind: has_many to: FileInfo via: planViews api: cloud source: $ref - from: ProjectDetail kind: has_many to: ProjectLocation via: locations api: cloud source: $ref - from: ProjectDetail kind: has_many to: ProjectSystem via: systems api: cloud source: $ref - from: ProjectDetail kind: has_many to: ProjectPhase via: phases api: cloud source: $ref - from: ProjectDetail kind: has_many to: ProjectLaborType via: laborTypes api: cloud source: $ref - from: ProjectDetail kind: has_many to: ProjectLength via: lengths api: cloud source: $ref - from: ProjectDetail kind: has_many to: ProjectDiscount via: discounts api: cloud source: $ref - from: ProjectDetail kind: has_many to: ProjectItem via: items api: cloud source: $ref - from: ProjectDetail kind: has_many to: ProjectAdjustment via: adjustments api: cloud source: $ref - from: ProjectDetail kind: has_one to: ProjectTaxSettings via: taxSettings api: cloud source: $ref - from: ProjectDetail kind: has_many to: ProjectTax via: taxes api: cloud source: $ref - from: ProjectDetail kind: has_many to: ProjectPaymentTerm via: paymentTerms api: cloud source: $ref - from: ProjectDetail kind: has_many to: ProjectPayment via: payments api: cloud source: $ref - from: ProjectItem kind: has_many to: ProjectItemLaborItem via: laborItems api: cloud source: $ref - from: PurchaseOrderDetail kind: has_one to: AddressDetail via: supplierAddress api: cloud source: $ref - from: PurchaseOrderDetail kind: has_many to: PurchaseOrderSupplierContact via: supplierContacts api: cloud source: $ref - from: PurchaseOrderDetail kind: has_one to: AddressDetail via: shippingAddress api: cloud source: $ref - from: PurchaseOrderDetail kind: has_one to: AddressDetail via: billingAddress api: cloud source: $ref - from: PurchaseOrderDetail kind: has_one to: PurchaseOrderDealerContact via: dealerContact api: cloud source: $ref - from: PurchaseOrderDetail kind: has_many to: FileInfo via: files api: cloud source: $ref - from: PurchaseOrderDetail kind: has_many to: PurchaseOrderProduct via: products api: cloud source: $ref - from: QuoteDetail kind: has_many to: FileInfo via: files api: cloud source: $ref - from: QuoteDetail kind: has_many to: FileInfo via: planViews api: cloud source: $ref - from: QuoteDetail kind: has_many to: QuoteLocation via: locations api: cloud source: $ref - from: QuoteDetail kind: has_many to: QuoteSystem via: systems api: cloud source: $ref - from: QuoteDetail kind: has_many to: QuotePhase via: phases api: cloud source: $ref - from: QuoteDetail kind: has_many to: QuoteLaborType via: laborTypes api: cloud source: $ref - from: QuoteDetail kind: has_many to: QuoteLength via: lengths api: cloud source: $ref - from: QuoteDetail kind: has_many to: QuoteDiscount via: discounts api: cloud source: $ref - from: QuoteDetail kind: has_many to: QuoteAlternateSet via: alternateSets api: cloud source: $ref - from: QuoteDetail kind: has_many to: QuoteItem via: items api: cloud source: $ref - from: QuoteDetail kind: has_many to: QuoteAdjustment via: adjustments api: cloud source: $ref - from: QuoteDetail kind: has_one to: QuoteTaxSettings via: taxSettings api: cloud source: $ref - from: QuoteDetail kind: has_many to: QuoteTax via: taxes api: cloud source: $ref - from: QuoteDetail kind: has_many to: QuotePaymentTerm via: paymentTerms api: cloud source: $ref - from: QuoteDetail kind: has_many to: QuoteServicePlan via: servicePlans api: cloud source: $ref - from: QuoteItem kind: has_many to: QuoteItemLaborItem via: laborItems api: cloud source: $ref - from: QuoteServicePlan kind: has_many to: QuoteServicePlanLength via: lengths api: cloud source: $ref - from: QuoteServicePlan kind: has_many to: QuoteServicePlanBillingFrequency via: billingFrequencies api: cloud source: $ref - from: QuoteServicePlan kind: has_many to: QuoteServicePlanFeature via: features api: cloud source: $ref - from: QuoteServicePlan kind: has_many to: FileInfo via: files api: cloud source: $ref - from: ServiceContractDetail kind: has_many to: ServiceContractFeature via: features api: cloud source: $ref - from: ServiceContractDetail kind: has_many to: FileInfo via: files api: cloud source: $ref - from: ServiceContractDetail kind: has_many to: ServiceContractPaymentSchedule via: paymentSchedules api: cloud source: $ref - from: ServiceContractDetail kind: has_many to: ServiceContractPayment via: payments api: cloud source: $ref - from: UpdateOpportunity kind: has_one to: Address via: billingAddress api: cloud source: $ref - from: UpdateOpportunity kind: has_one to: Address via: siteAddress api: cloud source: $ref - from: UpdateOpportunity kind: has_many to: Contact via: contacts api: cloud source: $ref - from: UpdateProject kind: has_one to: Address via: billingAddress api: cloud source: $ref - from: UpdateProject kind: has_one to: Address via: siteAddress api: cloud source: $ref - from: UpdateProject kind: has_many to: Contact via: contacts api: cloud source: $ref - from: NewTask kind: has_one to: ContactInfo via: contact api: si source: $ref - from: NewTask kind: has_one to: Address via: siteAddress api: si source: $ref - from: Project kind: has_one to: Address via: siteAddress api: si source: $ref - from: Project kind: has_one to: Address via: billingAddress api: si source: $ref - from: PurchaseOrder kind: has_one to: Address via: vendorAddress api: si source: $ref - from: PurchaseOrder kind: has_one to: ShipToAddress via: shipToAddress api: si source: $ref - from: SITask kind: has_one to: ContactInfo via: contact api: si source: $ref - from: SITask kind: has_one to: Address via: siteAddress api: si source: $ref - from: ServiceOrder kind: has_one to: ContactInfo via: contact api: si source: $ref - from: ServiceOrder kind: has_one to: Address via: billingAddress api: si source: $ref - from: ServiceOrder kind: has_one to: Address via: siteAddress api: si source: $ref - from: ServicePlan kind: has_one to: ContactInfo via: contact api: si source: $ref - from: ServicePlan kind: has_one to: Address via: billingAddress api: si source: $ref - from: ServicePlan kind: has_one to: Address via: siteAddress api: si source: $ref - from: UpdateClient kind: has_one to: Address via: siteAddress api: si source: $ref - from: UpdateClient kind: has_one to: Address via: billingAddress api: si source: $ref - from: UpdateProject kind: has_one to: Address via: siteAddress api: si source: $ref - from: UpdateProject kind: has_one to: Address via: billingAddress api: si source: $ref - from: UpdateServiceOrder kind: has_one to: ContactInfo via: contact api: si source: $ref - from: UpdateServiceOrder kind: has_one to: Address via: billingAddress api: si source: $ref - from: UpdateServiceOrder kind: has_one to: Address via: siteAddress api: si source: $ref - from: UpdateTask kind: has_one to: ContactInfo via: contact api: si source: $ref - from: UpdateTask kind: has_one to: Address via: siteAddress api: si source: $ref - from: UpdateVendor kind: has_one to: Address via: siteAddress api: si source: $ref - from: UpdateVendor kind: has_one to: Address via: billingAddress api: si source: $ref gaps: - No operationIds, so no entity-to-operation binding can be derived by name. - No id-reference fields are typed or documented; cross-entity joins are inferred by a consumer, not declared. - Cloud and SI model the same domain twice with different schema names and no shared identifier space; an integration spanning both products must maintain its own mapping table.