1
# -*- coding: utf-8 -*-
3
from datetime import datetime
4
from datetime import date
5
from dateutil.relativedelta import relativedelta
7
from openerp.osv import osv, fields
10
from openerp.tools.translate import _
11
import openerp.addons.decimal_precision as dp
12
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT
13
from mx.DateTime.mxDateTime.mxDateTime_Python import DateTime
17
class loan_risk_foundation(osv.osv):
18
_name = "loan.risk.foundation"
19
_description = "Loan Risk Foundation"
23
('approved', 'Approved'),
26
('cancel', 'Cancelled')
30
'company_id':fields.many2one('res.company','Company'),
31
'name': fields.char(u'Risk number', size=64, select=True,readonly=True),
32
'refund_id': fields.many2one('loan.refund.risk.foundation',u'Refund risk foundation',readonly=True),
33
'loan_order': fields.many2one('loan.order',u'Loan contract', domain=[('state','=','paid')],states={'closed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]},required=True),
34
'date_order':fields.date('Order Date', required=True, states={'closed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]},help="Date on which this document has been created."),
35
'date_approve':fields.date('Date Approved', readonly=1),
36
'state': fields.selection(STATE_SELECTION, 'State', readonly=True, help="Help..."),
37
'partner_id':fields.many2one('res.partner', 'Debtor', required=True,states={'closed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]}),
38
'notes': fields.text('Other',states={'closed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]}),
39
'loan_balance':fields.float(u'Loan balance',digits = (16,2),states={'closed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]},required=True),
40
'beyond_days':fields.integer(u'Beyond days',states={'closed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]},required=True),
41
'risk_amount':fields.float(u'Amount of risk',digits = (16,2),states={'closed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]},required=True),
42
'risk_percent': fields.float(u'Percent of risk',digits = (16,2),states={'closed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]},required=True),
43
'risk_account': fields.many2one('account.account',u'Account of risk foundation',states={'closed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]},required=True),
44
'risk_expense_account': fields.many2one('account.account',u'Account of risk expense',states={'closed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]},required=True),
45
'journal': fields.many2one('account.journal',u'Journal',states={'done':[('readonly',True)],'approved':[('readonly',True)]},required=True),
47
'loan_current_state': fields.selection([
49
('d90','Past due loans'),
50
('d180','Abnormal loans'),
51
('d360','Doubted loans'),
52
('d361g','Bad loan')], u'Loan state(current)',states={'closed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]},required=True),
53
'loan_next_state': fields.selection([
55
('d90','Past due loans'),
56
('d180','Abnormal loans'),
57
('d360','Doubted loans'),
58
('d361g','Bad loan')], u'Loan state(changed)',states={'closed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]},required=True),
59
'approve_economist': fields.many2one('hr.employee',u'Approved economist',readonly=True),
60
'approve_accountant': fields.many2one('hr.employee',u'Approved accountant',readonly=True),
63
'company_id':lambda self, cr, uid, c: self.pool.get('res.users').browse(cr, uid, uid, c).company_id.id,
64
'date_order': fields.date.context_today,
68
('name_uniq', 'unique(name)', 'Risk number must be unique!'),
72
# ---------------------------------MY----------------------------------------
73
def onchange_risk_percent(self, cr, uid, ids, percent,balance):
76
return {'warning':{'message':"Wrong percent",'title':'Warning!'}}
78
ra = percent*balance/100.0
79
val['risk_amount'] = ra
82
def onchange_loan_order(self, cr, uid, ids, lid,today):
84
lorder = self.pool.get('loan.order').browse(cr,uid,lid)
85
lps = self.pool.get('loan.payment').search(cr,uid,[('state','=','paid'),('loan_order','=',lorder.id)],order='id')
89
last_date = self.pool.get('loan.payment').browse(cr,uid,lps[len(lps)-1]).graphic.payment_date
93
last_date = lorder.schedules[0].payment_date
94
print 'no lp',last_date
96
print '-----days',self._get_days(today,last_date,one),today,last_date
98
days = self._get_days(today,last_date,one)
99
val['beyond_days'] = days
101
return {'value':{'loan_order':False},'warning':{'message':"This loan is normal. Don't create risk foundation!",'title':'Warning!'}}
103
val['partner_id'] = lorder.partner_id.id
104
val['loan_current_state'] = lorder.loan_state
105
val['loan_balance'] = lorder.loan_balance
109
def _get_month_days(self,x):
111
1:31, 2:28, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31
114
def _get_days(self,now,last,m):
115
last_year = int(last[:4])
116
last_mounth = int(last[5:7])+m
117
last_day = int(last[8:])
123
now_year = int(now[:4])
124
now_mounth = int(now[5:7])
125
now_day = int(now[8:])
127
d0 = date(last_year, last_mounth, last_day)
128
d1 = date(now_year, now_mounth, now_day)
132
# ---------------------------------ERP----------------------------------------
133
def create(self, cr, uid, vals, context=None):
134
if vals['risk_amount'] <= 0:
135
raise osv.except_osv(_('Invalid risk amount!'), _('Insert risk amount!'))
136
if vals['risk_percent'] <= 0:
137
raise osv.except_osv(_('Invalid risk percent!'), _('Insert risk period!'))
138
return super(loan_risk_foundation, self).create(cr, uid, vals, context=context)
140
def unlink(self, cr, uid, ids, context=None):
141
loan_orders = self.read(cr, uid, ids, ['state'], context=context)
143
for s in loan_orders:
144
if s['state'] in ['draft','cancel']:
145
unlink_ids.append(s['id'])
147
raise osv.except_osv(_('Invalid action !'), _('In order to delete a loan order, it must be cancelled first!'))
148
return super(loan_risk_foundation, self).unlink(cr, uid, unlink_ids, context=context)
150
def refund_risk_validate(self, cr, uid, ids, context=None):
151
order = self.browse(cr, uid, ids)[0]
152
print '---',cr,uid,ids
153
print 'refund action',order.name
155
cur_id = order.loan_order.product_id.currency.id
156
res_currency_obj = self.pool.get('res.currency')
157
res_users_obj = self.pool.get('res.users')
159
company_currency_id = res_users_obj.browse(cr, uid, uid,context=context).company_id.currency_id.id
160
currency_id = order.loan_order.product_id.currency.id
162
amount_currency = res_currency_obj.compute(cr,uid, company_currency_id,currency_id,order.risk_amount, context=context)
163
print 'amount currency-----',amount_currency
165
if amount_currency == order.risk_amount:
166
amount_currency = 0.0
167
amount = order.risk_amount
170
amount_currency = order.risk_amount
173
am_id = self.pool.get('account.move').create(cr,uid, {
175
'journal_id':order.journal.id,
176
'ref':order.loan_order.name})
178
aml_one_one = self.pool.get('account.move.line').create(cr,uid,{
179
'name':order.loan_order.name + u'гэрээний эрсдэлийн санг буцаав.',
180
'partner_id':order.partner_id.id,
181
'account_id':order.risk_expense_account.id,
183
#'currency_id':currency_id,
184
#'amount_currency':amount_currency*(-1),
187
aml_one_two = self.pool.get('account.move.line').create(cr,uid,{
188
'name':order.loan_order.name + u'гэрээний эрсдэлийн санг буцаав.',
189
'partner_id':order.partner_id.id,
190
'account_id':order.risk_account.id,
192
#'currency_id':currency_id,
193
#'amount_currency':amount_currency,
195
amove = self.pool.get('account.move').browse(cr,uid,am_id)
196
amove.button_validate()
198
new_st = order.loan_current_state
199
old_st = order.loan_next_state
206
condition = 'product_id'
207
elif old_st == 'd90':
208
old_desc = u'Хугацаа хэтэрсэн'
209
condition = 'xxz_product'
210
elif old_st == 'd180':
211
old_desc = u'Хэвийн бус'
212
condition = 'xb_product'
213
elif old_st == 'd360':
214
old_desc = u'Эргэлзээтэй зээл'
215
condition = 'ez_product'
216
elif old_st == 'd361g':
217
old_desc = u'Муу зээл'
218
condition = 'mz_product'
220
cid = self.pool.get('configure.product').search(cr,uid,[(condition,'=',order.loan_order.product_id.id)])
222
raise osv.except_osv(_('Warning'), _('Not found configure!'))
224
config = self.pool.get('configure.product').browse(cr,uid,cid[0])
225
print '--------------c id',cid
231
pro_id = config.product_id.id
232
elif new_st == 'd90':
233
new_desc = u'Хугацаа хэтэрсэн'
234
pro_id = config.xxz_product.id
235
elif new_st == 'd180':
236
new_desc = u'Хэвийн бус'
237
pro_id = config.xb_product.id
238
elif new_st == 'd360':
239
new_desc = u'Эргэлзээтэй зээл'
240
pro_id = config.ez_product.id
241
elif new_st == 'd361g':
242
new_desc = u'Муу зээл'
243
pro_id = config.mz_product.idfields.date.context_today(self,cr,uid,context=context),
245
pro = self.pool.get('product.product').browse(cr,uid,pro_id)
246
amount_currency = res_currency_obj.compute(cr,uid, company_currency_id,currency_id,order.loan_order.loan_balance, context=context)
248
if amount_currency == order.loan_order.loan_balance:
249
amount_currency = 0.0
250
amount = order.loan_order.loan_balance
253
amount_currency = order.loan_order.loan_balance
255
am_id2 = self.pool.get('account.move').create(cr,uid, {
257
'journal_id':order.journal.id,
258
'ref':order.loan_order.name})
259
aml_one_one2 = self.pool.get('account.move.line').create(cr,uid,{
260
'name':order.loan_order.name + u'гэрээ ангилал шилжив.',
261
'partner_id':order.partner_id.id,
262
'account_id':order.loan_order.product_id.property_account_expense.id,
263
'credit':order.loan_order.loan_balance,
264
#'currency_id':currency_id,
265
#'amount_currency':amount_currency*(-1),
268
aml_one_two2 = self.pool.get('account.move.line').create(cr,uid,{
269
'name':order.loan_order.name + u'гэрээ ангилалrisk_orders шилжив.',
270
'partner_id':order.partner_id.id,
271
'account_id':pro.property_account_income.id,
272
'debit':order.loan_order.loan_balance,
273
#'currency_id':currency_id,
274
#'amount_currency':amount_currency,
276
amove2 = self.pool.get('account.move').browse(cr,uid,am_id2)
277
amove2.button_validate()
279
print 'new state-',new_st,'pro',pro_id
280
print 'update lorder-',self.pool.get('loan.order').write(cr,uid,order.loan_order.id,
281
{'loan_state':new_st,
284
print 'update refund-',self.pool.get('loan.refund.risk.foundation').write(cr,uid,order.refund_id.id,{'loan_current_state':new_st})
286
sid = self.pool.get('loan.account.statement').create(cr,uid, {
287
'contract_id':order.loan_order.id,
288
'name':u"Эрсдэлийн сан буцаав, ангилал шилжив('"+unicode(old_desc)+"'->'"+unicode(new_desc)+"')",
289
'write_date':order.date_order,
290
'risk':(-1)*order.risk_amount})
292
self.write(cr, uid, ids, {'state': 'closed'})
295
def action_risk_cancel(self, cr, uid, ids, context=None):
296
self.write(cr, uid, ids, {'state': 'draft'})
297
print 'Cancel-------------'
301
def action_approve_risk(self, cr, uid, ids, context=None):
302
# print "tessss",self.pool.get('ir.sequence').get(cr, uid, 'loan.risk.foundation')
303
hrid = self.pool.get('hr.employee').search(cr, uid, [('user_id','=',uid)])
305
self.write(cr, uid, ids, {'state': 'approved',
306
'approve_economist' : hrid[0],
307
'name': self.pool.get('ir.sequence').get(cr, uid, 'loan.risk.foundation'),
308
'date_approve': fields.date.context_today(self,cr,uid,context=context),
311
raise osv.except_osv(_('Warning'), _('Хүний нөөц дээр энэ ажилтанг бүртгээгүй эсвэл холбоотой хэрэглэгчийг тохируулаагүй байна!'))
315
def action_done_risk(self, cr, uid, ids, context=None):
316
order = self.browse(cr,uid,ids)[0]
317
cur_id = order.loan_order.product_id.currency.id
318
res_currency_obj = self.pool.get('res.currency')
319
res_users_obj = self.pool.get('res.users')
321
company_currency_id = res_users_obj.browse(cr, uid, uid,context=context).company_id.currency_id.id
322
currency_id = order.loan_order.product_id.currency.id
324
amount_currency = res_currency_obj.compute(cr,uid, company_currency_id,currency_id,order.risk_amount, context=context)
326
if amount_currency == order.risk_amount:
327
amount_currency = 0.0
328
amount = order.risk_amount
331
amount_currency = order.risk_amount
334
am_id = self.pool.get('account.move').create(cr,uid, {
336
'journal_id':order.journal.id,
337
'ref':order.loan_order.name})
338
if company_currency_id == currency_id:
340
aml_one_one = self.pool.get('account.move.line').create(cr,uid,{
341
'name':order.loan_order.name + u'гэрээнд эрсдэлийн сан байгуулав.',
342
'partner_id':order.partner_id.id,
343
'account_id':order.risk_account.id,
345
# 'currency_id':currency_id,
346
# 'amount_currency':amount_currency*(-1),
347
'date':datetime.now(),
350
aml_one_two = self.pool.get('account.move.line').create(cr,uid,{
351
'name':order.loan_order.name + u'гэрээнд эрсдэлийн сан байгуулав.',
352
'partner_id':order.partner_id.id,
353
'account_id':order.risk_expense_account.id,
355
'date': datetime.now(),
356
# 'currency_id':currency_id,
357
# 'amount_currency':amount_currency,
361
aml_one_one = self.pool.get('account.move.line').create(cr,uid,{
362
'name':order.loan_order.name + u'гэрээнд эрсдэлийн сан байгуулав.',
363
'partner_id':order.partner_id.id,
364
'account_id':order.risk_account.id,
366
'currency_id':currency_id,
367
'amount_currency':amount_currency*(-1),
368
'date':datetime.now(),
371
aml_one_two = self.pool.get('account.move.line').create(cr,uid,{
372
'name':order.loan_order.name + u'гэрээнд эрсдэлийн сан байгуулав.',
373
'partner_id':order.partner_id.id,
374
'account_id':order.risk_expense_account.id,
376
'date': datetime.now(),
377
'currency_id':currency_id,
378
'amount_currency':amount_currency,
380
print 'Return AM',am_id
381
amove = self.pool.get('account.move').browse(cr,uid,am_id)
382
amove.button_validate()
384
old_st = order.loan_current_state
385
new_st = order.loan_next_state
392
condition = 'product_id'
393
elif old_st == 'd90':
394
old_desc = u'Хугацаа хэтэрсэн'
395
condition = 'xxz_product'
396
elif old_st == 'd180':
397
old_desc = u'Хэвийн бус'
398
condition = 'xb_product'
399
elif old_st == 'd360':
400
old_desc = u'Эргэлзээтэй зээл'
401
condition = 'ez_product'
402
elif old_st == 'd361g':
403
old_desc = u'Муу зээл'
404
condition = 'mz_product'
406
cid = self.pool.get('configure.product').search(cr,uid,[(condition,'=',order.loan_order.product_id.id)])
408
raise osv.except_osv(_('Warning'), _('Not found configure!'))
410
config = self.pool.get('configure.product').browse(cr,uid,cid[0])
411
print '--------------c id',cid
416
days = order.beyond_days
419
pro_id = config.product_id.id
420
elif new_st == 'd90':
421
new_desc = u'Хугацаа хэтэрсэн'
422
pro_id = config.xxz_product.id
423
elif new_st == 'd180':
424
new_desc = u'Хэвийн бус'
425
pro_id = config.xb_product.id
426
elif new_st == 'd360':
427
new_desc = u'Эргэлзээтэй зээл'
428
pro_id = config.ez_product.id
429
elif new_st == 'd361g':
430
new_desc = u'Муу зээл'
431
pro_id = config.mz_product.id
433
pro = self.pool.get('product.product').browse(cr,uid,pro_id)
435
amount_currency = res_currency_obj.compute(cr,uid, company_currency_id,currency_id,order.loan_order.loan_balance, context=context)
437
if amount_currency == order.loan_order.loan_balance:
438
amount_currency = 0.0
439
amount = order.loan_order.loan_balance
442
amount_currency = order.loan_order.loan_balance
444
print "account",order.loan_order
445
am_id2 = self.pool.get('account.move').create(cr,uid, {
447
'journal_id':order.journal.id,
448
'ref':order.loan_order.name})
449
if company_currency_id == currency_id:
451
aml_one_one2 = self.pool.get('account.move.line').create(cr,uid,{
452
'name':order.loan_order.name + u'гэрээ ангилал шилжив.',
453
'partner_id':order.partner_id.id,
454
'account_id':order.loan_order.product_id.property_account_expense.id,
455
'credit':order.loan_balance,
456
'date': datetime.now(),
457
# 'currency_id':currency_id,
458
# 'amount_currency':amount_currency*(-1),
461
aml_one_two2 = self.pool.get('account.move.line').create(cr,uid,{
462
'name':order.loan_order.name + u'гэрээ ангилал шилжив.',
463
'partner_id':order.partner_id.id,
464
'account_id':pro.property_account_income.id,
465
'date': datetime.now(),
466
'debit':order.loan_order.loan_balance,
467
# 'currency_id':currency_id,
468
# 'amount_currency':amount_currency,
471
aml_one_one2 = self.pool.get('account.move.line').create(cr,uid,{
472
'name':order.loan_order.name + u'гэрээ ангилал шилжив.',
473
'partner_id':order.partner_id.id,
474
'account_id':order.loan_order.product_id.property_account_expense.id,
475
'credit':order.loan_balance,
476
'date': datetime.now(),
477
'currency_id':currency_id,
478
'amount_currency':amount_currency*(-1),
481
aml_one_two2 = self.pool.get('account.move.line').create(cr,uid,{
482
'name':order.loan_order.name + u'гэрээ ангилал шилжив.',
483
'partner_id':order.partner_id.id,
484
'account_id':pro.property_account_income.id,
485
'date': datetime.now(),
486
'debit':order.loan_order.loan_balance,
487
'currency_id':currency_id,
488
'amount_currency':amount_currency,
490
amove2 = self.pool.get('account.move').browse(cr,uid,am_id2)
491
amove2.button_validate()
493
print 'new state-',new_st,'pro',pro_id
494
print 'update lorder-',self.pool.get('loan.order').write(cr,uid,order.loan_order.id,
495
{'loan_state':new_st,
497
'late_day':order.beyond_days,
500
sid = self.pool.get('loan.account.statement').create(cr,uid, {
501
'contract_id':order.loan_order.id,
502
'name':u"Эрсдэлийн санг "+str(order.risk_percent)+u"%-р байгуулав, ангилал шилжив('"+unicode(old_desc)+"'->'"+unicode(new_desc)+"')",
503
'write_date':order.date_order,
504
'risk':order.risk_amount})
505
hrid = self.pool.get('hr.employee').search(cr, uid, [('user_id','=',uid)])
507
self.write(cr, uid, ids, {'approve_accountant':hrid[0],
510
raise osv.except_osv(_('Warning'), _('Хүний нөөц дээр энэ ажилтанг бүртгээгүй эсвэл холбоотой хэрэглэгчийг тохируулаагүй байна!'))
515
def copy(self, cr, uid, id, default=None, context=None):
520
'name': self.pool.get('ir.sequence').get(cr, uid, 'loan.risk.foundation'),
522
return super(loan_risk_foundation, self).copy(cr, uid, id, default, context)
524
loan_risk_foundation()
526
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: