[IMP] point_of_sale: Allow contact deletion
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) <jcb@odoo.com>
This commit is contained in:
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
]);
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user