mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[WIP] Folio refact
This commit is contained in:
@@ -3,13 +3,14 @@
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import _, api, fields, models
|
||||
|
||||
import logging
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class PmsFolio(models.Model):
|
||||
_name = "pms.folio"
|
||||
_description = "PMS Folio"
|
||||
_inherit = ["mail.thread", "mail.activity.mixin", "portal.mixin"]
|
||||
_order = "id"
|
||||
_order = "date_order"
|
||||
|
||||
# Default Methods ang Gets
|
||||
@api.model
|
||||
@@ -24,10 +25,6 @@ class PmsFolio(models.Model):
|
||||
return False
|
||||
return True
|
||||
|
||||
@api.model
|
||||
def _get_default_team(self):
|
||||
return self.env["crm.team"]._get_default_team_id()
|
||||
|
||||
@api.model
|
||||
def _get_default_pms_property(self):
|
||||
return self.env.user.pms_property_id
|
||||
@@ -58,7 +55,10 @@ class PmsFolio(models.Model):
|
||||
"include in main Invoice.",
|
||||
)
|
||||
company_id = fields.Many2one(
|
||||
"res.company", "Company", default=lambda self: self.env.company
|
||||
"res.company",
|
||||
"Company",
|
||||
required=True,
|
||||
default=lambda self: self.env.company,
|
||||
)
|
||||
analytic_account_id = fields.Many2one(
|
||||
"account.analytic.account",
|
||||
@@ -79,9 +79,10 @@ class PmsFolio(models.Model):
|
||||
pricelist_id = fields.Many2one(
|
||||
"product.pricelist",
|
||||
string="Pricelist",
|
||||
required=True,
|
||||
ondelete="restrict",
|
||||
states={"draft": [("readonly", False)], "sent": [("readonly", False)]},
|
||||
compute="_compute_pricelist_id",
|
||||
store=True,
|
||||
readonly=False,
|
||||
help="Pricelist for current folio.",
|
||||
)
|
||||
user_id = fields.Many2one(
|
||||
@@ -90,7 +91,9 @@ class PmsFolio(models.Model):
|
||||
index=True,
|
||||
ondelete="restrict",
|
||||
track_visibility="onchange",
|
||||
default=lambda self: self.env.user,
|
||||
compute="_compute_user_id",
|
||||
store=True,
|
||||
readonly=False,
|
||||
)
|
||||
tour_operator_id = fields.Many2one(
|
||||
"res.partner",
|
||||
@@ -100,7 +103,14 @@ class PmsFolio(models.Model):
|
||||
)
|
||||
payment_ids = fields.One2many("account.payment", "folio_id", readonly=True)
|
||||
return_ids = fields.One2many("payment.return", "folio_id", readonly=True)
|
||||
payment_term_id = fields.Many2one("account.payment.term", string="Payment Terms")
|
||||
payment_term_id = fields.Many2one(
|
||||
"account.payment.term",
|
||||
string="Payment Terms",
|
||||
ondelete="restrict",
|
||||
compute="_compute_payment_term_id",
|
||||
store=True,
|
||||
readonly=False,
|
||||
help="Pricelist for current folio.",)
|
||||
checkin_partner_ids = fields.One2many("pms.checkin.partner", "folio_id")
|
||||
move_ids = fields.Many2many(
|
||||
"account.move",
|
||||
@@ -112,9 +122,10 @@ class PmsFolio(models.Model):
|
||||
partner_invoice_id = fields.Many2one(
|
||||
"res.partner",
|
||||
string="Invoice Address",
|
||||
required=True,
|
||||
states={"done": [("readonly", True)]},
|
||||
help="Invoice address for current sales order.",
|
||||
compute="_compute_partner_invoice_id",
|
||||
store=True,
|
||||
readonly=False,
|
||||
help="Invoice address for current group.",
|
||||
)
|
||||
partner_parent_id = fields.Many2one(related="partner_id.parent_id")
|
||||
partner_invoice_state_id = fields.Many2one(related="partner_invoice_id.state_id")
|
||||
@@ -132,8 +143,9 @@ class PmsFolio(models.Model):
|
||||
"crm.team",
|
||||
string="Sales Team",
|
||||
ondelete="restrict",
|
||||
change_default=True,
|
||||
default=_get_default_team,
|
||||
compute="_compute_team_id",
|
||||
store=True,
|
||||
readonly=False,
|
||||
)
|
||||
client_order_ref = fields.Char(string="Customer Reference", copy=False)
|
||||
reservation_type = fields.Selection(
|
||||
@@ -280,10 +292,45 @@ class PmsFolio(models.Model):
|
||||
help="Margin in days to create a notice if a payment \
|
||||
advance has not been recorded",
|
||||
)
|
||||
note = fields.Text("Terms and conditions")
|
||||
sequence = fields.Integer(string="Sequence", default=10)
|
||||
|
||||
# Compute and Search methods
|
||||
@api.depends("partner_id")
|
||||
def _compute_pricelist_id(self):
|
||||
for folio in self:
|
||||
pricelist_id = (
|
||||
folio.partner_id.property_product_pricelist
|
||||
and folio.partner_id.property_product_pricelist.id
|
||||
or self.env.user.pms_property_id.default_pricelist_id.id
|
||||
)
|
||||
if folio.pricelist_id.id != pricelist_id:
|
||||
# TODO: Warning change de pricelist?
|
||||
folio.pricelist_id = pricelist_id
|
||||
@api.depends("partner_id")
|
||||
def _compute_user_id(self):
|
||||
for folio in self:
|
||||
folio.user_id = folio.partner_id.user_id.id or self.env.uid,
|
||||
|
||||
@api.depends("partner_id")
|
||||
def _compute_partner_invoice_id(self):
|
||||
self.partner_invoice_id = False
|
||||
for folio in self:
|
||||
addr = folio.partner_id.address_get(["invoice"])
|
||||
folio.partner_invoice_id = addr["invoice"]
|
||||
|
||||
@api.depends("partner_id")
|
||||
def _compute_payment_term_id(self):
|
||||
self.payment_term_id = False
|
||||
for folio in self:
|
||||
folio.payment_term_id = self.partner_id.property_payment_term_id \
|
||||
and self.partner_id.property_payment_term_id.id or False
|
||||
|
||||
@api.depends("partner_id")
|
||||
def _compute_team_id(self):
|
||||
for folio in self:
|
||||
folio.team_id = self.partner_id.team_id.id or \
|
||||
self.env["crm.team"]._get_default_team_id()
|
||||
|
||||
@api.depends(
|
||||
"state", "reservation_ids.invoice_status", "service_ids.invoice_status"
|
||||
)
|
||||
@@ -303,7 +350,7 @@ class PmsFolio(models.Model):
|
||||
directly from existing invoices. This is necessary since such a
|
||||
refund is not directly linked to the Folio.
|
||||
"""
|
||||
for folio in self:
|
||||
for folio in self.filtered("pricelist_id"):
|
||||
move_ids = (
|
||||
folio.reservation_ids.mapped("move_line_ids")
|
||||
.mapped("move_id")
|
||||
@@ -384,7 +431,7 @@ class PmsFolio(models.Model):
|
||||
"""
|
||||
Compute the total amounts of the SO.
|
||||
"""
|
||||
for record in self:
|
||||
for record in self.filtered("pricelist_id"):
|
||||
amount_untaxed = amount_tax = 0.0
|
||||
amount_untaxed = sum(record.reservation_ids.mapped("price_subtotal")) + sum(
|
||||
record.service_ids.mapped("price_subtotal")
|
||||
@@ -521,54 +568,6 @@ class PmsFolio(models.Model):
|
||||
else:
|
||||
self.has_checkout_to_send = False
|
||||
|
||||
# Constraints and onchanges
|
||||
|
||||
@api.onchange("partner_id")
|
||||
def onchange_partner_id(self):
|
||||
"""
|
||||
Update the following fields when the partner is changed:
|
||||
- Pricelist
|
||||
- Payment terms
|
||||
- Invoice address
|
||||
- Delivery address
|
||||
"""
|
||||
if not self.partner_id:
|
||||
self.update(
|
||||
{
|
||||
"partner_invoice_id": False,
|
||||
"payment_term_id": False,
|
||||
"fiscal_position_id": False,
|
||||
}
|
||||
)
|
||||
return
|
||||
|
||||
addr = self.partner_id.address_get(["invoice"])
|
||||
pricelist = (
|
||||
self.partner_id.property_product_pricelist
|
||||
and self.partner_id.property_product_pricelist.id
|
||||
or self.env.user.pms_property_id.default_pricelist_id.id
|
||||
)
|
||||
values = {
|
||||
"pricelist_id": pricelist,
|
||||
"payment_term_id": self.partner_id.property_payment_term_id
|
||||
and self.partner_id.property_payment_term_id.id
|
||||
or False,
|
||||
"partner_invoice_id": addr["invoice"],
|
||||
"user_id": self.partner_id.user_id.id or self.env.uid,
|
||||
}
|
||||
|
||||
if (
|
||||
self.env["ir.config_parameter"].sudo().get_param("sale.use_sale_note")
|
||||
and self.env.user.company_id.sale_note
|
||||
):
|
||||
values["note"] = self.with_context(
|
||||
lang=self.partner_id.lang
|
||||
).env.user.company_id.sale_note
|
||||
|
||||
if self.partner_id.team_id:
|
||||
values["team_id"] = self.partner_id.team_id.id
|
||||
self.update(values)
|
||||
|
||||
# Action methods
|
||||
|
||||
def action_pay(self):
|
||||
@@ -793,34 +792,10 @@ class PmsFolio(models.Model):
|
||||
vals["name"] = self.env["ir.sequence"].next_by_code("pms.folio") or _(
|
||||
"New"
|
||||
)
|
||||
vals.update(self._prepare_add_missing_fields(vals))
|
||||
result = super(PmsFolio, self).create(vals)
|
||||
return result
|
||||
|
||||
# Business methods
|
||||
@api.model
|
||||
def _prepare_add_missing_fields(self, values):
|
||||
""" Deduce missing required fields from the onchange """
|
||||
res = {}
|
||||
onchange_fields = ["partner_invoice_id", "pricelist_id", "payment_term_id"]
|
||||
if values.get("partner_id"):
|
||||
line = self.new(values)
|
||||
if any(f not in values for f in onchange_fields):
|
||||
line.onchange_partner_id()
|
||||
for field in onchange_fields:
|
||||
if field not in values:
|
||||
res[field] = line._fields[field].convert_to_write(line[field], line)
|
||||
return res
|
||||
|
||||
@api.model
|
||||
def calcule_reservation_type(self, is_staff, current_type):
|
||||
if current_type == "out":
|
||||
return "out"
|
||||
elif is_staff:
|
||||
return "staff"
|
||||
else:
|
||||
return "normal"
|
||||
|
||||
def action_done(self):
|
||||
reservation_ids = self.mapped("reservation_ids")
|
||||
for line in reservation_ids:
|
||||
|
||||
@@ -21,11 +21,9 @@ class PmsReservation(models.Model):
|
||||
_description = "Reservation"
|
||||
_inherit = ["mail.thread", "mail.activity.mixin", "portal.mixin"]
|
||||
_order = "last_updated_res desc, name"
|
||||
_check_company_auto = True
|
||||
|
||||
# Default Methods ang Gets
|
||||
def _default_pricelist_id(self):
|
||||
return self.env.user.pms_property_id.default_pricelist_id.id
|
||||
|
||||
def _get_default_checkin(self):
|
||||
folio = False
|
||||
if "folio_id" in self._context:
|
||||
@@ -135,7 +133,7 @@ class PmsReservation(models.Model):
|
||||
partner_invoice_id = fields.Many2one(
|
||||
"res.partner",
|
||||
string="Invoice Address",
|
||||
help="Invoice address for current sales order.",
|
||||
help="Invoice address for current reservation.",
|
||||
compute="_compute_partner_invoice_id",
|
||||
store=True,
|
||||
readonly=False,
|
||||
@@ -169,7 +167,6 @@ class PmsReservation(models.Model):
|
||||
pricelist_id = fields.Many2one(
|
||||
"product.pricelist",
|
||||
string="Pricelist",
|
||||
default=_default_pricelist_id,
|
||||
ondelete="restrict",
|
||||
compute="_compute_pricelist_id",
|
||||
store=True,
|
||||
@@ -450,6 +447,8 @@ class PmsReservation(models.Model):
|
||||
for reservation in self:
|
||||
if reservation.room_id and not reservation.room_type_id:
|
||||
reservation.room_type_id = reservation.room_id.room_type_id.id
|
||||
else:
|
||||
reservation.room_type_id = False
|
||||
|
||||
@api.depends("checkin", "checkout", "overbooking", "state", "room_id")
|
||||
def _compute_allowed_room_ids(self):
|
||||
@@ -489,6 +488,10 @@ class PmsReservation(models.Model):
|
||||
for reservation in self:
|
||||
if reservation.reservation_type == "out":
|
||||
reservation.partner_id = self.env.user.pms_property_id.partner_id.id
|
||||
if reservation.folio_id:
|
||||
reservation.partner_id = reservation.folio_id.partner_id
|
||||
else:
|
||||
reservation.partner_id = False
|
||||
|
||||
@api.depends("partner_id")
|
||||
def _compute_partner_invoice_id(self):
|
||||
@@ -545,11 +548,14 @@ class PmsReservation(models.Model):
|
||||
@api.depends("partner_id")
|
||||
def _compute_pricelist_id(self):
|
||||
for reservation in self:
|
||||
pricelist_id = (
|
||||
reservation.partner_id.property_product_pricelist
|
||||
and reservation.partner_id.property_product_pricelist.id
|
||||
or self.env.user.pms_property_id.default_pricelist_id.id
|
||||
)
|
||||
if reservation.folio_id:
|
||||
pricelist_id = reservation.folio_id.pricelist_id.id
|
||||
else:
|
||||
pricelist_id = (
|
||||
reservation.partner_id.property_product_pricelist
|
||||
and reservation.partner_id.property_product_pricelist.id
|
||||
or self.env.user.pms_property_id.default_pricelist_id.id
|
||||
)
|
||||
if reservation.pricelist_id.id != pricelist_id:
|
||||
# TODO: Warning change de pricelist?
|
||||
reservation.pricelist_id = pricelist_id
|
||||
@@ -563,6 +569,8 @@ class PmsReservation(models.Model):
|
||||
# TODO: Notification if the room capacity is higher than adults?
|
||||
else:
|
||||
reservation.adults = reservation.room_id.capacity
|
||||
else:
|
||||
reservation.adults = 0
|
||||
|
||||
@api.depends("checkin")
|
||||
def _compute_real_checkin(self):
|
||||
@@ -758,6 +766,14 @@ class PmsReservation(models.Model):
|
||||
"price_subtotal": taxes["total_excluded"],
|
||||
}
|
||||
)
|
||||
else:
|
||||
record.update(
|
||||
{
|
||||
"price_tax": 0,
|
||||
"price_total": 0,
|
||||
"price_subtotal": 0,
|
||||
}
|
||||
)
|
||||
|
||||
# Constraints and onchanges
|
||||
@api.constrains("adults")
|
||||
|
||||
@@ -180,9 +180,6 @@
|
||||
/>
|
||||
</group>
|
||||
<div class="oe_clear" />
|
||||
<group>
|
||||
<field name="note" />
|
||||
</group>
|
||||
</group>
|
||||
<group invisible="1">
|
||||
<field name="move_ids" invisible="1" />
|
||||
|
||||
@@ -887,6 +887,7 @@
|
||||
attrs="{'invisible':[('folio_pending_amount','=',0)]}"
|
||||
/>
|
||||
<field name="create_uid" />
|
||||
<field name="company_id" />
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
Reference in New Issue
Block a user