VRM_ACTUAL_REV_ASSIGNMENTS_V

Details

  • Schema: FUSION

  • Object owner: VRM

  • Object type: VIEW

Columns

Name

REVENUE_DOCUMENT_LINE_ID

REVENUE_DOCUMENT_ID

PREV_REVENUE_DOCUMENT_LINE_ID

REQUEST_ID

QUANTITY

ACCOUNTING_DATE

AMOUNT

ACCOUNT_CLASS

PERIOD_SET_NAME

Query

SQL_Statement

SELECT

CTL.REVENUE_DOCUMENT_LINE_ID /* REVENUE_DOCUMENT_LINE_ID */

, CTL.REVENUE_DOCUMENT_ID

, CTL.PREV_REVENUE_DOCUMENT_LINE_ID PREV_REVENUE_DOCUMENT_LINE_ID

, CTL.REQUEST_ID /* REQUEST_ID */

, NVL(Nvl(CTL.QUANTITY_CREDITED, CTL.QUANTITY_INVOICED), CTL.QUANTITY) QUANTITY

, NVL(LGD.ORIGINAL_ACCOUNTING_DATE, NVL(CMA.ACCOUNTING_DATE, NVL(RRS.RULE_DATE,

LEAST( ((CTL.RULE_START_DATE - GPS1.START_DATE) + GPS2.START_DATE), GPS2.END_DATE, NVL(CTL.RULE_END_DATE, TO_DATE('31-12-4712','DD-MM-RRRR')))

))) ACCOUNTING_DATE /* GL DATE */ /* USE THE AR_CREDIT_MEMO_AMOUNT VALUE IF IT IS NOT NULL. OR

USE THE LUMP SUM IF THIS IS A VARIABLE DURATION RULE WITH A LUMP SUM. */

, TO_NUMBER(DECODE(CT.COMPLETE_FLAG, 'N', 0,

NVL(LGD.SCHEDULED_AMOUNT,

NVL(CMA.AMOUNT, DECODE((RRS_LUMP.PERCENT + DECODE(RRS.PERIOD_NUMBER, 1, 1, NULL)),

NULL, DECODE(RR.TYPE, 'A', CTL.EXTENDED_REVENUE_PRICE_AMOUNT * (RRS.PERCENT / 100),

/* PRORATE THE AMOUNT EXCEPT OVER FIRST */ /* PERIOD IF THERE IS A LUMP SUM. */

( CTL.EXTENDED_REVENUE_PRICE_AMOUNT - /* LUMP SUM CASE */ NVL( ( CTL.EXTENDED_REVENUE_PRICE_AMOUNT * (RRS_LUMP.PERCENT / 100) ), 0 ) ) /

DECODE(RRS_LUMP.PERCENT, NULL, CTL.RULE_DURATION, CTL.RULE_DURATION -1) ), /* END NOT LUMP SUM CASE */

/* USE THE LUMP SUM IF IT IS NOT NULL AND THIS IS THE FIRST PERIOD. */ CTL.EXTENDED_REVENUE_PRICE_AMOUNT * (RRS_LUMP.PERCENT / 100) /*

INSURE THAT THE SIGN OF THE ROW REFLECTS THE ACCOUNT TYPE AND

INVOICING RULE. */ ) /* END CMA.AMOUNT NOT SPECIFIED CASE */ ) /*

END CMA.AMOUNT NVL */ ) /* END LGD.SCHEDULED_AMOUNT NVL */ *

DECODE(RAL.LOOKUP_CODE, 'REV', 1, - 1) ) ) AMOUNT

, /* AMOUNT */ RAL.LOOKUP_CODE ACCOUNT_CLASS

, /* ACCOUNT TYPE */ GPS1.PERIOD_SET_NAME PERIOD_SET_NAME /* PERIOD_SET NAME */

FROM

VRM_REVENUE_DOC_LINES_ALL ctl,

gl_sets_of_books sob,

VRM_REVENUE_DOCUMENTS_ALL ct,

ra_rules rr,

RA_RULE_SCHEDULES rrs,

vrm_period_types gpt,

VRM_CREDIT_DOC_AMOUNTS cma,

RA_RULE_SCHEDULES rrs_lump,

VRM_REV_DOC_LINE_SCHEDULES_GT lgd,

vrm_periods gps1,

vrm_periods gps2,

VRM_LOOKUPS ral

WHERE

sob.set_of_books_id = ctl.set_of_books_id

AND ct.REVENUE_DOCUMENT_ID = ctl.REVENUE_DOCUMENT_ID

AND ctl.REVENUE_DOCUMENT_LINE_ID = cma.REVENUE_DOCUMENT_LINE_ID(+)

AND DECODE(ctl.autorule_complete_flag,

NULL, DECODE(ctl.RULE_DURATION_PROCESSED,

-1, ctl.REVENUE_DOCUMENT_LINE_ID,

NULL),

'Y', DECODE(ctl.RULE_DURATION_PROCESSED,

-1, ctl.REVENUE_DOCUMENT_LINE_ID,

NULL),

NULL) = lgd.REVENUE_DOCUMENT_LINE_ID(+)

