mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[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:
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user