from osv import osv,fields
import datetime
import time
from datetime import datetime
from datetime import timedelta
class daily_details(osv.osv):
_name='daily.details'
_columns={
'daily_id':fields.many2one('lending.info','Name:'),
'date':fields.date('Date',required=True),
'amount_paid':fields.float('Paid',required=True),
'amount_deducted':fields.float('Amount Deducted',required=True),
'daily_interst_amount':fields.float('Daily Interest ',required=True),
'fine_amount':fields.float('Fine',required=True),
# 'acc_id':fields.many2one('account.account','Account')
}
daily_details()
class lending_info(osv.osv):
_name='lending.info'
_inherits = {'res.partner':'partner_id'}
def _get_costt(self, cr, uid, ids, name, arg, context=None):
res = {}
for fee in self.browse(cr, uid, ids, context=context):
totalsum = 0.0
for line in fee.daily_amount_details:
totalsum += line.amount_paid-(line.daily_interst_amount+line.fine_amount)
res[fee.id] = totalsum
return res
_columns={
'state':fields.selection([('draft','New'),
('pay','Paid'),
('closed','closed')],
'State'),
'loan_id':fields.char('ID',readonly=True),
'partner_id':fields.many2one('res.partner','Customer'),
'issue_date':fields.date('Issue Date',required=True),
'due_date':fields.date('Due date',required=True),
'total_amount':fields.float('Amount',size=64),
'interest_rate':fields.float('Interst rate (%)'),
'total_inter_amount':fields.float('Total Amount Pay ',readonly=True),
'daily_amount_details':fields.one2many('daily.details','daily_id','Loan Line'),
# 'anali_account':fields.many2one('account.analytic.account','Analytic Account'),
'proof_name':fields.char('Proof Id'),
'proof_image':fields.binary('proof'),
'other_inform':fields.text('Other Information'),
'amount_subtotal':fields.function(_get_costt, type='float', string='Total',method=True,store=True),
'balance':fields.float('Balance',readonly=True),
}
_defaults={
'loan_id': lambda obj, cr, uid, context: '/',
'state':'draft',
'issue_date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
}
def button_total(self, cr, uid, ids, context=None):
data=self.read(cr, uid, ids, ['amount_subtotal','total_inter_amount'],context=context)
total_amount_interst=data[0]['total_inter_amount']
paid_amount=data[0]['amount_subtotal']
balance_amount=total_amount_interst-paid_amount
}
self.write(cr, uid, ids,vals)
return True
#
def create(self, cr, uid, vals, context=None):
vals['loan_id'] = self.pool.get('ir.sequence').get(cr, uid,'lending.info')
return super(lending_info, self).create(cr, uid, vals, context=context)
def button_pay(self,cr,uid,ids,context=None):
self.write(cr,uid,ids,{'state':'pay'})
return True
def button_closed(self,cr,uid,ids,context=None):
self.write(cr,uid,ids,{'state':'closed'})
return True
def create_invoice(self, cr, uid, ids, context=None):
ir_model_data = self.pool.get('ir.model.data')
form_res = ir_model_data.get_object_reference(cr, uid, 'account', 'invoice_form')
form_id = form_res and form_res[1] or False
property_obj = self.pool.get('ir.property')
#get account_id for invoice
rec_pro_id = property_obj.search(cr,uid,[('name','=','property_account_receivable')])
rec_line_data = property_obj.read(cr,uid,rec_pro_id,['name','value_reference'])
account_id = rec_line_data [0]['value_reference'].split(',')[1]
# get sale account_id for invoice_line
sale_pro_id = property_obj.search(cr,uid,[('name','=','property_account_income_categ')])
sale_line_data = property_obj.read(cr,uid,sale_pro_id,['name','value_reference'])
sale_account_id = sale_line_data [0]['value_reference'].split(',')[1]
#get data for invoice
context['type'] = 'out_invoice'
context['active_id'] = name_id
invoice_pool = self.pool.get('account.invoice')
default_fields = invoice_pool.fields_get(cr, uid, context=context)
invoice_default = invoice_pool.default_get(cr, uid, default_fields, context=context)
onchange_partner = invoice_pool.onchange_partner_id(cr, uid, [], type='out_invoice',\
partner_id=name_id)
invoice_default.update(onchange_partner['value'])
lines = []
line_data = {'uos_id': False, 'product_id': False,
'price_unit': 0, 'account_id': sale_account_id,
'name': 'name',
'account_analytic_id': your_account_id,
'invoice_line_tax_id': [[6, False, []]], 'quantity': 1}
invoice_line= [0,False,line_data]
lines.append(invoice_line)
invoice_data = {
'partner_id': "name_id",
'date_invoice': time.strftime('%Y-%m-%d'),
'account_id': account_id,#determine the account for invoice 'account receivable'
'invoice_line': lines,
}
invoice_default.update(invoice_data)
invoice_id = invoice_pool.create(cr, uid, invoice_default, context=context)
return {
'name': _('Invoice'),
'view_type': 'form',
'res_id': invoice_id,
'view_mode': 'form,tree',
'res_model': 'account.invoice',
'view_id': False,
'views': [(form_id, 'form')],
'context': context,
'type': 'ir.actions.act_window',
}
def calc_total_amount(self,cr,uid,ids,context=None):
num=self.read(cr,uid,ids,['total_amount','issue_date','due_date','interest_rate'],context=context)
dateformat="%Y-%m-%d"
interst_rate=num[0]['interest_rate']
#d1=datetime.strptime(num[0]['maturity_date'],dateformat)
#d2=datetime.strptime(num[0]['deposit_date'],dateformat)
d1=datetime.strptime(num[0]['due_date'],dateformat)
d2=datetime.strptime(num[0]['issue_date'],dateformat)
v1=d1-d2
total_days=v1.days
var1=num[0]['total_amount']*interst_rate/100
# interstrat_per_day=var1/365
# # 0
vals={
'total_inter_amount':num[0]['total_amount']+var1*total_days,
#'processing_fee':['total_inter_amount']-num[0]['total_amount']
#'interest_amount':interstrat_per_day*30,
}
self.write(cr,uid,ids,vals)
return True
lending_info()
class res_partner_customer(osv.osv):
_inherit='res.partner'
res_partner_customer()
.xml---------
<button name="create_invoice" string="Create Invoice"
type="object" icon="gtk-apply" states="confirm,waiting,in_consultation,done" class="oe_highlight" />