Odoo18-Base/addons/loyalty/wizard/base_partner_merge.py
2025-01-06 10:57:38 +07:00

46 lines
1.9 KiB
Python

from odoo import models
class MergePartnerAutomatic(models.TransientModel):
_inherit = 'base.partner.merge.automatic.wizard'
def _update_foreign_keys(self, src_partners, dst_partner):
""" Override of base to merge corresponding nominative loyalty cards."""
self._merge_loyalty_cards(src_partners, dst_partner)
super()._update_foreign_keys(src_partners, dst_partner)
def _merge_loyalty_cards(self, src_partners, dst_partner):
""" Merge nominative loyalty cards.
:param src_partners: recordset of source res.partner records to merge
:param dst_partner: destination res.partner record
"""
LoyaltyCard = self.env['loyalty.card'].sudo()
cards_per_program = dict(
LoyaltyCard._read_group(
domain=[
('partner_id', 'in', src_partners.ids),
'|',
('program_id.applies_on', '=', 'both'),
'&',
('program_id.program_type', 'in', ('ewallet', 'loyalty')),
('program_id.applies_on', '=', 'future'),
],
groupby=['program_id'],
aggregates=['id:recordset'],
)
)
for program, cards in cards_per_program.items():
total_points = sum(card.points for card in cards)
dst_card = LoyaltyCard.search([
('partner_id', '=', dst_partner.id),
('program_id', '=', program.id),
], limit=1)
if dst_card:
final_card = dst_card
total_points += dst_card.points
else:
final_card = cards[0]
final_card.sudo().write({'partner_id': dst_partner.id, 'points': total_points})
(cards - final_card).sudo().write({'points': 0, 'active': False})