Reputation: 3907
I need to read an amount from a One2many
field, then, depending on the state
of the record, write off this quantity to a specific journal.
This is my model:
class print_order(models.Model):
_name = 'print.order'
name = fields.Char('Reference', required=True, index=True, copy=False, readonly='True', default='New')
date = fields.Date(string="Print Date",default=fields.Datetime.now)
production_orders = fields.Many2one('bsi.production.order', ondelete='cascade', string="Production Order")
due_date = fields.Date(string="Due Date")
journal_entry = fields.Many2one('account.move', string="Journal Entry")
stock_picking_id = fields.Many2one('stock.picking', string="Stock Picking")
order_picking = fields.One2many('print.order.lines', 'print_order', string="Order lines")
book_block = fields.Boolean(string="Book Block", default=True, )
binding = fields.Boolean(string="Binding", ) #compute="_bool_binding", readonly=False
edging = fields.Boolean(string="Edging", ) #compute="_bool_edging", readonly=False
raw_material_consumed = fields.One2many('stock.move', 'stock_move_lines', string="Raw material consumed")
contract_worksheet = fields.One2many('mrp.worksheet.contract', 'printer_order', string="Worksheet calculation")
name_contract = fields.Char(string="Name", compute="_compute_worksheet")
state = fields.Selection([
('draft','Draft'),
('inprogress','In progress'),
('awaitingraw','Awaiting raw materials'),
('work_in_progress','Print in Progress'),
('delivered','Delivered'),
('cancel','Cancel'),
], string="State")
notes = fields.Text(string="Notes")
printer_book_block = fields.Many2one('res.partner', string="Printer Book Block")
printer_binding = fields.Many2one('res.partner', string="Printer Binding")
printer_edging = fields.Many2one('res.partner', string="Printer Edging")
transporter = fields.Many2one('res.partner', string="Transporter")
total_transport_cost = fields.Float(string="Total transport cost")
additional_job = fields.Boolean(string="Additional Job")
company_id = fields.Many2one('res.company', 'Company',default='_default_company')
location_id = fields.Many2one('stock.location', string="Source Location")
location_dest_id = fields.Many2one('stock.location', string="Destination Location")
So, isbn
is a Many2one
to product.product
model, on this model I've created a new Many2one
field to account.account
.
As You can see, this class has 'states', so depending on a specific state I should write this quantity from contract_worksheet
which is a One2many
field, into the specific journal I've created on product.product
, on debit
or credit
fields.
Now, what confuses me, is how do I access these specific fields on the One2many
?
And how to automatically do this while changing between states?
This is what I've tried so far:
@api.model
@api.depends('order_picking', 'order_picking.isbn', 'contract_worksheet')
def accounting_scenarios(self):
for record in self:
if self.state == awaitingraw:
self.isbn.printer_wip_account.debit = self.contract_worksheet.total_alles
But it doesn't do anything.
So, any ideas?
EDIT
This is the model which I access from order_picking
One2many field:
class bsi_print_order_lines(models.Model):
_name = 'bsi.print.order.lines'
print_order = fields.Many2one('bsi.print.order', string="Print Order")
isbn = fields.Many2one('product.product', string="ISBN", domain="[('is_isbn', '=', True)]")
qty = fields.Integer(string="Quantity")
consumed_qty = fields.Integer(string="Quantity consumed")
remaining_qty = fields.Float(string="Remaining quantity") #, compute="_remaining_func"
is_book_block = fields.Boolean(string="Is Book Block Done", compute="compute_book_block")
is_binding = fields.Boolean(string="Is Binding Done", compute="compute_binding")
is_edging = fields.Boolean(string="Is Edging Done", compute="compute_edging")
isbns = fields.Many2one('worksheets.isbns', string="Worksheet ISBNS")
Upvotes: 1
Views: 163
Reputation: 894
I think you should use @api.multi
instead of @api.model
, since you are computing the values.
Also, replace self
with record
, like so:
@api.multi
@api.depends('order_picking', 'order_picking.isbn', 'contract_worksheet')
def accounting_scenarios(self):
for record in self:
if record.state == 'awaitingraw':
record.isbn.printer_wip_account.debit = record.contract_worksheet.total_alles
Upvotes: 1