diff --git a/field_timepicker/static/wickedpicker/dist/wickedpicker.min.css b/field_timepicker/static/wickedpicker/dist/wickedpicker.min.css
new file mode 100644
index 000000000..6048cb76a
--- /dev/null
+++ b/field_timepicker/static/wickedpicker/dist/wickedpicker.min.css
@@ -0,0 +1 @@
+.wickedpicker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;box-shadow:0 0 0 1px rgba(14,41,57,.12),0 2px 5px rgba(14,41,57,.44),inset 0 -1px 2px rgba(14,41,57,.15);background:#fefefe;margin:0 auto;border-radius:.1px;width:270px;height:130px;font-size:14px;display:none}.wickedpicker__title{background-image:-webkit-linear-gradient(top,#fff 0,#f2f2f2 100%);position:relative;background:#f2f2f2;margin:0 auto;border-bottom:1px solid #e5e5e5;padding:12px 11px 10px 15px;color:#4C4C4C;font-size:inherit}.wickedpicker__close{-webkit-transform:translateY(-25%);-moz-transform:translateY(-25%);-ms-transform:translateY(-25%);-o-transform:translateY(-25%);transform:translateY(-25%);position:absolute;top:25%;right:10px;color:#34495e;cursor:pointer}.wickedpicker__close:before{content:'\00d7'}.wickedpicker__controls{padding:10px 0;line-height:normal;margin:0}.wickedpicker__controls__control,.wickedpicker__controls__control--separator{vertical-align:middle;display:inline-block;font-size:inherit;margin:0 auto;width:35px;letter-spacing:1.3px}.wickedpicker__controls__control-down,.wickedpicker__controls__control-up{color:#34495e;position:relative;display:block;margin:3px auto;font-size:18px;cursor:pointer}.wickedpicker__controls__control-up:before{content:'\e800'}.wickedpicker__controls__control-down:after{content:'\e801'}.wickedpicker__controls__control--separator{width:5px}.text-center,.wickedpicker__controls,.wickedpicker__controls__control,.wickedpicker__controls__control--separator,.wickedpicker__controls__control-down,.wickedpicker__controls__control-up,.wickedpicker__title{text-align:center}.hover-state{color:#3498db}@font-face{font-family:fontello;src:url(../fonts/fontello.eot?52602240);src:url(../fonts/fontello.eot?52602240#iefix) format("embedded-opentype"),url(../fonts/fontello.woff?52602240) format("woff"),url(../fonts/fontello.ttf?52602240) format("truetype"),url(../fonts/fontello.svg?52602240#fontello) format("svg");font-weight:400;font-style:normal}.fontello-after:after,.fontello:before,.wickedpicker__controls__control-down:after,.wickedpicker__controls__control-up:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
\ No newline at end of file
diff --git a/field_timepicker/static/wickedpicker/dist/wickedpicker.min.js b/field_timepicker/static/wickedpicker/dist/wickedpicker.min.js
new file mode 100644
index 000000000..394c14cb0
--- /dev/null
+++ b/field_timepicker/static/wickedpicker/dist/wickedpicker.min.js
@@ -0,0 +1,315 @@
+! function($, window, document) {
+ "use strict";
+
+ function Wickedpicker(e, t) {
+ this.element = $(e), this.options = $.extend({}, defaults, t), this.element.addClass("hasWickedpicker"), this.element.attr("onkeypress", "return false;"), this.element.attr("aria-showingpicker", "false"), this.createPicker(), this.timepicker = $(".wickedpicker"), this.up = $("." + this.options.upArrow.split(/\s+/)
+ .join(".")), this.down = $("." + this.options.downArrow.split(/\s+/)
+ .join(".")), this.separator = $(".wickedpicker__controls__control--separator"), this.hoursElem = $(".wickedpicker__controls__control--hours"), this.minutesElem = $(".wickedpicker__controls__control--minutes"), this.secondsElem = $(".wickedpicker__controls__control--seconds"), this.meridiemElem = $(".wickedpicker__controls__control--meridiem"), this.close = $("." + this.options.close.split(/\s+/)
+ .join("."));
+ var i = this.timeArrayFromString(this.options.now);
+ this.options.now = new Date(today.getFullYear(), today.getMonth(), today.getDate(), i[0], i[1], i[2]), this.selectedHour = this.parseHours(this.options.now.getHours()), this.selectedMin = this.parseSecMin(this.options.now.getMinutes()), this.selectedSec = this.parseSecMin(this.options.now.getSeconds()), this.selectedMeridiem = this.parseMeridiem(this.options.now.getHours()), this.setHoverState(), this.attach(e), this.setText(e)
+ }
+ "function" != typeof String.prototype.endsWith && (String.prototype.endsWith = function(e) {
+ return e.length > 0 && this.substring(this.length - e.length, this.length) === e
+ });
+ var isMobile = function() {
+ return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
+ },
+ today = new Date,
+ pluginName = "wickedpicker",
+ defaults = {
+ now: today.getHours() + ":" + today.getMinutes(),
+ twentyFour: !1,
+ upArrow: "wickedpicker__controls__control-up",
+ downArrow: "wickedpicker__controls__control-down",
+ close: "wickedpicker__close",
+ hoverState: "hover-state",
+ title: "Timepicker",
+ showSeconds: !1,
+ timeSeparator: " : ",
+ secondsInterval: 1,
+ minutesInterval: 1,
+ beforeShow: null,
+ afterShow: null,
+ show: null,
+ clearable: !1,
+ closeOnClickOutside: !0,
+ onClickOutside: function() {}
+ };
+ $.extend(Wickedpicker.prototype, {
+ showPicker: function(e) {
+ "function" == typeof this.options.beforeShow && this.options.beforeShow(e, this.timepicker);
+ var t = $(e)
+ .offset();
+ if($(e)
+ .attr({
+ "aria-showingpicker": "true",
+ tabindex: -1
+ }), this.setText(e), this.showHideMeridiemControl(), this.getText(e) !== this.getTime()) {
+ var i = this.getText(e),
+ s = /\s[ap]m$/i,
+ o = s.test(i) ? i.substr(-2, 2) : null,
+ n = i.replace(s, "")
+ .split(this.options.timeSeparator),
+ r = {};
+ r.hours = n[0], r.minutes = n[1], r.meridiem = o, this.options.showSeconds && (r.seconds = n[2]), this.setTime(r)
+ }
+ this.timepicker.css({
+ "z-index": this.element.css("z-index") + 1,
+ position: "absolute",
+ left: t.left,
+ top: t.top + $(e)[0].offsetHeight
+ })
+ .show(), "function" == typeof this.options.show && this.options.show(e, this.timepicker), this.handleTimeAdjustments(e)
+ },
+ hideTimepicker: function(e) {
+ this.timepicker.hide(), "function" == typeof this.options.afterShow && this.options.afterShow(e, this.timepicker), {
+ start: function() {
+ var e = $.Deferred();
+ return $('[aria-showingpicker="true"]')
+ .attr("aria-showingpicker", "false"), e.promise()
+ }
+ }.start()
+ .then(function(e) {
+ setTimeout(function() {
+ $('[aria-showingpicker="false"]')
+ .attr("tabindex", e)
+ }, 400)
+ }(0))
+ },
+ createPicker: function() {
+ if(0 === $(".wickedpicker")
+ .length) {
+ var e = '
' + this.options.title + '
- 00
- :
- 00
';
+ this.options.showSeconds && (e += '- :
- 00
'), e += '- AM
', $("body")
+ .append(e), this.attachKeyboardEvents()
+ }
+ },
+ showHideMeridiemControl: function() {
+ !1 === this.options.twentyFour ? $(this.meridiemElem)
+ .parent()
+ .show() : $(this.meridiemElem)
+ .parent()
+ .hide()
+ },
+ showHideSecondsControl: function() {
+ this.options.showSeconds ? $(this.secondsElem)
+ .parent()
+ .show() : $(this.secondsElem)
+ .parent()
+ .hide()
+ },
+ attach: function(e) {
+ var t = this;
+ this.options.clearable && t.makePickerInputClearable(e), $(e)
+ .attr("tabindex", 0), $(e)
+ .on("click focus", function(e) {
+ $(t.timepicker)
+ .is(":hidden") && (t.showPicker($(this)), window.lastTimePickerControl = $(this), $(t.hoursElem)
+ .focus())
+ });
+ var i = function(e) {
+ if($(t.timepicker)
+ .is(":visible")) {
+ if($(e.target)
+ .is(t.close)) t.hideTimepicker(window.lastTimePickerControl);
+ else if($(e.target)
+ .closest(t.timepicker)
+ .length || $(e.target)
+ .closest($(".hasWickedpicker"))
+ .length) e.stopPropagation();
+ else {
+ if("function" == typeof t.options.onClickOutside ? t.options.onClickOutside() : console.warn("Type of onClickOutside must be a function"), !t.options.closeOnClickOutside) return;
+ t.hideTimepicker(window.lastTimePickerControl)
+ }
+ window.lastTimePickerControl = null
+ }
+ };
+ $(document)
+ .off("click", i)
+ .on("click", i)
+ },
+ attachKeyboardEvents: function() {
+ $(document)
+ .on("keydown", $.proxy(function(e) {
+ switch(e.keyCode) {
+ case 9:
+ "hasWickedpicker" !== e.target.className && $(this.close)
+ .trigger("click");
+ break;
+ case 27:
+ $(this.close)
+ .trigger("click");
+ break;
+ case 37:
+ e.target.className !== this.hoursElem[0].className ? $(e.target)
+ .parent()
+ .prevAll("li")
+ .not(this.separator.selector)
+ .first()
+ .children()[1].focus() : $(e.target)
+ .parent()
+ .siblings(":last")
+ .children()[1].focus();
+ break;
+ case 39:
+ e.target.className !== this.meridiemElem[0].className ? $(e.target)
+ .parent()
+ .nextAll("li")
+ .not(this.separator.selector)
+ .first()
+ .children()[1].focus() : $(e.target)
+ .parent()
+ .siblings(":first")
+ .children()[1].focus();
+ break;
+ case 38:
+ $(":focus")
+ .prev()
+ .trigger("click");
+ break;
+ case 40:
+ $(":focus")
+ .next()
+ .trigger("click")
+ }
+ }, this))
+ },
+ setTime: function(e) {
+ this.setHours(e.hours), this.setMinutes(e.minutes), this.setMeridiem(e.meridiem), this.options.showSeconds && this.setSeconds(e.seconds)
+ },
+ getTime: function() {
+ return [this.formatTime(this.getHours(), this.getMinutes(), this.getMeridiem(), this.getSeconds())]
+ },
+ setHours: function(e) {
+ var t = new Date;
+ t.setHours(e);
+ var i = this.parseHours(t.getHours());
+ this.hoursElem.text(i), this.selectedHour = i
+ },
+ getHours: function() {
+ var e = new Date;
+ return e.setHours(this.hoursElem.text()), e.getHours()
+ },
+ parseHours: function(e) {
+ return !1 === this.options.twentyFour ? (e + 11) % 12 + 1 : e < 10 ? "0" + e : e
+ },
+ setMinutes: function(e) {
+ var t = new Date;
+ t.setMinutes(e);
+ var i = t.getMinutes(),
+ s = this.parseSecMin(i);
+ this.minutesElem.text(s), this.selectedMin = s
+ },
+ getMinutes: function() {
+ var e = new Date;
+ return e.setMinutes(this.minutesElem.text()), e.getMinutes()
+ },
+ parseSecMin: function(e) {
+ return (e < 10 ? "0" : "") + e
+ },
+ setMeridiem: function(e) {
+ var t = "";
+ t = void 0 === e ? "PM" === this.getMeridiem() ? "AM" : "PM" : e, this.meridiemElem.text(t), this.selectedMeridiem = t
+ },
+ getMeridiem: function() {
+ return this.meridiemElem.text()
+ },
+ setSeconds: function(e) {
+ var t = new Date;
+ t.setSeconds(e);
+ var i = t.getSeconds(),
+ s = this.parseSecMin(i);
+ this.secondsElem.text(s), this.selectedSec = s
+ },
+ getSeconds: function() {
+ var e = new Date;
+ return e.setSeconds(this.secondsElem.text()), e.getSeconds()
+ },
+ parseMeridiem: function(e) {
+ return e > 11 ? "PM" : "AM"
+ },
+ handleTimeAdjustments: function(e) {
+ var t = 0;
+ $(this.up)
+ .add(this.down)
+ .off("mousedown click touchstart")
+ .on("mousedown click", {
+ Wickedpicker: this,
+ input: e
+ }, function(e) {
+ if(1 != e.which) return !1;
+ var i = this.className.indexOf("up") > -1 ? "+" : "-",
+ s = e.data;
+ "mousedown" == e.type ? t = setInterval($.proxy(function(e) {
+ e.Wickedpicker.changeValue(i, e.input, this)
+ }, this, {
+ Wickedpicker: s.Wickedpicker,
+ input: s.input
+ }), 200) : s.Wickedpicker.changeValue(i, s.input, this)
+ })
+ .bind("mouseup touchend", function() {
+ clearInterval(t)
+ })
+ },
+ changeValue: function(operator, input, clicked) {
+ var target = "+" === operator ? clicked.nextSibling : clicked.previousSibling,
+ targetClass = $(target)
+ .attr("class");
+ targetClass.endsWith("hours") ? this.setHours(eval(this.getHours() + operator + 1)) : targetClass.endsWith("minutes") ? this.setMinutes(eval(this.getMinutes() + operator + this.options.minutesInterval)) : targetClass.endsWith("seconds") ? this.setSeconds(eval(this.getSeconds() + operator + this.options.secondsInterval)) : this.setMeridiem(), this.setText(input)
+ },
+ setText: function(e) {
+ $(e)
+ .val(this.formatTime(this.selectedHour, this.selectedMin, this.selectedMeridiem, this.selectedSec))
+ .change()
+ },
+ getText: function(e) {
+ return $(e)
+ .val()
+ },
+ formatTime: function(e, t, i, s) {
+ var o = e + this.options.timeSeparator + t;
+ return this.options.showSeconds && (o += this.options.timeSeparator + s), !1 === this.options.twentyFour && (o += " " + i), o
+ },
+ setHoverState: function() {
+ var e = this;
+ isMobile() || $(this.up)
+ .add(this.down)
+ .add(this.close)
+ .hover(function() {
+ $(this)
+ .toggleClass(e.options.hoverState)
+ })
+ },
+ makePickerInputClearable: function(e) {
+ $(e)
+ .wrap('')
+ .after("×"), $("[data-clear-picker]")
+ .on("click", function(e) {
+ $(this)
+ .siblings(".hasWickedpicker")
+ .val("")
+ })
+ },
+ timeArrayFromString: function(e) {
+ if(e.length) {
+ var t = e.split(":");
+ return t[2] = t.length < 3 ? "00" : t[2], t
+ }
+ return !1
+ },
+ _time: function() {
+ var e = $(this.element)
+ .val();
+ return "" === e ? this.formatTime(this.selectedHour, this.selectedMin, this.selectedMeridiem, this.selectedSec) : e
+ },
+ _hide: function() {
+ this.hideTimepicker(this.element)
+ }
+ }), $.fn[pluginName] = function(e, t) {
+ return $.isFunction(Wickedpicker.prototype["_" + e]) ? $(this)
+ .hasClass("hasWickedpicker") ? void 0 !== t ? $.data($(this)[t], "plugin_" + pluginName)["_" + e]() : $.data($(this)[0], "plugin_" + pluginName)["_" + e]() : void 0 : this.each(function() {
+ $.data(this, "plugin_" + pluginName) || $.data(this, "plugin_" + pluginName, new Wickedpicker(this, e))
+ })
+ }
+}(jQuery, window, document);
\ No newline at end of file
diff --git a/multi_sms_gateway/README.rst b/multi_sms_gateway/README.rst
new file mode 100644
index 000000000..8fb2353c8
--- /dev/null
+++ b/multi_sms_gateway/README.rst
@@ -0,0 +1,53 @@
+.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
+ :target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+
+Multiple SMS Gateway Integration
+================================
+* Module for sending SMS through different SMS gateways.
+
+Installation
+============
+- www.odoo.com/documentation/15.0/setup/install.html
+- Install all external dependencies like 'telesign', 'twilio', 'vonage'.
+- Install our custom addon
+
+Configuration
+=============
+- Add the users to the new security group 'Multiple SMS Gateway Integration / Manager' to give access to
+the new menus of Multiple SMS Gateway Integration module.
+- Setup the gateways that you would like to use by adding the required credentials.
+
+License
+-------
+General Public License, Version 3 (AGPL v3).
+(https://www.gnu.org/licenses/agpl-3.0-standalone.html)
+
+Company
+-------
+* `Cybrosys Techno Solutions `__
+
+Credits
+-------
+* Developer: (V15) Subina P, Contact: odoo@cybrosys.com
+
+Contacts
+--------
+* Mail Contact : odoo@cybrosys.com
+
+Bug Tracker
+-----------
+Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
+
+Maintainer
+==========
+.. image:: https://cybrosys.com/images/logo.png
+ :target: https://cybrosys.com
+
+This module is maintained by Cybrosys Technologies.
+
+For support and more information, please visit https://www.cybrosys.com
+
+Further information
+===================
+HTML Description: ``__
diff --git a/multi_sms_gateway/__init__.py b/multi_sms_gateway/__init__.py
new file mode 100644
index 000000000..1a05587c9
--- /dev/null
+++ b/multi_sms_gateway/__init__.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-TODAY Cybrosys Technologies().
+# 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 .
+#
+#############################################################################
+from . import models
+from . import wizard
diff --git a/multi_sms_gateway/__manifest__.py b/multi_sms_gateway/__manifest__.py
new file mode 100644
index 000000000..1a27d8eba
--- /dev/null
+++ b/multi_sms_gateway/__manifest__.py
@@ -0,0 +1,53 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-TODAY Cybrosys Technologies().
+# 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 .
+#
+#############################################################################
+{
+ 'name': 'Multiple SMS Gateway Integration',
+ 'version': '15.0.1.0.0',
+ 'category': 'Extra Tools',
+ 'summary': 'Module to send SMS through different SMS gateway',
+ 'description': """
+ This modules helps to send SMS using different SMS gateways including
+ Twilio, Vonage, TeleSign""",
+ 'author': 'Cybrosys Techno Solutions',
+ 'company': 'Cybrosys Techno Solutions',
+ 'maintainer': 'Cybrosys Techno Solutions',
+ 'website': 'https://www.cybrosys.com',
+ 'depends': ['base', 'contacts'],
+ 'data': [
+ 'security/multi_sms_gateway_groups.xml',
+ 'security/sms_history_security.xml',
+ 'security/ir.model.access.csv',
+ 'data/sms_gateway_data.xml',
+ 'views/sms_history_views.xml',
+ 'views/sms_gateway_config_views.xml',
+ 'views/res_partner_views.xml',
+ 'wizard/send_sms_views.xml',
+ 'views/multi_sms_gateway_menus.xml'
+ ],
+ 'external_dependencies': {
+ 'python': ['telesign', 'twilio', 'vonage']},
+ 'images': ['static/description/banner.jpg'],
+ 'license': 'AGPL-3',
+ 'installable': True,
+ 'auto_install': False,
+ 'application': False
+}
diff --git a/multi_sms_gateway/data/sms_gateway_data.xml b/multi_sms_gateway/data/sms_gateway_data.xml
new file mode 100644
index 000000000..2a3c4377f
--- /dev/null
+++ b/multi_sms_gateway/data/sms_gateway_data.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ twilio
+
+
+ vonage
+
+
+ telesign
+
+
diff --git a/multi_sms_gateway/doc/RELEASE_NOTES.md b/multi_sms_gateway/doc/RELEASE_NOTES.md
new file mode 100644
index 000000000..a0f3b5e4e
--- /dev/null
+++ b/multi_sms_gateway/doc/RELEASE_NOTES.md
@@ -0,0 +1,7 @@
+## Module
+
+#### 31.01.2024
+#### Version 15.0.1.0.0
+#### ADD
+
+- Initial commit for Multiple SMS Gateway Integration
diff --git a/multi_sms_gateway/models/__init__.py b/multi_sms_gateway/models/__init__.py
new file mode 100644
index 000000000..14d6b6f69
--- /dev/null
+++ b/multi_sms_gateway/models/__init__.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-TODAY Cybrosys Technologies().
+# 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 .
+#
+#############################################################################
+from . import res_partner
+from . import sms_connection_params
+from . import sms_gateway
+from . import sms_gateway_config
+from . import sms_history
diff --git a/multi_sms_gateway/models/res_partner.py b/multi_sms_gateway/models/res_partner.py
new file mode 100644
index 000000000..4b0e46eac
--- /dev/null
+++ b/multi_sms_gateway/models/res_partner.py
@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-TODAY Cybrosys Technologies().
+# 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 .
+#
+#############################################################################
+from odoo import models, _
+
+
+class ResPartner(models.Model):
+ """
+ Inheriting model 'res.partner' to add the function to send SMS.
+ Methods:
+ send_sms():
+ Opens the Send SMS wizard.
+ """
+ _inherit = 'res.partner'
+
+ def send_sms(self):
+ """
+ Function to open Send SMS wizard.
+ Returns:
+ dict: the action window of 'send.sms'.
+ """
+ record_ids = self.env.context.get('active_ids')
+ numbers = self.env['res.partner'].browse(record_ids).mapped('phone')
+ return {
+ 'name': _('Send SMS'),
+ 'type': 'ir.actions.act_window',
+ 'res_model': 'send.sms',
+ 'context': {
+ 'default_sms_to': ','.join([str(numb) for numb in numbers]),
+ },
+ 'view_mode': 'form',
+ 'target': 'new'
+ }
diff --git a/multi_sms_gateway/models/sms_connection_params.py b/multi_sms_gateway/models/sms_connection_params.py
new file mode 100644
index 000000000..5908e1161
--- /dev/null
+++ b/multi_sms_gateway/models/sms_connection_params.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-TODAY Cybrosys Technologies().
+# 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 .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class SmsConnectionParams(models.Model):
+ """
+ Class to add the credentials for establishing the connection with the
+ gateways.
+ """
+ _name = 'sms.connection.params'
+ _description = 'SMS Connection'
+
+ name = fields.Char(string='Name', help='Name for the parameter.')
+ sms_gateway_config_id = fields.Many2one(
+ 'sms.gateway.config', string='Connection ID',
+ help='Gateway configuration with credentials.')
+ connection_api = fields.Char(
+ string='API Method', help='Enter the API method.')
+ connection_value = fields.Char(
+ string='Value', help='Connection value for the gateway.')
diff --git a/multi_sms_gateway/models/sms_gateway.py b/multi_sms_gateway/models/sms_gateway.py
new file mode 100644
index 000000000..72bb3adbe
--- /dev/null
+++ b/multi_sms_gateway/models/sms_gateway.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-TODAY Cybrosys Technologies().
+# 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 .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class SmsGateway(models.Model):
+ """
+ Class to add the gateway providers.
+ """
+ _name = 'sms.gateway'
+ _description = 'SMS Gateway'
+
+ name = fields.Char(string='Provider Name',
+ help='Provide the name of the provider.')
diff --git a/multi_sms_gateway/models/sms_gateway_config.py b/multi_sms_gateway/models/sms_gateway_config.py
new file mode 100644
index 000000000..d785938cd
--- /dev/null
+++ b/multi_sms_gateway/models/sms_gateway_config.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-TODAY Cybrosys Technologies().
+# 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 .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class SmsGatewayConfig(models.Model):
+ """
+ Class to save the user credential details for the SMS gateways.
+ """
+ _name = 'sms.gateway.config'
+ _description = 'SMS Gateway Configuration'
+ _rec_name = 'gateway_name'
+
+ api_method = fields.Char(
+ string='API Method', help='The API method that has to be used.')
+ url = fields.Char(
+ sring='Gateway URL', help='Gateway URL to send the message.')
+ connection_ids = fields.One2many(
+ 'sms.connection.params',
+ 'sms_gateway_config_id', string='Parameters',
+ help='Connection parameters for the SMS gateway.')
+ sms_gateway_id = fields.Many2one(
+ 'sms.gateway', string='Gateway', help='The SMS Gateway.')
+ gateway_name = fields.Char(
+ related='sms_gateway_id.name', help='Gateway Name')
+ vonage_key = fields.Char(string='Key', help='The key for Vonage')
+ vonage_secret = fields.Char(string='Secret', help='The secret for Vonage.')
+ twilio_account_sid = fields.Char(
+ string='Account SID', help='Account SID for Twilio.')
+ twilio_auth_token = fields.Char(
+ string='Auth Token', help='Auth token for Twilio.')
+ twilio_phone_number = fields.Char(
+ string='Twilio Number', help='Twilio phone number.')
+ telesign_customer = fields.Char(
+ string='TeleSign Customer ID', help='Customer ID for TeleSign.')
+ telesign_api_key = fields.Char(
+ string='TeleSign API Key', help='API key for TeleSign')
diff --git a/multi_sms_gateway/models/sms_history.py b/multi_sms_gateway/models/sms_history.py
new file mode 100644
index 000000000..82d137c2c
--- /dev/null
+++ b/multi_sms_gateway/models/sms_history.py
@@ -0,0 +1,45 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-TODAY Cybrosys Technologies().
+# 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 .
+#
+#############################################################################
+from odoo import fields, models
+
+
+class SmsHistory(models.Model):
+ """
+ This model stores the details of all the SMS messages that have been
+ sent, including the gateway name, date of sending, mobile phone number,
+ and SMS text.
+ """
+ _name = 'sms.history'
+ _description = 'SMS History'
+ _rec_name = 'sms_mobile'
+
+ sms_gateway_id = fields.Many2one('sms.gateway',
+ string='Gateway',
+ help='The SMS Gateway.')
+ sms_date = fields.Datetime(string='Date', default=fields.Date().today(),
+ help='Date of sending message(current day).')
+ sms_mobile = fields.Char(
+ string='Mobile Number', help='Phone Number to send SMS.')
+ sms_text = fields.Text(string='SMS Text', help='The message to be sent.')
+ company_id = fields.Many2one(
+ 'res.company', string='Company', required=True,
+ default=lambda self: self.env.company, help='Active company.')
diff --git a/multi_sms_gateway/security/ir.model.access.csv b/multi_sms_gateway/security/ir.model.access.csv
new file mode 100644
index 000000000..804b88bee
--- /dev/null
+++ b/multi_sms_gateway/security/ir.model.access.csv
@@ -0,0 +1,6 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_sms_gateway_config_manager,access.sms.gateway.config.manager,model_sms_gateway_config,multi_sms_gateway.multi_sms_gateway_group_manager,1,1,1,1
+access_sms_connection_params_manager,access.sms.connection.params.manager,model_sms_connection_params,multi_sms_gateway.multi_sms_gateway_group_manager,1,1,1,1
+access_send_sms_manager,access.send.sms.manager,model_send_sms,multi_sms_gateway.multi_sms_gateway_group_manager,1,1,1,1
+access_sms_gateway_manager,access.sms.gateway.manager,model_sms_gateway,multi_sms_gateway.multi_sms_gateway_group_manager,1,1,1,1
+access_sms_history_manager,access.sms.history.manager,model_sms_history,multi_sms_gateway.multi_sms_gateway_group_manager,1,1,1,1
diff --git a/multi_sms_gateway/security/multi_sms_gateway_groups.xml b/multi_sms_gateway/security/multi_sms_gateway_groups.xml
new file mode 100644
index 000000000..53f32f63e
--- /dev/null
+++ b/multi_sms_gateway/security/multi_sms_gateway_groups.xml
@@ -0,0 +1,15 @@
+
+
+
+
+ Multiple SMS Gateway Integration
+ Manage user access for Multiple SMS Gateway Integration module
+ 20
+
+
+
+ Manager
+
+ Access to the new menus and records of Multiple SMS Gateway Integration
+
+
diff --git a/multi_sms_gateway/security/sms_history_security.xml b/multi_sms_gateway/security/sms_history_security.xml
new file mode 100644
index 000000000..127ccf286
--- /dev/null
+++ b/multi_sms_gateway/security/sms_history_security.xml
@@ -0,0 +1,9 @@
+
+
+
+
+ SMS History: Multi-company
+
+ ['|', ('company_id', '=', False), ('company_id', 'in', company_ids)]
+
+
diff --git a/multi_sms_gateway/static/description/assets/icons/check.png b/multi_sms_gateway/static/description/assets/icons/check.png
new file mode 100644
index 000000000..c8e85f51d
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/icons/check.png differ
diff --git a/multi_sms_gateway/static/description/assets/icons/chevron.png b/multi_sms_gateway/static/description/assets/icons/chevron.png
new file mode 100644
index 000000000..2089293d6
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/icons/chevron.png differ
diff --git a/multi_sms_gateway/static/description/assets/icons/cogs.png b/multi_sms_gateway/static/description/assets/icons/cogs.png
new file mode 100644
index 000000000..95d0bad62
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/icons/cogs.png differ
diff --git a/multi_sms_gateway/static/description/assets/icons/consultation.png b/multi_sms_gateway/static/description/assets/icons/consultation.png
new file mode 100644
index 000000000..8319d4baa
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/icons/consultation.png differ
diff --git a/multi_sms_gateway/static/description/assets/icons/ecom-black.png b/multi_sms_gateway/static/description/assets/icons/ecom-black.png
new file mode 100644
index 000000000..a9385ff13
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/icons/ecom-black.png differ
diff --git a/multi_sms_gateway/static/description/assets/icons/education-black.png b/multi_sms_gateway/static/description/assets/icons/education-black.png
new file mode 100644
index 000000000..3eb09b27b
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/icons/education-black.png differ
diff --git a/multi_sms_gateway/static/description/assets/icons/hotel-black.png b/multi_sms_gateway/static/description/assets/icons/hotel-black.png
new file mode 100644
index 000000000..130f613be
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/icons/hotel-black.png differ
diff --git a/multi_sms_gateway/static/description/assets/icons/license.png b/multi_sms_gateway/static/description/assets/icons/license.png
new file mode 100644
index 000000000..a5869797e
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/icons/license.png differ
diff --git a/multi_sms_gateway/static/description/assets/icons/lifebuoy.png b/multi_sms_gateway/static/description/assets/icons/lifebuoy.png
new file mode 100644
index 000000000..658d56ccc
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/icons/lifebuoy.png differ
diff --git a/multi_sms_gateway/static/description/assets/icons/manufacturing-black.png b/multi_sms_gateway/static/description/assets/icons/manufacturing-black.png
new file mode 100644
index 000000000..697eb0e9f
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/icons/manufacturing-black.png differ
diff --git a/multi_sms_gateway/static/description/assets/icons/pos-black.png b/multi_sms_gateway/static/description/assets/icons/pos-black.png
new file mode 100644
index 000000000..97c0f90c1
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/icons/pos-black.png differ
diff --git a/multi_sms_gateway/static/description/assets/icons/puzzle.png b/multi_sms_gateway/static/description/assets/icons/puzzle.png
new file mode 100644
index 000000000..65cf854e7
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/icons/puzzle.png differ
diff --git a/multi_sms_gateway/static/description/assets/icons/restaurant-black.png b/multi_sms_gateway/static/description/assets/icons/restaurant-black.png
new file mode 100644
index 000000000..4a35eb939
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/icons/restaurant-black.png differ
diff --git a/multi_sms_gateway/static/description/assets/icons/service-black.png b/multi_sms_gateway/static/description/assets/icons/service-black.png
new file mode 100644
index 000000000..301ab51cb
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/icons/service-black.png differ
diff --git a/multi_sms_gateway/static/description/assets/icons/trading-black.png b/multi_sms_gateway/static/description/assets/icons/trading-black.png
new file mode 100644
index 000000000..9398ba2f1
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/icons/trading-black.png differ
diff --git a/multi_sms_gateway/static/description/assets/icons/training.png b/multi_sms_gateway/static/description/assets/icons/training.png
new file mode 100644
index 000000000..884ca024d
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/icons/training.png differ
diff --git a/multi_sms_gateway/static/description/assets/icons/update.png b/multi_sms_gateway/static/description/assets/icons/update.png
new file mode 100644
index 000000000..ecbc5a01a
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/icons/update.png differ
diff --git a/multi_sms_gateway/static/description/assets/icons/user.png b/multi_sms_gateway/static/description/assets/icons/user.png
new file mode 100644
index 000000000..6ffb23d9f
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/icons/user.png differ
diff --git a/multi_sms_gateway/static/description/assets/icons/wrench.png b/multi_sms_gateway/static/description/assets/icons/wrench.png
new file mode 100644
index 000000000..6c04dea0f
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/icons/wrench.png differ
diff --git a/multi_sms_gateway/static/description/assets/misc/categories.png b/multi_sms_gateway/static/description/assets/misc/categories.png
new file mode 100644
index 000000000..bedf1e0b1
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/misc/categories.png differ
diff --git a/multi_sms_gateway/static/description/assets/misc/check-box.png b/multi_sms_gateway/static/description/assets/misc/check-box.png
new file mode 100644
index 000000000..42caf24b9
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/misc/check-box.png differ
diff --git a/multi_sms_gateway/static/description/assets/misc/compass.png b/multi_sms_gateway/static/description/assets/misc/compass.png
new file mode 100644
index 000000000..d5fed8faa
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/misc/compass.png differ
diff --git a/multi_sms_gateway/static/description/assets/misc/corporate.png b/multi_sms_gateway/static/description/assets/misc/corporate.png
new file mode 100644
index 000000000..2eb13edbf
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/misc/corporate.png differ
diff --git a/multi_sms_gateway/static/description/assets/misc/customer-support.png b/multi_sms_gateway/static/description/assets/misc/customer-support.png
new file mode 100644
index 000000000..79efc72ed
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/misc/customer-support.png differ
diff --git a/multi_sms_gateway/static/description/assets/misc/cybrosys-logo.png b/multi_sms_gateway/static/description/assets/misc/cybrosys-logo.png
new file mode 100644
index 000000000..cc3cc0ccf
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/misc/cybrosys-logo.png differ
diff --git a/multi_sms_gateway/static/description/assets/misc/features.png b/multi_sms_gateway/static/description/assets/misc/features.png
new file mode 100644
index 000000000..b41769f77
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/misc/features.png differ
diff --git a/multi_sms_gateway/static/description/assets/misc/logo.png b/multi_sms_gateway/static/description/assets/misc/logo.png
new file mode 100644
index 000000000..478462d3e
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/misc/logo.png differ
diff --git a/multi_sms_gateway/static/description/assets/misc/pictures.png b/multi_sms_gateway/static/description/assets/misc/pictures.png
new file mode 100644
index 000000000..56d255fe9
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/misc/pictures.png differ
diff --git a/multi_sms_gateway/static/description/assets/misc/pie-chart.png b/multi_sms_gateway/static/description/assets/misc/pie-chart.png
new file mode 100644
index 000000000..426e05244
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/misc/pie-chart.png differ
diff --git a/multi_sms_gateway/static/description/assets/misc/right-arrow.png b/multi_sms_gateway/static/description/assets/misc/right-arrow.png
new file mode 100644
index 000000000..730984a06
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/misc/right-arrow.png differ
diff --git a/multi_sms_gateway/static/description/assets/misc/star.png b/multi_sms_gateway/static/description/assets/misc/star.png
new file mode 100644
index 000000000..2eb9ab29f
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/misc/star.png differ
diff --git a/multi_sms_gateway/static/description/assets/misc/support.png b/multi_sms_gateway/static/description/assets/misc/support.png
new file mode 100644
index 000000000..4f18b8b82
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/misc/support.png differ
diff --git a/multi_sms_gateway/static/description/assets/misc/whatsapp.png b/multi_sms_gateway/static/description/assets/misc/whatsapp.png
new file mode 100644
index 000000000..d513a5356
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/misc/whatsapp.png differ
diff --git a/multi_sms_gateway/static/description/assets/modules/1.png b/multi_sms_gateway/static/description/assets/modules/1.png
new file mode 100644
index 000000000..f0c977511
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/modules/1.png differ
diff --git a/multi_sms_gateway/static/description/assets/modules/2.png b/multi_sms_gateway/static/description/assets/modules/2.png
new file mode 100644
index 000000000..9eea75430
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/modules/2.png differ
diff --git a/multi_sms_gateway/static/description/assets/modules/3.png b/multi_sms_gateway/static/description/assets/modules/3.png
new file mode 100644
index 000000000..4fbe85ac1
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/modules/3.png differ
diff --git a/multi_sms_gateway/static/description/assets/modules/4.png b/multi_sms_gateway/static/description/assets/modules/4.png
new file mode 100644
index 000000000..f9e4f9035
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/modules/4.png differ
diff --git a/multi_sms_gateway/static/description/assets/modules/5.png b/multi_sms_gateway/static/description/assets/modules/5.png
new file mode 100644
index 000000000..3664700f5
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/modules/5.png differ
diff --git a/multi_sms_gateway/static/description/assets/modules/6.png b/multi_sms_gateway/static/description/assets/modules/6.png
new file mode 100644
index 000000000..cf52775ae
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/modules/6.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/1.png b/multi_sms_gateway/static/description/assets/screenshots/1.png
new file mode 100644
index 000000000..e775ed36f
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/1.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/2.png b/multi_sms_gateway/static/description/assets/screenshots/2.png
new file mode 100644
index 000000000..d119a5065
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/2.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/3.png b/multi_sms_gateway/static/description/assets/screenshots/3.png
new file mode 100644
index 000000000..fc526230c
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/3.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/4.png b/multi_sms_gateway/static/description/assets/screenshots/4.png
new file mode 100644
index 000000000..0a62cce7a
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/4.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/5.png b/multi_sms_gateway/static/description/assets/screenshots/5.png
new file mode 100644
index 000000000..44c6c7993
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/5.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/6.png b/multi_sms_gateway/static/description/assets/screenshots/6.png
new file mode 100644
index 000000000..e4c3c527b
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/6.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/7.png b/multi_sms_gateway/static/description/assets/screenshots/7.png
new file mode 100644
index 000000000..565ab58db
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/7.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/8.png b/multi_sms_gateway/static/description/assets/screenshots/8.png
new file mode 100644
index 000000000..82952d223
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/8.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/hero.gif b/multi_sms_gateway/static/description/assets/screenshots/hero.gif
new file mode 100644
index 000000000..a923b4e0d
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/hero.gif differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/message bird.png b/multi_sms_gateway/static/description/assets/screenshots/message bird.png
new file mode 100644
index 000000000..261ff079b
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/message bird.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/tel.png b/multi_sms_gateway/static/description/assets/screenshots/tel.png
new file mode 100644
index 000000000..d09929329
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/tel.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/telesign1.png b/multi_sms_gateway/static/description/assets/screenshots/telesign1.png
new file mode 100644
index 000000000..3ff06ce6f
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/telesign1.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/telesign2.png b/multi_sms_gateway/static/description/assets/screenshots/telesign2.png
new file mode 100644
index 000000000..0825be2af
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/telesign2.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/telesign3.png b/multi_sms_gateway/static/description/assets/screenshots/telesign3.png
new file mode 100644
index 000000000..0afd667bf
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/telesign3.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/telesign4.png b/multi_sms_gateway/static/description/assets/screenshots/telesign4.png
new file mode 100644
index 000000000..86a50f96d
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/telesign4.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/telesign5.png b/multi_sms_gateway/static/description/assets/screenshots/telesign5.png
new file mode 100644
index 000000000..cd9007ef0
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/telesign5.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/twilio1.png b/multi_sms_gateway/static/description/assets/screenshots/twilio1.png
new file mode 100644
index 000000000..c3ff2b570
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/twilio1.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/twilio2.png b/multi_sms_gateway/static/description/assets/screenshots/twilio2.png
new file mode 100644
index 000000000..2ff7b0314
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/twilio2.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/twilio3.png b/multi_sms_gateway/static/description/assets/screenshots/twilio3.png
new file mode 100644
index 000000000..2523b1fb7
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/twilio3.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/twilio4.png b/multi_sms_gateway/static/description/assets/screenshots/twilio4.png
new file mode 100644
index 000000000..3e761e475
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/twilio4.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/twilio55.png b/multi_sms_gateway/static/description/assets/screenshots/twilio55.png
new file mode 100644
index 000000000..2b6ee0019
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/twilio55.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/twilio66.png b/multi_sms_gateway/static/description/assets/screenshots/twilio66.png
new file mode 100644
index 000000000..e7d6886f6
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/twilio66.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/von.png b/multi_sms_gateway/static/description/assets/screenshots/von.png
new file mode 100644
index 000000000..53042ce59
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/von.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/vonage10.png b/multi_sms_gateway/static/description/assets/screenshots/vonage10.png
new file mode 100644
index 000000000..bd1470e2f
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/vonage10.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/vonage1000.png b/multi_sms_gateway/static/description/assets/screenshots/vonage1000.png
new file mode 100644
index 000000000..745eaa2b7
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/vonage1000.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/vonage11.png b/multi_sms_gateway/static/description/assets/screenshots/vonage11.png
new file mode 100644
index 000000000..03425861f
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/vonage11.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/vonage20.png b/multi_sms_gateway/static/description/assets/screenshots/vonage20.png
new file mode 100644
index 000000000..371e96743
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/vonage20.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/vonage2000.png b/multi_sms_gateway/static/description/assets/screenshots/vonage2000.png
new file mode 100644
index 000000000..2867f81b8
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/vonage2000.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/vonage22.png b/multi_sms_gateway/static/description/assets/screenshots/vonage22.png
new file mode 100644
index 000000000..ead6b73f8
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/vonage22.png differ
diff --git a/multi_sms_gateway/static/description/assets/screenshots/vonage300.png b/multi_sms_gateway/static/description/assets/screenshots/vonage300.png
new file mode 100644
index 000000000..9120137e5
Binary files /dev/null and b/multi_sms_gateway/static/description/assets/screenshots/vonage300.png differ
diff --git a/multi_sms_gateway/static/description/banner.jpg b/multi_sms_gateway/static/description/banner.jpg
new file mode 100644
index 000000000..5e242be58
Binary files /dev/null and b/multi_sms_gateway/static/description/banner.jpg differ
diff --git a/multi_sms_gateway/static/description/icon.png b/multi_sms_gateway/static/description/icon.png
new file mode 100644
index 000000000..809f6698b
Binary files /dev/null and b/multi_sms_gateway/static/description/icon.png differ
diff --git a/multi_sms_gateway/static/description/index.html b/multi_sms_gateway/static/description/index.html
new file mode 100644
index 000000000..ba7f92653
--- /dev/null
+++ b/multi_sms_gateway/static/description/index.html
@@ -0,0 +1,799 @@
+
+
+
+

+
+
+ Community
+
+
+ Enterprise
+
+
+ Odoo.sh
+
+
+
+
+
+
+
+
+
+ Multiple SMS Gateway Integration
+
+
+ This Module Helps To Send SMS through different SMS Gateways
+
+

+
+
+
+
+
+
+
+
+
+

+
+
+ Explore This Module
+
+
+
+
+
+
+
+
+

+
+
+ Overview
+
+
+
+
+ This module helps to sent SMS to the customer with the help of
+ different SMS Gateways. The module mainly uses the Gateways
+ Twilio, Vonage, TeleSign.
+
+
+
+
+
+
+
+

+
+
+ Features
+
+
+
+
+
+

+
+
+ Send SMS through different Gateway.
+
+
+
+
+
+

+
+
+ Can see all the SMS history send through the Gateway
+
+
+
+
+
+

+
+
+ Sms gateways used in this module are Twilio, vonage,
+ Telesign.
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+ Screenshots
+
+
+
+
+
+
+ Select the access right for the Multiple SMS Gateway Integration
+ module as Manager.
+
+
+ We can give the access for the module from the field.
+
+

+
+
+
+
+ Select the gateway to send the SMS.
+
+
+ Select the suitable gateway to send SMS.
+
+

+
+
+
+ The credential for the gateway vonage can be accessed by
+ creating account in each platform we get the credentials for
+ different gateways.
+ To create Account in Vonage platform
+
+ Click Here
+
+
+
+

+
+
+
+ Click on Try it for free
+
+
+

+
+
+
+ Fill up the form and create free account.
+
+
+

+
+
+
+ Login with the details
+
+
+

+
+
+
+ Then fetch the credentials from the vonage dashboard.
+
+
+

+
+
+
+ The credential for the gateway Twilio can be accessed by
+ creating account in Twilio platform.
+ To create Account in Twilio platform
+
+ Click Here
+
+ .Click start for free button
+
+
+

+
+
+
+ Then Sign up on twilio platform
+
+
+

+
+
+
+ There will be twofactor authentication after signup.
+
+
+

+
+
+
+ After fill a form on which we have to mention the product
+ details we want to get from twilio platform.
+
+
+

+
+
+
+ We get the credentials after that, And we can generate a twilio
+ phone number by clicking on Get a phone number button
+
+
+

+
+
+
+ Hence, we have all the credentials needed
+
+
+

+
+
+
+ Go to Telesign sms api platform
+
+
+

+
+
+
+ In Developer section we get the API key by clicking try for free
+ button
+
+
+

+
+
+
+ It leads to create free account form
+
+
+

+
+
+
+ After creation, we get a verification code
+
+
+

+
+
+
+ After verification, It will lead to the credentials page
+
+
+

+
+
+
+
+ You can select the already created gateways.
+
+
+

+
+
+
+
+ Server action to send the SMS.
+
+
+

+
+
+
+
+ The wizard view helps to select the gateways that you have
+ created.
+
+
+

+
+
+
+
+ Add the number for sending the SMS.
+
+
+

+
+
+
+
+ View the SMS History.
+
+
+

+
+
+
+
+
+
+
+
+

+
+
+ Related Products
+
+
+
+
+
+
+
+
+
+

+
+
+ Our Services
+
+
+
+
+
+
+
+

+
+
+ Odoo Customization
+
+
+
+
+
+

+
+
+ Odoo Implementation
+
+
+
+
+
+

+
+
+ Odoo Support
+
+
+
+
+
+

+
+
+ Hire Odoo Developer
+
+
+
+
+
+

+
+
+ Odoo Integration
+
+
+
+
+
+

+
+
+ Odoo Migration
+
+
+
+
+
+

+
+
+ Odoo Consultancy
+
+
+
+
+
+

+
+
+ Odoo Implementation
+
+
+
+
+
+

+
+
+ Odoo Licensing Consultancy
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+ Our Industries
+
+
+
+
+
+
+
+

+
+ Trading
+
+
+ Easily procure and sell your products
+
+
+
+
+
+
+

+
+ POS
+
+
+ Easy configuration and convivial experience
+
+
+
+
+
+
+

+
+ Education
+
+
+ A platform for educational management
+
+
+
+
+
+
+

+
+ Manufacturing
+
+
+ Plan, track and schedule your operations
+
+
+
+
+
+
+

+
+ E-commerce & Website
+
+
+ Mobile friendly, awe-inspiring product pages
+
+
+
+
+
+

+
+ Service Management
+
+
+ Keep track of services and invoice
+
+
+
+
+
+
+

+
+ Restaurant
+
+
+ Run your bar or restaurant methodically
+
+
+
+
+
+
+

+
+ Hotel Management
+
+
+ An all-inclusive hotel management application
+
+
+
+
+
+
+
+
+
+
+

+
+
+ Support
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+

+
+
+
+
\ No newline at end of file
diff --git a/multi_sms_gateway/views/multi_sms_gateway_menus.xml b/multi_sms_gateway/views/multi_sms_gateway_menus.xml
new file mode 100644
index 000000000..5a0a8426d
--- /dev/null
+++ b/multi_sms_gateway/views/multi_sms_gateway_menus.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
diff --git a/multi_sms_gateway/views/res_partner_views.xml b/multi_sms_gateway/views/res_partner_views.xml
new file mode 100644
index 000000000..403cd3f3e
--- /dev/null
+++ b/multi_sms_gateway/views/res_partner_views.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ Send SMS
+
+
+ form,list
+ code
+ action = records.send_sms()
+
+
diff --git a/multi_sms_gateway/views/sms_gateway_config_views.xml b/multi_sms_gateway/views/sms_gateway_config_views.xml
new file mode 100644
index 000000000..dcdd744d2
--- /dev/null
+++ b/multi_sms_gateway/views/sms_gateway_config_views.xml
@@ -0,0 +1,89 @@
+
+
+
+
+ sms.gateway.config.view.form
+ sms.gateway.config
+
+
+
+
+
+
+ sms.gateway.config.view.tree
+ sms.gateway.config
+
+
+
+
+
+
+
+
+
+
+ SMS Gateway Configuration
+ sms.gateway.config
+
+
+ Gateway List Is Empty
+
+
+ Create a New Gateway List
+
+
+
+
diff --git a/multi_sms_gateway/views/sms_history_views.xml b/multi_sms_gateway/views/sms_history_views.xml
new file mode 100644
index 000000000..cc0fd19e7
--- /dev/null
+++ b/multi_sms_gateway/views/sms_history_views.xml
@@ -0,0 +1,47 @@
+
+
+
+
+ sms.history.view.form
+ sms.history
+
+
+
+
+
+
+ sms.history.view.tree
+ sms.history
+
+
+
+
+
+
+
+
+
+
+
+ SMS History
+ sms.history
+
+
+ SMS history is not created yet! Please send an SMS to create new history.
+
+
+
+
diff --git a/multi_sms_gateway/wizard/__init__.py b/multi_sms_gateway/wizard/__init__.py
new file mode 100644
index 000000000..02f06b4b4
--- /dev/null
+++ b/multi_sms_gateway/wizard/__init__.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-TODAY Cybrosys Technologies().
+# 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 .
+#
+#############################################################################
+from . import send_sms
diff --git a/multi_sms_gateway/wizard/send_sms.py b/multi_sms_gateway/wizard/send_sms.py
new file mode 100644
index 000000000..f235468ce
--- /dev/null
+++ b/multi_sms_gateway/wizard/send_sms.py
@@ -0,0 +1,79 @@
+# -*- coding: utf-8 -*-
+#############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2023-TODAY Cybrosys Technologies().
+# 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 .
+#
+#############################################################################
+import vonage
+from telesign.messaging import MessagingClient
+from twilio.rest import Client
+from odoo import fields, models
+
+
+class SendSms(models.TransientModel):
+ """
+ Class for the wizard to send SMS.
+ Methods:
+ action_send_sms():
+ Button action to send SMS.
+ """
+ _name = 'send.sms'
+ _description = 'Wizard To Send SMS'
+
+ sms_id = fields.Many2one('sms.gateway.config',
+ string='Connection ID',
+ help='Gateway record with credentials')
+ sms_to = fields.Char(string='Send To',
+ help='Enter the number to send the SMS')
+ text = fields.Text(string='Text', required=True,
+ help='Enter the text for the SMS')
+
+ def action_send_sms(self):
+ """
+ Function to send SMS using different SMS gateway
+ """
+ if self.sms_id.gateway_name == 'vonage':
+ client = vonage.Client(key=self.sms_id.vonage_key,
+ secret=self.sms_id.vonage_secret)
+ vonage.Sms(client)
+ for number in self.sms_to.split(','):
+ if number:
+ client.sms.send_message(
+ {
+ "from": 'Vonage APIs',
+ "to": number,
+ "text": self.text
+ }
+ )
+ elif self.sms_id.gateway_name == 'twilio':
+ client = Client(self.sms_id.twilio_account_sid,
+ self.sms_id.twilio_auth_token)
+ for number in self.sms_to.split(','):
+ if number:
+ client.messages.create(
+ body=self.text,
+ from_=self.sms_id.twilio_phone_number,
+ to=number
+ )
+ elif self.sms_id.gateway_name == 'telesign':
+ for number in self.sms_to.split(','):
+ if number:
+ messaging = MessagingClient(
+ self.sms_id.telesign_customer,
+ self.sms_id.telesign_api_key)
+ messaging.message(number, self.text, 'ARN')
diff --git a/multi_sms_gateway/wizard/send_sms_views.xml b/multi_sms_gateway/wizard/send_sms_views.xml
new file mode 100644
index 000000000..02b7d7055
--- /dev/null
+++ b/multi_sms_gateway/wizard/send_sms_views.xml
@@ -0,0 +1,29 @@
+
+
+
+
+ send.sms.view.form
+ send.sms
+
+
+
+
+
+