Skip to content

Deals, Sales Items and Payment Terms Queries

Data model reference: ../data-model/deals-sales-items-payment-terms.md


1. Executive Summary

This document catalogues every read query implemented against the Deals, Sales Items and Payment Terms domain tables. The queries fall into three functional groups:

GroupPurposePrimary tables
Deal master dataRetrieve, search, and list deals with their associated partiesdeal, deal_party
Sales pipeline itemsList, filter, and look up sales items that arrive through sales blockssales_item, sales_block, payment_term
Sales metadataRetrieve extensible key-value metadata attached to sales itemssales_meta_data

Most queries in this domain are display-oriented: they join to reference tables (party, code_master, department, uta_entity) to resolve human-readable names for foreign-key identifiers. Several queries also compute aggregates such as payment term counts, gross totals, commission totals, and collection progress.


2. Key Queries

2.1 Deal Master Data

2.1.1 Get Deal by ID

Operation: getDealById

Input Parameters:

  • deal_id: integer (required) — deal.deal_id

Tables & Joins:

Base TableJoinJoined TableConditionPurpose
dealBase record for the deal
deal_partySeparate querypartydeal_party.party_id = party.party_idResolve party display name, first name, last name, company name
deal_partySeparate querycode_master (as party_role)deal_party.party_role_type_cd = party_role.code_master_cd AND party_role.code_master_type = 'PARTY_ROLE_TYPE_CD'Resolve human-readable party role description

Filters:

  • deal.deal_id = :deal_id
  • deal_party.deal_id = :deal_id (applied to the parties sub-query)

Computed Values:

  • None

Returns: One deal record enriched with a parties array, each element containing deal_party fields plus resolved party_role_name, first_name, last_name, company_name, and display_name; returns null if the deal does not exist.

NOTE

The deal record and the parties are fetched in two separate queries and assembled in memory. If the deal does not exist, the query short-circuits and returns null without executing the parties query.


2.1.2 List All Deals

Operation: getAllDeals

Input Parameters:

  • limit: integer (optional, default 50) — maximum rows to return
  • offset: integer (optional, default 0) — rows to skip for pagination

Tables & Joins:

Base TableJoinJoined TableConditionPurpose
dealAll deal records, no joins needed

Filters:

  • None

Computed Values:

  • None

Returns: Array of deal rows ordered by deal.deal_id DESC, limited to :limit rows starting at :offset.


2.1.3 Search Deals

Operation: searchDeals

Input Parameters:

  • deal_reference: string (optional) — partial match against deal.deal_reference (case-insensitive)
  • deal_name: string (optional) — partial match against deal.deal_name (case-insensitive)
  • query: string (optional) — free-text match against deal.deal_name (case-insensitive)
  • start_date_from: date (optional) — lower bound on deal.deal_start_dt
  • start_date_to: date (optional) — upper bound on deal.deal_start_dt
  • end_date_from: date (optional) — lower bound on deal.deal_end_dt
  • end_date_to: date (optional) — upper bound on deal.deal_end_dt
  • active_ind: boolean (optional) — exact match on deal.active_ind
  • limit: integer (optional, default 50) — maximum rows to return

Tables & Joins:

Base TableJoinJoined TableConditionPurpose
dealAll criteria applied directly to deal columns

Filters:

  • If deal_reference provided: deal.deal_reference ILIKE %{deal_reference}%
  • If deal_name provided: deal.deal_name ILIKE %{deal_name}%
  • If query provided: deal.deal_name ILIKE %{query}%
  • If start_date_from provided: deal.deal_start_dt >= :start_date_from
  • If start_date_to provided: deal.deal_start_dt <= :start_date_to
  • If end_date_from provided: deal.deal_end_dt >= :end_date_from
  • If end_date_to provided: deal.deal_end_dt <= :end_date_to
  • If active_ind provided: deal.active_ind = :active_ind
  • All non-null criteria are combined with AND

Computed Values:

  • None

