[IMP] simplified views
[odoo/odoo.git] / addons / hr_expense / hr_expense.py
index 7cd3d4b..4e1e303 100644 (file)
@@ -2,7 +2,7 @@
 ##############################################################################
 #
 #    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
+#    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
 #
 #    This program is free software: you can redistribute it and/or modify
 #    it under the terms of the GNU Affero General Public License as
 #
 ##############################################################################
 
-from mx import DateTime
 import time
 
 from osv import fields, osv
 from tools.translate import _
 
-def _employee_get(obj,cr,uid,context={}):
+def _employee_get(obj, cr, uid, context=None):
     ids = obj.pool.get('hr.employee').search(cr, uid, [('user_id','=', uid)])
     if ids:
         return ids[0]
     return False
 
 class hr_expense_expense(osv.osv):
-    def copy(self, cr, uid, id, default=None, context={}):
+
+    def copy(self, cr, uid, id, default=None, context=None):
         if not default: default = {}
         default.update( {'invoice_id':False,'date_confirm':False,'date_valid':False,'user_valid':False})
         return super(hr_expense_expense, self).copy(cr, uid, id, default, context)
 
     def _amount(self, cr, uid, ids, field_name, arg, context):
-        id_set = ",".join(map(str, ids))
-        cr.execute("SELECT s.id,COALESCE(SUM(l.unit_amount*l.unit_quantity),0) AS amount FROM hr_expense_expense s LEFT OUTER JOIN hr_expense_line l ON (s.id=l.expense_id) WHERE s.id IN ("+id_set+") GROUP BY s.id ")
+        cr.execute("SELECT s.id,COALESCE(SUM(l.unit_amount*l.unit_quantity),0) AS amount FROM hr_expense_expense s LEFT OUTER JOIN hr_expense_line l ON (s.id=l.expense_id) WHERE s.id =ANY(%s) GROUP BY s.id ",(ids,))
         res = dict(cr.fetchall())
         return res
 
@@ -51,25 +50,26 @@ class hr_expense_expense(osv.osv):
             return self.pool.get('res.currency').search(cr, uid, [('rate','=',1.0)])[0]
 
     _name = "hr.expense.expense"
-    _description = "Expense"
+    _description = "HR Expense"
     _columns = {
         'name': fields.char('Expense Sheet', size=128, required=True),
         'id': fields.integer('Sheet ID', readonly=True),
         'ref': fields.char('Reference', size=32),
         'date': fields.date('Date'),
-        'journal_id': fields.many2one('account.journal', 'Force Journal'),
+        'journal_id': fields.many2one('account.journal', 'Force Journal', help = "The journal used when the expense is invoiced"),
         'employee_id': fields.many2one('hr.employee', "Employee's Name", required=True),
         'user_id': fields.many2one('res.users', 'User', required=True),
-        'date_confirm': fields.date('Date Confirmed'),
-        'date_valid': fields.date('Date Validated'),
+        'date_confirm': fields.date('Confirmation Date', help = "Date of the confirmation of the sheet expense. It's filled when the button Confirm is pressed."),
+        'date_valid': fields.date('Validation Date', help = "Date of the acceptation of the sheet expense. It's filled when the button Accept is pressed."),
         'user_valid': fields.many2one('res.users', 'Validation User'),
         'account_move_id': fields.many2one('account.move', 'Ledger Posting'),
         'line_ids': fields.one2many('hr.expense.line', 'expense_id', 'Expense Lines', readonly=True, states={'draft':[('readonly',False)]} ),
         'note': fields.text('Note'),
         'amount': fields.function(_amount, method=True, string='Total Amount'),
-        'invoice_id': fields.many2one('account.invoice', 'Invoice'),
+        'invoice_id': fields.many2one('account.invoice', "Employee's Invoice"),
         'currency_id': fields.many2one('res.currency', 'Currency', required=True),
-
+        'department_id':fields.many2one('hr.department','Department'),
+        'company_id': fields.many2one('res.company', 'Company', required=True),
         'state': fields.selection([
             ('draft', 'Draft'),
             ('confirm', 'Waiting confirmation'),
@@ -84,8 +84,9 @@ class hr_expense_expense(osv.osv):
         'date' : lambda *a: time.strftime('%Y-%m-%d'),
         'state': lambda *a: 'draft',
         'employee_id' : _employee_get,
-        'user_id' : lambda cr,uid,id,c={}: id,
+        'user_id' : lambda cr, uid, id, c={}: id,
         'currency_id': _get_currency,
+        'company_id': lambda self, cr, uid, c: self.pool.get('res.users').browse(cr, uid, uid, c).company_id.id,
     }
     def expense_confirm(self, cr, uid, ids, *args):
         #for exp in self.browse(cr, uid, ids):
@@ -174,22 +175,20 @@ hr_expense_expense()
 
 class product_product(osv.osv):
     _inherit = "product.product"
-
     _columns = {
-                'hr_expense_ok': fields.boolean('Can be Expensed', help="Determine if the product can be visible in the list of product within a selection from an HR expense sheet line."),
+        'hr_expense_ok': fields.boolean('Can Constitute an Expense', help="Determines if the product can be visible in the list of product within a selection from an HR expense sheet line."),
     }
 
 product_product()
 
-
 class hr_expense_line(osv.osv):
     _name = "hr.expense.line"
     _description = "Expense Line"
+
     def _amount(self, cr, uid, ids, field_name, arg, context):
         if not len(ids):
             return {}
-        id_set = ",".join(map(str, ids))
-        cr.execute("SELECT l.id,COALESCE(SUM(l.unit_amount*l.unit_quantity),0) AS amount FROM hr_expense_line l WHERE id IN ("+id_set+") GROUP BY l.id ")
+        cr.execute("SELECT l.id,COALESCE(SUM(l.unit_amount*l.unit_quantity),0) AS amount FROM hr_expense_line l WHERE id =ANY(%s) GROUP BY l.id ",(ids,))
         res = dict(cr.fetchall())
         return res
 
@@ -205,24 +204,33 @@ class hr_expense_line(osv.osv):
         'description': fields.text('Description'),
         'analytic_account': fields.many2one('account.analytic.account','Analytic account'),
         'ref': fields.char('Reference', size=32),
-        'sequence' : fields.integer('Sequence'),
+        'sequence' : fields.integer('Sequence', help="Gives the sequence order when displaying a list of expense lines."),
     }
     _defaults = {
         'unit_quantity': lambda *a: 1,
         'date_value' : lambda *a: time.strftime('%Y-%m-%d'),
     }
     _order = "sequence"
-    def onchange_product_id(self, cr, uid, ids, product_id, uom_id, context={}):
-        v={}
+
+    def onchange_product_id(self, cr, uid, ids, product_id, uom_id, employee_id, context=None):
+        if context is None:
+            context = {}
+        v = {}
         if product_id:
             product=self.pool.get('product.product').browse(cr,uid,product_id, context=context)
             v['name']=product.name
-            v['unit_amount']=product.standard_price
+
+            # Compute based on pricetype of employee company
+            pricetype_id = self.pool.get('hr.employee').browse(cr,uid,employee_id).user_id.company_id.property_valuation_price_type.id
+            context['currency_id']=self.pool.get('hr.employee').browse(cr,uid,employee_id).user_id.company_id.currency_id.id
+            pricetype=self.pool.get('product.price.type').browse(cr,uid,pricetype_id)
+            amount_unit=product.price_get(pricetype.field, context)[product.id]
+
+            v['unit_amount']=amount_unit
             if not uom_id:
                 v['uom_id']=product.uom_id.id
-        return {'value':v}
+        return {'value': v}
 
 hr_expense_line()
 
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-