diff --git a/addons/point_of_sale/__terp__.py b/addons/point_of_sale/__terp__.py index 82c1e5a31da..3127af647df 100644 --- a/addons/point_of_sale/__terp__.py +++ b/addons/point_of_sale/__terp__.py @@ -50,6 +50,7 @@ Main features : 'wizard/pos_open_statement.xml', 'wizard/pos_close_statement.xml', 'wizard/pos_box_entries.xml', + 'wizard/pos_box_out.xml', 'pos_view.xml', 'pos_sequence.xml', 'posrule_data.xml', diff --git a/addons/point_of_sale/pos_view.xml b/addons/point_of_sale/pos_view.xml index 265bdb6d836..0a72e5f1a50 100644 --- a/addons/point_of_sale/pos_view.xml +++ b/addons/point_of_sale/pos_view.xml @@ -844,17 +844,17 @@ invoiced string="Refloat" action="action_box_entries" id="menu_wizard_enter_jrnl" sequence="3" /> - + id="pos_entries2"/>--> diff --git a/addons/point_of_sale/wizard/__init__.py b/addons/point_of_sale/wizard/__init__.py index 17ddf3c5c61..641736a3460 100644 --- a/addons/point_of_sale/wizard/__init__.py +++ b/addons/point_of_sale/wizard/__init__.py @@ -22,7 +22,6 @@ import wizard_pos_payment import wizard_default_journal -import wizard_refund_order import wizard_scan_product import wizard_receipt import wizard_return @@ -42,5 +41,6 @@ import pos_get_sale import pos_open_statement import pos_close_statement import pos_box_entries +import pos_box_out # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/point_of_sale/wizard/pos_box_entries.py b/addons/point_of_sale/wizard/pos_box_entries.py index c33bc13a285..7ef9eed6634 100644 --- a/addons/point_of_sale/wizard/pos_box_entries.py +++ b/addons/point_of_sale/wizard/pos_box_entries.py @@ -26,28 +26,29 @@ from tools.misc import UpdateableStr from mx import DateTime from tools.translate import _ - -class pos_box_entries(osv.osv_memory): - _name = 'pos.box.entries' - _description = 'Pos Box Entries' - - def _get_journal(self,cr,uid,context): - """ +def get_journal(self,cr,uid,context): + """ @summary: Make the selection list of Cash Journal . @param self: The object pointer. @param cr: A database cursor @param uid: ID of the user currently logged in @param context: A standard dictionary @return :Return the list of journal - """ + """ - obj = self.pool.get('account.journal') - user = self.pool.get('res.users').browse(cr, uid, uid) - ids = obj.search(cr, uid, [('type', '=', 'cash'), ('company_id', '=', user.company_id.id)]) - res = obj.read(cr, uid, ids, ['id', 'name'], context) - res = [(r['id'], r['name']) for r in res] - res.insert(0, ('', '')) - return res + obj = self.pool.get('account.journal') + user = self.pool.get('res.users').browse(cr, uid, uid) + ids = obj.search(cr, uid, [('type', '=', 'cash'), ('company_id', '=', user.company_id.id)]) + res = obj.read(cr, uid, ids, ['id', 'name'], context) + res = [(r['id'], r['name']) for r in res] + res.insert(0, ('', '')) + return res + +class pos_box_entries(osv.osv_memory): + _name = 'pos.box.entries' + _description = 'Pos Box Entries' + + def _get_income_product(self,cr,uid,context): @@ -70,7 +71,7 @@ class pos_box_entries(osv.osv_memory): _columns = { 'name': fields.char('Name', size=32,required=True), - 'journal_id': fields.selection(_get_journal, "Journal",required=True), + 'journal_id': fields.selection(get_journal, "Journal",required=True), 'product_id': fields.selection(_get_income_product, "Operation",required=True), 'amount' :fields.float('Amount', digits=(16,2)), 'ref':fields.char('Ref', size=32), diff --git a/addons/point_of_sale/wizard/pos_box_out.py b/addons/point_of_sale/wizard/pos_box_out.py new file mode 100644 index 00000000000..c2dcec98a49 --- /dev/null +++ b/addons/point_of_sale/wizard/pos_box_out.py @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +import netsvc +from osv import osv,fields +from tools.translate import _ +from tools.misc import UpdateableStr +from mx import DateTime +from tools.translate import _ +import pos_box_entries +print dir(pos_box_entries) + +class pos_box_out(osv.osv_memory): + _name = 'pos.box.out' + _description = 'Pos Box Out' + + def _get_expense_product(self,cr,uid,context): + + """ + @summary: Make the selection list of expense product. + @param self: The object pointer. + @param cr: A database cursor + @param uid: ID of the user currently logged in + @param context: A standard dictionary + @return :Return of operation of product + """ + obj = self.pool.get('product.product') + company_id = self.pool.get('res.users').browse(cr, uid, uid).company_id.id + ids = obj.search(cr, uid, ['&', ('expense_pdt', '=', True), '|', ('company_id', '=', company_id), ('company_id', '=', None)]) + res = obj.read(cr, uid, ids, ['id', 'name'], context) + res = [(r['id'], r['name']) for r in res] + res.insert(0, ('', '')) + return res + + _columns = { + 'name': fields.char('Name', size=32,required=True), + 'journal_id': fields.selection(pos_box_entries.get_journal, "Journal",required=True), + 'product_id': fields.selection(_get_expense_product, "Operation",required=True), + 'amount' :fields.float('Amount', digits=(16,2)), + 'ref':fields.char('Ref', size=32), + } + _defaults = { + 'journal_id': lambda *a: 1, + 'product_id': lambda *a: 1, + } + def get_out(self, cr, uid, ids, context): + + """ + @summary: Create the entries in the CashBox . + @param self: The object pointer. + @param cr: A database cursor + @param uid: ID of the user currently logged in + @param context: A standard dictionary + @return :Return of operation of product + """ + args = {} + statement_obj= self.pool.get('account.bank.statement') + statement_line_obj=self.pool.get('account.bank.statement.line') + product_obj= self.pool.get('product.template') + productp_obj= self.pool.get('product.product') + res_obj = self.pool.get('res.users') + for data in self.read(cr, uid, ids): + + curr_company = res_obj.browse(cr,uid,uid).company_id.id + statement_id = statement_obj.search(cr,uid, [('journal_id','=',data['journal_id']),('company_id','=',curr_company),('user_id','=',uid),('state','=','open')]) + monday = (DateTime.now() + DateTime.RelativeDateTime(weekday=(DateTime.Monday,0))).strftime('%Y-%m-%d') + sunday = (DateTime.now() + DateTime.RelativeDateTime(weekday=(DateTime.Sunday,0))).strftime('%Y-%m-%d') + done_statmt = statement_obj.search(cr,uid, [('date','>=',monday+' 00:00:00'),('date','<=',sunday+' 23:59:59'),('journal_id','=',data['journal_id']),('company_id','=',curr_company),('user_id','=',uid)]) + stat_done = statement_obj.browse(cr,uid, done_statmt) + address_u = res_obj.browse(cr,uid,uid).address_id + am = 0.0 + + amount_check = productp_obj.browse(cr,uid,data['product_id']).am_out or False + for st in stat_done: + for s in st.line_ids: + if address_u and s.partner_id==address_u.partner_id and s.am_out: + am+=s.amount + if (-data['amount'] or 0.0)+ am <-(res_obj.browse(cr,uid,uid).company_id.max_diff or 0.0) and amount_check: + val = (res_obj.browse(cr,uid,uid).company_id.max_diff or 0.0)+ am + raise osv.except_osv(_('Error !'), _('The maximum value you can still withdraw is exceeded. \n Remaining value is equal to %d ')%(val)) + + acc_id = product_obj.browse(cr,uid,data['product_id']).property_account_income + if not acc_id: + raise osv.except_osv(_('Error !'), _('please check that account is set to %s')%(product_obj.browse(cr,uid,data['product_id']).name)) + if not statement_id: + raise osv.except_osv(_('Error !'), _('You have to open at least one cashbox')) + if statement_id: + statement_id = statement_id[0] + if not statement_id: + statement_id = statement_obj.create(cr,uid,{'date':time.strftime('%Y-%m-%d 00:00:00'), + 'journal_id':data['journal_id'], + 'company_id':curr_company, + 'user_id':uid, + }) + args['statement_id']= statement_id + args['journal_id']= data['journal_id'] + if acc_id: + args['account_id']= acc_id.id + amount= data['amount'] or 0.0 + if data['amount'] > 0: + amount= -data['amount'] + args['amount'] = amount + if productp_obj.browse(cr,uid,data['product_id']).am_out: + args['am_out'] = True + args['ref'] = data['ref'] or '' + args['name'] = "%s: %s "%(product_obj.browse(cr,uid,data['product_id']).name, data['name'].decode('utf8')) + address_u = res_obj.browse(cr,uid,uid).address_id + if address_u: + partner_id = address_u.partner_id and address_u.partner_id.id or None + args['partner_id'] = partner_id + statement_line_id = statement_line_obj.create(cr, uid, args) + return {} + +pos_box_out() \ No newline at end of file diff --git a/addons/point_of_sale/wizard/pos_box_out.xml b/addons/point_of_sale/wizard/pos_box_out.xml new file mode 100644 index 00000000000..c634b4cf997 --- /dev/null +++ b/addons/point_of_sale/wizard/pos_box_out.xml @@ -0,0 +1,38 @@ + + + + + + + Box Out + pos.box.out + form + +
+ + + + + + + +