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.
		
		
		
		
		
			
		
			
				
					
					
						
							223 lines
						
					
					
						
							12 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							223 lines
						
					
					
						
							12 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ################################################################################ | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |
| #    Author: Subina P (odoo@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 | |
| from odoo import fields, http | |
| from odoo.http import request | |
| 
 | |
| 
 | |
| class PipedriveWebhook(http.Controller): | |
|     """ This controller is responsible for receiving Webhooks from Pipedrive""" | |
| 
 | |
|     @http.route('/update_pipedrive_product', type="json", auth="public", csrf=False, | |
|                 methods=['POST']) | |
|     def get_updated_product_details(self, **kw): | |
|         """Webhook for receiving the updated product details.""" | |
|         data = json.loads(request.httprequest.data.decode('utf-8')) | |
|         request.env.company.sudo().create_product_category() | |
|         uom_id = 1 | |
|         if data['current']['unit']: | |
|             for rec in request.env['uom.uom'].sudo().search([]).mapped( | |
|                     'name'): | |
|                 if rec.lower() == data['current']['unit'].lower(): | |
|                     uom_id = request.env['uom.uom'].sudo().search( | |
|                         [('name', '=', rec)]).id | |
|         pipedrive_product = request.env['pipedrive.record'].sudo().search( | |
|             [('record_type', '=', 'product'), ('pipedrive_reference', '=', data['current']['id'])]) | |
|         product_template = request.env['product.template'].sudo().browse(pipedrive_product.odoo_ref) | |
|         pipedrive_categ = request.env['pipedrive.record'].sudo().search( | |
|             [('record_type', '=', 'categ'), ('pipedrive_reference', '=', data['current']['category'])]) | |
|         category_id = request.env['product.category'].sudo().browse( | |
|             pipedrive_categ.odoo_ref) if pipedrive_categ else 1 | |
|         currency = request.env['res.currency'] | |
|         if data['current']['prices']: | |
|             currency = request.env['res.currency'].sudo().search( | |
|                 [('name', '=', data['current']['prices'][0]['currency']), | |
|                  ('active', 'in', [True, False])]) | |
|             if not currency.active: | |
|                 currency.active = True | |
|         list_price = currency._convert( | |
|             data['current']['prices'][0]['price'], | |
|             request.env.company.currency_id, request.env.company, | |
|             fields.date.today()) if data['current']['prices'][0][ | |
|             'price'] else 0.0, | |
|         standard_price = currency._convert( | |
|             data['current']['prices'][0]['cost'], | |
|             request.env.company.currency_id, request.env.company, | |
|             fields.date.today()) if data['current']['prices'][0][ | |
|             'cost'] else 0.0, | |
|         if product_template: | |
|             update_values = {} | |
|             if product_template.name != data['current']['name']: | |
|                 update_values['name'] = data['current']['name'] | |
|             if product_template.description != data['current']['description']: | |
|                 update_values['description'] = data['current']['description'] | |
|             if product_template.uom_id.id != uom_id: | |
|                 update_values['uom_id'] = uom_id | |
|                 update_values['uom_po_id'] = uom_id | |
|             if product_template.active != data['current']['active_flag']: | |
|                 update_values['active'] = data['current']['active_flag'] | |
|             if product_template.standard_price != standard_price[0]: | |
|                 update_values['standard_price'] = standard_price[0] | |
|             if product_template.list_price != list_price[0]: | |
|                 update_values['list_price'] = list_price[0] | |
|             if product_template.categ_id.id != category_id: | |
|                 update_values['categ_id'] = category_id | |
|             product_template.update_from_pipedrive = False | |
|             if update_values: | |
|                 product_template['update_from_pipedrive'] = True | |
|                 product_template.sudo().write(update_values) | |
| 
 | |
