This commit is contained in:
AzureAD\SylvainDUVERNAY
2026-03-28 19:20:22 +01:00
parent 32b13838f2
commit 93b12de41d
2 changed files with 541 additions and 0 deletions

View File

@@ -0,0 +1,91 @@
-- Contracts with an MtM strategy, pricing_component details, and latest valuation snapshot
SELECT
'Purchase' AS side,
pp.number AS contract,
pl.quantity AS contracted_qty,
ms.name AS strategy_name,
msc.name AS scenario_name,
msc.valuation_date,
msc.use_last_price,
cur.symbol AS strategy_currency,
-- MtM component (pricing_component linked via strategy)
pc_mtm.price_source_type AS component_price_source,
pc_mtm.ratio AS component_ratio_pct,
ft.name AS component_fix_type,
pi.price_desc AS component_curve,
pc_cal.name AS component_calendar,
pc_mtm.auto AS component_auto,
pc_mtm.fallback AS component_fallback,
-- Latest valuation (physical price row)
vv.date AS last_valuation_date,
vv.price AS last_valuation_price,
vv.quantity AS last_valuation_qty,
vv.amount AS last_valuation_amount,
vv.mtm AS portfolio_mtm
FROM purchase_strategy ps
JOIN purchase_line pl ON pl.id = ps.line
JOIN purchase_purchase pp ON pp.id = pl.purchase
JOIN mtm_strategy ms ON ms.id = ps.strategy
JOIN mtm_scenario msc ON msc.id = ms.scenario
JOIN currency_currency cur ON cur.id = ms.currency
LEFT JOIN pricing_component pc_mtm ON pc_mtm.strategy = ms.id
LEFT JOIN price_fixtype ft ON ft.id = pc_mtm.fix_type
LEFT JOIN price_price pi ON pi.id = pc_mtm.price_index
LEFT JOIN price_calendar pc_cal ON pc_cal.id = pc_mtm.calendar
LEFT JOIN LATERAL (
SELECT date, price, quantity, amount, mtm
FROM valuation_valuation
WHERE line = pl.id
AND type = 'pur. priced'
AND reference = 'Purchase/Physic'
ORDER BY date DESC
LIMIT 1
) vv ON TRUE
UNION ALL
SELECT
'Sale',
ss.number,
sl.quantity,
ms.name,
msc.name,
msc.valuation_date,
msc.use_last_price,
cur.symbol,
pc_mtm.price_source_type,
pc_mtm.ratio,
ft.name,
pi.price_desc,
pc_cal.name,
pc_mtm.auto,
pc_mtm.fallback,
vv.date,
vv.price,
vv.quantity,
vv.amount,
vv.mtm
FROM sale_strategy sa
JOIN sale_line sl ON sl.id = sa.sale_line
JOIN sale_sale ss ON ss.id = sl.sale
JOIN mtm_strategy ms ON ms.id = sa.strategy
JOIN mtm_scenario msc ON msc.id = ms.scenario
JOIN currency_currency cur ON cur.id = ms.currency
LEFT JOIN pricing_component pc_mtm ON pc_mtm.strategy = ms.id
LEFT JOIN price_fixtype ft ON ft.id = pc_mtm.fix_type
LEFT JOIN price_price pi ON pi.id = pc_mtm.price_index
LEFT JOIN price_calendar pc_cal ON pc_cal.id = pc_mtm.calendar
LEFT JOIN LATERAL (
SELECT date, price, quantity, amount, mtm
FROM valuation_valuation
WHERE line = sl.id
AND type = 'sale priced'
AND reference = 'Sale/Physic'
ORDER BY date DESC
LIMIT 1
) vv ON TRUE
ORDER BY side, contract;
select * from price_price

450
SQL/Risk Management.sql Normal file
View File

