46 lines
1.9 KiB
Python
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})
|