Browse Source

Logcall and related modules.

pull/101/head
Trever L. Adams 8 years ago
parent
commit
c2e1ac7f14
  1. 6
      asterisk_logcall/README.rst
  2. 1
      asterisk_logcall/__init__.py
  3. 39
      asterisk_logcall/__openerp__.py
  4. 2
      asterisk_logcall/models/__init__.py
  5. 64
      asterisk_logcall/models/asterisk_server.py
  6. 2
      asterisk_logcall/security/ir.model.access.csv
  7. 27
      asterisk_logcall/views/asterisk_server_view.xml
  8. 2
      crm_phone/__openerp__.py
  9. 3
      crm_phone/crm_phone.py
  10. 5
      crm_phone/view/crm_phonecall.xml
  11. 4
      crm_voip_logcall/README.rst
  12. 1
      crm_voip_logcall/__init__.py
  13. 35
      crm_voip_logcall/__openerp__.py
  14. 2
      crm_voip_logcall/models/__init__.py
  15. 36
      crm_voip_logcall/models/crm_voip_logcall.py
  16. 6
      freeswitch_logcall/README.rst
  17. 1
      freeswitch_logcall/__init__.py
  18. 39
      freeswitch_logcall/__openerp__.py
  19. 2
      freeswitch_logcall/models/__init__.py
  20. 64
      freeswitch_logcall/models/freeswitch_server.py
  21. 2
      freeswitch_logcall/security/ir.model.access.csv
  22. 26
      freeswitch_logcall/views/freeswitch_server_view.xml
  23. 44
      hr_recruitment_phone_log/README.rst
  24. 3
      hr_recruitment_phone_log/__init__.py
  25. 23
      hr_recruitment_phone_log/__openerp__.py
  26. 3
      hr_recruitment_phone_log/models/__init__.py
  27. 32
      hr_recruitment_phone_log/models/recruitment.py
  28. 2
      hr_recruitment_phone_log/security/ir.model.access.csv
  29. 56
      hr_recruitment_phone_log/views/recruitment_view.xml
  30. 18
      logcall/README.rst
  31. 1
      logcall/__init__.py
  32. 41
      logcall/__openerp__.py
  33. 2
      logcall/models/__init__.py
  34. 185
      logcall/models/crm_phonecall.py
  35. 202
      logcall/scripts/asterisk_logcall.py
  36. 5
      logcall/scripts/asterisk_logcall.sh
  37. 117
      logcall/scripts/freeswitch_logcall.lua
  38. 8
      logcall/security/ir.model.access.csv
  39. 17
      logcall/security/phone_integration_security.xml
  40. 18
      logcall/views/crm_phonecall_view.xml
  41. 33
      logcall/views/res_users_view.xml
  42. 44
      partner_phone_log/README.rst
  43. 3
      partner_phone_log/__init__.py
  44. 21
      partner_phone_log/__openerp__.py
  45. 3
      partner_phone_log/models/__init__.py
  46. 11
      partner_phone_log/models/partner.py
  47. 30
      partner_phone_log/views/partner_view.xml
  48. 44
      partner_phone_log_logcall/README.rst
  49. 1
      partner_phone_log_logcall/__init__.py
  50. 23
      partner_phone_log_logcall/__openerp__.py
  51. 2
      partner_phone_log_logcall/security/ir.model.access.csv
  52. 17
      partner_phone_log_logcall/views/partner_view.xml
  53. 1
      setup/hr_recruitment_phone_log/odoo_addons/hr_recruitment_phone_log
  54. 6
      setup/hr_recruitment_phone_log/setup.py
  55. 1
      setup/logcall/odoo_addons/logcall
  56. 6
      setup/logcall/setup.py
  57. 1
      setup/partner_phone_log/odoo_addons/partner_phone_log
  58. 6
      setup/partner_phone_log/setup.py
  59. 1
      setup/partner_phone_log_logcall/odoo_addons/partner_phone_log_logcall
  60. 6
      setup/partner_phone_log_logcall/setup.py

6
asterisk_logcall/README.rst

@ -0,0 +1,6 @@
Asterisk Phone Log-call
=========================
This bridge adds an option to the Asterisk IPBX servers for the URL to pull
down call recordings. It also adds an option for time jitter compensation
for use when automatically merging call records.

1
asterisk_logcall/__init__.py

@ -0,0 +1 @@
from . import models

39
asterisk_logcall/__openerp__.py

@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Phone Log-call module for Odoo/OpenERP
# Copyright (C) 2016 credativ Ltd (<http://credativ.co.uk>).
# Copyright (C) 2016 Trever L. Adams
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# 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 for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
{
'name': 'Asterisk Phone Log-call',
'version': '9.0.0.1.0',
'category': 'Phone',
'license': 'AGPL-3',
'summary': 'Necessary bridge between log-call and Asterisk Click2dial',
'author': "Trever L. Adams",
'website': '',
'depends': ['logcall', 'asterisk_click2dial'],
'data': [
'security/ir.model.access.csv',
'views/asterisk_server_view.xml',
],
'application': True,
'installable': True,
}

2
asterisk_logcall/models/__init__.py

@ -0,0 +1,2 @@
from . import asterisk_server

64
asterisk_logcall/models/asterisk_server.py

