function widget_balance(widget) { "use strict"; var model = openerp; var Qweb = openerp.web.qweb; widget.WidgetBalanceWidget = widget.Base.extend({ template: 'WidgetBalance', modules: ['point_of_sale'], month: 0, week: 0, today: 0, data: 0, objective: 0, percentage: 0, events: { 'click .number': 'showModal', }, init: function (parent) { this._super(parent, { width: 3, height: 2 }); }, start: function () { var self = this; self.fetchInitial(); }, checkModel : function(model){ var self = this; return _.filter(self.IrModuleModule,function(item){ return item.name === model }); }, fetchInitial: function(){ var self = this; self.fecthIrModuleModule().then(function (IrModuleModule) { return IrModuleModule; }).then(function(IrModuleModule) { self.IrModuleModule = IrModuleModule; return self.fetchResUser(); }).then(function(ResUser) { self.ResUser = ResUser; return self.fetchAccountJournal(); }).then(function(AccountJournal) { self.AccountJournal = AccountJournal; return self.fetchAccountInvoice(); }).then(function(AccountInvoice) { self.AccountInvoice = AccountInvoice; return self.fetchPosOrder(); }).then(function(PosOrder) { self.PosOrder = PosOrder; return self.fetchResCompany(); }).then(function(ResCompany) { self.ResCompany = ResCompany; return self.fetchResCurrency(); }).then(function(ResCurrency) { self.ResCurrency = ResCurrency; return self.fetchDashboardObjetive(); }).then(function(DashboardObjetive) { self.DashboardObjetive = DashboardObjetive; return self.showThisMonth(); }); }, /* IR MODULES */ fecthIrModuleModule: function(){ var self = this; var defer = $.Deferred(); var fields = ['name','id']; var domain=[['state','=','installed'],['name','in',self.modules]]; var IrModuleModule = new model.web.Model('ir.module.module'); IrModuleModule.query(fields).filter(domain).all().then(function(results){ defer.resolve(results); }) return defer; }, /* USER */ fetchResUser: function(id) { var self = this; var defer = $.Deferred(); var fields = ['id','name','store_id']; var domain = [['id','=',self.session.uid]]; var ResUser = new model.web.Model('res.users'); ResUser.query(fields).filter(domain).all().then(function (results) { defer.resolve(results); }); return defer; }, fetchAccountJournal: function() { var self = this; var defer = $.Deferred(); var store_ids = self.ResUser[0].store_id[0]; var fields = ['id', 'name', 'store_ids','type']; var domain = [['type','in',['sale','purchase','sale_refund']],['store_ids','in',store_ids]]; var AccountJournal = new model.web.Model('account.journal'); AccountJournal.query(fields).filter(domain).all().then(function(results) { defer.resolve(results); }); return defer; }, fetchAccountInvoice: function() { var self = this; var defer = $.Deferred(); var journal_ids = _.flatten(_.map(this.AccountJournal, function (item) { return item.id; })); var date = moment().format('YYYY-MM-01'); var fields = ['id','type','date_invoice','amount_total','currency_id','journal_id']; var domain = [['state', 'not in', ['draft','cancel']],['journal_id','in',journal_ids],['date_invoice','>',date]]; var AccountInvoice = new model.web.Model('account.invoice'); AccountInvoice.query(fields).filter(domain).all().then(function(results) { defer.resolve(results); }); return defer; }, fetchPosOrder: function() { var self = this; var defer = $.Deferred(); var modules = self.checkModel('point_of_sale'); if (modules.length > 0){ var journal_ids = _.flatten(_.map(this.AccountJournal, function (item) { return item.id; })); var date = moment().format('YYYY-MM-01 00:00:00'); var fields = ['id', 'name', 'date_order', 'amount_total','sale_journal']; var domain = [['state', 'not in', ['draft','cancel']],['sale_journal','in',journal_ids],['date_order','>',date]]; var PosOrder = new model.web.Model('pos.order'); PosOrder.query(fields).filter(domain).all().then(function(results) { defer.resolve(results); }); return defer; }else{ var PosOrder = []; return PosOrder; } }, fetchResCompany: function() { var self = this; var defer = $.Deferred(); var fields = ['id','name', 'currency_id']; var domain = [['id', '=', self.session.company_id]]; var ResCompany = new model.web.Model('res.company'); ResCompany.query(fields).filter(domain).all().then(function (results) { defer.resolve(results); }); return defer; }, fetchResCurrency : function(){ var self = this; var defer = $.Deferred(); var fields = ['id','name', 'symbol', 'rate_silent', 'base', 'decimal_separator', 'decimal_places', 'thousands_separator', 'symbol_position']; var domain = [['active', '=', true]]; var ResCurrency = new model.web.Model('res.currency'); ResCurrency.query(fields).filter(domain).all().then(function(results) { defer.resolve(results); }); return defer; }, fetchDashboardObjetive : function(){ var self = this; var defer = $.Deferred(); var store_id = self.ResUser[0].store_id[0]; var date_min = moment().format('YYYY-MM-01'); var date_max = moment().add(1, 'month').format('YYYY-MM-01'); var fields = ['id','store_id', 'date', 'sale_objetive', 'purchase_limit', 'expense_limit', 'expected_profit']; var domain = [['date', '>=', date_min],['date', '<', date_max],['store_id','=',store_id]]; var DashboardObjetive = new model.web.Model('dashboard.objetive'); DashboardObjetive.query(fields).filter(domain).all().then(function(results) { defer.resolve(results); }); return defer; }, getResCurrency: function (id) { var self = this; return _.filter(self.ResCurrency,function (item) { return item.id === id; }) }, /*=================== ACCOUNT INVOICE ===================*/ getTodayAccountInvoice:function(type) { var self = this; var date = moment().format('YYYY-MM-DD'); var journals = _.filter(self.AccountJournal,function (inv) { return inv.type == type; }); if(journals.length > 0){ var journal_ids = _.flatten(_.map(journals, function (item) { return item.id; })); return _.flatten(_.filter(self.AccountInvoice,function (inv) { return moment(inv.date_invoice).format('YYYY-MM-DD') === date & inv.type == 'in_invoice'; })); } }, getThisWeekAccountInvoice:function(type) { var self = this; var week = moment().week(); var journals = _.filter(self.AccountJournal,function (inv) { return inv.type == type; }); if(journals.length > 0){ var journal_ids = _.flatten(_.map(journals, function (item) { return item.id; })); return _.flatten(_.filter(self.AccountInvoice,function (inv) { return moment(inv.date_invoice).week() === week & moment(inv.date_invoice).format('YYYY')=== moment().format('YYYY') & _.contains(journal_ids, inv.journal_id[0]); })); } }, getThisMonthAccountInvoice:function(type) { var self = this; var journals = _.filter(self.AccountJournal,function (inv) { return inv.type == type; }); if(journals.length > 0){ var journal_ids = _.flatten(_.map(journals, function (item) { return item.id; })); return _.flatten(_.filter(self.AccountInvoice,function (inv) { return moment(inv.date_invoice).format('YYYY-MM')=== moment().format('YYYY-MM') & _.contains(journal_ids, inv.journal_id[0]); })); } }, /*============= POS ORDER =============*/ getTodayPosOrder:function() { var self = this; var date = moment().format('YYYY-MM-DD'); return _.flatten(_.filter(self.PosOrder,function (inv) { var utc = moment.utc(inv.date_order,'YYYY-MM-DD h:mm:ss A'); return moment(utc._d).format('YYYY-MM-DD') === date; })); }, getThisWeekPosOrder:function() { var self = this; var week = moment().week(); return _.flatten(_.filter(self.PosOrder,function (inv) { var utc = moment.utc(inv.date_order,'YYYY-MM-DD h:mm:ss A'); utc = moment(utc._d).format('YYYY-MM-DD'); return moment(utc).week() === week & moment(utc).format('YYYY')=== moment().format('YYYY'); })); }, getThisMonthPosOrder:function() { var self = this; return _.flatten(_.filter(self.PosOrder,function (inv) { var utc = moment.utc(inv.date_order,'YYYY-MM-DD h:mm:ss A'); return moment(utc._d).format('YYYY-MM') === moment().format('YYYY-MM'); })); }, /* TODAY */ showToday: function () { var self = this; var amount_order = 0; var sale_invoice_amount = 0; var sale_invoice_refund_amount = 0; var purchase_invoice_amount= 0; var balance = 0; var array = []; var order = self.getTodayPosOrder(); var sale_invoice = self.getTodayAccountInvoice('sale'); var sale_invoice_refund = self.getTodayAccountInvoice('sale_refund'); var purchase_invoice = self.getTodayAccountInvoice('purchase'); var CurrencyBase = self.getResCurrency(self.ResCompany[0].currency_id[0]).shift(); if(order.length > 0){ amount_order = _.reduce(_.map(order, function (map) { return map.amount_total; }), function (memo, num) { return memo + num; }); } /* SALE INVOICE */ if(sale_invoice.length > 0){ array = []; _.each(sale_invoice, function (item) { var currency = self.getResCurrency(item.currency_id[0]).shift(); array.push({ amount: item.amount_total * (CurrencyBase.rate_silent / currency.rate_silent), }) }); sale_invoice_amount = _.reduce(_.map(array, function (map) { return map.amount; }), function (memo, num) { return memo + num; }); } /* SALE INVOICE REFUND */ if(sale_invoice_refund.length > 0){ array = []; _.each(sale_invoice_refund, function (item) { var currency = self.getResCurrency(item.currency_id[0]).shift(); array.push({ amount: item.amount_total * (CurrencyBase.rate_silent / currency.rate_silent), }) }); sale_invoice_refund_amount = _.reduce(_.map(array, function (map) { return map.amount; }), function (memo, num) { return memo + num; }); } /* PURCHASE INVOICE */ if(purchase_invoice.length > 0){ array = []; _.each(purchase_invoice, function (item) { var currency = self.getResCurrency(item.currency_id[0]).shift(); array.push({ amount: item.amount_total * (CurrencyBase.rate_silent / currency.rate_silent), }) }); purchase_invoice_amount = _.reduce(_.map(array, function (map) { return map.amount; }), function (memo, num) { return memo + num; }); } balance = (sale_invoice_amount + amount_order) - (sale_invoice_refund_amount + purchase_invoice_amount); self.today = balance; }, /* WEEK */ showThisWeek: function () { var self = this; var amount_order = 0; var sale_invoice_amount = 0; var sale_invoice_refund_amount = 0; var purchase_invoice_amount= 0; var balance = 0; var array = []; var order = self.getThisWeekPosOrder(); var sale_invoice = self.getThisWeekAccountInvoice('sale'); var sale_invoice_refund = self.getThisWeekAccountInvoice('sale_refund'); var purchase_invoice = self.getThisWeekAccountInvoice('purchase'); var CurrencyBase = self.getResCurrency(self.ResCompany[0].currency_id[0]).shift(); if(order.length > 0){ amount_order = _.reduce(_.map(order, function (map) { return map.amount_total; }), function (memo, num) { return memo + num; }); } /* SALE INVOICE */ if(sale_invoice.length > 0){ array = []; _.each(sale_invoice, function (item) { var currency = self.getResCurrency(item.currency_id[0]).shift(); array.push({ amount: item.amount_total * (CurrencyBase.rate_silent / currency.rate_silent), }) }); sale_invoice_amount = _.reduce(_.map(array, function (map) { return map.amount; }), function (memo, num) { return memo + num; }); } /* SALE INVOICE REFUND */ if(sale_invoice_refund.length > 0){ array = []; _.each(sale_invoice_refund, function (item) { var currency = self.getResCurrency(item.currency_id[0]).shift(); array.push({ amount: item.amount_total * (CurrencyBase.rate_silent / currency.rate_silent), }) }); sale_invoice_refund_amount = _.reduce(_.map(array, function (map) { return map.amount; }), function (memo, num) { return memo + num; }); } /* PURCHASE INVOICE */ if(purchase_invoice.length > 0){ array = []; _.each(purchase_invoice, function (item) { var currency = self.getResCurrency(item.currency_id[0]).shift(); array.push({ amount: item.amount_total * (CurrencyBase.rate_silent / currency.rate_silent), }) }); purchase_invoice_amount = _.reduce(_.map(array, function (map) { return map.amount; }), function (memo, num) { return memo + num; }); } balance = (sale_invoice_amount + amount_order) - (sale_invoice_refund_amount + purchase_invoice_amount); self.week = balance; }, /* MONTH */ showThisMonth: function () { var self = this; if(self.DashboardObjetive.length > 0){ self.objective = self.DashboardObjetive.shift().expected_profit; }else{ self.objective = 0; } var amount_order = 0; var sale_invoice_amount = 0; var sale_invoice_refund_amount = 0; var purchase_invoice_amount = 0; var balance = 0; var array = []; var out_array = []; var order = self.getThisMonthPosOrder(); var sale_invoice = self.getThisMonthAccountInvoice('sale'); var sale_invoice_refund = self.getThisMonthAccountInvoice('sale_refund'); var purchase_invoice = self.getThisMonthAccountInvoice('purchase'); var CurrencyBase = self.getResCurrency(self.ResCompany[0].currency_id[0]).shift(); if(order.length > 0){ amount_order = _.reduce(_.map(order, function (map) { return map.amount_total; }), function (memo, num) { return memo + num; }); } /* SALE INVOICE */ if(sale_invoice.length > 0){ array = []; _.each(sale_invoice, function (item) { var currency = self.getResCurrency(item.currency_id[0]).shift(); array.push({ amount: item.amount_total * (CurrencyBase.rate_silent / currency.rate_silent), }) }); sale_invoice_amount = _.reduce(_.map(array, function (map) { return map.amount; }), function (memo, num) { return memo + num; }); } /* SALE INVOICE REFUND */ if(sale_invoice_refund.length > 0){ array = []; _.each(sale_invoice_refund, function (item) { var currency = self.getResCurrency(item.currency_id[0]).shift(); array.push({ amount: item.amount_total * (CurrencyBase.rate_silent / currency.rate_silent), }) }); sale_invoice_refund_amount = _.reduce(_.map(array, function (map) { return map.amount; }), function (memo, num) { return memo + num; }); } /* PURCHASE INVOICE */ if(purchase_invoice.length > 0){ _.each(purchase_invoice, function (item) { var currency = self.getResCurrency(item.currency_id[0]).shift(); out_array.push({ amount: item.amount_total * (CurrencyBase.rate_silent / currency.rate_silent), }) }); purchase_invoice_amount = _.reduce(_.map(out_array, function (map) { return map.amount; }), function (memo, num) { return memo + num; }); } balance = (sale_invoice_amount + amount_order) - (sale_invoice_refund_amount + purchase_invoice_amount); self.month = balance; if(self.objective > 0){ var percentage = (balance*100)/self.objective; }else{ var percentage = 0; } $("#circle-balance").circliful({ animationStep: 10, foregroundBorderWidth: 15, backgroundBorderWidth: 1, percent: percentage, fontColor: '#0288d1', foregroundColor: '#0288d1', percentageTextSize: 35, }); self.percentage = percentage; self.$el.find('.widget-content').find('a').text(accounting.formatMoney(balance, CurrencyBase.symbol, CurrencyBase.decimal_places, CurrencyBase.thousands_separator, CurrencyBase.decimal_separator)) }, /* MODAL */ showModal: function (e) { var self = this; self.showThisWeek(); self.showToday(); var titleData = [ { title: "Balance" } ]; var CurrencyBase = self.getResCurrency(self.ResCompany[0].currency_id[0]).shift(); var modal = Qweb.render('WidgetModal', { modalTitle: titleData, objective: accounting.formatMoney(self.objective, CurrencyBase.symbol, CurrencyBase.decimal_places, CurrencyBase.thousands_separator, CurrencyBase.decimal_separator), today: accounting.formatMoney(self.today, CurrencyBase.symbol, CurrencyBase.decimal_places, CurrencyBase.thousands_separator, CurrencyBase.decimal_separator), week: accounting.formatMoney(self.week, CurrencyBase.symbol, CurrencyBase.decimal_places, CurrencyBase.thousands_separator, CurrencyBase.decimal_separator), month: accounting.formatMoney(self.month, CurrencyBase.symbol, CurrencyBase.decimal_places, CurrencyBase.thousands_separator, CurrencyBase.decimal_separator), }); $('.openerp_webclient_container').after(modal); $('.widget-modal').modal() $('.widget-modal').on('hidden.bs.modal', function (e) { self.removeModal(e); }) $("#myItemModal").circliful({ animationStep: 10, foregroundBorderWidth: 15, backgroundBorderWidth: 1, percent: self.percentage, fontColor: '#0288d1', foregroundColor: '#0288d1', percentageTextSize: 35, }); }, removeModal: function (e) { $('.widget-modal').remove(); $('.modal-backdrop').remove(); }, }); }