GR
This commit is contained in:
@@ -72,6 +72,8 @@ def register():
|
|||||||
ctrm_reporting.CTRMPnlExplainContext,
|
ctrm_reporting.CTRMPnlExplainContext,
|
||||||
ctrm_reporting.CTRMPnlDimension,
|
ctrm_reporting.CTRMPnlDimension,
|
||||||
ctrm_reporting.CTRMPnlDimensionContext,
|
ctrm_reporting.CTRMPnlDimensionContext,
|
||||||
|
ctrm_reporting.CTRMCreditRisk,
|
||||||
|
ctrm_reporting.CTRMCreditRiskContext,
|
||||||
configuration.Configuration,
|
configuration.Configuration,
|
||||||
pricing.ImportPricesStart,
|
pricing.ImportPricesStart,
|
||||||
pricing.ImportPricesResult,
|
pricing.ImportPricesResult,
|
||||||
|
|||||||
@@ -777,3 +777,122 @@ class CTRMPnlDimension(ModelSQL, ModelView):
|
|||||||
grouped.amount.as_('amount'),
|
grouped.amount.as_('amount'),
|
||||||
grouped.mtm.as_('mtm'),
|
grouped.mtm.as_('mtm'),
|
||||||
grouped.mtm_delta.as_('mtm_delta'))
|
grouped.mtm_delta.as_('mtm_delta'))
|
||||||
|
|
||||||
|
|
||||||
|
class CTRMCreditRiskContext(ModelView):
|
||||||
|
"CTRM Credit Risk Context"
|
||||||
|
__name__ = 'ctrm.reporting.risk.credit.context'
|
||||||
|
|
||||||
|
party = fields.Many2One('party.party', "Party")
|
||||||
|
currency = fields.Many2One('currency.currency', "Credit Currency")
|
||||||
|
risk_level = fields.Selection([
|
||||||
|
(None, ''),
|
||||||
|
('low', 'Low'),
|
||||||
|
('medium', 'Medium'),
|
||||||
|
('high', 'High'),
|
||||||
|
], "Risk Level")
|
||||||
|
over_limit_only = fields.Boolean("Over Limit Only")
|
||||||
|
|
||||||
|
|
||||||
|
class CTRMCreditRisk(ModelSQL, ModelView):
|
||||||
|
"CTRM Credit Risk"
|
||||||
|
__name__ = 'ctrm.reporting.risk.credit'
|
||||||
|
|
||||||
|
party = fields.Many2One('party.party', "Party")
|
||||||
|
credit_limit = fields.Numeric("Credit Limit", digits=(16, 2))
|
||||||
|
credit_currency = fields.Many2One(
|
||||||
|
'currency.currency', "Credit Currency")
|
||||||
|
open_exposure = fields.Numeric("Open Exposure", digits=(16, 2))
|
||||||
|
internal_limit = fields.Numeric("Internal Limit", digits=(16, 2))
|
||||||
|
insurance_limit = fields.Numeric("Insurance Limit", digits=(16, 2))
|
||||||
|
available_credit = fields.Numeric("Available Credit", digits=(16, 2))
|
||||||
|
utilization = fields.Numeric("Utilization %", digits=(16, 2))
|
||||||
|
risk_level = fields.Selection([
|
||||||
|
(None, ''),
|
||||||
|
('low', 'Low'),
|
||||||
|
('medium', 'Medium'),
|
||||||
|
('high', 'High'),
|
||||||
|
], "Risk Level")
|
||||||
|
status = fields.Char("Status")
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def table_query(cls):
|
||||||
|
Party = Pool().get('party.party')
|
||||||
|
MoveLine = Pool().get('account.move.line')
|
||||||
|
InternalLimit = Pool().get('party.internal.limit')
|
||||||
|
InsuranceLimit = Pool().get('party.insurance.limit')
|
||||||
|
|
||||||
|
party = Party.__table__()
|
||||||
|
move_line = MoveLine.__table__()
|
||||||
|
internal_limit = InternalLimit.__table__()
|
||||||
|
insurance_limit = InsuranceLimit.__table__()
|
||||||
|
|
||||||
|
exposure_query = move_line.select(
|
||||||
|
move_line.party.as_('party'),
|
||||||
|
Sum(Coalesce(move_line.debit, 0)
|
||||||
|
- Coalesce(move_line.credit, 0)).as_('open_exposure'),
|
||||||
|
where=((move_line.party != Null)
|
||||||
|
& (move_line.reconciliation == Null)),
|
||||||
|
group_by=[move_line.party])
|
||||||
|
internal_query = internal_limit.select(
|
||||||
|
internal_limit.party.as_('party'),
|
||||||
|
Sum(Coalesce(internal_limit.amount, 0)).as_('internal_limit'),
|
||||||
|
group_by=[internal_limit.party])
|
||||||
|
insurance_query = insurance_limit.select(
|
||||||
|
insurance_limit.party.as_('party'),
|
||||||
|
Sum(Coalesce(insurance_limit.amount, 0)).as_('insurance_limit'),
|
||||||
|
group_by=[insurance_limit.party])
|
||||||
|
|
||||||
|
exposure = Coalesce(exposure_query.open_exposure, 0)
|
||||||
|
limit = Coalesce(party.credit_limit, 0)
|
||||||
|
utilization = Case(
|
||||||
|
(limit != 0, (exposure / limit) * 100),
|
||||||
|
else_=0)
|
||||||
|
available_credit = limit - exposure
|
||||||
|
status = Case(
|
||||||
|
(exposure > limit, 'Over limit'),
|
||||||
|
(exposure > limit * 0.8, 'Warning'),
|
||||||
|
else_='OK')
|
||||||
|
|
||||||
|
context = Transaction().context
|
||||||
|
where = (
|
||||||
|
(party.credit_limit != Null)
|
||||||
|
| (exposure_query.open_exposure != Null)
|
||||||
|
| (internal_query.internal_limit != Null)
|
||||||
|
| (insurance_query.insurance_limit != Null))
|
||||||
|
if context.get('party'):
|
||||||
|
where &= party.id == context['party']
|
||||||
|
if context.get('currency'):
|
||||||
|
where &= party.credit_currency == context['currency']
|
||||||
|
if context.get('risk_level'):
|
||||||
|
where &= party.risk_level == context['risk_level']
|
||||||
|
if context.get('over_limit_only'):
|
||||||
|
where &= exposure > limit
|
||||||
|
|
||||||
|
return (
|
||||||
|
party
|
||||||
|
.join(exposure_query, 'LEFT',
|
||||||
|
condition=exposure_query.party == party.id)
|
||||||
|
.join(internal_query, 'LEFT',
|
||||||
|
condition=internal_query.party == party.id)
|
||||||
|
.join(insurance_query, 'LEFT',
|
||||||
|
condition=insurance_query.party == party.id)
|
||||||
|
.select(
|
||||||
|
Literal(0).as_('create_uid'),
|
||||||
|
CurrentTimestamp().as_('create_date'),
|
||||||
|
Literal(None).as_('write_uid'),
|
||||||
|
Literal(None).as_('write_date'),
|
||||||
|
party.id.as_('id'),
|
||||||
|
party.id.as_('party'),
|
||||||
|
party.credit_limit.as_('credit_limit'),
|
||||||
|
party.credit_currency.as_('credit_currency'),
|
||||||
|
exposure.as_('open_exposure'),
|
||||||
|
Coalesce(internal_query.internal_limit, 0).as_(
|
||||||
|
'internal_limit'),
|
||||||
|
Coalesce(insurance_query.insurance_limit, 0).as_(
|
||||||
|
'insurance_limit'),
|
||||||
|
available_credit.as_('available_credit'),
|
||||||
|
utilization.as_('utilization'),
|
||||||
|
party.risk_level.as_('risk_level'),
|
||||||
|
status.as_('status'),
|
||||||
|
where=where))
|
||||||
|
|||||||
@@ -140,6 +140,26 @@
|
|||||||
<field name="view" ref="ctrm_pnl_dimension_view_list"/>
|
<field name="view" ref="ctrm_pnl_dimension_view_list"/>
|
||||||
<field name="act_window" ref="act_ctrm_pnl_dimension"/>
|
<field name="act_window" ref="act_ctrm_pnl_dimension"/>
|
||||||
</record>
|
</record>
|
||||||
|
<record model="ir.ui.view" id="ctrm_credit_risk_context_view_form">
|
||||||
|
<field name="model">ctrm.reporting.risk.credit.context</field>
|
||||||
|
<field name="type">form</field>
|
||||||
|
<field name="name">ctrm_credit_risk_context_form</field>
|
||||||
|
</record>
|
||||||
|
<record model="ir.ui.view" id="ctrm_credit_risk_view_list">
|
||||||
|
<field name="model">ctrm.reporting.risk.credit</field>
|
||||||
|
<field name="type">tree</field>
|
||||||
|
<field name="name">ctrm_credit_risk_list</field>
|
||||||
|
</record>
|
||||||
|
<record model="ir.action.act_window" id="act_ctrm_credit_risk">
|
||||||
|
<field name="name">Credit Risk</field>
|
||||||
|
<field name="res_model">ctrm.reporting.risk.credit</field>
|
||||||
|
<field name="context_model">ctrm.reporting.risk.credit.context</field>
|
||||||
|
</record>
|
||||||
|
<record model="ir.action.act_window.view" id="act_ctrm_credit_risk_view">
|
||||||
|
<field name="sequence" eval="10"/>
|
||||||
|
<field name="view" ref="ctrm_credit_risk_view_list"/>
|
||||||
|
<field name="act_window" ref="act_ctrm_credit_risk"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
<menuitem
|
<menuitem
|
||||||
name="Positions"
|
name="Positions"
|
||||||
@@ -209,6 +229,7 @@
|
|||||||
name="VaR"
|
name="VaR"
|
||||||
parent="menu_ctrm_risk"
|
parent="menu_ctrm_risk"
|
||||||
sequence="10"
|
sequence="10"
|
||||||
|
action="risk.act_pos_report_form"
|
||||||
id="menu_ctrm_risk_var"/>
|
id="menu_ctrm_risk_var"/>
|
||||||
<menuitem
|
<menuitem
|
||||||
name="Stress Tests"
|
name="Stress Tests"
|
||||||
@@ -226,9 +247,10 @@
|
|||||||
sequence="40"
|
sequence="40"
|
||||||
id="menu_ctrm_risk_limits"/>
|
id="menu_ctrm_risk_limits"/>
|
||||||
<menuitem
|
<menuitem
|
||||||
name="Credit Exposure"
|
name="Credit Risk"
|
||||||
parent="menu_ctrm_risk"
|
parent="menu_ctrm_risk"
|
||||||
sequence="50"
|
sequence="50"
|
||||||
|
action="act_ctrm_credit_risk"
|
||||||
id="menu_ctrm_risk_credit"/>
|
id="menu_ctrm_risk_credit"/>
|
||||||
|
|
||||||
<menuitem
|
<menuitem
|
||||||
|
|||||||
@@ -73,9 +73,9 @@ this repository contains the full copyright notices and license terms. -->
|
|||||||
|
|
||||||
<menuitem
|
<menuitem
|
||||||
name="Fee Report"
|
name="Fee Report"
|
||||||
parent="purchase_trade.menu_global_reporting"
|
parent="purchase_trade.menu_ctrm_other"
|
||||||
action="act_fee_report_form"
|
action="act_fee_report_form"
|
||||||
sequence="20"
|
sequence="20"
|
||||||
id="menu_fee_report_form"/>
|
id="menu_fee_report_form"/>
|
||||||
</data>
|
</data>
|
||||||
</tryton>
|
</tryton>
|
||||||
|
|||||||
@@ -172,7 +172,7 @@
|
|||||||
id="menu_forex_bi"/>
|
id="menu_forex_bi"/>
|
||||||
<menuitem
|
<menuitem
|
||||||
name="Forex Report"
|
name="Forex Report"
|
||||||
parent="purchase_trade.menu_global_reporting"
|
parent="purchase_trade.menu_ctrm_other"
|
||||||
action="act_forex_bi"
|
action="act_forex_bi"
|
||||||
sequence="25"
|
sequence="25"
|
||||||
id="menu_gr_forex_bi"/>
|
id="menu_gr_forex_bi"/>
|
||||||
|
|||||||
@@ -32,11 +32,16 @@
|
|||||||
sequence="0"
|
sequence="0"
|
||||||
id="menu_global_configuration"
|
id="menu_global_configuration"
|
||||||
icon="tryton-settings"/>
|
icon="tryton-settings"/>
|
||||||
<menuitem
|
<menuitem
|
||||||
parent="menu_global_configuration"
|
parent="menu_global_configuration"
|
||||||
action="act_gr_configuration_form"
|
action="act_gr_configuration_form"
|
||||||
sequence="10"
|
sequence="10"
|
||||||
id="menu_gr_configuration"
|
id="menu_gr_configuration"
|
||||||
icon="tryton-list"/>
|
icon="tryton-list"/>
|
||||||
</data>
|
<menuitem
|
||||||
</tryton>
|
name="Other"
|
||||||
|
parent="menu_global_reporting"
|
||||||
|
sequence="60"
|
||||||
|
id="menu_ctrm_other"/>
|
||||||
|
</data>
|
||||||
|
</tryton>
|
||||||
|
|||||||
@@ -58,7 +58,7 @@
|
|||||||
<field name="act_window" ref="act_invoice_padding_report_form"/>
|
<field name="act_window" ref="act_invoice_padding_report_form"/>
|
||||||
</record>
|
</record>
|
||||||
<menuitem
|
<menuitem
|
||||||
parent="purchase_trade.menu_global_reporting"
|
parent="purchase_trade.menu_ctrm_other"
|
||||||
sequence="101"
|
sequence="101"
|
||||||
action="act_invoice_padding_report_form"
|
action="act_invoice_padding_report_form"
|
||||||
id="menu_invoice_padding_report_form"/>
|
id="menu_invoice_padding_report_form"/>
|
||||||
|
|||||||
@@ -22,9 +22,9 @@
|
|||||||
</record>
|
</record>
|
||||||
|
|
||||||
<menuitem
|
<menuitem
|
||||||
parent="purchase_trade.menu_global_reporting"
|
parent="purchase_trade.menu_ctrm_other"
|
||||||
sequence="110"
|
sequence="110"
|
||||||
action="act_open_position_form"
|
action="act_open_position_form"
|
||||||
id="menu_open_position_form"/>
|
id="menu_open_position_form"/>
|
||||||
</data>
|
</data>
|
||||||
</tryton>
|
</tryton>
|
||||||
|
|||||||
@@ -229,22 +229,22 @@ this repository contains the full copyright notices and license terms. -->
|
|||||||
|
|
||||||
<menuitem
|
<menuitem
|
||||||
name="Pnl Report"
|
name="Pnl Report"
|
||||||
parent="purchase_trade.menu_global_reporting"
|
parent="purchase_trade.menu_ctrm_other"
|
||||||
action="act_pnl_bi"
|
action="act_pnl_bi"
|
||||||
sequence="110"
|
sequence="110"
|
||||||
id="menu_pnl_bi"/>
|
id="menu_pnl_bi"/>
|
||||||
|
|
||||||
<menuitem
|
<menuitem
|
||||||
name="Position Report"
|
name="Position Report"
|
||||||
parent="purchase_trade.menu_global_reporting"
|
parent="purchase_trade.menu_ctrm_other"
|
||||||
action="act_position_bi"
|
action="act_position_bi"
|
||||||
sequence="120"
|
sequence="120"
|
||||||
id="menu_position_bi"/>
|
id="menu_position_bi"/>
|
||||||
|
|
||||||
<menuitem
|
<menuitem
|
||||||
parent="purchase_trade.menu_global_reporting"
|
parent="purchase_trade.menu_ctrm_other"
|
||||||
sequence="100"
|
sequence="100"
|
||||||
action="act_pur_inv_report_form"
|
action="act_pur_inv_report_form"
|
||||||
id="menu_pur_inv_report_form"/>
|
id="menu_pur_inv_report_form"/>
|
||||||
</data>
|
</data>
|
||||||
</tryton>
|
</tryton>
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ depends:
|
|||||||
document_incoming
|
document_incoming
|
||||||
incoterm
|
incoterm
|
||||||
bank
|
bank
|
||||||
|
risk
|
||||||
xml:
|
xml:
|
||||||
purchase.xml
|
purchase.xml
|
||||||
sale.xml
|
sale.xml
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<form>
|
||||||
|
<label name="party"/>
|
||||||
|
<field name="party"/>
|
||||||
|
<label name="currency"/>
|
||||||
|
<field name="currency"/>
|
||||||
|
<label name="risk_level"/>
|
||||||
|
<field name="risk_level"/>
|
||||||
|
<label name="over_limit_only"/>
|
||||||
|
<field name="over_limit_only"/>
|
||||||
|
</form>
|
||||||
12
modules/purchase_trade/view/ctrm_credit_risk_list.xml
Normal file
12
modules/purchase_trade/view/ctrm_credit_risk_list.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<tree>
|
||||||
|
<field name="party" width="160"/>
|
||||||
|
<field name="risk_level"/>
|
||||||
|
<field name="status"/>
|
||||||
|
<field name="credit_limit" sum="1"/>
|
||||||
|
<field name="credit_currency" width="60"/>
|
||||||
|
<field name="open_exposure" sum="1"/>
|
||||||
|
<field name="available_credit" sum="1"/>
|
||||||
|
<field name="utilization"/>
|
||||||
|
<field name="internal_limit" sum="1"/>
|
||||||
|
<field name="insurance_limit" sum="1"/>
|
||||||
|
</tree>
|
||||||
Reference in New Issue
Block a user