[DONE] PWA payment-flow (#55)

* [REF] pms: move payment action from wizard to folio

* [FIX] pms: fix last commit (travis error)

* [ADD] pms: test case partial payment

* [FIX] add firstname to pms.checkin.partner(l10n)
This commit is contained in:
Miguel Padin
2021-02-22 18:25:55 +01:00
committed by GitHub
parent 5967157b3d
commit 71d5aa8446
4 changed files with 169 additions and 67 deletions

View File

@@ -6,7 +6,7 @@ import logging
from itertools import groupby
from odoo import _, api, fields, models
from odoo.exceptions import AccessError, UserError
from odoo.exceptions import AccessError, UserError, ValidationError
from odoo.tools import float_is_zero
_logger = logging.getLogger(__name__)
@@ -1250,3 +1250,85 @@ class PmsFolio(models.Model):
if optional_values:
down_payments_section_line.update(optional_values)
return down_payments_section_line
def do_payment(
self,
journal,
receivable_account,
user,
amount,
folio,
reservations=False,
services=False,
partner=False,
date=False,
):
line = self._get_statement_line_vals(
journal=journal,
receivable_account=receivable_account,
user=user,
amount=amount,
folios=folio,
reservations=reservations,
services=services,
partner=partner,
date=date,
)
self.env["account.bank.statement.line"].sudo().create(line)
@api.model
def _get_statement_line_vals(
self,
journal,
receivable_account,
user,
amount,
folios,
reservations=False,
services=False,
partner=False,
date=False,
):
property_folio_id = folios.mapped("pms_property_id.id")
if len(property_folio_id) != 1:
raise ValidationError(_("Only can payment by property"))
ctx = dict(self.env.context, company_id=folios[0].company_id.id)
statement = (
self.env["account.bank.statement"]
.sudo()
.search(
[
("journal_id", "=", journal.id),
("property_id", "=", property_folio_id[0]),
("state", "=", "open"),
]
)
)
reservation_ids = reservations.ids if reservations else []
service_ids = services.ids if services else []
if not statement:
# TODO: cash control option
st_values = {
"journal_id": journal.id,
"user_id": self.env.user.id,
"property_id": property_folio_id[0],
"name": str(fields.Datetime.now()),
}
statement = (
self.env["account.bank.statement"]
.with_context(ctx)
.sudo()
.create(st_values)
)
return {
"date": date,
"amount": amount,
"partner_id": partner.id if partner else False,
"statement_folio_ids": [(6, 0, folios.ids)],
"reservation_ids": [(6, 0, reservation_ids)],
"service_ids": [(6, 0, service_ids)],
"payment_ref": folios.mapped("name"),
"statement_id": statement.id,
"journal_id": statement.journal_id.id,
"counterpart_account_id": receivable_account.id,
}

View File

@@ -37,6 +37,7 @@ class TestPmsFolio(TestHotel):
"name": "Double Test",
"code_type": "DBL_Test",
"class_id": self.room_type_class.id,
"price": 25,
}
)
# create room
@@ -137,3 +138,66 @@ class TestPmsFolio(TestHotel):
r1.folio_id.max_reservation_prior,
"The max. reservation priority on the whole folio is incorrect",
)
def test_full_pay_folio(self):
# TEST CASE
# Folio is paid after execute
#
# ARRANGE
self.create_common_scenario()
r_test = self.env["pms.reservation"].create(
{
"pms_property_id": self.property.id,
"checkin": datetime.datetime.now(),
"checkout": datetime.datetime.now() + datetime.timedelta(days=1),
"adults": 2,
"partner_id": self.env.ref("base.res_partner_12").id,
"room_type_id": self.room_type_double.id,
}
)
self.env["pms.folio"].do_payment(
self.env["account.journal"].browse(
r_test.folio_id.pms_property_id._get_payment_methods().ids[0]
),
self.env["account.journal"]
.browse(r_test.folio_id.pms_property_id._get_payment_methods().ids[0])
.suspense_account_id,
self.env.user,
r_test.folio_id.pending_amount,
r_test.folio_id,
partner=r_test.partner_id,
date=fields.date.today(),
)
self.assertFalse(r_test.folio_id.pending_amount)
def test_partial_pay_folio(self):
# TEST CASE
# Folio is partially paid after execute
#
# ARRANGE
left_to_pay = 1
self.create_common_scenario()
r_test = self.env["pms.reservation"].create(
{
"pms_property_id": self.property.id,
"checkin": datetime.datetime.now(),
"checkout": datetime.datetime.now() + datetime.timedelta(days=1),
"adults": 2,
"partner_id": self.env.ref("base.res_partner_12").id,
"room_type_id": self.room_type_double.id,
}
)
self.env["pms.folio"].do_payment(
self.env["account.journal"].browse(
r_test.folio_id.pms_property_id._get_payment_methods().ids[0]
),
self.env["account.journal"]
.browse(r_test.folio_id.pms_property_id._get_payment_methods().ids[0])
.suspense_account_id,
self.env.user,
r_test.folio_id.pending_amount - left_to_pay,
r_test.folio_id,
partner=r_test.partner_id,
date=fields.date.today(),
)
self.assertEqual(r_test.folio_id.pending_amount, left_to_pay)

