vault backup: 2023-11-15 13:47:00

This commit is contained in:
Paul Trowbridge 2023-11-15 13:47:00 -05:00
parent 428d73dbbc
commit 87d2bd39cd
3 changed files with 48 additions and 34 deletions

13
api.ts
View File

@ -34,18 +34,27 @@ const query = await Deno.readTextFile("sql/get.pg.sql");
const query_dseg = await Deno.readTextFile("sql/get_dseg.pg.sql"); const query_dseg = await Deno.readTextFile("sql/get_dseg.pg.sql");
// exact scenario for existing codes // exact scenario for existing codes
router.get('/code_price/:billcode/:shipcode/:partcode/:qty', async (ctx) => { router.get('/code/:billcode/:shipcode/:partcode/:qty', async (ctx) => {
const { billcode, shipcode, partcode, qty } = ctx.params; const { billcode, shipcode, partcode, qty } = ctx.params;
const result = await client.queryObject({args: [billcode, shipcode, partcode, qty], text: query} ); const result = await client.queryObject({args: [billcode, shipcode, partcode, qty], text: query} );
ctx.response.body = apply_guidance(result.rows[0]["doc"]); ctx.response.body = apply_guidance(result.rows[0]["doc"]);
}); });
// specific customres codes but generic style code and data segment to accomodate custom colors and branding
router.get('/dseg/:billcode/:shipcode/:stlc/:dseg/:qty', async (ctx) => {
const { billcode, shipcode, stlc, dseg, qty } = ctx.params;
const result = await client.queryObject({args: [billcode, shipcode, stlc, dseg, qty], text: query_dseg} );
ctx.response.body = apply_guidance(result.rows[0]["doc"]);
});
// specific customres codes but generic style code and data segment to accomodate custom colors and branding // specific customres codes but generic style code and data segment to accomodate custom colors and branding
router.get('/dseg_price/:billcode/:shipcode/:stlc/:dseg/:qty', async (ctx) => { router.get('/dseg_price/:billcode/:shipcode/:stlc/:dseg/:qty', async (ctx) => {
const { billcode, shipcode, stlc, dseg, qty } = ctx.params; const { billcode, shipcode, stlc, dseg, qty } = ctx.params;
const result = await client.queryObject({args: [billcode, shipcode, stlc, dseg, qty], text: query_dseg} ); const result = await client.queryObject({args: [billcode, shipcode, stlc, dseg, qty], text: query_dseg} );
ctx.response.body = apply_guidance(result.rows[0]["doc"]); const ag = apply_guidance(result.rows[0]["doc"]);
ctx.response.body = ag.guidance.FinalReason;
}); });
app.use(router.routes()); app.use(router.routes());
app.use(router.allowedMethods()); app.use(router.allowedMethods());

View File

