diff --git a/addons/project/report/project_report.py b/addons/project/report/project_report.py index 128bdb39378..dc9ad3adb22 100644 --- a/addons/project/report/project_report.py +++ b/addons/project/report/project_report.py @@ -32,7 +32,7 @@ class report_project_task_user(osv.osv): 'year': fields.char('Year',size=64,required=False, readonly=True), 'user_id':fields.many2one('res.users', 'Assigned To', readonly=True), 'date_start': fields.date('Starting Date',readonly=True), - 'no_of_days': fields.integer('#Days', size=128, readonly=True), + 'no_of_days': fields.integer('# of Days', size=128, readonly=True), 'description': fields.text('Description',readonly=True), 'date_end': fields.date('Ending Date',readonly=True), 'date_deadline': fields.date('Deadline',readonly=True), @@ -40,10 +40,13 @@ class report_project_task_user(osv.osv): 'hours_planned': fields.float('Planned Hours', readonly=True), 'hours_effective': fields.float('Effective Hours', readonly=True), 'hours_delay': fields.float('Avg. Plan.-Eff.', readonly=True), - 'closing_days': fields.float('Avg Closing Delay', digits=(16,2), readonly=True, group_operator="avg", + 'remaining_hours': fields.float('Remaining Hours', readonly=True), + 'total_hours': fields.float('Total Hours', readonly=True), + 'closing_days': fields.float('Days to Close', digits=(16,2), readonly=True, group_operator="avg", help="Number of Days to close the task"), - - 'nbr': fields.integer('#Number of tasks', readonly=True), + 'opening_days': fields.float('Days to Open', digits=(16,2), readonly=True, group_operator="avg", + help="Number of Days to Open the task"), + 'nbr': fields.integer('# of tasks', readonly=True), 'priority' : fields.selection([('4','Very Low'), ('3','Low'), ('2','Medium'), @@ -87,8 +90,11 @@ class report_project_task_user(osv.osv): t.company_id, t.partner_id, t.type, + sum(remaining_hours) as remaining_hours, + sum(total_hours) as total_hours, sum(planned_hours) as hours_planned, avg(extract('epoch' from (t.date_end-t.create_date)))/(3600*24) as closing_days, + avg(extract('epoch' from (t.date_start-t.create_date)))/(3600*24) as opening_days, sum(w.hours) as hours_effective, ((sum(planned_hours)-sum(w.hours))/count(distinct t.id))::decimal(16,2) as hours_delay from project_task t diff --git a/addons/project/report/project_report_view.xml b/addons/project/report/project_report_view.xml index 89d44963b64..75e8d01ba41 100644 --- a/addons/project/report/project_report_view.xml +++ b/addons/project/report/project_report_view.xml @@ -8,8 +8,8 @@ report.project.task.user tree - - + + @@ -22,12 +22,15 @@ - - + + + + - + + @@ -37,7 +40,7 @@ report.project.task.user graph - + @@ -50,7 +53,7 @@ report.project.task.user search - + + - - - - + + - - - - + + @@ -138,7 +138,7 @@ - Tasks + Tasks Analysis report.project.task.user form tree,graph diff --git a/addons/sale/wizard/sale_line_invoice.py b/addons/sale/wizard/sale_line_invoice.py index 15405f07874..195931ecb04 100644 --- a/addons/sale/wizard/sale_line_invoice.py +++ b/addons/sale/wizard/sale_line_invoice.py @@ -21,6 +21,7 @@ from osv import fields, osv from tools.translate import _ +import netsvc class sale_order_line_make_invoice(osv.osv_memory): _name = "sale.order.line.make.invoice" diff --git a/addons/sale/wizard/sale_make_invoice.py b/addons/sale/wizard/sale_make_invoice.py index 5ea01b1db6c..0ce2705ac77 100644 --- a/addons/sale/wizard/sale_make_invoice.py +++ b/addons/sale/wizard/sale_make_invoice.py @@ -19,9 +19,7 @@ ############################################################################## from osv import fields, osv -from service import web_services from tools.translate import _ -import ir import netsvc class sale_make_invoice(osv.osv_memory): @@ -37,13 +35,13 @@ class sale_make_invoice(osv.osv_memory): def view_init(self, cr, uid, fields_list, context=None): record_id = context and context.get('active_id', False) order = self.pool.get('sale.order').browse(cr, uid, record_id) - if order.state=='draft': + if order.state == 'draft': raise osv.except_osv(_('Warning !'),'You can not create invoice when sale order is not confirmed.') return False def make_invoices(self, cr, uid, ids, context={}): order_obj = self.pool.get('sale.order') newinv = [] - data=self.read(cr,uid,ids)[0] + data = self.read(cr,uid,ids)[0] order_obj.action_invoice_create(cr, uid, context.get(('active_ids'),[]), data['grouped'],date_inv = data['invoice_date']) wf_service = netsvc.LocalService("workflow") for id in context.get(('active_ids'),[]): diff --git a/addons/stock/stock.py b/addons/stock/stock.py index a1c30a40a65..c4f9634d579 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -1187,7 +1187,7 @@ class stock_move(osv.osv): def _check_product_lot(self, cr, uid, ids): for move in self.browse(cr, uid, ids): - if move.prodlot_id and (move.prodlot_id.product_id.id != move.product_id.id): + if move.prodlot_id and move.state == 'done' and (move.prodlot_id.product_id.id != move.product_id.id): return False return True