diff --git a/addons/sale_stock/models/account_move.py b/addons/sale_stock/models/account_move.py index 5cd37dff339..b380fb5910c 100644 --- a/addons/sale_stock/models/account_move.py +++ b/addons/sale_stock/models/account_move.py @@ -31,8 +31,9 @@ class AccountMove(models.Model): if self.state == 'draft': return res - sale_orders = self.mapped('invoice_line_ids.sale_line_ids.order_id') - stock_move_lines = sale_orders.mapped('picking_ids.move_ids.move_line_ids') + sale_lines = self.invoice_line_ids.sale_line_ids + sale_orders = sale_lines.order_id + stock_move_lines = sale_lines.move_ids.filtered(lambda r: r.state == 'done').move_line_ids # Get the other customer invoices and refunds. ordered_invoice_ids = sale_orders.mapped('invoice_ids')\ @@ -48,27 +49,33 @@ class AccountMove(models.Model): break i += 1 - # Get the previous invoice if any. + # Get the previous invoices if any. previous_invoices = ordered_invoice_ids[:self_index] - last_invoice = previous_invoices[-1] if len(previous_invoices) else None - # Get the incoming and outgoing sml between self.invoice_date and the previous invoice (if any). + # Get the incoming and outgoing sml between self.invoice_date and the previous invoice (if any) of the related product. write_dates = [wd for wd in self.invoice_line_ids.mapped('write_date') if wd] self_datetime = max(write_dates) if write_dates else None - last_write_dates = last_invoice and [wd for wd in last_invoice.invoice_line_ids.mapped('write_date') if wd] - last_invoice_datetime = max(last_write_dates) if last_write_dates else None + last_invoice_datetime = dict() + for product in self.invoice_line_ids.product_id: + last_invoice = previous_invoices.filtered(lambda inv: product in inv.invoice_line_ids.product_id) + last_invoice = last_invoice[-1] if last_invoice else None + last_write_dates = last_invoice and [wd for wd in last_invoice.invoice_line_ids.mapped('write_date') if wd] + last_invoice_datetime[product] = max(last_write_dates) if last_write_dates else None + def _filter_incoming_sml(ml): if ml.state == 'done' and ml.location_id.usage == 'customer' and ml.lot_id: - if last_invoice_datetime: - return last_invoice_datetime <= ml.date <= self_datetime + last_date = last_invoice_datetime.get(ml.product_id) + if last_date: + return last_date <= ml.date <= self_datetime else: return ml.date <= self_datetime return False def _filter_outgoing_sml(ml): if ml.state == 'done' and ml.location_dest_id.usage == 'customer' and ml.lot_id: - if last_invoice_datetime: - return last_invoice_datetime <= ml.date <= self_datetime + last_date = last_invoice_datetime.get(ml.product_id) + if last_date: + return last_date <= ml.date <= self_datetime else: return ml.date <= self_datetime return False