[IMP]pms: add tests autoinvoice and improvement features

This commit is contained in:
Darío Lodeiros
2022-02-10 21:31:07 +01:00
parent 791b10ffe1
commit b9cf65f191
5 changed files with 183 additions and 27 deletions

View File

@@ -564,17 +564,21 @@ class PmsFolio(models.Model):
target_lines = folio_lines_to_invoice
if self._context.get("lines_auto_add") and folio_partner_invoice_id:
if folio_partner_invoice_id.default_invoice_lines == "overnights":
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_id.overnight_room
lambda r: r.is_board_service
or (r.reservation_line_ids and r.reservation_id.overnight_room)
)
elif folio_partner_invoice_id.default_invoice_lines == "reservations":
elif folio_partner_invoice.default_invoice_lines == "reservations":
target_lines = target_lines.filtered(
lambda r: r.is_board_service or r.reservation_id
lambda r: r.is_board_service or r.reservation_line_ids
)
elif folio_partner_invoice_id.default_invoice_lines == "services":
elif folio_partner_invoice.default_invoice_lines == "services":
target_lines = target_lines.filtered(
lambda r: not r.is_board_service or r.service_id
lambda r: not r.is_board_service or r.service_line_ids
)
groups_invoice_lines = [
{
@@ -659,7 +663,7 @@ class PmsFolio(models.Model):
(0, 0, invoice_line_id) for invoice_line_id in invoice_lines_vals
]
invoice_vals_list.append(invoice_vals)
invoice_vals_list.append(invoice_vals)
return invoice_vals_list
def _get_tax_amount_by_group(self):
@@ -684,7 +688,7 @@ class PmsFolio(models.Model):
]
return res
@api.depends("partner_id", "invoice_status", "last_checkout")
@api.depends("partner_id", "invoice_status", "last_checkout", "partner_invoice_ids")
def _compute_autoinvoice_date(self):
self.autoinvoice_date = False
for record in self.filtered(lambda r: r.invoice_status == "to_invoice"):
@@ -706,18 +710,18 @@ class PmsFolio(models.Model):
if not partner or partner.invoicing_policy == "property"
else partner.margin_days_autoinvoice
)
return self.checkout + timedelta(days=margin_days)
return self.last_checkout + timedelta(days=margin_days)
if invoicing_policy == "month_day":
month_day = (
self.pms_property_id.invoicing_month_day
if not partner or partner.invoicing_policy == "property"
else partner.invoicing_month_day
)
if self.checkout.day <= month_day:
self.autoinvoice_date = self.checkout.replace(day=month_day)
if self.last_checkout.day <= month_day:
self.autoinvoice_date = self.last_checkout.replace(day=month_day)
else:
self.autoinvoice_date = (
self.checkout + relativedelta.relativedelta(months=1)
self.last_checkout + relativedelta.relativedelta(months=1)
).replace(day=month_day)
@api.depends("reservation_ids", "reservation_ids.state")
@@ -1613,7 +1617,6 @@ class PmsFolio(models.Model):
lines_to_invoice=lines_to_invoice,
partner_invoice_id=partner_invoice_id,
)
if not invoice_vals_list:
raise self._nothing_to_invoice_error()
@@ -1693,7 +1696,7 @@ class PmsFolio(models.Model):
# 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["partner_id"]:
if invoice_vals["move_type"] == "out_invoice":
move = (
self.env["account.move"]
.sudo()
@@ -1735,11 +1738,6 @@ class PmsFolio(models.Model):
(making sure to call super() to establish a clean extension chain).
"""
self.ensure_one()
if not partner_invoice_id:
partner_invoice_id = (
self.partner_invoice_ids[0].id if self.partner_invoice_ids else False
)
journal = self._get_folio_default_journal(partner_invoice_id)
if not journal:
journal = (

View File

@@ -143,7 +143,7 @@ class PmsProperty(models.Model):
is_canceled_auto_mail = fields.Boolean(string="Auto Send Cancellation Mail")
default_invoicing_policy = fields.Selection(
string="Invoicing Policy",
string="Default Invoicing Policy",
selection=[
("manual", "Manual"),
("checkout", "Checkout"),

View File

@@ -1874,8 +1874,23 @@ class PmsReservation(models.Model):
record = super(PmsReservation, self).create(vals)
if record.preconfirm and record.state == "draft":
record.confirm()
record._check_services(vals)
return record
def write(self, vals):
asset = super(PmsReservation, self).write(vals)
self._check_services(vals)
return asset
def _check_services(self, vals):
# If we create a reservation with board service and other service at the same time,
# compute_service_ids dont run (compute with readonly to False),
# and we must force it to compute the services linked with the board service:
if "board_service_room_id" in vals and "service_ids" in vals:
self._compute_service_ids()
def update_prices(self):
self.ensure_one()
for line in self.reservation_line_ids:

View File

@@ -147,7 +147,7 @@ class TestPmsFolioInvoice(TestPms):
] = 1
r1.folio_id._create_invoices(
lines_to_invoice=dict_lines,
partner_invoice_id=self.env.ref("base.res_partner_1"),
partner_invoice_id=self.env.ref("base.res_partner_1").id,
)
# test does not work without invalidating cache
@@ -165,7 +165,7 @@ class TestPmsFolioInvoice(TestPms):
] = 2
r1.folio_id._create_invoices(
lines_to_invoice=dict_lines,
partner_invoice_id=self.env.ref("base.res_partner_12"),
partner_invoice_id=self.env.ref("base.res_partner_12").id,
)
self.assertNotEqual(
r1.folio_id.move_ids.mapped("partner_id")[0],
@@ -579,14 +579,156 @@ class TestPmsFolioInvoice(TestPms):
"The quantity of board services to be invoice is wrong",
)
def test_autoinvoice_folio_checkout_property_policy(self):
"""
Test create and invoice the cron by property preconfig automation
--------------------------------------
Set property default_invoicing_policy to checkout with 0 days with
margin, and check that the folio autoinvoice date is set to last checkout
folio date
"""
# ARRANGE
self.property.default_invoicing_policy = "checkout"
self.property.margin_days_autoinvoice = 0
# ACT
self.reservation1 = self.env["pms.reservation"].create(
{
"pms_property_id": self.property.id,
"checkin": datetime.date.today(),
"checkout": datetime.date.today() + datetime.timedelta(days=3),
"adults": 2,
"room_type_id": self.room_type_double.id,
"partner_id": self.partner_id.id,
}
)
# ASSERT
self.assertEqual(
datetime.date.today() + datetime.timedelta(days=3),
self.reservation1.folio_id.autoinvoice_date,
"The autoinvoice date in folio with property checkout policy is wrong",
)
def test_autoinvoice_folio_checkout_partner_policy(self):
"""
Test create and invoice the cron by partner preconfig automation
--------------------------------------
Set partner invoicing_policy to checkout with 2 days with
margin, and check that the folio autoinvoice date is set to last checkout
folio date + 2 days
"""
# ARRANGE
self.partner_id.invoicing_policy = "checkout"
self.partner_id.margin_days_autoinvoice = 2
# ACT
self.reservation1 = self.env["pms.reservation"].create(
{
"pms_property_id": self.property.id,
"checkin": datetime.date.today(),
"checkout": datetime.date.today() + datetime.timedelta(days=3),
"adults": 2,
"room_type_id": self.room_type_double.id,
"partner_id": self.partner_id.id,
}
)
# ASSERT
self.assertEqual(
datetime.date.today() + datetime.timedelta(days=5),
self.reservation1.folio_id.autoinvoice_date,
"The autoinvoice date in folio with property checkout policy is wrong",
)
def test_autoinvoice_folio_overnights_partner_policy(self):
"""
Test create and invoice the cron by partner preconfig automation
with only overnights reservations (included board services)
--------------------------------------
Set partner invoicing_policy to checkout, create a reservation
with room, board service and normal service, run autoinvoicing
method and check that only room and board service was invoiced
in partner1,
"""
# ARRANGE
self.partner_id.invoicing_policy = "checkout"
self.partner_id.margin_days_autoinvoice = 0
self.partner_id.default_invoice_lines = "overnights"
self.product1 = self.env["product.product"].create(
{
"name": "Test Product 1",
}
)
self.product2 = self.env["product.product"].create(
{
"name": "Test Product 2",
}
)
self.service = self.env["pms.service"].create(
{
"is_board_service": False,
"product_id": self.product2.id,
}
)
self.board_service1 = self.env["pms.board.service"].create(
{
"name": "Test Board Service 1",
"default_code": "CB1",
}
)
self.board_service_line1 = self.env["pms.board.service.line"].create(
{
"product_id": self.product1.id,
"pms_board_service_id": self.board_service1.id,
"amount": 10,
}
)
self.board_service_room_type1 = self.env["pms.board.service.room.type"].create(
{
"pms_room_type_id": self.room_type_double.id,
"pms_board_service_id": self.board_service1.id,
}
)
# ACT
self.reservation1 = self.env["pms.reservation"].create(
{
"pms_property_id": self.property.id,
"checkin": datetime.date.today() - datetime.timedelta(days=3),
"checkout": datetime.date.today(),
"adults": 2,
"room_type_id": self.room_type_double.id,
"partner_id": self.partner_id.id,
"board_service_room_id": self.board_service_room_type1.id,
"service_ids": [(4, self.service.id)],
}
)
self.property.autoinvoicing()
# ASSERT
overnight_sale_lines = self.reservation1.folio_id.sale_line_ids.filtered(
lambda line: line.reservation_line_ids or line.is_board_service
)
partner_invoice = self.reservation1.folio_id.move_ids.filtered(
lambda inv: inv.partner_id == self.partner_id
)
self.assertEqual(
partner_invoice.mapped("line_ids.folio_line_ids.id"),
overnight_sale_lines.ids,
"Billed services and overnights invoicing wrong compute",
)
def _test_invoice_line_group_by_room_type_sections(self):
"""Test create and invoice from the Folio, and check qty invoice/to invoice,
and the grouped invoice lines by room type, by one
line by unit prices/qty with nights"""
def _test_autoinvoice_folio(self):
"""Test create and invoice the cron by partner preconfig automation"""
def _test_downpayment(self):
"""Test invoice qith a way of downpaument and check dowpayment's
folio line is created and also check a total amount of invoice is

View File

@@ -4,9 +4,10 @@
<field name="model">account.bank.statement</field>
<field name="inherit_id" ref="account.view_bank_statement_form" />
<field name="arch" type="xml">
<xpath expr="//field[@name='ref']" position="after">
<xpath expr="//field[@name='company_id']" position="after">
<field name="pms_property_id" />
<field name="pms_property_id" invisible="1" />
<field name="folio_ids" widget="many2many_tags" optional="hidden" />
</xpath>
<xpath expr="//field[@name='ref']" position="after">