Returns: Array of deal rows matching all supplied criteria, ordered by deal.deal_id DESC, limited to :limit rows.


2.1.4 Get Deals by Client

Operation: getDealsByClient

Input Parameters:

  • client_id: integer (required) — party.party_id of the client

Tables & Joins:

Base TableJoinJoined TableConditionPurpose
dealINNERdeal_partydeal.deal_id = deal_party.deal_idPhase 1: identify deals where the client is a party
dealLEFTsales_itemdeal.deal_id = sales_item.deal_idPhase 2: compute aggregate financial summaries
deal_partyLEFTpartydeal_party.party_id = party.party_idPhase 3: resolve party display names
deal_partyLEFTcode_master (as party_role)deal_party.party_role_type_cd = party_role.code_master_cd AND party_role.code_master_type = 'PARTY_ROLE_TYPE_CD'Phase 3: resolve party role descriptions

Filters:

  • Phase 1: deal_party.party_id = :client_id
  • Phase 2: deal.deal_id IN (deal IDs from Phase 1)
  • Phase 3: deal_party.deal_id IN (deal IDs from Phase 1)

Computed Values:

  • sales_item_count: COUNT(sales_item.sales_item_id) — number of sales items on each deal
  • total_gross_amt: COALESCE(SUM(sales_item.gross_amt), 0) — sum of gross amounts across all sales items
  • total_commission_amt: COALESCE(SUM(sales_item.uta_commission_amt), 0) — sum of UTA commission amounts across all sales items

Returns: Array of deal records for all deals where :client_id is a party, each enriched with sales_item_count, total_gross_amt, total_commission_amt, and a parties array; ordered by deal.deal_id DESC.

NOTE

This query executes in three phases: (1) identify matching deal IDs via deal_party, (2) fetch deals with aggregates from sales_item, (3) fetch all parties for those deals. The three result sets are assembled in memory.


2.2 Sales Pipeline Items

2.2.1 List All Sales Pipeline Items

Operation: getSalesItems

Input Parameters:

  • None

Tables & Joins:

Base TableJoinJoined TableConditionPurpose
sales_itemLEFTsales_blocksales_item.sales_block_id = sales_block.sales_block_idExpose process_status_cd and error_description from the ingest batch
sales_itemLEFTpayment_termsales_block.sales_block_id = payment_term.sales_block_idCount payment terms in the same sales block
sales_itemLEFTdealsales_item.deal_id = deal.deal_idResolve deal_name
sales_itemLEFTparty (client)sales_item.client_entity_id = party.party_idResolve client display_name
sales_itemLEFTparty (as buyer_party)sales_item.buyer_entity_id = buyer_party.party_idResolve buyer display_name
sales_itemLEFTparty (as contracted_party)sales_item.contracted_party_id = contracted_party.party_idResolve contracted party display_name
sales_itemLEFTdepartmentsales_item.department_id = department.department_idResolve department_name
sales_itemLEFTuta_entitysales_item.uta_entity_id = uta_entity.uta_entity_idResolve uta_entity_name
sales_itemLEFTcode_master (as rev_rec_style)sales_item.rev_rec_style_cd = rev_rec_style.code_master_cd AND rev_rec_style.code_master_type = 'REVENUE_ITEM_REC_STYLE_CD'Resolve revenue recognition style description
sales_itemLEFTcode_master (as rev_date_status)sales_item.revenue_date_status_cd = rev_date_status.code_master_cd AND rev_date_status.code_master_type = 'REVENUE_ITEM_DATE_STATUS_CD'Resolve revenue date status description
sales_itemLEFTcode_master (as sales_item_status)sales_item.sales_item_status_cd = sales_item_status.code_master_cd AND sales_item_status.code_master_type = 'REVENUE_ITEM_STATUS_CD'Resolve sales item status description
sales_itemLEFTcode_master (as comm_type)sales_item.uta_commission_type = comm_type.code_master_cd AND comm_type.code_master_type = 'COMMISSION_TYPE_CD'Resolve commission type description

