Valuation cron
This commit is contained in:
@@ -12,9 +12,12 @@ class Cron(metaclass=PoolMeta):
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super().__setup__()
|
||||
cls.method.selection.append(
|
||||
('forex.cron|update_forex', "Update Forex Prices"))
|
||||
super().__setup__()
|
||||
cls.method.selection.append(
|
||||
('forex.cron|update_forex', "Update Forex Prices"))
|
||||
cls.method.selection.append(
|
||||
('valuation.valuation|update_daily_snapshot',
|
||||
"Update Valuation Snapshot"))
|
||||
|
||||
class PriceCron(ModelSQL, ModelView):
|
||||
"Price Cron"
|
||||
|
||||
@@ -36,10 +36,16 @@
|
||||
<field name="model" search="[('model', '=', 'forex.cron')]"/>
|
||||
</record> -->
|
||||
|
||||
<record model="ir.cron" id="cron_cron">
|
||||
<field name="method">forex.cron|update_forex</field>
|
||||
<field name="interval_number" eval="1"/>
|
||||
<field name="interval_type">days</field>
|
||||
</record>
|
||||
</data>
|
||||
</tryton>
|
||||
<record model="ir.cron" id="cron_cron">
|
||||
<field name="method">forex.cron|update_forex</field>
|
||||
<field name="interval_number" eval="1"/>
|
||||
<field name="interval_type">days</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.cron" id="valuation_daily_snapshot_cron">
|
||||
<field name="method">valuation.valuation|update_daily_snapshot</field>
|
||||
<field name="interval_number" eval="1"/>
|
||||
<field name="interval_type">days</field>
|
||||
</record>
|
||||
</data>
|
||||
</tryton>
|
||||
|
||||
@@ -722,6 +722,38 @@ class PurchaseTradeTestCase(ModuleTestCase):
|
||||
{'type': 'derivative'},
|
||||
])
|
||||
|
||||
def test_update_daily_snapshot_generates_all_purchases_and_unmatched_sales(self):
|
||||
'daily valuation cron snapshots purchases and unmatched sale lines'
|
||||
Valuation = Pool().get('valuation.valuation')
|
||||
PurchaseLine = Mock()
|
||||
SaleLine = Mock()
|
||||
purchase_lines = [Mock(id=1), Mock(id=2)]
|
||||
unmatched_sale_line = Mock(id=3)
|
||||
unmatched_sale_line.get_matched_lines.return_value = []
|
||||
matched_sale_line = Mock(id=4)
|
||||
matched_sale_line.get_matched_lines.return_value = [
|
||||
Mock(lot_p=Mock(line=Mock(id=5)))]
|
||||
PurchaseLine.search.return_value = purchase_lines
|
||||
SaleLine.search.return_value = [unmatched_sale_line, matched_sale_line]
|
||||
|
||||
with patch(
|
||||
'trytond.modules.purchase_trade.valuation.Pool'
|
||||
) as PoolMock, patch.object(
|
||||
Valuation, 'generate') as generate, patch.object(
|
||||
Valuation, 'generate_from_sale_line'
|
||||
) as generate_from_sale_line:
|
||||
PoolMock.return_value.get.side_effect = lambda name: {
|
||||
'purchase.line': PurchaseLine,
|
||||
'sale.line': SaleLine,
|
||||
}[name]
|
||||
|
||||
Valuation.update_daily_snapshot()
|
||||
|
||||
generate.assert_any_call(purchase_lines[0])
|
||||
generate.assert_any_call(purchase_lines[1])
|
||||
self.assertEqual(generate.call_count, 2)
|
||||
generate_from_sale_line.assert_called_once_with(unmatched_sale_line)
|
||||
|
||||
def test_create_pnl_fee_from_line_accepts_missing_rate_amount(self):
|
||||
'purchase fee valuation treats an uncomputed rate amount as zero'
|
||||
Valuation = Pool().get('valuation.valuation')
|
||||
|
||||
@@ -1225,6 +1225,29 @@ class Valuation(ValuationBase, ModelView):
|
||||
"Valuation"
|
||||
__name__ = 'valuation.valuation'
|
||||
|
||||
@classmethod
|
||||
def update_daily_snapshot(cls):
|
||||
PurchaseLine = Pool().get('purchase.line')
|
||||
SaleLine = Pool().get('sale.line')
|
||||
|
||||
purchase_lines = PurchaseLine.search([])
|
||||
sale_lines = [
|
||||
sale_line for sale_line in SaleLine.search([])
|
||||
if cls._sale_line_is_unmatched(sale_line)
|
||||
]
|
||||
|
||||
for line in purchase_lines:
|
||||
cls.generate(line)
|
||||
|
||||
for sale_line in sale_lines:
|
||||
cls.generate_from_sale_line(sale_line)
|
||||
|
||||
logger.info(
|
||||
"Updated valuation snapshot for %s purchase line(s) and "
|
||||
"%s unmatched sale line(s)",
|
||||
len(purchase_lines),
|
||||
len(sale_lines))
|
||||
|
||||
@classmethod
|
||||
def get_totals(cls):
|
||||
cursor = Transaction().connection.cursor()
|
||||
|
||||
Reference in New Issue
Block a user