diff --git a/addons/account/invoice.py b/addons/account/invoice.py
index 8e236c6879c..ed9a62703df 100644
--- a/addons/account/invoice.py
+++ b/addons/account/invoice.py
@@ -194,7 +194,7 @@ class account_invoice(osv.osv):
'journal_id': fields.many2one('account.journal', 'Journal', required=True,readonly=True, states={'draft':[('readonly',False)]}),
'company_id': fields.many2one('res.company', 'Company', required=True),
'check_total': fields.float('Total', digits=(16,2), states={'open':[('readonly',True)],'close':[('readonly',True)]}),
- 'reconciled': fields.function(_reconciled, method=True, string='Paid/Reconciled', type='boolean', help="The account moves of the invoice have been reconciled with account moves of the payment(s)."),
+ 'reconciled': fields.function(_reconciled, method=True, string='Paid/Reconciled', type='boolean', store=True, help="The account moves of the invoice have been reconciled with account moves of the payment(s)."),
'partner_bank': fields.many2one('res.partner.bank', 'Bank Account',
help='The bank account to pay to or to be paid from'),
'move_lines':fields.function(_get_lines , method=True,type='many2many' , relation='account.move.line',string='Move Lines'),
diff --git a/addons/account_analytic_analysis/account_analytic_analysis.py b/addons/account_analytic_analysis/account_analytic_analysis.py
index 15db30b6a4b..e460c2872b4 100644
--- a/addons/account_analytic_analysis/account_analytic_analysis.py
+++ b/addons/account_analytic_analysis/account_analytic_analysis.py
@@ -407,22 +407,22 @@ class account_analytic_account(osv.osv):
return res
_columns ={
- 'ca_invoiced': fields.function(_ca_invoiced_calc, method=True, type='float', string='Invoiced amount'),
- 'total_cost': fields.function(_total_cost_calc, method=True, type='float', string='Total cost'),
- 'ca_to_invoice': fields.function(_ca_to_invoice_calc, method=True, type='float', string='Uninvoiced amount'),
- 'ca_theorical': fields.function(_ca_theorical_calc, method=True, type='float', string='Theorical revenue'),
- 'hours_quantity': fields.function(_hours_quantity_calc, method=True, type='float', string='Hours tot'),
- 'last_invoice_date': fields.function(_last_invoice_date_calc, method=True, type='date', string='Last invoice date'),
- 'last_worked_invoiced_date': fields.function(_last_worked_invoiced_date_calc, method=True, type='date', string='Last invoiced worked date'),
- 'last_worked_date': fields.function(_last_worked_date_calc, method=True, type='date', string='Last worked date'),
- 'hours_qtt_non_invoiced': fields.function(_hours_qtt_non_invoiced_calc, method=True, type='float', string='Uninvoiced hours'),
- 'hours_qtt_invoiced': fields.function(_hours_qtt_invoiced_calc, method=True, type='float', string='Invoiced hours'),
- 'remaining_hours': fields.function(_remaining_hours_calc, method=True, type='float', string='Remaining hours'),
- 'remaining_ca': fields.function(_remaining_ca_calc, method=True, type='float', string='Remaining revenue'),
- 'revenue_per_hour': fields.function(_revenue_per_hour_calc, method=True, type='float', string='Revenue per hours (real)'),
- 'real_margin': fields.function(_real_margin_calc, method=True, type='float', string='Real margin'),
- 'theorical_margin': fields.function(_theorical_margin_calc, method=True, type='float', string='Theorical margin'),
- 'real_margin_rate': fields.function(_real_margin_rate_calc, method=True, type='float', string='Real margin rate (%)'),
+ 'ca_invoiced': fields.function(_ca_invoiced_calc, method=True, type='float', string='Invoiced Amount', help="Total customer invoiced amount for this account."),
+ 'total_cost': fields.function(_total_cost_calc, method=True, type='float', string='Total Costs', help="Total of costs for this account. It includes real costs (from invoices) and indirect costs, like time spent on timesheets."),
+ 'ca_to_invoice': fields.function(_ca_to_invoice_calc, method=True, type='float', string='Uninvoiced Amount', help="If invoice from analytic account, the remaining amount you can invoice to the customer based on the total costs."),
+ 'ca_theorical': fields.function(_ca_theorical_calc, method=True, type='float', string='Theorical Revenue', help="Based on the costs you had on the project, what would have been the revenue of all these costs have been invoiced at the normal sale price provided by the pricelist."),
+ 'hours_quantity': fields.function(_hours_quantity_calc, method=True, type='float', string='Hours Tot', help="Number of hours on spent on the analytic account (from timesheet). It computes on all journal of type 'general'."),
+ 'last_invoice_date': fields.function(_last_invoice_date_calc, method=True, type='date', string='Last Invoice Date', help="Date of the last invoice created for this analytic account."),
+ 'last_worked_invoiced_date': fields.function(_last_worked_invoiced_date_calc, method=True, type='date', string='Last Invoiced Worked Date', help="If invoice from the costs, this is the date of the latest work or cost that have been invoiced."),
+ 'last_worked_date': fields.function(_last_worked_date_calc, method=True, type='date', string='Last Worked Date', help="Date of the latest work done on this account."),
+ 'hours_qtt_non_invoiced': fields.function(_hours_qtt_non_invoiced_calc, method=True, type='float', string='Uninvoiced Hours', help="Number of hours (from journal of type 'general') that can be invoiced if you invoice based on analytic account."),
+ 'hours_qtt_invoiced': fields.function(_hours_qtt_invoiced_calc, method=True, type='float', string='Invoiced Hours', help="Number of hours that already have invoiced. If you don't invoice based on costs, it's the number of hours spent. If you invoice based on hours, it's the hours that have been invoiced."),
+ 'remaining_hours': fields.function(_remaining_hours_calc, method=True, type='float', string='Remaining Hours', help="Computed using the forumla: Maximum Quantity - Hours Tot."),
+ 'remaining_ca': fields.function(_remaining_ca_calc, method=True, type='float', string='Remaining Revenue', help="If you invoice based on costs, this is the revenue you will invoice to the customer when you will launch the invoicing wizard."),
+ 'revenue_per_hour': fields.function(_revenue_per_hour_calc, method=True, type='float', string='Revenue per Hours (real)', help="Computed using the formula: Invoiced Amount / Hours Tot."),
+ 'real_margin': fields.function(_real_margin_calc, method=True, type='float', string='Real Margin', help="Computed using the formula: Invoiced Amount - Total Costs."),
+ 'theorical_margin': fields.function(_theorical_margin_calc, method=True, type='float', string='Theorical Margin', help="Computed using the formula: (Theorical Revenue / Total Costs) * 100."),
+ 'real_margin_rate': fields.function(_real_margin_rate_calc, method=True, type='float', string='Real Margin Rate (%)', help="Computes using the formula: (Invoiced Amount / Total Costs) * 100."),
'month_ids': fields.function(_month, method=True, type='many2many', relation='account_analytic_analysis.summary.month', string='Month'),
'user_ids': fields.function(_user, method=True, type="many2many", relation='account_analytic_analysis.summary.user', string='User'),
}
diff --git a/addons/account_analytic_analysis/account_analytic_analysis_menu.xml b/addons/account_analytic_analysis/account_analytic_analysis_menu.xml
index ebe0d4638bb..fc953b9d74c 100644
--- a/addons/account_analytic_analysis/account_analytic_analysis_menu.xml
+++ b/addons/account_analytic_analysis/account_analytic_analysis_menu.xml
@@ -8,7 +8,7 @@
My managed accounts
account.analytic.account
form
- tree,graph
+ tree,form,graph
[('user_id','=',uid)]
@@ -18,7 +18,7 @@
Uninvoiced entries of my accounts
account.analytic.line
form
- tree,form
+ tree,form,graph
[('invoice_id','=',False),('to_invoice','!=',False),('account_id.user_id','=',uid)]
@@ -28,7 +28,7 @@
My Open Managed Accounts
account.analytic.account
form
- tree,graph
+ tree,form,graph
[('user_id','=',uid),('state','=','open')]
@@ -38,7 +38,7 @@
My Pending Managed Accounts
account.analytic.account
form
- tree,graph
+ tree,form,graph
[('user_id','=',uid),('state','=','pending')]
@@ -48,7 +48,7 @@
Overpassed accounts
account.analytic.account
form
- tree,graph
+ tree,form,graph
[('date','<=',time.strftime('%Y-%m-%d')),('state','=','open')]
@@ -58,7 +58,7 @@
All Analytic Accounts
account.analytic.account
form
- tree,graph
+ tree,form,graph
[]
@@ -69,45 +69,45 @@
Draft Analytic Accounts
account.analytic.account
form
- tree,graph
+ tree,form,graph
[('state','=','draft')]
-
+
Open Analytic Accounts
account.analytic.account
form
- tree,graph
+ tree,form,graph
[('state','=','open')]
-
+
Pending Analytic Accounts
account.analytic.account
form
- tree,graph
+ tree,form,graph
[('state','=','pending')]
-
+
Simplified View Analytic Accounts
account.analytic.account
form
- tree,graph
+ tree,form,graph
[]
-
+
diff --git a/addons/account_analytic_analysis/account_analytic_analysis_view.xml b/addons/account_analytic_analysis/account_analytic_analysis_view.xml
index fb4a3d774d2..748b4b53201 100644
--- a/addons/account_analytic_analysis/account_analytic_analysis_view.xml
+++ b/addons/account_analytic_analysis/account_analytic_analysis_view.xml
@@ -46,7 +46,7 @@
-
+
diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml
index 12f9a17491f..edbabad208d 100644
--- a/addons/project/project_view.xml
+++ b/addons/project/project_view.xml
@@ -119,14 +119,13 @@
- Template projects
+ Template of Projects
project.project
form
[('state','=','template')]
-
-
+
New Project
diff --git a/addons/project/wizard/task_delegate.py b/addons/project/wizard/task_delegate.py
index a6c2ed3649f..a2f2c3361b0 100644
--- a/addons/project/wizard/task_delegate.py
+++ b/addons/project/wizard/task_delegate.py
@@ -66,6 +66,7 @@ class wizard_delegate(wizard.interface):
'name': data['form']['name'],
'user_id': data['form']['user_id'],
'planned_hours': data['form']['planned_hours'],
+ 'remaining_hours': data['form']['planned_hours'],
'parent_id': data['id'],
'state': 'open',
'description': data['form']['include_info'] and task.description or '',
diff --git a/addons/sale/sale.py b/addons/sale/sale.py
index 94c4ccbf00c..d202dd8ece9 100644
--- a/addons/sale/sale.py
+++ b/addons/sale/sale.py
@@ -671,6 +671,7 @@ class sale_order_line(osv.osv):
'notes': fields.text('Notes'),
'th_weight' : fields.float('Weight'),
'state': fields.selection([('draft','Draft'),('confirmed','Confirmed'),('done','Done'),('cancel','Canceled')], 'Status', required=True, readonly=True),
+ 'order_partner_id': fields.related('order_id', 'partner_id', type='many2one', relation='res.partner', string='Customer')
}
_order = 'sequence, id'
_defaults = {
diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml
index 0e672a62112..44347f9fdc2 100644
--- a/addons/sale/sale_view.xml
+++ b/addons/sale/sale_view.xml
@@ -360,7 +360,8 @@
-
+
+
@@ -368,6 +369,7 @@
+
diff --git a/addons/stock/stock.py b/addons/stock/stock.py
index 5718c344e4d..3cc80113a17 100644
--- a/addons/stock/stock.py
+++ b/addons/stock/stock.py
@@ -612,6 +612,9 @@ class stock_picking(osv.osv):
continue
payment_term_id = False
partner = picking.address_id and picking.address_id.partner_id
+ raise osv.except_osv(_('Error, no partner !'),
+ _('Please put a partner on the picking list if you want to generate invoice.'))
+
if type in ('out_invoice', 'out_refund'):
account_id = partner.property_account_receivable.id
if picking.sale_id and picking.sale_id.payment_term:
diff --git a/addons/stock/stock_view.xml b/addons/stock/stock_view.xml
index 5db7c283517..5789aa27465 100644
--- a/addons/stock/stock_view.xml
+++ b/addons/stock/stock_view.xml
@@ -264,15 +264,15 @@
-
-
@@ -794,7 +794,7 @@
-
+
@@ -1302,31 +1302,51 @@
form
tree,form
-
+
-
+
-
-
-
+
+
+
+
+
tree_but_open
stock.location
Products
-
+
-
-
+
+
tree_but_open
stock.location
Open Products
-
-
-
-
-
+
+
+
+
+
diff --git a/addons/subscription/subscription_view.xml b/addons/subscription/subscription_view.xml
index 7e1d86575dd..223a94bdcf5 100644
--- a/addons/subscription/subscription_view.xml
+++ b/addons/subscription/subscription_view.xml
@@ -15,12 +15,14 @@
form