|     @http.route('/add_pipedrive_product', type="json", auth="public", csrf=False, | |
|                 methods=['POST']) | |
|     def get_added_product_details(self, **kw): | |
|         """Webhook for receiving the new product details.""" | |
|         if json.loads(request.httprequest.data.decode('utf-8'))[ | |
|             'meta']['change_source'] != 'api': | |
|             added_data = json.loads(request.httprequest.data.decode('utf-8'))[ | |
|                 'current'] | |
|             request.env.company.sudo().create_product_category() | |
|             uom = 1 | |
|             currency = request.env['res.currency'] | |
|             if added_data['prices']: | |
|                 currency = request.env['res.currency'].sudo().search( | |
|                     [('name', '=', added_data['prices'][0]['currency']), | |
|                      ('active', 'in', [True, False])]) | |
|                 if not currency.active: | |
|                     currency.active = True | |
|             if added_data['unit']: | |
|                 for rec in request.env['uom.uom'].sudo().search([]).mapped( | |
|                         'name'): | |
|                     if rec.lower() == added_data['unit'].lower(): | |
|                         uom = request.env['uom.uom'].sudo().search( | |
|                             [('name', '=', rec)]).id | |
|             if not request.env['pipedrive.record'].sudo().search( | |
|                     [('pipedrive_reference', '=', added_data['id']), ('record_type', '=', 'product')]): | |
|                 product = request.env['product.template'].sudo().create({ | |
|                     'name': added_data['name'], | |
|                     'description': added_data['description'], | |
|                     'uom_id': uom, | |
|                     'uom_po_id': uom, | |
|                     'taxes_id': False, | |
|                     'list_price': currency._convert( | |
|                         added_data['prices'][0]['price'], | |
|                         request.env.company.currency_id, request.env.company, | |
|                         fields.date.today()) if | |
|                     added_data['prices'][0][ | |
|                         'price'] else 0.0, | |
|                     'standard_price': currency._convert( | |
|                         added_data['prices'][0]['cost'], | |
|                         request.env.company.currency_id, request.env.company, | |
|                         fields.date.today()) if | |
|                     added_data['prices'][0][ | |
|                         'cost'] else 0.0, | |
|                     'categ_id': request.env['pipedrive.record'].sudo().search( | |
|                         [( | |
|                             'pipedrive_reference', '=', | |
|                             added_data['category'])])[0].odoo_ref if request.env['pipedrive.record'].sudo().search( | |
|                         [( | |
|                             'pipedrive_reference', '=', | |
|                             added_data['category'])]) else 1 | |
|                     if added_data['category'] else 1, | |
|                     'pipedrive_reference': added_data['id'] | |
|                 }) | |
|                 request.env['pipedrive.record'].sudo().create({ | |
|                     'pipedrive_reference': added_data['id'], | |
|                     'record_type': 'product', | |
|                     'odoo_ref': product.id | |
|                 }) | |
|                 product.taxes_id.unlink() | |
|                 if added_data['tax'] != 0: | |
|                     tax = request.env['account.tax'].sudo().search( | |
|                         [('amount_type', '=', 'percent'), | |
|                          ('type_tax_use', '=', 'sale'), ('amount', | |
|                                                          '=', | |
|                                                          added_data['tax'])]) | |
|                     if not tax: | |
|                         tax = request.env['account.tax'].sudo().create({ | |
|                             'name': 'Tax ' + str(added_data['tax']) + '%', | |
|                             'amount_type': 'percent', | |
|                             'type_tax_use': 'sale', | |
|                             'amount': added_data['tax'] | |
|                         }) | |
|                     product.sudo().write({ | |
|                         "taxes_id": [(4, tax.id)] | |
|                     }) | |
| 
 | |
|     @http.route('/delete_pipedrive_product', type="json", auth="public", csrf=False, | |
|                 methods=['POST']) | |
|     def get_deleted_product_details(self, **kw): | |
|         """Webhook for receiving the deleted product details.""" | |
|         deleted_data = json.loads(request.httprequest.data.decode('utf-8')) | |
|         pipedrive_product = request.env['pipedrive.record'].sudo().search( | |
|             [('record_type', '=', 'product'), ('pipedrive_reference', '=', deleted_data['meta']['id'])]) | |
|         request.env['product.template'].sudo().browse(pipedrive_product.odoo_ref).sudo().write( | |
|             {'active': False}) | |
|         pipedrive_product.sudo().write( | |
|             {'active': False}) | |
| 
 | |
|     @http.route('/update_pipedrive_contact', type="json", auth="public", csrf=False, | |
|                 methods=['POST']) | |
|     def get_updated_contact_details(self, **kw): | |
|         """Webhook for receiving the updated contact details.""" | |
|         data = json.loads(request.httprequest.data.decode('utf-8')) | |
|         pipedrive_contact = request.env['pipedrive.record'].sudo().search( | |
|             [('record_type', '=', 'partner'), ('pipedrive_reference', '=', data['current']['id'])]) | |
|         partner = request.env['res.partner'].sudo().browse([( | |
|             pipedrive_contact.odoo_ref)]) | |
|         if partner: | |
|             partner.sudo().write({ | |
|                 'name': data['current']['name'], | |
|                 'email': data['current']['email'][0]['value'], | |
|                 'phone': data['current']['phone'][0]['value'], | |
|             }) | |
| 
 | |
|     @http.route('/add_pipedrive_contact', type="json", auth="public", csrf=False, | |
|                 methods=['POST']) | |
|     def get_added_contact_details(self, **kw): | |
|         """Webhook for receiving the added contact details.""" | |
|         if json.loads(request.httprequest.data.decode('utf-8'))['meta']['change_source'] != 'api': | |
|             data = json.loads(request.httprequest.data.decode('utf-8'))['current'] | |
|             if not request.env['pipedrive.record'].sudo().search( | |
|                     [('record_type', '=', 'partner'), ('pipedrive_reference', '=', data['id'])]): | |
|                 person = request.env['res.partner'].sudo().create({ | |
|                     'name': data['name'], | |
|                     'phone': data['phone'][0]['value'], | |
|                     'email': data['email'][0]['value'], | |
|                     'pipedrive_reference': data['id'] | |
|                 }) | |
|                 request.env['pipedrive.record'].sudo().create({ | |
|                     'pipedrive_reference': data['id'], | |
|                     'record_type': 'partner', | |
|                     'odoo_ref': person.id | |
|                 }) | |
| 
 | |
|     @http.route('/delete_pipedrive_contact', type="json", auth="public", | |
|                 methods=['POST'], csrf=False) | |
|     def get_deleted_contact_details(self, **kw): | |
|         """Webhook for receiving the deleted contact details.""" | |
|         data = json.loads(request.httprequest.data.decode('utf-8')) | |
|         pipedrive_contact = request.env['pipedrive.record'].sudo().search( | |
|             [('record_type', '=', 'partner'), ('pipedrive_reference', '=', data['meta']['id'])]) | |
|         request.env['product.template'].sudo().browse(pipedrive_contact.odoo_ref).sudo().write( | |
|             {'active': False}) | |
|         pipedrive_contact.sudo().write( | |
|             {'active': False})
 | |
| 
 |