diff --git a/addons/account/account.py b/addons/account/account.py
index 3fb74401946..61319f7f973 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -183,7 +183,7 @@ class account_account(osv.osv):
temp.append(x)
ids2 += self._get_children_and_consol(cr, uid, temp, context)
return ids2
-
+
def search(self, cr, uid, args, offset=0, limit=None, order=None,
context=None, count=False):
if context is None:
@@ -320,7 +320,7 @@ class account_account(osv.osv):
level = obj.level + 1
res[account.id] = level
return res
-
+
_columns = {
'name': fields.char('Name', size=128, required=True, select=True),
'currency_id': fields.many2one('res.currency', 'Secondary Currency', help="Forces all moves for this account to have this secondary currency."),
@@ -477,7 +477,7 @@ class account_account(osv.osv):
def _check_moves(self, cr, uid, ids, method, context):
line_obj = self.pool.get('account.move.line')
account_ids = self.search(cr, uid, [('id', 'child_of', ids)])
-
+
if line_obj.search(cr, uid, [('account_id', 'in', account_ids)]):
if method == 'write':
raise osv.except_osv(_('Error !'), _('You cannot deactivate an account that contains account moves.'))
@@ -511,7 +511,7 @@ class account_account(osv.osv):
context = {}
if 'active' in vals and not vals['active']:
self._check_moves(cr, uid, ids, "write", context)
- if 'type' in vals.keys():
+ if 'type' in vals.keys():
self._check_allow_type_change(cr, uid, ids, vals['type'], context=context)
return super(account_account, self).write(cr, uid, ids, vals, context=context)
@@ -559,7 +559,7 @@ class account_journal(osv.osv):
_columns = {
'name': fields.char('Journal Name', size=64, required=True, translate=True),
'code': fields.char('Code', size=16),
- 'type': fields.selection([('sale', 'Sale'), ('purchase', 'Purchase'), ('expanse', 'Expanse'), ('cash', 'Cash'), ('bank', 'Bank'), ('general', 'General'), ('situation', 'Situation')], 'Type', size=32, required=True,
+ 'type': fields.selection([('sale', 'Sale'), ('purchase', 'Purchase'), ('expense', 'Expense'), ('cash', 'Cash'), ('bank', 'Bank'), ('general', 'General'), ('situation', 'Situation')], 'Type', size=32, required=True,
help="Select 'Sale' for Sale journal to be used at the time of making invoice."\
" Select 'Purchase' for Purchase Journal to be used at the time of approving purchase order."\
" Select 'Cash' to be used at the time of making payment."\
@@ -683,7 +683,7 @@ class account_fiscalyear(osv.osv):
else:
return False
return ids[0]
-
+
def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=80):
if args is None:
args = []
@@ -695,7 +695,7 @@ class account_fiscalyear(osv.osv):
if not ids:
ids = self.search(cr, user, [('name',operator,name)]+ args, limit=limit)
return self.name_get(cr, user, ids, context=context)
-
+
account_fiscalyear()
class account_period(osv.osv):
@@ -771,7 +771,7 @@ class account_period(osv.osv):
cr.execute('update account_journal_period set state=%s where period_id=%s', (mode, id))
cr.execute('update account_period set state=%s where id=%s', (mode, id))
return True
-
+
def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=80):
if args is None:
args = []
@@ -1375,7 +1375,7 @@ class account_tax_code(osv.osv):
return False
level -= 1
return True
-
+
def copy(self, cr, uid, id, default=None, context=None):
if default is None:
@@ -1383,7 +1383,7 @@ class account_tax_code(osv.osv):
default = default.copy()
default.update({'line_ids': []})
return super(account_tax_code, self).copy(cr, uid, id, default, context)
-
+
_constraints = [
(_check_recursion, 'Error ! You can not create recursive accounts.', ['parent_id'])
]
@@ -1441,6 +1441,7 @@ class account_tax(osv.osv):
'include_base_amount': fields.boolean('Included in base amount', help="Indicates if the amount of tax must be included in the base amount for the computation of the next taxes"),
'company_id': fields.many2one('res.company', 'Company', required=True),
'description': fields.char('Tax Code',size=32),
+ 'price_include': fields.boolean('Tax Included in Price', help="Check this if the price you use on the product and invoices includes this tax."),
'type_tax_use': fields.selection([('sale','Sale'),('purchase','Purchase'),('all','All')], 'Tax Application', required=True)
}
@@ -1473,6 +1474,7 @@ class account_tax(osv.osv):
'applicable_type': lambda *a: 'true',
'type': lambda *a: 'percent',
'amount': lambda *a: 0,
+ 'price_include': lambda *a: 0,
'active': lambda *a: 1,
'type_tax_use': lambda *a: 'all',
'sequence': lambda *a: 1,
@@ -1963,13 +1965,12 @@ class account_add_tmpl_wizard(osv.osv_memory):
if not tids or not tids[0]['parent_id']:
return False
ptids = tmpl_obj.read(cr, uid, [tids[0]['parent_id'][0]],['code'])
+ res = None
if not ptids or not ptids[0]['code']:
raise osv.except_osv(_('Error !'), _('Cannot locate parent code for template account!'))
res = acc_obj.search(cr,uid,[('code','=',ptids[0]['code'])])
- if res:
- return res[0]
- else:
- return False
+
+ return res and res[0] or False
_columns = {
'cparent_id':fields.many2one('account.account', 'Parent target', help="Creates an account with the selected template under this existing parent.", required=True),
diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py
index 36b65d20dca..7350596c4e3 100644
--- a/addons/account/account_move_line.py
+++ b/addons/account/account_move_line.py
@@ -530,9 +530,8 @@ class account_move_line(osv.osv):
date = datetime.now().strftime('%Y-%m-%d')
part = self.pool.get('res.partner').browse(cr, uid, partner_id)
- if part.property_payment_term and part.property_payment_term.line_ids:
- payterm = part.property_payment_term.line_ids[0]
- res = self.pool.get('account.payment.term').compute(cr, uid, payterm.id, 100, date)
+ if part.property_payment_term:
+ res = self.pool.get('account.payment.term').compute(cr, uid, part.property_payment_term.id, 100, date)
if res:
val['date_maturity'] = res[0][0]
if not account_id:
@@ -540,10 +539,10 @@ class account_move_line(osv.osv):
id2 = part.property_account_receivable.id
if journal:
jt = self.pool.get('account.journal').browse(cr, uid, journal).type
- if jt=='sale':
+ if jt == 'sale':
val['account_id'] = self.pool.get('account.fiscal.position').map_account(cr, uid, part and part.property_account_position or False, id2)
- elif jt=='purchase':
+ elif jt == 'purchase':
val['account_id'] = self.pool.get('account.fiscal.position').map_account(cr, uid, part and part.property_account_position or False, id1)
if val.get('account_id', False):
d = self.onchange_account_id(cr, uid, ids, val['account_id'])
diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml
index 64811758701..a2729676fe3 100644
--- a/addons/account/account_view.xml
+++ b/addons/account/account_view.xml
@@ -283,32 +283,32 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -623,6 +623,7 @@
+
@@ -654,6 +655,7 @@
+
@@ -1493,7 +1495,7 @@
-
+
diff --git a/addons/account/i18n/nl_BE.po b/addons/account/i18n/nl_BE.po
index f298c31854d..5df4bb0be72 100644
--- a/addons/account/i18n/nl_BE.po
+++ b/addons/account/i18n/nl_BE.po
@@ -7,30 +7,30 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
-"PO-Revision-Date: 2009-04-24 15:00+0000\n"
-"Last-Translator: Fabien (Open ERP) \n"
+"PO-Revision-Date: 2010-06-02 08:19+0000\n"
+"Last-Translator: jan@synkronized.be \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 04:08+0000\n"
+"X-Launchpad-Export-Date: 2010-06-03 03:33+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: account
#: field:account.tax.template,description:0
msgid "Internal Name"
-msgstr ""
+msgstr "Interne naam"
#. module: account
#: view:account.tax.code:0
msgid "Account Tax Code"
-msgstr ""
+msgstr "Belasting code"
#. module: account
#: model:ir.actions.act_window,name:account.action_invoice_tree9
#: model:ir.ui.menu,name:account.menu_action_invoice_tree9
msgid "Unpaid Supplier Invoices"
-msgstr ""
+msgstr "Onbetaalde inkoopfacturen"
#. module: account
#: model:ir.ui.menu,name:account.menu_finance_entries
@@ -50,12 +50,12 @@ msgstr ""
#. module: account
#: model:account.account.type,name:account.account_type_asset
msgid "Asset"
-msgstr ""
+msgstr "Activa"
#. module: account
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
-msgstr ""
+msgstr "Ongeldige modelnaam in de actie-definitie."
#. module: account
#: help:account.journal,currency:0
@@ -65,7 +65,7 @@ msgstr ""
#. module: account
#: wizard_view:account_use_models,init_form:0
msgid "Select Message"
-msgstr ""
+msgstr "Kies bericht"
#. module: account
#: help:product.category,property_account_income_categ:0
@@ -82,19 +82,19 @@ msgstr ""
#. module: account
#: wizard_view:account.automatic.reconcile,reconcile:0
msgid "Reconciliation result"
-msgstr ""
+msgstr "Afletterresultaat"
#. module: account
#: model:ir.actions.act_window,name:account.act_account_acount_move_line_open_unreconciled
msgid "Unreconciled entries"
-msgstr ""
+msgstr "Niet afgeletterde boekingen"
#. module: account
#: field:account.invoice.tax,base_code_id:0
#: field:account.tax,base_code_id:0
#: field:account.tax.template,base_code_id:0
msgid "Base Code"
-msgstr ""
+msgstr "Basiscode"
#. module: account
#: view:account.account:0
@@ -2132,7 +2132,8 @@ msgid "Analytic Entry"
msgstr ""
#. module: account
-#: view:res.company:0 field:res.company,overdue_msg:0
+#: view:res.company:0
+#: field:res.company,overdue_msg:0
msgid "Overdue Payments Message"
msgstr ""
diff --git a/addons/account/invoice.py b/addons/account/invoice.py
index 4af3b43d54c..d8205ababa7 100644
--- a/addons/account/invoice.py
+++ b/addons/account/invoice.py
@@ -951,23 +951,8 @@ class account_invoice(osv.osv):
return taxes.values()
def _log_event(self, cr, uid, ids, factor=1.0, name='Open Invoice'):
- invs = self.read(cr, uid, ids, ['type','partner_id','amount_untaxed'])
- for inv in invs:
- part=inv['partner_id'] and inv['partner_id'][0]
- pc = pr = 0.0
- cr.execute('select sum(quantity*price_unit) from account_invoice_line where invoice_id=%s', (inv['id'],))
- total = inv['amount_untaxed']
- if inv['type'] in ('in_invoice','in_refund'):
- partnertype='supplier'
- eventtype = 'purchase'
- pc = total*factor
- else:
- partnertype = 'customer'
- eventtype = 'sale'
- pr = total*factor
- if self.pool.get('res.partner.event.type').check(cr, uid, 'invoice_open'):
- self.pool.get('res.partner.event').create(cr, uid, {'name':'Invoice: '+name, 'som':False, 'description':name+' '+str(inv['id']), 'document':name, 'partner_id':part, 'date':time.strftime('%Y-%m-%d %H:%M:%S'), 'canal_id':False, 'user_id':uid, 'partner_type':partnertype, 'probability':1.0, 'planned_revenue':pr, 'planned_cost':pc, 'type':eventtype})
- return len(invs)
+ #TODO: implement messages system
+ return True
def name_get(self, cr, uid, ids, context=None):
if not len(ids):
diff --git a/addons/account/partner_view.xml b/addons/account/partner_view.xml
index 286d0f1d79e..e1e43420d6e 100644
--- a/addons/account/partner_view.xml
+++ b/addons/account/partner_view.xml
@@ -74,13 +74,13 @@
-
+
-
+
@@ -132,11 +132,13 @@
form
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/addons/account/report/account_balance.py b/addons/account/report/account_balance.py
index e4731e2c994..78683b5120b 100644
--- a/addons/account/report/account_balance.py
+++ b/addons/account/report/account_balance.py
@@ -22,9 +22,15 @@
import xml
import copy
from operator import itemgetter
-import time
import datetime
from report import report_sxw
+import xml.dom.minidom
+import os, time
+import osv
+import re
+import tools
+import pooler
+import sys
class account_balance(report_sxw.rml_parse):
_name = 'report.account.account.balance'
@@ -44,6 +50,10 @@ class account_balance(report_sxw.rml_parse):
})
self.context = context
+ def _add_header(self, node, header=1):
+ if header==0:
+ self.rml_header = ""
+ return True
def get_fiscalyear(self, form):
res=[]
if form.has_key('fiscalyear'):
@@ -56,16 +66,14 @@ class account_balance(report_sxw.rml_parse):
def get_periods(self, form):
result=''
- if form.has_key('periods') and form['periods'][0][2]:
- period_ids = form['periods'][0][2]
- self.cr.execute("select name from account_period where id =ANY(%s)" ,(period_ids))
- res = self.cr.fetchall()
- len_res = len(res)
- for r in res:
- if (r == res[len_res-1]):
- result+=r[0]+". "
+ if form.has_key('periods') and form['periods']:
+ period_ids = form['periods']
+ per_ids = self.pool.get('account.period').browse(self.cr,self.uid,form['periods'])
+ for r in per_ids:
+ if r == per_ids[len(per_ids)-1]:
+ result+=r.name+". "
else:
- result+=r[0]+", "
+ result+=r.name+", "
else:
fy_obj = self.pool.get('account.fiscalyear').browse(self.cr,self.uid,form['fiscalyear'])
res = fy_obj.period_ids
@@ -172,5 +180,8 @@ class account_balance(report_sxw.rml_parse):
def _sum_debit(self):
return self.sum_debit
-report_sxw.report_sxw('report.account.account.balance', 'account.account', 'addons/account/report/account_balance.rml', parser=account_balance, header=False)
+
+
+
+report_sxw.report_sxw('report.account.account.balance', 'account.account', 'addons/account/report/account_balance.rml', parser=account_balance, header=0)
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/report/account_balance.rml b/addons/account/report/account_balance.rml
index fb8eb53c418..af4cee7a7ba 100644
--- a/addons/account/report/account_balance.rml
+++ b/addons/account/report/account_balance.rml
@@ -66,6 +66,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -95,6 +116,8 @@
+
+
@@ -141,14 +164,46 @@
-
+
+
- [[ get_fiscalyear(data['form']) or removeParentNode('para') ]]:
- [[ get_periods(data['form']) or removeParentNode('para') ]]
+ Fiscal Year
+
+
+ End Date
+
+
+ Start Date
+
+
+ Display Account
+
+
+ Periods
-
+
+
+
+
+ [[ get_fiscalyear(data['form']) ]]
+
+
+ [[ data['form']['date_from'] ]]
+
+
+ [[ data['form']['date_to'] ]]
+
+
+ [[ (data['form']['display_account']=='bal_all' and 'All') or (data['form']['display_account']=='bal_mouvement' and 'With movements') or 'With balance is not equal to 0']]
+
+
+ [[data['form']['periods'] and get_periods(data['form']) or '']]
+
+
+
+
diff --git a/addons/account/report/rml_parse.py b/addons/account/report/rml_parse.py
index ecc7c237631..1b38b930b2b 100644
--- a/addons/account/report/rml_parse.py
+++ b/addons/account/report/rml_parse.py
@@ -153,14 +153,11 @@ class rml_parse(report_sxw.rml_parse):
return Stringer
def _add_header(self, node, header=1):
- if self.name == 'account.account.balance.landscape':
- if header==2:
- rml_head = self.rml_header2
- else:
- rml_head = self.rml_header
- rml_head = rml_head.replace('','''[[company.logo]] ''')
+ if header==2:
+ rml_head = self.rml_header2
else:
- return super(rml_parse, self)._add_header(node, header)
+ rml_head = self.rml_header
+ rml_head = rml_head.replace('','''[[company.logo]] ''')
return True
# def _add_header(self, node):
diff --git a/addons/account/rml_parse.py b/addons/account/rml_parse.py
deleted file mode 100755
index fd73d16a406..00000000000
--- a/addons/account/rml_parse.py
+++ /dev/null
@@ -1,166 +0,0 @@
-# -*- encoding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2008 Tiny SPRL (). All Rights Reserved
-# $Id$
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-from report import report_sxw
-import xml.dom.minidom
-import os, time
-import osv
-import re
-import tools
-import pooler
-import re
-import sys
-
-class rml_parse(report_sxw.rml_parse):
- def __init__(self, cr, uid, name, context):
- super(rml_parse, self).__init__(cr, uid, name, context=None)
- self.localcontext.update({
- 'comma_me': self.comma_me,
- 'format_date': self._get_and_change_date_format_for_swiss,
- 'strip_name' : self._strip_name,
- 'explode_name' : self._explode_name,
- })
-
- def comma_me(self,amount):
- #print "#" + str(amount) + "#"
- if not amount:
- amount = 0.0
- if type(amount) is float :
- amount = str('%.2f'%amount)
- else :
- amount = str(amount)
- if (amount == '0'):
- return ' '
- orig = amount
- new = re.sub("^(-?\d+)(\d{3})", "\g<1>'\g<2>", amount)
- if orig == new:
- return new
- else:
- return self.comma_me(new)
-
- def _ellipsis(self, string, maxlen=100, ellipsis = '...'):
- ellipsis = ellipsis or ''
- try:
- return string[:maxlen - len(ellipsis) ] + (ellipsis, '')[len(string) < maxlen]
- except Exception, e:
- return False
-
- def _strip_name(self, name, maxlen=50):
- return self._ellipsis(name, maxlen, '...')
-
- def _get_and_change_date_format_for_swiss (self,date_to_format):
- date_formatted=''
- if date_to_format:
- date_formatted = strptime (date_to_format,'%Y-%m-%d').strftime('%d.%m.%Y')
- return date_formatted
-
- def _explode_name(self,chaine,length):
- # We will test if the size is less then account
- full_string = ''
- if (len(str(chaine)) <= length):
- return chaine
- #
- else:
- chaine = unicode(chaine,'utf8').encode('iso-8859-1')
- rup = 0
- for carac in chaine:
- rup = rup + 1
- if rup == length:
- full_string = full_string + '\n'
- full_string = full_string + carac
- rup = 0
- else:
- full_string = full_string + carac
-
- return full_string
-
- def makeAscii(self,str):
- try:
- Stringer = str.encode("utf-8")
- except UnicodeDecodeError:
- try:
- Stringer = str.encode("utf-16")
- except UnicodeDecodeError:
- print "UTF_16 Error"
- Stringer = str
- else:
- return Stringer
- else:
- return Stringer
- return Stringer
-
- def explode_this(self,chaine,length):
- #chaine = self.repair_string(chaine)
- chaine = rstrip(chaine)
- ast = list(chaine)
- i = length
- while i <= len(ast):
- ast.insert(i,'\n')
- i = i + length
- chaine = str("".join(ast))
- return chaine
-
- def repair_string(self,chaine):
- ast = list(chaine)
- UnicodeAst = []
- _previouslyfound = False
- i = 0
- #print str(ast)
- while i < len(ast):
- elem = ast[i]
- try:
- Stringer = elem.encode("utf-8")
- except UnicodeDecodeError:
- to_reencode = elem + ast[i+1]
- print str(to_reencode)
- Good_char = to_reencode.decode('utf-8')
- UnicodeAst.append(Good_char)
- i += i +2
- else:
- UnicodeAst.append(elem)
- i += i + 1
- return "".join(UnicodeAst)
-
- def ReencodeAscii(self,str):
- print sys.stdin.encoding
- try:
- Stringer = str.decode("ascii")
- except UnicodeEncodeError:
- print "REENCODING ERROR"
- return str.encode("ascii")
- except UnicodeDecodeError:
- print "DECODING ERROR"
- return str.encode("ascii")
- else:
- print Stringer
- return Stringer
-
- def _add_header(self, node, header=1):
- if header==2:
- rml_head = self.rml_header2
- else:
- rml_head = self.rml_header
- rml_head = rml_head.replace('','''[[company.logo]] ''')
- return True
-
-
-
diff --git a/addons/account/wizard/account_change_currency_view.xml b/addons/account/wizard/account_change_currency_view.xml
index 4a246f4034f..5dca78673c5 100644
--- a/addons/account/wizard/account_change_currency_view.xml
+++ b/addons/account/wizard/account_change_currency_view.xml
@@ -30,15 +30,6 @@
new
-
-
\ No newline at end of file
+
diff --git a/addons/account/wizard/account_invoice_refund_view.xml b/addons/account/wizard/account_invoice_refund_view.xml
index 5e84847577d..c1e4eb9b888 100644
--- a/addons/account/wizard/account_invoice_refund_view.xml
+++ b/addons/account/wizard/account_invoice_refund_view.xml
@@ -37,10 +37,6 @@
new
-
-
\ No newline at end of file
+
diff --git a/addons/account/wizard/account_pay_invoice.py b/addons/account/wizard/account_pay_invoice.py
index 0b71055409f..a3a57536a67 100644
--- a/addons/account/wizard/account_pay_invoice.py
+++ b/addons/account/wizard/account_pay_invoice.py
@@ -58,7 +58,7 @@ class account_invoice_pay(osv.osv_memory):
'amount': fields.float('Amount paid', required=True, digits_compute = dp.get_precision('Account')),
'name': fields.char('Entry Name', size=64, required=True),
'date': fields.date('Date payment', required=True),
- 'journal_id': fields.many2one('account.journal', 'Journal/Payment Mode', required=True),
+ 'journal_id': fields.many2one('account.journal', 'Journal/Payment Mode', required=True, domain=[('type','=','cash')]),
'period_id': fields.many2one('account.period', 'Period', required=True),
}
@@ -188,4 +188,4 @@ class account_invoice_pay(osv.osv_memory):
account_invoice_pay()
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_pay_invoice_view.xml b/addons/account/wizard/account_pay_invoice_view.xml
index aebdce1434c..0bae948100e 100644
--- a/addons/account/wizard/account_pay_invoice_view.xml
+++ b/addons/account/wizard/account_pay_invoice_view.xml
@@ -37,14 +37,6 @@
-
-
account.invoice.pay.writeoff.formaccount.invoice.pay.writeoff
@@ -70,4 +62,4 @@
-
\ No newline at end of file
+
diff --git a/addons/account_analytic_analysis/i18n/pt.po b/addons/account_analytic_analysis/i18n/pt.po
index fdd81c9e070..36f79ba1a7a 100644
--- a/addons/account_analytic_analysis/i18n/pt.po
+++ b/addons/account_analytic_analysis/i18n/pt.po
@@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
-"PO-Revision-Date: 2009-11-28 23:14+0000\n"
-"Last-Translator: Paulino \n"
+"PO-Revision-Date: 2010-06-01 10:22+0000\n"
+"Last-Translator: cmsa \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 04:11+0000\n"
+"X-Launchpad-Export-Date: 2010-06-02 03:33+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: account_analytic_analysis
@@ -38,12 +38,12 @@ msgstr "Data da última factura"
#: help:account.analytic.account,remaining_ca:0
msgid "Computed using the formula: Max Invoice Price - Invoiced Amount."
msgstr ""
-"Processado usando a formula: Preço máximo da factura - Montante facturado"
+"Processado usando a fórmula: Preço Máximo da Factura - Montante Facturado"
#. module: account_analytic_analysis
#: help:account.analytic.account,remaining_hours:0
msgid "Computed using the formula: Maximum Quantity - Hours Tot."
-msgstr "Processado usando a formula: Quantidade máxima - Horas totais."
+msgstr "Processado usando a fórmula: Quantidade Máxima - Horas Totais."
#. module: account_analytic_analysis
#: model:ir.ui.menu,name:account_analytic_analysis.menu_action_account_analytic_all
@@ -54,32 +54,32 @@ msgstr "Todas as contas de contabilidade analítica"
#: model:ir.actions.act_window,name:account_analytic_analysis.action_account_analytic_managed_open
#: model:ir.ui.menu,name:account_analytic_analysis.menu_analytic_account_to_valid_open
msgid "My Current Accounts"
-msgstr "Minhas contas correntes"
+msgstr "As minhas contas correntes"
#. module: account_analytic_analysis
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
-msgstr "XML inválido para a arquitectura de vista"
+msgstr "XML inválido para a arquitectura de vista!"
#. module: account_analytic_analysis
#: help:account.analytic.account,last_invoice_date:0
msgid "Date of the last invoice created for this analytic account."
-msgstr "Data da última factura criada por esta conta analítica."
+msgstr "Data da última factura criada para esta conta analítica."
#. module: account_analytic_analysis
#: field:account.analytic.account,ca_theorical:0
msgid "Theorical Revenue"
-msgstr "Rendimento teórico"
+msgstr "Rendimento Teórico"
#. module: account_analytic_analysis
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
-msgstr "Nome de modelo invalido na definição da acção"
+msgstr "Nome de modelo inválido na definição da acção."
#. module: account_analytic_analysis
#: help:account.analytic.account,theorical_margin:0
msgid "Computed using the formula: Theorial Revenue - Total Costs"
-msgstr "Processado usando a formula: Rendimento teórico - Custo total"
+msgstr "Processado usando a fórmula: Rendimento Teórico - Custo Total"
#. module: account_analytic_analysis
#: constraint:ir.model:0
@@ -113,7 +113,7 @@ msgstr "Conta analíticas correntes"
#. module: account_analytic_analysis
#: help:account.analytic.account,last_worked_date:0
msgid "Date of the latest work done on this account."
-msgstr "Data do ultimo trabalho feito nesta conta"
+msgstr "Data do último trabalho feito nesta conta"
#. module: account_analytic_analysis
#: help:account.analytic.account,last_worked_invoiced_date:0
@@ -121,8 +121,8 @@ msgid ""
"If invoice from the costs, this is the date of the latest work or cost that "
"have been invoiced."
msgstr ""
-"Se facturado dos custos, esta é a data do ultimo trabalho ou custo que foi "
-"facturado."
+"Se facturado sobre os custos, esta é a data do ultimo trabalho ou custo que "
+"foi facturado."
#. module: account_analytic_analysis
#: model:ir.ui.menu,name:account_analytic_analysis.menu_invoicing
@@ -137,7 +137,7 @@ msgstr "Data do ultimo custo/trabalho"
#. module: account_analytic_analysis
#: field:account.analytic.account,total_cost:0
msgid "Total Costs"
-msgstr "Custo total"
+msgstr "Custos totais"
#. module: account_analytic_analysis
#: help:account.analytic.account,hours_quantity:0
@@ -145,13 +145,13 @@ msgid ""
"Number of hours you spent on the analytic account (from timesheet). It "
"computes on all journal of type 'general'."
msgstr ""
-"Número de horas que você passou no conta analítica (do horário). É "
+"Número de horas que você passou no conta analítica (da folha de horas). É "
"processado em todo o jornal do tipo 'general'."
#. module: account_analytic_analysis
#: field:account.analytic.account,remaining_hours:0
msgid "Remaining Hours"
-msgstr "Horas restantes"
+msgstr "Horas Restantes"
#. module: account_analytic_analysis
#: help:account.analytic.account,ca_theorical:0
@@ -161,8 +161,8 @@ msgid ""
"the pricelist."
msgstr ""
"Baseado nos custos você teve no projecto, o que seria o rendimento se todos "
-"estes custos forem facturados a preço normal da venda fornecido pela lista "
-"de preço."
+"estes custos fossem facturados ao preço normal da venda fornecidos pela "
+"tabela de preço."
#. module: account_analytic_analysis
#: field:account.analytic.account,user_ids:0
@@ -174,24 +174,24 @@ msgstr "Utilizador"
#: model:ir.actions.act_window,name:account_analytic_analysis.action_account_analytic_managed_pending
#: model:ir.ui.menu,name:account_analytic_analysis.menu_analytic_account_to_valid_pending
msgid "My Pending Accounts"
-msgstr "Minhas contas pendentes"
+msgstr "As minhas contas pendentes"
#. module: account_analytic_analysis
#: model:ir.actions.act_window,name:account_analytic_analysis.action_hr_tree_invoiced_my
#: model:ir.ui.menu,name:account_analytic_analysis.menu_action_hr_tree_invoiced_my
msgid "My Uninvoiced Entries"
-msgstr "Minhas entradas não facturadas"
+msgstr "As minhas entradas não facturadas"
#. module: account_analytic_analysis
#: help:account.analytic.account,real_margin:0
msgid "Computed using the formula: Invoiced Amount - Total Costs."
-msgstr "Processado usando a formula: Montante facturado - Custo total."
+msgstr "Processado usando a fórmula: Montante Facturado - Custo Total."
#. module: account_analytic_analysis
#: model:ir.actions.act_window,name:account_analytic_analysis.action_account_analytic_managed
#: model:ir.ui.menu,name:account_analytic_analysis.menu_analytic_account_managed
msgid "My Accounts"
-msgstr "Minhas contas"
+msgstr "As minhas contas"
#. module: account_analytic_analysis
#: model:ir.module.module,description:account_analytic_analysis.module_meta_information
@@ -200,6 +200,9 @@ msgid ""
"important data for project manager of services companies.\n"
"Add menu to show relevant information for each manager."
msgstr ""
+"Modificar a vista da conta analítica para mostrar\n"
+"dados importantes para o gestor de projecto das empresas de serviços.\n"
+"Adicione menu para mostrar as informações relevantes para cada gerente."
#. module: account_analytic_analysis
#: field:account.analytic.account,hours_qtt_non_invoiced:0
@@ -219,43 +222,43 @@ msgstr "Contas da contabilidade analítica"
#. module: account_analytic_analysis
#: model:ir.module.module,shortdesc:account_analytic_analysis.module_meta_information
msgid "report_account_analytic"
-msgstr ""
+msgstr "report_account_analytic"
#. module: account_analytic_analysis
#: field:account.analytic.account,ca_invoiced:0
msgid "Invoiced Amount"
-msgstr "Montante facturado"
+msgstr "Montante Facturado"
#. module: account_analytic_analysis
#: model:ir.ui.menu,name:account_analytic_analysis.next_id_71
msgid "Financial Project Management"
-msgstr "Gestão do projecto financeiro"
+msgstr "Gestão do Projecto Financeiro"
#. module: account_analytic_analysis
#: field:account.analytic.account,last_worked_invoiced_date:0
msgid "Date of Last Invoiced Cost"
-msgstr "Data do ultimo custo de facturado"
+msgstr "Data do último custo facturado"
#. module: account_analytic_analysis
#: field:account.analytic.account,ca_to_invoice:0
msgid "Uninvoiced Amount"
-msgstr "Montante facturado"
+msgstr "Montante Facturado"
#. module: account_analytic_analysis
#: model:ir.actions.act_window,name:account_analytic_analysis.action_account_analytic_all_pending
#: model:ir.ui.menu,name:account_analytic_analysis.menu_action_account_analytic_all_pending
msgid "Pending Analytic Accounts"
-msgstr "Contas da contabilidade analítica pendentes"
+msgstr "Contabilidade analítica contas pendentes"
#. module: account_analytic_analysis
#: field:account.analytic.account,hours_qtt_invoiced:0
msgid "Invoiced Hours"
-msgstr "Horas facturadas"
+msgstr "Horas Facturadas"
#. module: account_analytic_analysis
#: field:account.analytic.account,real_margin:0
msgid "Real Margin"
-msgstr "Margem real"
+msgstr "Margem Real"
#. module: account_analytic_analysis
#: help:account.analytic.account,ca_invoiced:0
@@ -265,12 +268,12 @@ msgstr "Montante da facturação total do cliente para esta conta"
#. module: account_analytic_analysis
#: model:ir.model,name:account_analytic_analysis.model_account_analytic_analysis_summary_month
msgid "Hours summary by month"
-msgstr "Sumário de horas por mês"
+msgstr "Resumo de horas por mês"
#. module: account_analytic_analysis
#: help:account.analytic.account,real_margin_rate:0
msgid "Computes using the formula: (Real Margin / Total Costs) * 100."
-msgstr "Processado usando a formula: (Margem real / Custos total) * 100."
+msgstr "Processado usando a fórmula: (Margem Real / Custos Total) * 100."
#. module: account_analytic_analysis
#: help:account.analytic.account,hours_qtt_non_invoiced:0
@@ -279,17 +282,17 @@ msgid ""
"invoice based on analytic account."
msgstr ""
"Número de horas (do diário de tipo 'geral') que pode ser facturado se você "
-"factura baseado na conta analítica."
+"factura baseado em conta analítica."
#. module: account_analytic_analysis
#: view:account.analytic.account:0
msgid "Analytic accounts"
-msgstr "Conta da Contabilidade analítica"
+msgstr "Contas da Contabilidade Analítica"
#. module: account_analytic_analysis
#: field:account.analytic.account,remaining_ca:0
msgid "Remaining Revenue"
-msgstr "Lucro restante"
+msgstr "Receita Restante"
#. module: account_analytic_analysis
#: help:account.analytic.account,ca_to_invoice:0
@@ -297,18 +300,18 @@ msgid ""
"If invoice from analytic account, the remaining amount you can invoice to "
"the customer based on the total costs."
msgstr ""
-"Se facturado da conta analítica, a quantidade restante que você pode "
+"Se facturado por conta analítica, a quantidade restante que você pode "
"facturar ao cliente baseado nos custos totais."
#. module: account_analytic_analysis
#: help:account.analytic.account,revenue_per_hour:0
msgid "Computed using the formula: Invoiced Amount / Hours Tot."
-msgstr "Processado usando a formula: Montante facturado / Horas totais."
+msgstr "Processado usando a fórmula: Montante Facturado / Horas Totais."
#. module: account_analytic_analysis
#: field:account.analytic.account,revenue_per_hour:0
msgid "Revenue per Hours (real)"
-msgstr "Lucro por hora (real)"
+msgstr "Receitas por hora (real)"
#. module: account_analytic_analysis
#: field:account_analytic_analysis.summary.month,unit_amount:0
@@ -332,7 +335,7 @@ msgstr "Conta da Contabilidade Analítica"
#: model:ir.actions.act_window,name:account_analytic_analysis.action_account_analytic_managed_overpassed
#: model:ir.ui.menu,name:account_analytic_analysis.menu_action_account_analytic_managed_overpassed
msgid "Overpassed Accounts"
-msgstr "Contas ultrapassadas"
+msgstr "Contas Excedidas"
#. module: account_analytic_analysis
#: model:ir.actions.act_window,name:account_analytic_analysis.action_hr_tree_invoiced_all
@@ -347,4 +350,4 @@ msgid ""
"indirect costs, like time spent on timesheets."
msgstr ""
"Total de custos para esta conta. Inclui custos reais (das facturas) e custos "
-"indirectos, como o tempo passado em folha de presença."
+"indirectos, como o tempo passado em folha de horas."
diff --git a/addons/account_analytic_plans/i18n/pt.po b/addons/account_analytic_plans/i18n/pt.po
index 7b17be3392e..59d93dbf74f 100644
--- a/addons/account_analytic_plans/i18n/pt.po
+++ b/addons/account_analytic_plans/i18n/pt.po
@@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
-"PO-Revision-Date: 2009-11-28 23:17+0000\n"
-"Last-Translator: Paulino \n"
+"PO-Revision-Date: 2010-06-01 10:24+0000\n"
+"Last-Translator: cmsa \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 04:11+0000\n"
+"X-Launchpad-Export-Date: 2010-06-02 03:33+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: account_analytic_plans
@@ -26,8 +26,7 @@ msgstr "Identificação da conta4"
msgid ""
"The Object name must start with x_ and not contain any special character !"
msgstr ""
-"O nome do Objecto deve começar com x_ e não pode conter nenhum caractere "
-"especial !"
+"O nome do objecto deve começar com x_ e não pode conter um carácter especial!"
#. module: account_analytic_plans
#: model:ir.actions.report.xml,name:account_analytic_plans.account_analytic_account_crossovered_analytic
diff --git a/addons/account_budget/crossovered_budget_view.xml b/addons/account_budget/crossovered_budget_view.xml
index 00dec853486..b48ccc55daa 100644
--- a/addons/account_budget/crossovered_budget_view.xml
+++ b/addons/account_budget/crossovered_budget_view.xml
@@ -178,12 +178,33 @@
+
+ crossovered.budget.search
+ crossovered.budget
+ search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Budgetcrossovered.budgetformtree,form
+
+ string="The rule uses the AND operator. The model must match all non-empty fields so that the rule executes the action described in the 'Actions' tab." />
@@ -56,15 +56,15 @@
-
+
-
+
-
+
@@ -73,7 +73,7 @@
-
+
@@ -82,9 +82,9 @@
-
+
-
+
diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py
index bf93c9c775d..8a9764bff63 100644
--- a/addons/base_calendar/base_calendar.py
+++ b/addons/base_calendar/base_calendar.py
@@ -410,7 +410,10 @@ property or property parameter."),
event.add('location').value = event_obj.location
if event_obj.rrule:
event.add('rrule').value = event_obj.rrule
-
+ if event_obj.user_id:
+ event_org = event.add('organizer')
+ event_org.params['CN'] = [event_obj.user_id.name]
+ event_org.value = 'MAILTO:' + (event_obj.user_id.user_email or event_obj.user_id.name)
if event_obj.alarm_id:
# computes alarm data
valarm = event.add('valarm')
@@ -440,7 +443,7 @@ property or property parameter."),
attendee_add.params['CUTYPE'] = [str(attendee.cutype)]
attendee_add.params['ROLE'] = [str(attendee.role)]
attendee_add.params['RSVP'] = [str(attendee.rsvp)]
- attendee_add.value = 'MAILTO:' + attendee.email
+ attendee_add.value = 'MAILTO:' + (attendee.email or '')
res = cal.serialize()
return res
@@ -480,8 +483,8 @@ property or property parameter."),
'company': company
}
body = html_invitation % body_vals
- attach = self.get_ics_file(cr, uid, res_obj, context=context)
if mail_to and email_from:
+ attach = self.get_ics_file(cr, uid, res_obj, context=context)
tools.email_send(
email_from,
mail_to,
diff --git a/addons/base_calendar/base_calendar_view.xml b/addons/base_calendar/base_calendar_view.xml
index a5afddc9823..fc5140c8303 100644
--- a/addons/base_calendar/base_calendar_view.xml
+++ b/addons/base_calendar/base_calendar_view.xml
@@ -137,15 +137,14 @@
-
-
+
-
+
@@ -192,11 +191,10 @@
-
-
@@ -427,9 +425,9 @@
-
+
diff --git a/addons/base_vat/i18n/id.po b/addons/base_vat/i18n/id.po
index 8881f0627cc..e969ecfa9ad 100644
--- a/addons/base_vat/i18n/id.po
+++ b/addons/base_vat/i18n/id.po
@@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
-"PO-Revision-Date: 2009-11-09 13:47+0000\n"
-"Last-Translator: <>\n"
+"PO-Revision-Date: 2010-06-03 01:30+0000\n"
+"Last-Translator: Abdul Munif Hanafi \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 04:03+0000\n"
+"X-Launchpad-Export-Date: 2010-06-03 03:33+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: base_vat
@@ -25,7 +25,7 @@ msgstr ""
#. module: base_vat
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
-msgstr ""
+msgstr "XML tidak sah untuk Menampilkan Arsitektur!"
#. module: base_vat
#: field:res.partner,vat_subjected:0
@@ -35,4 +35,4 @@ msgstr ""
#. module: base_vat
#: model:ir.module.module,shortdesc:base_vat.module_meta_information
msgid "VAT"
-msgstr ""
+msgstr "VAT"
diff --git a/addons/board/i18n/pt.po b/addons/board/i18n/pt.po
index d2766a3cc5c..6ceaf2a831a 100644
--- a/addons/board/i18n/pt.po
+++ b/addons/board/i18n/pt.po
@@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
-"PO-Revision-Date: 2009-09-08 13:29+0000\n"
-"Last-Translator: Madalena_prime \n"
+"PO-Revision-Date: 2010-06-01 10:02+0000\n"
+"Last-Translator: cmsa \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-04-17 04:15+0000\n"
+"X-Launchpad-Export-Date: 2010-06-02 03:33+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: board
@@ -26,7 +26,7 @@ msgstr ""
#. module: board
#: model:ir.model,name:board.model_board_board
msgid "board.board"
-msgstr ""
+msgstr "board.board"
#. module: board
#: field:board.note,user_id:0
@@ -36,7 +36,7 @@ msgstr "Autor"
#. module: board
#: model:ir.module.module,shortdesc:board.module_meta_information
msgid "Dashboard main module"
-msgstr ""
+msgstr "Módulo Principal do Painel"
#. module: board
#: view:board.note:0
@@ -52,7 +52,7 @@ msgstr "Largura"
#. module: board
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
-msgstr ""
+msgstr "Nome de modelo inválido na definição da aclção."
#. module: board
#: field:board.board.line,name:0
@@ -84,7 +84,7 @@ msgstr "Vista de acções"
#. module: board
#: model:ir.model,name:board.model_board_note
msgid "board.note"
-msgstr ""
+msgstr "board.note"
#. module: board
#: field:board.note,date:0
@@ -124,7 +124,7 @@ msgstr "Notas"
#. module: board
#: model:ir.model,name:board.model_board_note_type
msgid "board.note.type"
-msgstr ""
+msgstr "board.note.type"
#. module: board
#: view:board.board:0
@@ -136,7 +136,7 @@ msgstr "Painel"
#. module: board
#: model:ir.module.module,description:board.module_meta_information
msgid "Base module for all dashboards."
-msgstr ""
+msgstr "Módulo base para todos os painéis."
#. module: board
#: field:board.board.line,position:0
@@ -212,7 +212,7 @@ msgstr "Vista de painel"
#. module: board
#: model:ir.model,name:board.model_board_board_line
msgid "board.board.line"
-msgstr ""
+msgstr "board.board.line"
#. module: board
#: field:board.note,name:0
diff --git a/addons/caldav/security/ir.model.access.csv b/addons/caldav/security/ir.model.access.csv
index 4dd04fa4c68..fa7b85a39f1 100644
--- a/addons/caldav/security/ir.model.access.csv
+++ b/addons/caldav/security/ir.model.access.csv
@@ -10,3 +10,4 @@
"access_calendar_event_export","calendar.event.export","model_calendar_event_export","base.group_user",1,1,1,1
"access_calendar_event_import","calendar.event.import","model_calendar_event_import","base.group_user",1,1,1,1
"access_calendar_event_subscribe","calendar.event.subscribe","model_calendar_event_subscribe","base.group_user",1,1,1,1
+"access_basic_calendar","basic.calendar","model_basic_calendar","base.group_user",1,1,1,1
diff --git a/addons/crm/__openerp__.py b/addons/crm/__openerp__.py
index 386387b1157..ea5cf3f6ef2 100644
--- a/addons/crm/__openerp__.py
+++ b/addons/crm/__openerp__.py
@@ -108,13 +108,13 @@ between mails and Open ERP.""",
'crm_phonecall_demo.xml'
],
'test': [
-# 'test/test_crm_lead.yml',
-# 'test/test_crm_meeting.yml',
-# 'test/test_crm_opportunity.yml',
-# 'test/test_crm_phonecall.yml',
- ],
- 'installable': True,
- 'active': False,
+ 'test/test_crm_lead.yml',
+ 'test/test_crm_meeting.yml',
+ 'test/test_crm_opportunity.yml',
+ 'test/test_crm_phonecall.yml',
+ ],
+ 'installable': True,
+ 'active': False,
'certificate': '0079056041421',
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm/crm.py b/addons/crm/crm.py
index ba45efd4b3b..d3c640efca3 100644
--- a/addons/crm/crm.py
+++ b/addons/crm/crm.py
@@ -203,9 +203,13 @@ class crm_case(object):
address = self.pool.get('res.partner.address').browse(cr, uid, add)
return {'value': {'email_from': address.email}}
- def _history(self, cr, uid, cases, keyword, history=False, email=False, details=None, email_from=False, message_id=False, context={}):
+ def _history(self, cr, uid, cases, keyword, history=False, subject=None, email=False, details=None, email_from=False, message_id=False, attach=[], context={}):
mailgate_pool = self.pool.get('mailgate.thread')
- return mailgate_pool._history(cr, uid, cases, keyword, history=history, email=email, details=details, email_from=email_from, message_id=message_id, context=context)
+ return mailgate_pool._history(cr, uid, cases, keyword, history=history,\
+ subject=subject, email=email, \
+ details=details, email_from=email_from,\
+ message_id=message_id, attach=attach, \
+ context=context)
def case_open(self, cr, uid, ids, *args):
"""Opens Case
@@ -438,6 +442,7 @@ class crm_case_section(osv.osv):
'child_ids': fields.one2many('crm.case.section', 'parent_id', 'Child Teams'),
'resource_calendar_id': fields.many2one('resource.calendar', "Resource's Calendar"),
'note': fields.text('Description'),
+ 'working_hours': fields.float('Working Hours', digits=(16,2 )),
}
_defaults = {
diff --git a/addons/crm/crm_action_rule.py b/addons/crm/crm_action_rule.py
index 3a14659672a..9092efef8e8 100644
--- a/addons/crm/crm_action_rule.py
+++ b/addons/crm/crm_action_rule.py
@@ -82,23 +82,9 @@ this if you want the rule to send an email to the partner."),
if hasattr(obj, 'categ_id'):
ok = ok and (not action.trg_categ_id or action.trg_categ_id.id==obj.categ_id.id)
-# TODO: history_line is removed
-# if hasattr(obj, 'history_line'):
-# ok = ok and (not action.trg_max_history or action.trg_max_history<=(len(obj.history_line)+1))
-# reg_history = action.regex_history
-# result_history = True
-# if reg_history:
-# ptrn = re.compile(str(reg_history))
-# if obj.history_line:
-# _result = ptrn.search(str(obj.history_line[0].description))
-# if not _result:
-# result_history = False
- regex_h = not reg_history or result_history
- ok = ok and regex_h
return ok
def do_action(self, cr, uid, action, model_obj, obj, context={}):
-
""" @param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current user’s ID for security checks,
@@ -118,7 +104,7 @@ this if you want the rule to send an email to the partner."),
write['email_cc'] = obj.email_cc+','+obj.act_email_cc
else:
write['email_cc'] = obj.act_email_cc
-
+
model_obj.write(cr, uid, [obj.id], write, context)
emails = []
diff --git a/addons/crm/crm_data.xml b/addons/crm/crm_data.xml
index cfff95888cc..1873f53f573 100644
--- a/addons/crm/crm_data.xml
+++ b/addons/crm/crm_data.xml
@@ -1,59 +1,11 @@
-
-
-
- CRM: Create Case
- crm_case_draft
-
-
-
- CRM: Open Case
- crm_case_open
-
-
-
- CRM: Pending Case
- crm_case_pending
-
-
-
- CRM: Cancel Case
- crm_case_cancel
-
-
-
- CRM: Close Case
- crm_case_done
-
-
-
-
Sales DepartmentSales
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Check cases rules
diff --git a/addons/crm/crm_installer.py b/addons/crm/crm_installer.py
index 1d9235feac6..8fb7c02ff85 100644
--- a/addons/crm/crm_installer.py
+++ b/addons/crm/crm_installer.py
@@ -39,7 +39,8 @@ class crm_installer(osv.osv_memory):
'crm_caldav': fields.boolean('Calendar Synchronizing', help="Help you to synchronize the meetings with other calender clients(e.g.: Sunbird)."),
'sale_crm': fields.boolean('Create Quotation from Opportunity', help="This module relates sale to opportunity cases in the CRM."),
'fetchmail': fields.boolean('Fetch Emails', help="Fetchmail Server."),
- 'thunderbird': fields.boolean('Thunderbird', help="Thunderbird Interface."),
+ 'thunderbird': fields.boolean('Thunderbird', help="Thunderbird Interface."),
+ 'wiki_sale_faq': fields.boolean('Sale FAQ', help="Sale FAQ."),
}
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
diff --git a/addons/crm/crm_installer_view.xml b/addons/crm/crm_installer_view.xml
index 370285352d1..e0d84c6eed2 100644
--- a/addons/crm/crm_installer_view.xml
+++ b/addons/crm/crm_installer_view.xml
@@ -35,7 +35,8 @@
-
+
+
diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py
index a9e8d1c000f..c1060f3e658 100644
--- a/addons/crm/crm_lead.py
+++ b/addons/crm/crm_lead.py
@@ -108,8 +108,8 @@ class crm_lead(osv.osv, crm_case):
'email_cc': fields.text('Watchers Emails', size=252 , help="These \
people will receive a copy of the future communication between partner \
and users by email"),
- 'description': fields.text('Description'),
- 'write_date': fields.datetime('Update Date' , readonly=True),
+ 'description': fields.text('Notes'),
+ 'write_date': fields.datetime('Update Date' , readonly=True),
# Lead fields
'thread_id': fields.many2one('mailgate.thread', 'Thread', required=False),
@@ -137,7 +137,6 @@ and users by email"),
method=True, multi='day_open', type="float", store=True),
'day_close': fields.function(_compute_day, string='Days to Close', \
method=True, multi='day_close', type="float", store=True),
- 'function_name': fields.char('Function', size=64),
'state': fields.selection(crm.AVAILABLE_STATES, 'State', size=16, readonly=True,
help='The state is set to \'Draft\', when a case is created.\
\nIf the case is in progress the state is set to \'Open\'.\
diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml
index 9c24e306154..dbfbeedf0a8 100644
--- a/addons/crm/crm_lead_view.xml
+++ b/addons/crm/crm_lead_view.xml
@@ -12,9 +12,11 @@
[('object_id.model', '=', 'crm.lead')]{'object_id':'crm.lead'}
-
+
+
+
@@ -26,10 +28,11 @@
[('object_id.model', '=', 'crm.lead')]{'object_id':'crm.lead'}
-
+
+
@@ -47,7 +50,7 @@
name="convert_opportunity"
string="Convert"
help="Convert to Opportunity"
- icon="gtk-index"
+ icon="gtk-index"
type="object"/>
-
+
@@ -160,16 +163,21 @@
-
-
+
+
+
+
+
+
+
+
+ string="Reply to Last Email"
+ name="%(crm.action_crm_send_mail)d"
+ context="{'mail':'reply', 'model': 'crm.lead', 'include_original' : True}"
+ icon="gtk-undo" type="action" />
-
@@ -177,7 +185,7 @@
diff --git a/addons/crm_fundraising/crm_fundraising_view.xml b/addons/crm_fundraising/crm_fundraising_view.xml
index 908e9c7616d..6853da7c89a 100644
--- a/addons/crm_fundraising/crm_fundraising_view.xml
+++ b/addons/crm_fundraising/crm_fundraising_view.xml
@@ -1,6 +1,10 @@
+
+
@@ -13,9 +17,9 @@
{'object_id':'crm.fundraising'}
-
+ parent="menu_config_fundrising" />
@@ -28,10 +32,11 @@
{'object_id':'crm.fundraising'}
-
+ parent="menu_config_fundrising" />
+
@@ -44,10 +49,10 @@
{'object_id':'crm.fundraising'}
-
+ parent="menu_config_fundrising" />
@@ -195,18 +200,25 @@
-
-
+
+
+
+
+
+
+
+
+ string="Reply to Last Email"
+ name="%(crm.action_crm_send_mail)d"
+ context="{'mail':'reply', 'model': 'crm.fundraising'}"
+ icon="gtk-undo" type="action" />
-
-
+
+
+
+
+
@@ -13,8 +17,8 @@
{'object_id':'crm.helpdesk'}
-
+
@@ -135,18 +139,25 @@
-
-
+
+
+
+
+
+
+
+
+ string="Reply to Last Email"
+ name="%(crm.action_crm_send_mail)d"
+ context="{'mail':'reply', 'model': 'crm.helpdesk'}"
+ icon="gtk-undo" type="action" />
-
-
+
+
+ form
tree,form
-
+
Questions
@@ -25,7 +25,8 @@
formtree,form
-
diff --git a/addons/document/__openerp__.py b/addons/document/__openerp__.py
index 8a78ae46fdd..ac227827d11 100644
--- a/addons/document/__openerp__.py
+++ b/addons/document/__openerp__.py
@@ -26,7 +26,7 @@
'category': 'Generic Modules/Others',
'description': """This is a complete document management system:
* User Authentication
- * Document Indexation
+ * Document Indexation :- .pptx and .docx files are not support in windows platform.
ATTENTION:
- When you install this module in a running company that have already PDF files stored into the database,
diff --git a/addons/document/document.py b/addons/document/document.py
index 2b2ac2f7587..5d3075f7a4a 100644
--- a/addons/document/document.py
+++ b/addons/document/document.py
@@ -75,7 +75,7 @@ class document_file(osv.osv):
'user_id': fields.many2one('res.users', 'Owner', select=1),
'group_ids': fields.many2many('res.groups', 'document_group_rel', 'item_id', 'group_id', 'Groups'),
# the directory id now is mandatory. It can still be computed automatically.
- 'parent_id': fields.many2one('document.directory', 'Directory', select=1, required=True),
+ 'parent_id': fields.many2one('document.directory', 'Directory', select=1),
'file_size': fields.integer('File Size', required=True),
'file_type': fields.char('Content Type', size=128),
# If ir.attachment contained any data before document is installed, preserve
@@ -88,11 +88,16 @@ class document_file(osv.osv):
'create_uid': fields.many2one('res.users', 'Creator', readonly=True),
'store_method': fields.selection([('db', 'Database'), ('fs', 'Filesystem'), ('link', 'Link')], "Storing Method"),
'datas': fields.function(_data_get, method=True, fnct_inv=_data_set, string='File Content', type="binary", nodrop=True),
+ 'url': fields.char('File URL',size=64),
'store_fname': fields.char('Stored Filename', size=200),
'res_model': fields.char('Attached Model', size=64), #res_model
'res_id': fields.integer('Attached ID'), #res_id
'partner_id':fields.many2one('res.partner', 'Partner', select=1),
- 'title': fields.char('Resource Title', size=64),
+ 'type':fields.selection([
+ ('url','URL'),
+ ('binary','Binary'),
+
+ ],'Type', help="Type is used to separate URL and binary File"),
}
def __get_def_directory(self, cr, uid, context=None):
@@ -103,6 +108,7 @@ class document_file(osv.osv):
'user_id': lambda self, cr, uid, ctx:uid,
'file_size': lambda self, cr, uid, ctx:0,
'store_method': lambda *args: 'db',
+ 'type': 'binary',
'parent_id': __get_def_directory
}
_sql_constraints = [
@@ -155,7 +161,6 @@ class document_file(osv.osv):
def create(self, cr, uid, vals, context=None):
if not context:
context = {}
- vals['title'] = vals['name']
vals['parent_id'] = context.get('parent_id', False) or vals.get('parent_id', False)
if not vals['parent_id']:
vals['parent_id'] = self.pool.get('document.directory')._get_root_directory(cr,uid, context)
@@ -168,8 +173,6 @@ class document_file(osv.osv):
result = obj_model.read(cr, uid, [vals['res_id']], ['name', 'partner_id', 'address_id'], context=context)
if len(result):
obj = result[0]
- if obj.get('name', False):
- vals['title'] = (obj.get('name', ''))[:60]
if obj_model._name == 'res.partner':
vals['partner_id'] = obj['id']
elif obj.get('address_id', False):
diff --git a/addons/document/document_directory.py b/addons/document/document_directory.py
index 56e52aa9b69..e395f96833d 100644
--- a/addons/document/document_directory.py
+++ b/addons/document/document_directory.py
@@ -104,11 +104,9 @@ class document_directory(osv.osv):
]
def name_get(self, cr, uid, ids, context={}):
res = []
- all_ids = self.search(cr,uid,[])
+ if not self.search(cr,uid,[('id','in',ids)]):
+ ids = []
for d in self.browse(cr, uid, ids, context=context):
- if d.id not in all_ids:
- continue
-
s = ''
d2 = d
while d2 and d2.parent_id:
diff --git a/addons/document/document_view.xml b/addons/document/document_view.xml
index 720ab6de69f..fd424ad7d52 100644
--- a/addons/document/document_view.xml
+++ b/addons/document/document_view.xml
@@ -118,7 +118,7 @@
document.directorydocument.directory
- tree
+ tree
@@ -179,71 +179,96 @@
+
+
+
+
+
+
+
+
diff --git a/addons/hr_timesheet_sheet/report/timesheet_report_view.xml b/addons/hr_timesheet_sheet/report/timesheet_report_view.xml
index c7cf7b0495e..32e8bda4f7f 100644
--- a/addons/hr_timesheet_sheet/report/timesheet_report_view.xml
+++ b/addons/hr_timesheet_sheet/report/timesheet_report_view.xml
@@ -74,12 +74,12 @@
domain="[('user_id','=',False)]"/>
-
-
+
+
-
+
@@ -111,7 +111,7 @@
-
+
diff --git a/addons/idea/i18n/id.po b/addons/idea/i18n/id.po
index da1e1c37693..1ecdb11dd08 100644
--- a/addons/idea/i18n/id.po
+++ b/addons/idea/i18n/id.po
@@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2010-06-01 03:44+0000\n"
+"X-Launchpad-Export-Date: 2010-06-02 03:33+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: idea
diff --git a/addons/idea/idea.py b/addons/idea/idea.py
index 12564de8540..14fb24ee607 100644
--- a/addons/idea/idea.py
+++ b/addons/idea/idea.py
@@ -22,6 +22,7 @@
from osv import osv
from osv import fields
from tools.translate import _
+import time
VoteValues = [('-1', 'Not Voted'), ('0', 'Very Bad'), ('25', 'Bad'), \
('50', 'Normal'), ('75', 'Good'), ('100', 'Very Good') ]
@@ -29,7 +30,7 @@ DefaultVoteValue = '50'
class idea_category(osv.osv):
""" Category of Idea """
-
+
_name = "idea.category"
_description = "Idea Category"
@@ -155,16 +156,16 @@ class idea_idea(osv.osv):
'title': fields.char('Idea Summary', size=64, required=True, readonly=True, states={'draft':[('readonly',False)]}),
'description': fields.text('Description', help='Content of the idea', readonly=True, states={'draft':[('readonly',False)]}),
'comment_ids': fields.one2many('idea.comment', 'idea_id', 'Comments'),
- 'create_date': fields.datetime('Creation date', readonly=True),
+ 'created_date': fields.datetime('Creation date', readonly=True),
'vote_ids': fields.one2many('idea.vote', 'idea_id', 'Vote'),
'my_vote': fields.function(_vote_read, fnct_inv = _vote_save, string="My Vote", method=True, type="selection", selection=VoteValues),
'vote_avg': fields.function(_vote_avg_compute, method=True, string="Average Score", type="float"),
'count_votes': fields.function(_vote_count, method=True, string="Count of votes", type="integer"),
'count_comments': fields.function(_comment_count, method=True, string="Count of comments", type="integer"),
'category_id': fields.many2one('idea.category', 'Category', required=True, readonly=True, states={'draft':[('readonly',False)]}),
- 'state': fields.selection([('draft', 'Draft'),
+ 'state': fields.selection([('draft', 'Draft'),
('open', 'Opened'),
- ('close', 'Accepted'),
+ ('close', 'Accepted'),
('cancel', 'Cancelled')],
'State', readonly=True,
help='When the Idea is created the state is \'Draft\'.\n It is \
@@ -173,12 +174,16 @@ class idea_idea(osv.osv):
),
'visibility':fields.boolean('Open Idea?', required=False),
'stat_vote_ids': fields.one2many('idea.vote.stat', 'idea_id', 'Statistics', readonly=True),
+ 'vote_limit': fields.integer('Maximum Vote per User',
+ help="Set to one if you require only one Vote per user"),
}
_defaults = {
'user_id': lambda self,cr,uid,context: uid,
'my_vote': lambda *a: '-1',
'state': lambda *a: 'draft',
+ 'vote_limit': lambda * a: 1,
+ 'created_date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
'visibility': lambda *a: True,
}
_order = 'id desc'
@@ -190,11 +195,11 @@ class idea_idea(osv.osv):
@param user: ID of the user currently logged in
@param vals: provides data for new record
@param context: context arguments, like lang, time zone
-
+
@return: Returns an id of the new record
"""
visibility = False
-
+
if vals.get('category_id', False):
category_pool = self.pool.get('idea.category')
category = category_pool.browse(cr, user, vals.get('category_id'), context)
@@ -215,41 +220,41 @@ class idea_idea(osv.osv):
@param id: list of record ids on which copy method executes
@param default: dict type contains the values to be overridden during copy of object
@param context: context arguments, like lang, time zone
-
+
@return: Returns the id of the new record
"""
-
+
default.update({
'comment_ids':False,
'vote_ids':False,
'stat_vote_ids':False
-
+
})
res_id = super(idea_idea, self).copy(cr, uid, id, default, context)
return res_id
-
+
def write(self, cr, user, ids, vals, context=None):
"""
Update redord(s) exist in {ids}, with new value provided in {vals}
-
+
@param cr: A database cursor
@param user: ID of the user currently logged in
@param ids: list of record ids to update
@param vals: dict of new values to be set
@param context: context arguments, like lang, time zone
-
+
@return: Returns True on success, False otherwise
"""
-
+
state = self.browse(cr, user, ids[0]).state
-
+
if vals.get('my_vote', False):
if vals.get('state', state) != 'open':
raise osv.except_osv(_("Warning !"), _("Draft/Accepted/Cancelled ideas Could not be voted"))
-
+
res = super(idea_idea, self).write(cr, user, ids, vals, context)
return res
-
+
def idea_cancel(self, cr, uid, ids):
self.write(cr, uid, ids, { 'state': 'cancel' })
return True
@@ -261,7 +266,7 @@ class idea_idea(osv.osv):
def idea_close(self, cr, uid, ids):
self.write(cr, uid, ids, { 'state': 'close' })
return True
-
+
def idea_draft(self, cr, uid, ids):
self.write(cr, uid, ids, { 'state': 'draft' })
return True
@@ -299,12 +304,15 @@ class idea_vote(osv.osv):
_rec_name = 'score'
_columns = {
- 'user_id': fields.many2one('res.users', 'User'),
- 'idea_id': fields.many2one('idea.idea', 'Idea', required=True, ondelete='cascade'),
- 'score': fields.selection(VoteValues, 'Score', required=True)
+ 'user_id': fields.many2one('res.users', 'By user', readonly="True"),
+ 'idea_id': fields.many2one('idea.idea', 'Idea', readonly="True", ondelete='cascade'),
+ 'score': fields.selection(VoteValues, 'Vote Status', readonly="True"),
+ 'date': fields.datetime('Date', readonly="True"),
+ 'comment': fields.text('Comment', readonly="True"),
}
_defaults = {
'score': lambda *a: DefaultVoteValue,
+ 'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
}
idea_vote()
diff --git a/addons/idea/idea_view.xml b/addons/idea/idea_view.xml
index 88c48656b5e..8aa0802fcda 100644
--- a/addons/idea/idea_view.xml
+++ b/addons/idea/idea_view.xml
@@ -50,6 +50,7 @@
+
@@ -60,8 +61,18 @@
+
+
+
+
-
+
+
Open Ideas
@@ -102,9 +113,9 @@
tree
-
-
-
+
+
+
@@ -117,12 +128,39 @@
form
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+ idea.vote.search
+ idea.vote
+ search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -180,7 +218,8 @@
-
+
+
@@ -188,7 +227,6 @@
-
@@ -201,15 +239,15 @@
idea.ideatree
-
+
-
+
-
+
@@ -244,23 +282,6 @@
-
-
-
- idea.comment.tree
- idea.comment
- tree
-
-
-
-
-
-
-
-
-
-
-
Ideasidea.idea
@@ -348,9 +369,10 @@
idea.voteformtree,form
+
-
+
diff --git a/addons/idea/security/ir.model.access.csv b/addons/idea/security/ir.model.access.csv
index 0c720f2ee2d..0fe5dad9ac9 100644
--- a/addons/idea/security/ir.model.access.csv
+++ b/addons/idea/security/ir.model.access.csv
@@ -1,8 +1,9 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"access_idea_category","idea.category","model_idea_category","base.group_user",1,0,0,0
"access_idea_idea","idea.idea","model_idea_idea","base.group_user",1,1,1,1
-"access_idea_comment","idea.comment","model_idea_comment","base.group_user",1,1,1,1
"access_idea_vote","idea.vote","model_idea_vote","base.group_user",1,1,1,1
"access_idea_vote_stat","idea.vote.stat","model_idea_vote_stat","base.group_user",1,0,0,0
"access_idea_category_system","idea.category system","model_idea_category","base.group_system",1,1,1,1
"idea_post_vote","idea.post.vote","model_idea_post_vote","base.group_user",1,1,1,1
+"access_idea_select","idea.select","model_idea_select","base.group_user",1,1,1,1
+"access_idea_comment","idea.comment","model_idea_comment","base.group_system",1,1,1,1
diff --git a/addons/idea/test/test_idea.yml b/addons/idea/test/test_idea.yml
index 6714fbfc7e2..4c3f5301a5a 100644
--- a/addons/idea/test/test_idea.yml
+++ b/addons/idea/test/test_idea.yml
@@ -8,10 +8,10 @@
name: Technical
- |
I create a New Idea of "Technical presentation for 1 hours in every day" and specify category "Technical".
-
-
!record {model: idea.idea, id: idea_idea_0}:
category_id: idea_category_technical0
+ created_date: '05/13/2010 19:16:26'
description: I want that Technical presentation are arranged for 1 hours in every
day.\nso, on that presentation, we can know all things what improvement and development
are done in our company.\n\n\n\n\n
@@ -44,52 +44,50 @@
!record {model: res.users, id: res_users_user1}:
company_id: base.main_company
context_lang: en_US
+ groups_id:
+ - base.group_system
+ - base.group_user
login: user2
name: user2
password: user2
- |
In order to post vote I connect as user1 and open the idea page
- I click on "Vote" wizard and vote the idea as "Normal"
+ I click on "Submit Vote" wizard button and vote the idea as "Normal"
-
!record {model: idea.post.vote, id: idea_post_vote_0}:
vote: 50
+
- |
- Now I click on "Post Vote" button of wizard.
+ Now I click on "Post" button of this wizard.
-
!python {model: idea.post.vote}: |
uid = ref('res_users_user0')
- self.do_vote(cr, uid, [ref("idea_post_vote_0")], {'active_id': ref('idea_idea_0')})
+ self.do_vote(cr, uid, [ref("idea_post_vote_0")], {'active_ids': [ref('idea_idea_0')]})
- |
- To add other vote I connect as user2 and open the idea page
- I click on "Vote" wizard and vote the idea as "Very Good"
+ To add other vote I connect as user2 and open the idea page.
+
+ I click on "Submit Vote" wizard button and vote the idea as "Very Good".
+
+ and put comment "We can learn many things from technical presentation".
-
!record {model: idea.post.vote, id: idea_post_vote_1}:
vote: 100
-
+ note: 'We can learn many things from technical presentation'
- |
- I click on "Post Vote" button of this wizard.
+ I click on "Post" button of this wizard.
-
!python {model: idea.post.vote}: |
uid = ref('res_users_user1')
- self.do_vote(cr, uid, [ref("idea_post_vote_1")], {'active_id': ref('idea_idea_0')})
+ self.do_vote(cr, uid, [ref("idea_post_vote_1")], {'active_ids': [ref('idea_idea_0')]})
- |
I can see that the Average score changed in "Average score" field with value 75
-
!record {model: idea.idea, id: idea_idea_0}:
vote_avg: 75
-
-- |
- I put one comment "We can learn many things from technical presentation" for the idea.
--
- !record {model: idea.idea, id: idea.idea_idea_0}:
- comment_ids:
- - content: "We can learn many things from technical presentation"
- idea_id: idea.idea_idea_0
- user_id: res_users_user1
- |
I connect as Manager and close this idea by click on "Close" button.
diff --git a/addons/idea/wizard/idea_post_vote.py b/addons/idea/wizard/idea_post_vote.py
index fb36f7945a4..e723d0a4505 100644
--- a/addons/idea/wizard/idea_post_vote.py
+++ b/addons/idea/wizard/idea_post_vote.py
@@ -34,11 +34,11 @@ class idea_post_vote(osv.osv_memory):
('25', 'Bad'),
('50', 'Normal'),
('75', 'Good'),
- ('100', 'Very Good') ],
+ ('100', 'Very Good') ],
'Post Vote', required=True),
'note': fields.text('Description'),
}
-
+
def get_default(self, cr, uid, context={}):
"""
This function checks for precondition before wizard executes
@@ -49,17 +49,17 @@ class idea_post_vote(osv.osv_memory):
@param context: A standard dictionary for contextual values
"""
idea_obj = self.pool.get('idea.idea')
-
+
if context.get('active_id'):
idea = idea_obj.browse(cr, uid, context.get('active_id'))
return idea.my_vote
else:
return 75
-
+
_defaults = {
'vote': get_default,
}
-
+
def view_init(self, cr, uid, fields, context=None):
"""
This function checks for precondition before wizard executes
@@ -70,15 +70,28 @@ class idea_post_vote(osv.osv_memory):
@param context: A standard dictionary for contextual values
"""
idea_obj = self.pool.get('idea.idea')
+ vote_obj = self.pool.get('idea.vote')
for idea in idea_obj.browse(cr, uid, context.get('active_ids', [])):
- if idea.state in ['draft', 'close', 'cancel']:
- raise osv.except_osv(_("Warning !"), _("Draft/Accepted/Cancelled ideas Could not be voted"))
+
+ for active_id in context.get('active_ids'):
+
+ vote_ids = vote_obj.search(cr, uid, [('user_id', '=', uid), ('idea_id', '=', active_id)])
+ vote_obj_id = vote_obj.browse(cr, uid, vote_ids)
+ count = 0
+ for vote in vote_obj_id:
+ count += 1
+
+ user_limit = idea.vote_limit
+ if count >= user_limit:
+ raise osv.except_osv(_('Warning !'),_("You can not give Vote for this idea more than %s times") % (user_limit))
+
if idea.state != 'open':
- raise osv.except_osv(_('Warning !'), _('idea should be in \'Open\' state before vote for that idea.'))
+ raise osv.except_osv(_('Warning !'), _('Idea should be in \
+\'Open\' state before vote for that idea.'))
return False
- def do_vote(self, cr, uid, ids, context):
+ def do_vote(self, cr, uid, ids, context=None):
"""
Create idea vote.
@param cr: the current row, from the database cursor,
@@ -86,8 +99,8 @@ class idea_post_vote(osv.osv_memory):
@param ids: List of Idea Post vote’s IDs.
@return: Dictionary {}
"""
-
- vote_id = context and context.get('active_id', False) or False
+
+ vote_ids = context and context.get('active_ids', []) or []
vote_pool = self.pool.get('idea.vote')
idea_pool = self.pool.get('idea.idea')
comment_pool = self.pool.get('idea.comment')
@@ -96,8 +109,8 @@ class idea_post_vote(osv.osv_memory):
score = str(do_vote_obj['vote'])
comment = do_vote_obj.get('note', False)
vote = {
- 'idea_id': vote_id,
- 'user_id': uid,
+ 'idea_id': vote_id,
+ 'user_id': uid,
'score': score
}
if comment:
@@ -114,5 +127,44 @@ class idea_post_vote(osv.osv_memory):
idea_post_vote()
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+class idea_select(osv.osv_memory):
+ """ Select idea for vote."""
+
+ _name = "idea.select"
+ _description = "select idea"
+
+ _columns = {
+ 'idea_id': fields.many2one('idea.idea', 'Idea', required=True),
+ }
+
+ def open_vote(self, cr, uid, ids, context=None):
+ """
+ This function load column.
+ @param cr: the current row, from the database cursor,
+ @param uid: the current users ID for security checks,
+ @param ids: List of load column,
+ @return: dictionary of query logs clear message window
+ """
+ idea_obj = self.browse(cr, uid, ids)
+ for idea in idea_obj:
+ idea_id = idea.idea_id.id
+
+ data_obj = self.pool.get('ir.model.data')
+ id2 = data_obj._get_id(cr, uid, 'idea', 'view_idea_post_vote')
+ if id2:
+ id2 = data_obj.browse(cr, uid, id2, context=context).res_id
+ value = {
+ 'view_type': 'form',
+ 'view_mode': 'form',
+ 'res_model': 'idea.post.vote',
+ 'views': [(id2, 'form'), (False, 'tree'), (False, 'calendar'), (False, 'graph')],
+ 'type': 'ir.actions.act_window',
+ 'target': 'new',
+ 'context': {'active_ids': [idea_id]}
+ }
+ return value
+
+idea_select()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/idea/wizard/idea_post_vote_view.xml b/addons/idea/wizard/idea_post_vote_view.xml
index aa066cdffd3..ef1a338dcd4 100644
--- a/addons/idea/wizard/idea_post_vote_view.xml
+++ b/addons/idea/wizard/idea_post_vote_view.xml
@@ -1,7 +1,6 @@
-
@@ -9,7 +8,7 @@
idea.post.voteform
-
+
@@ -18,12 +17,33 @@
-
+
+
+
+ idea.select.form
+ idea.select
+ form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -33,7 +53,17 @@
tree,formnew
-
-
+
+
+
+ Idea select
+ idea.select
+ form
+ tree,form
+
+ new
+ {'model': 'idea.idea'}
+
+
diff --git a/addons/mail_gateway/__openerp__.py b/addons/mail_gateway/__openerp__.py
index aaf12b926b3..1584067ea38 100644
--- a/addons/mail_gateway/__openerp__.py
+++ b/addons/mail_gateway/__openerp__.py
@@ -24,18 +24,15 @@
'version': '1.0',
'category': 'Generic Modules/Mail Service',
'description': """The generic email gateway system allows to send and receive emails
- * IMAP / IMAP with SSL
- * POP / POP with SSL
- * SMTP / SMTP with TLS
- * ACL based access policy
- * Queueing and History for Emails
+ * History for Emails
* Easy Integration with any Module""",
'author': 'Tiny',
'website': 'http://www.openerp.com',
'depends': ['base'],
'init_xml': [],
'update_xml': [
- "mail_gateway_view.xml"
+ "mail_gateway_view.xml",
+ 'security/ir.model.access.csv'
],
'demo_xml': [],
'installable': True,
diff --git a/addons/mail_gateway/mail_gateway.py b/addons/mail_gateway/mail_gateway.py
index 05d27ce3ef2..fb4920e9632 100644
--- a/addons/mail_gateway/mail_gateway.py
+++ b/addons/mail_gateway/mail_gateway.py
@@ -21,6 +21,7 @@
from osv import osv, fields
import time
+import base64
class one2many_domain(fields.one2many):
def set(self, cr, obj, id, field, values, user=None, context=None):
@@ -49,12 +50,12 @@ class mailgate_thread(osv.osv):
_rec_name = 'thread'
_columns = {
- 'thread': fields.char('Thread', size=32, required=False),
+ 'thread': fields.char('Thread', size=32, required=False),
'message_ids': one2many_domain('mailgate.message', 'thread_id', 'Messages', domain=[('history', '=', True)], required=False),
- 'log_ids': one2many_domain('mailgate.message', 'thread_id', 'Logs', domain=[('history', '=', False)], required=False),
+ 'log_ids': one2many_domain('mailgate.message', 'thread_id', 'Logs', domain=[('history', '=', False)], required=False),
}
- def __history(self, cr, uid, cases, keyword, history=False, email=False, details=None, email_from=False, message_id=False, context={}):
+ def __history(self, cr, uid, cases, keyword, history=False, subject=None, email=False, details=None, email_from=False, message_id=False, attach=[], context={}):
"""
@param self: The object pointer
@param cr: the current row, from the database cursor,
@@ -64,6 +65,7 @@ class mailgate_thread(osv.osv):
@param history: Value True/False, If True it makes entry in case History otherwise in Case Log
@param email: Email address if any
@param details: Details of case history if any
+ @param atach: Attachment sent in email
@param context: A standard dictionary for contextual values"""
if context is None:
context = {}
@@ -72,28 +74,43 @@ class mailgate_thread(osv.osv):
cases = self.pool.get(context['model']).browse(cr, uid, cases, context=context)
model_obj = self.pool.get('ir.model')
-
+ att_obj = self.pool.get('ir.attachment')
obj = self.pool.get('mailgate.message')
+
for case in cases:
model_ids = model_obj.search(cr, uid, [('model', '=', case._name)])
data = {
- 'name': keyword,
- 'user_id': uid,
- 'model_id' : model_ids and model_ids[0] or False,
- 'date': time.strftime('%Y-%m-%d %H:%M:%S'),
- 'thread_id': case.thread_id.id,
- 'message_id': message_id
+ 'name': keyword,
+ 'user_id': uid,
+ 'model_id' : model_ids and model_ids[0] or False,
+ 'date': time.strftime('%Y-%m-%d %H:%M:%S'),
+ 'thread_id': case.thread_id.id,
+ 'message_id': message_id,
}
-
+ attachments = []
if history:
- data['history'] = True
- data['description'] = details or case.description
- data['email_to'] = email or \
- (case.user_id and case.user_id.address_id and \
- case.user_id.address_id.email) or tools.config.get('email_from', False)
- data['email_from'] = email_from or \
- (case.user_id and case.user_id.address_id and \
- case.user_id.address_id.email) or tools.config.get('email_from', False)
+ for att in attach:
+ attachments.append(att_obj.create(cr, uid, {'name': att[0], 'datas': base64.encodestring(att[1])}))
+
+ data = {
+ 'name': subject or 'History',
+ 'history': True,
+ 'user_id': uid,
+ 'model_id' : model_ids and model_ids[0] or False,
+ 'res_id': case.id,
+ 'date': time.strftime('%Y-%m-%d %H:%M:%S'),
+ 'description': details or (hasattr(case, 'description') and case.description or False),
+ 'email_to': email or \
+ (hasattr(case, 'user_id') and case.user_id and case.user_id.address_id and \
+ case.user_id.address_id.email) or tools.config.get('email_from', False),
+ 'email_from': email_from or \
+ (hasattr(case, 'user_id') and case.user_id and case.user_id.address_id and \
+ case.user_id.address_id.email) or tools.config.get('email_from', False),
+ 'partner_id': hasattr(case, 'partner_id') and (case.partner_id and case.partner_id.id or False) or False,
+ 'thread_id': case.thread_id.id,
+ 'message_id': message_id,
+ 'attachment_ids': [(6, 0, attachments)]
+ }
res = obj.create(cr, uid, data, context)
return True
@@ -112,20 +129,22 @@ class mailgate_message(osv.osv):
_order = 'date desc'
_columns = {
- 'name':fields.char('Message', size=64),
- 'model_id': fields.many2one('ir.model', 'Model'),
- 'thread_id':fields.many2one('mailgate.thread', 'Thread'),
- 'date': fields.datetime('Date'),
+ 'name':fields.char('Message', size=64),
+ 'model_id': fields.many2one('ir.model', 'Model'),
+ 'res_id': fields.integer('Resource ID'),
+ 'thread_id':fields.many2one('mailgate.thread', 'Thread'),
+ 'date': fields.datetime('Date'),
'history': fields.boolean('Is History?', required=False),
- 'user_id': fields.many2one('res.users', 'User Responsible', readonly=True),
- 'message': fields.text('Description'),
- 'email_from': fields.char('Email From', size=84),
- 'email_to': fields.char('Email To', size=84),
- 'email_cc': fields.char('Email From', size=84),
- 'email_bcc': fields.char('Email From', size=84),
- 'message_id': fields.char('Message Id', size=1024, readonly=True, help="Message Id on Email Server.", select=True),
+ 'user_id': fields.many2one('res.users', 'User Responsible', readonly=True),
+ 'message': fields.text('Description'),
+ 'email_from': fields.char('Email From', size=84),
+ 'email_to': fields.char('Email To', size=84),
+ 'email_cc': fields.char('Email CC', size=84),
+ 'email_bcc': fields.char('Email BCC', size=84),
+ 'message_id': fields.char('Message Id', size=1024, readonly=True, help="Message Id on Email Server.", select=True),
'description': fields.text('Description'),
- 'attachment_ids': fields.many2many('ir.attachment', 'message_attachment_rel', 'message_id', 'attachment_id', 'Attachments'),
+ 'partner_id': fields.many2one('res.partner', 'Partner', required=False),
+ 'attachment_ids': fields.many2many('ir.attachment', 'message_attachment_rel', 'message_id', 'attachment_id', 'Attachments'),
}
mailgate_message()
diff --git a/addons/mail_gateway/mail_gateway_view.xml b/addons/mail_gateway/mail_gateway_view.xml
index 8b26d5ee47a..e5b7b426fe9 100644
--- a/addons/mail_gateway/mail_gateway_view.xml
+++ b/addons/mail_gateway/mail_gateway_view.xml
@@ -1,49 +1,67 @@
-
- maligate.message.form
- maligate.message
+
+ mailgate.message.form
+ mailgate.messageform
-
-
+
mailgate.thread.treemailgate.thread
@@ -124,35 +143,37 @@
-
-
- Mailgateway Threads
- mailgate.thread
- tree,form
- form
-
-
-
-
-
- tree
-
-
-
-
-
- form
-
-
-
-
-
-
-
+
+ Mailgateway Threads
+ mailgate.thread
+ tree,form
+ form
+
+
+
+
+
+ tree
+
+
+
+
+
+ form
+
+
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/addons/marketing/marketing_view.xml b/addons/marketing/marketing_view.xml
index 7a72f39c6eb..cc6200537cf 100644
--- a/addons/marketing/marketing_view.xml
+++ b/addons/marketing/marketing_view.xml
@@ -14,20 +14,16 @@
Marketing Modules Installation
-
- Configure Your Marketing System
+ Select Marketing Modules to Install
- You can enhance OpenERP's basic Marketing support with a few additional OpenERP applications
+ OpenERP provides tools to automate your leads process, design marketing campaigns and profile efficiently your customers.
-
-
-
@@ -49,4 +45,4 @@
-
\ No newline at end of file
+
diff --git a/addons/marketing/marketing_wizard.py b/addons/marketing/marketing_wizard.py
index 443fb09ed48..aee302283b2 100644
--- a/addons/marketing/marketing_wizard.py
+++ b/addons/marketing/marketing_wizard.py
@@ -24,15 +24,13 @@ from osv import fields, osv
class marketing_installer(osv.osv_memory):
_name = 'marketing.installer'
_inherit = 'res.config.installer'
-
_columns = {
# Generic modules
- 'marketing_campaign':fields.boolean('Marketing Campaign',
- help="Helps you to manage your marketing campaigns step by step."),
- 'crm_profiling':fields.boolean('Crm Profile',
- help="Helps you to perform segmentation within partners.")
- }
-
+ 'marketing_campaign':fields.boolean('Marketing Campaigns',
+ help="Helps you to manage marketing campaigns and automate actions and communication steps."),
+ 'crm_profiling':fields.boolean('Profiling Tools',
+ help="Helps you to perform segmentation within partners and design questionaires.")
+ }
marketing_installer()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/marketing_campaign/__openerp__.py b/addons/marketing_campaign/__openerp__.py
index aca6c2f6d28..992731c1332 100755
--- a/addons/marketing_campaign/__openerp__.py
+++ b/addons/marketing_campaign/__openerp__.py
@@ -24,10 +24,9 @@
"name" : "",
"version" : "1.1",
"depends" : ["marketing",
- "crm",
+ "crm",
"document",
- "poweremail" # need to get this module form the branch
- # lp:poweremail
+ "email_template"
],
"author" : "Tiny",
"category": 'Generic Modules/Marketing',
@@ -40,7 +39,6 @@
'marketing_campaign_data.xml',
'marketing_campaign_workflow.xml',
'report/campaign_analysis_view.xml',
- 'marketing_campaign_demo.xml'
],
'demo_xml': [
'marketing_campaign_demo.xml',
diff --git a/addons/marketing_campaign/marketing_campaign.py b/addons/marketing_campaign/marketing_campaign.py
index 398e0e805be..3f29e03c968 100755
--- a/addons/marketing_campaign/marketing_campaign.py
+++ b/addons/marketing_campaign/marketing_campaign.py
@@ -129,9 +129,7 @@ class marketing_campaign_segment(osv.osv): #{{{
curr_date = time.strftime('%Y-%m-%d %H:%M:%S')
vals = {'state': 'running'}
if not segment.date_run:
- vals['date_run'] = segment.campaign_id.date_run and \
- segment.campaign_id.date_run or \
- time.strftime('%Y-%m-%d %H:%M:%S')
+ vals['date_run'] = time.strftime('%Y-%m-%d %H:%M:%S')
if not segment.sync_last_date:
vals['sync_last_date']=curr_date
if not segment.date_done:
@@ -142,7 +140,7 @@ class marketing_campaign_segment(osv.osv): #{{{
def state_done_set(self, cr, uid, ids, *args):
date_done = self.browse(cr, uid, ids[0]).date_done
- if (date_done > time.strftime('%Y-%m-%d')):
+ if (date_done > time.strftime('%Y-%m-%d %H:%M:%S')):
raise osv.except_osv("Error", "Segment cannot be closed before end date")
wi_ids = self.pool.get("marketing.campaign.workitem").search(cr, uid,
@@ -186,7 +184,7 @@ class marketing_campaign_segment(osv.osv): #{{{
}
self.pool.get('marketing.campaign.workitem').create(
cr, uid, wi_vals)
- self.write(cr, uid, segment.id, {'sync_last_date':action_date})
+ self.write(cr, uid, segment.id, {'sync_last_date':action_date})
return True
marketing_campaign_segment()#}}}
@@ -196,7 +194,7 @@ class marketing_campaign_activity(osv.osv): #{{{
_description = "Campaign Activity"
_columns = {
- 'name': fields.char('Name', size=64, required=True),
+ 'name': fields.char('Name', size=128, required=True),
'campaign_id': fields.many2one('marketing.campaign', 'Campaign',
required = True, ondelete='cascade'),
'object_id': fields.related('campaign_id','object_id',
@@ -212,7 +210,7 @@ class marketing_campaign_activity(osv.osv): #{{{
('action', 'Action'),
('subcampaign', 'Sub-Campaign')],
'Type', required=True),
- 'email_template_id': fields.many2one('poweremail.templates','Email Template'),
+ 'email_template_id': fields.many2one('email.template','Email Template'),
'report_id': fields.many2one('ir.actions.report.xml', 'Reports', ),
'report_directory_id': fields.many2one('document.directory','Directory',
help="Folder is used to store the generated reports"),
@@ -254,8 +252,9 @@ class marketing_campaign_activity(osv.osv): #{{{
def process(self, cr, uid, act_id, wi_id, context={}):
activity = self.browse(cr, uid, act_id)
- workitem_obj = self.pool.get('marketing.campaign.workitem')
+ workitem_obj = self.pool.get('marketing.campaign.workitem')
workitem = workitem_obj.browse(cr, uid, wi_id)
+
if activity.type == 'paper' :
service = netsvc.LocalService('report.%s'%activity.report_id.report_name)
(report_data, format) = service.create(cr, uid, [], {}, {})
@@ -278,12 +277,12 @@ class marketing_campaign_activity(osv.osv): #{{{
if not workitem.partner_id.email:
return {'error_msg' : "There is no email defined for the partner"}
vals = {
- 'pem_from': tools.ustr(accounts.name) + "<" + tools.ustr(accounts.email_id) + ">",
- 'pem_to': workitem.partner_id.email,
- 'pem_subject': template.def_subject,
- 'pem_body_text': template.def_body_text,
- 'pem_body_html': template.def_body_html,
- 'pem_account_id':accounts.id,
+ 'email_from': tools.ustr(accounts.name) + "<" + tools.ustr(accounts.email_id) + ">",
+ 'email_to': workitem.partner_id.email,
+ 'subject': template.def_subject,
+ 'body_text': template.def_body_text,
+ 'body_html': template.def_body_html,
+ 'account_id':accounts.id,
'state':'na',
'mail_type':'multipart/alternative' #Options:'multipart/mixed','multipart/alternative','text/plain','text/html'
}
@@ -294,12 +293,11 @@ class marketing_campaign_activity(osv.osv): #{{{
# vals['pem_body_html'] = tools.ustr(vals['pem_body_html'] or '') + signature
#Create partly the mail and later update attachments
- mail_id = self.pool.get('poweremail.mailbox').create(cr, uid, vals, context)
+ mail_id = self.pool.get('email_template.mailbox').create(cr, uid, vals, context)
elif activity.type == 'action' :
server_obj = self.pool.get('ir.actions.server')
server_obj.run(cr, uid, [activity.server_action_id.id], context)
#???
-
return True
marketing_campaign_activity()#}}}
@@ -410,13 +408,13 @@ class marketing_campaign_workitem(osv.osv): #{{{
marketing_campaign_workitem() #}}}
-class poweremail_templates(osv.osv):
- _inherit = "poweremail.templates"
+class email_template(osv.osv):
+ _inherit = "email.template"
_defaults = {
'object_name': lambda obj, cr, uid, context: context.get('object_id',False),
}
-poweremail_templates()
+email_template()
class report_xml(osv.osv):
diff --git a/addons/marketing_campaign/marketing_campaign_demo.xml b/addons/marketing_campaign/marketing_campaign_demo.xml
index 9c2211903c5..7296ebf9c50 100644
--- a/addons/marketing_campaign/marketing_campaign_demo.xml
+++ b/addons/marketing_campaign/marketing_campaign_demo.xml
@@ -21,8 +21,9 @@
-
-
+
+
+ Thanks for showing interest in OpenERPinfo@tinyerp.com
@@ -32,17 +33,163 @@
- Hello,
-Thanks for generous interest you have shown in the open ERP.
-Regards,
-OpenERP Team,
+ Hello,Thanks for generous interest you have shown in the open ERP.Regards,OpenERP Team,makoFor OpenERP OnDemand Free Trial 2010crm.lead
-
+
+ Propose to subscribe to the Open ERP Discovery Day on May 2010
+ info@tinyerp.com
+
+
+
+
+
+
+
+ Hello,We have very good offer that might suit you.
+ We propose you to subscribe to the Open ERP Discovery Day on May 2010.
+ If any further information required kindly revert back.
+ We really appreciate your co-operation on this.
+ Regards,OpenERP Team,
+ mako
+
+ For Open ERP Discovery Day on May 2010
+ crm.lead
+
+
+
+
+ Thanks for subscribing to the Open ERP Discovery Day
+ info@tinyerp.com
+
+
+
+
+
+
+
+ Hello,Thanks for showing intrest and for subscribing to the Open ERP Discovery Day.
+ If any further information required kindly revert back.
+ I really appreciate your co-operation on this.
+ Regards,OpenERP Team,
+ mako
+
+ For Open ERP Discovery Day
+ crm.lead
+
+
+
+
+ Thanks for buying the Open ERP book
+ info@tinyerp.com
+
+
+
+
+
+
+
+ Hello,Thanks for showing intrest and buying the Open ERP book.
+ If any further information required kindly revert back.
+ I really appreciate your co-operation on this.
+ Regards,OpenERP Team,
+ mako
+
+ For Open ERP book
+ crm.lead
+
+
+
+
+ Propose a free technical training to Gold partners
+ info@tinyerp.com
+
+
+
+
+
+
+
+ Hello, We have very good offer that might suit you.
+ For our gold partners,We are arranging free technical training on june,2010.
+ If any further information required kindly revert back.
+ I really appreciate your co-operation on this.
+ Regards,OpenERP Team,
+ mako
+
+ For technical training to Gold partners
+ crm.lead
+
+
+
+
+ Propose paid training to Silver partners
+ info@tinyerp.com
+
+
+
+
+
+
+
+ Hello, We have very good offer that might suit you.
+ For our silver partners,We are paid technical training on june,2010.
+ If any further information required kindly revert back.
+ I really appreciate your co-operation on this.
+ Regards,OpenERP Team,
+ mako
+
+ For training to Silver partners
+ crm.lead
+
+
+
+
+ Propose gold partnership to silver partners
+ info@tinyerp.com
+
+
+
+
+
+
+
+ Hello, We have very good offer that might suit you.
+ For our silver partners,We are offering Gold partnership.
+ If any further information required kindly revert back.
+ I really appreciate your co-operation on this.
+ Regards,OpenERP Team,
+ mako
+
+ For gold partnership to silver partners
+ crm.lead
+
+
+
+
+ Thanks for subscribing to technical training
+ info@tinyerp.com
+
+
+
+
+
+
+
+ Hello, Thanks for showing intrest and for subscribing to technical training.If any further information required kindly revert back.I really appreciate your co-operation on this.
+ Regards,OpenERP Team,
+ mako
+
+ For subscribing to technical training
+ crm.lead
+
+
+
+
Marketing campaign demo reportir.actions.report.xml
@@ -51,12 +198,15 @@ OpenERP Team,
marketing_campaign/report/crm_lead_mc_demo_report.rmlpdf
-
+
+
OpenERP OnDemand Free Trial 2010
-
+
+
+
Propose a 1 month free trial for an OnDemand offer
@@ -70,13 +220,112 @@ OpenERP Team,
Thanks for showing interest
+
-
+
+
+ Propose to subscribe to the Open ERP Discovery Day on May 2010
+
+
+
+
+
+
+ Thanks for subscribing to the Open ERP Discovery Day
+
+
+
+
+
+ Propose to buy the Open ERP Book
+
+
+
+ paper
+
+
+
+
+ Thanks for buying the Open ERP book
+
+
+
+
+
+ Propose a free technical training to Gold partners
+
+
+
+
+
+ Propose paid training to Silver partners
+
+
+
+
+
+
+ Propose gold partnership to silver partners
+
+
+
+
+
+
+ Thanks for subscribing to technical training
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
BossList US Associations List-0/90
diff --git a/addons/marketing_campaign_mailchimp/marketing_campaign_mailchimp_view.xml b/addons/marketing_campaign_mailchimp/marketing_campaign_mailchimp_view.xml
index 6721cfc4fba..7a84f17311d 100644
--- a/addons/marketing_campaign_mailchimp/marketing_campaign_mailchimp_view.xml
+++ b/addons/marketing_campaign_mailchimp/marketing_campaign_mailchimp_view.xml
@@ -43,7 +43,6 @@
-
@@ -59,9 +58,9 @@
-
+
-
+
diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py
index 690aec2f3ec..b4c575bf2b0 100644
--- a/addons/mrp/mrp.py
+++ b/addons/mrp/mrp.py
@@ -247,21 +247,7 @@ class mrp_bom(osv.osv):
v['name'] = prod.name
return {'value': v}
return {}
-
- def onchange_multi_level_bom(self, cr, uid, ids, multi_level_bom, context={}):
- """ Changes multi_level_bom.
- @param multi_level_bom: Changed multi_level_bom
- @return: Dictionary of changed values
- """
- bom_ids = ids and ids[0]
- bom = self.browse(cr, uid, bom_ids)
- line_ids = bom and map(lambda x:x.id, bom.bom_lines)
- if multi_level_bom:
- self.write(cr, uid, line_ids, {'multi_level_bom': multi_level_bom})
- return {'value': {'bom_lines': line_ids}}
- else:
- self.write(cr, uid, line_ids, {'multi_level_bom': multi_level_bom})
- return {'value': {}}
+
def _bom_find(self, cr, uid, product_id, product_uom, properties=[]):
""" Finds BoM for particular product and product uom.
@param product_id: Selected product.
diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml
index 8b6b43acd1d..675b9d226bd 100644
--- a/addons/mrp/mrp_view.xml
+++ b/addons/mrp/mrp_view.xml
@@ -255,12 +255,12 @@
-
+
-
+
@@ -296,9 +296,9 @@
-
-
-
+
+
+
@@ -653,21 +653,21 @@
-
-
-
-
-
@@ -677,12 +677,12 @@
-
-
-
-
+
+
+
+
-
+
diff --git a/addons/mrp/report/mrp_production_order_view.xml b/addons/mrp/report/mrp_production_order_view.xml
index 5663ef93210..55957619e31 100644
--- a/addons/mrp/report/mrp_production_order_view.xml
+++ b/addons/mrp/report/mrp_production_order_view.xml
@@ -12,19 +12,18 @@
-
-
-
+
+
-
-
+
+
@@ -48,50 +47,57 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
+
@@ -102,7 +108,7 @@
tree,graph
- {'search_default_Product': 1}
+ {'search_default_Product': 1,'search_default_month':1,'group_by_no_leaf':1,'group_by':[]}
diff --git a/addons/mrp_operations/mrp_operations_view.xml b/addons/mrp_operations/mrp_operations_view.xml
index 37e90a995b4..a5c6564644e 100644
--- a/addons/mrp_operations/mrp_operations_view.xml
+++ b/addons/mrp_operations/mrp_operations_view.xml
@@ -96,10 +96,10 @@
-
-
-
-
+
+
+
+
diff --git a/addons/mrp_repair/mrp_repair_view.xml b/addons/mrp_repair/mrp_repair_view.xml
index 47e80be3e31..4c655099386 100644
--- a/addons/mrp_repair/mrp_repair_view.xml
+++ b/addons/mrp_repair/mrp_repair_view.xml
@@ -183,10 +183,10 @@
-
-
-
-
+
+
+
+
diff --git a/addons/point_of_sale/pos_view.xml b/addons/point_of_sale/pos_view.xml
index cef07e9f187..0109351193e 100644
--- a/addons/point_of_sale/pos_view.xml
+++ b/addons/point_of_sale/pos_view.xml
@@ -145,21 +145,19 @@
search
-
-
-
-
+
+
-
-
-
-
-
+
+
+
+
+
diff --git a/addons/procurement/__openerp__.py b/addons/procurement/__openerp__.py
index e96eb176842..8bd8d05c685 100644
--- a/addons/procurement/__openerp__.py
+++ b/addons/procurement/__openerp__.py
@@ -44,7 +44,7 @@
'process/procurement_process.xml',
"company_view.xml",
],
-# 'demo_xml': ['stock_orderpoint.xml'],
+ 'demo_xml': ['stock_orderpoint.xml'],
'installable': True,
'active': False,
'certificate': '',
diff --git a/addons/procurement/procurement.py b/addons/procurement/procurement.py
index a65ea449046..653b2905b0c 100644
--- a/addons/procurement/procurement.py
+++ b/addons/procurement/procurement.py
@@ -200,7 +200,7 @@ class procurement_order(osv.osv):
return False
#
- # Return the quantity of product shipped/produced/served, wich may be
+ # Return the quantity of product shipped/produced/served, which may be
# different from the planned quantity
#
def quantity_get(self, cr, uid, id, context={}):
diff --git a/addons/procurement/procurement_view.xml b/addons/procurement/procurement_view.xml
index b97caf6e630..e517f289809 100644
--- a/addons/procurement/procurement_view.xml
+++ b/addons/procurement/procurement_view.xml
@@ -86,12 +86,12 @@
-
-
-
+
+
-
+
@@ -100,11 +100,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -191,9 +191,9 @@
-
-
-
+
+
+
diff --git a/addons/procurement/schedulers.py b/addons/procurement/schedulers.py
index 4251acf1d28..6a4e2736dbd 100644
--- a/addons/procurement/schedulers.py
+++ b/addons/procurement/schedulers.py
@@ -186,8 +186,9 @@ class procurement_order(osv.osv):
while ids:
ids = orderpoint_obj.search(cr, uid, [], offset=offset, limit=100)
for op in orderpoint_obj.browse(cr, uid, ids):
- if op.procurement_id and op.procurement_id.purchase_id and op.procurement_id.purchase_id.state in ('draft', 'confirmed'):
- continue
+ if op.procurement_id.state != 'exception':
+ if op.procurement_id and op.procurement_id.purchase_id and op.procurement_id.purchase_id.state in ('draft', 'confirmed'):
+ continue
prods = location_obj._product_virtual_get(cr, uid,
op.location_id.id, [op.product_id.id],
{'uom': op.product_uom.id})[op.product_id.id]
diff --git a/addons/product/i18n/fr.po b/addons/product/i18n/fr.po
index 0bbce3e645b..fdbd15cd884 100644
--- a/addons/product/i18n/fr.po
+++ b/addons/product/i18n/fr.po
@@ -234,7 +234,7 @@ msgstr "Produit stockable"
#. module: product
#: model:product.category,name:product.product_category_services
msgid "Services"
-msgstr "Aire de repos"
+msgstr "Services"
#. module: product
#: help:product.template,list_price:0
diff --git a/addons/product/pricelist_view.xml b/addons/product/pricelist_view.xml
index 604c2b75324..634bb9da109 100644
--- a/addons/product/pricelist_view.xml
+++ b/addons/product/pricelist_view.xml
@@ -97,6 +97,21 @@
+
+ product.pricelist.search
+ product.pricelist
+ search
+
+
+
+
+
+
+
+
+
+
+
product.pricelist.treeproduct.pricelist
@@ -145,6 +160,7 @@
product.pricelistformtree,form
+
@@ -331,8 +331,8 @@
tree
-
-
+
+
@@ -354,8 +354,8 @@
-
-
+
+
@@ -408,30 +408,30 @@
-
-
-
+
+
+
-
+
-
+
-
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
@@ -590,10 +590,10 @@
tree
+
-
@@ -605,8 +605,8 @@
-
-
+
+
@@ -614,10 +614,10 @@
-
-
-
-
+
+
+
+
diff --git a/addons/project/report/project_report.py b/addons/project/report/project_report.py
index 7984441b460..1cd452d736e 100644
--- a/addons/project/report/project_report.py
+++ b/addons/project/report/project_report.py
@@ -42,11 +42,13 @@ class report_project_task_user(osv.osv):
'hours_effective': fields.float('Effective Hours', readonly=True),
'hours_delay': fields.float('Avg. Plan.-Eff.', readonly=True),
'remaining_hours': fields.float('Remaining Hours', readonly=True),
+ 'progress': fields.float('Progress', 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"),
'opening_days': fields.float('Days to Open', digits=(16,2), readonly=True, group_operator="avg",
help="Number of Days to Open the task"),
+ 'delay_endings_days': fields.float('Overpass Delay', digits=(16,2), readonly=True, group_operator="avg"),
'nbr': fields.integer('# of tasks', readonly=True),
'priority' : fields.selection([('4','Very Low'),
('3','Low'),
@@ -63,7 +65,7 @@ class report_project_task_user(osv.osv):
('cancelled', 'Cancelled'),
('done', 'Done')],
'State', readonly=True),
- 'company_id': fields.many2one('res.company', 'Company',readonly=True),
+ 'company_id': fields.many2one('res.company', 'Company',readonly=True, groups="base.group_multi_company"),
'partner_id': fields.many2one('res.partner', 'Partner',readonly=True),
'type': fields.many2one('project.task.type', 'Stage',readonly=True),
@@ -84,6 +86,7 @@ class report_project_task_user(osv.osv):
to_date(to_char(t.date_deadline, 'dd-MM-YYYY'),'dd-MM-YYYY') as date_deadline,
sum(cast(to_char(date_trunc('day',t.date_end) - date_trunc('day',t.date_start),'DD') as int)) as no_of_days,
t.user_id,
+ sum(progress) as progress,
t.project_id,
t.state,
t.priority,
@@ -97,6 +100,7 @@ class report_project_task_user(osv.osv):
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,
+ avg(extract('epoch' from (t.date_deadline-t.date_end)))/(3600*24) as delay_endings_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 f40fc218a9e..26488eae254 100644
--- a/addons/project/report/project_report_view.xml
+++ b/addons/project/report/project_report_view.xml
@@ -12,7 +12,7 @@
-
+
@@ -31,7 +31,9 @@
+
+
@@ -55,71 +57,71 @@
search
-
-
+
-
-
-
-
-
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
@@ -128,6 +130,7 @@
+
diff --git a/addons/project_gtd/project_gtd.py b/addons/project_gtd/project_gtd.py
index 059c19e0f40..d680e533505 100644
--- a/addons/project_gtd/project_gtd.py
+++ b/addons/project_gtd/project_gtd.py
@@ -120,8 +120,8 @@ project_gtd_timebox()
class project_task(osv.osv):
_inherit = "project.task"
_columns = {
- 'timebox_id': fields.many2one('project.gtd.timebox', "Timebox"),
- 'context_id': fields.many2one('project.gtd.context', "Context"),
+ 'timebox_id': fields.many2one('project.gtd.timebox', "Timebox",help="Time-laps during which task has to be treated"),
+ 'context_id': fields.many2one('project.gtd.context', "Context",help="The context place where user has to treat task"),
}
def copy_data(self, cr, uid, id, default=None, context=None):
@@ -169,7 +169,7 @@ class project_task(osv.osv):
timebox_obj = self.pool.get('project.gtd.timebox')
if res['type'] == 'search':
tt = timebox_obj.browse(cr, uid, timebox_obj.search(cr,uid,[]))
- search_extended ='''''' % (len(tt)+7,_('Getting Things Done'))
+ search_extended ='''''' % (len(tt)+7,_('Getting Things Done'))
search_extended += '''''' % (_('Inbox'),)
search_extended += '''''' % (_('All'),)
search_extended += ''''''
diff --git a/addons/project_gtd/project_gtd_view.xml b/addons/project_gtd/project_gtd_view.xml
index 1615319c7b9..64f6bcdfbd1 100644
--- a/addons/project_gtd/project_gtd_view.xml
+++ b/addons/project_gtd/project_gtd_view.xml
@@ -8,7 +8,8 @@
-
+
+
@@ -75,7 +76,7 @@
-
+
diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml
index 483fda01ec1..dd3ed036691 100644
--- a/addons/project_issue/project_issue_view.xml
+++ b/addons/project_issue/project_issue_view.xml
@@ -2,6 +2,8 @@
+
+
Issue Categoriescrm.case.categ
@@ -19,7 +21,8 @@
[('object_id.model', '=', 'project.issue')]{'object_id':'project.issue'}
-
+
+
Project Issue Tracker Form
@@ -114,20 +117,27 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
-
-
+
-
-
-
-
-
@@ -278,12 +288,12 @@
-
-
-
-
+
+
diff --git a/addons/project_issue/report/project_issue_report_view.xml b/addons/project_issue/report/project_issue_report_view.xml
index 5694d33993b..adc1b3c662f 100644
--- a/addons/project_issue/report/project_issue_report_view.xml
+++ b/addons/project_issue/report/project_issue_report_view.xml
@@ -53,25 +53,25 @@
-
-
-
-
-
-
@@ -88,7 +88,7 @@
-
@@ -96,11 +96,11 @@
-
-
+
-
@@ -109,42 +109,42 @@
context="{'group_by':'section_id'}" />
-
-
-
+
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
-
-
-
@@ -156,8 +156,8 @@
-
-
+
+
diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py
index 95e9099f549..212af8a30dc 100644
--- a/addons/project_long_term/project_long_term.py
+++ b/addons/project_long_term/project_long_term.py
@@ -93,7 +93,7 @@ class project_phase(osv.osv):
'next_phase_ids': fields.many2many('project.phase', 'project_phase_rel', 'prv_phase_id', 'next_phase_id', 'Next Phases'),
'previous_phase_ids': fields.many2many('project.phase', 'project_phase_rel', 'next_phase_id', 'prv_phase_id', 'Previous Phases'),
'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of phases."),
- 'duration': fields.float('Duration', required=True),
+ 'duration': fields.float('Duration', required=True, help="By default in days"),
'product_uom': fields.many2one('product.uom', 'Duration UoM', required=True, help="UoM (Unit of Measure) is the unit of measurement for Duration"),
'task_ids': fields.one2many('project.task', 'phase_id', "Project Tasks"),
'resource_ids': fields.one2many('project.resource.allocation', 'phase_id', "Project Resources"),
diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml
index a2ecc604ebe..e681b0da57f 100644
--- a/addons/project_long_term/project_long_term_view.xml
+++ b/addons/project_long_term/project_long_term_view.xml
@@ -47,7 +47,7 @@
-
+
@@ -102,7 +102,7 @@
-
+
@@ -218,23 +218,23 @@
-
-
-
+
+
+
-
+
-
-
-
-
+
+
+
+
diff --git a/addons/project_long_term/wizard/project_compute_tasks_view.xml b/addons/project_long_term/wizard/project_compute_tasks_view.xml
index c89c83b3058..eff475b4f11 100644
--- a/addons/project_long_term/wizard/project_compute_tasks_view.xml
+++ b/addons/project_long_term/wizard/project_compute_tasks_view.xml
@@ -8,15 +8,13 @@
form
-
-
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/addons/project_mrp/mrp.py b/addons/project_mrp/mrp.py
index 193078842c6..98b05248a66 100644
--- a/addons/project_mrp/mrp.py
+++ b/addons/project_mrp/mrp.py
@@ -55,10 +55,11 @@ class procurement_order(osv.osv):
break
# Creating a project for task.Project is created from Procurement.
+ project_obj = self.pool.get('project.project')
proj_name = tools.ustr(so_ref)
- proj_exist_id = self.pool.get('project.project').search(cr, uid, [('name','=',proj_name)], context=context)
+ proj_exist_id = project_obj.search(cr, uid, [('name','=',proj_name)], context=context)
if not proj_exist_id:
- project_id = self.pool.get('project.project').create(cr, uid, {'name':proj_name,'category_id':analytic_account_id, 'partner_id':partner_id})
+ project_id = project_obj.create(cr, uid, {'name':proj_name, 'partner_id':partner_id})
else:
project_id = proj_exist_id[0]
diff --git a/addons/project_planning/project_planning_view.xml b/addons/project_planning/project_planning_view.xml
index 0ebbcd8e519..fd9d586f21e 100644
--- a/addons/project_planning/project_planning_view.xml
+++ b/addons/project_planning/project_planning_view.xml
@@ -162,7 +162,7 @@
-
+
diff --git a/addons/project_timesheet/report/task_report_view.xml b/addons/project_timesheet/report/task_report_view.xml
index 35a7c9f3de6..5a653985a20 100644
--- a/addons/project_timesheet/report/task_report_view.xml
+++ b/addons/project_timesheet/report/task_report_view.xml
@@ -148,16 +148,16 @@
-
-
+
+
-
-
-
+
+
+
diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py
index 3fa1d3eb5c5..be5685aa77d 100644
--- a/addons/purchase/purchase.py
+++ b/addons/purchase/purchase.py
@@ -223,7 +223,7 @@ class purchase_order(osv.osv):
else:
raise osv.except_osv(_('Invalid action !'), _('Cannot delete Purchase Order(s) which are in %s State!' % s['state']))
- # TODO: temporary fix in 5.0, to remove in 5.2 when subflows support
+ # TODO: temporary fix in 5.0, to remove in 5.2 when subflows support
# automatically sending subflow.delete upon deletion
wf_service = netsvc.LocalService("workflow")
for id in unlink_ids:
@@ -248,7 +248,7 @@ class purchase_order(osv.osv):
return {'value':{'location_id': res, 'dest_address_id': False}}
def onchange_partner_id(self, cr, uid, ids, part):
-
+
if not part:
return {'value':{'partner_address_id': False, 'fiscal_position': False}}
addr = self.pool.get('res.partner').address_get(cr, uid, [part], ['default'])
@@ -261,17 +261,15 @@ class purchase_order(osv.osv):
self.write(cr, uid, ids, {'state': 'approved', 'date_approve': time.strftime('%Y-%m-%d')})
return True
+ #TODO: implement messages system
def wkf_confirm_order(self, cr, uid, ids, context={}):
todo = []
for po in self.browse(cr, uid, ids):
-
- if self.pool.get('res.partner.event.type').check(cr, uid, 'purchase_open'):
- self.pool.get('res.partner.event').create(cr, uid, {'name':'Purchase Order: '+po.name, 'partner_id':po.partner_id.id, 'date':time.strftime('%Y-%m-%d %H:%M:%S'), 'user_id':uid, 'partner_type':'retailer', 'probability': 1.0, 'planned_cost':po.amount_untaxed})
if not po.order_line:
raise osv.except_osv(_('Error !'),_('You can not confirm purchase order without Purchase Order Lines.'))
- for line in po.order_line:
+ for line in po.order_line:
if line.state=='draft':
- todo.append(line.id)
+ todo.append(line.id)
current_name = self.name_get(cr, uid, ids)[0][1]
self.pool.get('purchase.order.line').action_confirm(cr, uid, todo, context)
for id in ids:
@@ -315,13 +313,13 @@ class purchase_order(osv.osv):
wf_service = netsvc.LocalService("workflow")
for p_id in ids:
# Deleting the existing instance of workflow for PO
- wf_service.trg_delete(uid, 'purchase.order', p_id, cr)
+ wf_service.trg_delete(uid, 'purchase.order', p_id, cr)
wf_service.trg_create(uid, 'purchase.order', p_id, cr)
return True
def action_invoice_create(self, cr, uid, ids, *args):
res = False
-
+
journal_obj = self.pool.get('account.journal')
for o in self.browse(cr, uid, ids):
il = []
@@ -439,7 +437,7 @@ class purchase_order(osv.osv):
})
if order_line.move_dest_id:
self.pool.get('stock.move').write(cr, uid, [order_line.move_dest_id.id], {'location_id':order.location_id.id})
- todo_moves.append(move)
+ todo_moves.append(move)
self.pool.get('stock.move').action_confirm(cr, uid, todo_moves)
self.pool.get('stock.move').force_assign(cr, uid, todo_moves)
wf_service = netsvc.LocalService("workflow")
@@ -461,26 +459,26 @@ class purchase_order(osv.osv):
def do_merge(self, cr, uid, ids, context):
- """
- To merge similar type of purchase orders.
- Orders will only be merged if:
- * Purchase Orders are in draft
- * Purchase Orders belong to the same partner
+ """
+ To merge similar type of purchase orders.
+ Orders will only be merged if:
+ * Purchase Orders are in draft
+ * Purchase Orders belong to the same partner
* Purchase Orders are have same stock location, same pricelist
- Lines will only be merged if:
- * Order lines are exactly the same except for the quantity and unit
+ Lines will only be merged if:
+ * Order lines are exactly the same except for the quantity and unit
@param self: The object pointer.
@param cr: A database cursor
@param uid: ID of the user currently logged in
- @param ids: the ID or list of IDs
- @param context: A standard dictionary
-
+ @param ids: the ID or list of IDs
+ @param context: A standard dictionary
+
@return: new purchase order id
-
- """
- wf_service = netsvc.LocalService("workflow")
- def make_key(br, fields):
+
+ """
+ wf_service = netsvc.LocalService("workflow")
+ def make_key(br, fields):
list_key = []
for field in fields:
field_val = getattr(br, field)
@@ -498,9 +496,9 @@ class purchase_order(osv.osv):
return tuple(list_key)
# compute what the new orders should contain
-
+
new_orders = {}
-
+
for porder in [order for order in self.browse(cr, uid, ids) if order.state == 'draft']:
order_key = make_key(porder, ('partner_id', 'location_id', 'pricelist_id'))
new_order = new_orders.setdefault(order_key, ({}, []))
@@ -543,7 +541,7 @@ class purchase_order(osv.osv):
o_line[field] = field_val
o_line['uom_factor'] = order_line.product_uom and order_line.product_uom.factor or 1.0
-
+
allorders = []
for order_key, (order_data, old_ids) in new_orders.iteritems():
@@ -603,7 +601,7 @@ class purchase_order_line(osv.osv):
'invoiced': fields.boolean('Invoiced', readonly=True),
'partner_id': fields.related('order_id','partner_id',string='Partner',readonly=True,type="many2one", relation="res.partner"),
'date_order': fields.related('order_id','date_order',string='Order Date',readonly=True,type="date")
-
+
}
_defaults = {
'product_qty': lambda *a: 1.0,
@@ -623,7 +621,7 @@ class purchase_order_line(osv.osv):
partner_id, date_order=False, fiscal_position=False, date_planned=False,
name=False, price_unit=False, notes=False):
if not pricelist:
- raise osv.except_osv(_('No Pricelist !'), _('You have to select a pricelist in the purchase form !\nPlease set one before choosing a product.'))
+ raise osv.except_osv(_('No Pricelist !'), _('You have to select a pricelist or a supplier in the purchase form !\nPlease set one before choosing a product.'))
if not partner_id:
raise osv.except_osv(_('No Partner!'), _('You have to select a partner in the purchase form !\nPlease set one partner before choosing a product.'))
if not product:
@@ -694,7 +692,7 @@ class purchase_order_line(osv.osv):
return res
def action_confirm(self, cr, uid, ids, context={}):
self.write(cr, uid, ids, {'state': 'confirmed'}, context)
- return True
+ return True
purchase_order_line()
class procurement_order(osv.osv):
@@ -702,7 +700,7 @@ class procurement_order(osv.osv):
_columns = {
'purchase_id': fields.many2one('purchase.order', 'Latest Requisition'),
}
-
+
def action_po_assign(self, cr, uid, ids, context={}):
""" This is action which call from workflow to assign purchase order to procurements
@return: True
diff --git a/addons/purchase/purchase_data.xml b/addons/purchase/purchase_data.xml
index 0a6659d244f..2b57a2a75bc 100644
--- a/addons/purchase/purchase_data.xml
+++ b/addons/purchase/purchase_data.xml
@@ -7,11 +7,6 @@
purchase.order
-
- Purchase: Purchase Confirmation
- purchase_open
-
-
Purchase Pricelistpurchase
diff --git a/addons/purchase/purchase_view.xml b/addons/purchase/purchase_view.xml
index 7d7ae53ab0e..d1b51ea7756 100644
--- a/addons/purchase/purchase_view.xml
+++ b/addons/purchase/purchase_view.xml
@@ -150,12 +150,12 @@
-
-
-
-
+
+
+
+
-
+
@@ -163,10 +163,13 @@
-
-
-
-
+
+
+
+
+
+
+
@@ -176,7 +179,7 @@
purchase.ordertree
-
+
@@ -265,7 +268,7 @@
-
+
@@ -276,6 +279,25 @@
+
+ purchase.order.line.search
+ purchase.order.line
+ search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
[('state','in',('confirmed','done')), ('invoiced','=',False)]formtree,form
+
diff --git a/addons/purchase/report/purchase_report_view.xml b/addons/purchase/report/purchase_report_view.xml
index 0cfc357b51f..8fb7836468d 100644
--- a/addons/purchase/report/purchase_report_view.xml
+++ b/addons/purchase/report/purchase_report_view.xml
@@ -1,7 +1,7 @@
-
+ product.month.graphpurchase.reportgraph
@@ -53,26 +53,26 @@
-
-
-
-
-
-
@@ -80,7 +80,7 @@
-
@@ -88,31 +88,31 @@
-
-
-
-
+
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
+
+
@@ -122,8 +122,8 @@
-
-
+
+
diff --git a/addons/purchase_requisition/purchase_requisition_view.xml b/addons/purchase_requisition/purchase_requisition_view.xml
index 4a4587f5f04..186815c9bc3 100644
--- a/addons/purchase_requisition/purchase_requisition_view.xml
+++ b/addons/purchase_requisition/purchase_requisition_view.xml
@@ -39,7 +39,7 @@
-
+
@@ -65,7 +65,7 @@
-
+
@@ -77,8 +77,8 @@
-
-
+
+
@@ -117,8 +117,8 @@
-
-
+
+
@@ -127,13 +127,13 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/addons/report_intrastat/report_intrastat_view.xml b/addons/report_intrastat/report_intrastat_view.xml
index e7a12e8ac5e..0449b097ec4 100644
--- a/addons/report_intrastat/report_intrastat_view.xml
+++ b/addons/report_intrastat/report_intrastat_view.xml
@@ -97,8 +97,8 @@
-
-
+
+
diff --git a/addons/resource/resource.py b/addons/resource/resource.py
index 225a6626ab1..6e8b7539fdc 100644
--- a/addons/resource/resource.py
+++ b/addons/resource/resource.py
@@ -35,7 +35,7 @@ class resource_calendar(osv.osv):
'manager' : fields.many2one('res.users', 'Workgroup manager'),
}
_defaults = {
- 'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'resource.calendar', context=c)
+ 'company_id': lambda self, cr, uid, context: self.pool.get('res.company')._company_default_get(cr, uid, 'resource.calendar', context=context)
}
def interval_min_get(self, cr, uid, id, dt_from, hours, resource=False):
diff --git a/addons/resource/resource_view.xml b/addons/resource/resource_view.xml
index 7638de41ce2..df0974fd9ed 100644
--- a/addons/resource/resource_view.xml
+++ b/addons/resource/resource_view.xml
@@ -17,10 +17,10 @@
-
-
-
-
+
+
+
+
@@ -55,9 +55,9 @@
-
-
-
+
+
+
@@ -162,12 +162,12 @@
-
-
-
-
+
+
+
+
@@ -178,11 +178,11 @@
+
-
diff --git a/addons/sale/report/sale_report.py b/addons/sale/report/sale_report.py
index 794b5a0578d..34d66702737 100644
--- a/addons/sale/report/sale_report.py
+++ b/addons/sale/report/sale_report.py
@@ -29,7 +29,12 @@ class sale_report(osv.osv):
_auto = False
_rec_name = 'date'
_columns = {
- 'date': fields.date('Date', readonly=True),
+ 'date': fields.date('Date Order', readonly=True),
+ 'date_confirm': fields.date('Date Confirm', readonly=True),
+ 'shipped':fields.boolean('Shipped', readonly=True),
+ 'paid':fields.float('Picked', readonly=True),
+ 'shipped_qty_1':fields.integer('Shipped Qty', readonly=True),
+ 'paid_qty':fields.float('Paid Qty', readonly=True),
'year': fields.char('Year', size=4, readonly=True),
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'),
('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'),
@@ -69,45 +74,39 @@ class sale_report(osv.osv):
tools.drop_view_if_exists(cr, 'sale_report')
cr.execute("""
create or replace view sale_report as (
- select
- min(l.id) as id,
+ select el.*,
+ (select count(1) from sale_order_line where order_id = s.id) as nbr,
s.date_order as date,
+ s.date_confirm as date_confirm,
to_char(s.date_order, 'YYYY') as year,
to_char(s.date_order, 'MM') as month,
to_char(s.date_order, 'YYYY-MM-DD') as day,
- l.product_id as product_id,
- u.name as uom_name,
- sum(l.product_uom_qty * u.factor) as product_uom_qty,
s.partner_id as partner_id,
s.user_id as user_id,
s.shop_id as shop_id,
s.company_id as company_id,
- extract(epoch from avg(s.date_confirm-s.create_date))/(24*60*60)::decimal(16,2) as delay,
- sum(l.product_uom_qty*l.price_unit) as price_total,
- (sum(l.product_uom_qty*l.price_unit)/sum(l.product_uom_qty * u.factor))::decimal(16,2) as price_average,
- count(*) as nbr,
+ extract(epoch from (s.date_confirm-s.create_date))/(24*60*60)::decimal(16,2) as delay,
s.state,
- pt.categ_id,
+ s.shipped,
+ s.shipped::integer as shipped_qty_1,
s.pricelist_id as pricelist_id,
s.project_id as analytic_account_id
- from
+ from
+ sale_order s,
+ (
+ select l.id as id,
+ l.product_id as product_id,
+ u.name as uom_name,
+ sum(l.product_uom_qty * u.factor) as product_uom_qty,
+ sum(l.product_uom_qty*l.price_unit) as price_total,
+ (sum(l.product_uom_qty*l.price_unit)/sum(l.product_uom_qty * u.factor))::decimal(16,2) as price_average,
+ pt.categ_id, l.order_id
+ from
sale_order_line l
- left join sale_order s on (s.id=l.order_id)
left join product_uom u on (u.id=l.product_uom)
left join product_template pt on (pt.id=l.product_id)
- group by
- s.date_order,
- s.partner_id,
- l.product_id,
- l.product_uom,
- s.user_id,
- pt.categ_id,
- u.name,
- s.state,
- s.shop_id,
- s.company_id,
- s.pricelist_id,
- s.project_id
+ group by l.id, l.order_id, l.product_id, u.name, pt.categ_id) el
+ where s.id = el.order_id
)
""")
sale_report()
diff --git a/addons/sale/report/sale_report_view.xml b/addons/sale/report/sale_report_view.xml
index 98ae326fc14..75dd9d55642 100644
--- a/addons/sale/report/sale_report_view.xml
+++ b/addons/sale/report/sale_report_view.xml
@@ -20,12 +20,12 @@
+
-
@@ -51,57 +51,62 @@
-
-
-
-
-
+
+
-
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
+
diff --git a/addons/sale/sale.py b/addons/sale/sale.py
index 779e13cfc33..af3f5a25a0e 100644
--- a/addons/sale/sale.py
+++ b/addons/sale/sale.py
@@ -49,7 +49,6 @@ def _incoterm_get(self, cr, uid, context=None):
cr.execute('select code, code||\', \'||name from stock_incoterms where active')
return cr.fetchall()
-
class sale_order(osv.osv):
_name = "sale.order"
_log_create = True
@@ -511,12 +510,12 @@ class sale_order(osv.osv):
def action_invoice_end(self, cr, uid, ids, context=None):
if context is None:
context = {}
-
+
for order in self.browse(cr, uid, ids, context=context):
for line in order.order_line:
if line.state == 'exception':
self.pool.get('sale.order.line').write(cr, uid, [line.id], {'state': 'confirmed'}, context=context)
-
+
if order.state == 'invoice_except':
self.write(cr, uid, [order.id], {'state' : 'progress'}, context=context)
@@ -1086,7 +1085,7 @@ class sale_order_line(osv.osv):
warning = {
'title': 'No Pricelist !',
'message':
- 'You have to select a pricelist in the sale form !\n'
+ 'You have to select a pricelist or a customer in the sale form !\n'
'Please set one before choosing a product.'
}
else:
diff --git a/addons/sale/sale_data.xml b/addons/sale/sale_data.xml
index e1a8998e1d3..2be5a50ff81 100644
--- a/addons/sale/sale_data.xml
+++ b/addons/sale/sale_data.xml
@@ -9,16 +9,6 @@
sale.order
-
-
- SALE: Sale Confirmation
- sale_open
-
-
-
-
diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml
index c3a8708decb..4d82e8595ad 100644
--- a/addons/sale/sale_view.xml
+++ b/addons/sale/sale_view.xml
@@ -43,8 +43,9 @@
tree,form
+
@@ -192,6 +193,7 @@
+
@@ -251,21 +253,21 @@
search
-
-
-
+
+
+
-
-
-
+
+
+
-
-
+
+
@@ -384,6 +386,11 @@
+ search
-
+
-
-
+
+
-
+
-
-
+
+
@@ -441,14 +448,14 @@
search
-
-
-
@@ -458,10 +465,10 @@
-
-
-
-
+
+
+
+
diff --git a/addons/sale/wizard/sale_line_invoice.xml b/addons/sale/wizard/sale_line_invoice.xml
index 436fabc91fc..0420a8c3404 100644
--- a/addons/sale/wizard/sale_line_invoice.xml
+++ b/addons/sale/wizard/sale_line_invoice.xml
@@ -14,13 +14,14 @@
-
+
+ Make Invoices
+ ir.actions.act_window
+ sale.order.line.make.invoice
+ form
+ form
+ new
+
diff --git a/addons/sale_crm/sale_crm_view.xml b/addons/sale_crm/sale_crm_view.xml
index 7a8cd419718..bf5f1aaac52 100644
--- a/addons/sale_crm/sale_crm_view.xml
+++ b/addons/sale_crm/sale_crm_view.xml
@@ -9,7 +9,7 @@
-
+
@@ -35,7 +35,7 @@
-
diff --git a/addons/sale_crm/wizard/makesale.py b/addons/sale_crm/wizard/makesale.py
index 1a1d2387da9..e4aacce1044 100644
--- a/addons/sale_crm/wizard/makesale.py
+++ b/addons/sale_crm/wizard/makesale.py
@@ -28,7 +28,7 @@ import pooler
from tools.translate import _
sale_form = """
-
+
@@ -135,10 +135,10 @@ class make_sale(wizard.interface):
if data['form']['close']:
case_obj.case_close(cr, uid, data['ids'])
-
+
if not new_ids:
return {}
-
+
if len(new_ids)<=1:
value = {
'domain': str([('id', 'in', new_ids)]),
@@ -159,7 +159,7 @@ class make_sale(wizard.interface):
'type': 'ir.actions.act_window',
'res_id':new_ids
}
-
+
return value
states = {
diff --git a/addons/sale_journal/__init__.py b/addons/sale_journal/__init__.py
index 4cb6588ed18..f846067a3b4 100644
--- a/addons/sale_journal/__init__.py
+++ b/addons/sale_journal/__init__.py
@@ -18,10 +18,8 @@
# along with this program. If not, see .
#
##############################################################################
-
import sale_journal
-import sale_journal_inherit
-import sale_journal_report
-import sale_journal_picking_report
+import report
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale_journal/__openerp__.py b/addons/sale_journal/__openerp__.py
index d204d4a3ee5..94d343debb9 100644
--- a/addons/sale_journal/__openerp__.py
+++ b/addons/sale_journal/__openerp__.py
@@ -28,7 +28,7 @@
The sale journal modules allows you to categorise your
sales and deliveries (picking lists) between different journals.
This module is very helpful for bigger companies that
- work by departments.
+ works by departments.
You can use journal for different purposes, some examples:
* isolate sales of different departments
@@ -54,8 +54,7 @@
'update_xml': [
'security/ir.model.access.csv',
'sale_journal_view.xml',
- 'picking_journal_view.xml',
- 'picking_journal_view_report.xml'
+ 'report/sale_journal_report_view.xml',
],
'demo_xml': ['sale_journal_demo.xml'],
'installable': True,
diff --git a/addons/sale_journal/picking_journal_view.xml b/addons/sale_journal/picking_journal_view.xml
deleted file mode 100644
index f6b59668150..00000000000
--- a/addons/sale_journal/picking_journal_view.xml
+++ /dev/null
@@ -1,110 +0,0 @@
-
-
-
-
- sale_journal.picking.journal.form
- sale_journal.picking.journal
- form
-
-
-
-
-
-
+
+
+
+
+
+
@@ -169,7 +171,7 @@
- Search Pages
+ Wiki Pageswiki.wikiformtree,form
diff --git a/addons/wiki_sale_faq/__init__.py b/addons/wiki_sale_faq/__init__.py
new file mode 100644
index 00000000000..938f045b9fd
--- /dev/null
+++ b/addons/wiki_sale_faq/__init__.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/wiki_sale_faq/__openerp__.py b/addons/wiki_sale_faq/__openerp__.py
new file mode 100644
index 00000000000..9619ec98f15
--- /dev/null
+++ b/addons/wiki_sale_faq/__openerp__.py
@@ -0,0 +1,42 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+{
+ 'name': 'Wiki -Sale - FAQ',
+ 'version': '1.0',
+ 'category': 'Generic Modules/Others',
+ 'description': """This module provides a wiki FAQ Template
+ """,
+ 'author': 'Tiny',
+ 'website': 'http://openerp.com',
+ 'depends': ['wiki_faq','document','crm'],
+ 'init_xml': [
+ 'wiki_sale_faq_data.xml'
+ ],
+ 'update_xml': [
+ 'wiki_sale_faq_view.xml'
+ ],
+ 'demo_xml': [
+ ],
+ 'installable': True,
+ 'active': False,
+}
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/wiki_sale_faq/wiki_sale_faq_data.xml b/addons/wiki_sale_faq/wiki_sale_faq_data.xml
new file mode 100644
index 00000000000..4a8eea1cb38
--- /dev/null
+++ b/addons/wiki_sale_faq/wiki_sale_faq_data.xml
@@ -0,0 +1,26 @@
+
+
+
+
+ Sales Document
+
+
+ 0
+
+
+
+ Sale FAQ
+ list
+
+ == Question ==
+
+== Answer ==
+
+== External Links ==
+
+
+
+
+
+
+
diff --git a/addons/wiki_sale_faq/wiki_sale_faq_view.xml b/addons/wiki_sale_faq/wiki_sale_faq_view.xml
new file mode 100644
index 00000000000..c3643bdf049
--- /dev/null
+++ b/addons/wiki_sale_faq/wiki_sale_faq_view.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+ ir.actions.act_window
+ ir.attachment
+ form
+
+
+
+
+ Wiki Pages
+ wiki.wiki
+ form
+ tree,form
+
+
+
+
+
+
+
+
+
+
+