Odoo is the world's easiest all-in-one management software.
It includes hundreds of business apps:
e-Commerce
Accounting
Inventory
Project management
Take the tour
import time
from openerp.osv import fields, osv
import openerp.addons.decimal_precision as dp
from openerp.tools.translate import _
from openerp.tools import hashlib
from datetime import datetime
from operator import itemgetter
from openerp import SUPERUSER_ID
from openerp import pooler, tools
from dateutil.relativedelta import relativedelta
class account_bank_payment(osv.osv):
_name = "account.bank.payment"
_description = 'PayDirect Tax Payments'
_inherit = 'account.bank.statement.line'
_columns = {
'name': fields.char('Payment Reference', size=255, required=True),
'date': fields.date('Payment Date', required=True),
'amount': fields.float('Amount', digits_compute=dp.get_precision('Account'), required=True),
'ref': fields.char('Description', size=255, required=True),
'taxpayer_name': fields.char('Tax Payer', size=255, required=True),
'head_subhead': fields.char('Head/Sub-head', size=255, required=True),
'instr_number': fields.char('Print Paper Number', size=20),
'system_print_number': fields.char('System Print Number', size=20),
'bank_name': fields.char('Bank Name', size=255, required=True),
'payment_type': fields.char('Payment Type', size=255, required=True),
'payment_logid': fields.integer('Payment Log Id'),
'terminal_id': fields.char('Terminal Id', size=255),
'channel_name': fields.char('Channel Name', size=255),
'location': fields.char('Channel Name', size=255),
'institution_id': fields.char('Institution Id', size=255),
'institution_name': fields.char('Institution', size=255),
'branch_name': fields.char('Branch', size=255),
'receipt_no': fields.char('Receipt No', size=255),
'collections_account': fields.char('Collections Account', size=255),
'bank_code': fields.char('Bank Code', size=255),
'is_reversal': fields.boolean('Is Reversal', help="Indicates whether the transactions is a reversal or not."),
'deposit_slip_number': fields.char('Deposit Slip Number', size=255),
'period_covered': fields.char('Period Covered', size=255),
'period_covered_start': fields.date('Period Covered Start'),
'period_covered_end': fields.date('Period Covered End'),
'val_date': fields.date('Value Date'),
'cust_reference': fields.char('Customer Reference', size=255),
'alternate_cust_reference': fields.char('Alternate Customer Reference', size=255),
'payment_status': fields.integer('Payment Status'),
'settlement_date': fields.date('Settlement Date'),
'fee_name': fields.char('Fee Name', size=255),
'othercustomer_info': fields.char('Other Customer Info', size=255),
'collections_account': fields.char('Collections Account', size=255),
'third_party_code': fields.char('Thirty Party Code', size=255),
'customer_address': fields.char('Customer Address', size=255),
'customer_phone_number': fields.char('Customer Phone Number', size=255),
'depositor_name': fields.char('Depositor Name', size=255),
'payment_currency': fields.char('Payment Currency', size=255),
'product_group_code': fields.char('Product Group Code', size=255),
'transaction_date': fields.date('Transaction Date'),
'item_amount': fields.float('Item Amount', digits_compute=dp.get_precision('Account')),
'lead_bank_code': fields.char('Lead Bank Code', size=255),
'lead_bank_cbn_code': fields.char('Lead Bank CBN Code', size=255),
'lead_bank_name': fields.char('Lead Bank Name', size=255),
'ip': fields.char('IP', size=255),
#dummy fields for date range
'payment_date_from':fields.function(lambda *a,**k:{}, method=True, type='date',string="Payment date from"),
'payment_date_to':fields.function(lambda *a,**k:{}, method=True, type='date',string="Payment date to"),
#'status': fields.selection([('ready', 'Ready'), ('printed', 'Printed'), ('issued', 'Issued'), ('request', 'Void Request')], 'State'),
'state': fields.selection([('ready', 'Ready'), ('printed', 'Printed'), ('issued', 'Issued'), ('request', 'Void Request'), ('voided', 'Voided')], 'Status'),
'wht_schedule_id': fields.one2many('collections.wht.schedule', 'payment_reference', 'WHT Schedule', select=False, required=False, ondelete='cascade'),
'partner_id': fields.many2one('res.partner', 'Internal Payer Name'),
#override the following here to remove required constraint
'statement_id': fields.many2one('account.bank.statement', 'Statement',
select=False, required=False, ondelete='cascade'),
'type': fields.selection([
('taxpayer','Tax Payer'),
('supplier','Supplier'),
('customer','Customer'),
('general','General')
], 'Type', required=False),
'account_id': fields.many2one('account.account','Account',
required=False),
_defaults = {
#'status': 'ready',
'state': 'ready',
'period_covered_start' : lambda *a : None,
'period_covered_end' : lambda *a : None,
_sql_constraints = [
# ('name_unique', 'unique(name)', 'The payment reference must be unique per payment!'),
# ('payment_logid_unique', 'unique(payment_logid)', 'The payment log id must be unique per payment!'),
# ('terminal_id', 'unique(terminal_id)', 'The terminal id must be unique per payment!'),
('instr_number', 'unique(instr_number)', 'The print paper number must be unique for each payment!'),
('system_print_number', 'unique(system_print_number)', 'The system print number must be unique for each payment!'),
_order = "date desc"
def unlink(self, cr, uid, ids, context=None):
if context is None:
context = {}
# if context.get('block_statement_line_delete', False):
# raise osv.except_osv(_('Warning!'), _('Delete operation not allowed. \
# Please go to the associated bank statement in order to delete and/or modify bank statement line.'))
return super(account_bank_payment, self).unlink(cr, uid, ids, context=context)
def set_ready(self, cr, uid, ids, context):
self.write(cr, uid, ids, {'state': 'ready'}, context=context)
return {}
def set_printed(self, cr, uid, ids, context):
for payment in self.browse(cr, uid, ids, context):
if not payment.instr_number:
raise osv.except_osv(_('Warning!'), _('You must enter the print paper number before setting the status to printed.'))
else:
self.write(cr, uid, ids, {'state': 'printed'}, context=context)
return {}
def set_issued(self, cr, uid, ids, context):
self.write(cr, uid, ids, {'state': 'issued'}, context=context)
return {}
def set_request(self, cr, uid, ids, context):
for payment in self.browse(cr, uid, ids, context):
if not payment.note:
raise osv.except_osv(_('Warning!'), _('You must add a note to this payment before requesting it to be voided.'))
else:
self.write(cr, uid, ids, {'state': 'request'}, context=context)
return {}
def set_voided(self, cr, uid, ids, context):
self.write(cr, uid, ids, {'state': 'voided'}, context=context)
return {}
def onchange_papernumber(self, cr, uid, ids, instr_number, context=None):
if instr_number:
hash = hashlib.sha1()
hash.update(instr_number)
self.write(cr, uid, ids, {'system_print_number': '89' + hash.hexdigest()[:12].upper()}, context=context)
return {}
def create(self, cr, uid, vals, context=None):
# if vals['period_covered_start'] and vals['period_covered_end']:
# if vals['period_covered_end'] < vals['period_covered_start']:
# raise osv.except_osv(_('Warning!'), _('End date cannot be earlier than start date.'))
# result = super(account_bank_payment,self).create(cr, uid, vals, context=context)
return result
def write(self, cr, uid, ids, vals, context=None):
if uid != 15 and vals['head_subhead']:
raise osv.except_osv(_('Warning!'), _('End date cannot be earlier than start date.'))
# if vals['period_covered_start'] and vals['period_covered_end']:
# if vals['period_covered_end'] < vals['period_covered_start']:
# raise osv.except_osv(_('Warning!'), _('End date cannot be earlier than start date.'))
# result = super(account_bank_payment,self).write(cr, uid, ids, vals, context=context)
return result
def onchange_period_covered(self, cr, uid, ids, period_covered_start, period_covered_end, context=None):
if period_covered_start and period_covered_end:
if period_covered_end < period_covered_start:
raise osv.except_osv(_('Warning!'), _('End date cannot be earlier than start date.'))
return {}
def onchange_head(self, cr, uid, ids, context=None):
if uid != 15:
raise osv.except_osv(_('Error!'), _('You are not allowed to edit this field.'))
return {}
def onchange_description(self, cr, uid, ids, context=None):
if uid != 15:
raise osv.except_osv(_('Error!'), _('You are not allowed to edit this field.'))
return {}
account_bank_payment()
class paydirect_payment(osv.osv):
_name = "payments"
_description = 'PayDirect Raw Payment Records'
_columns = {
'paymentreference': fields.char('Payment Reference', size=255),
'paymentdate': fields.date('Payment Date'),
'itemamount': fields.float('Amount', digits_compute=dp.get_precision('Account')),
'itemname': fields.char('Description', size=255),
'customername': fields.char('Customer Name', size=255),
'itemcode': fields.char('Head/Sub-head', size=255),
'bankname': fields.char('Bank Name', size=255),
'payment_type': fields.char('Payment Type', size=255),
'paymentlogid': fields.integer('Payment Log Id'),
'terminalid': fields.char('Terminal Id', size=255),
'channelname': fields.char('Channel Name', size=255),
'location': fields.char('Channel Name', size=255),
'institutionid': fields.char('Institution Id', size=255),
'institutionname': fields.char('Institution', size=255),
'branchname': fields.char('Branch', size=255),
'receiptno': fields.char('Receipt No', size=255),
'collectionsaccount': fields.char('Collections Account', size=255),
'bankcode': fields.char('Bank Code', size=255),
'isreversal': fields.boolean('Is Reversal', help="Indicates whether the transactions is a reversal or not."),
'depositslipnumber': fields.char('Deposit Slip Number', size=255),
'custreference': fields.char('Customer Reference', size=255),
'alternatecustreference': fields.char('Alternate Customer Reference', size=255),
'paymentstatus': fields.integer('Payment Status'),
'settlementdate': fields.date('Settlement Date'),
'feename': fields.char('Fee Name', size=255),
'othercustomerinfo': fields.char('Other Customer Info', size=255),
'collectionsaccount': fields.char('Collections Account', size=255),
'thirdpartycode': fields.char('Thirty Party Code', size=255),
'customeraddress': fields.char('Customer Address', size=255),
'customerphonenumber': fields.char('Customer Phone Number', size=255),
'depositorname': fields.char('Depositor Name', size=255),
'paymentcurrency': fields.char('Payment Currency', size=255),
'productgroupcode': fields.char('Product Group Code', size=255),
'transactiondate': fields.date('Transaction Date'),
'itemamount': fields.float('Item Amount', digits_compute=dp.get_precision('Account')),
'leadbankcode': fields.char('Lead Bank Code', size=255),
'leadbankcbncode': fields.char('Lead Bank CBN Code', size=255),
'leadbankname': fields.char('Lead Bank Name', size=255),
'ip': fields.char('IP', size=255),
_order = "paymentdate desc"
paydirect_payment()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
When I try to edit a record and save, I get this error:
Client Traceback (most recent call last):
File "C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons\web\http.py", line 204, in dispatch
File "C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons\web\controllers\main.py", line 1125, in call_kw
File "C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons\web\controllers\main.py", line 1117, in _call_kw
File "C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons\web\session.py", line 42, in proxy
File "C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons\web\session.py", line 30, in proxy_method
File "C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons\web\session.py", line 103, in send
Server Traceback (most recent call last):
File "C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons\web\session.py", line 89, in send
File "C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\netsvc.py", line 292, in dispatch_rpc
File "C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\service\web_services.py", line 626, in dispatch
File "C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\osv\osv.py", line 188, in execute_kw
File "C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\osv\osv.py", line 131, in wrapper
File "C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\osv\osv.py", line 197, in execute
File "C:\Program Files (x86)\OpenERP 7.0\Server\server\.\openerp\osv\osv.py", line 185, in execute_cr
File "C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons\account_collections\account_bank_payment.py", line 169, in write
KeyError: 'head_subhead'
Can someone help identify my error?
Thanks in advance.
@Faiyer: The reason why you get key error is that when python tries to get vals['head_subhead'] it doesn't find it from your dictionary so it throws keyerror exception, with vals.get('head_subhead') if key is not found it returns none if it doesn't find head_subhead not an exception. I would assume that in that other code they caught the keyerror exception somewhere so it didn't crash but you don't catch it anywhere so it crashes.
Odoo is a suite of open source business apps that cover all your company needs: CRM, eCommerce, accounting, inventory, point of sale, project management, etc.
Odoo's unique value proposition is to be at the same time very easy to use and fully integrated.