From 5aaee3af66f67ea1232b31c591afb9ee87b12aee Mon Sep 17 00:00:00 2001 From: vlst Date: Wed, 7 Jun 2023 11:27:01 +0000 Subject: [PATCH] [IMP] point_of_sale: Allow contact deletion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently, deleting contacts (partners) while a pos session is open is not allowed. (Even if the respective partner isn't part of any POS sessions) This creates a bad experience in Contacts, with too many unnecessary User Errors. This PR fixes this issue, by allowing the deletion of contacts even when a pos session is open, by introducing logic that handles the cases where a contact might be deleted during an i active pos session. closes odoo/odoo#124152 Task: 3349851 Signed-off-by: Joseph Caburnay (jcb) --- addons/point_of_sale/models/pos_order.py | 7 +++++++ addons/point_of_sale/models/res_partner.py | 9 --------- .../src/app/screens/payment_screen/payment_screen.js | 2 +- addons/pos_loyalty/models/pos_order.py | 5 +++-- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py index d1c41fd6c0d..c623ec827ce 100644 --- a/addons/point_of_sale/models/pos_order.py +++ b/addons/point_of_sale/models/pos_order.py @@ -129,6 +129,13 @@ class PosOrder(models.Model): if pos_session.state == 'closing_control' or pos_session.state == 'closed': order['pos_session_id'] = self._get_valid_session(order).id + if order.get('partner_id'): + partner_id = self.env['res.partner'].browse(order['partner_id']) + if not partner_id.exists(): + order.update({ + "partner_id": False, + "to_invoice": False, + }) pos_order = False if not existing_order: pos_order = self.create(self._order_fields(order)) diff --git a/addons/point_of_sale/models/res_partner.py b/addons/point_of_sale/models/res_partner.py index 2fd88331e44..4559ad86eee 100644 --- a/addons/point_of_sale/models/res_partner.py +++ b/addons/point_of_sale/models/res_partner.py @@ -57,12 +57,3 @@ class ResPartner(models.Model): else: partner_id = self.create(partner).id return partner_id - - @api.ondelete(at_uninstall=False) - def _unlink_except_active_pos_session(self): - running_sessions = self.env['pos.session'].sudo().search([('state', '!=', 'closed')]) - if running_sessions: - raise UserError( - _("You cannot delete contacts while there are active PoS sessions. Close the session(s) %s first.") - % ", ".join(session.name for session in running_sessions) - ) diff --git a/addons/point_of_sale/static/src/app/screens/payment_screen/payment_screen.js b/addons/point_of_sale/static/src/app/screens/payment_screen/payment_screen.js index bf2bb924256..452aa2a8243 100644 --- a/addons/point_of_sale/static/src/app/screens/payment_screen/payment_screen.js +++ b/addons/point_of_sale/static/src/app/screens/payment_screen/payment_screen.js @@ -240,7 +240,7 @@ export class PaymentScreen extends Component { // 2. Invoice. if (this.currentOrder.is_to_invoice()) { - if (syncOrderResult.length) { + if (syncOrderResult[0]?.account_move) { await this.report.download("account.account_invoices", [ syncOrderResult[0].account_move, ]); diff --git a/addons/pos_loyalty/models/pos_order.py b/addons/pos_loyalty/models/pos_order.py index 134097cb135..ff72d0f03c3 100644 --- a/addons/pos_loyalty/models/pos_order.py +++ b/addons/pos_loyalty/models/pos_order.py @@ -60,6 +60,7 @@ class PosOrder(models.Model): It will also return the points of all concerned coupons to be updated in the cache. """ + get_partner_id = lambda partner_id: partner_id and self.env['res.partner'].browse(partner_id).exists() and partner_id or False # Keys are stringified when using rpc coupon_data = {int(k): v for k, v in coupon_data.items()} # Map negative id to newly created ids. @@ -69,7 +70,7 @@ class PosOrder(models.Model): coupons_to_create = {k: v for k, v in coupon_data.items() if k < 0 and not v.get('giftCardId')} coupon_create_vals = [{ 'program_id': p['program_id'], - 'partner_id': p.get('partner_id', False), + 'partner_id': get_partner_id(p.get('partner_id', False)), 'code': p.get('barcode') or self.env['loyalty.card']._generate_code(), 'points': 0, 'source_pos_order_id': self.id, @@ -86,7 +87,7 @@ class PosOrder(models.Model): gift_card.write({ 'points': coupon_vals['points'], 'source_pos_order_id': self.id, - 'partner_id': coupon_vals.get('partner_id', False), + 'partner_id': get_partner_id(coupon_vals.get('partner_id', False)), }) updated_gift_cards |= gift_card