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.

129 lines
4.5 KiB

  1. -- Copyright (C) 2016 Trever L. Adams
  2. -- based on code and ideas by Craig Gowing <craig.gowing@credativ.co.uk>
  3. -- & Alexis de Lattre <alexis.delattre@akretion.com>
  4. -- License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  5. -- This module assumes calls start at creation not answer.
  6. -- It works on incoming and outgoing calls.
  7. -- See code for the line to uncomment to change this.
  8. -- Add the following to the appropriate places in your dialplan
  9. -- Outbound (default dialplan, extension to extension, and anything out via gateway or via FXO:
  10. -- <action application="set" data="api_hangup_hook=lua freeswitch_logcall.lua"/>
  11. -- Inbound (public dialplan):
  12. -- <action application="export" data="odoo_type=inbound"/>
  13. -- <action application="export" data="nolocal:api_hangup_hook=lua freeswitch_logcall.lua"/>
  14. require("xmlrpc.http")
  15. function string.starts(String,Start)
  16. return string.sub(String,1,string.len(Start))==Start
  17. end
  18. function GetFileName(url)
  19. if url == nil then
  20. return ""
  21. end
  22. return url:match("^.+/(.+)$")
  23. end
  24. function getTransferTarget(app_data)
  25. if app_data == nil then
  26. return ""
  27. end
  28. app_data = app_data:gsub("-.?leg%s*", "")
  29. app_data = app_data:sub(1, string.find(app_data, " "), -2)
  30. return app_data
  31. end
  32. -- Change these to meet your installation
  33. local port=8069;
  34. local server="localhost";
  35. options_database = "odoo-test"
  36. options_userid = 1
  37. options_password = "testtesttest"
  38. -- Best not change anything below
  39. local protocol="https"
  40. server_string = protocol .. "://" .. server .. ":" .. port .. "/xmlrpc/2/object"
  41. function odoo_report_call(odoo_type, odoo_src, odoo_dst, odoo_duration, odoo_start, odoo_filename, odoo_uniqueid, odoo_description)
  42. local ok, res = xmlrpc.http.call(server_string, 'execute', options_database, options_userid, options_password,
  43. 'phone.common', 'log_call_and_recording', odoo_type, odoo_src, odoo_dst, odoo_duration, odoo_start,
  44. odoo_filename, odoo_uniqueid, odoo_description)
  45. assert(ok, string.format("XML-RPC call failed on client: %s", tostring(res)))
  46. end
  47. odoo_hangupcause = env:getHeader("variable_hangup_cause")
  48. if odoo_hangupcause == "LOSE_RACE" or odoo_hangupcause == "ORIGINATOR_CANCEL" then
  49. return
  50. end
  51. odoo_type = env:getHeader("odoo_type")
  52. if odoo_type == 'inbound' then
  53. odoo_type = 'incoming'
  54. else
  55. odoo_type = 'outgoing'
  56. end
  57. if env:getHeader("Caller-RDNIS") then
  58. redirected = true
  59. end
  60. name = env:getHeader("origination_caller_id_name")
  61. if name == "Odoo Connector" then
  62. odoo_type = 'outgoing'
  63. end
  64. odoo_connector = env:getHeader("odoo_connector")
  65. if odoo_connector then
  66. odoo_src = env:getHeader("dialed_user")
  67. else
  68. odoo_src = env:getHeader("Caller-Caller-ID-Number")
  69. end
  70. odoo_dst = env:getHeader("Caller-Destination-Number")
  71. odoo_dst2 = env:getHeader("Other-Leg-Destination-Number")
  72. if odoo_dst2 then
  73. if string.len(odoo_dst) < string.len(odoo_dst2) then
  74. odoo_dst = odoo_dst2
  75. end
  76. end
  77. if redirected and odoo_type == "outgoing" and odoo_connector == nil then
  78. odoo_src, odoo_dst = odoo_dst, odoo_src
  79. end
  80. odoo_filename = env:getHeader("variable_rec_file")
  81. odoo_uniqueid = env:getHeader("variable_uuid")
  82. if odoo_filename == nil then
  83. odoo_filename = ""
  84. else
  85. odoo_filename = GetFileName(odoo_filename)
  86. end
  87. if odoo_hangupcause == nil then
  88. odoo_hangupcause = ""
  89. end
  90. app_name = env:getHeader("variable_last_app")
  91. app_data = getTransferTarget(env:getHeader("variable_last_arg"))
  92. if app_name == "transfer" then
  93. odoo_hangupcause = "[" .. odoo_hangupcause .. " / TRANSFERRED TO: " .. app_data .. "]"
  94. else
  95. odoo_hangupcause = "[" .. odoo_hangupcause .. "]"
  96. end
  97. if redirected == true then
  98. odoo_start = tonumber(env:getHeader("bridge_epoch"))
  99. else
  100. odoo_start = tonumber(env:getHeader("start_epoch"))
  101. -- odoo_start = tonumber(env:getHeader("answer_epoch"))
  102. end
  103. local end_epoch = tonumber(env:getHeader("end_epoch"))
  104. if odoo_start ~= nil and end_epoch ~= nil then
  105. odoo_duration = tonumber(end_epoch) - tonumber(odoo_start)
  106. end
  107. if string.starts(odoo_dst, "u:") then
  108. presence_id = env:getHeader("presence_id")
  109. odoo_dst = presence_id:sub(1, string.find(presence_id, "@") - 1)
  110. end
  111. if string.starts(odoo_src, "u:") then
  112. presence_id = env:getHeader("presence_id")
  113. odoo_src = presence_id:sub(1, string.find(presence_id, "@") - 1)
  114. end
  115. odoo_report_call(odoo_type, odoo_src, odoo_dst, tostring(odoo_duration), tostring(odoo_start), odoo_filename, odoo_uniqueid, odoo_hangupcause)