@ -0,0 +1,64 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Phone Log-call module for Odoo/OpenERP
# Copyright (C) 2016 credativ Ltd (<http://credativ.co.uk>).
# Copyright (C) 2016 Trever L. Adams
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# 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 for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp import models, fields, api
import logging
logger = logging.getLogger(__name__)
class AsteriskServer(models.Model):
_inherit = "asterisk.server"
ucp_url = fields.Char(
string='Script to download FreeSWITCH recordings', required=False,
default="https://localhost/cgi-bin/get_recording.pl?file={odoo_filename}",
help="Macros allowed: {odoo_type} (inbound, outbound), {odoo_src}"
"(source phone number}, {odoo_dst} (destination number), "
"{odoo_duration} (length of call), {odoo_start} (start time of call "
"in seconds since epoch), {odoo_filename} (file name on server), "
"{odoo_uniqueid} (FreeSWITCH UUID of call).")
server_jitter_correction = fields.Integer(
string='Time jitter compensation', required=True,
help='Number of seconds to subtract from new call start and add to '
'new call end, for call merging, to compensate for system/database '
'load and time drift between Asterisk server and Odoo/Odoo database '
'server(s). 5 seconds is likely a good start. Above 10 seconds you get '
'into the realm where you may have distinct calls confused. 20 - 30 '
'seconds begins to guarantee this. It is best to keep this low '
'and use a method to keep time synced.',
default=5)
class PhoneCommon(models.AbstractModel):
_inherit = 'phone.common'
@api.model
def _get_ucp_url(self, users):
asterisk_server = users[0].get_asterisk_server_from_user()
return asterisk_server.ucp_url
@api.model
def _get_jitter(self, users):
asterisk_server = users[0].get_asterisk_server_from_user()
return asterisk_server.server_jitter_correction

2
asterisk_logcall/security/ir.model.access.csv

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
ir_model_access_asterisk_server_phone_integration,Read access on asterisk.server,asterisk_click2dial.model_asterisk_server,logcall.group_phone_system_integration,1,0,0,0

27
asterisk_logcall/views/asterisk_server_view.xml

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Asterisk log call module
Copyright (C) 2016 Trever L. Adams
The licence is in the file __openerp__.py
-->
<openerp>
<data>
<record id="asterisk_logcall_extra_options" model="ir.ui.view">
<field name="name">Asterisk IPBX Servers</field>
<field name="model">asterisk.server</field>
<field name="inherit_id" ref="asterisk_click2dial.view_asterisk_server_form"/>
<field name="arch" type="xml">
<xpath expr="//group[@name='dialplan']" position="after">
<group name="extra" string="Extra Options">
<field name="ucp_url"/>
<field name="server_jitter_correction"/>
</group>
</xpath>
</field>
</record>
</data>
</openerp>

2
crm_phone/__openerp__.py

@ -4,7 +4,7 @@
{
'name': 'CRM Phone',
'version': '9.0.1.0.0',
'version': '9.0.1.0.2',
'category': 'Phone',
'license': 'AGPL-3',
'summary': 'Validate phone numbers in CRM',

3
crm_phone/crm_phone.py

@ -61,6 +61,9 @@ class CrmPhonecall(models.Model):
date = fields.Datetime(
string='Date', track_visibility='onchange', copy=False,
default=lambda self: fields.Datetime.now())
end_date = fields.Datetime(
string='End Date', track_visibility='onchange', copy=False,
default=lambda self: fields.Datetime.now())
description = fields.Text(string='Description', copy=False)
company_id = fields.Many2one(
'res.company', string='Company',

5
crm_phone/view/crm_phonecall.xml

@ -31,6 +31,7 @@
<group name="main">
<group name="left">
<field name="date"/>
<field name="end_date"/>
<field name="user_id"/>
<field name="partner_id"/>
<field name="partner_phone" widget="phone"/>
@ -63,6 +64,7 @@
<field name="arch" type="xml">
<tree string="Phone Calls" editable="top">
<field name="date"/>
<field name="end_date"/>
<field name="name"/>
<field name="partner_id"/>
<field name="opportunity_id"/>
@ -80,7 +82,7 @@
<field name="name">crm.phonecall.calendar</field>
<field name="model">crm.phonecall</field>
<field name="arch" type="xml">
<calendar string="Phone Calls" date_start="date" color="user_id">
<calendar string="Phone Calls" date_start="date" date_stop="end_date" color="user_id">
<field name="name"/>
<field name="partner_id"/>
</calendar>
@ -94,6 +96,7 @@
<search string="Search Phone Calls">
<field name="name" string="Phonecalls"/>
<field name="date"/>
<field name="end_date"/>
<field name="user_id"/>
<field name="partner_id" operator="child_of"/>
<field name="opportunity_id"/>

4
crm_voip_logcall/README.rst

@ -0,0 +1,4 @@
CRM VoIP Phone Log-call
=======================
This bridge pulls in a configuration ption for use by logcall. This enables linking to call recordings in the logcall functionality.

1
crm_voip_logcall/__init__.py

@ -0,0 +1 @@
from . import models

35
crm_voip_logcall/__openerp__.py

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Phone Log-call module for Odoo/OpenERP
# Copyright (C) 2016 credativ Ltd (<http://credativ.co.uk>).
# Copyright (C) 2016 Trever L. Adams
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# 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 for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
{
'name': 'CRM Voip Phone Log-call',
'version': '9.0.0.1.0',
'category': 'Phone',
'license': 'AGPL-3',
'summary': 'Necessary bridge between log-call and CRM VoIP module',
'author': "Trever L. Adams",
'website': '',
'depends': ['logcall', 'crm_voip'],
'application': True,
'installable': False,
}

2
crm_voip_logcall/models/__init__.py

@ -0,0 +1,2 @@
from . import freeswitch_server

36
crm_voip_logcall/models/crm_voip_logcall.py

@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Phone Log-call module for Odoo/OpenERP
# Copyright (C) 2016 credativ Ltd (<http://credativ.co.uk>).
# Copyright (C) 2016 Trever L. Adams
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# 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 for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp import models, api
import logging
logger = logging.getLogger(__name__)
class PhoneCommon(models.AbstractModel):
_inherit = 'phone.common'
@api.model
def _get_ucp_url(self, users):
base_url = params.get_param('crm.voip.ucp_url', default='http://localhost/ucp?quietmode=1&module=cdr&command=download&msgid={odoo_uniqueid}&type=download&format=wav&ext={caller_user}')
return base_url

6
freeswitch_logcall/README.rst

@ -0,0 +1,6 @@
FreeSWITCH Phone Log-call
=========================
This bridge adds an option to the FreeSWITCH servers for the URL to pull
down call recordings. It also adds an option for time jitter compensation
for use when automatically merging call records.

1
freeswitch_logcall/__init__.py

@ -0,0 +1 @@
from . import models

39
freeswitch_logcall/__openerp__.py

@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Phone Log-call module for Odoo/OpenERP
# Copyright (C) 2016 credativ Ltd (<http://credativ.co.uk>).
# Copyright (C) 2016 Trever L. Adams
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# 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 for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
{
'name': 'FreeSwitch Phone Log-call',
'version': '9.0.0.1.0',
'category': 'Phone',
'license': 'AGPL-3',
'summary': 'Necessary bridge between log-call and FreeSWITCH Click2dial',
'author': "Trever L. Adams",
'website': '',
'depends': ['logcall', 'freeswitch_click2dial'],
'data': [
'security/ir.model.access.csv',
'views/freeswitch_server_view.xml',
],
'application': True,
'installable': True,
}

2
freeswitch_logcall/models/__init__.py

@ -0,0 +1,2 @@
from . import freeswitch_server

64
freeswitch_logcall/models/freeswitch_server.py

@ -0,0 +1,64 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Phone Log-call module for Odoo/OpenERP
# Copyright (C) 2016 credativ Ltd (<http://credativ.co.uk>).
# Copyright (C) 2016 Trever L. Adams
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# 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 for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp import models, fields, api
import logging
logger = logging.getLogger(__name__)
class FreeSWITCHServer(models.Model):
_inherit = "freeswitch.server"
ucp_url = fields.Char(
string='Script to download FreeSWITCH recordings', required=False,
default="https://localhost/cgi-bin/get_recording.pl?file={odoo_filename}",
help="Macros allowed: {odoo_type} (inbound, outbound), {odoo_src}"
"(source phone number}, {odoo_dst} (destination number), "
"{odoo_duration} (length of call), {odoo_start} (start time of call "
"in seconds since epoch), {odoo_filename} (file name on server), "
"{odoo_uniqueid} (FreeSWITCH UUID of call).")
server_jitter_correction = fields.Integer(
string='Time jitter compensation', required=True,
help='Number of seconds to subtract from new call start and add to '
'new call end, for call merging, to compensate for system/database '
'load and time drift between FreeSWITCH server and Odoo/Odoo database '
'server(s). 5 seconds is likely a good start. Above 10 seconds you get '
'into the realm where you may have distinct calls confused. 20 - 30 '
'seconds begins to guarantee this. It is best to keep this low '
'and use a method to keep time synced.',
default=5)
class PhoneCommon(models.AbstractModel):
_inherit = 'phone.common'
@api.model
def _get_ucp_url(self, user):
fs_server = user.freeswitch_server_id
return fs_server.ucp_url
@api.model
def _get_jitter(self, user):
fs_server = user.freeswitch_server_id
return fs_server.server_jitter_correction

2
freeswitch_logcall/security/ir.model.access.csv

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
ir_model_access_freeswitch_server_phone_integration,Read access on freeswitch.server,freeswitch_click2dial.model_freeswitch_server,logcall.group_phone_system_integration,1,0,0,0

26
freeswitch_logcall/views/freeswitch_server_view.xml

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
FreeSWITCH log call module
Copyright (C) 2016 Trever L. Adams
The licence is in the file __openerp__.py
-->
<openerp>
<data>
<record id="freeswitch_logcall_extra_options" model="ir.ui.view">
<field name="name">FreeSWITCH Servers</field>
<field name="model">freeswitch.server</field>
<field name="inherit_id" ref="freeswitch_click2dial.view_freeswitch_server_form"/>
<field name="arch" type="xml">
<xpath expr="//group[@name='dialplan']" position="after">
<group name="extra" string="Extra Options">
<field name="ucp_url"/>
<field name="server_jitter_correction"/>
</group>
</xpath>
</field>
</record>
</data>
</openerp>

44
hr_recruitment_phone_log/README.rst

@ -0,0 +1,44 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
==========================
Show phonecalls on partner
==========================
This module restores the phonecall list on the partner view.
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/140/9.0
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/connector-telephony/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed feedback
`here <https://github.com/OCA/connector-telephony/issues/new?body=module:%20partner_phone_log%0Aversion:%209.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Credits
=======
Contributors
------------
* Ondřej Kuzník <ondrej.kuznik@credativ.co.uk>
Maintainer
----------
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
This module is maintained by the OCA.
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
To contribute to this module, please visit https://odoo-community.org.

3
hr_recruitment_phone_log/__init__.py

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import models

23
hr_recruitment_phone_log/__openerp__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
# (c) 2016 credativ ltd. - Ondřej Kuzník
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
{
'name': 'Show phonecalls on HR Applicant',
'summary': 'Adds a phonecall log to HR Applicant',
'version': '9.0.1.0.0',
'category': 'Human Resources',
'author': 'credativ ltd., '
'Odoo Community Association (OCA)',
'license': 'AGPL-3',
'depends': [
'logcall',
'hr_recruitment_phone',
],
'data': [
'security/ir.model.access.csv',
'views/recruitment_view.xml',
],
'application': True,
'installable': True,
}

3
hr_recruitment_phone_log/models/__init__.py

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import recruitment

32
hr_recruitment_phone_log/models/recruitment.py

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
# (c) 2016 credativ ltd. - Ondřej Kuzník
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
from openerp import models, fields, api
class CrmPhonecall(models.Model):
_inherit = "crm.phonecall"
hr_applicant_id = fields.Many2one(
'hr.applicant', string='Applicant', ondelete='cascade')
class HrApplicant(models.Model):
_inherit = 'hr.applicant'
phonecall_ids = fields.One2many('crm.phonecall', 'hr_applicant_id', string='Phone Calls')
phonecall_count = fields.Integer(
compute='_count_phonecalls', string='Number of Phonecalls',
readonly=True)
@api.multi
@api.depends('phonecall_ids')
def _count_phonecalls(self):
cpo = self.env['crm.phonecall']
for applicant in self:
try:
applicant.phonecall_count = cpo.search_count(
[('hr_applicant_id', '=', applicant.id)])
except:
applicant.phonecall_count = 0

2
hr_recruitment_phone_log/security/ir.model.access.csv

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
phone_system_integration_hr_applicant_write,Write access on hr.applicant for phone system integration and call logging,hr_recruitment.model_hr_applicant,logcall.group_phone_system_integration,1,1,0,0

56
hr_recruitment_phone_log/views/recruitment_view.xml

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="crm_phonecall_search" model="ir.ui.view">
<field name="name">crm.phonecall.search</field>
<field name="model">crm.phonecall</field>
<field name="inherit_id" ref="crm_phone.crm_phonecall_search"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='opportunity_id']" position="after">
<field name="hr_applicant_id"/>
</xpath>
</field>
</record>
<record id="hr_applicant_phonecall" model="ir.ui.view">
<field name="name">hr_recruitment_phone.hr_applicant.form</field>
<field name="model">hr.applicant</field>
<field name="inherit_id" ref="hr_recruitment_phone.crm_case_form_view_job"/>
<field name="arch" type="xml">
<field name="message_ids" widget="mail_thread" position="replace"/>
<xpath expr="//button[@name='action_makeMeeting']" position="before">
<button class="oe_inline oe_stat_button" type="action"
name="%(crm_phone.crm_phonecall_action)d"
icon="fa-phone"
context="{'search_default_hr_applicant_id': active_id}">
<field string="Calls" name="phonecall_count" widget="statinfo"/>
</button>
</xpath>
<xpath expr="//field[@name='description']" position="after">
<notebook>
<page string="Internal Notes">
<field name="message_ids" widget="mail_thread"/>
</page>
<page string="Communication">
<field name="phonecall_ids" mode="tree" readonly="1">
<tree string="Phonecalls" create="false" delete="false"
colors="gray:state in ('done', 'cancelled')">
<field name="date"/>
<field name="end_date"/>
<field name="name"/>
<field name="partner_phone"/>
<field name="user_id" context="{'default_groups_ref': ['base.group_user', 'base.group_partner_manager', 'base.group_sale_salesman_all_leads']}"/>
<field name="direction"/>
<field name="state"/>
</tree>
</field>
</page>
</notebook>
</xpath>
</field>
</record>
</data>
</openerp>

18
logcall/README.rst

@ -0,0 +1,18 @@
Phone Log-call
=================
When a call has completed within Asterisk, FreeSWITCH or similar
a callback can be added in a hangup handler to call a script
which sends a request to Odoo to log the call.
This module requires a module providing _get_ucp_url and _get_jitter
functions in PhoneCommon. These provide a URL template for downloading
recordings (false is fine) and the number of seconds to use to make
sure there are no problems in merging call logs, respectively.
Merging of call logs is automatic if, and only if, the call existing in
the database as a state time between the start of the new call minus jitter
and end of the new call plus jitter. It keep the data making the call the
longest. It will keep the original attachment, ignoring a new one. It will
append the new call description to the old making sure that the old ends with
a new line.

1
logcall/__init__.py

@ -0,0 +1 @@
from . import models

41
logcall/__openerp__.py

@ -0,0 +1,41 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Phone Log-call module for Odoo/OpenERP
# Copyright (C) 2016 credativ Ltd (<http://credativ.co.uk>).
# Copyright (C) 2016 Trever L. Adams
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# 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 for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
{
'name': 'Phone Log-call',
'version': '9.0.0.1.0',
'category': 'Phone',
'license': 'AGPL-3',
'summary': 'Allow a call to be logged in Odoo',
'author': "credativ Ltd,Odoo Community Association (OCA)",
'website': 'http://www.credativ.co.uk/',
'depends': ['base_phone', 'crm_phone'],
'data': [
'security/phone_integration_security.xml',
'security/ir.model.access.csv',
'views/crm_phonecall_view.xml',
'views/res_users_view.xml'
],
'application': True,
'installable': True,
}

2
logcall/models/__init__.py

@ -0,0 +1,2 @@
from . import crm_phonecall

185
logcall/models/crm_phonecall.py

@ -0,0 +1,185 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Phone Log-call module for Odoo/OpenERP
# Copyright (C) 2016 credativ Ltd (<http://credativ.co.uk>).
# Copyright (C) 2016 Trever L. Adams
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# 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 for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp import models, fields, api, _
from datetime import datetime, timedelta
from pytz import timezone, utc
import logging
logger = logging.getLogger(__name__)
class ResUsers(models.Model):
_inherit = 'res.users'
context_auto_log_calls = fields.Boolean(
string='Automatically Log Incoming Calls', default=True)
class CrmPhonecall(models.Model):
_inherit = "crm.phonecall"
recording_id = fields.Many2one('ir.attachment', string='Call Recording',
readonly=True)
class PhoneCommon(models.AbstractModel):
_inherit = 'phone.common'
@api.model
def _get_ucp_url(self):
pass
@api.model
def log_call_and_recording(self, odoo_type, odoo_src, odoo_dst,
odoo_duration, odoo_start, odoo_filename,
odoo_uniqueid, odoo_description):
phonecall_obj = self.env['crm.phonecall']
attach_obj = self.env['ir.attachment']
attach_id = False
search_field = False
caller_user, caller_external = (odoo_type == 'incoming' and
(odoo_dst, odoo_src) or
(odoo_src, odoo_dst))
call_name_prefix = (odoo_type == 'incoming' and "Call from %s" or
"Call to %s")
users = self.env['res.users'].search(
[('internal_number', '=', caller_user)])
if not users or not users[0].context_auto_log_calls:
return False
tz = users[0].partner_id.tz
tz = timezone(tz) if tz else utc
odoo_start = datetime(1970, 1, 1, tzinfo=tz) + \
timedelta(seconds=float(odoo_start))
odoo_end = odoo_start + timedelta(seconds=float(odoo_duration))
phonecall_data = {
'partner_phone': caller_external,
'name': call_name_prefix % (caller_external,),
'opportunity_id': False,
'partner_id': False,
'hr_applicant_id': False,
'end_date': odoo_end,
'state': 'done',
'date': odoo_start,
'direction': 'inbound' if odoo_type == 'incoming' else 'outbound',
'description': odoo_description
}
r = self.get_record_from_phone_number(caller_external)
if not r:
logger.warning("No partner found for number %s" % caller_external)
return phonecall_obj
elif r[0] == 'res.partner':
phonecall_data['partner_id'] = r[1]
search_field = 'partner_id'
if r[2]:
phonecall_data['name'] = call_name_prefix % (r[2],)
elif r[0] == 'crm.lead':
phonecall_data['opportunity_id'] = r[1]
search_field = 'opportunity_id'
if r[2]:
phonecall_data['name'] = call_name_prefix % (r[2],)
elif r[0] == 'hr.applicant':
phonecall_data['hr_applicant_id'] = r[1]
search_field = 'hr_applicant_id'
if r[2]:
phonecall_data['name'] = call_name_prefix % (r[2],)
record = self.env[r[0]].browse(r[1])
if users:
phonecall_data['user_id'] = users[0].id
jitter = self._get_jitter(users[0])
jitter_start = datetime.strftime(odoo_start -
timedelta(seconds=float(jitter)),
'%Y-%m-%d %H:%M:%S')
jitter_end = datetime.strftime(odoo_end +
timedelta(seconds=float(jitter)),
'%Y-%m-%d %H:%M:%S')
phonecalls = phonecall_obj.search([
('date', '>=', jitter_start),
('end_date', '<=', jitter_end),
(search_field, '=', r[1]),
('user_id', '=', users[0].id),
('direction', '=', phonecall_data['direction'])])
if phonecalls:
if (odoo_end.replace(tzinfo=None) <
datetime.strptime(phonecalls[0]['end_date'],
'%Y-%m-%d %H:%M:%S')):
odoo_end = \
phonecalls[0]['end_date'].strptime('%Y-%m-%d %H:%M:%S')
if (odoo_start.replace(tzinfo=None) >
datetime.strptime(phonecalls[0]['date'],
'%Y-%m-%d %H:%M:%S')):
odoo_start = \
phonecalls[0]['date'].strptime('%Y-%m-%d %H:%M:%S')
if phonecalls[0]['description']:
odoo_description = phonecalls[0]['description'] + '\n' + \
odoo_description
if phonecalls[0]['recording_id']:
attach_id = phonecalls[0]['recording_id']
phonecall_id = phonecalls[0]
phonecalls[0].write({'end_date': odoo_end, 'date': odoo_start,
'description': odoo_description,
'recording_id':
(attach_id.id if attach_id else False)})
else:
phonecall_id = phonecall_obj.create(phonecall_data)
if odoo_filename and not attach_id:
base_url = self._get_ucp_url(users[0])
ir_attachment_data = {
'res_model': 'crm.phonecall',
'res_id': phonecall_id.id,
'name': phonecall_data['name'],
'type': 'url',
'mimetype': 'audio/wav',
'url': base_url.format(caller_user=caller_user,
odoo_type=odoo_type,
odoo_src=odoo_src,
odoo_dst=odoo_dst,
odoo_duration=odoo_duration,
odoo_start=odoo_start,
odoo_uniqueid=odoo_uniqueid.replace('.', '_'),
odoo_filename=odoo_filename),
'datas_fname': odoo_filename,
}
attach_id = attach_obj.create(ir_attachment_data)
phonecall_id.write({'recording_id': attach_id.id})
message_format = _("Recorded %s call (%%sm)." % odoo_type)
record.message_post(
body=message_format % (int(odoo_duration) / 60,),
message_type='comment',
attachment_ids=attach_id._ids)
return phonecall_id.id

202
logcall/scripts/asterisk_logcall.py

@ -0,0 +1,202 @@
#! /usr/bin/python
# -*- encoding: utf-8 -*-
# Copyright (C) 2010-2015 Alexis de Lattre <alexis.delattre@akretion.com>
# Copyright (C) 2016 credativ Ltd (<http://credativ.co.uk>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# 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 for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Log a call and recording within Asterisk
This is intended to be called by a hangup handler:
Please, note the start is seconds since EPOCH in UTC, it must be UTC.
Example:
[from-pstn-custom]
...
exten => _X!,n,Set(CHANNEL(hangup_handler_push)=from-pstn-hdlr,s,1(args))
[from-pstn-hdlr]
exten => s,1,Verbose(0, from-pstn-hdlr called)
same => n,Set(odoo_type=incoming)
same => n,Set(odoo_src=${CDR(src)})
same => n,Set(odoo_dst=${CDR(dst)})
same => n,Set(odoo_duration=${CDR(duration)})
same => n,Set(odoo_start=${CDR(start)})
same => n,Set(odoo_filename=${CDR(recordingfile)})
same => n,Set(odoo_uniqueid=${UNIQUEID})
same => n,AGI(/usr/local/bin/asterisk_logcall.sh,${odoo_type},${odoo_src},${odoo_dst},${odoo_duration},${odoo_start},${odoo_filename},${odoo_uniqueid})
same => n,Return()
To test from the CLI:
./asterisk_logcall.sh << EOF
agi_arg_1: outgoing
agi_arg_2: 875
agi_arg_3: 01234567890
agi_arg_4: 345
agi_arg_5: 1234567890
agi_arg_6: out-875-unknown-20160216-154438-1455637478.61.wav
agi_arg_7: 1455637478.61
agi_arg_8: Description may include things like hangup cause, transfer, automated notes
EOF
"""
__author__ = "Craig Gowing <craig.gowing@credativ.co.uk> & Alexis de Lattre <alexis.delattre@akretion.com>"
__date__ = "February 2016"
__version__ = "0.2"
import xmlrpclib
import sys
from optparse import OptionParser
# Define command line options
options = [
{'names': ('-s', '--server'), 'dest': 'server', 'type': 'string',
'action': 'store', 'default': False,
'help': 'DNS or IP address of the OpenERP server. Default = none '
'(will not try to connect to OpenERP)'},
{'names': ('-p', '--port'), 'dest': 'port', 'type': 'int',
'action': 'store', 'default': 8069,
'help': "Port of OpenERP's XML-RPC interface. Default = 8069"},
{'names': ('-e', '--ssl'), 'dest': 'ssl',
'help': "Use SSL connections instead of clear connections. "
"Default = no, use clear XML-RPC or JSON-RPC",
'action': 'store_true', 'default': False},
{'names': ('-j', '--jsonrpc'), 'dest': 'jsonrpc',
'help': "Use JSON-RPC instead of the default protocol XML-RPC. "
"Default = no, use XML-RPC",
'action': 'store_true', 'default': False},
{'names': ('-d', '--database'), 'dest': 'database', 'type': 'string',
'action': 'store', 'default': 'openerp',
'help': "OpenERP database name. Default = 'openerp'"},
{'names': ('-u', '--user-id'), 'dest': 'userid', 'type': 'int',
'action': 'store', 'default': 2,
'help': "OpenERP user ID to use when connecting to OpenERP in "
"XML-RPC. Default = 2"},
{'names': ('-t', '--username'), 'dest': 'username', 'type': 'string',
'action': 'store', 'default': 'demo',
'help': "OpenERP username to use when connecting to OpenERP in "
"JSON-RPC. Default = demo"},
{'names': ('-w', '--password'), 'dest': 'password', 'type': 'string',
'action': 'store', 'default': 'demo',
'help': "Password of the OpenERP user. Default = 'demo'"},
]
def stdout_write(string):
'''Wrapper on sys.stdout.write'''
sys.stdout.write(string.encode(sys.stdout.encoding or 'utf-8', 'replace'))
sys.stdout.flush()
# When we output a command, we get an answer "200 result=1" on stdin
# Purge stdin to avoid these Asterisk error messages :
# utils.c ast_carefulwrite: write() returned error: Broken pipe
sys.stdin.readline()
return True
def stderr_write(string):
'''Wrapper on sys.stderr.write'''
sys.stderr.write(string.encode(sys.stdout.encoding or 'utf-8', 'replace'))
sys.stdout.flush()
return True
def main(options, arguments):
# AGI passes parameters to the script on standard input
stdinput = {}
while 1:
input_line = sys.stdin.readline()
if not input_line:
break
line = input_line.strip()
try:
variable, value = line.split(':', 1)
except:
break
if variable[:4] != 'agi_': # All AGI parameters start with 'agi_'
stderr_write("bad stdin variable : %s\n" % variable)
continue
variable = variable.strip()
value = value.strip()
if variable and value:
stdinput[variable] = value
stderr_write("full AGI environnement :\n")
for variable in stdinput.keys():
stderr_write("%s = %s\n" % (variable, stdinput.get(variable)))
odoo_type = stdinput.get('agi_arg_1', '')
odoo_src = stdinput.get('agi_arg_2', '')
odoo_dst = stdinput.get('agi_arg_3', '')
odoo_duration = stdinput.get('agi_arg_4', '')
odoo_start = stdinput.get('agi_arg_5', '')
odoo_filename = stdinput.get('agi_arg_6', '')
odoo_uniqueid = stdinput.get('agi_arg_7', '')
odoo_description = stdinput.get('agi_arg_8', '')
method = 'log_call_and_recording'
res = False
# Yes, this script can be used without "-s openerp_server" !
if options.server and options.jsonrpc:
import odoorpc
proto = options.ssl and 'jsonrpc+ssl' or 'jsonrpc'
stdout_write(
'VERBOSE "Starting %s request on OpenERP %s:%d database '
'%s username %s"\n' % (
proto.upper(), options.server, options.port, options.database,
options.username))
try:
odoo = odoorpc.ODOO(options.server, proto, options.port)
odoo.login(options.database, options.username, options.password)
res = odoo.execute(
'phone.common', 'log_call_and_recording', odoo_type, odoo_src, odoo_dst, odoo_duration, odoo_start, odoo_filename, odoo_uniqueid, odoo_description)
stdout_write('VERBOSE "Called method %s, returned %s"\n' % (method, res))
except:
stdout_write(
'VERBOSE "Could not connect to OpenERP in JSON-RPC"\n')
elif options.server:
proto = options.ssl and 'https' or 'http'
stdout_write(
'VERBOSE "Starting %s XML-RPC request on OpenERP %s:%d '
'database %s user ID %d"\n' % (
proto, options.server, options.port, options.database,
options.userid))
sock = xmlrpclib.ServerProxy(
'%s://%s:%d/xmlrpc/object'
% (proto, options.server, options.port))
try:
res = sock.execute(
options.database, options.userid, options.password,
'phone.common', 'log_call_and_recording', odoo_type, odoo_src, odoo_dst, odoo_duration, odoo_start, odoo_filename, odoo_uniqueid, odoo_description)
stdout_write('VERBOSE "Called method %s, returned %s"\n' % (method, res))
except:
stdout_write('VERBOSE "Could not connect to OpenERP in XML-RPC"\n')
return True
if __name__ == '__main__':
usage = "Usage: asterisk_logcall.py [options] login1 login2 login3 ..."
epilog = "Script written by Craig Gowing based on work by Alexis de Lattre. "
"Published under the GNU AGPL licence."
description = "This is an AGI script that sends a query to OpenERP. "
parser = OptionParser(usage=usage, epilog=epilog, description=description)
for option in options:
param = option['names']
del option['names']
parser.add_option(*param, **option)
options, arguments = parser.parse_args()
sys.argv[:] = arguments
main(options, arguments)

5
logcall/scripts/asterisk_logcall.sh

@ -0,0 +1,5 @@
#! /bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/var/lib/asterisk/agi-bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/share/asterisk/agi-bin:.
timeout 10s asterisk_logcall.py --server localhost --database 9.0-test --user-id 1 --password "admin"

117
logcall/scripts/freeswitch_logcall.lua

@ -0,0 +1,117 @@
-- Copyright (C) 2016 Trever L. Adams
-- based on code and ideas by Craig Gowing <craig.gowing@credativ.co.uk>
-- & Alexis de Lattre <alexis.delattre@akretion.com>
-- License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-- This module assumes calls start at creation not answer.
-- It works on incoming and outgoing calls.
-- See code for the line to uncomment to change this.
-- Add the following to the appropriate places in your dialplan
-- Outbound (default dialplan, extension to extension, and anything out via gateway or via FXO:
-- <action application="set" data="api_hangup_hook=lua freeswitch_logcall.lua"/>
-- Inbound (public dialplan):
-- <action application="export" data="odoo_type="inbound"/>
-- <action application="export" data="nolocal:api_hangup_hook=lua freeswitch_logcall.lua"/>
require("xmlrpc.http")
function GetFileName(url)
if url == nil then
return ""
end
return url:match("^.+/(.+)$")
end
function getTransferTarget(app_data)
if app_data == nil then
return ""
end
app_data = app_data:gsub("-.?leg%s*", "")
app_data = app_data:sub(1, string.find(app_data, " "), -2)
return app_data
end
-- Change these to meet your installation
local port=8069;
local server="localhost";
options_database = "odoo-test"
options_userid = 1
options_password = "testtesttest"
-- Best not change anything below
local protocol="https"
server_string = protocol .. "://" .. server .. ":" .. port .. "/xmlrpc/2/object"
function odoo_report_call(odoo_type, odoo_src, odoo_dst, odoo_duration, odoo_start, odoo_filename, odoo_uniqueid, odoo_description)
local ok, res = xmlrpc.http.call(server_string, 'execute', options_database, options_userid, options_password,
'phone.common', 'log_call_and_recording', odoo_type, odoo_src, odoo_dst, odoo_duration, odoo_start,
odoo_filename, odoo_uniqueid, odoo_description)
assert(ok, string.format("XML-RPC call failed on client: %s", tostring(res)))
end
odoo_hangupcause = env:getHeader("variable_hangup_cause")
if odoo_hangupcause == "LOSE_RACE" then
return
end
odoo_type = env:getHeader("odoo_type")
if odoo_type == 'inbound' then
odoo_type = 'incoming'
else
odoo_type = 'outgoing'
end
if env:getHeader("Caller-RDNIS") then
redirected = true
end
name = env:getHeader("origination_caller_id_name")
if name == "Odoo Connector" then
odoo_type = 'outgoing'
end
odoo_connector = env:getHeader("odoo_connector")
if odoo_connector then
odoo_src = env:getHeader("dialed_user")
else
odoo_src = env:getHeader("Caller-Caller-ID-Number")
end
odoo_dst = env:getHeader("Caller-Destination-Number")
odoo_dst2 = env:getHeader("Other-Leg-Destination-Number")
if odoo_dst2 then
if string.len(odoo_dst) < string.len(odoo_dst2) then
odoo_dst = odoo_dst2
end
end
if redirected and odoo_type == "outgoing" and odoo_connector == nil then
odoo_src, odoo_dst = odoo_dst, odoo_src
end
odoo_filename = env:getHeader("variable_rec_file")
odoo_uniqueid = env:getHeader("variable_uuid")
if odoo_filename == nil then
odoo_filename = ""
else
odoo_filename = GetFileName(odoo_filename)
end
if odoo_hangupcause == nil then
odoo_hangupcause = ""
end
app_name = env:getHeader("variable_last_app")
app_data = getTransferTarget(env:getHeader("variable_last_arg"))
if app_name == "transfer" then
odoo_hangupcause = "[" .. odoo_hangupcause .. " / TRANSFERRED TO: " .. app_data .. "]"
else
odoo_hangupcause = "[" .. odoo_hangupcause .. "]"
end
if redirected == true then
odoo_start = tonumber(env:getHeader("bridge_epoch"))
else
odoo_start = tonumber(env:getHeader("start_epoch"))
-- odoo_start = tonumber(env:getHeader("answer_epoch"))
end
local end_epoch = tonumber(env:getHeader("end_epoch"))
if odoo_start ~= nil and end_epoch ~= nil then
odoo_duration = tonumber(end_epoch) - tonumber(odoo_start)
end
odoo_report_call(odoo_type, odoo_src, odoo_dst, tostring(odoo_duration), tostring(odoo_start), odoo_filename, odoo_uniqueid, odoo_hangupcause)

8
logcall/security/ir.model.access.csv

@ -0,0 +1,8 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
phone_system_integration_phone_common_read,Read access on phone.common for phone system integration and call logging,model_phone_common,group_phone_system_integration,1,0,0,0
phone_system_integration_crm_phonecall_create,Create access on crm.phonecall for phone system integration and call logging,model_crm_phonecall,group_phone_system_integration,1,1,1,0
phone_system_integration_ir_attachment_create,Create access on ir.attachment for phone system integration and call logging,base.model_ir_attachment,group_phone_system_integration,1,1,1,0
phone_system_integration_mail.message_create,Create access on mail.message for phone system integration and call logging,mail.model_mail_message,group_phone_system_integration,1,1,1,0
phone_system_integration_mail.message_create,Create access on mail.followers for phone system integration and call logging,mail.model_mail_followers,group_phone_system_integration,1,1,1,0
phone_system_integration_res_partner_write,Write access on res.partner for phone system integration and call logging,base.model_res_partner,group_phone_system_integration,1,1,0,0
phone_system_integration_crm_lead_write,Write access on crm.lead for phone system integration and call logging,sale_crm.model_crm_lead,group_phone_system_integration,1,1,0,0

17
logcall/security/phone_integration_security.xml

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
logcall module for Odoo/OpenERP
Copyright (C) 2016 Trever L. Adams
The licence is in the file __openerp__.py
-->
<openerp>
<data noupdate="1">
<!-- New group dedicated to the "Phone System Integration and Logging with Odoo" feature -->
<record id="group_phone_system_integration" model="res.groups">
<field name="name">Phone System Integration and Logging</field>
</record>
</data>
</openerp>

18
logcall/views/crm_phonecall_view.xml

@ -0,0 +1,18 @@
<?xml version="1.0"?>
<openerp>
<data>
<record id="crm_phonecall_tree_view_recording_link" model="ir.ui.view">
<field name="name">CRM - Phonecalls Tree</field>
<field name="model">crm.phonecall</field>
<field name="inherit_id" ref="crm_phone.crm_phonecall_tree"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='opportunity_id']" position="after">
<field name="recording_id"/>
</xpath>
</field>
</record>
</data>
</openerp>

33
logcall/views/res_users_view.xml

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
© 2014-2016 Akretion (Alexis de Lattre <alexis.delattre@akretion.com>)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<data>
<record id="view_users_form" model="ir.ui.view">
<field name="name">logcall.res.users.form</field>
<field name="model">res.users</field>
<field name="inherit_id" ref="base_phone.view_users_form"/>
<field name="arch" type="xml">
<group name="phone-preferences" position="inside">
<field name="context_auto_log_calls"/>
</group>
</field>
</record>
<record id="view_users_form_simple_modif" model="ir.ui.view">
<field name="name">logcall.users.preferences.view</field>
<field name="model">res.users</field>
<field name="inherit_id" ref="base_phone.view_users_form_simple_modif" />
<field name="arch" type="xml">
<group name="phone" position="inside">
<field name="context_auto_log_calls" readonly="0"/>
</group>
</field>
</record>
</data>
</odoo>

44
partner_phone_log/README.rst

@ -0,0 +1,44 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
==========================
Show phonecalls on partner
==========================
This module restores the phonecall list on the partner view.
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/140/9.0
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/connector-telephony/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed feedback
`here <https://github.com/OCA/connector-telephony/issues/new?body=module:%20partner_phone_log%0Aversion:%209.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Credits
=======
Contributors
------------
* Ondřej Kuzník <ondrej.kuznik@credativ.co.uk>
Maintainer
----------
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
This module is maintained by the OCA.
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
To contribute to this module, please visit https://odoo-community.org.

3
partner_phone_log/__init__.py

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import models

21
partner_phone_log/__openerp__.py

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# (c) 2016 credativ ltd. - Ondřej Kuzník
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
{
'name': 'Show phonecalls on partner',
'summary': 'Adds a phonecall log to partner',
'version': '9.0.1.0.0',
'category': 'Customer Relationship Management',
'author': 'credativ ltd., '
'Odoo Community Association (OCA)',
'license': 'AGPL-3',
'depends': [
'crm_phone',
],
'data': [
'views/partner_view.xml',
],
'application': True,
'installable': True,
}

3
partner_phone_log/models/__init__.py

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import partner

11
partner_phone_log/models/partner.py

@ -0,0 +1,11 @@
# -*- coding: utf-8 -*-
# (c) 2016 credativ ltd. - Ondřej Kuzník
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
from openerp import models, fields
class ResPartner(models.Model):
_inherit = 'res.partner'
phonecall_ids = fields.One2many('crm.phonecall', 'partner_id')

30
partner_phone_log/views/partner_view.xml

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="res_partner_phonecall" model="ir.ui.view">
<field name="name">res.partner.type.form.inherit</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<xpath expr="//notebook" position="inside">
<page string="Communication">
<field name="phonecall_ids" mode="tree" readonly="1">
<tree string="Phonecalls" create="false" delete="false"
colors="gray:state in ('done', 'cancelled')">
<field name="date"/>
<field name="end_date"/>
<field name="name"/>
<field name="partner_phone"/>
<field name="user_id" context="{'default_groups_ref': ['base.group_user', 'base.group_partner_manager', 'base.group_sale_salesman_all_leads']}"/>
<field name="state"/>
<field name="opportunity_id"/>
</tree>
</field>
</page>
</xpath>
</field>
</record>
</data>
</openerp>

44
partner_phone_log_logcall/README.rst

@ -0,0 +1,44 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
==============================================
Glue to show recording on partner's phonecalls
==============================================
This module adds the recording link to partner's phonecalls
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/140/9.0
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/connector-telephony/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed feedback
`here <https://github.com/OCA/connector-telephony/issues/new?body=module:%20partner_phone_log_logcall%0Aversion:%209.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Credits
=======
Contributors
------------
* Ondřej Kuzník <ondrej.kuznik@credativ.co.uk>
Maintainer
----------
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
This module is maintained by the OCA.
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
To contribute to this module, please visit https://odoo-community.org.

1
partner_phone_log_logcall/__init__.py

@ -0,0 +1 @@
# -*- coding: utf-8 -*-

23
partner_phone_log_logcall/__openerp__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
# (c) 2016 credativ ltd. - Ondřej Kuzník
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
{
'name': 'Glue between asterisk_logcall and partner_phone_log',
'summary': 'Adds a recording column',
'version': '9.0.1.0.0',
'category': 'Customer Relationship Management',
'author': 'credativ ltd., '
'Odoo Community Association (OCA)',
'license': 'AGPL-3',
'depends': [
'logcall',
'partner_phone_log',
],
'data': [
'security/ir.model.access.csv',
'views/partner_view.xml',
],
'application': True,
'installable': True,
}

2
partner_phone_log_logcall/security/ir.model.access.csv

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
phone_system_integration_res_partner_write,Write access on res.partner for phone system integration and call logging,base.model_res_partner,logcall.group_phone_system_integration,1,1,0,0

17
partner_phone_log_logcall/views/partner_view.xml

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="res_partner_phonecall" model="ir.ui.view">
<field name="name">res.partner.type.form.inherit</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="partner_phone_log.res_partner_phonecall"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='phonecall_ids']/tree" position="inside">
<field name="recording_id"/>
</xpath>
</field>
</record>
</data>
</openerp>

1
setup/hr_recruitment_phone_log/odoo_addons/hr_recruitment_phone_log

@ -0,0 +1 @@
../../../hr_recruitment_phone_log/

6
setup/hr_recruitment_phone_log/setup.py

@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/logcall/odoo_addons/logcall

@ -0,0 +1 @@
../../../logcall/

6
setup/logcall/setup.py

@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/partner_phone_log/odoo_addons/partner_phone_log

@ -0,0 +1 @@
../../../partner_phone_log

6
setup/partner_phone_log/setup.py

@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/partner_phone_log_logcall/odoo_addons/partner_phone_log_logcall

@ -0,0 +1 @@
../../../partner_phone_log_logcall/

6
setup/partner_phone_log_logcall/setup.py

@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)
Loading…
Cancel
Save