@ -1,6 +1,21 @@
export function apply_guidance(doc: any) { export function apply_guidance(doc: any) {
function getAdjValue(number) {
const data = [
{f: 2.001, t: 1000, snap: 3, adj: 0 },
{f: 1.001, t: 2, snap: 2, adj: 0 },
{f: 0.1, t: 1, snap: 1, adj: 0 },
{f: 0, t: 0.1, snap: 0, adj: 0 },
{f: -1, t: -0.00001, snap: -1, adj: 0.05},
{f: -2, t: -0.999999, snap: -2, adj: 0.05},
{f: -1000, t: -2.001, snap: -3, adj: 0.10},
];
const match = data.find(row => number >= row.f && number <= row.t);
return match ? match.adj : null;
}
const targetPrice = doc.pricing?.v1tp ?? doc.pricing?.v0tp; const targetPrice = doc.pricing?.v1tp ?? doc.pricing?.v0tp;
const priceBand = doc.pricing?.v1stdv ?? doc.pricing?.v0stdv;
const earlyPrice = doc.hist?.cust?.early_price; const earlyPrice = doc.hist?.cust?.early_price;
const earlySeason = doc.hist?.cust?.early_season; const earlySeason = doc.hist?.cust?.early_season;
const bridgePremium = doc.pricing?.bridgePremium ?? 1.00000; const bridgePremium = doc.pricing?.bridgePremium ?? 1.00000;
@ -25,6 +40,14 @@ export function apply_guidance(doc: any) {
const inflation = Math.max(...Object.keys(iidx).map(Number)); const inflation = Math.max(...Object.keys(iidx).map(Number));
const inflationFactor = iidx[inflation] + 1; const inflationFactor = iidx[inflation] + 1;
const list = doc.pricing?.list && doc.product?.itemrel === "2" ? doc.pricing?.list : null; const list = doc.pricing?.list && doc.product?.itemrel === "2" ? doc.pricing?.list : null;
//-------set basic customer pricing--------------
custPrice = Number((earlyPrice * bridgePremium).toFixed(5));
anchorPrice = custPrice;
let anchor_sd = priceBand ? ((anchorPrice - targetPrice) / priceBand).toFixed(2) : 0
let optimization = getAdjValue(anchor_sd);
// ------if there is not target price just exit--------------- // ------if there is not target price just exit---------------
if (!targetPrice) { if (!targetPrice) {
anchorSource = "No target pricing setup"; anchorSource = "No target pricing setup";
@ -33,14 +56,12 @@ export function apply_guidance(doc: any) {
// if there is no customer anchor price use target // if there is no customer anchor price use target
if (earlyPrice) { if (earlyPrice) {
// translate alternate product history to current product quoted // translate alternate product history to current product quoted
custPrice = Number((earlyPrice * bridgePremium).toFixed(5));
anchorPrice = custPrice;
// --------if the price needs bridged, add the details to the description-------- // --------if the price needs bridged, add the details to the description--------
if (bridgePremium === 1) { if (bridgePremium === 1) {
anchorSource = earlySeason + ' Customer Price ' + earlyPrice; anchorSource = earlySeason + ' Price ' + earlyPrice;
custSource = anchorSource; custSource = anchorSource;
} else { } else {
anchorSource = earlySeason + ' Similar (' + altHist + ') Customer Price ' + earlyPrice + ' x ' + bridgePremium + ' = ' + anchorPrice; anchorSource = earlySeason + ' Similar (' + altHist + ') Price ' + earlyPrice + ' x ' + bridgePremium + ' = ' + anchorPrice;
custSource = anchorSource; custSource = anchorSource;
} }
// --------after the early price is translated see if target is still less------- // --------after the early price is translated see if target is still less-------

View File

@ -64,13 +64,13 @@ BEGIN
,item ,item
,idxk ,idxk
,prefer ,prefer
,(SELECT unti FROM "CMS.CUSLG".itemm WHERE item = best.item) ,pltq
INTO INTO
_mold _mold
,_item ,_item
,_iidx ,_iidx
,_itemr ,_itemr
,_unti ,_pltq
FROM FROM
( (
SELECT SELECT
@ -79,6 +79,7 @@ BEGIN
,i.stlc ,i.stlc
,i.v1ds ,i.v1ds
,i.v0ds ,i.v0ds
,i.pltq
,jsonb_strip_nulls(jsonb_build_object('assc',CASE WHEN i.assc <> '' THEN i.assc ELSE null::text END,'majg',i.majg::int,'coltier',i.coltier)) idxk ,jsonb_strip_nulls(jsonb_build_object('assc',CASE WHEN i.assc <> '' THEN i.assc ELSE null::text END,'majg',i.majg::int,'coltier',i.coltier)) idxk
,CASE WHEN i.v1ds = _v1ds THEN 2 ELSE CASE WHEN i.v0ds = _v0ds THEN 1 ELSE 0 END END prefer ,CASE WHEN i.v1ds = _v1ds THEN 2 ELSE CASE WHEN i.v0ds = _v0ds THEN 1 ELSE 0 END END prefer
FROM FROM
@ -92,6 +93,7 @@ BEGIN
,i.stlc ,i.stlc
,i.v1ds ,i.v1ds
,i.v0ds ,i.v0ds
,i.pltq
,jsonb_strip_nulls(jsonb_build_object('assc',CASE WHEN i.assc <> '' THEN i.assc ELSE null::text END,'majg',i.majg::int,'coltier',i.coltier)) ,jsonb_strip_nulls(jsonb_build_object('assc',CASE WHEN i.assc <> '' THEN i.assc ELSE null::text END,'majg',i.majg::int,'coltier',i.coltier))
,CASE WHEN i.v1ds = _v1ds THEN 2 ELSE CASE WHEN i.v0ds = _v0ds THEN 1 ELSE 0 END END ,CASE WHEN i.v1ds = _v1ds THEN 2 ELSE CASE WHEN i.v0ds = _v0ds THEN 1 ELSE 0 END END
) best ) best
@ -100,35 +102,17 @@ BEGIN
LIMIT 1; LIMIT 1;
_product := _product :=
jsonb_build_object( jsonb_build_object(
'mold',_mold 'product'
,'item',_item ,jsonb_build_object(
,'itemrel',_itemr 'mold',_mold
,'iidx',_iidx ,'item',_item
,'unti',_unti ,'itemrel',_itemr
,'iidx',_iidx
,'pltq',_pltq
)
); );
--RAISE NOTICE 'item data %', jsonb_pretty(_product||_input); --RAISE NOTICE 'item data %', jsonb_pretty(_product||_input);
----------------pallet quantity-----------------------------
SELECT
ROUND(uom.nm/uom.dm,1) pltq
INTO
_pltq
FROM
(
SELECT
jsonb_agg(row_to_json(d)::jsonb) jdoc
FROM
(
select distinct
_item partn
,'PLT' fu
,_unti tu
) d
) c
JOIN LATERAL rlarp.uom_array(c.jdoc) uom ON TRUE;
_product := jsonb_build_object('product',_product||jsonb_build_object('pltq',_pltq));
----------------channel------------------------------------- ----------------channel-------------------------------------
SELECT rlarp.channel_code(_bill, _ship) INTO _chan; SELECT rlarp.channel_code(_bill, _ship) INTO _chan;