From 71d5aa84461267a7355f071cce2745c248acdd08 Mon Sep 17 00:00:00 2001 From: Miguel Padin Date: Mon, 22 Feb 2021 18:25:55 +0100 Subject: [PATCH] [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) --- pms/models/pms_folio.py | 84 ++++++++++++++++++++++- pms/tests/test_pms_folio.py | 64 +++++++++++++++++ pms/wizards/wizard_payment_folio.py | 75 +++----------------- pms_l10n_es/models/pms_checkin_partner.py | 13 ++++ 4 files changed, 169 insertions(+), 67 deletions(-) diff --git a/pms/models/pms_folio.py b/pms/models/pms_folio.py index 1a0cdc2c7..f20da8d28 100644 --- a/pms/models/pms_folio.py +++ b/pms/models/pms_folio.py @@ -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, + } diff --git a/pms/tests/test_pms_folio.py b/pms/tests/test_pms_folio.py index c4e2c0cca..3d1203597 100644 --- a/pms/tests/test_pms_folio.py +++ b/pms/tests/test_pms_folio.py @@ -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) diff --git a/pms/wizards/wizard_payment_folio.py b/pms/wizards/wizard_payment_folio.py index 15b727f60..5279bbe80 100644 --- a/pms/wizards/wizard_payment_folio.py +++ b/pms/wizards/wizard_payment_folio.py @@ -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, - } diff --git a/pms_l10n_es/models/pms_checkin_partner.py b/pms_l10n_es/models/pms_checkin_partner.py index 2d2d5ac5e..b515d20b3 100644 --- a/pms_l10n_es/models/pms_checkin_partner.py +++ b/pms_l10n_es/models/pms_checkin_partner.py @@ -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: