Browse Source

Nov 1 [IMP] Salon Dashbaord Updated 'salon_management'

pull/221/merge
AjmalCybro 3 years ago
parent
commit
af903c3869
  1. 3
      salon_management/README.rst
  2. 43
      salon_management/__manifest__.py
  3. 36
      salon_management/controllers/main.py
  4. 6
      salon_management/doc/RELEASE_NOTES.md
  5. 28
      salon_management/models/salon_booking.py
  6. BIN
      salon_management/static/description/assets/screenshots/hero.gif
  7. BIN
      salon_management/static/description/assets/screenshots/screenshot-1.png
  8. BIN
      salon_management/static/src/css/images/chair.png
  9. 290
      salon_management/static/src/css/salon_dashboard.css
  10. 70
      salon_management/static/src/css/salon_website.css
  11. 185
      salon_management/static/src/js/salon_dashboard.js
  12. 47
      salon_management/static/src/js/website_salon_booking.js
  13. 44
      salon_management/static/src/less/salon_dashboard.less
  14. 81
      salon_management/static/src/xml/salon_dashboard.xml
  15. 12
      salon_management/views/res_config_settings_views.xml
  16. 20
      salon_management/views/res_partner_views.xml
  17. 34
      salon_management/views/salon_booking_templates.xml
  18. 3
      salon_management/views/salon_booking_views.xml
  19. 17
      salon_management/views/salon_chairs.xml
  20. 42
      salon_management/views/salon_management_menus.xml
  21. 172
      salon_management/views/salon_management_views.xml
  22. 40
      salon_management/views/salon_order_views.xml

3
salon_management/README.rst

@ -18,7 +18,8 @@ Credits
version 13: Vaishnavi B @cybrosys,Contact: odoo@cybrosys.com
version 14: Jibin James @cybrosys,Contact: odoo@cybrosys.com
version 15: Abhishek E T @cybrosys,Contact: odoo@cybrosys.com
version 16: Sabeel B @cybrosys,Contact: odoo@cybrosys.com
version 16: Sabeel B @cybrosys, Contact: odoo@cybrosys.com
version 16: Robin K @cybrosys, Contact: odoo@cybrosys.com
Contacts
--------
* Mail Contact : odoo@cybrosys.com

43
salon_management/__manifest__.py

@ -21,7 +21,7 @@
{
'name': 'Beauty Spa Management',
'summary': 'Beauty Parlour Management with Online Booking System',
'version': '16.0.1.0.0',
'version': '16.0.2.0.1',
'author': 'Cybrosys Techno Solutions',
'website': "https://www.cybrosys.com",
'company': 'Cybrosys Techno Solutions',
@ -29,25 +29,26 @@
'live_test_url':
'https://www.youtube.com/watch?v=TFmupz8MRm0&feature=youtu.be',
"category": "Industries",
'depends': ['account', 'base', 'base_setup', 'mail', 'website'],
'depends': ['account', 'base', 'base_setup', 'mail', 'website', 'contacts'],
'data': [
'security/salon_management_groups.xml',
'security/ir.model.access.csv',
'data/data.xml',
'data/mail_template.xml',
'data/salon_chair_data.xml',
'data/salon_holiday_data.xml',
'data/salon_order_data.xml',
'data/salon_stages_data.xml',
'data/salon_working_hours_data.xml',
'views/res_config_settings_views.xml',
'views/res_partner_views.xml',
'views/salon_booking_templates.xml',
'views/salon_booking_views.xml',
'views/salon_order_views.xml',
'views/salon_management_views.xml',
'views/salon_management_menus.xml',
],
'security/salon_management_groups.xml',
'security/ir.model.access.csv',
'data/data.xml',
'data/mail_template.xml',
'data/salon_chair_data.xml',
'data/salon_holiday_data.xml',
'data/salon_order_data.xml',
'data/salon_stages_data.xml',
'data/salon_working_hours_data.xml',
'views/res_config_settings_views.xml',
'views/res_partner_views.xml',
'views/salon_booking_templates.xml',
'views/salon_booking_views.xml',
'views/salon_order_views.xml',
'views/salon_chairs.xml',
'views/salon_management_views.xml',
'views/salon_management_menus.xml',
],
'images': ['static/description/banner.png'],
'license': 'AGPL-3',
'installable': True,
@ -55,7 +56,9 @@
'assets': {
'web.assets_backend': [
'salon_management/static/src/css/salon_dashboard.css',
'salon_management/static/src/less/salon_dashboard.less',
'salon_management/static/src/xml/salon_dashboard.xml',
'salon_management/static/src/js/salon_dashboard.js',
# 'salon_management/static/src/js/salon_chair.js',
],
'web.assets_frontend': [
'salon_management/static/src/css/salon_website.css',

36
salon_management/controllers/main.py

@ -43,12 +43,12 @@ class SalonBookingWeb(http.Controller):
j = 0
service_list = []
while j < (int(kwargs['number'])):
item = "list_service["+str(j)+"][i]"
item = "list_service[" + str(j) + "][i]"
service_list.append(int(kwargs[item]))
j += 1
salon_service_obj = request.env['salon.service'].search([
('id', 'in', service_list)])
dates_time = date+" "+time+":00"
dates_time = date + " " + time + ":00"
date_and_time = pytz.timezone(request.env.user.tz).localize(
datetime.strptime(dates_time, '%m/%d/%Y %H:%M:%S')).astimezone(
pytz.UTC).replace(tzinfo=None)
@ -86,10 +86,10 @@ class SalonBookingWeb(http.Controller):
'number': order.id,
'start_time_only': fields.Datetime.to_string(pytz.UTC.localize(
order.start_time).astimezone(pytz.timezone(
request.env.user.tz)).replace(tzinfo=None))[11:16],
request.env.user.tz)).replace(tzinfo=None))[11:16],
'end_time_only': fields.Datetime.to_string(pytz.UTC.localize(
order.end_time).astimezone(pytz.timezone(
request.env.user.tz)).replace(tzinfo=None))[11:16],
request.env.user.tz)).replace(tzinfo=None))[11:16],
}
if order.chair_id.id not in order_details:
order_details[order.chair_id.id] = {
@ -112,7 +112,6 @@ class SalonBookingWeb(http.Controller):
salon_working_hours_obj = request.env['salon.working.hours'].search([])
salon_holiday_obj = request.env['salon.holiday'].search(
[('holiday', '=', True)])
# date_check = fields.Date.context_today(request)
date_check = datetime.today().date()
date_start = pytz.timezone(request.env.user.tz).localize(
datetime.combine(date_check, time(0, 0, 0))).astimezone(
@ -135,3 +134,30 @@ class SalonBookingWeb(http.Controller):
'holiday': salon_holiday_obj,
'working_time': salon_working_hours_obj,
})
class SalonOrders(http.Controller):
@http.route(['/salon/chairs'], type="json", auth="public")
def elearning_snippet(self, products_per_slide=3):
print('controller')
chairs = []
salon_chairs = request.env['salon.chair'].sudo().search([])
number_of_orders = {}
for i in salon_chairs:
number_of_orders.update({i.id: len(request.env['salon.order'].search(
[("chair_id", "=", i.id),
("stage_id", "in", [2, 3])]))})
# print(i.id)
chairs.append(
{'name': i.name, 'id': i.id, 'orders': number_of_orders[i.id]})
print(number_of_orders, 'main')
values = {
's_chairs': chairs
}
print(values)
response = http.Response(
template='salon_management.dashboard_salon_chairs', qcontext=values)
print(response.render())
return response.render()

6
salon_management/doc/RELEASE_NOTES.md

@ -5,3 +5,9 @@
#### ADD
- Initial commit for Beauty Spa Management Module
#### 01.10.2022
#### Version 16.0.2.0.0
#### UPDT
- Dashboard Updated

28
salon_management/models/salon_booking.py

@ -20,6 +20,7 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###################################################################################
import json
import pytz
from datetime import datetime, time
@ -95,7 +96,8 @@ class SalonBooking(models.Model):
self.env['salon.order.line'].create(service_data)
template = self.env.ref(
'salon_management.mail_template_salon_approved')
self.env['mail.template'].browse(template.id).send_mail(self.id, force_send=True)
self.env['mail.template'].browse(template.id).send_mail(self.id,
force_send=True)
self.state = "approved"
def action_reject_booking(self):
@ -104,5 +106,27 @@ class SalonBooking(models.Model):
"""
template = self.env.ref(
'salon_management.mail_template_salon_rejected')
self.env['mail.template'].browse(template.id).send_mail(self.id, force_send=True)
self.env['mail.template'].browse(template.id).send_mail(self.id,
force_send=True)
self.state = "rejected"
@api.model
def get_booking_count(self):
salon_bookings = self.env['salon.booking'].search_count(
[('state', '=', 'approved')])
recent_works = self.env['salon.order'].search_count(
[('stage_id', 'in', [3, 4])])
salon_orders = self.env['salon.order'].search_count([])
salon_clients = self.env['res.partner'].search_count(
[('partner_salon', '=', True)])
salon_chairs = self.env['salon.chair'].search([])
values = {
'bookings': salon_bookings,
'sales': recent_works,
'orders': salon_orders,
'clients': salon_clients,
'chairs': salon_chairs
}
# print(values)
return values

BIN
salon_management/static/description/assets/screenshots/hero.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 KiB

After

Width:  |  Height:  |  Size: 155 KiB

BIN
salon_management/static/description/assets/screenshots/screenshot-1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 237 KiB

BIN
salon_management/static/src/css/images/chair.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 587 KiB

290
salon_management/static/src/css/salon_dashboard.css

@ -1,58 +1,254 @@
.style_chair {
text-align: center;
color: white;
font-size: 17px;
background: #0f101000;
padding: 0 !important;
text-transform: uppercase;
font-weight: 600;
.o_action_manager {
overflow: auto !important;
}
.salon_dashboards {
padding-top: 10px;
background-color: #f8faff !important;
}
.salon-card h4 {
font-size: 1.1rem;
}
.breadcrumbs {
margin-top: 0;
}
/* Widget One
---------------------------*/
.stat-content {
display: inline-block;
width: 66%;
}
.stat-icon {
display: inline-block;
}
.stat-widget-one .stat-icon {
vertical-align: top;
margin: auto;
width: 100%;
color: #01c490;
}
.stat-widget-one .stat-icon i {
font-size: 30px;
font-weight: 900;
display: inline-block;
color: #01c490;
}
.stat-widget-one .stat-text {
font-size: 14px;
color: #868e96;
font-weight: bold;
}
.style_chair_booking{
.stat-widget-one .stat-digit {
font-size: 24px;
color: #02448b;
}
.stat-count {
font-size: 20px;
text-align: center;
color: #000000;
color: #00438b;
}
.stat-title {
font-size: 17px;
background: #0f101000;
padding: 0 !important;
text-transform: uppercase;
font-weight: 600;
}
.style_collection {
color: black !important;
font-size: 12px;
text-align: center;
background: #29292900 !important;
padding: 0 !important;
color: #00438b;
}
.style_collection_booking{
color: black !important;
font-size: 12px;
text-align: center;
background: #29292900 !important;
padding: 0 !important;
/*=====================Dashboard===========================*/
.salon_dashboards {
background-color: #f8faff !important;
padding: 0px !important;
}
.container-fluid.o_hr_dashboard {
padding: 0px !important;
}
.salon-card {
padding: 0px;
margin-bottom: 1.5rem;
border-radius: 0px;
box-shadow: none;
background: none;
transition: transform 0.2s ease, box-shadow 0.2s ease;
will-change: transform, box-shadow;
}
.no_of_people {
.salon-card:hover {
transform: translateY(-2px) translateZ(0) !important;
box-shadow: 0 10px 10px 0 rgba(62, 57, 107, 0.12), 0 0 0 transparent !important;
}
.salon {
margin-top: 3%;
margin-bottom: 2%;
}
.salon .stat-icon {
border-radius: 15px 0 0 15px;
width: 30%;
height: 100px;
text-align: center;
font-size: 41px;
padding: 0 !important;
background: #4f535600;
color: white;
margin-top: 9px;
margin-bottom: 30px;
padding-top: 10%;
background: #314384ff;
color: #fff;
}
span.o_primary.style_collection {
color: #fff !important;
.salon .salon-card {
border-radius: 15px;
transition: transform 0.2s ease, box-shadow 0.2s ease;
will-change: transform, box-shadow;
box-shadow: 0 10px 40px 0 rgba(62, 57, 107, 0.07),
0 2px 9px 0 rgba(62, 57, 107, 0.06);
}
.no_of_people_booking{
.stat-widget-one .stat-text {
font-size: 14px;
color: #314384ff;
margin: 2rem 0rem 1rem 0rem;
text-align: center;
font-size: 41px;
padding: 0 !important;
background: #4f535600;
color: #000000;
margin-top: 9px;
margin-bottom: 30px;
}
.button_background{
background-color: Transparent;
border: transparent;
cursor: pointer;
}
.stat-widget-one .stat-digit {
font-size: 20px;
font-weight: bolder;
padding: 1px 10px 2px 0;
color: #8061a9;
text-shadow: 0px 0px 20px #000000;
text-align: center;
}
.stat-widget-one .stat-icon i {
/*border-radius: 15px 0 0 15px;*/
font-size: 25px;
font-weight: 900;
display: inline-block;
color: #fff;
}
.stat-widget-one {
border-radius: 15px;
background-color: white;
text-align: inherit !important;
}
.stat-widget-one {
width: 100%;
}
.salon_sales .stat-icon {
background: #964ec2 !important;
}
.salon_clients .stat-icon {
background: #813de6 !important;
}
.salon_orders .stat-icon {
background: #6f23a9 !important;
}
.salon_sales .stat-widget-one .stat-text {
color: #964ec2;
}
.salon_clients .stat-widget-one .stat-text {
color: #813de6;
}
.salon_orders .stat-widget-one .stat-text {
color: #6f23a9;
}
.salon-card-body {
display: flex;
justify-content: space-between;
align-items: center;
}
/*Chair*/
img {
padding: 5px;
}
article {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(17em, 1fr));
grid-gap: 1em;
height: fit-content;
margin-left: 1vw;
}
@media (max-width: 575.98px) {
.salon_chair {
width: 100%;
position: relative;
}
}
.chair_name {
opacity: 100%;
position: absolute;
padding: 26px 26px 3px 73px;
color: #ffffff;
font-weight: bolder;
-webkit-filter: drop-shadow(0px 4px 5px #000000);
filter: drop-shadow(0px 4px 5px #000000);
}
.chair_orders {
opacity: 100%;
position: absolute;
padding: 62px 0px 2px 94px;
color: #ffffff;
font-weight: bolder;
-webkit-filter: drop-shadow(0px 4px 5px #000000);
filter: drop-shadow(0px 4px 5px #000000);
}
.chair_setting {
opacity: 0.0;
-webkit-transition: all 500ms ease-in-out;
-moz-transition: all 500ms ease-in-out;
-ms-transition: all 500ms ease-in-out;
-o-transition: all 500ms ease-in-out;
transition: all 500ms ease-in-out;
}
.salon_chair:hover .chair_setting {
opacity: 1.0;
padding: 16px 0 0px 165px;
color: #4d4d4d;
font-size: medium;
-webkit-filter: drop-shadow(0px 4px 5px #da9bff);
filter: drop-shadow(0px 2px 6px #d999ff);
}
.salon_chair {
opacity: 85%;
background-image: url("images/chair.png");
background-repeat: no-repeat;
background-size: contain;
width: auto;
height: 100vw;
}
.salon_chair {
height: 200px;
width: 100%;
}
.salon_chair:hover {
-webkit-filter: drop-shadow(0px 4px 4px #3e3e3e);
filter: drop-shadow(0px 4px 4px #373737);
}

70
salon_management/static/src/css/salon_website.css

@ -1,46 +1,46 @@
.chair_box_website{
text-align: center;
border: 1px solid #666;
padding: 10px 15px;
box-shadow: 7px 8px 5px #888888;
background-color: #337ab7;
color: #000000;
.chair_box_website {
text-align: center;
border: 1px solid #666;
padding: 10px 15px;
box-shadow: 7px 8px 5px #888888;
background-color: #337ab7;
color: #000000;
}
.field_booking_chair{
font-weight: bold;
.field_booking_chair {
font-weight: bold;
}
input[type="text"]{
width: 100%;
input[type="text"] {
width: 100%;
}
input[type="email"]{
width: 100%;
input[type="email"] {
width: 100%;
}
input[type=checkbox] + label {
input[type="checkbox"] + label {
color: #7c7bad;
font-style: italic;
}
input[type=checkbox]:checked + label {
input[type="checkbox"]:checked + label {
color: #00a09d;
font-style: normal;
}
select{
width: 100%;
}
.selection_service{
height: 6em;
overflow: auto;
border: 1px solid #b3b3b3;
border-radius: 5px;
background-color: #fcfcfc;
}
#booking_chair_details{
height: 200px!important;
text-align: center;
border: 1px solid #666;
padding: 15px 0px;
box-shadow: 7px 8px 5px #888888;
background-color:#7c7bad;
border-radius:58px;
color:#fff;
margin-bottom: 10px;
select {
width: 100%;
}
.selection_service {
height: 6em;
overflow: auto;
border: 1px solid #b3b3b3;
border-radius: 5px;
background-color: #fcfcfc;
}
#booking_chair_details {
height: 200px !important;
text-align: center;
border: 1px solid #666;
padding: 15px 0px;
box-shadow: 7px 8px 5px #888888;
background-color: #7c7bad;
border-radius: 58px;
color: #fff;
margin-bottom: 10px;
}

185
salon_management/static/src/js/salon_dashboard.js

@ -0,0 +1,185 @@
odoo.define('salon_management.SalonDashboard', function (require) {
"use strict";
const AbstractAction = require('web.AbstractAction');
const core = require('web.core');
const rpc = require("web.rpc");
var ajax = require("web.ajax");
const _t = core._t;
const QWeb = core.qweb;
const SalonDashboard = AbstractAction.extend({
template: 'SalonDashboardMain',
events: {
'click .salon_spa_bookings': 'bookings',
'click .salon_spa_sales': 'sales',
'click .salon_spa_clients': 'clients',
'click .salon_spa_orders': 'orders',
'click .salon_chair': 'chairs_click',
'click .chair_setting': 'settings_click'
},
init: function (parent, context) {
this._super(parent, context);
this.dashboards_templates = ['SalonSpaDashBoard'];
},
start: function () {
var self = this;
this.set("title", 'Dashboard');
return this._super().then(function () {
self.render_dashboards();
self.$el.parent().addClass('oe_background_grey');
});
},
render_dashboards: function () {
var self = this;
var templates = ['SalonSpaDashBoard'];
_.each(templates, function (template) {
self.$('.spa_salon_dashboard').append(QWeb.render(template, {widget: self}));
});
rpc.query({
model: "salon.booking",
method: "get_booking_count",
args: [],
})
.then(function (result) {
$("#bookings_count").append("<span class='stat-digit'>" + result.bookings + "</span>");
$("#recent_count").append("<span class='stat-digit'>" + result.sales + "</span>");
$("#orders_count").append("<span class='stat-digit'>" + result.orders + "</span>");
$("#clients_count").append("<span class='stat-digit'>" + result.clients + "</span>");
// console.log("pass to controller");
ajax.jsonRpc("/salon/chairs", "call", {}).then(function (values) {
$('#chairs_dashboard_view').append(values);
});
});
},
on_reverse_breadcrumb: function () {
var self = this;
self.$('.spa_salon_dashboard').empty();
self.render_dashboards();
},
//events
chairs_click: function (ev) {
var self = this;
ev.stopPropagation();
ev.preventDefault();
var active_id = event.target.id
var options = {
on_reverse_breadcrumb: this.on_reverse_breadcrumb,
};
this.do_action({
name: _t("Chair Orders"),
type: 'ir.actions.act_window',
res_model: 'salon.order',
view_mode: 'kanban,tree,form',
views: [[false, 'kanban'], [false, 'list'], [false, 'form']],
domain: [['chair_id', '=', parseInt(active_id)]],
context: {
default_chair_id: parseInt(active_id)
},
target: 'current'
}, options);
},
settings_click: function (ev) {
var self = this;
ev.stopPropagation();
ev.preventDefault();
var active_id = event.target.id
console.log(active_id,"acname")
var options = {
on_reverse_breadcrumb: this.on_reverse_breadcrumb,
};
this.do_action({
name: _t("Chair Orders"),
type: 'ir.actions.act_window',
res_model: 'salon.chair',
view_mode: 'form',
views: [[false, 'form']],
context: {
default_name: active_id
},
target: 'current'
}, options);
},
bookings: function (ev) {
var self = this;
ev.stopPropagation();
ev.preventDefault();
var options = {
on_reverse_breadcrumb: this.on_reverse_breadcrumb,
};
this.do_action({
name: _t("Salon Bookings"),
type: 'ir.actions.act_window',
res_model: 'salon.booking',
view_mode: 'tree,form',
views: [[false, 'list'], [false, 'form']],
domain: [['state', '=', 'approved']],
target: 'current'
}, options);
},
sales: function (ev) {
var self = this;
ev.stopPropagation();
ev.preventDefault();
var options = {
on_reverse_breadcrumb: this.on_reverse_breadcrumb,
};
this.do_action({
name: _t("Recent Works"),
type: 'ir.actions.act_window',
res_model: 'salon.order',
view_mode: 'tree,form',
views: [[false, 'list'], [false, 'form']],
domain: [['stage_id', 'in', [3, 4]]],
target: 'current'
}, options);
},
orders: function (ev) {
var self = this;
ev.stopPropagation();
ev.preventDefault();
var options = {
on_reverse_breadcrumb: this.on_reverse_breadcrumb,
};
this.do_action({
name: _t("Salon Orders"),
type: 'ir.actions.act_window',
res_model: 'salon.order',
view_mode: 'tree,form,calendar',
views: [[false, 'list'], [false, 'form']],
target: 'current'
}, options);
},
clients: function (e) {
var self = this;
e.stopPropagation();
e.preventDefault();
var options = {
on_reverse_breadcrumb: self.on_reverse_breadcrumb,
};
self.do_action({
name: _t("Clients"),
type: 'ir.actions.act_window',
res_model: 'res.partner',
view_mode: 'tree,form',
views: [[false, 'list'], [false, 'form']],
domain: [['partner_salon', '=', true]],
target: 'current'
}, options);
},
});
core.action_registry.add('salon_dashboard', SalonDashboard);
return SalonDashboard;
});

47
salon_management/static/src/js/website_salon_booking.js

@ -7,18 +7,18 @@ odoo.define('salon_management.website_salon_booking', function (require) {
var rpc = require('web.rpc');
var QWeb = core.qweb;
$(document).on('click',"#submit_button", function() {
$(document).on('click', "#submit_button", function () {
var name = $("#name").val();
var date = $("#date").val();
var time = $("#time").val();
var phone = $("#phone").val();
var email = $("#email").val();
var service = $('.check_box_salon:checkbox:checked');
var chair = $( "#chair" ).val();
var chair = $("#chair").val();
var list_service = [];
var number = service.length;
for (var i=0; i<(service.length); i++) {
var k = {i : service[i].attributes['service-id'].value};
for (var i = 0; i < (service.length); i++) {
var k = { i: service[i].attributes['service-id'].value };
list_service.push(k);
}
if (name == "" || date == "" || time == "" || phone == "" || email == "" || list_service.length == 0) {
@ -26,21 +26,20 @@ odoo.define('salon_management.website_salon_booking', function (require) {
} else {
var time_left_char = time.substring(0, 2);
var time_right_char = time.substring(3, 5);
var time_separator = time.substring(2,3);
var time_separator = time.substring(2, 3);
if (isNaN(time_left_char) || isNaN(time_right_char) || time_separator != ":") {
alert("Select a valid Time");
} else {
var time_left = parseInt(time_left_char);
var time_right = parseInt(time_right_char);
if ((time_left < 24) && (time_right < 60) && (time_left >= 0) && (time_right >= 0)) {
var booking_record = {'name': name, 'date': date, 'time': time, 'phone': phone, 'email': email, 'list_service': list_service, 'chair': chair, 'number': number };
var booking_record = { 'name': name, 'date': date, 'time': time, 'phone': phone, 'email': email, 'list_service': list_service, 'chair': chair, 'number': number };
$.ajax({
url: "/page/salon_details",
type: "POST",
dataType: "json",
data: booking_record,
type: 'POST',
success: function( data ) {
success: function (data) {
window.location.href = "/page/salon_management/salon_booking_thank_you";
},
error: function (error) {
@ -54,12 +53,12 @@ odoo.define('salon_management.website_salon_booking', function (require) {
}
});
$(document).on('click', "#check_button", function() {
var check_date = $( "#check_date" ).val();
$(document).on('click', "#check_button", function () {
var check_date = $("#check_date").val();
if (check_date != "") {
ajax.jsonRpc("/page/salon_check_date", 'call', {
'check_date': check_date
}).then(function(order_details){
'check_date': check_date
}).then(function (order_details) {
var x;
var total_orders = "";
var order = "";
@ -69,18 +68,18 @@ odoo.define('salon_management.website_salon_booking', function (require) {
var i;
var lines = "";
for (i = 0; i < order_details[x]['orders'].length; i++) {
lines += '<tr><td><span>' + order_details[x]['orders'][i]['number'] +
'</span></td><td><span>' + order_details[x]['orders'][i]['start_time_only'] +
'</span></td><td><span>' + order_details[x]['orders'][i]['end_time_only'] + '</span></td></tr>'
lines += '<tr><td><span>' + order_details[x]['orders'][i]['number'] +
'</span></td><td><span>' + order_details[x]['orders'][i]['start_time_only'] +
'</span></td><td><span>' + order_details[x]['orders'][i]['end_time_only'] + '</span></td></tr>'
}
order += '<div class="col-lg-4 s_title pt16 pb16"><div style="height: 200px!important; text-align: center;' +
'border: 1px solid #666;padding: 15px 0px;box-shadow: 7px 8px 5px #888888;background-color:#7c7bad;border-radius:58px;color:#fff;margin-bottom: 10px;">' +
'<span style="font-size: 15px;">' + chair_name + '</span>' +
'<br/><a style="color:#fff;font-size:15px;">Order Details</a>' +
'<div id="style-2" style="overflow-y:scroll;height:105px;padding-right:25px;padding-left:25px;margin-right:10px;">' +
'<table class="table"><th style="font-size:11px;">Order No.</th><th style="font-size:11px;">Start Time</th>' +
'<th style="font-size:11px;">End Time</th><div><tbody style="font-size: 10px;">' +
lines + '</tbody></div></table></div></div></div>'
'border: 1px solid #666;padding: 15px 0px;box-shadow: 7px 8px 5px #888888;background-color:#7c7bad;border-radius:58px;color:#fff;margin-bottom: 10px;">' +
'<span style="font-size: 15px;">' + chair_name + '</span>' +
'<br/><a style="color:#fff;font-size:15px;">Order Details</a>' +
'<div id="style-2" style="overflow-y:scroll;height:105px;padding-right:25px;padding-left:25px;margin-right:10px;">' +
'<table class="table"><th style="font-size:11px;">Order No.</th><th style="font-size:11px;">Start Time</th>' +
'<th style="font-size:11px;">End Time</th><div><tbody style="font-size: 10px;">' +
lines + '</tbody></div></table></div></div></div>'
}
total_orders += '<div id="booking_chair_div" class="col-lg-12 s_title pt16 pb16 row">' + order + '</div>'
var res = document.getElementById('booking_chair_div')
@ -92,8 +91,8 @@ odoo.define('salon_management.website_salon_booking', function (require) {
date_field.innerHTML = date_value;
});
} else {
alert("Fill the Field");
alert("Fill the Field");
}
});
});
});

44
salon_management/static/src/less/salon_dashboard.less

@ -1,44 +0,0 @@
.o_kanban_dashboard.o_salon_kanban {
.o_kanban_record > div {
width: 180px;
height: 200px;
border-radius: 90px 90px 20px 20px;
background: #cc1f2f;
background: linear-gradient(#cc1f2f 0%, #cc1f2f 63%, #6d0b0b 63%, #cc1f2f 73%);
position: relative;
margin: 25px;
display: inline-block;
}
.o_kanban_record:after, .o_kanban_record:before {
content: "";
display: block;
width: 33.3333333333px;
height: 111.1111111111px;
position: absolute;
background: #cc1f2f;
border-radius: 20px;
border: 1px solid #000;
bottom: 25px;
right: 0;
left: 185px;
top: 64px;
}
.o_kanban_record:before {
left: 5px;
z-index: 9;
}
.o_kanban_record:after {
right: -20px;
z-index: 9;
}
.o_kanban_record.notvacant {
background: #ccc;
background: linear-gradient(#ccc 0%, #ccc 70%, #000 70%, #ccc 77%);
}
.o_kanban_record.notvacant:before, .o_kanban_record.notvacant:after {
background: #ccc;
}
}

81
salon_management/static/src/xml/salon_dashboard.xml

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve">
<t t-name="SalonDashboardMain">
<div class="salon_dashboards">
<div class="container-fluid spa_salon_dashboard">
</div>
</div>
</t>
<t t-name="SalonSpaDashBoard">
<link rel="stylesheet" href="/salon_management/static/src/css/salon_dashboard.css"/>
<div class="row main-section">
<div class="col-sm-6 col-md-3-12 col-md-6 col-lg-3 salon_spa_bookings salon salon_bookings">
<div class="salon-card">
<div class="salon-card-body">
<div class="stat-widget-one">
<div class="stat-icon">
<i class="fa fa-calendar"/>
</div>
<div class="stat-content">
<div class="stat-text">Bookings</div>
<div class="stat-digit" id="bookings_count">
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-sm-6 col-md-3-12 col-md-6 col-lg-3 salon_spa_orders salon salon_orders">
<div class="salon-card">
<div class="salon-card-body">
<div class="stat-widget-one">
<div class="stat-icon">
<i class="fa fa-calendar"/>
</div>
<div class="stat-content">
<div class="stat-text">Salon Orders</div>
<div class="stat-digit" id="orders_count">
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-sm-6 col-md-3-12 col-md-6 col-lg-3 salon_spa_sales salon salon_sales">
<div class="salon-card">
<div class="salon-card-body">
<div class="stat-widget-one">
<div class="stat-icon">
<i class="fa fa-money"/>
</div>
<div class="stat-content">
<div class="stat-text">Recent Works</div>
<div class="stat-digit" id="recent_count">
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-sm-6 col-md-3-12 col-md-6 col-lg-3 salon_spa_clients salon salon_clients">
<div class="salon-card">
<div class="salon-card-body">
<div class="stat-widget-one">
<div class="stat-icon">
<i class="fa fa-user "/>
</div>
<div class="stat-content">
<div class="stat-text">Salon Clients</div>
<div class="stat-digit" id="clients_count">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<article role="main" id="chairs_dashboard_view">
<!--filled from js-->
</article>
</t>
</templates>

12
salon_management/views/res_config_settings_views.xml

@ -43,12 +43,12 @@
</record>
<record id="salon_config_settings_action" model="ir.actions.act_window">
<field name="name">Settings</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.config.settings</field>
<field name="view_mode">form</field>
<field name="target">inline</field>
<field name="context">{'module' : 'salon_management'}</field>
<field name="name">Settings</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.config.settings</field>
<field name="view_mode">form</field>
<field name="target">inline</field>
<field name="context">{'module' : 'salon_management'}</field>
</record>
</odoo>

20
salon_management/views/res_partner_views.xml

@ -1,15 +1,13 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="res_partner_view_form" model="ir.ui.view">
<field name="name">res.partner.view.form.inherit.salon_management</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form" />
<field name="arch" type="xml">
<xpath expr="//field[@name='user_id']" position="after">
<field name="partner_salon" />
</xpath>
</field>
<field name="name">res.partner.view.form.inherit.salon_management</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form" />
<field name="arch" type="xml">
<xpath expr="//field[@name='category_id']" position="after">
<field name="partner_salon" />
</xpath>
</field>
</record>
</odoo>
</odoo>

34
salon_management/views/salon_booking_templates.xml

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="salon_booking_form" name="Salon Booking">
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" />
<link rel="stylesheet" href="//jqueryui.com/resources/demos/style.css" />
@ -10,9 +9,7 @@
<script>$( function() {$( "#check_date" ).datepicker();} );</script>
<t t-call="website.layout">
<div class="container">
<div class="row s_nb_column_fixed">
<div class="col-lg-6 s_title pt16 pb16">
<h3>
Working Time
@ -59,8 +56,7 @@
<div style="padding-left: 15px;padding-top: 15px;">
<t t-foreach="salon_services" t-as="service">
<div>
<input type="checkbox" t-att-service-id="service.id"
class="check_box_salon" />
<input type="checkbox" t-att-service-id="service.id" class="check_box_salon" />
<label for="service.id" t-esc="service.name" />
</div>
</t>
@ -74,14 +70,10 @@
</div>
<div class="col-lg-10 s_title pt16 pb16 row">
<div class="col-lg-4 s_title pt16 pb16">
<input type="text" id="date" placeholder="dd/mm/yyyy"
onkeyup="var v = this.value;if (v.match(/^\d{2}$/) !== null) {this.value = v + '/';} else if (v.match(/^\d{2}\/\d{2}$/) !== null) {this.value = v + '/';}"
maxlength="10" />
<input type="text" id="date" placeholder="dd/mm/yyyy" onkeyup="var v = this.value;if (v.match(/^\d{2}$/) !== null) {this.value = v + '/';} else if (v.match(/^\d{2}\/\d{2}$/) !== null) {this.value = v + '/';}" maxlength="10" />
</div>
<div class="col-lg-3 s_title pt16 pb16">
<input type="text" id="time" placeholder="HH:MM"
onkeyup="var v = this.value;if (v.match(/^\d{2}$/) !== null) {this.value = v + ':';}"
maxlength="5" />
<input type="text" id="time" placeholder="HH:MM" onkeyup="var v = this.value;if (v.match(/^\d{2}$/) !== null) {this.value = v + ':';}" maxlength="5" />
</div>
<div class="col-lg-5 s_title pt16 pb16" style="font-size: 12px;">
(Select date &amp; time based on availability of chair)
@ -110,8 +102,7 @@
PHONE *
</div>
<div class="col-lg-10 s_title pt16 pb16">
<input type="text" id="phone" required="True"
placeholder="Enter your Phone number(eg:999**12345)" />
<input type="text" id="phone" required="True" placeholder="Enter your Phone number(eg:999**12345)" />
</div>
</div>
<div class="row s_nb_column_fixed">
@ -119,14 +110,12 @@
E-MAIL *
</div>
<div class="col-lg-10 s_title pt16 pb16">
<input type="email" id="email" required="True"
placeholder="Enter your E-Mail Address(eg:example@gmail.com)" />
<input type="email" id="email" required="True" placeholder="Enter your E-Mail Address(eg:example@gmail.com)" />
</div>
</div>
<div class="row s_nb_column_fixed">
<div class="col-lg-12 s_title pt16 pb16">
<button type="button" id="submit_button"
class="btn btn-primary btn-md o_website_form_send">Send
<button type="button" id="submit_button" class="btn btn-primary btn-md o_website_form_send">Send
</button>
</div>
</div>
@ -157,8 +146,7 @@
<input id="check_date" type="text" placeholder="Select a date" />
</div>
<div class="col-lg-4 s_title pt16 pb16">
<button type="submit" id="check_button"
class="btn btn-primary btn-md o_website_form_send">Check
<button type="submit" id="check_button" class="btn btn-primary btn-md o_website_form_send">Check
</button>
</div>
</div>
@ -191,8 +179,7 @@
<span style="font-size: 15px;" t-field="chair_obj.name" />
<br/>
<a style="color:#fff;font-size:15px;">Order Details</a>
<div id="style-2"
style="overflow-y:scroll;height:105px;padding-right:25px;padding-left:25px;margin-right:10px;">
<div id="style-2" style="overflow-y:scroll;height:105px;padding-right:25px;padding-left:25px;margin-right:10px;">
<table class="table">
<th style="font-size:11px;">Order No.</th>
<th style="font-size:11px;">Start Time</th>
@ -203,7 +190,8 @@
<t t-if="order_obj.chair_id.id == chair_obj.id">
<tr>
<td>
<span t-field="order_obj.id" />.
<span t-field="order_obj.id" />
.
</td>
<td>
<span t-field="order_obj.start_time" t-options='{"format": "HH:mm"}' />
@ -238,4 +226,4 @@
</t>
</template>
</odoo>
</odoo>

3
salon_management/views/salon_booking_views.xml

@ -7,6 +7,7 @@
<field name="arch" type="xml">
<form>
<header>
<button name="get_booking_count" string="Test" class="oe_highlight" type="object" />
<button name="action_approve_booking" states="draft" string="Approve" class="oe_highlight" type="object" />
<button name="action_reject_booking" states="draft" string="Reject" class="oe_highlight" type="object" />
<field name="state" widget="statusbar" statusbar_visible="draft,approved,rejected" />
@ -55,4 +56,4 @@
<field name="view_mode">tree,form</field>
</record>
</odoo>
</odoo>

17
salon_management/views/salon_chairs.xml

@ -0,0 +1,17 @@
<odoo>
<data>
<template id="dashboard_salon_chairs" name="Chairs template">
<t t-foreach="s_chairs" t-as="chair">
<div class="salon_chair" t-att-id="chair['id']" t-att-value="chair['id']">
<h4 class="chair_name" t-att-id="chair['id']">
<t t-esc="chair['name']"></t>
</h4>
<h2 class="chair_orders" t-att-id="chair['id']">
<t t-esc="chair['orders']"></t>
</h2>
<i class="fa fa-cog chair_setting" t-att-id="chair['name']"></i>
</div>
</t>
</template>
</data>
</odoo>

42
salon_management/views/salon_management_menus.xml

@ -1,16 +1,36 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<menuitem id="salon_management_menu_root" name="Salon" groups="salon_management.group_salon_user" web_icon="salon_management,static/description/icon.png" />
<menuitem id="salon_chair_dashboard_menu_action" parent="salon_management_menu_root" action="salon_chair_dashboard_action" />
<menuitem id="salon_management_salon_root" name="Salon" parent="salon_management_menu_root" />
<menuitem id="salon_chair_menu_action" name="Chair" parent="salon_management_salon_root" action="salon_chair_action" />
<menuitem id="salon_service_menu_action" parent="salon_management_salon_root" action="salon_service_action" />
<menuitem id="salon_order_menu_action" parent="salon_management_salon_root" name="Salon Orders" action="salon_order_action" />
<menuitem id="salon_booking_menu_action" name="Bookings" parent="salon_management_salon_root" action="salon_booking_action" />
<menuitem id="salon_management_settings_menu_root" parent="salon_management_menu_root" name="Configuration" />
<menuitem id="salon_config_settings_menu_action" parent="salon_management_settings_menu_root" name="Settings" action="salon_config_settings_action" />
<menuitem id="salon_working_hours_menu_action" parent="salon_management_settings_menu_root" name="Working Hours" action="salon_working_hours_action" />
<menuitem id="salon_management_menu_root" name="Salon"
groups="salon_management.group_salon_user"
action="salon_action_dashboard"
web_icon="salon_management,static/description/icon.png"/>
<menuitem id="salon_dashboard_menu_action"
name="Dashboard" parent="salon_management_menu_root"
action="salon_action_dashboard"
sequence="-100" />
<menuitem id="salon_management_salon_root" name="Salon"
parent="salon_management_menu_root"/>
<menuitem id="salon_chair_menu_action" name="Chair"
parent="salon_management_salon_root"
action="salon_chair_action"/>
<menuitem id="salon_service_menu_action"
parent="salon_management_salon_root"
action="salon_service_action"/>
<menuitem id="salon_order_menu_action"
parent="salon_management_salon_root" name="Salon Orders"
action="salon_order_action"/>
<menuitem id="salon_booking_menu_action" name="Bookings"
parent="salon_management_salon_root"
action="salon_booking_action"/>
<menuitem id="salon_management_settings_menu_root"
parent="salon_management_menu_root" name="Configuration"/>
<menuitem id="salon_config_settings_menu_action"
parent="salon_management_settings_menu_root" name="Settings"
action="salon_config_settings_action"/>
<menuitem id="salon_working_hours_menu_action"
parent="salon_management_settings_menu_root"
name="Working Hours" action="salon_working_hours_action"/>
</data>
</odoo>
</odoo>

172
salon_management/views/salon_management_views.xml

@ -1,19 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="salon_stages_view_form" model="ir.ui.view">
<field name="name">salon.stage.view.form</field>
<field name="model">salon.stage</field>
<field name="arch" type="xml">
<form>
<sheet>
<h1>
<field name="name" />
<field name="sequence" invisible="1" />
</h1>
</sheet>
</form>
</field>
</record>
<record id="salon_service_view_form" model="ir.ui.view">
<field name="name">salon.service.view.form</field>
<field name="model">salon.service</field>
@ -21,10 +7,10 @@
<form>
<sheet>
<group>
<field name="name" />
<field name="currency_id" invisible="1" />
<field name="price" widget="monetary" />
<field name="time_taken" widget="float_time" />
<field name="name"/>
<field name="currency_id" invisible="1"/>
<field name="price" widget="monetary"/>
<field name="time_taken" widget="float_time"/>
</group>
</sheet>
</form>
@ -35,49 +21,47 @@
<field name="model">salon.service</field>
<field name="arch" type="xml">
<tree editable="bottom">
<field name="name" />
<field name="currency_id" invisible="1" />
<field name="price" widget="monetary" />
<field name="time_taken" widget="float_time" />
<field name="name"/>
<field name="currency_id" invisible="1"/>
<field name="price" widget="monetary"/>
<field name="time_taken" widget="float_time"/>
</tree>
</field>
</record>
<record id="salon_chair_view_form" model="ir.ui.view">
<field name="name">salon.chair.view.form</field>
<field name="model">salon.chair</field>
<field name="arch" type="xml">
<form>
<sheet>
<h1>
<field name="name" />
<field name="name">salon.chair.view.form</field>
<field name="model">salon.chair</field>
<field name="arch" type="xml">
<form>
<sheet>
<h1>
<field name="name"/>
</h1>
<group>
<group>
<field name="user_id" />
<field name="number_of_orders" invisible="1" />
<field name="collection_today" invisible="1" />
<field name="active_booking_chairs" invisible="1" />
<field name="user_id"/>
<field name="number_of_orders" invisible="1"/>
<field name="collection_today" invisible="1"/>
<field name="active_booking_chairs" invisible="1"/>
</group>
<group>
<field name="date" />
<field name="date"/>
</group>
</group>
<notebook>
<page string="Users">
<field name="user_line" mode="tree">
<tree string="Salon User Lines" editable="bottom" delete="false">
<field name="read_only_checker" invisible="1" />
<field name="user_id" domain="[('user_salon_active', '=', False)]"
attrs="{'readonly':[ ('read_only_checker', '!=', False)]}" />
<field name="start_date"
attrs="{'readonly':[ ('read_only_checker', '!=', False)]}" />
<field name="end_date" />
<field name="read_only_checker" invisible="1"/>
<field name="user_id" domain="[('user_salon_active', '=', False)]" attrs="{'readonly':[ ('read_only_checker', '!=', False)]}"/>
<field name="start_date" attrs="{'readonly':[ ('read_only_checker', '!=', False)]}"/>
<field name="end_date"/>
</tree>
</field>
</page>
</notebook>
</sheet>
</form>
</form>
</field>
</record>
<record id="salon_chair_view_tree" model="ir.ui.view">
@ -85,93 +69,11 @@
<field name="model">salon.chair</field>
<field name="arch" type="xml">
<tree>
<field name="name" />
<field name="name"/>
</tree>
</field>
</record>
<record id="salon_management_view_dashboard_kanban" model="ir.ui.view" >
<field name="name">salon_management.view.dashboard.kanban</field>
<field name="model">salon.chair</field>
<field name="type">kanban</field>
<field name="arch" type="xml">
<kanban class="oe_background_grey o_kanban_dashboard o_salon_kanban" create="0">
<field name="name" />
<field name="number_of_orders" />
<field name="active_booking_chairs" />
<templates>
<t t-name="kanban-box">
<div>
<div t-if="record.active_booking_chairs.raw_value == false">
<div class="o_primary style_chair">
<field name="name" />
<div>
<button type="edit" string="Settings" class="fa fa-cog button_background" />
</div>
</div>
</div>
<div t-if="record.active_booking_chairs.raw_value == true">
<div class="o_primary style_chair_booking">
<field name="name" />
<div>
<button type="edit" string="Settings" class="fa fa-cog button_background" />
</div>
</div>
</div>
<a href="#" name="%(salon_active_orders_dashboard_action)d" type="action" string="Active Orders">
<div t-if="record.active_booking_chairs.raw_value == false">
<div class="o_primary no_of_people">
<field name="number_of_orders" />
</div>
</div>
<div t-if="record.active_booking_chairs.raw_value == true">
<div class="o_primary no_of_people_booking">
<field name="number_of_orders" />
</div>
</div>
</a>
<div t-if="record.active_booking_chairs.raw_value == false">
<div class=" o_primary style_collection">
<span class=" o_primary style_collection">
<span class=" o_primary style_collection" style="float: left;">Today's Collection :</span>
<span class=" o_primary style_collection" style="float: center;">
<field name="collection_today" />
</span>
</span>
</div>
</div>
<div t-if="record.active_booking_chairs.raw_value == true">
<div class=" o_primary style_collection_booking">
<span class=" o_primary style_collection_booking">
<span class=" o_primary style_collection_booking" style="float: left;">Today's Collection :</span>
<span class=" o_primary style_collection_booking" style="float: center;">
<field name="collection_today" />
</span>
</span>
</div>
</div>
<div t-if="record.active_booking_chairs.raw_value == false">
<div class=" o_primary style_collection">
<span class=" o_primary style_collection">
<span class=" o_primary style_collection" style="float: left;">Free After (Hours) :</span>
<span class=" o_primary style_collection" style="float: center;">
<field name="total_time_taken_chair" widget="float_time" />
</span>
</span>
</div>
</div>
<div t-if="record.active_booking_chairs.raw_value == true">
<div class=" o_primary style_collection_booking">
<span class=" o_primary style_collection_booking">
<span class=" o_primary style_collection_booking" style="float: center;">Reserved For Booking</span>
</span>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="salon_working_view_form" model="ir.ui.view">
<field name="name">salon.working.view.form</field>
<field name="model">salon.working.hours</field>
@ -179,14 +81,14 @@
<form>
<sheet>
<h1>
<field name="name" />
<field name="name"/>
</h1>
<group>
<group>
<field name="from_time" widget="float_time" />
<field name="from_time" widget="float_time"/>
</group>
<group>
<field name="to_time" widget="float_time" />
<field name="to_time" widget="float_time"/>
</group>
</group>
</sheet>
@ -198,9 +100,9 @@
<field name="model">salon.working.hours</field>
<field name="arch" type="xml">
<tree editable="bottom">
<field name="name" />
<field name="from_time" widget="float_time" />
<field name="to_time" widget="float_time" />
<field name="name"/>
<field name="from_time" widget="float_time"/>
<field name="to_time" widget="float_time"/>
</tree>
</field>
</record>
@ -217,11 +119,9 @@
<field name="view_mode">tree,form</field>
</record>
<record id="salon_chair_dashboard_action" model="ir.actions.act_window">
<field name="name">Dashboard</field>
<field name="res_model">salon.chair</field>
<field name="view_mode">kanban,form</field>
<field name="context">{}</field>
<record id="salon_action_dashboard" model="ir.actions.client">
<field name="name">Salon Management</field>
<field name="tag">salon_dashboard</field>
</record>
<record id="salon_working_hours_action" model="ir.actions.act_window">

40
salon_management/views/salon_order_views.xml

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<record id="salon_order_view_tree" model="ir.ui.view">
<field name="name">salon.order.view.tree</field>
<field name="model">salon.order</field>
@ -22,7 +21,7 @@
<field name="name">salon.order.view.kanban</field>
<field name="model">salon.order</field>
<field name="arch" type="xml">
<kanban default_group_by="stage_id" class="o_kanban_small_column" quick_create="false" on_create="quick_create">
<kanban default_group_by="stage_id" class="o_kanban_small_column" quick_create="false" on_create="quick_create">
<field name="color" />
<field name="stage_id" />
<field name="currency_id" invisible="1" />
@ -34,14 +33,20 @@
<span class="fa fa-ellipsis-v" />
</a>
<div class="dropdown-menu" role="menu">
<t t-if="widget.editable"><a role="menuitem" type="edit" class="dropdown-item">Edit...</a></t>
<t t-if="widget.deletable"><a role="menuitem" type="delete" class="dropdown-item">Delete</a></t>
<t t-if="widget.editable">
<a role="menuitem" type="edit" class="dropdown-item">Edit...</a>
</t>
<t t-if="widget.deletable">
<a role="menuitem" type="delete" class="dropdown-item">Delete</a>
</t>
<ul class="oe_kanban_colorpicker" data-field="color" />
</div>
</div>
<div class="oe_kanban_content">
<div>
<strong><field name="name" /></strong>
<strong>
<field name="name" />
</strong>
</div>
<div class="text-muted">
<a>Customer :</a>
@ -77,24 +82,17 @@
<field name="arch" type="xml">
<form>
<header>
<button name="action_validate" attrs="{'invisible': ['|',('stage_id', '!=', 1), ('validation_controller', '=', True)]}" string="Validate" type="object"
class="oe_highlight" />
<button name="action_confirm" attrs="{'invisible': ['|',('stage_id', '!=', 1), ('validation_controller', '!=', True)]}" string="Confirm" type="object"
class="oe_highlight" />
<button name="action_create_invoice" attrs="{'invisible': [('stage_id', '!=', 2)]}" string="Create Invoice"
type="object" class="oe_highlight" />
<button name="action_validate" attrs="{'invisible': ['|',('stage_id', '!=', 1), ('validation_controller', '=', True)]}" string="Validate" type="object" class="oe_highlight" />
<button name="action_confirm" attrs="{'invisible': ['|',('stage_id', '!=', 1), ('validation_controller', '!=', True)]}" string="Confirm" type="object" class="oe_highlight" />
<button name="action_create_invoice" attrs="{'invisible': [('stage_id', '!=', 2)]}" string="Create Invoice" type="object" class="oe_highlight" />
<button name="action_cancel" string="Cancel" attrs="{'invisible': [('stage_id', 'not in', [1,2])]}" type="object" />
<button name="action_close" attrs="{'invisible': [('stage_id', '!=', 3)]}" string="Close" type="object" />
<field name="stage_id" widget="statusbar" domain="[('id','in',[1,2,4])]" />
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_view_invoice_salon"
type="object"
class="oe_stat_button"
icon="fa-pencil-square-o"
attrs="{'invisible': [('stage_id', 'not in', [3,4])]}">
<field name="count" widget="statinfo" string="Invoice" />
<button name="action_view_invoice_salon" type="object" class="oe_stat_button" icon="fa-pencil-square-o" attrs="{'invisible': [('stage_id', 'not in', [3,4])]}">
<field name="count" widget="statinfo" string="Invoice" />
</button>
</div>
<group>
@ -172,13 +170,11 @@
<group class="oe_subtotal_footer oe_right" colspan="2" name="salon_total">
<div class="oe_subtotal_footer_separator oe_inline o_td_label">
<label for="price_subtotal" />
<button name="action_update_total" string="(update)" type="object"
class="oe_edit_only oe_link" />
<button name="action_update_total" string="(update)" type="object" class="oe_edit_only oe_link" />
</div>
<field name="price_subtotal" nolabel="1" class="oe_subtotal_footer_separator" widget="monetary" />
</group>
<field name="note" class="oe_inline"
placeholder="Setup default terms and conditions in your company settings." />
<field name="note" class="oe_inline" placeholder="Setup default terms and conditions in your company settings." />
<div class="oe_clear" />
</page>
</notebook>
@ -201,4 +197,4 @@
</record>
</data>
</odoo>
</odoo>

Loading…
Cancel
Save