diff --git a/pms/models/pms_folio.py b/pms/models/pms_folio.py index d70801cbf..bb61a96b6 100644 --- a/pms/models/pms_folio.py +++ b/pms/models/pms_folio.py @@ -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: diff --git a/pms/models/pms_reservation.py b/pms/models/pms_reservation.py index c15983214..5dcf63494 100644 --- a/pms/models/pms_reservation.py +++ b/pms/models/pms_reservation.py @@ -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") diff --git a/pms/views/pms_folio_views.xml b/pms/views/pms_folio_views.xml index 165160ca6..65dc55f26 100644 --- a/pms/views/pms_folio_views.xml +++ b/pms/views/pms_folio_views.xml @@ -180,9 +180,6 @@ />
- - - diff --git a/pms/views/pms_reservation_views.xml b/pms/views/pms_reservation_views.xml index d760fe6d3..23e13e411 100644 --- a/pms/views/pms_reservation_views.xml +++ b/pms/views/pms_reservation_views.xml @@ -887,6 +887,7 @@ attrs="{'invisible':[('folio_pending_amount','=',0)]}" /> +