@@ -0,0 +1,450 @@
-- This shows where each lot currently stands across the full chain
SELECT
pp.name AS supplier,
pur.number AS purchase_contract,
pur.state AS contract_state,
si.number AS shipment,
si.state AS shipment_state,
pur.invoice_state AS invoice_state,
COUNT(l.id) AS lots,
SUM(l.lot_qt) AS quantity
FROM lot_lot l
LEFT JOIN stock_shipment_in si ON si.id = l.lot_shipment_in
LEFT JOIN purchase_line pl ON pl.id = l.line
LEFT JOIN purchase_purchase pur ON pur.id = pl.purchase
LEFT JOIN party_party pp ON pp.id = pur.party
GROUP BY pp.name, pur.number, pur.state, si.number, si.state, pur.invoice_state
ORDER BY pp.name, pur.number;
-- This shows the details of each lot that is still in draft shipment, to see where they are in the chain and what is missing
SELECT
pp.name AS supplier,
prod.name AS product,
pur.number AS purchase_contract,
si.number AS shipment_number,
tv.vessel_name AS vessel,
si.planned_date,
si.eta,
si.etd,
si.cargo_mode,
si.transport_type,
si.bl_number,
l.id AS lot_id,
pl.quantity AS contracted_qty,
u.name AS unit,
pl.unit_price,
cur.code AS currency,
pl.price_type,
l.lot_pur_inv_state,
l.lot_sale_inv_state
FROM lot_lot l
JOIN stock_shipment_in si ON si.id = l.lot_shipment_in
JOIN purchase_line pl ON pl.id = l.line
JOIN purchase_purchase pur ON pur.id = pl.purchase
JOIN party_party pp ON pp.id = pur.party
JOIN product_product prd ON prd.id = l.lot_product
JOIN product_template prod ON prod.id = prd.template
JOIN currency_currency cur ON cur.id = pur.currency
LEFT JOIN product_uom u ON u.id = pl.unit
LEFT JOIN trade_vessel tv ON tv.id = si.vessel
WHERE si.state = 'draft'
ORDER BY si.planned_date, pp.name, si.number, l.id;
-- This shows all the contracts that are fixed price
SELECT
'Purchase' AS side,
pur.number AS contract,
pur.state AS contract_state,
pp.name AS counterparty,
prod.name AS product,
pl.from_del,
pl.to_del,
pl.quantity AS contracted_qty,
u.name AS unit,
pl.unit_price AS fixed_price,
cur.code AS currency
FROM purchase_line pl
JOIN purchase_purchase pur ON pur.id = pl.purchase
JOIN party_party pp ON pp.id = pur.party
JOIN product_product prd ON prd.id = pl.product
JOIN product_template prod ON prod.id = prd.template
JOIN currency_currency cur ON cur.id = pur.currency
LEFT JOIN product_uom u ON u.id = pl.unit
WHERE pl.type = 'line' AND pl.price_type = 'priced'
UNION ALL
SELECT
'Sale' AS side,
s.number,
s.state,
pp.name,
prod.name,
sl.from_del,
sl.to_del,
sl.quantity,
u.name,
sl.unit_price,
cur.code
FROM sale_line sl
JOIN sale_sale s ON s.id = sl.sale
JOIN party_party pp ON pp.id = s.party
JOIN product_product prd ON prd.id = sl.product
JOIN product_template prod ON prod.id = prd.template
JOIN currency_currency cur ON cur.id = s.currency
LEFT JOIN product_uom u ON u.id = sl.unit
WHERE sl.type = 'line' AND sl.price_type = 'priced'
ORDER BY side, contract;
WITH
-- Last fixation state per purchase line
pur_fix AS (
SELECT DISTINCT ON (line)
line,
fixed_qt,
fixed_qt_price,
unfixed_qt,
unfixed_qt_price AS unfixed_price
FROM pricing_pricing
WHERE line IS NOT NULL
ORDER BY line, last DESC NULLS LAST, pricing_date DESC
),
-- Last fixation state per sale line ← mirrors pur_fix exactly
sale_fix AS (
SELECT DISTINCT ON (sale_line)
sale_line,
fixed_qt,
fixed_qt_price,
unfixed_qt,
unfixed_qt_price AS unfixed_price
FROM pricing_pricing
WHERE sale_line IS NOT NULL
ORDER BY sale_line, last DESC NULLS LAST, pricing_date DESC
),
-- Most recent market price per price index
last_mkt AS (
SELECT DISTINCT ON (price)
price AS price_index_id,
price_date AS last_market_date,
price_value AS last_market_price
FROM price_price_value
ORDER BY price, price_date DESC
),
-- Next scheduled fixing date per purchase line
pur_next_fix AS (
SELECT DISTINCT ON (line)
line,
estimated_date AS next_fixing_date,
trigger AS fixing_trigger
FROM pricing_estimated
WHERE line IS NOT NULL
AND estimated_date >= CURRENT_DATE
ORDER BY line, estimated_date ASC
),
-- Next scheduled fixing date per sale line
sale_next_fix AS (
SELECT DISTINCT ON (sale_line)
sale_line,
estimated_date AS next_fixing_date,
trigger AS fixing_trigger
FROM pricing_estimated
WHERE sale_line IS NOT NULL
AND estimated_date >= CURRENT_DATE
ORDER BY sale_line, estimated_date ASC
)
SELECT
'Purchase' AS side,
pur.number AS contract,
pur.state AS contract_state,
pp.name AS counterparty,
prod.name AS product,
pl.from_del,
pl.to_del,
pl.quantity AS contracted_qty,
u.name AS unit,
cur.symbol AS currency,
pi2.price_desc AS price_index,
nf.fixing_trigger,
nf.next_fixing_date,
COALESCE(pf.fixed_qt, 0) AS fixed_qty,
COALESCE(pf.fixed_qt_price, 0) AS avg_fixed_price,
pl.quantity - COALESCE(pf.fixed_qt, 0) AS unfixed_qty,
COALESCE(lm.last_market_price, pf.unfixed_price) AS unfixed_market_price,
lm.last_market_date,
lm.last_market_price
FROM purchase_line pl
JOIN purchase_purchase pur ON pur.id = pl.purchase
JOIN party_party pp ON pp.id = pur.party
JOIN product_product prd ON prd.id = pl.product
JOIN product_template prod ON prod.id = prd.template
JOIN currency_currency cur ON cur.id = pur.currency
LEFT JOIN product_uom u ON u.id = pl.unit
LEFT JOIN pricing_component pc ON pc.line = pl.id
LEFT JOIN price_price pi2 ON pi2.id = pc.price_index
LEFT JOIN last_mkt lm ON lm.price_index_id = pc.price_index
LEFT JOIN pur_fix pf ON pf.line = pl.id
LEFT JOIN pur_next_fix nf ON nf.line = pl.id
WHERE pl.type = 'line' AND pl.price_type = 'basis'
UNION ALL
SELECT
'Sale' AS side,
s.number,
s.state,
pp.name,
prod.name,
sl.from_del,
sl.to_del,
sl.quantity,
u.name,
cur.symbol,
pi2.price_desc,
nf.fixing_trigger,
nf.next_fixing_date,
COALESCE(sf.fixed_qt, 0) AS fixed_qty,
COALESCE(sf.fixed_qt_price, 0) AS avg_fixed_price,
sl.quantity - COALESCE(sf.fixed_qt, 0) AS unfixed_qty,
COALESCE(lm.last_market_price, sf.unfixed_price) AS unfixed_market_price,
lm.last_market_date,
lm.last_market_price
FROM sale_line sl
JOIN sale_sale s ON s.id = sl.sale
JOIN party_party pp ON pp.id = s.party
JOIN product_product prd ON prd.id = sl.product
JOIN product_template prod ON prod.id = prd.template
JOIN currency_currency cur ON cur.id = s.currency
LEFT JOIN product_uom u ON u.id = sl.unit
LEFT JOIN pricing_component pc ON pc.sale_line = sl.id
LEFT JOIN price_price pi2 ON pi2.id = pc.price_index
LEFT JOIN last_mkt lm ON lm.price_index_id = pc.price_index
LEFT JOIN sale_fix sf ON sf.sale_line = sl.id
LEFT JOIN sale_next_fix nf ON nf.sale_line = sl.id
WHERE sl.type = 'line' AND sl.price_type = 'basis'
ORDER BY side, contract;
-- MtM strategy, component details, and last valuation per contract (purchase and sale)
-- Columns:
-- strategy_name / scenario_name / valuation_date → MtM setup header
-- component_* → from pricing_component linked via strategy (MtM strategy-level components)
-- pricing_* → from pricing_component linked via line/sale_line (contract fixation setup)
-- vv_* → latest snapshot from valuation_valuation (price = contract price, amount = contract value)
-- vvl_* → current state from valuation_valuation_line (same structure, always most recent)
WITH
-- Latest valuation_valuation row per purchase line (physical price row only)
last_vv_pur AS (
SELECT DISTINCT ON (line)
line,
date AS vv_date,
price AS vv_price,
quantity AS vv_quantity,
amount AS vv_amount,
base_amount AS vv_base_amount,
rate AS vv_rate
FROM valuation_valuation
WHERE line IS NOT NULL
AND type = 'pur. priced'
AND reference = 'Purchase/Physic'
ORDER BY line, date DESC
),
-- Latest valuation_valuation row per sale line
last_vv_sale AS (
SELECT DISTINCT ON (sale_line)
sale_line,
date AS vv_date,
price AS vv_price,
quantity AS vv_quantity,
amount AS vv_amount,
base_amount AS vv_base_amount,
rate AS vv_rate
FROM valuation_valuation
WHERE sale_line IS NOT NULL
AND type = 'sale priced'
AND reference = 'Sale/Physic'
ORDER BY sale_line, date DESC
),
-- valuation_valuation_line per purchase line (current state)
last_vvl_pur AS (
SELECT DISTINCT ON (line)
line,
date AS vvl_date,
price AS vvl_price,
quantity AS vvl_quantity,
amount AS vvl_amount,
base_amount AS vvl_base_amount,
rate AS vvl_rate
FROM valuation_valuation_line
WHERE line IS NOT NULL
AND type = 'pur. priced'
AND reference = 'Purchase/Physic'
ORDER BY line, date DESC
),
-- valuation_valuation_line per sale line (current state)
last_vvl_sale AS (
SELECT DISTINCT ON (sale_line)
sale_line,
date AS vvl_date,
price AS vvl_price,
quantity AS vvl_quantity,
amount AS vvl_amount,
base_amount AS vvl_base_amount,
rate AS vvl_rate
FROM valuation_valuation_line
WHERE sale_line IS NOT NULL
AND type = 'sale priced'
AND reference = 'Sale/Physic'
ORDER BY sale_line, date DESC
)
SELECT
'Purchase' AS side,
pur.number AS contract,
pur.state AS contract_state,
pp.name AS counterparty,
prod.name AS product,
pl.from_del,
pl.to_del,
pl.quantity AS contracted_qty,
u.name AS unit,
-- Strategy
ms.name AS strategy_name,
ms_cur.symbol AS strategy_currency,
-- Scenario
msc.name AS scenario_name,
msc.valuation_date,
msc.use_last_price,
cal.name AS scenario_calendar,
-- MtM component (pricing_component linked via strategy)
pc_mtm.price_source_type AS component_price_source,
pc_mtm.ratio AS component_ratio_pct,
ft.name AS component_fix_type,
pi2.price_desc AS component_curve,
pc_mtm_cal.name AS component_calendar,
pc_mtm.auto AS component_auto,
pc_mtm.fallback AS component_fallback,
-- Pricing component (fixation setup — independent of MtM, already populated)
pc_idx.price_desc AS pricing_curve,
pc_ft.name AS pricing_fix_type,
pc.price_source_type AS pricing_source_type,
pc.ratio AS pricing_ratio_pct,
pc_cal.name AS pricing_calendar,
-- Last valuation snapshot (valuation_valuation — most recent run)
vv.vv_date AS last_valuation_date,
vv.vv_price AS last_valuation_price,
vv.vv_quantity AS last_valuation_qty,
vv.vv_amount AS last_valuation_amount,
vv.vv_base_amount AS last_valuation_base_amount,
vv.vv_rate AS last_valuation_rate,
-- Current valuation state (valuation_valuation_line — always latest)
vvl.vvl_date AS current_valuation_date,
vvl.vvl_price AS current_valuation_price,
vvl.vvl_quantity AS current_valuation_qty,
vvl.vvl_amount AS current_valuation_amount,
vvl.vvl_base_amount AS current_valuation_base_amount,
vvl.vvl_rate AS current_valuation_rate
FROM purchase_strategy ps
JOIN purchase_line pl ON pl.id = ps.line
JOIN purchase_purchase pur ON pur.id = pl.purchase
JOIN party_party pp ON pp.id = pur.party
JOIN product_product prd ON prd.id = pl.product
JOIN product_template prod ON prod.id = prd.template
LEFT JOIN product_uom u ON u.id = pl.unit
JOIN mtm_strategy ms ON ms.id = ps.strategy
JOIN mtm_scenario msc ON msc.id = ms.scenario
LEFT JOIN currency_currency ms_cur ON ms_cur.id = ms.currency
LEFT JOIN price_calendar cal ON cal.id = msc.calendar
LEFT JOIN pricing_component pc_mtm ON pc_mtm.strategy = ms.id
LEFT JOIN price_fixtype ft ON ft.id = pc_mtm.fix_type
LEFT JOIN price_price pi2 ON pi2.id = pc_mtm.price_index
LEFT JOIN price_calendar pc_mtm_cal ON pc_mtm_cal.id = pc_mtm.calendar
LEFT JOIN pricing_component pc ON pc.line = pl.id
LEFT JOIN price_price pc_idx ON pc_idx.id = pc.price_index
LEFT JOIN price_fixtype pc_ft ON pc_ft.id = pc.fix_type
LEFT JOIN price_calendar pc_cal ON pc_cal.id = pc.calendar
LEFT JOIN last_vv_pur vv ON vv.line = pl.id
LEFT JOIN last_vvl_pur vvl ON vvl.line = pl.id
UNION ALL
SELECT
'Sale' AS side,
s.number,
s.state,
pp.name,
prod.name,
sl.from_del,
sl.to_del,
sl.quantity,
u.name,
ms.name,
ms_cur.symbol,
msc.name,
msc.valuation_date,
msc.use_last_price,
cal.name,
pc_mtm.price_source_type,
pc_mtm.ratio,
ft.name,
pi2.price_desc,
pc_mtm_cal.name,
pc_mtm.auto,
pc_mtm.fallback,
pc_idx.price_desc,
pc_ft.name,
pc.price_source_type,
pc.ratio,
pc_cal.name,
vv.vv_date,
vv.vv_price,
vv.vv_quantity,
vv.vv_amount,
vv.vv_base_amount,
vv.vv_rate,
vvl.vvl_date,
vvl.vvl_price,
vvl.vvl_quantity,
vvl.vvl_amount,
vvl.vvl_base_amount,
vvl.vvl_rate
FROM sale_strategy ss
JOIN sale_line sl ON sl.id = ss.sale_line
JOIN sale_sale s ON s.id = sl.sale
JOIN party_party pp ON pp.id = s.party
JOIN product_product prd ON prd.id = sl.product
JOIN product_template prod ON prod.id = prd.template
LEFT JOIN product_uom u ON u.id = sl.unit
JOIN mtm_strategy ms ON ms.id = ss.strategy
JOIN mtm_scenario msc ON msc.id = ms.scenario
LEFT JOIN currency_currency ms_cur ON ms_cur.id = ms.currency
LEFT JOIN price_calendar cal ON cal.id = msc.calendar
LEFT JOIN pricing_component pc_mtm ON pc_mtm.strategy = ms.id
LEFT JOIN price_fixtype ft ON ft.id = pc_mtm.fix_type
LEFT JOIN price_price pi2 ON pi2.id = pc_mtm.price_index
LEFT JOIN price_calendar pc_mtm_cal ON pc_mtm_cal.id = pc_mtm.calendar
LEFT JOIN pricing_component pc ON pc.sale_line = sl.id
LEFT JOIN price_price pc_idx ON pc_idx.id = pc.price_index
LEFT JOIN price_fixtype pc_ft ON pc_ft.id = pc.fix_type
LEFT JOIN price_calendar pc_cal ON pc_cal.id = pc.calendar
LEFT JOIN last_vv_sale vv ON vv.sale_line = sl.id
LEFT JOIN last_vvl_sale vvl ON vvl.sale_line = sl.id
ORDER BY side, contract;