function widget_cash(widget) {
    "use strict";

    var model = openerp;

    widget.WidgetCashWidget = widget.Base.extend({
        template: 'WidgetCash',

        events: {},

        init: function (parent) {
            this._super(parent, {
                width: 3,
                height: 2
            });
        },

        start: function () {
            var self = this;
            self.fetchInitial();
        },

        fetchInitial: function(){
            var self = this;
            self.fetchResUser().then(function (ResUser) {
                return ResUser;
            }).then(function (ResUser) {
                self.ResUser = ResUser;
                return self.fetchAccountJournal();
            }).then(function(AccountJournal) {
                self.AccountJournal = AccountJournal;
                return self.fetchAccountBankStatement();
            }).then(function(AccountBankStatement) {
                self.AccountBankStatement = AccountBankStatement;
                return self.fetchResCompany();
            }).then(function(ResCompany) {
                self.ResCompany = ResCompany;
                return self.fetchResCurrecy();
            }).then(function(ResCurrecy) {
                self.ResCurrecy = ResCurrecy;
                return self.show();
            });
        },

        fetchResUser: function() {
            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'];
            var domain = [['type', '=', 'cash'],['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;
        },

        fetchAccountBankStatement: function() {
            var self = this;
            var defer = $.Deferred();
            var journal_ids = _.flatten(_.map(self.AccountJournal, function (item) {
                return item.id;
            }));
            var fields = ['id', 'name', 'date', 'balance_end','currency'];
            var domain = [['state', 'in', ['open']],['journal_id','in',journal_ids]];
            var AccountBankStatement = new model.web.Model('account.bank.statement');
            AccountBankStatement.query(fields).filter(domain).all().then(function(results) {
                defer.resolve(results);
            });

            return defer;
        },

        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;
        },

        fetchResCurrecy : 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 ResCurrecy = new model.web.Model('res.currency');
            ResCurrecy.query(fields).filter(domain).all().then(function(results) {
                defer.resolve(results);
            });
            return defer;
        },

        getResCurrency: function (id) {
            var self = this;
            return _.filter(self.ResCurrecy,function (item) {
                return item.id === id;
            })
        },

        show: function () {
            var self = this;
            var amount = 0;
            var data = [];
            var statement = self.AccountBankStatement;
            var CurrencyBase = self.getResCurrency(self.ResCompany[0].currency_id[0]).shift();
            if(statement.length > 0){
                var array = [];
                _.each(statement, function (item) {
                    var currency = self.getResCurrency(item.currency[0]).shift();
                    array.push({
                        amount: item.balance_end * (CurrencyBase.rate_silent / currency.rate_silent),
                    })
                });
                var invoice_total = 0;
                amount = _.reduce(_.map(array, function (map) {
                    return map.amount;
                }), function (memo, num) {
                    return memo + num;
                });
            }
            self.$el.find('.widget-content').find('a').text(accounting.formatMoney(amount, CurrencyBase.symbol, CurrencyBase.decimal_places, CurrencyBase.thousands_separator, CurrencyBase.decimal_separator))
        },
    });
}