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:
| Group | Purpose | Primary tables |
|---|---|---|
| Deal master data | Retrieve, search, and list deals with their associated parties | deal, deal_party |
| Sales pipeline items | List, filter, and look up sales items that arrive through sales blocks | sales_item, sales_block, payment_term |
| Sales metadata | Retrieve extensible key-value metadata attached to sales items | sales_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 Table | Join | Joined Table | Condition | Purpose |
|---|---|---|---|---|
deal | — | — | — | Base record for the deal |
deal_party | Separate query | party | deal_party.party_id = party.party_id | Resolve party display name, first name, last name, company name |
deal_party | Separate query | code_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_iddeal_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 returnoffset: integer (optional, default 0) — rows to skip for pagination
Tables & Joins:
| Base Table | Join | Joined Table | Condition | Purpose |
|---|---|---|---|---|
deal | — | — | — | All 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 againstdeal.deal_reference(case-insensitive)deal_name: string (optional) — partial match againstdeal.deal_name(case-insensitive)query: string (optional) — free-text match againstdeal.deal_name(case-insensitive)start_date_from: date (optional) — lower bound ondeal.deal_start_dtstart_date_to: date (optional) — upper bound ondeal.deal_start_dtend_date_from: date (optional) — lower bound ondeal.deal_end_dtend_date_to: date (optional) — upper bound ondeal.deal_end_dtactive_ind: boolean (optional) — exact match ondeal.active_indlimit: integer (optional, default 50) — maximum rows to return
Tables & Joins:
| Base Table | Join | Joined Table | Condition | Purpose |
|---|---|---|---|---|
deal | — | — | — | All criteria applied directly to deal columns |
Filters:
- If
deal_referenceprovided:deal.deal_referenceILIKE%{deal_reference}% - If
deal_nameprovided:deal.deal_nameILIKE%{deal_name}% - If
queryprovided:deal.deal_nameILIKE%{query}% - If
start_date_fromprovided:deal.deal_start_dt>=:start_date_from - If
start_date_toprovided:deal.deal_start_dt<=:start_date_to - If
end_date_fromprovided:deal.deal_end_dt>=:end_date_from - If
end_date_toprovided:deal.deal_end_dt<=:end_date_to - If
active_indprovided: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_idof the client
Tables & Joins:
| Base Table | Join | Joined Table | Condition | Purpose |
|---|---|---|---|---|
deal | INNER | deal_party | deal.deal_id = deal_party.deal_id | Phase 1: identify deals where the client is a party |
deal | LEFT | sales_item | deal.deal_id = sales_item.deal_id | Phase 2: compute aggregate financial summaries |
deal_party | LEFT | party | deal_party.party_id = party.party_id | Phase 3: resolve party display names |
deal_party | LEFT | code_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_idIN (deal IDs from Phase 1) - Phase 3:
deal_party.deal_idIN (deal IDs from Phase 1)
Computed Values:
sales_item_count:COUNT(sales_item.sales_item_id)— number of sales items on each dealtotal_gross_amt:COALESCE(SUM(sales_item.gross_amt), 0)— sum of gross amounts across all sales itemstotal_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 Table | Join | Joined Table | Condition | Purpose |
|---|---|---|---|---|
sales_item | LEFT | sales_block | sales_item.sales_block_id = sales_block.sales_block_id | Expose process_status_cd and error_description from the ingest batch |
sales_item | LEFT | payment_term | sales_block.sales_block_id = payment_term.sales_block_id | Count payment terms in the same sales block |
sales_item | LEFT | deal | sales_item.deal_id = deal.deal_id | Resolve deal_name |
sales_item | LEFT | party (client) | sales_item.client_entity_id = party.party_id | Resolve client display_name |
sales_item | LEFT | party (as buyer_party) | sales_item.buyer_entity_id = buyer_party.party_id | Resolve buyer display_name |
sales_item | LEFT | party (as contracted_party) | sales_item.contracted_party_id = contracted_party.party_id | Resolve contracted party display_name |
sales_item | LEFT | department | sales_item.department_id = department.department_id | Resolve department_name |
sales_item | LEFT | uta_entity | sales_item.uta_entity_id = uta_entity.uta_entity_id | Resolve uta_entity_name |
sales_item | LEFT | code_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_item | LEFT | code_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_item | LEFT | code_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_item | LEFT | code_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 blockclosed_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 Table | Join | Joined Table | Condition | Purpose |
|---|---|---|---|---|
sales_item | LEFT | sales_block | sales_item.sales_block_id = sales_block.sales_block_id | Expose processing status from ingest batch |
sales_item | LEFT | payment_term | sales_block.sales_block_id = payment_term.sales_block_id | Count distinct payment terms |
sales_item | LEFT | deal | sales_item.deal_id = deal.deal_id | Resolve deal_name |
sales_item | LEFT | party (client) | sales_item.client_entity_id = party.party_id | Resolve client display_name |
sales_item | LEFT | party (as buyer_party) | sales_item.buyer_entity_id = buyer_party.party_id | Resolve buyer display_name |
sales_item | LEFT | party (as contracted_party) | sales_item.contracted_party_id = contracted_party.party_id | Resolve contracted party display_name |
sales_item | LEFT | department | sales_item.department_id = department.department_id | Resolve department_name |
sales_item | LEFT | uta_entity | sales_item.uta_entity_id = uta_entity.uta_entity_id | Resolve uta_entity_name |
sales_item | LEFT | code_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_item | LEFT | code_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_item | LEFT | code_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_item | LEFT | code_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_item | LEFT | subquery collected_amounts | sales_item.sales_item_ref = collected_amounts.sales_item_ref | Collection progress from downstream billing items |
The collected_amounts subquery joins:
| Base Table | Join | Joined Table | Condition | Purpose |
|---|---|---|---|---|
billing_item | INNER | revenue_items | billing_item.revenue_item_id = revenue_items.revenue_item_id | Link billing items back to sales item reference |
billing_item | INNER | billing_item_detail | billing_item.billing_item_id = billing_item_detail.billing_item_id | Access 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 termsgross_collected:COALESCE(collected_amounts.gross_collected, 0)— sum of PAYbilling_item_detail.billing_item_detail_gross_amtfor closed billing itemscommission_collected:COALESCE(collected_amounts.commission_collected, 0)— sum of REVbilling_item_detail.billing_item_detail_amtfor closed billing itemsclosed_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_idof the client
Tables & Joins:
| Base Table | Join | Joined Table | Condition | Purpose |
|---|---|---|---|---|
sales_item | INNER | deal_party | sales_item.deal_id = deal_party.deal_id AND deal_party.party_id = :client_entity_id | Restrict 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 Table | Join | Joined Table | Condition | Purpose |
|---|---|---|---|---|
sales_item | — | — | — | Step 1: look up sales_item.sales_block_id for the given sales_item_id |
payment_term | — | — | — | Step 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 Table | Join | Joined Table | Condition | Purpose |
|---|---|---|---|---|
payment_term | — | — | — | Find 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 Table | Join | Joined Table | Condition | Purpose |
|---|---|---|---|---|
sales_item | — | — | — | Direct 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 Table | Join | Joined Table | Condition | Purpose |
|---|---|---|---|---|
payment_term | — | — | — | Count 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 Table | Join | Joined Table | Condition | Purpose |
|---|---|---|---|---|
sales_meta_data | — | — | — | All 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_cdsales_item_ref: string (required) —sales_meta_data.sales_item_ref
Tables & Joins:
| Base Table | Join | Joined Table | Condition | Purpose |
|---|---|---|---|---|
sales_meta_data | — | — | — | Metadata filtered by both type and reference |
Filters:
sales_meta_data.meta_data_type_cd=:meta_data_type_cdsales_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_cdsales_item_ref: string (required) —sales_meta_data.sales_item_refdate: date string (required) — the effective date to evaluate againstsales_meta_data.start_dtandsales_meta_data.end_dt
Tables & Joins:
| Base Table | Join | Joined Table | Condition | Purpose |
|---|---|---|---|---|
sales_meta_data | — | — | — | Metadata filtered by type, reference, and effective date range |
Filters:
sales_meta_data.meta_data_type_cd=:meta_data_type_cdsales_meta_data.sales_item_ref=:sales_item_refsales_meta_data.start_dt<=:datesales_meta_data.end_dt>=:dateORsales_meta_data.end_dtIS 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 Table | Join | Joined Table | Condition | Purpose |
|---|---|---|---|---|
sales_block | — | — | — | Count 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 Table | Join | Joined Table | Condition | Purpose |
|---|---|---|---|---|
sales_item | — | — | — | Aggregate 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 todaytotal_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
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). Whenuta_commission_type='F'(Flat),uta_commission_amtis 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
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.34sum to$10,000.00and satisfy a$10,000.00gross.
3.3 Collection Progress (Sales Pipeline)
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_itemrows wherecurrent_item_ind = trueANDopen_item_ind = false - Used in: Queries 2.2.2 and 2.2.3 via the
collected_amountssubquery - Example: A deal with two closed PAY billing item details of
$4,000.00and$6,000.00yieldsgross_collected = $10,000.00.
3.4 Closed Item Indicator
For the full list query (2.2.1):
closed_item_ind = (COALESCE(gross_amt, 0) = 0)For deal-filtered and client-filtered queries (2.2.2, 2.2.3):
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)
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_dtmeans the metadata entry is still active with no defined expiration — it matches any query date on or afterstart_dt. - Example: A metadata entry with
start_dt = '2024-01-01'andend_dt = NULLis 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 Table | Joined From | Purpose |
|---|---|---|
party | deal_party.party_id, sales_item.client_entity_id, sales_item.buyer_entity_id, sales_item.contracted_party_id | Resolve display_name, first_name, last_name, company_name |
department | sales_item.department_id | Resolve department_name |
uta_entity | sales_item.uta_entity_id | Resolve uta_entity_name |
deal | sales_item.deal_id | Resolve deal_name |
code_master | All *_cd columns | Resolve human-readable descriptions via code_master_desc |
4.2 Code Master Lookups Used
| Alias in Queries | code_master_type | Resolves Column |
|---|---|---|
rev_rec_style | REVENUE_ITEM_REC_STYLE_CD | rev_rec_style_cd |
rev_date_status | REVENUE_ITEM_DATE_STATUS_CD | revenue_date_status_cd |
sales_item_status | REVENUE_ITEM_STATUS_CD | sales_item_status_cd |
comm_type | COMMISSION_TYPE_CD | uta_commission_type |
due_date_status | REVENUE_ITEM_DATE_STATUS_CD | due_date_status_cd |
party_role | PARTY_ROLE_TYPE_CD | party_role_type_cd |
4.3 Downstream Domain Dependencies
| Downstream Domain | Table(s) Used | Query Sections | Purpose |
|---|---|---|---|
| Billing Items | billing_item, billing_item_detail | 2.2.2, 2.2.3 | Collection progress aggregation (gross_collected, commission_collected) |
| Revenue | revenue_items | 2.2.2, 2.2.3 | Joins billing items back to sales items via revenue_items.sales_item_ref |
See Billing Items Data Model for the downstream table definitions.