View File

@@ -1,7 +1,6 @@
import logging
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
from odoo import api, fields, models
_logger = logging.getLogger(__name__)
@@ -51,70 +50,14 @@ class WizardPaymentFolio(models.TransientModel):
self.allowed_method_ids = journal_ids
def button_payment(self):
BankStatementLine = self.env["account.bank.statement.line"]
line = self._get_statement_line_vals(
journal=self.payment_method_id,
receivable_account=self.payment_method_id.suspense_account_id,
user=self.env.user,
amount=self.amount,
folios=self.folio_id,
self.env["pms.folio"].do_payment(
self.payment_method_id,
self.payment_method_id.suspense_account_id,
self.env.user,
self.amount,
self.folio_id,
reservations=False,
services=False,
partner=self.partner_id,
date=self.date,
)
BankStatementLine.sudo().create(line)
def _get_statement_line_vals(
self,
journal,
receivable_account,
user,
amount,
folios,
reservations=False,
services=False,
partner=False,
date=False,
):
property_folio_id = folios.mapped("pms_property_id.id")
if len(property_folio_id) != 1:
raise ValidationError(_("Only can payment by property"))
ctx = dict(self.env.context, company_id=folios[0].company_id.id)
statement = (
self.env["account.bank.statement"]
.sudo()
.search(
[
("journal_id", "=", journal.id),
("property_id", "=", property_folio_id[0]),
("state", "=", "open"),
]
)
)
reservation_ids = reservations.ids if reservations else []
service_ids = services.ids if services else []
if not statement:
# TODO: cash control option
st_values = {
"journal_id": journal.id,
"user_id": self.env.user.id,
"property_id": property_folio_id[0],
"name": str(fields.Datetime.now()),
}
statement = (
self.env["account.bank.statement"]
.with_context(ctx)
.sudo()
.create(st_values)
)
return {
"date": date,
"amount": amount,
"partner_id": partner.id if partner else False,
"statement_folio_ids": [(6, 0, folios.ids)],
"reservation_ids": [(6, 0, reservation_ids)],
"service_ids": [(6, 0, service_ids)],
"payment_ref": folios.mapped("name"),
"statement_id": statement.id,
"journal_id": statement.journal_id.id,
"counterpart_account_id": receivable_account.id,
}

View File

@@ -10,6 +10,13 @@ class PmsCheckinPartner(models.Model):
store=True,
readonly=False,
)
firstname = fields.Char(
"Last Name",
compute="_compute_firstname",
store=True,
readonly=False,
)
lastname2 = fields.Char(
"Second Last Name",
compute="_compute_lastname2",
@@ -63,6 +70,12 @@ class PmsCheckinPartner(models.Model):
if not record.lastname:
record.lastname = record.partner_id.lastname
@api.depends("partner_id", "partner_id.firstname")
def _compute_firstname(self):
for record in self:
if not record.firstname:
record.firstname = record.partner_id.firstname
@api.depends("partner_id", "partner_id.lastname2")
def _compute_lastname2(self):
for record in self: