[FIX] point_of_sale: Fix some bugs

bzr revid: stw@openerp.com-20120507130946-13i3yq82oi69zjjt
This commit is contained in:
Stephane Wirtel 2012-05-07 15:09:46 +02:00
parent d7b5e5a6ef
commit 6cefb2c802
6 changed files with 77 additions and 21 deletions

View File

@ -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:

View File

@ -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:

View File

@ -923,7 +923,7 @@
<record model="ir.actions.act_window" id="action_pos_session">
<field name="name">Point of Sales Session</field>
<field name="name">PoS Sessions</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">pos.session</field>
<field name="view_type">form</field>
@ -943,15 +943,14 @@
src_model="pos.session"
res_model="pos.order"
domain="[('session_id', '=', active_id)]" />
<!--
TODO
<act_window
id="act_pos_session_statements"
name="Statements"
src_model="pos.session"
res_model="account.bank.statement"
domain="[]" />
-->
domain="[]"
context="{'pos_session_id' : active_id}" />
<record id="view_pos_order_filter" model="ir.ui.view">
<field name="name">pos.order.list.select</field>

View File

@ -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:

View File

@ -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()

View File

@ -10,8 +10,7 @@
<form string="Add payment :">
<group colspan="4" col="4" >
<group colspan="4">
<!--<field name="journal"/>-->
<field name="journal_id" widget="selection" />
<field name="journal_id" />
<field name="amount" />
<field name="payment_name"/>
</group>