You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
540 lines
16 KiB
540 lines
16 KiB
odoo.define('dashboard_pos.Dashboard', function (require) {
|
|
"use strict";
|
|
|
|
var AbstractAction = require('web.AbstractAction');
|
|
var core = require('web.core');
|
|
const { loadBundle } = require("@web/core/assets");
|
|
var ajax = require('web.ajax');
|
|
var session = require('web.session');
|
|
var web_client = require('web.web_client');
|
|
var rpc = require('web.rpc');
|
|
var _t = core._t;
|
|
var QWeb = core.qweb;
|
|
|
|
var PosDashboard = AbstractAction.extend({
|
|
template: 'PosDashboard',
|
|
events: {
|
|
'click .pos_order_today':'pos_order_today',
|
|
'click .pos_order':'pos_order',
|
|
'click .pos_total_sales':'pos_order',
|
|
'click .pos_session':'pos_session',
|
|
'click .pos_refund_orders':'pos_refund_orders',
|
|
'click .pos_refund_today_orders':'pos_refund_today_orders',
|
|
'change #pos_sales': 'onclick_pos_sales',
|
|
},
|
|
|
|
init: function(parent, context) {
|
|
this._super(parent, context);
|
|
this.dashboards_templates = ['PosOrders','PosChart','PosCustomer'];
|
|
this.payment_details = [];
|
|
this.top_salesperson = [];
|
|
this.selling_product = [];
|
|
this.total_sale = [];
|
|
this.total_order_count = [];
|
|
this.total_refund_count = [];
|
|
this.total_session = [];
|
|
this.today_refund_total = [];
|
|
this.today_sale = [];
|
|
},
|
|
|
|
|
|
// willStart: function() {
|
|
// var self = this;
|
|
// return $.when(ajax.loadLibs(this), this._super()).then(function() {
|
|
// return self.fetch_data();
|
|
// });
|
|
// },
|
|
|
|
|
|
willStart: function() {
|
|
var self = this;
|
|
return $.when(loadBundle(this), this._super()).then(function() {
|
|
return self.fetch_data();
|
|
});
|
|
},
|
|
// willStart: function() {
|
|
// var self = this;
|
|
// return Promise.all([loadBundle(this), this._super()]).then(function() {
|
|
// return self.fetch_data();
|
|
|
|
start: function() {
|
|
var self = this;
|
|
this.set("title", 'Dashboard');
|
|
return this._super().then(function() {
|
|
self.render_dashboards();
|
|
self.render_graphs();
|
|
self.$el.parent().addClass('oe_background_grey');
|
|
});
|
|
},
|
|
|
|
fetch_data: function() {
|
|
var self = this;
|
|
var def1 = this._rpc({
|
|
model: 'pos.order',
|
|
method: 'get_refund_details'
|
|
}).then(function(result) {
|
|
self.total_sale = result['total_sale'],
|
|
self.total_order_count = result['total_order_count']
|
|
self.total_refund_count = result['total_refund_count']
|
|
self.total_session = result['total_session']
|
|
self.today_refund_total = result['today_refund_total']
|
|
self.today_sale = result['today_sale']
|
|
});
|
|
var def2 = self._rpc({
|
|
model: "pos.order",
|
|
method: "get_details",
|
|
})
|
|
.then(function (res) {
|
|
self.payment_details = res['payment_details'];
|
|
self.top_salesperson = res['salesperson'];
|
|
self.selling_product = res['selling_product'];
|
|
});
|
|
return $.when(def1,def2);
|
|
},
|
|
|
|
render_dashboards: function() {
|
|
var self = this;
|
|
_.each(this.dashboards_templates, function(template) {
|
|
self.$('.o_pos_dashboard').append(QWeb.render(template, {widget: self}));
|
|
});
|
|
},
|
|
render_graphs: function(){
|
|
var self = this;
|
|
self.render_top_customer_graph();
|
|
self.render_top_product_graph();
|
|
self.render_product_category_graph();
|
|
},
|
|
|
|
|
|
|
|
|
|
pos_order_today: function(e){
|
|
var self = this;
|
|
var date = new Date();
|
|
var yesterday = new Date(date.getTime());
|
|
yesterday.setDate(date.getDate() - 1);
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
|
|
session.user_has_group('hr.group_hr_user').then(function(has_group){
|
|
if(has_group){
|
|
var options = {
|
|
on_reverse_breadcrumb: self.on_reverse_breadcrumb,
|
|
};
|
|
self.do_action({
|
|
name: _t("Today Order"),
|
|
type: 'ir.actions.act_window',
|
|
res_model: 'pos.order',
|
|
view_mode: 'tree,form,calendar',
|
|
view_type: 'form',
|
|
views: [[false, 'list'],[false, 'form']],
|
|
domain: [['date_order','<=', date],['date_order', '>=', yesterday]],
|
|
target: 'current'
|
|
}, options)
|
|
}
|
|
});
|
|
|
|
},
|
|
|
|
|
|
pos_refund_orders: function(e){
|
|
var self = this;
|
|
var date = new Date();
|
|
var yesterday = new Date(date.getTime());
|
|
yesterday.setDate(date.getDate() - 1);
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
|
|
session.user_has_group('hr.group_hr_user').then(function(has_group){
|
|
if(has_group){
|
|
var options = {
|
|
on_reverse_breadcrumb: self.on_reverse_breadcrumb,
|
|
};
|
|
self.do_action({
|
|
name: _t("Refund Orders"),
|
|
type: 'ir.actions.act_window',
|
|
res_model: 'pos.order',
|
|
view_mode: 'tree,form,calendar',
|
|
view_type: 'form',
|
|
views: [[false, 'list'],[false, 'form']],
|
|
domain: [['amount_total', '<', 0.0]],
|
|
target: 'current'
|
|
}, options)
|
|
}
|
|
});
|
|
|
|
},
|
|
pos_refund_today_orders: function(e){
|
|
var self = this;
|
|
var date = new Date();
|
|
var yesterday = new Date(date.getTime());
|
|
yesterday.setDate(date.getDate() - 1);
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
|
|
session.user_has_group('hr.group_hr_user').then(function(has_group){
|
|
if(has_group){
|
|
var options = {
|
|
on_reverse_breadcrumb: self.on_reverse_breadcrumb,
|
|
};
|
|
self.do_action({
|
|
name: _t("Refund Orders"),
|
|
type: 'ir.actions.act_window',
|
|
res_model: 'pos.order',
|
|
view_mode: 'tree,form,calendar',
|
|
view_type: 'form',
|
|
views: [[false, 'list'],[false, 'form']],
|
|
domain: [['amount_total', '<', 0.0],['date_order','<=', date],['date_order', '>=', yesterday]],
|
|
target: 'current'
|
|
}, options)
|
|
}
|
|
});
|
|
|
|
},
|
|
|
|
pos_order: function(e){
|
|
var self = this;
|
|
var date = new Date();
|
|
var yesterday = new Date(date.getTime());
|
|
yesterday.setDate(date.getDate() - 1);
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
session.user_has_group('hr.group_hr_user').then(function(has_group){
|
|
if(has_group){
|
|
var options = {
|
|
on_reverse_breadcrumb: self.on_reverse_breadcrumb,
|
|
};
|
|
self.do_action({
|
|
name: _t("Total Order"),
|
|
type: 'ir.actions.act_window',
|
|
res_model: 'pos.order',
|
|
view_mode: 'tree,form,calendar',
|
|
view_type: 'form',
|
|
views: [[false, 'list'],[false, 'form']],
|
|
target: 'current'
|
|
}, options)
|
|
}
|
|
});
|
|
|
|
},
|
|
pos_session: function(e){
|
|
var self = this;
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
session.user_has_group('hr.group_hr_user').then(function(has_group){
|
|
if(has_group){
|
|
var options = {
|
|
on_reverse_breadcrumb: self.on_reverse_breadcrumb,
|
|
};
|
|
self.do_action({
|
|
name: _t("sessions"),
|
|
type: 'ir.actions.act_window',
|
|
res_model: 'pos.session',
|
|
view_mode: 'tree,form,calendar',
|
|
view_type: 'form',
|
|
views: [[false, 'list'],[false, 'form']],
|
|
target: 'current'
|
|
}, options)
|
|
}
|
|
});
|
|
|
|
},
|
|
|
|
onclick_pos_sales:function(events){
|
|
var option = $(events.target).val();
|
|
var self = this
|
|
var ctx = self.$("#canvas_1");
|
|
rpc.query({
|
|
model: "pos.order",
|
|
method: "get_department",
|
|
args: [option],
|
|
}).then(function (arrays) {
|
|
var data = {
|
|
labels: arrays[1],
|
|
datasets: [
|
|
{
|
|
label: arrays[2],
|
|
data: arrays[0],
|
|
backgroundColor: [
|
|
"rgba(255, 99, 132,1)",
|
|
"rgba(54, 162, 235,1)",
|
|
"rgba(75, 192, 192,1)",
|
|
"rgba(153, 102, 255,1)",
|
|
"rgba(10,20,30,1)"
|
|
],
|
|
borderColor: [
|
|
"rgba(255, 99, 132, 0.2)",
|
|
"rgba(54, 162, 235, 0.2)",
|
|
"rgba(75, 192, 192, 0.2)",
|
|
"rgba(153, 102, 255, 0.2)",
|
|
"rgba(10,20,30,0.3)"
|
|
],
|
|
borderWidth: 1
|
|
},
|
|
|
|
]
|
|
};
|
|
|
|
//options
|
|
var options = {
|
|
responsive: true,
|
|
title: {
|
|
display: true,
|
|
position: "top",
|
|
text: "SALE DETAILS",
|
|
fontSize: 18,
|
|
fontColor: "#111"
|
|
},
|
|
legend: {
|
|
display: true,
|
|
position: "bottom",
|
|
labels: {
|
|
fontColor: "#333",
|
|
fontSize: 16
|
|
}
|
|
},
|
|
scales: {
|
|
yAxes: [{
|
|
ticks: {
|
|
min: 0
|
|
}
|
|
}]
|
|
}
|
|
};
|
|
|
|
//create Chart class object
|
|
if (window.myCharts != undefined)
|
|
window.myCharts.destroy();
|
|
window.myCharts = new Chart(ctx, {
|
|
type: "bar",
|
|
data: data,
|
|
options: options
|
|
});
|
|
|
|
});
|
|
},
|
|
|
|
|
|
render_top_customer_graph:function(){
|
|
var self = this
|
|
var ctx = self.$(".top_customer");
|
|
rpc.query({
|
|
model: "pos.order",
|
|
method: "get_the_top_customer",
|
|
}).then(function (arrays) {
|
|
|
|
|
|
var data = {
|
|
labels: arrays[1],
|
|
datasets: [
|
|
{
|
|
label: "",
|
|
data: arrays[0],
|
|
backgroundColor: [
|
|
"rgb(148, 22, 227)",
|
|
"rgba(54, 162, 235)",
|
|
"rgba(75, 192, 192)",
|
|
"rgba(153, 102, 255)",
|
|
"rgba(10,20,30)"
|
|
],
|
|
borderColor: [
|
|
"rgba(255, 99, 132,)",
|
|
"rgba(54, 162, 235,)",
|
|
"rgba(75, 192, 192,)",
|
|
"rgba(153, 102, 255,)",
|
|
"rgba(10,20,30,)"
|
|
],
|
|
borderWidth: 1
|
|
},
|
|
|
|
]
|
|
};
|
|
|
|
//options
|
|
var options = {
|
|
responsive: true,
|
|
title: {
|
|
display: true,
|
|
position: "top",
|
|
text: " Top Customer",
|
|
fontSize: 18,
|
|
fontColor: "#111"
|
|
},
|
|
legend: {
|
|
display: true,
|
|
position: "bottom",
|
|
labels: {
|
|
fontColor: "#333",
|
|
fontSize: 16
|
|
}
|
|
},
|
|
scales: {
|
|
yAxes: [{
|
|
ticks: {
|
|
min: 0
|
|
}
|
|
}]
|
|
}
|
|
};
|
|
|
|
//create Chart class object
|
|
var chart = new Chart(ctx, {
|
|
type: "pie",
|
|
data: data,
|
|
options: options
|
|
});
|
|
|
|
});
|
|
},
|
|
|
|
render_top_product_graph:function(){
|
|
var self = this
|
|
var ctx = self.$(".top_selling_product");
|
|
rpc.query({
|
|
model: "pos.order",
|
|
method: "get_the_top_products",
|
|
}).then(function (arrays) {
|
|
var data = {
|
|
|
|
labels: arrays[1],
|
|
datasets: [
|
|
{
|
|
label: "Quantity",
|
|
data: arrays[0],
|
|
backgroundColor: [
|
|
"rgba(255, 99, 132,1)",
|
|
"rgba(54, 162, 235,1)",
|
|
"rgba(75, 192, 192,1)",
|
|
"rgba(153, 102, 255,1)",
|
|
"rgba(10,20,30,1)"
|
|
],
|
|
borderColor: [
|
|
"rgba(255, 99, 132, 0.2)",
|
|
"rgba(54, 162, 235, 0.2)",
|
|
"rgba(75, 192, 192, 0.2)",
|
|
"rgba(153, 102, 255, 0.2)",
|
|
"rgba(10,20,30,0.3)"
|
|
],
|
|
borderWidth: 1
|
|
},
|
|
|
|
]
|
|
};
|
|
|
|
//options
|
|
var options = {
|
|
responsive: true,
|
|
title: {
|
|
display: true,
|
|
position: "top",
|
|
text: " Top products",
|
|
fontSize: 18,
|
|
fontColor: "#111"
|
|
},
|
|
legend: {
|
|
display: true,
|
|
position: "bottom",
|
|
labels: {
|
|
fontColor: "#333",
|
|
fontSize: 16
|
|
}
|
|
},
|
|
scales: {
|
|
yAxes: [{
|
|
ticks: {
|
|
min: 0
|
|
}
|
|
}]
|
|
}
|
|
};
|
|
|
|
//create Chart class object
|
|
var chart = new Chart(ctx, {
|
|
type: "horizontalBar",
|
|
data: data,
|
|
options: options
|
|
});
|
|
|
|
});
|
|
},
|
|
|
|
render_product_category_graph:function(){
|
|
var self = this
|
|
var ctx = self.$(".top_product_categories");
|
|
rpc.query({
|
|
model: "pos.order",
|
|
method: "get_the_top_categories",
|
|
}).then(function (arrays) {
|
|
|
|
|
|
var data = {
|
|
labels: arrays[1],
|
|
datasets: [
|
|
{
|
|
label: "Quantity",
|
|
data: arrays[0],
|
|
backgroundColor: [
|
|
"rgba(255, 99, 132,1)",
|
|
"rgba(54, 162, 235,1)",
|
|
"rgba(75, 192, 192,1)",
|
|
"rgba(153, 102, 255,1)",
|
|
"rgba(10,20,30,1)"
|
|
],
|
|
borderColor: [
|
|
"rgba(255, 99, 132, 0.2)",
|
|
"rgba(54, 162, 235, 0.2)",
|
|
"rgba(75, 192, 192, 0.2)",
|
|
"rgba(153, 102, 255, 0.2)",
|
|
"rgba(10,20,30,0.3)"
|
|
],
|
|
borderWidth: 1
|
|
},
|
|
|
|
|
|
]
|
|
};
|
|
|
|
//options
|
|
var options = {
|
|
responsive: true,
|
|
title: {
|
|
display: true,
|
|
position: "top",
|
|
text: " Top product categories",
|
|
fontSize: 18,
|
|
fontColor: "#111"
|
|
},
|
|
legend: {
|
|
display: true,
|
|
position: "bottom",
|
|
labels: {
|
|
fontColor: "#333",
|
|
fontSize: 16
|
|
}
|
|
},
|
|
scales: {
|
|
yAxes: [{
|
|
ticks: {
|
|
min: 0
|
|
}
|
|
}]
|
|
}
|
|
};
|
|
|
|
//create Chart class object
|
|
var chart = new Chart(ctx, {
|
|
type: "horizontalBar",
|
|
data: data,
|
|
options: options
|
|
});
|
|
|
|
});
|
|
},
|
|
});
|
|
|
|
|
|
core.action_registry.add('pos_dashboard', PosDashboard);
|
|
|
|
return PosDashboard;
|
|
|
|
});
|
|
|