Filters:

  • None

Computed Values:

  • payment_term_count: COUNT(payment_term.payment_term_id) — number of payment terms in the same sales block
  • closed_item_ind: CASE WHEN COALESCE(sales_item.gross_amt, 0) = 0 THEN true ELSE false END — whether the item is effectively closed (zero gross amount)

Returns: Array of all sales_item rows with reference fields resolved plus payment_term_count and closed_item_ind, grouped by all selected columns, ordered by sales_item.updated_dt DESC.


2.2.2 Get Sales Pipeline Items by Deal

Operation: getSalesItemsByDeal

Input Parameters:

  • deal_id: integer (required) — sales_item.deal_id

Tables & Joins:

Base TableJoinJoined TableConditionPurpose
sales_itemLEFTsales_blocksales_item.sales_block_id = sales_block.sales_block_idExpose processing status from ingest batch
sales_itemLEFTpayment_termsales_block.sales_block_id = payment_term.sales_block_idCount distinct payment terms
sales_itemLEFTdealsales_item.deal_id = deal.deal_idResolve deal_name
sales_itemLEFTparty (client)sales_item.client_entity_id = party.party_idResolve client display_name
sales_itemLEFTparty (as buyer_party)sales_item.buyer_entity_id = buyer_party.party_idResolve buyer display_name
sales_itemLEFTparty (as contracted_party)sales_item.contracted_party_id = contracted_party.party_idResolve contracted party display_name
sales_itemLEFTdepartmentsales_item.department_id = department.department_idResolve department_name
sales_itemLEFTuta_entitysales_item.uta_entity_id = uta_entity.uta_entity_idResolve uta_entity_name
sales_itemLEFTcode_master (as rev_rec_style)sales_item.rev_rec_style_cd = rev_rec_style.code_master_cd AND rev_rec_style.code_master_type = 'REVENUE_ITEM_REC_STYLE_CD'Resolve revenue recognition style description
sales_itemLEFTcode_master (as rev_date_status)sales_item.revenue_date_status_cd = rev_date_status.code_master_cd AND rev_date_status.code_master_type = 'REVENUE_ITEM_DATE_STATUS_CD'Resolve revenue date status description
sales_itemLEFTcode_master (as sales_item_status)sales_item.sales_item_status_cd = sales_item_status.code_master_cd AND sales_item_status.code_master_type = 'REVENUE_ITEM_STATUS_CD'Resolve sales item status description
sales_itemLEFTcode_master (as comm_type)sales_item.uta_commission_type = comm_type.code_master_cd AND comm_type.code_master_type = 'COMMISSION_TYPE_CD'Resolve commission type description
sales_itemLEFTsubquery collected_amountssales_item.sales_item_ref = collected_amounts.sales_item_refCollection progress from downstream billing items

The collected_amounts subquery joins:

Base TableJoinJoined TableConditionPurpose
billing_itemINNERrevenue_itemsbilling_item.revenue_item_id = revenue_items.revenue_item_idLink billing items back to sales item reference
billing_itemINNERbilling_item_detailbilling_item.billing_item_id = billing_item_detail.billing_item_idAccess REV/PAY amounts for collection aggregation

Subquery filters: billing_item.current_item_ind = true AND billing_item.open_item_ind = false; grouped by revenue_items.sales_item_ref.

Filters:

  • sales_item.deal_id = :deal_id

Computed Values:

  • payment_term_count: COUNT(DISTINCT payment_term.payment_term_id) — number of distinct payment terms
  • gross_collected: COALESCE(collected_amounts.gross_collected, 0) — sum of PAY billing_item_detail.billing_item_detail_gross_amt for closed billing items
  • commission_collected: COALESCE(collected_amounts.commission_collected, 0) — sum of REV billing_item_detail.billing_item_detail_amt for closed billing items
  • closed_item_ind: CASE WHEN gross_collected = COALESCE(sales_item.gross_amt, 0) THEN true ELSE false END — whether collected gross equals expected gross

