diff --git a/procs/approval_logic.ms.sql b/procs/approval_logic.ms.sql index cc72db4..18cc3a3 100644 --- a/procs/approval_logic.ms.sql +++ b/procs/approval_logic.ms.sql @@ -1,6 +1,6 @@ --- CREATE OR ALTER FUNCTION pricing.guidance_logic; +-- CREATE OR ALTER FUNCTION pricing.approval_logic; -CREATE OR ALTER FUNCTION pricing.guidance_logic( +CREATE OR ALTER FUNCTION pricing.approval_logic( @target numeric(20,5), @last_norm numeric(20,5), @list_eff numeric(20,5), @@ -10,8 +10,8 @@ CREATE OR ALTER FUNCTION pricing.guidance_logic( @cap_list_pct numeric(10,5) = 1.00 ) RETURNS @ret TABLE ( - guidance_price numeric(20,5), - guidance_reason nvarchar(4000) + approval_price numeric(20,5), + approval_reason nvarchar(4000) ) AS BEGIN diff --git a/procs/guidance_logic.ms.sql b/procs/guidance_logic.ms.sql index cc72db4..f7f5442 100644 --- a/procs/guidance_logic.ms.sql +++ b/procs/guidance_logic.ms.sql @@ -31,34 +31,6 @@ BEGIN -- Pick starting base price SET @base_price = COALESCE(@target, @last_norm, @list_eff); - - -- Step 1: use base price unless it's more than x% below last price - SET @after_floor = @base_price; - IF @last_norm IS NOT NULL - SET @after_floor = ROUND( - CASE WHEN @base_price >= @last_norm*@floor_pct - THEN @base_price - ELSE @last_norm*@floor_pct - END, 5); - - -- Step 2: use price from previous step but don't allow it to be x% above last price - SET @after_cap_last = @after_floor; - IF @last_norm IS NOT NULL - SET @after_cap_last = ROUND( - CASE WHEN @after_floor <= @last_norm*@cap_last_pct - THEN @after_floor - ELSE @last_norm*@cap_last_pct - END, 5); - - -- Step 3: use price from last step, but don't allow it to be more than x% above list price - SET @final_price = @after_cap_last; - IF @list_eff IS NOT NULL - SET @final_price = ROUND( - CASE WHEN @after_cap_last <= @list_eff*@cap_list_pct - THEN @after_cap_last - ELSE @list_eff*@cap_list_pct - END, 5); - -- Reason text SET @reason = CASE @@ -67,14 +39,22 @@ BEGIN WHEN @list_eff IS NOT NULL THEN N'Using list price as base' END; - IF @last_norm IS NOT NULL AND @after_floor > @base_price - SET @reason = N'Last price drop limit'; + -- Step 1: use base price less than last price, use last price + IF @base_price < @last_norm + BEGIN + SET @base_price = @last_norm; + SET @reason = N'Last price'; + END + - IF @last_norm IS NOT NULL AND @after_cap_last < @after_floor - SET @reason = N'Last price increase limit'; - - IF @list_eff IS NOT NULL AND @final_price < @after_cap_last - SET @reason = N'List price ceiling'; + -- Step 2: use price from previous step but don't allow it to be x% above last price + IF @base_price > @list_eff + BEGIN + SET @base_price = @list_eff; + SET @reason = N'List price ceiling'; + END + + SET @final_price = @base_price; INSERT INTO @ret VALUES (@final_price, @reason); RETURN; diff --git a/procs/single_price_call.ms.sql b/procs/single_price_call.ms.sql index d93ab69..1d3e4da 100644 --- a/procs/single_price_call.ms.sql +++ b/procs/single_price_call.ms.sql @@ -136,8 +136,8 @@ BEGIN ------------step 6 compute guidance------------ guidance_price NUMERIC(20,5), guidance_reason NVARCHAR(MAX), - shown_price NUMERIC(20,5), - shown_logic NVARCHAR(MAX), + approval_price NUMERIC(20,5), + approval_reason NVARCHAR(MAX), ------------step 7 build json------------------ expl NVARCHAR(MAX), ui_json NVARCHAR(MAX) @@ -379,6 +379,8 @@ BEGIN SET guidance_price = g.guidance_price ,guidance_reason = g.guidance_reason + ,approval_price = a.approval_price + ,approval_reason = a.approval_reason FROM @queue q CROSS APPLY pricing.guidance_logic( TRY_CAST(q.tprice AS NUMERIC(20,5)), @@ -391,7 +393,19 @@ BEGIN 1.0, --cap on list percent 1.0 - ) g; + ) g + CROSS APPLY pricing.approval_logic( + TRY_CAST(q.tprice AS NUMERIC(20,5)), + TRY_CAST(q.last_price_norm AS NUMERIC(20,5)), + TRY_CAST(q.listprice_eff AS NUMERIC(20,5)), + TRY_CAST(q.last_date AS DATE), + --allowable price drop percent + .95, + --cap on last price + 1.0, + --cap on list percent + 1.0 + ) a; -------------------------------------------------------------------------------- -- Step 8: Assemble structured 'expl' JSON from populated columns. @@ -438,6 +452,8 @@ BEGIN ,q.list_relevance AS list_relevance ,q.guidance_price AS guidance_price ,q.guidance_reason AS guidance_reason + ,q.approval_price AS approval_price + ,q.approval_reason AS approval_reason -- JSON_QUERY(hist) AS [history] FOR JSON PATH, WITHOUT_ARRAY_WRAPPER )