[IMP]pms:improve reconcile move line and sync with folio sale lines

This commit is contained in:
Darío Lodeiros
2024-04-17 10:49:49 +02:00
parent 0e433b6a65
commit 29eb5bcd92
3 changed files with 72 additions and 50 deletions

View File

@@ -276,12 +276,6 @@ class AccountMove(models.Model):
.line_ids.filtered(
lambda line: line.account_id == pay_term_lines.account_id
and line.folio_ids in move.folio_ids
and (
line.move_id.partner_id == move.partner_id
or not line.move_id.partner_id
or move.partner_id
== self.env.ref("pms.various_pms_partner")
)
)
)
to_reconcile = self.match_pays_by_amount(
@@ -302,41 +296,6 @@ class AccountMove(models.Model):
self._autoreconcile_folio_payments()
return res
def reconcile(self):
"""
Reconcile the account move
"""
res = super(AccountMove, self).reconcile()
# Update partner in payments and statement lines
for record in self:
if record.payment_id:
old_payment_partner = record.payment_id.partner_id
if old_payment_partner != record.partner_id:
record.payment_id.partner_id = record.partner_id
if old_payment_partner:
record.payment_id.message_post(
body=_(
f"""
Partner modify automatically from invoice {record.name}:
{old_payment_partner.name} to {record.partner_id.name}
"""
)
)
if record.statement_line_id:
old_statement_partner = record.statement_line_id.partner_id
if old_statement_partner != record.partner_id:
record.statement_line_id.partner_id = record.partner_id
if old_statement_partner:
record.statement_line_id.message_post(
body=_(
f"""
Partner modify automatically from invoice {record.name}:
{old_statement_partner.name} to {record.partner_id.name}
"""
)
)
return res
def match_pays_by_amount(self, payments, invoice):
"""
Match payments by amount

View File

@@ -1,7 +1,7 @@
# Copyright 2017 Alexandre Díaz
# Copyright 2017 Dario Lodeiros
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
from odoo import api, fields, models
from odoo import _, api, fields, models
class AccountMoveLine(models.Model):
@@ -63,8 +63,7 @@ class AccountMoveLine(models.Model):
def _compute_name(self):
res = super()._compute_name()
for record in self:
if record.folio_line_ids and not record.name_changed_by_user:
record.name_changed_by_user = False
if record.folio_line_ids and not record.name:
record.name = self.env["folio.sale.line"].generate_folio_sale_name(
record.folio_line_ids.reservation_id,
record.product_id,
@@ -129,3 +128,50 @@ class AccountMoveLine(models.Model):
move.pms_property_id.id or move.move_id.pms_property_id.id
)
return result
def reconcile(self):
"""
Reconcile the account move
"""
res = super(AccountMoveLine, self).reconcile()
# Update partner in payments and statement lines
for record in self:
if record.payment_id:
old_payment_partner = record.payment_id.partner_id
new_payment_partner = record.payment_id.mapped(
"reconciled_invoice_ids.partner_id"
)
if (
old_payment_partner != new_payment_partner
and len(new_payment_partner) == 1
):
record.payment_id.partner_id = new_payment_partner
if old_payment_partner:
record.payment_id.message_post(
body=_(
f"""
Partner modify automatically from invoice:
{old_payment_partner.name} to {new_payment_partner.name}
"""
)
)
if record.statement_line_id:
old_statement_partner = record.statement_line_id.partner_id
new_payment_partner = record.payment_id.mapped(
"reconciled_invoice_ids.partner_id"
)
if (
old_statement_partner != new_payment_partner
and len(new_payment_partner) == 1
):
record.statement_line_id.partner_id = new_payment_partner
if old_statement_partner:
record.statement_line_id.message_post(
body=_(
f"""
Partner modify automatically from invoice:
{old_statement_partner.name} to {new_payment_partner.name}
"""
)
)
return res

View File

@@ -1006,6 +1006,7 @@ class FolioSaleLine(models.Model):
)
# If has draft invoices, we need to update the invoice lines
if "draft" in self.mapped("invoice_lines.move_id.state"):
draft_moves = self.env["account.move"]
if "product_uom_qty" in values:
for line in self:
if line.qty_invoiced > values["product_uom_qty"]:
@@ -1015,7 +1016,10 @@ class FolioSaleLine(models.Model):
" You must reduce the invoiced quantity first."
)
)
for line in self.filtered(lambda l: not l.display_type):
for line in self.filtered(
lambda l: not l.display_type and l.move_id.state == "draft"
):
draft_moves |= line.invoice_lines.move_id
mapped_fields = self._get_mapped_move_line_fields()
move_line_vals = [
(
@@ -1036,6 +1040,9 @@ class FolioSaleLine(models.Model):
)
if "product_uom_qty" in values:
line._mens_update_line_quantity(values)
# avoid draft invoice naming compute
if draft_moves:
draft_moves.name = "/"
result = super(FolioSaleLine, self).write(values)
return result
@@ -1084,12 +1091,22 @@ class FolioSaleLine(models.Model):
def unlink(self):
for record in self:
if record.qty_invoiced > 0:
raise UserError(
_(
"You cannot delete a sale order line once a "
"invoice has been created from it."
# If the invoice line is in draft, unlink it, else raise an error
if record.invoice_lines.filtered(lambda l: l.move_id.state == "draft"):
moves = record.invoice_lines.mapped("move_id")
record.invoice_lines.with_context(
check_move_validity=False
).filtered(lambda l: l.move_id.state == "draft").unlink()
moves._recompute_dynamic_lines(
recompute_all_taxes=True, recompute_tax_base_amount=True
)
else:
raise UserError(
_(
"You cannot delete a sale order line once a "
"invoice has been created from it."
)
)
)
return super(FolioSaleLine, self).unlink()
def _get_real_price_currency(self, product, rule_id, qty, uom, pricelist_id):