Returns: Array of sales_item rows for the given deal with all reference fields resolved plus gross_collected, commission_collected, and deal-aware closed_item_ind, ordered by sales_item.updated_dt DESC.


2.2.3 Get Sales Pipeline Items by Client

Operation: getSalesItemsByClient

Input Parameters:

  • client_entity_id: integer (required) — party.party_id of the client

Tables & Joins:

Base TableJoinJoined TableConditionPurpose
sales_itemINNERdeal_partysales_item.deal_id = deal_party.deal_id AND deal_party.party_id = :client_entity_idRestrict results to deals where the client is a party

All other joins are identical to 2.2.2, including the collected_amounts subquery.

Filters:

  • Enforced via INNER JOIN: deal_party.party_id = :client_entity_id

Computed Values:

  • Same as 2.2.2: payment_term_count, gross_collected, commission_collected, closed_item_ind

Returns: Array of sales_item rows for all deals where :client_entity_id is a party, with identical shape to 2.2.2, ordered by sales_item.updated_dt DESC.


2.2.4 Get Sales Pipeline Payment Terms by Sales Item

Operation: getPaymentTermsBySalesItem

Input Parameters:

  • sales_item_id: integer (required) — sales_item.sales_item_id

Tables & Joins:

Base TableJoinJoined TableConditionPurpose
sales_itemStep 1: look up sales_item.sales_block_id for the given sales_item_id
payment_termStep 2: query payment terms by the resolved sales_block_id

Filters:

  • Step 1: sales_item.sales_item_id = :sales_item_id
  • Step 2: payment_term.sales_block_id = {sales_block_id from Step 1}

Computed Values:

  • None

Returns: Array of payment_term rows belonging to the same sales block as the specified sales item, ordered by payment_term.due_dt ASC.


2.2.5 Get Sales Pipeline Payment Term by Reference

Operation: getPaymentTermByRef

Input Parameters:

  • payment_term_ref: string (required) — stable reference identifier — payment_term.payment_term_ref

Tables & Joins:

Base TableJoinJoined TableConditionPurpose
payment_termFind the latest version row matching the reference

Filters:

  • payment_term.payment_term_ref = :payment_term_ref
  • Ordered by payment_term.payment_term_ver DESC, limit 1

Computed Values:

  • None

Returns: The single payment_term row with the highest payment_term_ver for the given reference, or null if not found.


2.2.6 Get Sales Pipeline Sales Item by Sales Block ID

Operation: getSalesItemBySalesBlockId

Input Parameters:

  • sales_block_id: integer (required) — sales_item.sales_block_id

Tables & Joins:

Base TableJoinJoined TableConditionPurpose
sales_itemDirect lookup of the sales item for a given block

Filters:

  • sales_item.sales_block_id = :sales_block_id

Computed Values:

  • None

Returns: One raw sales_item row for the given sales block, or null if not found; limited to 1 row.


2.2.7 Get Payment Term Count by Sales Block ID

Operation: getPaymentTermCountBySalesBlockId

Input Parameters:

  • sales_block_id: integer (required) — payment_term.sales_block_id

Tables & Joins:

Base TableJoinJoined TableConditionPurpose
payment_termCount payment terms in the specified block

Filters:

  • payment_term.sales_block_id = :sales_block_id

Computed Values:

  • count: COUNT(*) — total number of payment terms in the block

Returns: A single scalar object { count: integer } with the payment term count for the specified sales block.


2.3 Sales Metadata

2.3.1 Get Sales Metadata by Sales Item Reference

Operation: getSalesMetaDataBySalesItemRef

Input Parameters:

  • sales_item_ref: string (required) — sales_meta_data.sales_item_ref

Tables & Joins:

Base TableJoinJoined TableConditionPurpose
sales_meta_dataAll metadata for the reference across all versions

Filters:

  • sales_meta_data.sales_item_ref = :sales_item_ref

Computed Values:

  • None

