You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							159 lines
						
					
					
						
							7.9 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							159 lines
						
					
					
						
							7.9 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								#############################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
							 | 
						|
								#    Author: Cybrosys Techno Solutions (<https://www.cybrosys.com>)
							 | 
						|
								#
							 | 
						|
								#    You can modify it under the terms of the GNU AFFERO
							 | 
						|
								#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
							 | 
						|
								#
							 | 
						|
								#    This program is distributed in the hope that it will be useful,
							 | 
						|
								#    but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						|
								#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						|
								#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
							 | 
						|
								#
							 | 
						|
								#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
							 | 
						|
								#    (AGPL v3) along with this program.
							 | 
						|
								#    If not, see <http://www.gnu.org/licenses/>.
							 | 
						|
								#
							 | 
						|
								#############################################################################
							 | 
						|
								import json
							 | 
						|
								import requests
							 | 
						|
								from odoo import api, fields, models
							 | 
						|
								from odoo.exceptions import ValidationError
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class InheritContacts(models.Model):
							 | 
						|
								    """
							 | 
						|
								        Extends the base 'res.partner' model to include additional fields related to Mailercloud integration.
							 | 
						|
								
							 | 
						|
								        This class inherits from the 'res.partner' model and adds custom fields for Mailercloud integration,
							 | 
						|
								        including 'partner_type' and 'mailer_cloud'.
							 | 
						|
								        """
							 | 
						|
								    _inherit = 'res.partner'
							 | 
						|
								
							 | 
						|
								    partner_type = fields.Char(
							 | 
						|
								        string='Partner Type', compute='_compute_partner_type',
							 | 
						|
								        help='Type of the partner, computed based on specific criteria.')
							 | 
						|
								    mailer_cloud = fields.Char(string='Mailercloud',
							 | 
						|
								                               help='Identifier for the partner in '
							 | 
						|
								                                    'Mailercloud.')
							 | 
						|
								
							 | 
						|
								    def _compute_partner_type(self):
							 | 
						|
								        """
							 | 
						|
								            Compute method to determine the 'partner_type' based on specific criteria.
							 | 
						|
								
							 | 
						|
								            This method computes the 'partner_type' field based on certain conditions or criteria.
							 | 
						|
								            """
							 | 
						|
								        for rec in self:
							 | 
						|
								            if rec.sale_order_count > 0 and rec.purchase_order_count > 0:
							 | 
						|
								                rec.partner_type = "Vendor and Customer"
							 | 
						|
								            elif rec.sale_order_count > 0:
							 | 
						|
								                rec.partner_type = "Customer"
							 | 
						|
								            elif rec.purchase_order_count > 0:
							 | 
						|
								                rec.partner_type = "Vendor"
							 | 
						|
								            else:
							 | 
						|
								                rec.partner_type = None
							 | 
						|
								
							 | 
						|
								    @api.model
							 | 
						|
								    def create(self, vals_list):
							 | 
						|
								        """
							 | 
						|
								            Create method to extend the creation of 'res.partner' records and synchronize data with Mailercloud.
							 | 
						|
								
							 | 
						|
								            This method is called when creating a new 'res.partner' record. It extends the base creation process
							 | 
						|
								            to include synchronization with Mailercloud, if contact synchronization is active for any associated API.
							 | 
						|
								
							 | 
						|
								            :param vals_list: List of dictionaries containing values for the new 'res.partner' record(s).
							 | 
						|
								            :return: Created 'res.partner' record(s).
							 | 
						|
								            :raises: ValidationError if there is an issue with the Mailercloud API synchronization.
							 | 
						|
								            """
							 | 
						|
								        res = super(InheritContacts, self).create(vals_list)
							 | 
						|
								        contact_sync = self.env['mailer.cloud.api.sync'].search(
							 | 
						|
								            [('contact_sync_active', '=', True)],
							 | 
						|
								            order='contact_sync_time desc', limit=1)
							 | 
						|
								        if contact_sync:
							 | 
						|
								            try:
							 | 
						|
								                for rec in contact_sync:
							 | 
						|
								                    contact_details_dict = {}
							 | 
						|
								                    contact_details_dict.clear()
							 | 
						|
								                    for i in range(
							 | 
						|
								                            len(rec.contact_mapping_ids.mapped(
							 | 
						|
								                                'property_id.name'))):
							 | 
						|
								                        if self.env['mailer.cloud.properties'].search([('id', '=', rec.contact_mapping_ids.mapped(
							 | 
						|
								                                'property_id')[i].id)]).mailer_cloud:
							 | 
						|
								                            contact_details_dict['custom_fields'] = {
							 | 
						|
								                                rec.contact_mapping_ids.mapped('property_id.mailer_cloud')[i]:
							 | 
						|
								                                    res.read([rec.contact_mapping_ids.mapped('contact_fields')[i]])[0][
							 | 
						|
								                                        rec.contact_mapping_ids.mapped('contact_fields')[i]] or ' '}
							 | 
						|
								                            for key, value in contact_details_dict['custom_fields'].items():
							 | 
						|
								                                if isinstance(value, float):
							 | 
						|
								                                    contact_details_dict[
							 | 
						|
								                                        'custom_fields'].update(
							 | 
						|
								                                        {key: round(value)})
							 | 
						|
								                        else:
							 | 
						|
								                            contact_details_dict[
							 | 
						|
								                                rec.contact_mapping_ids.mapped(
							 | 
						|
								                                    'property_id.name')[
							 | 
						|
								                                    i]] = res.read([rec.contact_mapping_ids.mapped('contact_fields')[i]])[0][
							 | 
						|
								                                              rec.contact_mapping_ids.mapped('contact_fields')[i]] or ' '
							 | 
						|
								                            for key, value in contact_details_dict.items():
							 | 
						|
								                                if isinstance(value, float):
							 | 
						|
								                                    contact_details_dict.update(
							 | 
						|
								                                        {key: round(value)})
							 | 
						|
								                    contact_details_dict[
							 | 
						|
								                        'list_id'] = rec.list_id.mailer_cloud
							 | 
						|
								                    url = "https://cloudapi.mailercloud.com/v1/contacts"
							 | 
						|
								                    payload = json.dumps(contact_details_dict)
							 | 
						|
								                    headers = {
							 | 
						|
								                        'Authorization': rec.api_key,
							 | 
						|
								                        'Content-Type': 'application/json'
							 | 
						|
								                    }
							 | 
						|
								                    response = requests.request("POST", url, headers=headers, data=payload)
							 | 
						|
								                    if response.status_code in (400, 401):
							 | 
						|
								                        raise ValidationError(
							 | 
						|
								                            response.json()['errors'][0]['message'])
							 | 
						|
								            except Exception as e:
							 | 
						|
								                raise ValidationError(e)
							 | 
						|
								        return res
							 | 
						|
								
							 | 
						|
								    def write(self, vals):
							 | 
						|
								        """
							 | 
						|
								            Extend the standard write method for 'res.partner' records and synchronize updates with Mailercloud.
							 | 
						|
								
							 | 
						|
								            This method is called when updating an existing 'res.partner' record. It extends the base write process
							 | 
						|
								            to include synchronization with Mailercloud if contact synchronization is active for any associated API.
							 | 
						|
								
							 | 
						|
								            :param vals: Dictionary of field-value pairs to update for the 'res.partner' record.
							 | 
						|
								            :return: Result of the standard write method.
							 | 
						|
								            :raises: ValidationError if there is an issue with the Mailercloud API synchronization.
							 | 
						|
								            """
							 | 
						|
								        res = super(InheritContacts, self).write(vals)
							 | 
						|
								        contact_sync = self.env['mailer.cloud.api.sync'].search(
							 | 
						|
								            [('contact_sync_active', '=', True)], order='contact_sync_time desc', limit=1)
							 | 
						|
								        if contact_sync:
							 | 
						|
								            update_dict = {}
							 | 
						|
								            for key, vals in vals.items():
							 | 
						|
								                for rec in contact_sync.contact_mapping_ids:
							 | 
						|
								                    if key == rec.contact_fields and rec.property_id.mailer_cloud:
							 | 
						|
								                        update_dict['custom_fields'] = {
							 | 
						|
								                            rec.property_id.mailer_cloud: round(vals) if type(vals) == float else vals}
							 | 
						|
								                    elif key == rec.contact_fields:
							 | 
						|
								                        update_dict[key] = round(vals) if type(vals) == float else vals
							 | 
						|
								                    else:
							 | 
						|
								                        continue
							 | 
						|
								            if len(update_dict) > 0:
							 | 
						|
								                try:
							 | 
						|
								                    url = "https://cloudapi.mailercloud.com/v1/contacts/" + self.email
							 | 
						|
								                    payload = json.dumps(update_dict)
							 | 
						|
								                    headers = {
							 | 
						|
								                        'Authorization': contact_sync.api_key,
							 | 
						|
								                        'Content-Type': 'application/json'
							 | 
						|
								                    }
							 | 
						|
								                    requests.request("PUT", url, headers=headers, data=payload)
							 | 
						|
								                except Exception as e:
							 | 
						|
								                    raise ValidationError(e)
							 | 
						|
								            else:
							 | 
						|
								                pass
							 | 
						|
								        return res
							 | 
						|
								
							 |