diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py index 64e56e89f5d..1921edfe872 100644 --- a/addons/point_of_sale/point_of_sale.py +++ b/addons/point_of_sale/point_of_sale.py @@ -174,11 +174,12 @@ class pos_session(osv.osv): 'state' : fields.selection(POS_SESSION_STATE, 'State', required=True, readonly=True, select=1), - 'cash_register_id' : fields.many2one('account.bank.statement', 'Bank Account Statement'), + 'cash_register_id' : fields.many2one('account.bank.statement', 'Bank Account Statement', ondelete='cascade'), 'details_ids' : fields.related('cash_register_id', 'details_ids', type='one2many', relation='account.cashbox.line', string='CashBox Lines'), + 'journal_ids' : fields.related('config_id', 'journal_ids', type='many2many', relation='account.journal', string='Journals'), 'order_ids' : fields.one2many('pos.order', 'session_id', 'Orders'), } @@ -192,7 +193,7 @@ class pos_session(osv.osv): ('uniq_name', 'unique(name)', "The name of this POS Session must be unique !"), ] - def _create_cash_register(self, cr, uid, pos_config, context=None): + def _create_cash_register(self, cr, uid, pos_config, user_id, context=None): if not pos_config: return False @@ -209,6 +210,7 @@ class pos_session(osv.osv): values = { 'journal_id' : journal_id, + 'user_id' : pos_config.user_id and pos_config.user_id.id or uid, } cash_register_id = proxy.create(cr, uid, values, context=context) @@ -220,15 +222,31 @@ class pos_session(osv.osv): if config_id: pos_config = self.pool.get('pos.config').browse(cr, uid, config_id, context=context) name = pos_config.sequence_id._next() + user_id = values.get('user_id', uid) or uid values.update( name=name, - cash_register_id=self._create_cash_register(cr, uid, pos_config, context=context), + cash_register_id=self._create_cash_register(cr, uid, pos_config, user_id=user_id, context=context), ) else: raise osv.except_osv(_('Error!'), _('There is no POS Config attached to this POS Session')) return super(pos_session, self).create(cr, uid, values, context=context) + def unlink(self, cr, uid, ids, context=None): + for obj in self.browse(cr, uid, ids, context=context): + if obj.cash_register_id: + obj.cash_register_id.unlink(context=context) + return True + + def on_change_config(self, cr, uid, ids, config_id, context=None): + result = dict(value=dict()) + if not config_id: + result['value']['user_id'] = uid + else: + result['value']['user_id'] = self.pool.get('pos.config').browse(cr, uid, config_id, context=context).user_id.id + + return result + def wkf_action_open(self, cr, uid, ids, context=None): # si pas de date start_at, je balance une date, sinon on utilise celle de l'utilisateur for record in self.browse(cr, uid, ids, context=context): @@ -271,7 +289,7 @@ class pos_session(osv.osv): domain = [ ('state', '=', 'open'), ('start_at', '>=', time.strftime('%Y-%m-%d 00:00:00')), - ('config_id.user_id', '=', uid), + ('user_id', '=', uid), ] session_ids = self.search(cr, uid, domain, context=context, limit=1, order='start_at desc') session_id = session_ids[0] if session_ids else False @@ -287,7 +305,7 @@ class pos_session(osv.osv): config = pos_config_proxy.browse(cr, uid, pos_config_ids[0], context=context) values = { - 'state' : 'draft', + 'state' : 'new', 'start_at' : time.strftime('%Y-%m-%d %H:%M:%S'), 'config_id' : config.id, 'journal_id' : config.journal_id.id, @@ -322,22 +340,24 @@ class pos_order(osv.osv): def create_from_ui(self, cr, uid, orders, context=None): #_logger.info("orders: %r", orders) list = [] - session_id = self.pool.get('pos.session').get_current_session() + session_id = self.pool.get('pos.session').get_current_session(cr, uid, context=context) for order in orders: # order :: {'name': 'Order 1329148448062', 'amount_paid': 9.42, 'lines': [[0, 0, {'discount': 0, 'price_unit': 1.46, 'product_id': 124, 'qty': 5}], [0, 0, {'discount': 0, 'price_unit': 0.53, 'product_id': 62, 'qty': 4}]], 'statement_ids': [[0, 0, {'journal_id': 7, 'amount': 9.42, 'name': '2012-02-13 15:54:12', 'account_id': 12, 'statement_id': 21}]], 'amount_tax': 0, 'amount_return': 0, 'amount_total': 9.42} order['session_id'] = session_id order_obj = self.pool.get('pos.order') # get statements out of order because they will be generated with add_payment to ensure # the module behavior is the same when using the front-end or the back-end - statement_ids = order.pop('statement_ids') + if not order['data']['statement_ids']: + continue + statement_ids = order['data'].pop('statement_ids') order_id = self.create(cr, uid, order, context) list.append(order_id) # call add_payment; refer to wizard/pos_payment for data structure # add_payment launches the 'paid' signal to advance the workflow to the 'paid' state data = { 'journal': statement_ids[0][2]['journal_id'], - 'amount': order['amount_paid'], - 'payment_name': order['name'], + 'amount': order['data']['amount_paid'], + 'payment_name': order['data']['name'], 'payment_date': statement_ids[0][2]['name'], } order_obj.add_payment(cr, uid, order_id, data, context=context) @@ -550,6 +570,8 @@ class pos_order(osv.osv): def add_payment(self, cr, uid, order_id, data, context=None): """Create a new payment for the order""" + if not context: + context = {} statement_obj = self.pool.get('account.bank.statement') statement_line_obj = self.pool.get('account.bank.statement.line') prod_obj = self.pool.get('product.product') diff --git a/addons/point_of_sale/point_of_sale_view.xml b/addons/point_of_sale/point_of_sale_view.xml index 96c753fb0e6..188dd603708 100644 --- a/addons/point_of_sale/point_of_sale_view.xml +++ b/addons/point_of_sale/point_of_sale_view.xml @@ -852,7 +852,7 @@
- + @@ -870,6 +870,7 @@ + diff --git a/addons/point_of_sale/security/ir.model.access.csv b/addons/point_of_sale/security/ir.model.access.csv index 9eb77e81244..c0219c40cd5 100644 --- a/addons/point_of_sale/security/ir.model.access.csv +++ b/addons/point_of_sale/security/ir.model.access.csv @@ -32,6 +32,7 @@ access_account_period_pos_manager,account.period pos manager,account.model_accou access_account_fiscalyear_pos_user,account.fiscalyear user,account.model_account_fiscalyear,group_pos_user,1,1,1,0 access_account_fiscalyear_pos_manager,account.fiscalyear manager,account.model_account_fiscalyear,group_pos_manager,1,0,0,0 access_account_cashbox_line,account.cashbox.line,account.model_account_cashbox_line,group_pos_user,1,1,1,0 +access_account_journal_cashbox_line,account.cashbox.journal.line,account.model_account_journal_cashbox_line,group_pos_user,1,1,1,0 access_account_cashbox_line_manager,account.cashbox.line manager,account.model_account_cashbox_line,group_pos_manager,1,1,1,1 access_product_product,product.product,product.model_product_product,group_pos_user,1,0,0,0 access_product_template_pos_user,product.template pos user,product.model_product_template,group_pos_user,1,0,0,0 @@ -64,3 +65,5 @@ access_product_category_manager,product.category manager,product.model_product_c access_product_pricelist_manager,product.pricelist manager,product.model_product_pricelist,group_pos_manager,1,0,0,0 access_product_category_pos_manager,pos.category manager,model_pos_category,group_pos_manager,1,1,1,"1""" access_product_category_pos_user,pos.category user,model_pos_category,group_pos_user,1,0,0,"0""" +access_pos_session_user,pos.session user,model_pos_session,group_pos_user,1,1,1,0 +access_pos_config_user,pos.config user,model_pos_config,group_pos_user,1,1,1,0 \ No newline at end of file diff --git a/addons/point_of_sale/static/src/js/pos_models.js b/addons/point_of_sale/static/src/js/pos_models.js index 8a43677ab5f..ec3d65b9dab 100644 --- a/addons/point_of_sale/static/src/js/pos_models.js +++ b/addons/point_of_sale/static/src/js/pos_models.js @@ -67,7 +67,6 @@ function openerp_pos_models(module, instance){ //module is instance.point_of_sal 'user': {}, 'orders': new module.OrderCollection(), 'products': new module.ProductCollection(), - //'cashRegisters': [], // new module.CashRegisterCollection(this.pos.get('bank_statements')), 'selectedOrder': undefined, }); @@ -85,13 +84,19 @@ function openerp_pos_models(module, instance){ //module is instance.point_of_sal return self.set({'product_list': result}); }); - var bank_def = fetch( - 'account.bank.statement', - ['account_id', 'currency', 'journal_id', 'state', 'name'], - [['state','=','open'], ['user_id', '=', this.session.uid]] - ).then(function(result){ - console.log('bank_statements:',result); - return self.set({'bank_statements': result}); + var session_def = fetch( + 'pos.session', + ['id', 'journal_ids'], + [['state', '=', 'opened'], ['user_id', '=', this.session.uid]] + ).then(function(result) { + console.log('pos_session:', result); + var journal_def = fetch( + 'account.journal', + ['name'], + [['id', 'in', result[0]['journal_ids']]]).then(function(inner_result) { + self.set({'account_journals' : inner_result}); + }); + return self; }); var tax_def = fetch('account.tax', ['amount','price_include','type']) @@ -100,10 +105,10 @@ function openerp_pos_models(module, instance){ //module is instance.point_of_sal return self.set({'taxes': result}); }); - $.when(cat_def,prod_def,bank_def,tax_def,this.get_app_data(), this.flush()) + $.when(cat_def, prod_def, session_def, tax_def, this.get_app_data(), this.flush()) .pipe(_.bind(this.build_tree, this)) .pipe(function(){ - self.set({'cashRegisters': new module.CashRegisterCollection(self.get('bank_statements')) }); + self.set({'accountJournals' : new module.AccountJournalCollection(self.get('account_journals'))}); self.ready.resolve(); }); @@ -248,11 +253,11 @@ function openerp_pos_models(module, instance){ //module is instance.point_of_sal } }); - module.CashRegister = Backbone.Model.extend({ + module.AccountJournal = Backbone.Model.extend({ }); - module.CashRegisterCollection = Backbone.Collection.extend({ - model: module.CashRegister, + module.AccountJournalCollection = Backbone.Collection.extend({ + model: module.AccountJournal, }); module.Product = Backbone.Model.extend({ @@ -380,9 +385,11 @@ function openerp_pos_models(module, instance){ //module is instance.point_of_sal Backbone.Model.prototype.initialize.apply(this, arguments); }, getAmount: function(){ - return this.get('amount'); + // FIXME + return 0.0; //this.get('amount'); }, exportAsJSON: function(){ + // FIXME return { name: instance.web.datetime_to_str(new Date()), statement_id: this.get('id'), @@ -445,9 +452,9 @@ function openerp_pos_models(module, instance){ //module is instance.point_of_sal }, this); } }, - addPaymentLine: function(cashRegister) { + addPaymentLine: function(accountJournal) { var newPaymentline; - newPaymentline = new module.Paymentline(cashRegister); + newPaymentline = new module.Paymentline(accountJournal); /* TODO: Should be 0 for cash-like accounts */ newPaymentline.set({ amount: this.getDueLeft() diff --git a/addons/point_of_sale/static/src/js/pos_widgets.js b/addons/point_of_sale/static/src/js/pos_widgets.js index 2410cb966fe..4bb6ba19f0a 100644 --- a/addons/point_of_sale/static/src/js/pos_widgets.js +++ b/addons/point_of_sale/static/src/js/pos_widgets.js @@ -74,22 +74,22 @@ function openerp_pos_widgets(module, instance){ //module is instance.point_of_sa performPayment: function(event) { if (this.pos.get('selectedOrder').get('screen') === 'receipt') return; - var cashRegister, cashRegisterCollection, cashRegisterId; + var accountJournal, accountJournalCollection, accountJournalId; /* set correct view */ this.pos.screen_selector.set_current_screen('payment'); - cashRegisterId = event.currentTarget.attributes['cash-register-id'].nodeValue; - cashRegisterCollection = this.pos.get('cashRegisters'); - cashRegister = cashRegisterCollection.find(_.bind( function(item) { - return (item.get('id')) === parseInt(cashRegisterId, 10); + accountJournalId = event.currentTarget.attributes['account-journal-id'].nodeValue; + accountRegisterCollection = this.pos.get('accountJournals'); + accountJournal = accountRegisterCollection.find(_.bind(function(item) { + return (item.get('id')) === parseInt(accountJournalId, 10); }, this)); - return (this.pos.get('selectedOrder')).addPaymentLine(cashRegister); + return (this.pos.get('selectedOrder')).addPaymentLine(accountJournal); }, renderElement: function() { this.$element.empty(); - return (this.pos.get('cashRegisters')).each(_.bind( function(cashRegister) { + return (this.pos.get('accountJournals')).each(_.bind(function(accountJournal) { var button = new module.PaymentButtonWidget(); - button.model = cashRegister; + button.model = accountJournal; button.appendTo(this.$element); }, this)); } @@ -100,7 +100,7 @@ function openerp_pos_widgets(module, instance){ //module is instance.point_of_sa renderElement: function() { this.$element.html(this.template_fct({ id: this.model.get('id'), - name: (this.model.get('journal_id'))[1] + name: this.model.get('name') })); return this; } @@ -825,15 +825,6 @@ function openerp_pos_widgets(module, instance){ //module is instance.point_of_sa this.buildWidgets(); instance.webclient.set_content_full_screen(true); - - if (self.pos.get('bank_statements').length === 0) - return new instance.web.Model("ir.model.data").get_func("search_read")([['name', '=', 'action_pos_open_statement']], ['res_id']).pipe( - _.bind(function(res) { - return this.rpc('/web/action/load', {'action_id': res[0]['res_id']}).pipe(_.bind(function(result) { - var action = result.result; - this.do_action(action); - }, this)); - }, this)); }, this)); }, render: function() { @@ -1095,15 +1086,6 @@ function openerp_pos_widgets(module, instance){ //module is instance.point_of_sa }, close: function() { this.pos.barcode_reader.disconnect(); - - return new instance.web.Model("ir.model.data").get_func("search_read")([['name', '=', 'action_pos_close_statement']], ['res_id']).pipe( - _.bind(function(res) { - return this.rpc('/web/action/load', {'action_id': res[0]['res_id']}).pipe(_.bind(function(result) { - var action = result.result; - action.context = _.extend(action.context || {}, {'cancel_action': {type: 'ir.actions.client', tag: 'default_home'}}); - this.do_action(action); - }, this)); - }, this)); }, destroy: function() { instance.webclient.set_content_full_screen(false); diff --git a/addons/point_of_sale/static/src/xml/pos.xml b/addons/point_of_sale/static/src/xml/pos.xml index 34d6bda0518..07b86ed39eb 100644 --- a/addons/point_of_sale/static/src/xml/pos.xml +++ b/addons/point_of_sale/static/src/xml/pos.xml @@ -350,7 +350,7 @@ -