AND 'N' = lgd.account_set_flag(+)

AND 'REV' = lgd.account_class(+)

AND DECODE(ctl.autorule_complete_flag,

NULL, DECODE(ctl.RULE_DURATION_PROCESSED,

-1, gps1.rowid,

gps2.rowid),

gps2.rowid) = gps2.rowid

AND DECODE(cma.ACCOUNTING_DATE,

NULL, gps2.rowid,

gps1.rowid) = gps2.rowid

/* Doubles the amount of rows returned for each GL date. */

AND ral.lookup_type = 'VRM_AUTOGL_TYPE'

AND (ral.lookup_code = 'REV'

OR

ral.lookup_code = DECODE(ct.DOCUMENT_RULE_ID,

-2, 'UNEARN',

-3, 'UNBILL'))

AND DECODE(rr.type,

'A', rr.rule_id,

-1) = rrs.rule_id

/* Join to rrs_lump if the rule is variable duration with a lump sum */

AND rrs_lump.rule_id(+) = DECODE(rr.type,

'ACC_DUR', rr.rule_id,

-10)

AND rrs_lump.period_number(+) = 1

AND rr.rule_id = ctl.REVENUE_RULE_ID

AND rrs.period_number <= DECODE(ctl.RULE_DURATION ,

NULL, rr.occurrences,

ctl.RULE_DURATION)

AND gps2.period_set_name = gps1.period_set_name

AND gpt.period_type = gps1.period_type

AND gpt.period_type = DECODE(rr.frequency,

NULL, accounted_period_type,

'SPECIFIC', accounted_period_type,

DECODE(ctl.PREV_REVENUE_DOCUMENT_LINE_ID,

NULL, rr.frequency,

accounted_period_type))

AND gps2.period_type = gps1.period_type

AND ctl.rule_start_date BETWEEN gps1.start_date AND gps1.end_date

AND gps1.end_date BETWEEN

ctl.rule_start_date AND

ctl.rule_start_date + gpt.max_regular_period_length

AND gps2.new_period_num = gps1.new_period_num + (rrs.period_number - 1)

AND (rr.type in ('A', 'ACC_DUR')

OR ctl.PREV_REVENUE_DOCUMENT_LINE_ID IS NOT NULL)

/** Handle only Fixed and Variable rules **/

UNION ALL

SELECT main_qry.REVENUE_DOCUMENT_LINE_ID,

main_qry.REVENUE_DOCUMENT_ID,

main_qry.prev_REVENUE_DOCUMENT_LINE_ID,

main_qry.request_id,

main_qry.quantity,

main_qry.ACCOUNTING_DATE,

NVL(cma.amount,

CASE main_qry.rule_type

WHEN 'PP_DR_ALL'

THEN (main_qry.daily_rate * days_per_gl_period)

WHEN 'PP_DR_PP'

THEN (

CASE full_or_partial

WHEN 'F'

THEN

/** Full periods **/

((EXTENDED_REVENUE_PRICE_AMOUNT - ( days_in_partial_periods * main_qry.daily_rate )) / (cnt_of_full_periods))

ELSE

/** Partial Periods **/

(main_qry.daily_rate * days_per_gl_period)

END)

ELSE ((EXTENDED_REVENUE_PRICE_AMOUNT * period_factor) / (no_of_full_periods))

END ) * DECODE(ral.lookup_code, 'REV', 1, -1) amount,

ral.lookup_code account_class,

period_set_name

FROM