Returns: Array of all sales_meta_data rows linked to the given sales_item_ref, ordered by sales_meta_data.created_dt DESC.


2.3.2 Get Sales Metadata by Type and Reference

Operation: getSalesMetaDataByTypeAndRef

Input Parameters:

  • meta_data_type_cd: string (required) — sales_meta_data.meta_data_type_cd
  • sales_item_ref: string (required) — sales_meta_data.sales_item_ref

Tables & Joins:

Base TableJoinJoined TableConditionPurpose
sales_meta_dataMetadata filtered by both type and reference

Filters:

  • sales_meta_data.meta_data_type_cd = :meta_data_type_cd
  • sales_meta_data.sales_item_ref = :sales_item_ref
  • Both conditions combined with AND

Computed Values:

  • None

Returns: Array of sales_meta_data rows matching both the type code and sales item reference, ordered by sales_meta_data.created_dt DESC.


2.3.3 Get Sales Metadata by Type, Reference, and Effective Date

Operation: getSalesMetaDataByTypeRefAndDate

Input Parameters:

  • meta_data_type_cd: string (required) — sales_meta_data.meta_data_type_cd
  • sales_item_ref: string (required) — sales_meta_data.sales_item_ref
  • date: date string (required) — the effective date to evaluate against sales_meta_data.start_dt and sales_meta_data.end_dt

Tables & Joins:

Base TableJoinJoined TableConditionPurpose
sales_meta_dataMetadata filtered by type, reference, and effective date range

Filters:

  • sales_meta_data.meta_data_type_cd = :meta_data_type_cd
  • sales_meta_data.sales_item_ref = :sales_item_ref
  • sales_meta_data.start_dt <= :date
  • sales_meta_data.end_dt >= :date OR sales_meta_data.end_dt IS NULL
  • All conditions combined with AND

Computed Values:

  • None

Returns: Array of sales_meta_data rows that are effective on :date, filtered by type and reference, ordered by sales_meta_data.created_dt DESC.


2.4 Operational Metrics

2.4.1 Get Unprocessed Sales Blocks Count

Operation: getSalesBlocksNotProcessedMetric

Input Parameters:

  • None

Tables & Joins:

Base TableJoinJoined TableConditionPurpose
sales_blockCount blocks awaiting processing

Filters:

  • sales_block.process_status_cd != 'P'

Computed Values:

  • count: COUNT(*) — number of sales blocks not yet in 'P' (Processed) status

Returns: A single scalar object { count: integer } representing the number of unprocessed sales blocks.


2.4.2 Get Daily Sales Metrics

Operation: getDailySalesMetrics

Input Parameters:

  • None

Tables & Joins:

Base TableJoinJoined TableConditionPurpose
sales_itemAggregate gross and commission for today's updated items

Filters:

  • DATE(sales_item.updated_dt) = CURRENT_DATE

Computed Values:

  • total_gross: COALESCE(SUM(sales_item.gross_amt), 0) — total gross amount across all sales items updated today
  • total_commission: COALESCE(SUM(sales_item.uta_commission_amt), 0) — total UTA commission across all sales items updated today

Returns: A single scalar object { total_gross: string, total_commission: string } with aggregated amounts for the current calendar day.


3. Calculations & Formulas

3.1 UTA Commission Amount

text
uta_commission_amt = gross_amt * uta_commission_perc
  • Source: sales_item.gross_amt, sales_item.uta_commission_perc
  • Precision: decimal(15,2) — result rounded to 2 decimal places
  • Condition: Applied only when uta_commission_type = 'P' (Percent). When uta_commission_type = 'F' (Flat), uta_commission_amt is used as-is and this formula is not applied.
  • Example: $10,000.00 * 0.1000 = $1,000.00

3.2 Payment Term Gross Sum Validation

