diff --git a/addons/point_of_sale/__init__.py b/addons/point_of_sale/__init__.py index 5f6680b869c..ddd7dc3c01f 100644 --- a/addons/point_of_sale/__init__.py +++ b/addons/point_of_sale/__init__.py @@ -21,6 +21,7 @@ ############################################################################## import pos +import account_bank_statement import pos_account_bank_statement import stock import wizard diff --git a/addons/point_of_sale/account_bank_statement.py b/addons/point_of_sale/account_bank_statement.py new file mode 100644 index 00000000000..f40be32de80 --- /dev/null +++ b/addons/point_of_sale/account_bank_statement.py @@ -0,0 +1,248 @@ +# encoding: utf-8 +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2008 PC Solutions (). All Rights Reserved +# $Id$ +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################################## + +from osv import osv, fields +import time +from mx import DateTime +from decimal import Decimal +from tools.translate import _ + + +class account_journal(osv.osv): + + _inherit = 'account.journal' + _columns = { + 'auto_cash': fields.boolean('Automatic Opening', help="This field authorize the automatic creation of the cashbox"), + 'special_journal':fields.boolean('Special Journal', help="Will put all the orders in waiting status till being accepted"), + 'check_dtls': fields.boolean('Check Details', help="This field authorize Validation of Cashbox without checking ending details"), + 'statement_sequence_id': fields.many2one('ir.sequence', 'Statement Sequence', \ + help="The sequence used for statement numbers in this journal."), + } + _defaults = { + 'check_dtls': lambda *a:True, + 'auto_cash': lambda *a:True, + } +account_journal() + + +class singer_statement(osv.osv): + + """ Singer Statements """ + + _name = 'singer.statement' + _description = 'Statements' + + def _sub_total(self, cr, uid, ids, name, arg, context=None): + + """ Calculates Sub total" + @param name: Names of fields. + @param arg: User defined arguments + @return: Dictionary of values. + """ + res = {} + for obj in self.browse(cr, uid, ids): + res[obj.id] = obj.pieces * obj.number + return res + + def on_change_sub(self, cr, uid, ids, pieces, number,*a): + + """ Calculates Sub total on change of number + @param pieces: Names of fields. + @param number: + """ + sub=pieces*number + return {'value':{'subtotal': sub or 0.0}} + + _columns = { + 'pieces': fields.float('Values', digits=(16,2)), + 'number': fields.integer('Number'), + 'subtotal': fields.function(_sub_total, method=True, string='Sub Total', type='float',digits=(16,2)), + 'starting_id': fields.many2one('account.bank.statement',ondelete='cascade'), + 'ending_id': fields.many2one('account.bank.statement',ondelete='cascade'), + } + +singer_statement() + +class account_bank_statement(osv.osv): + + _inherit = 'account.bank.statement' + + def _get_starting_balance(self, cr, uid, ids, name, arg, context=None): + + """ Find starting balance " + @param name: Names of fields. + @param arg: User defined arguments + @return: Dictionary of values. + """ + res ={} + for statement in self.browse(cr, uid, ids): + amount_total=0.0 + for line in statement.starting_details_ids: + amount_total+= line.pieces * line.number + res[statement.id]=amount_total + return res + + def _get_sum_entry_encoding(self, cr, uid, ids, name, arg, context=None): + + """ Find encoding total of statements " + @param name: Names of fields. + @param arg: User defined arguments + @return: Dictionary of values. + """ + res2={} + for statement in self.browse(cr, uid, ids): + encoding_total=0.0 + for line in statement.line_ids: + encoding_total+= line.amount + res2[statement.id]=encoding_total + return res2 + + def _default_journal_id(self, cr, uid, context={}): + + """ To get default journal for the object" + @param name: Names of fields. + @return: journal + """ + company_id = self.pool.get('res.users').browse(cr, uid, uid).company_id.id + journal = self.pool.get('account.journal').search(cr, uid, [('type', '=', 'cash'), ('auto_cash','=',False), ('company_id', '=', company_id)]) + if journal: + return journal[0] + else: + return False + + _columns = { + 'journal_id': fields.many2one('account.journal', 'Journal', required=True), + 'balance_start': fields.function(_get_starting_balance, method=True, string='Starting Balance', type='float',digits=(16,2)), + 'state': fields.selection([('draft', 'Draft'),('confirm', 'Confirm'),('open','Open')], + 'State', required=True, states={'confirm': [('readonly', True)]}, readonly="1"), + 'total_entry_encoding':fields.function(_get_sum_entry_encoding, method=True, string="Total of Entry encoding"), + 'date':fields.datetime("Opening Date"), + 'closing_date':fields.datetime("Closing Date"), + 'starting_details_ids': fields.one2many('singer.statement', 'starting_id', string='Starting Details'), + 'ending_details_ids': fields.one2many('singer.statement', 'ending_id', string='Ending Details'), + 'name': fields.char('Name', size=64, required=True, readonly=True), + + } + _defaults = { + 'state': lambda *a: 'draft', + 'name': lambda *a: '/', + 'date': lambda *a:time.strftime("%Y-%m-%d %H:%M:%S"), + 'journal_id': _default_journal_id, + + } + + def create(self, cr, uid, vals, context=None): + + company_id = vals and vals.get('company_id',False) + if company_id: + open_jrnl = self.search(cr, uid, [('company_id', '=', vals['company_id']), ('journal_id', '=', vals['journal_id']), ('state', '=', 'open')]) + if open_jrnl: + raise osv.except_osv('Error', u'Une caisse de type espèce est déjà ouverte') + if 'starting_details_ids' in vals: + vals['starting_details_ids'] = starting_details_ids = map(list, vals['starting_details_ids']) + for i in starting_details_ids: + if i and i[0] and i[1]: + i[0], i[1] = 0, 0 + res = super(account_bank_statement, self).create(cr, uid, vals, context=context) + return res + + def onchange_journal_id(self, cursor, user, statement_id, journal_id, context=None): + + """ Changes balance start and starting details if journal_id changes" + @param statement_id: Changed statement_id + @param journal_id: Changed journal_id + @return: Dictionary of changed values + """ + id_s=[] + if not journal_id: + return {'value': {'balance_start': 0.0}} + balance_start=0.0 + cash_obj = self.pool.get('singer.statement') + statement_obj = self.pool.get('account.bank.statement') + cursor.execute("Select a.id from account_bank_statement a where journal_id=%d and user_id=%d order by a.id desc limit 1"%(journal_id,user)) + res2=cursor.fetchone() + res2=res2 and res2[0] or None + if res2: + statmt_id=statement_obj.browse(cursor,user,res2) + check_det=statmt_id.journal_id.check_dtls + if not check_det: + balance_start=statmt_id.balance_end_real or 0.0 + return {'value': {'balance_start': balance_start}} + cursor.execute("Select a.id from account_bank_statement a, singer_statement s where journal_id=%d and user_id=%d order by a.id desc limit 1"%(journal_id,user)) + res1=cursor.fetchone() + res1=res1 and res1[0] or None + if res1: + cursor.execute("Select sum(ss.pieces*ss.number),ss.ending_id from singer_statement ss, account_bank_statement s where ss.ending_id=s.id and s.journal_id=%d and s.user_id=%d and s.id=%d group by ss.ending_id,s.id order by s.id desc"%(journal_id,user, res1)) + res = cursor.fetchone() + balance_start = res and res[0] or 0.0 + cash_end=res and res[1] or None + id_s=statement_obj.browse(cursor,user,cash_end).ending_details_ids + new=[] + if id_s: + for s in id_s: + new.append(s.id) + return {'value': {'balance_start': balance_start, 'starting_details_ids':new}} + + def button_open(self, cr, uid, ids, context=None): + + """ Changes statement state to Running. + @return: True + """ + obj_inv = self.browse(cr, uid, ids)[0] + s_id=obj_inv.journal_id + if s_id.statement_sequence_id: + s_id=s_id.id + number = self.pool.get('ir.sequence').get_id(cr, uid, s_id) + else: + number = self.pool.get('ir.sequence').get(cr, uid, + 'account.bank.statement') + + self.write(cr, uid, ids, {'date':time.strftime("%Y-%m-%d %H:%M:%S"), 'state':'open', 'name':number}) + return True + + def button_confirm(self, cr, uid, ids, context=None): + + """ Check the starting and ending detail of statement + @return: True + """ + val = 0.0 + val2 = 0.0 + val_statement_line = 0.0 + diff = self.pool.get('res.users').browse(cr,uid,uid).company_id.max_diff or 0.0 + for statement in self.browse(cr, uid, ids): + bal = statement.balance_end + bal_st=statement.balance_start + for st in statement.line_ids: + val_statement_line += st.amount + for stat in statement.starting_details_ids: + val2 += stat.subtotal + for stat in statement.ending_details_ids: + val += stat.subtotal + if statement.journal_id.check_dtls: + if Decimal(str(val)).quantize(Decimal('.001')) != (Decimal(str(val_statement_line)) + Decimal(str(val2))).quantize(Decimal('.001')): + raise osv.except_osv(_('Invalid action !'), _(' You can not confirm your cashbox, Please enter ending details, missing value matches to "%s"')%(abs(Decimal(str(val))-(Decimal(str(val_statement_line))+Decimal(str(val2)))))) + + self.write(cr, uid, statement.id, {'balance_end_real':Decimal(str(val_statement_line))+Decimal(str(val2)),'closing_date':time.strftime("%Y-%m-%d %H:%M:%S"),'state':'draft'}) + return super(account_bank_statement, self).button_confirm(cr, uid, ids, context=None) + +account_bank_statement() +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/point_of_sale/pos.py b/addons/point_of_sale/pos.py index c996ba48c21..58838e38743 100644 --- a/addons/point_of_sale/pos.py +++ b/addons/point_of_sale/pos.py @@ -227,6 +227,12 @@ class pos_order(osv.osv): res[order.id] = val return res +# def payment_get(self, cr, uid, ids, context=None): +# """ Calculates Total Returned from the order +# @return: Dictionary of values """ +# cr.execute("select id from pos_payment where order_id =ANY(%s)",(ids,)) +# return [i[0] for i in cr.fetchall()] + def _sale_journal_get(self, cr, uid, context): """ To get sale journal for this order" @@ -247,6 +253,7 @@ class pos_order(osv.osv): company = self.pool.get('res.users').browse(cr, uid, uid, context).company_id res = self.pool.get('sale.shop').search(cr, uid, []) + # res = self.pool.get('sale.shop').search(cr, uid, [('company_id', '=', company.id)]) if res: return res[0] else: @@ -338,14 +345,24 @@ class pos_order(osv.osv): 'first_name': fields.char('First Name', size=64), 'state_2': fields.function(_get_v,type='selection',selection=[('to_verify', 'To Verify'), ('accepted', 'Accepted'), ('refused', 'Refused')], string='State', readonly=True, method=True, store=True), + + # 'last_name': fields.char('Last Name', size=64), + # 'street': fields.char('Street', size=64), + # 'zip2': fields.char('Zip', size=64), + # 'city': fields.char('City', size=64), + # 'mobile': fields.char('Mobile', size=64), + # 'email': fields.char('Email', size=64), 'note': fields.text('Internal Notes'), 'nb_print': fields.integer('Number of Print', readonly=True), 'sale_journal': fields.many2one('account.journal', 'Journal', required=True, states={'draft': [('readonly', False)]}, readonly=True, ), + # 'account_receivable': fields.many2one('account.account', + # 'Default Receivable', required=True, states={'draft': [('readonly', False)]}, + # readonly=True, ), 'invoice_wanted': fields.boolean('Create Invoice'), 'note_2': fields.char('Customer Note',size=64), 'type_rec': fields.char('Type of Receipt',size=64), 'remboursed': fields.boolean('Remboursed'), - 'contract_number': fields.char('Contact Number', size=512, select=1), + 'contract_number': fields.char('Contract Number', size=512, select=1), 'journal_entry': fields.boolean('Journal Entry'), } @@ -526,6 +543,7 @@ class pos_order(osv.osv): cr.execute("select s.id from stock_location s, stock_warehouse w where w.lot_stock_id=s.id and w.id= %d "%(order.shop_id.warehouse_id.id)) res=cr.fetchone() location_id=res and res[0] or None +# location_id = order and order.shop_id and order.shop_id.warehouse_id and order.shop_id.warehouse_id.lot_stock_id.id or None stock_dest_id = int(val.split(',')[1]) if line.qty < 0: location_id, stock_dest_id = stock_dest_id, location_id @@ -984,7 +1002,9 @@ class pos_order(osv.osv): 'statement_id': False, 'account_id':order_account }) + # account_move_obj.button_validate(cr, uid, [move_id, payment_move_id], context=context) self.write(cr,uid,order.id,{'state':'done'}) + # account_move_line_obj.reconcile(cr, uid, to_reconcile, type='manual', context=context) return True def cancel_picking(self, cr, uid, ids, context=None): @@ -1025,6 +1045,7 @@ class pos_order(osv.osv): for order in self.browse(cr, uid, ids, context=context): if not order.journal_entry: self.create_account_move(cr, uid, ids, context={}) + #self.write(cr, uid, ids, {'state': 'done'}) return True def compute_state(self, cr, uid, id): @@ -1038,6 +1059,31 @@ class pos_order(osv.osv): pos_order() +class account_bank_statement(osv.osv): + _inherit = 'account.bank.statement' + _columns={ + 'user_id': fields.many2one('res.users',ondelete='cascade',string='User', readonly=True), + } + _defaults = { + 'user_id': lambda self,cr,uid,c: self.pool.get('res.users').browse(cr, uid, uid, c).id + } +account_bank_statement() + +class account_bank_statement_line(osv.osv): + _inherit = 'account.bank.statement.line' + def _get_statement_journal(self, cr, uid, ids, context, *a): + res = {} + for line in self.browse(cr, uid, ids): + res[line.id] = line.statement_id and line.statement_id.journal_id and line.statement_id.journal_id.name or None + return res + _columns={ + 'journal_id': fields.function(_get_statement_journal, method=True,store=True, string='Journal', type='char', size=64), + 'am_out':fields.boolean("To count"), + 'is_acc':fields.boolean("Is accompte"), + 'pos_statement_id': fields.many2one('pos.order',ondelete='cascade'), + } +account_bank_statement_line() + class pos_order_line(osv.osv): _name = "pos.order.line" _description = "Lines of Point of Sale" @@ -1073,6 +1119,7 @@ class pos_order_line(osv.osv): price = self.price_by_product(cr, uid, ids, line.order_id.pricelist_id.id, line.product_id.id, line.qty, line.order_id.partner_id.id) if line.discount!=0.0: res[line.id] = line.price_unit * line.qty * (1 - (line.discount or 0.0) / 100.0) +# res[line.id] = price * line.qty * (1 - (line.discount or 0.0) / 100.0) else: res[line.id]=line.price_unit*line.qty return res @@ -1145,7 +1192,9 @@ class pos_order_line(osv.osv): 'company_id':fields.many2one('res.company', 'Company', required=True), 'notice': fields.char('Discount Notice', size=128, required=True), 'serial_number': fields.char('Serial Number', size=128), +# 'contract_number': fields.char('Contract Number', size=512), 'product_id': fields.many2one('product.product', 'Product', domain=[('sale_ok', '=', True)], required=True, change_default=True), +# 'price_unit': fields.float('Unit Price'), 'price_unit': fields.function(_get_amount, method=True, string='Unit Price', store=True), 'price_ded': fields.float('Discount(Amount)'), 'qty': fields.float('Quantity'), @@ -1273,6 +1322,44 @@ class pos_payment(osv.osv): pos_payment() +class account_move_line(osv.osv): + _inherit = 'account.move.line' + def create(self, cr, user, vals, context={}): + pos_obj = self.pool.get('pos.order') + val_name = vals.get('name', '') + val_ref = vals.get('ref', '') + if (val_name and 'POS' in val_name) and (val_ref and 'PACK' in val_ref): + aaa = re.search(r'Stock move.\((.*)\)', vals.get('name')) + name_pos = aaa.groups()[0] + pos_id = name_pos.replace('POS ','') + if pos_id and pos_id.isdigit(): + pos_curr = pos_obj.browse(cr,user,int(pos_id)) + pos_curr = pos_curr and pos_curr.contract_number or '' + vals['ref'] = pos_curr or vals.get('ref') + return super(account_move_line, self).create(cr, user, vals, context) + +account_move_line() + + +class account_move(osv.osv): + _inherit = 'account.move' + def create(self, cr, user, vals, context={}): + pos_obj = self.pool.get('pos.order') + val_name = vals.get('name', '') + val_ref = vals.get('ref', '') + if (val_name and 'POS' in val_name) and (val_ref and 'PACK' in val_ref): + aaa = re.search(r'Stock move.\((.*)\)', vals.get('name')) + name_pos = aaa.groups()[0] + pos_id = name_pos.replace('POS ','') + if pos_id and pos_id.isdigit(): + pos_curr = pos_obj.browse(cr,user,int(pos_id)) + pos_curr = pos_curr and pos_curr.contract_number or '' + vals['ref'] = pos_curr or vals.get('ref') + return super(account_move, self).create(cr, user, vals, context) + +account_move() + + class product_product(osv.osv): _inherit = 'product.product' _columns = { @@ -1284,13 +1371,5 @@ class product_product(osv.osv): _defaults = { 'disc_controle': lambda *a: True, } -class stock_picking(osv.osv): - - _inherit = 'stock.picking' - _columns = { - 'pos_order': fields.many2one('pos.order', 'Pos order'), - } -stock_picking() - product_product() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file diff --git a/addons/point_of_sale/pos_account_bank_statement.py b/addons/point_of_sale/pos_account_bank_statement.py index c23a3cf3dd5..60924350014 100644 --- a/addons/point_of_sale/pos_account_bank_statement.py +++ b/addons/point_of_sale/pos_account_bank_statement.py @@ -25,222 +25,15 @@ import time import netsvc -class account_journal(osv.osv): - - _inherit = 'account.journal' - _columns = { - 'auto_cash': fields.boolean('Automatic Opening', help="This field authorize the automatic creation of the cashbox"), - 'special_journal':fields.boolean('Special Journal', help="Will put all the orders in waiting status till being accepted"), - 'check_dtls': fields.boolean('Check Details', help="This field authorize Validation of Cashbox without checking ending details"), - 'statement_sequence_id': fields.many2one('ir.sequence', 'Statement Sequence', \ - help="The sequence used for statement numbers in this journal."), - } - _defaults = { - 'check_dtls': lambda *a:True, - 'auto_cash': lambda *a:True, - } -account_journal() - -class singer_statement(osv.osv): - - """ Singer Statements """ - - _name = 'singer.statement' - _description = 'Statements' - - def _sub_total(self, cr, uid, ids, name, arg, context=None): - - """ Calculates Sub total" - @param name: Names of fields. - @param arg: User defined arguments - @return: Dictionary of values. - """ - res = {} - for obj in self.browse(cr, uid, ids): - res[obj.id] = obj.pieces * obj.number - return res - - def on_change_sub(self, cr, uid, ids, pieces, number,*a): - - """ Calculates Sub total on change of number - @param pieces: Names of fields. - @param number: - """ - sub=pieces*number - return {'value':{'subtotal': sub or 0.0}} - - _columns = { - 'pieces': fields.float('Values', digits=(16,2)), - 'number': fields.integer('Number'), - 'subtotal': fields.function(_sub_total, method=True, string='Sub Total', type='float',digits=(16,2)), - 'starting_id': fields.many2one('account.bank.statement',ondelete='cascade'), - 'ending_id': fields.many2one('account.bank.statement',ondelete='cascade'), - } - -singer_statement() - class account_bank_statement(osv.osv): _inherit = 'account.bank.statement' - def _get_starting_balance(self, cr, uid, ids, name, arg, context=None): - - """ Find starting balance " - @param name: Names of fields. - @param arg: User defined arguments - @return: Dictionary of values. - """ - res ={} - for statement in self.browse(cr, uid, ids): - amount_total=0.0 - for line in statement.starting_details_ids: - amount_total+= line.pieces * line.number - res[statement.id]=amount_total - return res - - def _get_sum_entry_encoding(self, cr, uid, ids, name, arg, context=None): - - """ Find encoding total of statements " - @param name: Names of fields. - @param arg: User defined arguments - @return: Dictionary of values. - """ - res2={} - for statement in self.browse(cr, uid, ids): - encoding_total=0.0 - for line in statement.line_ids: - encoding_total+= line.amount - res2[statement.id]=encoding_total - return res2 - - def _default_journal_id(self, cr, uid, context={}): - - """ To get default journal for the object" - @param name: Names of fields. - @return: journal - """ - company_id = self.pool.get('res.users').browse(cr, uid, uid).company_id.id - journal = self.pool.get('account.journal').search(cr, uid, [('type', '=', 'cash'), ('auto_cash','=',False), ('company_id', '=', company_id)]) - if journal: - return journal[0] - else: - return False - _columns = { - 'company_id':fields.many2one('res.company', 'Company', required=True), - 'journal_id': fields.many2one('account.journal', 'Journal', required=True), - 'balance_start': fields.function(_get_starting_balance, method=True, string='Starting Balance', type='float',digits=(16,2)), - 'state': fields.selection([('draft', 'Draft'),('confirm', 'Confirm'),('open','Open')], - 'State', required=True, states={'confirm': [('readonly', True)]}, readonly="1"), - 'total_entry_encoding':fields.function(_get_sum_entry_encoding, method=True, string="Total of Entry encoding"), - 'date':fields.datetime("Opening Date"), - 'closing_date':fields.datetime("Closing Date"), - 'starting_details_ids': fields.one2many('singer.statement', 'starting_id', string='Starting Details'), - 'ending_details_ids': fields.one2many('singer.statement', 'ending_id', string='Ending Details'), - 'name': fields.char('Name', size=64, required=True, readonly=True), - 'user_id': fields.many2one('res.users',ondelete='cascade',string='User', readonly=True), + 'company_id':fields.many2one('res.company', 'Company', required=True), } _defaults = { 'company_id': lambda self,cr,uid,c: self.pool.get('res.users').browse(cr, uid, uid, c).company_id.id, - 'state': lambda *a: 'draft', - 'name': lambda *a: '/', - 'date': lambda *a:time.strftime("%Y-%m-%d %H:%M:%S"), - 'journal_id': _default_journal_id, - 'user_id': lambda self,cr,uid,c: self.pool.get('res.users').browse(cr, uid, uid, c).id } - def create(self, cr, uid, vals, context=None): - - company_id = vals and vals.get('company_id',False) - if company_id: - open_jrnl = self.search(cr, uid, [('company_id', '=', vals['company_id']), ('journal_id', '=', vals['journal_id']), ('state', '=', 'open')]) - if open_jrnl: - raise osv.except_osv('Error', u'Une caisse de type espèce est déjà ouverte') - if 'starting_details_ids' in vals: - vals['starting_details_ids'] = starting_details_ids = map(list, vals['starting_details_ids']) - for i in starting_details_ids: - if i and i[0] and i[1]: - i[0], i[1] = 0, 0 - res = super(account_bank_statement, self).create(cr, uid, vals, context=context) - return res - - def onchange_journal_id(self, cursor, user, statement_id, journal_id, context=None): - - """ Changes balance start and starting details if journal_id changes" - @param statement_id: Changed statement_id - @param journal_id: Changed journal_id - @return: Dictionary of changed values - """ - id_s=[] - if not journal_id: - return {'value': {'balance_start': 0.0}} - balance_start=0.0 - cash_obj = self.pool.get('singer.statement') - statement_obj = self.pool.get('account.bank.statement') - cursor.execute("Select a.id from account_bank_statement a where journal_id=%d and user_id=%d order by a.id desc limit 1"%(journal_id,user)) - res2=cursor.fetchone() - res2=res2 and res2[0] or None - if res2: - statmt_id=statement_obj.browse(cursor,user,res2) - check_det=statmt_id.journal_id.check_dtls - if not check_det: - balance_start=statmt_id.balance_end_real or 0.0 - return {'value': {'balance_start': balance_start}} - cursor.execute("Select a.id from account_bank_statement a, singer_statement s where journal_id=%d and user_id=%d order by a.id desc limit 1"%(journal_id,user)) - res1=cursor.fetchone() - res1=res1 and res1[0] or None - if res1: - cursor.execute("Select sum(ss.pieces*ss.number),ss.ending_id from singer_statement ss, account_bank_statement s where ss.ending_id=s.id and s.journal_id=%d and s.user_id=%d and s.id=%d group by ss.ending_id,s.id order by s.id desc"%(journal_id,user, res1)) - res = cursor.fetchone() - balance_start = res and res[0] or 0.0 - cash_end=res and res[1] or None - id_s=statement_obj.browse(cursor,user,cash_end).ending_details_ids - new=[] - if id_s: - for s in id_s: - new.append(s.id) - return {'value': {'balance_start': balance_start, 'starting_details_ids':new}} - - def button_open(self, cr, uid, ids, context=None): - - """ Changes statement state to Running. - @return: True - """ - obj_inv = self.browse(cr, uid, ids)[0] - s_id=obj_inv.journal_id - if s_id.statement_sequence_id: - s_id=s_id.id - number = self.pool.get('ir.sequence').get_id(cr, uid, s_id) - else: - number = self.pool.get('ir.sequence').get(cr, uid, - 'account.bank.statement') - - self.write(cr, uid, ids, {'date':time.strftime("%Y-%m-%d %H:%M:%S"), 'state':'open', 'name':number}) - return True - - def button_confirm(self, cr, uid, ids, context=None): - - """ Check the starting and ending detail of statement - @return: True - """ - val = 0.0 - val2 = 0.0 - val_statement_line = 0.0 - diff = self.pool.get('res.users').browse(cr,uid,uid).company_id.max_diff or 0.0 - for statement in self.browse(cr, uid, ids): - bal = statement.balance_end - bal_st=statement.balance_start - for st in statement.line_ids: - val_statement_line += st.amount - for stat in statement.starting_details_ids: - val2 += stat.subtotal - for stat in statement.ending_details_ids: - val += stat.subtotal - if statement.journal_id.check_dtls: - if Decimal(str(val)).quantize(Decimal('.001')) != (Decimal(str(val_statement_line)) + Decimal(str(val2))).quantize(Decimal('.001')): - raise osv.except_osv(_('Invalid action !'), _(' You can not confirm your cashbox, Please enter ending details, missing value matches to "%s"')%(abs(Decimal(str(val))-(Decimal(str(val_statement_line))+Decimal(str(val2)))))) - - self.write(cr, uid, statement.id, {'balance_end_real':Decimal(str(val_statement_line))+Decimal(str(val2)),'closing_date':time.strftime("%Y-%m-%d %H:%M:%S"),'state':'draft'}) - return super(account_bank_statement, self).button_confirm(cr, uid, ids, context=None) - account_bank_statement() class account_bank_statement_line(osv.osv): @@ -261,63 +54,14 @@ class account_bank_statement_line(osv.osv): if user.company_id: return user.company_id.id return self.pool.get('res.company').search(cr, uid, [('parent_id', '=', False)])[0] - - def _get_statement_journal(self, cr, uid, ids, context, *a): - res = {} - for line in self.browse(cr, uid, ids): - res[line.id] = line.statement_id and line.statement_id.journal_id and line.statement_id.journal_id.name or None - return res _inherit = 'account.bank.statement.line' _columns = { 'company_id':fields.many2one('res.company', 'Company', required=True), - 'journal_id': fields.function(_get_statement_journal, method=True,store=True, string='Journal', type='char', size=64), - 'am_out':fields.boolean("To count"), - 'is_acc':fields.boolean("Is accompte"), - 'pos_statement_id': fields.many2one('pos.order',ondelete='cascade'), } _defaults = { 'company_id': lambda self,cr,uid,c: self.pool.get('res.users').browse(cr, uid, uid, c).company_id.id, } - account_bank_statement_line() -class account_move_line(osv.osv): - _inherit = 'account.move.line' - def create(self, cr, user, vals, context={}): - pos_obj = self.pool.get('pos.order') - val_name = vals.get('name', '') - val_ref = vals.get('ref', '') - if (val_name and 'POS' in val_name) and (val_ref and 'PACK' in val_ref): - aaa = re.search(r'Stock move.\((.*)\)', vals.get('name')) - name_pos = aaa.groups()[0] - pos_id = name_pos.replace('POS ','') - if pos_id and pos_id.isdigit(): - pos_curr = pos_obj.browse(cr,user,int(pos_id)) - pos_curr = pos_curr and pos_curr.contract_number or '' - vals['ref'] = pos_curr or vals.get('ref') - return super(account_move_line, self).create(cr, user, vals, context) - -account_move_line() - - -class account_move(osv.osv): - _inherit = 'account.move' - def create(self, cr, user, vals, context={}): - pos_obj = self.pool.get('pos.order') - val_name = vals.get('name', '') - val_ref = vals.get('ref', '') - if (val_name and 'POS' in val_name) and (val_ref and 'PACK' in val_ref): - aaa = re.search(r'Stock move.\((.*)\)', vals.get('name')) - name_pos = aaa.groups()[0] - pos_id = name_pos.replace('POS ','') - if pos_id and pos_id.isdigit(): - pos_curr = pos_obj.browse(cr,user,int(pos_id)) - pos_curr = pos_curr and pos_curr.contract_number or '' - vals['ref'] = pos_curr or vals.get('ref') - return super(account_move, self).create(cr, user, vals, context) - -account_move() - # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: -