From 6cefb2c802c9a803711a38bef35d6da87afbbcae Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Mon, 7 May 2012 15:09:46 +0200 Subject: [PATCH] [FIX] point_of_sale: Fix some bugs bzr revid: stw@openerp.com-20120507130946-13i3yq82oi69zjjt --- .../point_of_sale/account_bank_statement.py | 15 ++++++ addons/point_of_sale/point_of_sale.py | 47 +++++++++++++++---- addons/point_of_sale/point_of_sale_view.xml | 9 ++-- addons/point_of_sale/wizard/pos_confirm.py | 2 +- addons/point_of_sale/wizard/pos_payment.py | 22 +++++++-- addons/point_of_sale/wizard/pos_payment.xml | 3 +- 6 files changed, 77 insertions(+), 21 deletions(-) diff --git a/addons/point_of_sale/account_bank_statement.py b/addons/point_of_sale/account_bank_statement.py index ab03b61ba43..786d4629cd4 100644 --- a/addons/point_of_sale/account_bank_statement.py +++ b/addons/point_of_sale/account_bank_statement.py @@ -74,6 +74,21 @@ class account_cash_statement(osv.osv): res.sort() return res + def search(self, cr, uid, domain, offset=0, limit=None, order=None, context=None, count=False): + if not context: + context = {} + import pdb + pdb.set_trace() + pos_session_id = context.pop('pos_session_id', False) or False + if pos_session_id and isinstance(pos_session_id, (int, long)): + session = self.pool.get('pos.session').browse(cr, uid, pos_session_id, context=context) + return [ + statement.id + for order in session.order_ids + for statement in order.statement_ids + ] + return super(account_cash_statement, self).search(cr, uid, domain, offset=offset, limit=limit, order=order, context=context, count=count) + account_cash_statement() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py index 877da092468..cbc83b951cf 100644 --- a/addons/point_of_sale/point_of_sale.py +++ b/addons/point_of_sale/point_of_sale.py @@ -151,7 +151,15 @@ pos_config() class pos_session(osv.osv): _name = 'pos.session' + #"status [BUTTON TEXT]" -> utiliser + # "opening control (open) -> opened (cashbox control) -> closing control (close) -> closed & posted" POS_SESSION_STATE = [('new', 'New'),('opened', 'Opened'),('closed', 'Closed'),('posted', 'Posted')] + #POS_SESSION_STATE = [ + # ('new', 'Opening Control'), + # ('opened', 'Opened'), + # ('closed', 'Closing Control'), + # ('posted', 'Closed & Posted'), + #] _columns = { 'config_id' : fields.many2one('pos.config', 'PoS', required=True, select=1, domain="[('state', '=', 'active')]"), @@ -168,6 +176,7 @@ class pos_session(osv.osv): 'details_ids' : fields.related('cash_register_id', 'details_ids', type='one2many', relation='account.cashbox.line', string='CashBox Lines'), + 'order_ids' : fields.one2many('pos.order', 'session_id', 'Orders'), } _defaults = { @@ -180,7 +189,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, name, context=None): + def _create_cash_register(self, cr, uid, pos_config, context=None): if not pos_config: return False @@ -196,7 +205,6 @@ class pos_session(osv.osv): return False values = { - 'name' : name, 'journal_id' : journal_id, } cash_register_id = proxy.create(cr, uid, values, context=context) @@ -211,7 +219,7 @@ class pos_session(osv.osv): name = pos_config.sequence_id._next() values.update( name=name, - cash_register_id=self._create_cash_register(cr, uid, pos_config, name, context=context), + cash_register_id=self._create_cash_register(cr, uid, pos_config, context=context), ) else: raise osv.except_osv(_('Error!'), _('There is no POS Config attached to this POS Session')) @@ -228,14 +236,33 @@ class pos_session(osv.osv): record.write(values, context=context) + record.cash_register_id.button_open(context=context) + return True def wkf_action_close(self, cr, uid, ids, context=None): + # Close CashBox + record.cash_register_id.button_confirm_cash(context=context) return self.write(cr, uid, ids, {'state' : 'close', 'stop_at' : time.strftime('%Y-%m-%d %H:%M:%S')}, context=context) def wkf_action_post(self, cr, uid, ids, context=None): + self._confirm_orders(cr, uid, ids, context=context) return self.write(cr, uid, ids, {'state' : 'post'}, context=context) + def _confirm_orders(self, cr, uid, ids, context=None): + wf_service = netsvc.LocalService("workflow") + + for session in self.browse(cr, uid, ids, context=context): + for order in session.order_ids: + if order.state != 'paid': + raise osv.except_osv( + _('Error !'), + _("You can not confirm all orders of this session, because they have not the 'paid' status")) + else: + wf_service.trg_validate(uid, 'pos.order', order.id, 'done', cr) + + return True + def get_current_session(self, cr, uid, context=None): current_user = self.pool.get('res.users').browse(cr, uid, uid, context=context) domain = [ @@ -295,6 +322,7 @@ class pos_order(osv.osv): session_id = self.pool.get('pos.session').get_current_session() 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 @@ -547,11 +575,14 @@ class pos_order(osv.osv): msg = _('There is no receivable account defined to make payment for the partner: "%s" (id:%d)') % (order.partner_id.name, order.partner_id.id,) raise osv.except_osv(_('Configuration Error !'), msg) - statement_id = statement_obj.search(cr,uid, [ - ('journal_id', '=', int(data['journal'])), - ('company_id', '=', curr_company), - ('user_id', '=', uid), - ('state', '=', 'open')], context=context) + context.pop('pos_session_id', False) + domain = [ + ('journal_id', '=', int(data['journal'])), + ('company_id', '=', curr_company), + ('user_id', '=', uid), + ('state', '=', 'open') + ] + statement_id = statement_obj.search(cr,uid, domain, context=context) if len(statement_id) == 0: raise osv.except_osv(_('Error !'), _('You have to open at least one cashbox')) if statement_id: diff --git a/addons/point_of_sale/point_of_sale_view.xml b/addons/point_of_sale/point_of_sale_view.xml index c8a666f4a52..96c753fb0e6 100644 --- a/addons/point_of_sale/point_of_sale_view.xml +++ b/addons/point_of_sale/point_of_sale_view.xml @@ -923,7 +923,7 @@ - Point of Sales Session + PoS Sessions ir.actions.act_window pos.session form @@ -943,15 +943,14 @@ src_model="pos.session" res_model="pos.order" domain="[('session_id', '=', active_id)]" /> - + domain="[]" + context="{'pos_session_id' : active_id}" /> pos.order.list.select diff --git a/addons/point_of_sale/wizard/pos_confirm.py b/addons/point_of_sale/wizard/pos_confirm.py index 4f77774171a..fc244c1cb00 100644 --- a/addons/point_of_sale/wizard/pos_confirm.py +++ b/addons/point_of_sale/wizard/pos_confirm.py @@ -34,7 +34,7 @@ class pos_confirm(osv.osv_memory): for order in order_obj.browse(cr, uid, ids, context=context): todo = True for line in order.statement_ids: - if line.statement_id.state <> 'confirm': + if line.statement_id.state != 'confirm': todo = False break if todo: diff --git a/addons/point_of_sale/wizard/pos_payment.py b/addons/point_of_sale/wizard/pos_payment.py index e72c5bf649a..b23318f9762 100644 --- a/addons/point_of_sale/wizard/pos_payment.py +++ b/addons/point_of_sale/wizard/pos_payment.py @@ -32,6 +32,8 @@ class account_journal(osv.osv): def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False): if not context: context = {} + import pdb + pdb.set_trace() session_id = context.get('pos_session_id', False) or False @@ -44,6 +46,8 @@ class account_journal(osv.osv): return super(account_journal, self).search(cr, uid, args, offset=offset, limit=limit, order=order, context=context, count=count) +account_journal() + class pos_make_payment(osv.osv_memory): _name = 'pos.make.payment' _description = 'Point of Sale Payment' @@ -61,7 +65,7 @@ class pos_make_payment(osv.osv_memory): amount = order.amount_total - order.amount_paid data = self.read(cr, uid, ids, context=context)[0] # this is probably a problem of osv_memory as it's not compatible with normal OSV's - #data['journal'] = data['journal'][0] + data['journal'] = data['journal_id'][0] if amount != 0.0: order_obj.add_payment(cr, uid, active_id, data, context=context) @@ -95,8 +99,17 @@ class pos_make_payment(osv.osv_memory): } def _default_journal(self, cr, uid, context=None): - res = pos_box_entries.get_journal(self, cr, uid, context=context) - return len(res)>1 and res[1][0] or False + if not context: + context = {} + pos_session_id = context.get('pos_session_id', False) or False + + if isinstance(pos_session_id, (long, int)): + session = self.pool.get('pos.session').browse(cr, uid, pos_session_id, context=context) + for journal in session.config_id.journal_ids: + if journal.type == 'cash': + return journal.id + + return False def _default_amount(self, cr, uid, context=None): order_obj = self.pool.get('pos.order') @@ -107,16 +120,15 @@ class pos_make_payment(osv.osv_memory): return False _columns = { - #'journal': fields.selection(pos_box_entries.get_journal, "Payment Mode", required=True), 'journal_id' : fields.many2one('account.journal', 'Payment Mode', required=True), 'amount': fields.float('Amount', digits=(16,2), required= True), 'payment_name': fields.char('Payment Reference', size=32), 'payment_date': fields.date('Payment Date', required=True), } _defaults = { + 'journal_id' : _default_journal, 'payment_date': time.strftime('%Y-%m-%d %H:%M:%S'), 'amount': _default_amount, - #'journal': _default_journal } pos_make_payment() diff --git a/addons/point_of_sale/wizard/pos_payment.xml b/addons/point_of_sale/wizard/pos_payment.xml index 84c0cdfb5df..6d450f93043 100644 --- a/addons/point_of_sale/wizard/pos_payment.xml +++ b/addons/point_of_sale/wizard/pos_payment.xml @@ -10,8 +10,7 @@
- - +