text
SUM(payment_term.gross_amt) = sales_item.gross_amt
  • Source: payment_term.gross_amt, sales_item.gross_amt
  • Precision: decimal(15,2)
  • Tolerance: 0.01 (one cent)
  • Purpose: Validated before processing; ensures the sum of all payment terms for a sales item equals the sales item gross amount.
  • Example: Three payment terms of $3,333.33, $3,333.33, $3,333.34 sum to $10,000.00 and satisfy a $10,000.00 gross.

3.3 Collection Progress (Sales Pipeline)

text
gross_collected = SUM(
  CASE WHEN billing_item_detail.billing_item_detail_type_cd = 'PAY'
       THEN billing_item_detail.billing_item_detail_gross_amt
       ELSE 0
  END
)

commission_collected = SUM(
  CASE WHEN billing_item_detail.billing_item_detail_type_cd = 'REV'
       THEN billing_item_detail.billing_item_detail_amt
       ELSE 0
  END
)
  • Source: billing_item_detail.billing_item_detail_type_cd, billing_item_detail.billing_item_detail_gross_amt, billing_item_detail.billing_item_detail_amt
  • Scope: Only billing_item rows where current_item_ind = true AND open_item_ind = false
  • Used in: Queries 2.2.2 and 2.2.3 via the collected_amounts subquery
  • Example: A deal with two closed PAY billing item details of $4,000.00 and $6,000.00 yields gross_collected = $10,000.00.

3.4 Closed Item Indicator

For the full list query (2.2.1):

text
closed_item_ind = (COALESCE(gross_amt, 0) = 0)

For deal-filtered and client-filtered queries (2.2.2, 2.2.3):

text
closed_item_ind = (COALESCE(gross_collected, 0) = COALESCE(gross_amt, 0))
  • Source (full list): sales_item.gross_amt
  • Source (filtered): collected_amounts.gross_collected, sales_item.gross_amt
  • Precision: Boolean result derived from decimal(15,2) comparison

3.5 Effective Date Range Logic (Metadata)

text
start_dt <= {date} AND (end_dt >= {date} OR end_dt IS NULL)
  • Source: sales_meta_data.start_dt, sales_meta_data.end_dt
  • Used in: Query 2.3.3
  • Null semantics: A null end_dt means the metadata entry is still active with no defined expiration — it matches any query date on or after start_dt.
  • Example: A metadata entry with start_dt = '2024-01-01' and end_dt = NULL is effective for any date >= '2024-01-01'.

4. Cross-References

4.1 Reference Table Dependencies

All queries in this domain join to one or more of the following reference tables:

Reference TableJoined FromPurpose
partydeal_party.party_id, sales_item.client_entity_id, sales_item.buyer_entity_id, sales_item.contracted_party_idResolve display_name, first_name, last_name, company_name
departmentsales_item.department_idResolve department_name
uta_entitysales_item.uta_entity_idResolve uta_entity_name
dealsales_item.deal_idResolve deal_name
code_masterAll *_cd columnsResolve human-readable descriptions via code_master_desc

4.2 Code Master Lookups Used

Alias in Queriescode_master_typeResolves Column
rev_rec_styleREVENUE_ITEM_REC_STYLE_CDrev_rec_style_cd
rev_date_statusREVENUE_ITEM_DATE_STATUS_CDrevenue_date_status_cd
sales_item_statusREVENUE_ITEM_STATUS_CDsales_item_status_cd
comm_typeCOMMISSION_TYPE_CDuta_commission_type
due_date_statusREVENUE_ITEM_DATE_STATUS_CDdue_date_status_cd
party_rolePARTY_ROLE_TYPE_CDparty_role_type_cd

4.3 Downstream Domain Dependencies

Downstream DomainTable(s) UsedQuery SectionsPurpose
Billing Itemsbilling_item, billing_item_detail2.2.2, 2.2.3Collection progress aggregation (gross_collected, commission_collected)
Revenuerevenue_items2.2.2, 2.2.3Joins billing items back to sales items via revenue_items.sales_item_ref

See Billing Items Data Model for the downstream table definitions.

Confidential. For internal use only.