mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[RFC]pms: Refactoring folio invoice methods to precommit
This commit is contained in:
@@ -550,57 +550,14 @@ class PmsFolio(models.Model):
|
||||
folio_lines_to_invoice = folio.sale_line_ids.filtered(
|
||||
lambda l: l.id in list(lines_to_invoice.keys())
|
||||
)
|
||||
|
||||
folio_partner_invoice_id = partner_invoice_id
|
||||
if not folio_partner_invoice_id:
|
||||
if folio.partner_id and folio.partner_id.document_number_to_invoice:
|
||||
folio_partner_invoice_id = folio.partner_id.id
|
||||
else:
|
||||
folio_partner_invoice_id = (
|
||||
self.partner_invoice_ids[0].id
|
||||
if self.partner_invoice_ids
|
||||
else False
|
||||
)
|
||||
folio_partner_invoice_id = folio._get_default_partner_invoice_id()
|
||||
|
||||
target_lines = folio_lines_to_invoice
|
||||
if self._context.get("lines_auto_add") and folio_partner_invoice_id:
|
||||
folio_partner_invoice = self.env["res.partner"].browse(
|
||||
folio_partner_invoice_id
|
||||
)
|
||||
if folio_partner_invoice.default_invoice_lines == "overnights":
|
||||
target_lines = target_lines.filtered(
|
||||
lambda r: r.is_board_service
|
||||
or (r.reservation_line_ids and r.reservation_id.overnight_room)
|
||||
)
|
||||
elif folio_partner_invoice.default_invoice_lines == "reservations":
|
||||
target_lines = target_lines.filtered(
|
||||
lambda r: r.is_board_service or r.reservation_line_ids
|
||||
)
|
||||
elif folio_partner_invoice.default_invoice_lines == "services":
|
||||
target_lines = target_lines.filtered(
|
||||
lambda r: not r.is_board_service or r.service_line_ids
|
||||
)
|
||||
groups_invoice_lines = [
|
||||
{
|
||||
"partner_id": folio_partner_invoice_id,
|
||||
"lines": target_lines,
|
||||
}
|
||||
]
|
||||
if (
|
||||
folio.autoinvoice_date
|
||||
and folio.autoinvoice_date <= fields.Date.today()
|
||||
and len(target_lines) < len(folio_lines_to_invoice)
|
||||
):
|
||||
second_partner_to_invoice = folio.partner_invoice_ids.filtered(
|
||||
lambda p: p.id != folio_partner_invoice_id
|
||||
)
|
||||
groups_invoice_lines.append(
|
||||
{
|
||||
"partner_id": second_partner_to_invoice
|
||||
and second_partner_to_invoice.id,
|
||||
"lines": folio_lines_to_invoice - target_lines,
|
||||
}
|
||||
)
|
||||
groups_invoice_lines = folio._get_groups_invoice_lines(
|
||||
lines_to_invoice=folio_lines_to_invoice,
|
||||
partner_invoice_id=folio_partner_invoice_id,
|
||||
)
|
||||
for group in groups_invoice_lines:
|
||||
folio = folio.with_company(folio.company_id)
|
||||
down_payments = folio.env["folio.sale.line"]
|
||||
@@ -666,6 +623,57 @@ class PmsFolio(models.Model):
|
||||
invoice_vals_list.append(invoice_vals)
|
||||
return invoice_vals_list
|
||||
|
||||
def _get_groups_invoice_lines(self, lines_to_invoice, partner_invoice_id):
|
||||
self.ensure_one()
|
||||
target_lines = lines_to_invoice
|
||||
if self._context.get("lines_auto_add") and partner_invoice_id:
|
||||
folio_partner_invoice = self.env["res.partner"].browse(partner_invoice_id)
|
||||
if folio_partner_invoice.default_invoice_lines == "overnights":
|
||||
target_lines = target_lines.filtered(
|
||||
lambda r: r.is_board_service
|
||||
or (r.reservation_line_ids and r.reservation_id.overnight_room)
|
||||
)
|
||||
elif folio_partner_invoice.default_invoice_lines == "reservations":
|
||||
target_lines = target_lines.filtered(
|
||||
lambda r: r.is_board_service or r.reservation_line_ids
|
||||
)
|
||||
elif folio_partner_invoice.default_invoice_lines == "services":
|
||||
target_lines = target_lines.filtered(
|
||||
lambda r: not r.is_board_service or r.service_line_ids
|
||||
)
|
||||
groups_invoice_lines = [
|
||||
{
|
||||
"partner_id": partner_invoice_id,
|
||||
"lines": target_lines,
|
||||
}
|
||||
]
|
||||
if (
|
||||
self.autoinvoice_date
|
||||
and self.autoinvoice_date <= fields.Date.today()
|
||||
and len(target_lines) < len(lines_to_invoice)
|
||||
):
|
||||
second_partner_to_invoice = self.partner_invoice_ids.filtered(
|
||||
lambda p: p.id != partner_invoice_id
|
||||
)
|
||||
groups_invoice_lines.append(
|
||||
{
|
||||
"partner_id": second_partner_to_invoice
|
||||
and second_partner_to_invoice.id,
|
||||
"lines": lines_to_invoice - target_lines,
|
||||
}
|
||||
)
|
||||
return groups_invoice_lines
|
||||
|
||||
def _get_default_partner_invoice_id(self):
|
||||
self.ensure_one()
|
||||
if self.partner_id and self.partner_id.document_number_to_invoice:
|
||||
folio_partner_invoice_id = self.partner_id.id
|
||||
else:
|
||||
folio_partner_invoice_id = (
|
||||
self.partner_invoice_ids[0].id if self.partner_invoice_ids else False
|
||||
)
|
||||
return folio_partner_invoice_id
|
||||
|
||||
def _get_tax_amount_by_group(self):
|
||||
self.ensure_one()
|
||||
res = {}
|
||||
@@ -1622,39 +1630,7 @@ class PmsFolio(models.Model):
|
||||
|
||||
# 2) Manage 'grouped' parameter: group by (partner_id, currency_id).
|
||||
if not grouped:
|
||||
new_invoice_vals_list = []
|
||||
invoice_grouping_keys = self._get_invoice_grouping_keys()
|
||||
for _grouping_keys, invoices in groupby(
|
||||
invoice_vals_list,
|
||||
key=lambda x: [
|
||||
x.get(grouping_key) for grouping_key in invoice_grouping_keys
|
||||
],
|
||||
):
|
||||
origins = set()
|
||||
payment_refs = set()
|
||||
refs = set()
|
||||
ref_invoice_vals = None
|
||||
for invoice_vals in invoices:
|
||||
if not ref_invoice_vals:
|
||||
ref_invoice_vals = invoice_vals
|
||||
else:
|
||||
ref_invoice_vals["invoice_line_ids"] += invoice_vals[
|
||||
"invoice_line_ids"
|
||||
]
|
||||
origins.add(invoice_vals["invoice_origin"])
|
||||
payment_refs.add(invoice_vals["payment_reference"])
|
||||
refs.add(invoice_vals["ref"])
|
||||
ref_invoice_vals.update(
|
||||
{
|
||||
"ref": ", ".join(refs)[:2000],
|
||||
"invoice_origin": ", ".join(origins),
|
||||
"payment_reference": len(payment_refs) == 1
|
||||
and payment_refs.pop()
|
||||
or False,
|
||||
}
|
||||
)
|
||||
new_invoice_vals_list.append(ref_invoice_vals)
|
||||
invoice_vals_list = new_invoice_vals_list
|
||||
invoice_vals_list = self._get_group_vals_list(invoice_vals_list)
|
||||
|
||||
# 3) Create invoices.
|
||||
|
||||
@@ -1694,22 +1670,7 @@ class PmsFolio(models.Model):
|
||||
# a salesperson must be able to generate an invoice from a
|
||||
# sale order without "billing" access rights.
|
||||
# However, he should not be able to create an invoice from scratch.
|
||||
moves = self.env["account.move"]
|
||||
for invoice_vals in invoice_vals_list:
|
||||
if invoice_vals["move_type"] == "out_invoice":
|
||||
move = (
|
||||
self.env["account.move"]
|
||||
.sudo()
|
||||
.with_context(default_move_type="out_invoice", auto_name=True)
|
||||
.create(invoice_vals)
|
||||
)
|
||||
else:
|
||||
move = (
|
||||
self.env["account.move"]
|
||||
.with_context(default_move_type="out_receipt", auto_name=True)
|
||||
.create(invoice_vals)
|
||||
)
|
||||
moves += move
|
||||
moves = self._create_account_moves(invoice_vals_list)
|
||||
|
||||
# 4) Some moves might actually be refunds: convert
|
||||
# them if the total amount is negative
|
||||
@@ -1731,6 +1692,60 @@ class PmsFolio(models.Model):
|
||||
)
|
||||
return moves
|
||||
|
||||
def _create_account_moves(self, invoice_vals_list):
|
||||
moves = self.env["account.move"]
|
||||
for invoice_vals in invoice_vals_list:
|
||||
if invoice_vals["move_type"] == "out_invoice":
|
||||
move = (
|
||||
self.env["account.move"]
|
||||
.sudo()
|
||||
.with_context(default_move_type="out_invoice", auto_name=True)
|
||||
.create(invoice_vals)
|
||||
)
|
||||
else:
|
||||
move = (
|
||||
self.env["account.move"]
|
||||
.with_context(default_move_type="out_receipt", auto_name=True)
|
||||
.create(invoice_vals)
|
||||
)
|
||||
moves += move
|
||||
return moves
|
||||
|
||||
def _get_group_vals_list(self, invoice_vals_list):
|
||||
new_invoice_vals_list = []
|
||||
invoice_grouping_keys = self._get_invoice_grouping_keys()
|
||||
for _grouping_keys, invoices in groupby(
|
||||
invoice_vals_list,
|
||||
key=lambda x: [
|
||||
x.get(grouping_key) for grouping_key in invoice_grouping_keys
|
||||
],
|
||||
):
|
||||
origins = set()
|
||||
payment_refs = set()
|
||||
refs = set()
|
||||
ref_invoice_vals = None
|
||||
for invoice_vals in invoices:
|
||||
if not ref_invoice_vals:
|
||||
ref_invoice_vals = invoice_vals
|
||||
else:
|
||||
ref_invoice_vals["invoice_line_ids"] += invoice_vals[
|
||||
"invoice_line_ids"
|
||||
]
|
||||
origins.add(invoice_vals["invoice_origin"])
|
||||
payment_refs.add(invoice_vals["payment_reference"])
|
||||
refs.add(invoice_vals["ref"])
|
||||
ref_invoice_vals.update(
|
||||
{
|
||||
"ref": ", ".join(refs)[:2000],
|
||||
"invoice_origin": ", ".join(origins),
|
||||
"payment_reference": len(payment_refs) == 1
|
||||
and payment_refs.pop()
|
||||
or False,
|
||||
}
|
||||
)
|
||||
new_invoice_vals_list.append(ref_invoice_vals)
|
||||
return new_invoice_vals_list
|
||||
|
||||
def _prepare_invoice(self, partner_invoice_id=False):
|
||||
"""
|
||||
Prepare the dict of values to create the new invoice for a folio.
|
||||
|
||||
@@ -135,7 +135,8 @@ class ResPartner(models.Model):
|
||||
)
|
||||
invoicing_policy = fields.Selection(
|
||||
string="Invoicing Policy",
|
||||
help="The invoicing policy of the partner, set Property to user the policy configured in the Property",
|
||||
help="""The invoicing policy of the partner,
|
||||
set Property to user the policy configured in the Property""",
|
||||
selection=[
|
||||
("property", "Property Policy Invoice"),
|
||||
("manual", "Manual"),
|
||||
|
||||
Reference in New Issue
Block a user