(SELECT

/* */

ctl.REVENUE_DOCUMENT_ID,

ctl.REVENUE_DOCUMENT_LINE_ID,

ctl.PREV_REVENUE_DOCUMENT_LINE_ID prev_REVENUE_DOCUMENT_LINE_ID,

ctl.request_id,

ctl.rule_start_date,

ctl.rule_end_date,

ct.DOCUMENT_RULE_ID,

NVL(Nvl(CTL.QUANTITY_CREDITED, CTL.QUANTITY_INVOICED), CTL.QUANTITY) quantity,

gps.start_date,

gps.end_date,

gps.period_type,

gps.period_set_name,

rr.type rule_type,

/** GL Date **/

LEAST((ctl.rule_start_date - FIRST_VALUE(start_date) OVER (PARTITION BY gps.period_set_name, gps.period_type, ctl.REVENUE_DOCUMENT_LINE_ID, ctl.REVENUE_DOCUMENT_ID ORDER BY gps.start_date ) ) + gps.start_date, gps.end_date, ctl.rule_end_date ) ACCOUNTING_DATE,

/** Period Seq Number **/

ROW_NUMBER() OVER( PARTITION BY gps.period_set_name, gps.period_type, ctl.REVENUE_DOCUMENT_LINE_ID,ctl.REVENUE_DOCUMENT_ID ORDER BY gps.start_date ) period_seq_num,

/** Partial or Full ***/

DECODE(LEAST((gps.end_date - gps.start_date), (gps.end_date - ctl.rule_start_date), (ctl.rule_end_date - gps.start_date) ), (gps.end_date - gps.start_date), 'F', 'P' ) full_or_partial,

/** Total number of days in RevRec schedule **/

(ctl.rule_end_date - ctl.rule_start_date) + 1 total_days_in_schedule,

/** Daily Rate **/

(ctl.EXTENDED_REVENUE_PRICE_AMOUNT) /((ctl.rule_end_date - ctl.rule_start_date) + 1) daily_rate,

/** Days per given GL period **/

LEAST((gps.end_date - gps.start_date), (gps.end_date - ctl.rule_start_date), (ctl.rule_end_date - gps.start_date) ) + 1 days_per_gl_period,

/** Maximum Days per given GL period ***/

(gps.end_date - gps.start_date) + 1 max_days_per_gl_period,

/** Period Factor **/

(LEAST((gps.end_date - gps.start_date), (gps.end_date - ctl.rule_start_date), (ctl.rule_end_date - gps.start_date) ) + 1 ) / ((gps.end_date - gps.start_date) + 1) period_factor,

/** total full periods (includes partial periods) ***/

SUM((LEAST((gps.end_date - gps.start_date), (gps.end_date - ctl.rule_start_date), (ctl.rule_end_date - gps.start_date) ) + 1 ) / ((gps.end_date - gps.start_date) + 1) ) OVER (PARTITION BY gps.period_set_name, gps.period_type, ctl.REVENUE_DOCUMENT_LINE_ID, ctl.REVENUE_DOCUMENT_ID ) no_of_full_periods,

/** Count of only full periods ***/

SUM(

CASE

/** Count only full periods **/

WHEN LEAST((gps.end_date - gps.start_date), (gps.end_date - ctl.rule_start_date), (ctl.rule_end_date - gps.start_date)) = (gps.end_date - gps.start_date)

THEN 1

ELSE

/** Do not count partial periods */

0

END ) OVER (PARTITION BY gps.period_set_name, gps.period_type, ctl.REVENUE_DOCUMENT_LINE_ID,ctl.REVENUE_DOCUMENT_ID ) cnt_of_full_periods,

/**Days in partial periods ***/

SUM(

CASE

WHEN LEAST((gps.end_date - gps.start_date), (gps.end_date - ctl.rule_start_date), (ctl.rule_end_date - gps.start_date)) = (gps.end_date - gps.start_date)

THEN

/** Full periods **/

0

ELSE

/** Partial periods */

LEAST((gps.end_date - gps.start_date), (gps.end_date - ctl.rule_start_date), (ctl.rule_end_date - gps.start_date)) + 1

END ) OVER (PARTITION BY gps.period_set_name, gps.period_type, ctl.REVENUE_DOCUMENT_LINE_ID,ctl.REVENUE_DOCUMENT_ID ) days_in_partial_periods,

/** Revenue Amount for line item ***/

ctl.EXTENDED_REVENUE_PRICE_AMOUNT

FROM vrm_periods gps,

gl_sets_of_books gls,

vrm_period_types gpt,

ra_rules rr,

VRM_REVENUE_DOC_LINES_ALL ctl,

VRM_REVENUE_DOCUMENTS_ALL ct

WHERE ctl.set_of_books_id = gls.set_of_books_id

AND gls.period_set_name = gps.period_set_name

AND gps.period_type = gpt.period_type

AND ctl.REVENUE_RULE_ID = rr.rule_id

AND rr.type NOT IN ('A', 'ACC_DUR')

AND ctl.PREV_REVENUE_DOCUMENT_LINE_ID IS NULL

/* no regular credit memos */

AND NVL(rr.frequency,accounted_period_type) = gpt.period_type

AND ct.REVENUE_DOCUMENT_ID = ctl.REVENUE_DOCUMENT_ID

AND (ctl.rule_start_date BETWEEN gps.start_date AND gps.end_date

OR ctl.rule_end_date BETWEEN gps.start_date AND gps.end_date

OR gps.start_date BETWEEN ctl.rule_start_date AND ctl.rule_end_date )

) main_qry,

VRM_LOOKUPS ral,

VRM_CREDIT_DOC_AMOUNTS cma

WHERE ral.lookup_type = 'VRM_AUTOGL_TYPE'

AND (ral.lookup_code = 'REV'

OR ral.lookup_code = DECODE(main_qry.DOCUMENT_RULE_ID, -2, 'UNEARN', -3, 'UNBILL'))

AND main_qry.REVENUE_DOCUMENT_LINE_ID = cma.REVENUE_DOCUMENT_LINE_ID (+)

AND main_qry.ACCOUNTING_DATE = cma.ACCOUNTING_DATE (+)