[IMP] notify on successful database dump or restoration
authorXavier Morel <xmo@openerp.com>
Tue, 10 Jan 2012 13:54:38 +0000 (14:54 +0100)
committerXavier Morel <xmo@openerp.com>
Tue, 10 Jan 2012 13:54:38 +0000 (14:54 +0100)
bzr revid: xmo@openerp.com-20120110135438-ceoexxnvixg3xcsu

52 files changed:
addons/account/i18n/tr.po
addons/account/project/project_view.xml
addons/account_analytic_analysis/account_analytic_analysis.py
addons/account_analytic_analysis/account_analytic_analysis_view.xml
addons/crm/crm_lead_menu.xml
addons/crm/crm_phonecall_menu.xml
addons/crm/security/ir.model.access.csv
addons/crm/test/process/action_rule.yml
addons/document/document_view.xml
addons/hr_contract/test/test_hr_contract.yml
addons/hr_evaluation/hr_evaluation.py
addons/hr_holidays/hr_holidays_view.xml
addons/hr_holidays/report/available_holidays_view.xml
addons/hr_payroll/hr_payroll_view.xml
addons/hr_timesheet_sheet/hr_timesheet_sheet.py
addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml
addons/lunch/test/test_lunch.yml
addons/marketing_campaign/marketing_campaign_view.xml
addons/plugin_thunderbird/i18n/ro.po [new file with mode: 0644]
addons/point_of_sale/static/src/css/pos.css
addons/point_of_sale/static/src/js/pos.js
addons/point_of_sale/static/src/xml/pos.xml
addons/product_visible_discount/product_visible_discount.py
addons/project/project.py
addons/sale/i18n/ar.po
addons/sale/sale.py
addons/stock/stock.py
addons/stock/stock_view.xml
addons/stock_planning/i18n/nl.po [new file with mode: 0644]
addons/survey/i18n/ro.po [new file with mode: 0644]
addons/survey/wizard/survey_answer.py
addons/users_ldap/i18n/ro.po [new file with mode: 0644]
addons/web/common/openerplib/main.py
addons/web/static/src/js/chrome.js
addons/web/static/src/js/data_export.js
addons/web/static/src/js/formats.js
addons/web/static/src/js/view_form.js
addons/web/static/src/js/view_list.js
addons/web/static/src/js/view_page.js
addons/web/static/src/js/views.js
addons/web/static/src/xml/base.xml
addons/web_diagram/__openerp__.py
addons/web_diagram/controllers/main.py
addons/web_diagram/static/src/js/diagram.js
addons/web_livechat/static/src/js/web_livechat.js
addons/web_uservoice/static/src/js/web_uservoice.js
openerp-server
openerp/addons/base/module/wizard/base_import_language.py
openerp/addons/base/module/wizard/base_update_translations.py
openerp/osv/fields.py
openerp/tools/translate.py

index 54b9c2f..df284ac 100644 (file)
@@ -7,13 +7,13 @@ msgstr ""
 "Project-Id-Version: OpenERP Server 6.0dev\n"
 "Report-Msgid-Bugs-To: support@openerp.com\n"
 "POT-Creation-Date: 2011-12-23 09:55+0000\n"
-"PO-Revision-Date: 2012-01-08 11:37+0000\n"
-"Last-Translator: Ahmet Altınışık <Unknown>\n"
+"PO-Revision-Date: 2012-01-09 20:41+0000\n"
+"Last-Translator: Erdem U <Unknown>\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: 2012-01-09 04:50+0000\n"
+"X-Launchpad-Export-Date: 2012-01-10 05:21+0000\n"
 "X-Generator: Launchpad (build 14640)\n"
 
 #. module: account
@@ -3862,7 +3862,7 @@ msgstr "Onayla"
 #. module: account
 #: model:account.financial.report,name:account.account_financial_report_assets0
 msgid "Assets"
-msgstr ""
+msgstr "Varlıklar"
 
 #. module: account
 #: view:account.invoice.confirm:0
index 9fc2e7e..07400c6 100644 (file)
@@ -60,7 +60,6 @@
                 <tree colors="blue:state=='pending';grey:state in ('close','cancelled');blue:type=='view'" string="Analytic account" toolbar="1">
                     <field name="name"/>
                     <field name="code" groups="base.group_extended"/>
-                    <field name="quantity"/>
                     <field name="debit"/>
                     <field name="credit"/>
                     <field name="balance"/>
index 3fe60e4..d379ba2 100644 (file)
@@ -33,9 +33,7 @@ class account_analytic_account(osv.osv):
     def _analysis_all(self, cr, uid, ids, fields, arg, context=None):
         dp = 2
         res = dict([(i, {}) for i in ids])
-
-        parent_ids = tuple(self.search(cr, uid, [('parent_id', 'child_of', ids)], context=context))
-        res.update(dict([(i, {}) for i in parent_ids]))
+        parent_ids = tuple(ids) #We don't want consolidation for each of these fields because those complex computation is resource-greedy.
         accounts = self.browse(cr, uid, ids, context=context)
 
         for f in fields:
@@ -72,10 +70,6 @@ class account_analytic_account(osv.osv):
                         if account_id not in res:
                             res[account_id] = {}
                         res[account_id][f] = sum
-                for account in accounts:
-                    for child in account.child_ids:
-                        if res[account.id][f] < res.get(child.id, {}).get(f):
-                            res[account.id][f] = res.get(child.id, {}).get(f, False)
             elif f == 'ca_to_invoice':
                 for id in ids:
                     res[id][f] = 0.0
@@ -111,13 +105,6 @@ class account_analytic_account(osv.osv):
                             res[account_id] = {}
                         res[account_id][f] = round(sum, dp)
 
-                for account in accounts:
-                    #res.setdefault(account.id, 0.0)
-                    res2.setdefault(account.id, 0.0)
-                    for child in account.child_ids:
-                        if child.id != account.id:
-                            res[account.id][f] += res.get(child.id, {}).get(f, 0.0)
-                            res2[account.id] += res2.get(child.id, 0.0)
                 # sum both result on account_id
                 for id in ids:
                     res[id][f] = round(res.get(id, {}).get(f, 0.0), dp) + round(res2.get(id, 0.0), 2)
@@ -135,10 +122,6 @@ class account_analytic_account(osv.osv):
                             GROUP BY account_analytic_line.account_id",(parent_ids,))
                     for account_id, lid in cr.fetchall():
                         res[account_id][f] = lid
-                for account in accounts:
-                    for child in account.child_ids:
-                        if res[account.id][f] < res.get(child.id, {}).get(f):
-                            res[account.id][f] = res.get(child.id, {}).get(f, False)
             elif f == 'last_worked_date':
                 for id in ids:
                     res[id][f] = False
@@ -152,10 +135,6 @@ class account_analytic_account(osv.osv):
                         if account_id not in res:
                             res[account_id] = {}
                         res[account_id][f] = lwd
-                for account in accounts:
-                    for child in account.child_ids:
-                        if res[account.id][f] < res.get(child.id, {}).get(f):
-                            res[account.id][f] = res.get(child.id, {}).get(f, False)
             elif f == 'hours_qtt_non_invoiced':
                 for id in ids:
                     res[id][f] = 0.0
@@ -173,10 +152,6 @@ class account_analytic_account(osv.osv):
                         if account_id not in res:
                             res[account_id] = {}
                         res[account_id][f] = round(sua, dp)
-                for account in accounts:
-                    for child in account.child_ids:
-                        if account.id != child.id:
-                            res[account.id][f] += res.get(child.id, {}).get(f, 0.0)
                 for id in ids:
                     res[id][f] = round(res[id][f], dp)
             elif f == 'hours_quantity':
@@ -195,19 +170,12 @@ class account_analytic_account(osv.osv):
                         if account_id not in res:
                             res[account_id] = {}
                         res[account_id][f] = round(hq, dp)
-                for account in accounts:
-                    for child in account.child_ids:
-                        if account.id != child.id:
-                            if account.id not in res:
-                                res[account.id] = {f: 0.0}
-                            res[account.id][f] += res.get(child.id, {}).get(f, 0.0)
                 for id in ids:
                     res[id][f] = round(res[id][f], dp)
             elif f == 'ca_theorical':
                 # TODO Take care of pricelist and purchase !
                 for id in ids:
                     res[id][f] = 0.0
-                res2 = {}
                 # Warning
                 # This computation doesn't take care of pricelist !
                 # Just consider list_price
@@ -232,31 +200,15 @@ class account_analytic_account(osv.osv):
                             AND account_analytic_journal.type IN ('purchase', 'general')
                         GROUP BY account_analytic_line.account_id""",(parent_ids,))
                     for account_id, sum in cr.fetchall():
-                        res2[account_id] = round(sum, dp)
-
-                for account in accounts:
-                    res2.setdefault(account.id, 0.0)
-                    for child in account.child_ids:
-                        if account.id != child.id:
-                            if account.id not in res:
-                                res[account.id] = {f: 0.0}
-                            res[account.id][f] += res.get(child.id, {}).get(f, 0.0)
-                            res[account.id][f] += res2.get(child.id, 0.0)
-
-                # sum both result on account_id
-                for id in ids:
-                    res[id][f] = round(res[id][f], dp) + round(res2.get(id, 0.0), dp)
-
+                        res[account_id][f] = round(sum, dp)
         return res
 
     def _ca_invoiced_calc(self, cr, uid, ids, name, arg, context=None):
         res = {}
         res_final = {}
-        child_ids = tuple(self.search(cr, uid, [('parent_id', 'child_of', ids)], context=context))
+        child_ids = tuple(ids) #We don't want consolidation for each of these fields because those complex computation is resource-greedy.
         for i in child_ids:
-            res[i] =  {}
-            for n in [name]:
-                res[i][n] = 0.0
+            res[i] =  0.0
         if not child_ids:
             return res
 
@@ -269,24 +221,18 @@ class account_analytic_account(osv.osv):
                         AND account_analytic_journal.type = 'sale' \
                     GROUP BY account_analytic_line.account_id", (child_ids,))
             for account_id, sum in cr.fetchall():
-                res[account_id][name] = round(sum,2)
-        data = self._compute_level_tree(cr, uid, ids, child_ids, res, [name], context=context)
-        for i in data:
-            res_final[i] = data[i][name]
+                res[account_id] = round(sum,2)
+        res_final = res
         return res_final
 
     def _total_cost_calc(self, cr, uid, ids, name, arg, context=None):
         res = {}
         res_final = {}
-        child_ids = tuple(self.search(cr, uid, [('parent_id', 'child_of', ids)], context=context))
-
+        child_ids = tuple(ids) #We don't want consolidation for each of these fields because those complex computation is resource-greedy.
         for i in child_ids:
-            res[i] =  {}
-            for n in [name]:
-                res[i][n] = 0.0
+            res[i] =  0.0
         if not child_ids:
             return res
-
         if child_ids:
             cr.execute("""SELECT account_analytic_line.account_id, COALESCE(SUM(amount), 0.0) \
                     FROM account_analytic_line \
@@ -296,10 +242,8 @@ class account_analytic_account(osv.osv):
                         AND amount<0 \
                     GROUP BY account_analytic_line.account_id""",(child_ids,))
             for account_id, sum in cr.fetchall():
-                res[account_id][name] = round(sum,2)
-        data = self._compute_level_tree(cr, uid, ids, child_ids, res, [name], context)
-        for i in data:
-            res_final[i] = data[i][name]
+                res[account_id] = round(sum,2)
+        res_final = res
         return res_final
 
     def _remaining_hours_calc(self, cr, uid, ids, name, arg, context=None):
@@ -455,7 +399,7 @@ class account_analytic_account_summary_user(osv.osv):
         max_user = cr.fetchone()[0]
         account_ids = [int(str(x/max_user - (x%max_user == 0 and 1 or 0))) for x in ids]
         user_ids = [int(str(x-((x/max_user - (x%max_user == 0 and 1 or 0)) *max_user))) for x in ids]
-        parent_ids = tuple(account_obj.search(cr, uid, [('parent_id', 'child_of', account_ids)], context=context))
+        parent_ids = tuple(account_ids) #We don't want consolidation for each of these fields because those complex computation is resource-greedy.
         if parent_ids:
             cr.execute('SELECT id, unit_amount ' \
                     'FROM account_analytic_analysis_summary_user ' \
@@ -463,12 +407,6 @@ class account_analytic_account_summary_user(osv.osv):
                         'AND "user" IN %s',(parent_ids, tuple(user_ids),))
             for sum_id, unit_amount in cr.fetchall():
                 res[sum_id] = unit_amount
-        for obj_id in ids:
-            res.setdefault(obj_id, 0.0)
-            for child_id in account_obj.search(cr, uid,
-                    [('parent_id', 'child_of', [int(str(obj_id/max_user - (obj_id%max_user == 0 and 1 or 0)))])]):
-                if child_id != int(str(obj_id/max_user - (obj_id%max_user == 0 and 1 or 0))):
-                    res[obj_id] += res.get((child_id * max_user) + obj_id -((obj_id/max_user - (obj_id%max_user == 0 and 1 or 0)) * max_user), 0.0)
         for id in ids:
             res[id] = round(res.get(id, 0.0), 2)
         return res
@@ -619,7 +557,7 @@ class account_analytic_account_summary_month(osv.osv):
         account_obj = self.pool.get('account.analytic.account')
         account_ids = [int(str(int(x))[:-6]) for x in ids]
         month_ids = [int(str(int(x))[-6:]) for x in ids]
-        parent_ids = tuple(account_obj.search(cr, uid, [('parent_id', 'child_of', account_ids)], context=context))
+        parent_ids = tuple(ids) #We don't want consolidation for each of these fields because those complex computation is resource-greedy.
         if parent_ids:
             cr.execute('SELECT id, unit_amount ' \
                     'FROM account_analytic_analysis_summary_month ' \
@@ -627,12 +565,6 @@ class account_analytic_account_summary_month(osv.osv):
                         'AND month_id IN %s ',(parent_ids, tuple(month_ids),))
             for sum_id, unit_amount in cr.fetchall():
                 res[sum_id] = unit_amount
-        for obj_id in ids:
-            res.setdefault(obj_id, 0.0)
-            for child_id in account_obj.search(cr, uid,
-                    [('parent_id', 'child_of', [int(str(int(obj_id))[:-6])])]):
-                if child_id != int(str(int(obj_id))[:-6]):
-                    res[obj_id] += res.get(int(child_id * 1000000 + int(str(int(obj_id))[-6:])), 0.0)
         for id in ids:
             res[id] = round(res.get(id, 0.0), 2)
         return res
@@ -778,5 +710,4 @@ class account_analytic_account_summary_month(osv.osv):
         return res
 
 account_analytic_account_summary_month()
-
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
index 73c98e6..60d30f9 100644 (file)
@@ -93,6 +93,7 @@
                     <field name="hours_quantity"/>
                     <field name="hours_qtt_non_invoiced"/>
                     <field name="remaining_hours"/>
+                    <field name="quantity_max"/>
                 </field>
             </field>
         </record>
index f902123..777b58a 100644 (file)
@@ -51,7 +51,7 @@
             name="Meetings"
             res_model="crm.meeting"
             src_model="crm.lead"
-            view_mode="tree,form,calendar,"
+            view_mode="tree,form,calendar"
             context="{'default_duration': 4.0, 'default_opportunity_id': active_id}"
             domain="[('opportunity_id', '=', active_id)]"
             view_type="form"/>
index d192b97..d8d0071 100644 (file)
@@ -18,7 +18,7 @@
             name="Meetings"
             res_model="crm.meeting"
             src_model="crm.phonecall"
-            view_mode="tree,form,calendar,"
+            view_mode="tree,form,calendar"
             context="{'default_duration': 4.0, 'default_phonecall_id': active_id}"
             domain="[('phonecall_id', '=', active_id)]"
             view_type="form"/-->
index a3725b5..47a0f8f 100644 (file)
@@ -5,7 +5,7 @@ access_crm_segmentation,crm.segmentation,model_crm_segmentation,base.group_sale_
 access_crm_segmentation_line,crm.segmentation.line,model_crm_segmentation_line,base.group_sale_manager,1,1,1,1\r
 access_crm_case_channel_user,crm.case.channel user,model_crm_case_channel,base.group_sale_salesman,1,0,0,0\r
 access_crm_case_channel_manager,crm.case.channel manager,model_crm_case_channel,base.group_sale_manager,1,1,1,1\r
-access_crm_case_section,crm.case.section,model_crm_case_section,base.group_sale_salesman,1,1,1,0\r
+access_crm_case_section,crm.case.section,model_crm_case_section,base.group_user,1,0,0,0\r
 access_crm_case_categ,crm.case.categ,model_crm_case_categ,base.group_sale_salesman,1,1,1,0\r
 access_crm_meeting_manager,crm.meeting.manager,model_crm_meeting,base.group_sale_manager,1,1,1,1\r
 access_crm_lead_manager,crm.lead.manager,model_crm_lead,base.group_sale_manager,1,1,1,1\r
index f96c1eb..b13c9b0 100644 (file)
@@ -12,7 +12,6 @@
 -
   !record {model: crm.lead, id: crm_lead_test_rules_id}:
     name: 'Test lead rules'
-    user_id: base.user_root
     partner_id: base.res_partner_asus
 -
   I check record rule is apply and responsible is changed.
index 05e49ae..a68f676 100644 (file)
@@ -70,7 +70,7 @@
         <field name="model">document.directory</field>
         <field name="type">form</field>
         <field name="arch" type="xml">
-            <form string="Directories" col="6">
+            <form string="Directories" col="4">
                 <field name="name" select="1" colspan="4"/>
                 <field name="parent_id"/>
                 <field name="storage_id" widget="selection" />
@@ -93,7 +93,7 @@
                         <field name="ressource_parent_type_id"/>
                         <field name="ressource_id" select="2" readonly="1"/>
                     </group>
-                    <group colspan="4" col="2" attrs="{'invisible': [('type','!=','ressource'),('resource_parent_type_id','=',False)]}">
+                    <group colspan="4" col="2" attrs="{'invisible': [('type','!=','ressource'),('ressource_parent_type_id','=',False)]}">
                         <field name="resource_find_all" groups="base.group_extended" />
                     </group>
 
index bd39e09..ad60e4e 100644 (file)
@@ -9,7 +9,6 @@
     company_id: base.main_company
     gender: male
     name: Mark Johnson
-    user_id: base.user_root
     children: 2
     marital: 'married'
     place_of_birth: Belgium
index 58ad9d9..6e1983d 100644 (file)
@@ -276,9 +276,6 @@ class survey_request(osv.osv):
     _columns = {
         'is_evaluation': fields.boolean('Is Appraisal?'),
     }
-    _defaults = {
-        'state': 'waiting_answer',
-    }
 
 survey_request()
 
index 69e89ef..22d4d6e 100644 (file)
                         <filter icon="terp-camera_test" domain="[('state','=','confirm')]" string="To Approve" name="approve"/>
                         <filter icon="terp-camera_test" domain="[('state','=','validate')]" string="Validated" name="validated"/>
                         <separator orientation="vertical"/>
-                        <filter icon="terp-go-year" name="year" string="Year" domain="[('create_date','&gt;=',time.strftime('%%Y-1-1')),('create_date','&lt;=',time.strftime('%%Y-12-31'))]"/>
-                        <filter string="Month" icon="terp-go-month" name="This Month" domain="[('date_from','&lt;=',(datetime.date.today()+relativedelta(day=31)).strftime('%%Y-%%m-%%d')),('date_from','&gt;=',(datetime.date.today()-relativedelta(day=1)).strftime('%%Y-%%m-%%d'))]"/>
+                        <filter icon="terp-go-year" name="year" string="Year" domain="[('date_from','&gt;=',time.strftime('%%Y-1-1')),('date_from','&lt;=',time.strftime('%%Y-12-31'))]"/>
+                        <filter icon="terp-go-month" name="This Month" string="Month" domain="[('date_from','&lt;=',(datetime.date.today()+relativedelta(day=31)).strftime('%%Y-%%m-%%d')),('date_from','&gt;=',(datetime.date.today()-relativedelta(day=1)).strftime('%%Y-%%m-%%d'))]"/>
+                        <filter icon="terp-go-month" name="This Month-1" string=" Month-1" 
+                         domain="[('date_from','&lt;=', (datetime.date.today() - relativedelta(day=31, months=1)).strftime('%%Y-%%m-%%d')),('date_from','&gt;=',(datetime.date.today() - relativedelta(day=1,months=1)).strftime('%%Y-%%m-%%d'))]"
+                         help="Holidays during last month"/>
                         <separator orientation="vertical"/>
                         <field name="employee_id">
                             <filter icon="terp-personal" name="my_leaves" domain="[('employee_id.user_id','=', uid)]" help="My Leaves"/>
@@ -25,6 +28,8 @@
                     </group>
                     <newline/>
                     <group expand="0" string="Group By...">
+                        <filter name="group_date_from" string="Start Date" icon="terp-personal" domain="[]" context="{'group_by':'date_from'}"/>
+                        <separator orientation="vertical"/>
                         <filter name="group_employee" string="Employee" icon="terp-personal" domain="[]" context="{'group_by':'employee_id'}"/>
                         <filter name="group_category" string="Category" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'category_id'}"/>
                         <filter string="Manager" icon="terp-personal" domain="[]" context="{'group_by':'manager_id'}"/>
index 730c396..082bf19 100644 (file)
@@ -8,7 +8,7 @@
             <field name="view_type">form</field>
             <field name="view_mode">tree,form</field>
             <field name="view_id" eval="view_holiday_simple"/>
-            <field name="context">{'search_default_group_employee': 1, 'search_default_group_type': 1}</field>
+            <field name="context">{'search_default_year':1, 'search_default_This Month':1, 'search_default_group_employee': 1, 'search_default_group_type': 1}</field>
             <field name="domain">[('holiday_type','=','employee')]</field>
             <field name="search_view_id" ref="view_hr_holidays_filter"/>
         </record>
index 2cf7cb8..92a88f9 100644 (file)
             <field name="name">Salary Rule Categories Hierarchy</field>
             <field name="res_model">hr.salary.rule.category</field>
             <field name="view_type">tree</field>
+            <field name="domain">[('parent_id','=',False)]</field>
             <field name="view_id" ref="hr_salary_rule_category_tree_view"/>
         </record>
         <menuitem
index 75ca078..f18adba 100644 (file)
@@ -20,7 +20,7 @@
 ##############################################################################
 
 import time
-from datetime import datetime
+from datetime import datetime, timedelta
 from dateutil.relativedelta import relativedelta
 
 from osv import fields, osv
@@ -35,16 +35,10 @@ class one2many_mod2(fields.one2many):
         if values is None:
             values = {}
 
-        # dict:
-        # {idn: (date_current, user_id), ...
-        #  1: ('2010-08-15', 1)}
-        res6 = dict([(rec['id'], (rec['date_current'], rec['user_id'][0]))
-                        for rec
-                            in obj.read(cr, user, ids, ['date_current', 'user_id'], context=context)])
+        # res6 = {id: date_current, ...}
+        res6 = dict([(rec['id'], rec['date_current'])
+            for rec in obj.read(cr, user, ids, ['date_current'], context=context)])
 
-        # eg: ['|', '|',
-        #       '&', '&', ('name', '>=', '2011-03-01'), ('name', '<=', '2011-03-01'), ('employee_id.user_id', '=', 1),
-        #       '&', '&', ('name', '>=', '2011-02-01'), ('name', '<=', '2011-02-01'), ('employee_id.user_id', '=', 1)]
         dom = []
         for c, id in enumerate(ids):
             if id in res6:
@@ -52,9 +46,9 @@ class one2many_mod2(fields.one2many):
                     dom.insert(0 ,'|')
                 dom.append('&')
                 dom.append('&')
-                dom.append(('name', '>=', res6[id][0]))
-                dom.append(('name', '<=', res6[id][0]))
-                dom.append(('employee_id.user_id', '=', res6[id][1]))
+                dom.append(('name', '>=', res6[id]))
+                dom.append(('name', '<=', res6[id]))
+                dom.append(('sheet_id', '=', id))
 
         ids2 = obj.pool.get(self._obj).search(cr, user, dom, limit=self._limit)
 
@@ -62,10 +56,9 @@ class one2many_mod2(fields.one2many):
         for i in ids:
             res[i] = []
 
-        for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2, [self._fields_id], context=context, load='_classic_write'):
+        for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2, [self._fields_id], context=context, load='_classic_read'):
             if r[self._fields_id]:
                 res[r[self._fields_id][0]].append(r['id'])
-
         return res
 
     def set(self, cr, obj, id, field, values, user=None, context=None):
@@ -86,23 +79,23 @@ class one2many_mod(fields.one2many):
             values = {}
 
 
-        res5 = obj.read(cr, user, ids, ['date_current', 'user_id'], context=context)
+        res5 = obj.read(cr, user, ids, ['date_current'], context=context)
         res6 = {}
         for r in res5:
-            res6[r['id']] = (r['date_current'], r['user_id'][0])
+            res6[r['id']] = r['date_current']
 
         ids2 = []
         for id in ids:
             dom = []
             if id in res6:
-                dom = [('date', '=', res6[id][0]), ('user_id', '=', res6[id][1])]
+                dom = [('date', '=', res6[id]), ('sheet_id', '=', id)]
             ids2.extend(obj.pool.get(self._obj).search(cr, user,
                 dom, limit=self._limit))
         res = {}
         for i in ids:
             res[i] = []
         for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2,
-                [self._fields_id], context=context, load='_classic_write'):
+                [self._fields_id], context=context, load='_classic_read'):
             if r[self._fields_id]:
                 res[r[self._fields_id][0]].append(r['id'])
 
@@ -114,33 +107,126 @@ class hr_timesheet_sheet(osv.osv):
     _order = "id desc"
     _description="Timesheet"
 
-    def _total_day(self, cr, uid, ids, name, args, context=None):
+    def _total_attendances(self, cr, uid, ids, name, args, context=None):
+        """ Get the total attendance for the timesheets
+            Returns a dict like :
+                {id: {'date_current': '2011-06-17',
+                      'total_per_day': {day: timedelta, ...},
+                     },
+                 ...
+                }
+        """
+        context = context or {}
+        attendance_obj = self.pool.get('hr.attendance')
         res = {}
-        cr.execute('SELECT sheet.id, day.total_attendance, day.total_timesheet, day.total_difference\
-                FROM hr_timesheet_sheet_sheet AS sheet \
-                LEFT JOIN hr_timesheet_sheet_sheet_day AS day \
-                    ON (sheet.id = day.sheet_id \
-                        AND day.name = sheet.date_current) \
-                WHERE sheet.id IN %s',(tuple(ids),))
-        for record in cr.fetchall():
-            res[record[0]] = {}
-            res[record[0]]['total_attendance_day'] = record[1]
-            res[record[0]]['total_timesheet_day'] = record[2]
-            res[record[0]]['total_difference_day'] = record[3]
+        for sheet_id in ids:
+            sheet = self.browse(cr, uid, sheet_id, context=context)
+            date_current = sheet.date_current
+            # field attendances_ids of hr_timesheet_sheet.sheet only
+            # returns attendances of timesheet's current date
+            attendance_ids = attendance_obj.search(cr, uid, [('sheet_id', '=', sheet_id)], context=context)
+            attendances = attendance_obj.browse(cr, uid, attendance_ids, context=context)
+            total_attendance = {}
+            for attendance in [att for att in attendances
+                               if att.action in ('sign_in', 'sign_out')]:
+                day = attendance.name[:10]
+                if not total_attendance.get(day, False):
+                    total_attendance[day] = timedelta(seconds=0)
+
+                attendance_in_time = datetime.strptime(attendance.name, '%Y-%m-%d %H:%M:%S')
+                attendance_interval = timedelta(hours=attendance_in_time.hour,
+                                                minutes=attendance_in_time.minute,
+                                                seconds=attendance_in_time.second)
+                if attendance.action == 'sign_in':
+                    total_attendance[day] -= attendance_interval
+                else:
+                    total_attendance[day] += attendance_interval
+
+                # if the delta is negative, it means that a sign out is missing
+                # in a such case, we want to have the time to the end of the day
+                # for a past date, and the time to now for the current date
+                if total_attendance[day] < timedelta(0):
+                    if day == date_current:
+                        now = datetime.now()
+                        total_attendance[day] += timedelta(hours=now.hour,
+                                                           minutes=now.minute,
+                                                           seconds=now.second)
+                    else:
+                        total_attendance[day] += timedelta(days=1)
+
+            res[sheet_id] = {'date_current': date_current,
+                             'total_per_day': total_attendance}
+        return res
+
+    def _total_timesheet(self, cr, uid, ids, name, args, context=None):
+        """ Get the total of analytic lines for the timesheets
+            Returns a dict like :
+                {id: {day: timedelta, ...}}
+        """
+        context = context or {}
+        sheet_line_obj = self.pool.get('hr.analytic.timesheet')
+
+        res = {}
+        for sheet_id in ids:
+            # field timesheet_ids of hr_timesheet_sheet.sheet only
+            # returns lines of timesheet's current date
+            sheet_lines_ids = sheet_line_obj.search(cr, uid, [('sheet_id', '=', sheet_id)], context=context)
+            sheet_lines = sheet_line_obj.browse(cr, uid, sheet_lines_ids, context=context)
+            total_timesheet = {}
+            for line in sheet_lines:
+                day = line.date
+                if not total_timesheet.get(day, False):
+                    total_timesheet[day] = timedelta(seconds=0)
+                total_timesheet[day] += timedelta(hours=line.unit_amount)
+            res[sheet_id] = total_timesheet
         return res
 
     def _total(self, cr, uid, ids, name, args, context=None):
+        """ Compute the attendances, analytic lines timesheets and differences between them
+            for all the days of a timesheet and the current day
+        """
+        def sum_all_days(sheet_amounts):
+            if not sheet_amounts:
+                return timedelta(seconds=0)
+            total = reduce(lambda memo, value: memo + value, sheet_amounts.values())
+            return total
+
+        def timedelta_to_hours(delta):
+            hours = 0.0
+            seconds = float(delta.seconds)
+            if delta.microseconds:
+                seconds += float(delta.microseconds) / 100000
+            hours += delta.days * 24
+            if seconds:
+                hours += seconds / 3600
+            return hours
+
         res = {}
-        cr.execute('SELECT s.id, COALESCE(SUM(d.total_attendance),0), COALESCE(SUM(d.total_timesheet),0), COALESCE(SUM(d.total_difference),0) \
-                FROM hr_timesheet_sheet_sheet s \
-                    LEFT JOIN hr_timesheet_sheet_sheet_day d \
-                        ON (s.id = d.sheet_id) \
-                WHERE s.id IN %s GROUP BY s.id',(tuple(ids),))
-        for record in cr.fetchall():
-            res[record[0]] = {}
-            res[record[0]]['total_attendance'] = record[1]
-            res[record[0]]['total_timesheet'] = record[2]
-            res[record[0]]['total_difference'] = record[3]
+        all_timesheet_attendances = self._total_attendances(cr, uid, ids, name, args, context=context)
+        all_timesheet_lines = self._total_timesheet(cr, uid, ids, name, args, context=context)
+        for id in ids:
+            res[id] = {}
+
+            all_attendances_sheet = all_timesheet_attendances[id]
+
+            date_current = all_attendances_sheet['date_current']
+            total_attendances_sheet = all_attendances_sheet['total_per_day']
+            total_attendances_all_days = sum_all_days(total_attendances_sheet)
+            total_attendances_day = total_attendances_sheet.get(date_current, timedelta(seconds=0))
+
+            total_timesheets_sheet = all_timesheet_lines[id]
+            total_timesheets_all_days = sum_all_days(total_timesheets_sheet)
+            total_timesheets_day = total_timesheets_sheet.get(date_current, timedelta(seconds=0))
+            total_difference_all_days = total_attendances_all_days - total_timesheets_all_days
+            total_difference_day = total_attendances_day - total_timesheets_day
+
+            res[id]['total_attendance'] = timedelta_to_hours(total_attendances_all_days)
+            res[id]['total_timesheet'] = timedelta_to_hours(total_timesheets_all_days)
+            res[id]['total_difference'] = timedelta_to_hours(total_difference_all_days)
+
+            res[id]['total_attendance_day'] = timedelta_to_hours(total_attendances_day)
+            res[id]['total_timesheet_day'] = timedelta_to_hours(total_timesheets_day)
+            res[id]['total_difference_day'] = timedelta_to_hours(total_difference_day)
         return res
 
     def check_employee_attendance_state(self, cr, uid, sheet_id, context=None):
@@ -179,7 +265,7 @@ class hr_timesheet_sheet(osv.osv):
 
     def button_confirm(self, cr, uid, ids, context=None):
         for sheet in self.browse(cr, uid, ids, context=context):
-            self.check_employee_attendance_state(cr, uid, sheet.id, context)
+            self.check_employee_attendance_state(cr, uid, sheet.id, context=context)
             di = sheet.user_id.company_id.timesheet_max_difference
             if (abs(sheet.total_difference) < di) or not di:
                 wf_service = netsvc.LocalService("workflow")
@@ -276,12 +362,12 @@ class hr_timesheet_sheet(osv.osv):
                 \n* The \'Confirmed\' state is used for to confirm the timesheet by user. \
                 \n* The \'Done\' state is used when users timesheet is accepted by his/her senior.'),
         'state_attendance' : fields.related('employee_id', 'state', type='selection', selection=[('absent', 'Absent'), ('present', 'Present')], string='Current Status', readonly=True),
-        'total_attendance_day': fields.function(_total_day, string='Total Attendance', multi="_total_day"),
-        'total_timesheet_day': fields.function(_total_day, string='Total Timesheet', multi="_total_day"),
-        'total_difference_day': fields.function(_total_day, string='Difference', multi="_total_day"),
-        'total_attendance': fields.function(_total, string='Total Attendance', multi="_total_sheet"),
-        'total_timesheet': fields.function(_total, string='Total Timesheet', multi="_total_sheet"),
-        'total_difference': fields.function(_total, string='Difference', multi="_total_sheet"),
+        'total_attendance_day': fields.function(_total, method=True, string='Total Attendance', multi="_total"),
+        'total_timesheet_day': fields.function(_total, method=True, string='Total Timesheet', multi="_total"),
+        'total_difference_day': fields.function(_total, method=True, string='Difference', multi="_total"),
+        'total_attendance': fields.function(_total, method=True, string='Total Attendance', multi="_total"),
+        'total_timesheet': fields.function(_total, method=True, string='Total Timesheet', multi="_total"),
+        'total_difference': fields.function(_total, method=True, string='Difference', multi="_total"),
         'period_ids': fields.one2many('hr_timesheet_sheet.sheet.day', 'sheet_id', 'Period', readonly=True),
         'account_ids': fields.one2many('hr_timesheet_sheet.sheet.account', 'sheet_id', 'Analytic accounts', readonly=True),
         'company_id': fields.many2one('res.company', 'Company'),
@@ -392,85 +478,47 @@ class hr_timesheet_line(osv.osv):
 
     def _sheet(self, cursor, user, ids, name, args, context=None):
         sheet_obj = self.pool.get('hr_timesheet_sheet.sheet')
-        cursor.execute('SELECT l.id, COALESCE(MAX(s.id), 0) \
-                FROM hr_timesheet_sheet_sheet s \
-                    LEFT JOIN (hr_analytic_timesheet l \
-                        LEFT JOIN account_analytic_line al \
-                            ON (l.line_id = al.id)) \
-                        ON (s.date_to >= al.date \
-                            AND s.date_from <= al.date \
-                            AND s.user_id = al.user_id) \
-                WHERE l.id IN %s GROUP BY l.id',(tuple(ids),))
-        res = dict(cursor.fetchall())
-        sheet_names = {}
-        for sheet_id, name in sheet_obj.name_get(cursor, user, res.values(),
-                context=context):
-            sheet_names[sheet_id] = name
-
-        for line_id in {}.fromkeys(ids):
-            sheet_id = res.get(line_id, False)
-            if sheet_id:
-                res[line_id] = (sheet_id, sheet_names[sheet_id])
-            else:
-                res[line_id] = False
+        res = {}.fromkeys(ids, False)
+        for ts_line in self.browse(cursor, user, ids, context=context):
+            sheet_ids = sheet_obj.search(cursor, user,
+                [('date_to', '>=', ts_line.date), ('date_from', '<=', ts_line.date),
+                 ('employee_id.user_id', '=', ts_line.user_id.id)],
+                context=context)
+            if sheet_ids:
+            # [0] because only one sheet possible for an employee between 2 dates
+                res[ts_line.id] = sheet_obj.name_get(cursor, user, sheet_ids, context=context)[0]
         return res
 
-    def _sheet_search(self, cursor, user, obj, name, args, context=None):
-        if not len(args):
-            return []
-        sheet_obj = self.pool.get('hr_timesheet_sheet.sheet')
-
-        i = 0
-        while i < len(args):
-            fargs = args[i][0].split('.', 1)
-            if len(fargs) > 1:
-                args[i] = (fargs[0], 'in', sheet_obj.search(cursor, user,
-                    [(fargs[1], args[i][1], args[i][2])], context=context))
-                i += 1
-                continue
-            if isinstance(args[i][2], basestring):
-                res_ids = sheet_obj.name_search(cursor, user, args[i][2], [],
-                        args[i][1])
-                args[i] = (args[i][0], 'in', [x[0] for x in res_ids])
-            i += 1
-        qu1, qu2 = [], []
-        for x in args:
-            if x[1] != 'in':
-                if (x[2] is False) and (x[1] == '='):
-                    qu1.append('(s.id IS NULL)')
-                elif (x[2] is False) and (x[1] == '<>' or x[1] == '!='):
-                    qu1.append('(s.id IS NOT NULL)')
-                else:
-                    qu1.append('(s.id %s %s)' % (x[1], '%s'))
-                    qu2.append(x[2])
-            elif x[1] == 'in':
-                if len(x[2]) > 0:
-                    qu1.append('(s.id in (%s))' % (','.join(['%d'] * len(x[2]))))
-                    qu2 += x[2]
-                else:
-                    qu1.append('(False)')
-        if len(qu1):
-            qu1 = ' WHERE ' + ' AND '.join(qu1)
-        else:
-            qu1 = ''
-        cursor.execute('SELECT l.id \
-                FROM hr_timesheet_sheet_sheet s \
-                    LEFT JOIN (hr_analytic_timesheet l \
-                        LEFT JOIN account_analytic_line al \
-                            ON (l.line_id = al.id)) \
-                        ON (s.date_to >= al.date \
-                            AND s.date_from <= al.date \
-                            AND s.user_id = al.user_id)' + \
-                qu1, qu2)
-        res = cursor.fetchall()
-        if not len(res):
-            return [('id', '=', '0')]
-        return [('id', 'in', [x[0] for x in res])]
+    def _get_hr_timesheet_sheet(self, cr, uid, ids, context=None):
+        ts_line_ids = []
+        for ts in self.browse(cr, uid, ids, context=context):
+            cr.execute("""
+                    SELECT l.id
+                        FROM hr_analytic_timesheet l
+                    INNER JOIN account_analytic_line al
+                        ON (l.line_id = al.id)
+                    WHERE %(date_to)s >= al.date
+                        AND %(date_from)s <= al.date
+                        AND %(user_id)s = al.user_id
+                    GROUP BY l.id""", {'date_from': ts.date_from,
+                                        'date_to': ts.date_to,
+                                        'user_id': ts.employee_id.user_id.id,})
+            ts_line_ids.extend([row[0] for row in cr.fetchall()])
+        return ts_line_ids
+
+    def _get_account_analytic_line(self, cr, uid, ids, context=None):
+        ts_line_ids = self.pool.get('hr.analytic.timesheet').search(cr, uid, [('line_id', 'in', ids)])
+        return ts_line_ids
 
     _columns = {
         'sheet_id': fields.function(_sheet, string='Sheet',
             type='many2one', relation='hr_timesheet_sheet.sheet',
-            fnct_search=_sheet_search),
+            store={
+                    'hr_timesheet_sheet.sheet': (_get_hr_timesheet_sheet, ['employee_id', 'date_from', 'date_to'], 10),
+                    'account.analytic.line': (_get_account_analytic_line, ['user_id', 'date'], 10),
+                    'hr.analytic.timesheet': (lambda self,cr,uid,ids,context=None: ids, ['line_id'], 10),
+                  },
+            ),
     }
     _defaults = {
         'date': _get_default_date,
@@ -512,90 +560,47 @@ class hr_attendance(osv.osv):
             return context['name'] + time.strftime(' %H:%M:%S')
         return time.strftime('%Y-%m-%d %H:%M:%S')
 
+    def _get_hr_timesheet_sheet(self, cr, uid, ids, context=None):
+        attendance_ids = []
+        for ts in self.browse(cr, uid, ids, context=context):
+            cr.execute("""
+                        SELECT a.id
+                          FROM hr_attendance a
+                         INNER JOIN hr_employee e
+                               INNER JOIN resource_resource r
+                                       ON (e.resource_id = r.id)
+                            ON (a.employee_id = e.id)
+                        WHERE %(date_to)s >= date_trunc('day', a.name)
+                              AND %(date_from)s <= a.name
+                              AND %(user_id)s = r.user_id
+                         GROUP BY a.id""", {'date_from': ts.date_from,
+                                            'date_to': ts.date_to,
+                                            'user_id': ts.employee_id.user_id.id,})
+            attendance_ids.extend([row[0] for row in cr.fetchall()])
+        return attendance_ids
+
     def _sheet(self, cursor, user, ids, name, args, context=None):
         sheet_obj = self.pool.get('hr_timesheet_sheet.sheet')
-        cursor.execute("SELECT a.id, COALESCE(MAX(s.id), 0) \
-                FROM hr_timesheet_sheet_sheet s \
-                    LEFT JOIN (hr_attendance a \
-                        LEFT JOIN hr_employee e \
-                            LEFT JOIN resource_resource r \
-                                ON (e.resource_id = r.id) \
-                            ON (a.employee_id = e.id)) \
-                        ON (s.date_to >= date_trunc('day',a.name) \
-                            AND s.date_from <= a.name \
-                            AND s.user_id = r.user_id) \
-                WHERE a.id IN %s GROUP BY a.id",(tuple(ids),))
-        res = dict(cursor.fetchall())
-        sheet_names = {}
-        for sheet_id, name in sheet_obj.name_get(cursor, user, res.values(),
-                context=context):
-            sheet_names[sheet_id] = name
-        for line_id in {}.fromkeys(ids):
-            sheet_id = res.get(line_id, False)
-            if sheet_id:
-                res[line_id] = (sheet_id, sheet_names[sheet_id])
-            else:
-                res[line_id] = False
+        res = {}.fromkeys(ids, False)
+        for attendance in self.browse(cursor, user, ids, context=context):
+            date_to = datetime.strftime(datetime.strptime(attendance.name[0:10], '%Y-%m-%d'), '%Y-%m-%d %H:%M:%S')
+            sheet_ids = sheet_obj.search(cursor, user,
+                [('date_to', '>=', date_to), ('date_from', '<=', attendance.name),
+                 ('employee_id', '=', attendance.employee_id.id)],
+                context=context)
+            if sheet_ids:
+                # [0] because only one sheet possible for an employee between 2 dates
+                res[attendance.id] = sheet_obj.name_get(cursor, user, sheet_ids, context=context)[0]
         return res
 
-    def _sheet_search(self, cursor, user, obj, name, args, context=None):
-        if not len(args):
-            return []
-
-        sheet_obj = self.pool.get('hr_timesheet_sheet.sheet')
-        i = 0
-        while i < len(args):
-            fargs = args[i][0].split('.', 1)
-            if len(fargs) > 1:
-                args[i] = (fargs[0], 'in', sheet_obj.search(cursor, user,
-                    [(fargs[1], args[i][1], args[i][2])], context=context))
-                i += 1
-                continue
-            if isinstance(args[i][2], basestring):
-                res_ids = sheet_obj.name_search(cursor, user, args[i][2], [],
-                        args[i][1])
-                args[i] = (args[i][0], 'in', [x[0] for x in res_ids])
-            i += 1
-        qu1, qu2 = [], []
-        for x in args:
-            if x[1] != 'in':
-                if (x[2] is False) and (x[1] == '='):
-                    qu1.append('(s.id IS NULL)')
-                elif (x[2] is False) and (x[1] == '<>' or x[1] == '!='):
-                    qu1.append('(s.id IS NOT NULL)')
-                else:
-                    qu1.append('(s.id %s %s)' % (x[1], '%s'))
-                    qu2.append(x[2])
-            elif x[1] == 'in':
-                if len(x[2]) > 0:
-                    qu1.append('(s.id in (%s))' % (','.join(['%d'] * len(x[2]))))
-                    qu2 += x[2]
-                else:
-                    qu1.append('(False)')
-        if len(qu1):
-            qu1 = ' WHERE ' + ' AND '.join(qu1)
-        else:
-            qu1 = ''
-        cursor.execute('SELECT a.id\
-                FROM hr_timesheet_sheet_sheet s \
-                    LEFT JOIN (hr_attendance a \
-                        LEFT JOIN hr_employee e \
-                            ON (a.employee_id = e.id)) \
-                                LEFT JOIN resource_resource r \
-                                    ON (e.resource_id = r.id) \
-                        ON (s.date_to >= date_trunc(\'day\',a.name) \
-                            AND s.date_from <= a.name \
-                            AND s.user_id = r.user_id) ' + \
-                qu1, qu2)
-        res = cursor.fetchall()
-        if not len(res):
-            return [('id', '=', '0')]
-        return [('id', 'in', [x[0] for x in res])]
-
     _columns = {
         'sheet_id': fields.function(_sheet, string='Sheet',
             type='many2one', relation='hr_timesheet_sheet.sheet',
-            fnct_search=_sheet_search),
+            store={
+                      'hr_timesheet_sheet.sheet': (_get_hr_timesheet_sheet, ['employee_id', 'date_from', 'date_to'], 10),
+                      'hr.attendance': (lambda self,cr,uid,ids,context=None: ids, ['employee_id', 'name', 'day'], 10),
+                  },
+            )
     }
     _defaults = {
         'name': _get_default_date,
index dea111e..87128b8 100644 (file)
                 </field>
             </field>
         </record>
+
+        <record id="hr_timesheet_line_search" model="ir.ui.view">
+            <field name="name">hr.analytic.timesheet.search</field>
+            <field name="model">hr.analytic.timesheet</field>
+            <field name="type">form</field>
+            <field name="inherit_id" ref="hr_timesheet.hr_timesheet_line_search"/>
+            <field name="arch" type="xml">
+                <field name="date" position="after">
+                    <field name="sheet_id" select="1"/>
+                </field>
+            </field>
+        </record>
+
         <!--
             hr.attendance inheritancy
         -->
         </record>
 
         <act_window
-        context="{'search_default_sheet_id': [active_id], 'default_sheet_id': active_id}"
-        id="act_hr_timesheet_sheet_sheet_by_day"
+        context="{'search_default_sheet_id': [active_id]}"
+        id="act_hr_timesheet_sheet_sheet_by_account"
         name="Timesheet by Account"
         res_model="hr_timesheet_sheet.sheet.account"
         src_model="hr_timesheet_sheet.sheet"/>
 
         <act_window
-        context="{'search_default_sheet_id': [active_id], 'default_sheet_id': active_id}"
+        context="{'search_default_sheet_id': [active_id]}"
+        id="act_hr_timesheet_sheet_sheet_by_day"
+        name="Timesheet by Day"
+        res_model="hr_timesheet_sheet.sheet.day"
+        src_model="hr_timesheet_sheet.sheet"/>
+
+        <act_window
+        context="{'search_default_sheet_id': [active_id]}"
         id="act_hr_timesheet_sheet_sheet_2_hr_analytic_timesheet"
         name="Timesheet Lines"
         res_model="hr.analytic.timesheet"
 
 
         <act_window
-        context="{'search_default_sheet_id': [active_id], 'default_sheet_id': active_id}"
+        context="{'search_default_sheet_id': [active_id]}"
         id="act_hr_timesheet_sheet_sheet_2_hr_attendance"
         name="Attendances"
         res_model="hr.attendance"
                 </graph>
             </field>
         </record>
+
+        <record id="hr_timesheet_day_tree" model="ir.ui.view">
+            <field name="name">hr.timesheet.day.tree</field>
+            <field name="model">hr_timesheet_sheet.sheet.day</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <tree colors="blue:total_difference&lt;0.1;red:total_difference&gt;=0.1" string="Period">
+                    <field name="name"/>
+                    <field name="total_attendance" widget="float_time" sum="Total Attendances"/>
+                    <field name="total_timesheet" widget="float_time" sum="Total Timesheet"/>
+                    <field name="total_difference" widget="float_time" sum="Total Difference"/>
+                </tree>
+            </field>
+        </record>
+
   <!-- Timesheet Button on Employee Form -->
   <act_window
            context="{'search_default_employee_id': [active_id], 'default_employee_id': active_id}"
index f6d78dc..8363815 100644 (file)
@@ -2,6 +2,11 @@
   In order to test hr_timesheet_sheet module in OpenERP,
   I create Timesheet and check validation process done by manager.
 -
+  I set TimeSheet allowed difference for company
+-
+  !record {model: res.company, id: base.main_company}:
+    timesheet_max_difference: 1.00
+-
   I assign this product(Service on Timesheet) and journal(Timesheet Journal) to employee "Quentin Paolino"
 -
   !record {model: hr.employee, id: hr.employee_qdp}:
@@ -55,7 +60,7 @@
   !record {model: hr.attendance, id: hr_attendance_1}:
     action: sign_out
     employee_id: 'hr.employee_qdp'
-    name: !eval time.strftime('%Y-%m-%d')+' '+'%s:%s:%s' %(min(23,datetime.now().hour+2),min(59,datetime.now().minute+1),min(59,datetime.now().second+1))
+    name: !eval (datetime.now() + timedelta(hours=8.25)).strftime('%Y-%m-%d %H:%M:%S')
 -
   I create Timesheet Entry for time spend on today work.
 -
       - account_id: account.analytic_sednacom
         date: !eval time.strftime('%Y-%m-%d')
         name: 'Develop yaml for hr module'
-        unit_amount: 3.00
+        unit_amount: 6.00
         amount: -90.00
         product_id: product.product_consultant
         general_account_id: account.a_expense
-        user_id: base.user_root
         journal_id: hr_timesheet.analytic_journal
 -
   I confirm my Timesheet at end of period by click on "Confirm" button,
       - account_id: account.analytic_sednacom
         date: !eval time.strftime('%Y-%m-%d')
         name: 'Develop yaml for hr module'
-        unit_amount: 2.0
+        unit_amount: 2.00
         amount: -90.00
         product_id: product.product_consultant
         general_account_id: account.a_expense
-        user_id: base.user_root
         journal_id: hr_timesheet.analytic_journal
 -
   I tried again to confirm the timesheet after modification.
index ae41c7f..7cb23f5 100644 (file)
@@ -30,7 +30,6 @@
     date: !eval time.strftime('%Y-%m-%d')
     product: 'lunch_product_club1'
     price: 2.75
-    user_id: base.user_root
 
 - |
   I check that lunch order is on draft state after having created it.
@@ -69,7 +68,6 @@
     date: !eval "(datetime.now() + timedelta(2)).strftime('%Y-%m-%d')"
     product: 'lunch_product_club1'
     price: 2.75
-    user_id: base.user_root
 
 - |
   I confirm this order.open wizard and select "Employee Cashbox".
index c44459e..9ddd809 100644 (file)
         <field name="type">form</field>
         <field name="arch" type="xml">
             <form string="Activities">
-                <group colspan='2' col='2'>
-                    <separator string="Activity" colspan="4"/>
-                    <field name="name" select="1" colspan='4' />
+                <group colspan="2" col="2">
+                    <separator string="Activity" colspan="2"/>
+                    <field name="name" select="1"/>
                     <field name="signal" groups="base.group_extended"/>
                     <field name="start"/>
                     <field name="object_id" invisible="1"/>
                     <field name="campaign_id" invisible="1"/>
                 </group>
-                <group colspan='2' col='2'>
-                    <separator string="Cost / Revenue" colspan="4"/>
+                <group colspan="2" col="2">
+                    <separator string="Cost / Revenue" colspan="2"/>
                     <field name="variable_cost"/>
                     <field name="revenue"/>
                 </group>
                 <newline/>
-                <group colspan='4' col='2'>
+                <group colspan="4" col="4">
                     <separator string="Condition" colspan="4"/>
-                    <field name="condition" widget="char" colspan="2"/>
+                    <field name="condition" widget="char" colspan="4"/>
                     <field name="keep_if_condition_not_met"/>
                 </group>
-                <group colspan='4' col='4'>
+                <group colspan="4" col="4">
                     <separator string="Action" colspan="4"/>
                     <field name="type"/>
-                    <group colspan='2' col='1'>
+                    <group colspan="2" col="2">
                         <field name="email_template_id" attrs="{'required':[('type','=','email')], 'invisible':[('type','!=','email')]}"
                                context="{'default_model_id':object_id}" />
-                        <group attrs="{'invisible':[('type','!=','report')]}" >
-                            <field name="report_id" attrs="{'required':[('type','=','report')]}" context="{'object_id':object_id}"/>
-                            <field name="report_directory_id" attrs="{'required':[('type','=','report')]}" />
+                        <field name="server_action_id" attrs="{'required':[('type','=','action')],'invisible':[('type','!=','action')]}" domain="[('model_id','=',object_id)]"    />
+                        <group attrs="{ 'invisible':[('type','!=','report')]}">
+                            <field name="report_id" attrs="{'required':[('type','=','report')]}" context="{'object_id':object_id}"  />
+                            <field name="report_directory_id" attrs="{'required':[('type','=','report')]}"   />
                         </group>
-                        <field name="server_action_id" attrs="{'required':[('type','=','action')],'invisible':[('type','!=','action')]}" domain="[('model_id','=',object_id)]" />
                     </group>
                 </group>
                 <separator string="Transitions" colspan="4"/>
diff --git a/addons/plugin_thunderbird/i18n/ro.po b/addons/plugin_thunderbird/i18n/ro.po
new file mode 100644 (file)
index 0000000..67267b9
--- /dev/null
@@ -0,0 +1,158 @@
+# Romanian translation for openobject-addons
+# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-01-11 11:16+0000\n"
+"PO-Revision-Date: 2012-01-09 12:02+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Romanian <ro@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-01-10 05:22+0000\n"
+"X-Generator: Launchpad (build 14640)\n"
+
+#. module: thunderbird
+#: field:thunderbird.installer,plugin_file:0
+#: field:thunderbird.installer,thunderbird:0
+msgid "Thunderbird Plug-in"
+msgstr "Plug-in (Modul de extensie) Thunderbird"
+
+#. module: thunderbird
+#: help:thunderbird.installer,plugin_file:0
+msgid ""
+"Thunderbird plug-in file. Save as this file and install this plug-in in "
+"thunderbird."
+msgstr ""
+"Fisier de extensie Thunderbird. Salvează acest fisier si instalează această "
+"extensie in thunderbird."
+
+#. module: thunderbird
+#: help:thunderbird.installer,thunderbird:0
+msgid ""
+"Allows you to select an object that you would like to add to your email and "
+"its attachments."
+msgstr ""
+"Vă permite să selectati un obiect pe care doriti să il atasati la e-mail si "
+"atasamentele lui."
+
+#. module: thunderbird
+#: help:thunderbird.installer,pdf_file:0
+msgid "The documentation file :- how to install Thunderbird Plug-in."
+msgstr "Fisier de documentatie :- cum se instalează Extensia Thunderbird."
+
+#. module: thunderbird
+#: model:ir.model,name:thunderbird.model_email_server_tools
+msgid "Email Server Tools"
+msgstr "Unelte server email"
+
+#. module: thunderbird
+#: view:thunderbird.installer:0
+msgid "_Close"
+msgstr "_Închide"
+
+#. module: thunderbird
+#: field:thunderbird.installer,pdf_file:0
+msgid "Installation Manual"
+msgstr "Manual de instalare"
+
+#. module: thunderbird
+#: field:thunderbird.installer,description:0
+msgid "Description"
+msgstr "Descriere"
+
+#. module: thunderbird
+#: view:thunderbird.installer:0
+msgid "title"
+msgstr "titlu"
+
+#. module: thunderbird
+#: model:ir.ui.menu,name:thunderbird.menu_base_config_plugins_thunderbird
+#: view:thunderbird.installer:0
+msgid "Thunderbird Plug-In"
+msgstr "Extensie Plug-In Thunderbird"
+
+#. module: thunderbird
+#: view:thunderbird.installer:0
+msgid ""
+"This plug-in allows you to link your e-mail to OpenERP's documents. You can "
+"attach it to any existing one in OpenERP or create a new one."
+msgstr ""
+"Această extensie vă permite să vă conectati e-mail-urile la documentele "
+"OpenERP. Puteti să le atasati de orice document existent in OpenERP sau să "
+"creati unul nou."
+
+#. module: thunderbird
+#: model:ir.module.module,shortdesc:thunderbird.module_meta_information
+msgid "Thunderbird Interface"
+msgstr "Interfata Thunderbird"
+
+#. module: thunderbird
+#: model:ir.model,name:thunderbird.model_thunderbird_installer
+msgid "thunderbird.installer"
+msgstr "thunderbird.installer"
+
+#. module: thunderbird
+#: field:thunderbird.installer,name:0
+#: field:thunderbird.installer,pdf_name:0
+msgid "File name"
+msgstr "Numele fişierului"
+
+#. module: thunderbird
+#: view:thunderbird.installer:0
+msgid "Installation and Configuration Steps"
+msgstr "Pașii de instalare și configurare"
+
+#. module: thunderbird
+#: field:thunderbird.installer,progress:0
+msgid "Configuration Progress"
+msgstr "Progres configurare"
+
+#. module: thunderbird
+#: model:ir.actions.act_window,name:thunderbird.action_thunderbird_installer
+#: model:ir.actions.act_window,name:thunderbird.action_thunderbird_wizard
+#: view:thunderbird.installer:0
+msgid "Thunderbird Plug-In Configuration"
+msgstr "Configurarea extensiei Thunderbird"
+
+#. module: thunderbird
+#: model:ir.model,name:thunderbird.model_thunderbird_partner
+msgid "Thunderbid Plugin Tools"
+msgstr "Instrumente Extensie Thunderbird"
+
+#. module: thunderbird
+#: view:thunderbird.installer:0
+msgid "Configure"
+msgstr "Configurează"
+
+#. module: thunderbird
+#: view:thunderbird.installer:0
+msgid "Skip"
+msgstr "Omite"
+
+#. module: thunderbird
+#: field:thunderbird.installer,config_logo:0
+msgid "Image"
+msgstr "Imagine"
+
+#. module: thunderbird
+#: model:ir.module.module,description:thunderbird.module_meta_information
+msgid ""
+"\n"
+"      This module is required for the thuderbird plug-in to work\n"
+"      properly.\n"
+"      The Plugin allows you archive email and its attachments to the "
+"selected \n"
+"      OpenERP objects. You can select a partner, a task, a project, an "
+"analytical\n"
+"      account,or any other object and attach selected mail as eml file in \n"
+"      attachment of selected record. You can create Documents for crm Lead,\n"
+"      HR Applicant and project issue from selected mails.\n"
+"\n"
+"      "
+msgstr ""
index 5c5f0ba..f2e4d05 100644 (file)
@@ -76,7 +76,7 @@
     background: -moz-linear-gradient(#b2b3d7, #7f82ac);
     background: -webkit-gradient(linear, left top, left bottom, from(#b2b3d7), to(#7f82ac));
 }
-.point-of-sale #branding, .point-of-sale #steps, .point-of-sale #rightheader {
+.point-of-sale #branding, .point-of-sale #rightheader {
     float: left;
     overflow: hidden;
     height: 35px;
 }
 .point-of-sale #rightheader {
     float: none;
+    margin-left: 440px;
 }
 .point-of-sale #branding {
     border-right: 1px solid #373737;
-    text-align: center;
+    text-align: left;
+    width: 419px;
 }
 .point-of-sale #branding img {
     height: 32px;
     width: 116px;
-}
-.point-of-sale #steps {
-    padding: 10px 17px;
-    border-right: solid 1px #3b3b3b;
-    vertical-align: top;
-}
-.point-of-sale #steps label {
-    width: 80px;
-    color: #A5A5A5;
-    font-weight: bold;
-    border-color: #454545;
-    background-color: #454545;
-    background-image: none;
-    border-bottom: solid 1px #5c5c5c;
-    border-top: solid 1px #373737;
-    vertical-align: top;
-}
-.point-of-sale #steps label:first-child {
-    border-left: solid 1px #373737;
-}
-.point-of-sale #steps label:last-child {
-    border-right: solid 1px #373737;
-}
-.point-of-sale #steps span {
-    padding: 2px 6px;
-}
-.point-of-sale #steps img {
-    height: 32px;
-}
-.point-of-sale #steps .ui-button, .point-of-sale #steps .ui-button-text-only {
-    padding-top: 4px;
-    height: 26px;
-    margin: 0 -4px;
-}
+} 
 .point-of-sale #neworder-button {
     width: 32px;
     padding: 4px 10px;
        white-space: nowrap;
 }
 
+.pos-payment-buttons {
+    white-space: nowrap;
+}
+
 @media print {
     #oe_header, #oe_menu, .point-of-sale #topheader, .point-of-sale #leftpane {
         display: none;
index 133c646..b47ca2a 100644 (file)
@@ -709,7 +709,7 @@ openerp.point_of_sale = function(db) {
      It should be possible to go back to any step as long as step 3 hasn't been completed.
      Modifying an order after validation shouldn't be allowed.
      */
-    var StepsWidget = db.web.Widget.extend({
+    var StepSwitcher = db.web.Widget.extend({
         init: function(parent, options) {
             this._super(parent);
             this.shop = options.shop;
@@ -985,6 +985,10 @@ openerp.point_of_sale = function(db) {
         },
         start: function() {
             $('button#validate-order', this.$element).click(_.bind(this.validateCurrentOrder, this));
+            $('.oe-back-to-products', this.$element).click(_.bind(this.back, this));
+        },
+        back: function() {
+            this.shop.get('selectedOrder').set({"step": "products"});
         },
         validateCurrentOrder: function() {
             var callback, currentOrder;
@@ -1184,9 +1188,7 @@ openerp.point_of_sale = function(db) {
                 shop: this.shop,
             });
             this.receiptView.replace($('#receipt-screen'));
-            this.stepsView = new StepsWidget(null, {shop: this.shop});
-            this.stepsView.$element = $('#steps');
-            this.stepsView.start();
+            this.stepSwitcher = new StepSwitcher(this, {shop: this.shop});
             this.shop.bind('change:selectedOrder', this.changedSelectedOrder, this);
             this.changedSelectedOrder();
         },
@@ -1322,8 +1324,6 @@ openerp.point_of_sale = function(db) {
                 this.$element.find("#loggedas button").click(function() {
                     self.try_close();
                 });
-    
-                this.$element.find('#steps').buttonset();
 
                 pos.app = new App(self.$element);
                 $('.oe_toggle_secondary_menu').hide();
index 4728e72..8e065fe 100644 (file)
@@ -8,16 +8,6 @@
             <div id="branding">
                 <img src="/point_of_sale/static/src/img/logo.png" />
             </div>
-            <div id="steps">
-                <input type="radio" id="products-step-button" class="step-button" data-step='products' name="radio" checked="checked" />
-                <label for="products-step-button">Products</label>
-                <img src="/point_of_sale/static/src/img/steps-arrow.png" />
-                <input type="radio" id="payment-step-button" class="step-button" data-step='payment' name="radio" />
-                <label for="payment-step-button">Payment</label>
-                <img src="/point_of_sale/static/src/img/steps-arrow.png" />
-                <input type="radio" id="receipt-step-button" class="step-button" data-step='receipt' name="radio" />
-                <label for="receipt-step-button">Receipt</label>
-            </div>
             <div id="loggedas">
                 <span class="oe_pos_synch-notification"></span>
                 <button>Close</button>
                             </table>
                         </div>
                         <div class="pos-payment-buttons">
+                            <button class="oe-back-to-products">
+                                <img src="/web/static/src/img/icons/gtk-go-back.png"></img>
+                                Back to Products</button>
                             <button id="validate-order">
                                 <img src="/web/static/src/img/icons/gtk-apply.png"></img>
                                 Validate</button>
index 1577ddd..2f4070d 100644 (file)
@@ -103,8 +103,8 @@ sale_order_line()
 class account_invoice_line(osv.osv):
     _inherit = "account.invoice.line"
 
-    def product_id_change(self, cr, uid, ids, product, uom, qty=0, name='', type='out_invoice', partner_id=False, fposition_id=False, price_unit=False, address_invoice_id=False, currency_id=False, context=None):
-        res = super(account_invoice_line, self).product_id_change(cr, uid, ids, product, uom, qty, name, type, partner_id, fposition_id, price_unit, address_invoice_id, currency_id, context=context)
+    def product_id_change(self, cr, uid, ids, product, uom, qty=0, name='', type='out_invoice', partner_id=False, fposition_id=False, price_unit=False, address_invoice_id=False, currency_id=False, context=None, company_id=None):
+        res = super(account_invoice_line, self).product_id_change(cr, uid, ids, product, uom, qty, name, type, partner_id, fposition_id, price_unit, address_invoice_id, currency_id, context=context, company_id=company_id)
 
         def get_real_price(res_dict, product_id, qty, uom, pricelist):
             item_obj = self.pool.get('product.pricelist.item')
index 5dcfef1..aabea22 100644 (file)
@@ -522,13 +522,6 @@ class task(osv.osv):
             return {'value':{'partner_id':partner_id.id}}
         return {}
 
-    def _default_project(self, cr, uid, context=None):
-        if context is None:
-            context = {}
-        if 'project_id' in context and context['project_id']:
-            return int(context['project_id'])
-        return False
-
     def duplicate_task(self, cr, uid, map_ids, context=None):
         for new in map_ids.values():
             task = self.browse(cr, uid, new, context)
@@ -642,7 +635,6 @@ class task(osv.osv):
         'progress': 0,
         'sequence': 10,
         'active': True,
-        'project_id': _default_project,
         'user_id': lambda obj, cr, uid, context: uid,
         'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'project.task', context=c)
     }
index 1660ab7..c7bfa42 100644 (file)
@@ -7,14 +7,14 @@ msgstr ""
 "Project-Id-Version: OpenERP Server 6.0dev\n"
 "Report-Msgid-Bugs-To: support@openerp.com\n"
 "POT-Creation-Date: 2011-12-22 18:43+0000\n"
-"PO-Revision-Date: 2011-11-05 10:31+0000\n"
-"Last-Translator: Ahmad Khayyat <Unknown>\n"
+"PO-Revision-Date: 2012-01-09 21:43+0000\n"
+"Last-Translator: kifcaliph <Unknown>\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: 2011-12-23 06:46+0000\n"
-"X-Generator: Launchpad (build 14560)\n"
+"X-Launchpad-Export-Date: 2012-01-10 05:22+0000\n"
+"X-Generator: Launchpad (build 14640)\n"
 
 #. module: sale
 #: field:sale.config.picking_policy,timesheet:0
@@ -81,7 +81,7 @@ msgstr "تم تحويل العرض المالي '%s' إلى طلب مبيعات"
 #: code:addons/sale/wizard/sale_make_invoice.py:42
 #, python-format
 msgid "Warning !"
-msgstr ""
+msgstr "تحذير !"
 
 #. module: sale
 #: report:sale.order:0
@@ -1505,7 +1505,7 @@ msgstr ""
 #. module: sale
 #: field:sale.order,origin:0
 msgid "Source Document"
-msgstr "المستند المصدر"
+msgstr "مستند المصدر"
 
 #. module: sale
 #: view:sale.order.line:0
index af5cb90..4f430c0 100644 (file)
@@ -206,7 +206,7 @@ class sale_order(osv.osv):
             ('invoice_except', 'Invoice Exception'),
             ('done', 'Done'),
             ('cancel', 'Cancelled')
-            ], 'Order State', readonly=True, help="Givwizard = self.browse(cr, uid, ids)[0]es the state of the quotation or sales order. \nThe exception state is automatically set when a cancel operation occurs in the invoice validation (Invoice Exception) or in the picking list process (Shipping Exception). \nThe 'Waiting Schedule' state is set when the invoice is confirmed but waiting for the scheduler to run on the order date.", select=True),
+            ], 'Order State', readonly=True, help="Gives the state of the quotation or sales order. \nThe exception state is automatically set when a cancel operation occurs in the invoice validation (Invoice Exception) or in the picking list process (Shipping Exception). \nThe 'Waiting Schedule' state is set when the invoice is confirmed but waiting for the scheduler to run on the order date.", select=True),
         'date_order': fields.date('Date', required=True, readonly=True, select=True, states={'draft': [('readonly', False)]}),
         'create_date': fields.datetime('Creation Date', readonly=True, select=True, help="Date on which sales order is created."),
         'date_confirm': fields.date('Confirmation Date', readonly=True, select=True, help="Date on which sales order is confirmed."),
index cd9242c..36f024e 100644 (file)
@@ -2613,6 +2613,13 @@ class stock_inventory(osv.osv):
         'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock.inventory', context=c)
     }
 
+    def copy(self, cr, uid, id, default=None, context=None):
+        if default is None:
+            default = {}
+        default = default.copy()
+        default.update({'move_ids': [], 'date_done': False})
+        return super(stock_inventory, self).copy(cr, uid, id, default, context=context)
+
     def _inventory_line_hook(self, cr, uid, inventory_line, move_vals):
         """ Creates a stock move from an inventory line
         @param inventory_line:
index 2ba44fb..29f0170 100644 (file)
                     <field name="invoice_state"/>
                     <field name="stock_journal_id" groups="base.group_extended" widget="selection"/>
                     <field name="state"/>
-                    <button name="action_process" states="confirmed,assigned" groups="stock.group_stock_user" string="Process" type="object" icon="gtk-go-forward"/>
+                    <button name="action_process" states="assigned" groups="stock.group_stock_user" string="Process" type="object" icon="gtk-go-forward"/>
                 </tree>
             </field>
         </record>
diff --git a/addons/stock_planning/i18n/nl.po b/addons/stock_planning/i18n/nl.po
new file mode 100644 (file)
index 0000000..0f7f9a1
--- /dev/null
@@ -0,0 +1,1235 @@
+# Dutch translation for openobject-addons
+# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-12-22 18:46+0000\n"
+"PO-Revision-Date: 2012-01-09 12:40+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Dutch <nl@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-01-10 05:22+0000\n"
+"X-Generator: Launchpad (build 14640)\n"
+
+#. module: stock_planning
+#: code:addons/stock_planning/wizard/stock_planning_createlines.py:73
+#, python-format
+msgid ""
+"No forecasts for selected period or no products in selected category !"
+msgstr ""
+"Geen prognose voor de geselecteerde periode of geen producten in de "
+"geselecteerde catagorie!"
+
+#. module: stock_planning
+#: help:stock.planning,stock_only:0
+msgid ""
+"Check to calculate stock location of selected warehouse only. If not "
+"selected calculation is made for input, stock and output location of "
+"warehouse."
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,maximum_op:0
+msgid "Maximum Rule"
+msgstr "Maximum regel"
+
+#. module: stock_planning
+#: view:stock.planning:0
+#: view:stock.sale.forecast:0
+msgid "Group By..."
+msgstr "Groepeer op..."
+
+#. module: stock_planning
+#: help:stock.sale.forecast,product_amt:0
+msgid ""
+"Forecast value which will be converted to Product Quantity according to "
+"prices."
+msgstr ""
+"Prognose waarde welke geconverteeerd wordt naar productie hoeveelheid, "
+"oveenkomstig de prijzen."
+
+#. module: stock_planning
+#: code:addons/stock_planning/stock_planning.py:626
+#: code:addons/stock_planning/stock_planning.py:670
+#, python-format
+msgid "Incoming Left must be greater than 0 !"
+msgstr "Inkomend restant moet groter zijn dan o!"
+
+#. module: stock_planning
+#: help:stock.planning,outgoing_before:0
+msgid ""
+"Planned Out in periods before calculated. Between start date of current "
+"period and one day before start of calculated period."
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.sale.forecast.createlines,warehouse_id:0
+msgid ""
+"Warehouse which forecasts will concern. If during stock planning you will "
+"need sales forecast for all warehouses choose any warehouse now."
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,outgoing_left:0
+msgid "Expected Out"
+msgstr "Verwacht uit"
+
+#. module: stock_planning
+#: view:stock.sale.forecast:0
+msgid " "
+msgstr " "
+
+#. module: stock_planning
+#: field:stock.planning,incoming_left:0
+msgid "Incoming Left"
+msgstr "Inkoment restant"
+
+#. module: stock_planning
+#: view:stock.sale.forecast.createlines:0
+msgid "Create Forecasts Lines"
+msgstr "Maak prognose regels"
+
+#. module: stock_planning
+#: help:stock.planning,outgoing:0
+msgid "Quantity of all confirmed outgoing moves in calculated Period."
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.period.createlines:0
+msgid "Create Daily Periods"
+msgstr "Maak dagelijkse periodes"
+
+#. module: stock_planning
+#: view:stock.planning:0
+#: field:stock.planning,company_id:0
+#: field:stock.planning.createlines,company_id:0
+#: view:stock.sale.forecast:0
+#: field:stock.sale.forecast,company_id:0
+#: field:stock.sale.forecast.createlines,company_id:0
+msgid "Company"
+msgstr "Bedrijf"
+
+#. module: stock_planning
+#: help:stock.planning,warehouse_forecast:0
+msgid ""
+"All sales forecasts for selected Warehouse of selected Product during "
+"selected Period."
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.planning:0
+msgid "Minimum Stock Rule Indicators"
+msgstr "Minimum voorraad regels indicatoren"
+
+#. module: stock_planning
+#: help:stock.sale.forecast.createlines,period_id:0
+msgid "Period which forecasts will concern."
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,stock_only:0
+msgid "Stock Location Only"
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.planning,already_out:0
+msgid ""
+"Quantity which is already dispatched out of this warehouse in current period."
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,incoming:0
+msgid "Confirmed In"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.planning:0
+msgid "Current Period Situation"
+msgstr ""
+
+#. module: stock_planning
+#: model:ir.actions.act_window,help:stock_planning.action_stock_period_createlines_form
+msgid ""
+"This wizard helps with the creation of stock planning periods. These periods "
+"are independent of financial periods. If you need periods other than day-, "
+"week- or month-based, you may also add then manually."
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.period.createlines:0
+msgid "Create Monthly Periods"
+msgstr "Creëer maandelijkse Periodes"
+
+#. module: stock_planning
+#: model:ir.model,name:stock_planning.model_stock_period_createlines
+msgid "stock.period.createlines"
+msgstr "stock.period.createlines"
+
+#. module: stock_planning
+#: field:stock.planning,outgoing_before:0
+msgid "Planned Out Before"
+msgstr "Gepland uit voor"
+
+#. module: stock_planning
+#: field:stock.planning.createlines,forecasted_products:0
+msgid "All Products with Forecast"
+msgstr "Alle producten met prognose"
+
+#. module: stock_planning
+#: help:stock.planning,maximum_op:0
+msgid "Maximum quantity set in Minimum Stock Rules for this Warehouse"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.sale.forecast:0
+msgid "Periods :"
+msgstr "Periodes:"
+
+#. module: stock_planning
+#: help:stock.planning,procure_to_stock:0
+msgid ""
+"Check to make procurement to stock location of selected warehouse. If not "
+"selected procurement will be made into input location of warehouse."
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.planning,already_in:0
+msgid ""
+"Quantity which is already picked up to this warehouse in current period."
+msgstr ""
+
+#. module: stock_planning
+#: code:addons/stock_planning/wizard/stock_planning_forecast.py:60
+#, python-format
+msgid "No products in selected category !"
+msgstr "Geen producten in de geselecteerde catagorie!"
+
+#. module: stock_planning
+#: view:stock.sale.forecast:0
+msgid "Stock and Sales Forecast"
+msgstr "Voorraad en verkoop prognose"
+
+#. module: stock_planning
+#: model:ir.model,name:stock_planning.model_stock_sale_forecast
+msgid "stock.sale.forecast"
+msgstr "stock.sale.forecast"
+
+#. module: stock_planning
+#: field:stock.planning,to_procure:0
+msgid "Planned In"
+msgstr "Gepland In"
+
+#. module: stock_planning
+#: field:stock.planning,stock_simulation:0
+msgid "Stock Simulation"
+msgstr "Voorraad simulatie"
+
+#. module: stock_planning
+#: model:ir.model,name:stock_planning.model_stock_planning_createlines
+msgid "stock.planning.createlines"
+msgstr "stock.planning.createlines"
+
+#. module: stock_planning
+#: help:stock.planning,incoming_before:0
+msgid ""
+"Confirmed incoming in periods before calculated (Including Already In). "
+"Between start date of current period and one day before start of calculated "
+"period."
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.sale.forecast:0
+msgid "Search  Sales Forecast"
+msgstr "Zoek verkoop prognose"
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period5_per_user:0
+msgid "This User Period5"
+msgstr "Deze gebruiker periode5"
+
+#. module: stock_planning
+#: help:stock.planning,history:0
+msgid "History of procurement or internal supply of this planning line."
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.planning,company_forecast:0
+msgid ""
+"All sales forecasts for whole company (for all Warehouses) of selected "
+"Product during selected Period."
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period1_per_user:0
+msgid "This User Period1"
+msgstr "Deze gebruiker periode1"
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period3_per_user:0
+msgid "This User Period3"
+msgstr "Deze gebruiker periode3"
+
+#. module: stock_planning
+#: view:stock.planning:0
+msgid "Stock Planning"
+msgstr "Voorraadplanning"
+
+#. module: stock_planning
+#: field:stock.planning,minimum_op:0
+msgid "Minimum Rule"
+msgstr "Minimum regel"
+
+#. module: stock_planning
+#: view:stock.planning:0
+msgid "Procure Incoming Left"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.planning.createlines:0
+#: view:stock.sale.forecast.createlines:0
+msgid "Create"
+msgstr "Maken"
+
+#. module: stock_planning
+#: model:ir.actions.act_window,name:stock_planning.action_view_stock_planning_form
+#: model:ir.ui.menu,name:stock_planning.menu_stock_planning
+#: model:ir.ui.menu,name:stock_planning.menu_stock_planning_manual
+#: view:stock.planning:0
+msgid "Master Procurement Schedule"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,line_time:0
+msgid "Past/Future"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.period:0
+#: field:stock.period,state:0
+#: field:stock.planning,state:0
+#: field:stock.sale.forecast,state:0
+msgid "State"
+msgstr "Status"
+
+#. module: stock_planning
+#: help:stock.sale.forecast.createlines,product_categ_id:0
+msgid "Product Category of products which created forecasts will concern."
+msgstr ""
+
+#. module: stock_planning
+#: model:ir.model,name:stock_planning.model_stock_period
+msgid "stock period"
+msgstr "voorraad periode"
+
+#. module: stock_planning
+#: model:ir.model,name:stock_planning.model_stock_sale_forecast_createlines
+msgid "stock.sale.forecast.createlines"
+msgstr "stock.sale.forecast.createlines"
+
+#. module: stock_planning
+#: field:stock.planning,warehouse_id:0
+#: field:stock.planning.createlines,warehouse_id:0
+#: field:stock.sale.forecast,warehouse_id:0
+#: field:stock.sale.forecast.createlines,warehouse_id:0
+msgid "Warehouse"
+msgstr "Magazijn"
+
+#. module: stock_planning
+#: help:stock.planning,stock_simulation:0
+msgid ""
+"Stock simulation at the end of selected Period.\n"
+" For current period it is: \n"
+"Initial Stock - Already Out + Already In - Expected Out + Incoming Left.\n"
+"For periods ahead it is: \n"
+"Initial Stock - Planned Out Before + Incoming Before - Planned Out + Planned "
+"In."
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.sale.forecast,analyze_company:0
+msgid "Check this box to see the sales for whole company."
+msgstr "Vink dit aan om de verkopen van het gehele bedrijf te zien."
+
+#. module: stock_planning
+#: view:stock.sale.forecast:0
+msgid "Per Department :"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,incoming_before:0
+msgid "Incoming Before"
+msgstr "Inkomend voor"
+
+#. module: stock_planning
+#: code:addons/stock_planning/stock_planning.py:641
+#, python-format
+msgid ""
+" Procurement created by MPS for user: %s   Creation Date: %s                 "
+"                        \n"
+" For period: %s                                         \n"
+" according to state:                                         \n"
+" Warehouse Forecast: %s                                         \n"
+" Initial Stock: %s                                         \n"
+" Planned Out: %s    Planned In: %s                                         \n"
+" Already Out: %s    Already In: %s                                         \n"
+" Confirmed Out: %s    Confirmed In: %s                                       "
+"  \n"
+" Planned Out Before: %s    Confirmed In Before: %s                           "
+"              \n"
+" Expected Out: %s    Incoming Left: %s                                       "
+"  \n"
+" Stock Simulation: %s    Minimum stock: %s"
+msgstr ""
+
+#. module: stock_planning
+#: code:addons/stock_planning/stock_planning.py:626
+#: code:addons/stock_planning/stock_planning.py:670
+#: code:addons/stock_planning/stock_planning.py:672
+#: code:addons/stock_planning/stock_planning.py:674
+#: code:addons/stock_planning/wizard/stock_planning_createlines.py:73
+#: code:addons/stock_planning/wizard/stock_planning_forecast.py:60
+#, python-format
+msgid "Error !"
+msgstr "Fout !"
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_user_id:0
+msgid "This User"
+msgstr "Deze gebruiker"
+
+#. module: stock_planning
+#: view:stock.planning:0
+msgid "Forecasts"
+msgstr "Prognose"
+
+#. module: stock_planning
+#: view:stock.planning:0
+msgid "Supply from Another Warehouse"
+msgstr "Lever vanuit ander magazijn"
+
+#. module: stock_planning
+#: view:stock.planning:0
+msgid "Calculate Planning"
+msgstr "Bereken planning"
+
+#. module: stock_planning
+#: code:addons/stock_planning/stock_planning.py:146
+#, python-format
+msgid "Invalid action !"
+msgstr "Foutieve handeling!"
+
+#. module: stock_planning
+#: help:stock.planning,stock_start:0
+msgid "Stock quantity one day before current period."
+msgstr "Voorraad hoeveelheid 1 dag voor huidige periode."
+
+#. module: stock_planning
+#: view:stock.planning:0
+msgid "Procurement history"
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.planning,product_uom:0
+msgid ""
+"Unit of Measure used to show the quantities of stock calculation.You can use "
+"units from default category or from second category (UoS category)."
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.period.createlines:0
+msgid "Create Weekly Periods"
+msgstr "Maak wekelijkse periodes"
+
+#. module: stock_planning
+#: model:ir.actions.act_window,help:stock_planning.action_stock_period_form
+msgid ""
+"Stock periods are used for stock planning. Stock periods are independent of "
+"account periods. You can use wizard for creating periods and review them "
+"here."
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.planning:0
+msgid "Calculated Period Simulation"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.period.createlines:0
+msgid "Cancel"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period4_per_user:0
+msgid "This User Period4"
+msgstr "Deze gebruiker periode4"
+
+#. module: stock_planning
+#: view:stock.period:0
+msgid "Stock and Sales Period"
+msgstr "Voorraad en verkoop periode"
+
+#. module: stock_planning
+#: field:stock.planning,company_forecast:0
+msgid "Company Forecast"
+msgstr "Bedrijf prognose"
+
+#. module: stock_planning
+#: help:stock.planning,minimum_op:0
+msgid "Minimum quantity set in Minimum Stock Rules for this Warehouse"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.sale.forecast:0
+msgid "Per User :"
+msgstr "Per gebruiker:"
+
+#. module: stock_planning
+#: help:stock.planning.createlines,warehouse_id:0
+msgid "Warehouse which planning will concern."
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,user_id:0
+msgid "Created/Validated by"
+msgstr "Gemaakt/Gecontroleerd door"
+
+#. module: stock_planning
+#: field:stock.planning,warehouse_forecast:0
+msgid "Warehouse Forecast"
+msgstr ""
+
+#. module: stock_planning
+#: code:addons/stock_planning/stock_planning.py:674
+#, python-format
+msgid ""
+"You must specify a Source Warehouse different than calculated (destination) "
+"Warehouse !"
+msgstr ""
+
+#. module: stock_planning
+#: code:addons/stock_planning/stock_planning.py:146
+#, python-format
+msgid "Cannot delete a validated sales forecast!"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period5_per_company:0
+msgid "This Company Period5"
+msgstr "Dit bedrijf periode5"
+
+#. module: stock_planning
+#: field:stock.sale.forecast,product_uom:0
+msgid "Product UoM"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period1_per_company:0
+msgid "This Company Period1"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period2_per_company:0
+msgid "This Company Period2"
+msgstr "Dit bedrijf periode2"
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period3_per_company:0
+msgid "This Company Period3"
+msgstr "Dit bedrijf periode3"
+
+#. module: stock_planning
+#: field:stock.period,date_start:0
+#: field:stock.period.createlines,date_start:0
+msgid "Start Date"
+msgstr "Startdatum"
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period2_per_user:0
+msgid "This User Period2"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,confirmed_forecasts_only:0
+msgid "Validated Forecasts"
+msgstr "Bevestigde prognose"
+
+#. module: stock_planning
+#: help:stock.planning.createlines,product_categ_id:0
+msgid ""
+"Planning will be created for products from Product Category selected by this "
+"field. This field is ignored when you check \"All Forecasted Product\" box."
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,planned_outgoing:0
+msgid "Planned Out"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,product_qty:0
+msgid "Forecast Quantity"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.planning:0
+msgid "Forecast"
+msgstr "Prognose"
+
+#. module: stock_planning
+#: selection:stock.period,state:0
+#: selection:stock.planning,state:0
+#: selection:stock.sale.forecast,state:0
+msgid "Draft"
+msgstr "Concept"
+
+#. module: stock_planning
+#: view:stock.period:0
+msgid "Closed"
+msgstr "Gesloten"
+
+#. module: stock_planning
+#: view:stock.planning:0
+#: view:stock.sale.forecast:0
+msgid "Warehouse "
+msgstr "Magazijn "
+
+#. module: stock_planning
+#: help:stock.sale.forecast,product_uom:0
+msgid ""
+"Unit of Measure used to show the quantities of stock calculation.You can use "
+"units form default category or from second category (UoS category)."
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.planning:0
+msgid "Planning and Situation for Calculated Period"
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.planning,planned_outgoing:0
+msgid ""
+"Enter planned outgoing quantity from selected Warehouse during the selected "
+"Period of selected Product. To plan this value look at Confirmed Out or "
+"Sales Forecasts. This value should be equal or greater than Confirmed Out."
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.period:0
+msgid "Current Periods"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.planning:0
+msgid "Internal Supply"
+msgstr "Interne levering"
+
+#. module: stock_planning
+#: code:addons/stock_planning/stock_planning.py:724
+#, python-format
+msgid "%s Pick List %s (%s,  %s) %s %s \n"
+msgstr ""
+
+#. module: stock_planning
+#: model:ir.actions.act_window,name:stock_planning.action_stock_sale_forecast_createlines_form
+#: model:ir.ui.menu,name:stock_planning.menu_stock_sale_forecast_createlines
+msgid "Create Sales Forecasts"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period4_id:0
+msgid "Period4"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.period,name:0
+#: field:stock.period.createlines,name:0
+msgid "Period Name"
+msgstr "Periodenaam"
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period2_id:0
+msgid "Period2"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period3_id:0
+msgid "Period3"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period1_id:0
+msgid "Period1"
+msgstr ""
+
+#. module: stock_planning
+#: model:ir.actions.act_window,help:stock_planning.action_stock_planning_createlines_form
+msgid ""
+"This wizard helps create MPS planning lines for a given selected period and "
+"warehouse, so you don't have to create them one by one. The wizard doesn't "
+"duplicate lines if they already exist for this selection."
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,outgoing:0
+msgid "Confirmed Out"
+msgstr ""
+
+#. module: stock_planning
+#: model:ir.actions.act_window,name:stock_planning.action_stock_planning_createlines_form
+#: model:ir.ui.menu,name:stock_planning.menu_stock_planning_createlines
+#: view:stock.planning.createlines:0
+msgid "Create Stock Planning Lines"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.planning:0
+msgid "General Info"
+msgstr ""
+
+#. module: stock_planning
+#: model:ir.actions.act_window,name:stock_planning.action_view_stock_sale_forecast_form
+msgid "Sales Forecast"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period1_per_warehouse:0
+msgid "This Warehouse Period1"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.sale.forecast:0
+msgid "Sales history"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,supply_warehouse_id:0
+msgid "Source Warehouse"
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.sale.forecast,product_qty:0
+msgid "Forecast Product quantity."
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,stock_supply_location:0
+msgid "Stock Supply Location"
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.period.createlines,date_stop:0
+msgid "Ending date for planning period."
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.planning.createlines,forecasted_products:0
+msgid ""
+"Check this box to create planning for all products having any forecast for "
+"selected Warehouse and Period. Product Category field will be ignored."
+msgstr ""
+
+#. module: stock_planning
+#: code:addons/stock_planning/stock_planning.py:632
+#: code:addons/stock_planning/stock_planning.py:678
+#: code:addons/stock_planning/stock_planning.py:702
+#, python-format
+msgid "MPS(%s) %s"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,already_in:0
+msgid "Already In"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,product_uom_categ:0
+#: field:stock.planning,product_uos_categ:0
+#: field:stock.sale.forecast,product_uom_categ:0
+msgid "Product UoM Category"
+msgstr ""
+
+#. module: stock_planning
+#: model:ir.actions.act_window,help:stock_planning.action_view_stock_sale_forecast_form
+msgid ""
+"This quantity sales forecast is an indication for Stock Planner to make "
+"procurement manually or to complement automatic procurement. You can use "
+"manual procurement with this forecast when some periods are exceptional for "
+"usual minimum stock rules."
+msgstr ""
+
+#. module: stock_planning
+#: model:ir.actions.act_window,help:stock_planning.action_view_stock_planning_form
+msgid ""
+"The Master Procurement Schedule can be the main driver for warehouse "
+"replenishment, or can complement the automatic MRP scheduling (minimum stock "
+"rules, etc.).\n"
+"Each MPS line gives you a pre-computed overview of the incoming and outgoing "
+"quantities of a given product for a given Stock Period in a given Warehouse, "
+"based on the current and future stock levels,\n"
+"as well as the planned stock moves. The forecast quantities can be altered "
+"manually, and when satisfied with resulting (simulated) Stock quantity, you "
+"can trigger the procurement of what is missing to reach your desired "
+"quantities"
+msgstr ""
+
+#. module: stock_planning
+#: code:addons/stock_planning/stock_planning.py:685
+#, python-format
+msgid ""
+"Pick created from MPS by user: %s   Creation Date: %s                        "
+"             \n"
+"For period: %s   according to state:                                     \n"
+" Warehouse Forecast: %s                                     \n"
+" Initial Stock: %s                                     \n"
+" Planned Out: %s  Planned In: %s                                     \n"
+" Already Out: %s  Already In: %s                                     \n"
+" Confirmed Out: %s   Confirmed In: %s                                     \n"
+" Planned Out Before: %s   Confirmed In Before: %s                            "
+"         \n"
+" Expected Out: %s   Incoming Left: %s                                     \n"
+" Stock Simulation: %s   Minimum stock: %s "
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,period_id:0
+#: field:stock.planning.createlines,period_id:0
+#: field:stock.sale.forecast,period_id:0
+#: field:stock.sale.forecast.createlines,period_id:0
+msgid "Period"
+msgstr "Periode"
+
+#. module: stock_planning
+#: field:stock.sale.forecast,product_uos_categ:0
+msgid "Product UoS Category"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,active_uom:0
+#: field:stock.sale.forecast,active_uom:0
+msgid "Active UoM"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.planning:0
+msgid "Search Stock Planning"
+msgstr "Zoek voorraad planning"
+
+#. module: stock_planning
+#: field:stock.sale.forecast.createlines,copy_forecast:0
+msgid "Copy Last Forecast"
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.sale.forecast,product_id:0
+msgid "Shows which product this forecast concerns."
+msgstr ""
+
+#. module: stock_planning
+#: selection:stock.planning,state:0
+msgid "Done"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.period.createlines,period_ids:0
+msgid "Periods"
+msgstr ""
+
+#. module: stock_planning
+#: model:ir.ui.menu,name:stock_planning.menu_stock_period_creatlines
+msgid "Create Stock Periods"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.period:0
+#: selection:stock.period,state:0
+#: view:stock.planning.createlines:0
+#: view:stock.sale.forecast.createlines:0
+msgid "Close"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.sale.forecast:0
+#: selection:stock.sale.forecast,state:0
+msgid "Validated"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.period:0
+#: selection:stock.period,state:0
+msgid "Open"
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.sale.forecast.createlines,copy_forecast:0
+msgid "Copy quantities from last Stock and Sale Forecast."
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period1_per_dept:0
+msgid "This Dept Period1"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period3_per_dept:0
+msgid "This Dept Period3"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period2_per_dept:0
+msgid "This Dept Period2"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period5_per_dept:0
+msgid "This Dept Period5"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period4_per_dept:0
+msgid "This Dept Period4"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period2_per_warehouse:0
+msgid "This Warehouse Period2"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period3_per_warehouse:0
+msgid "This Warehouse Period3"
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.planning,stock_supply_location:0
+msgid ""
+"Check to supply from Stock location of Supply Warehouse. If not checked "
+"supply will be made from Output location of Supply Warehouse. Used in "
+"'Supply from Another Warehouse' with Supply Warehouse."
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,create_uid:0
+msgid "Responsible"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.sale.forecast:0
+msgid "Default UOM"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period4_per_warehouse:0
+msgid "This Warehouse Period4"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period5_per_warehouse:0
+msgid "This Warehouse Period5"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.period:0
+msgid "Current"
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.planning,supply_warehouse_id:0
+msgid ""
+"Warehouse used as source in supply pick move created by 'Supply from Another "
+"Warehouse'."
+msgstr ""
+
+#. module: stock_planning
+#: model:ir.model,name:stock_planning.model_stock_planning
+msgid "stock.planning"
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.sale.forecast,warehouse_id:0
+msgid ""
+"Shows which warehouse this forecast concerns. If during stock planning you "
+"will need sales forecast for all warehouses choose any warehouse now."
+msgstr ""
+
+#. module: stock_planning
+#: code:addons/stock_planning/stock_planning.py:661
+#, python-format
+msgid "%s Procurement (%s,  %s) %s %s \n"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyze_company:0
+msgid "Per Company"
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.planning,to_procure:0
+msgid ""
+"Enter quantity which (by your plan) should come in. Change this value and "
+"observe Stock simulation. This value should be equal or greater than "
+"Confirmed In."
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period4_per_company:0
+msgid "This Company Period4"
+msgstr "Dit bedrijf periode4"
+
+#. module: stock_planning
+#: help:stock.planning.createlines,period_id:0
+msgid "Period which planning will concern."
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,already_out:0
+msgid "Already Out"
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.planning,product_id:0
+msgid "Product which this planning is created for."
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.sale.forecast:0
+msgid "Per Warehouse :"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,history:0
+msgid "Procurement History"
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.period.createlines,date_start:0
+msgid "Starting date for planning period."
+msgstr ""
+
+#. module: stock_planning
+#: model:ir.actions.act_window,name:stock_planning.action_stock_period_createlines_form
+#: model:ir.actions.act_window,name:stock_planning.action_stock_period_form
+#: model:ir.ui.menu,name:stock_planning.menu_stock_period
+#: model:ir.ui.menu,name:stock_planning.menu_stock_period_main
+#: view:stock.period:0
+#: view:stock.period.createlines:0
+msgid "Stock Periods"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.planning:0
+msgid "Stock"
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.planning,incoming:0
+msgid "Quantity of all confirmed incoming moves in calculated Period."
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.period,date_stop:0
+#: field:stock.period.createlines,date_stop:0
+msgid "End Date"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.planning:0
+msgid "No Requisition"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,name:0
+msgid "Name"
+msgstr "Naam"
+
+#. module: stock_planning
+#: help:stock.sale.forecast,period_id:0
+msgid "Shows which period this forecast concerns."
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,product_uom:0
+msgid "UoM"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.period:0
+msgid "Closed Periods"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.planning:0
+#: field:stock.planning,product_id:0
+#: view:stock.sale.forecast:0
+#: field:stock.sale.forecast,product_id:0
+msgid "Product"
+msgstr ""
+
+#. module: stock_planning
+#: model:ir.ui.menu,name:stock_planning.menu_stock_sale_forecast
+#: model:ir.ui.menu,name:stock_planning.menu_stock_sale_forecast_all
+#: view:stock.sale.forecast:0
+msgid "Sales Forecasts"
+msgstr "Verkoop prognose"
+
+#. module: stock_planning
+#: field:stock.planning.createlines,product_categ_id:0
+#: field:stock.sale.forecast.createlines,product_categ_id:0
+msgid "Product Category"
+msgstr "Productcategorie"
+
+#. module: stock_planning
+#: code:addons/stock_planning/stock_planning.py:672
+#, python-format
+msgid "You must specify a Source Warehouse !"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,procure_to_stock:0
+msgid "Procure To Stock Location"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.sale.forecast:0
+msgid "Approve"
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.planning,period_id:0
+msgid ""
+"Period for this planning. Requisition will be created for beginning of the "
+"period."
+msgstr ""
+
+#. module: stock_planning
+#: code:addons/stock_planning/stock_planning.py:631
+#, python-format
+msgid "MPS planning for %s"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.planning,stock_start:0
+msgid "Initial Stock"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,product_amt:0
+msgid "Product Amount"
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.planning,confirmed_forecasts_only:0
+msgid ""
+"Check to take validated forecasts only. If not checked system takes "
+"validated and draft forecasts."
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_period5_id:0
+msgid "Period5"
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_warehouse_id:0
+msgid "This Warehouse"
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.sale.forecast,user_id:0
+msgid "Shows who created this forecast, or who validated."
+msgstr ""
+
+#. module: stock_planning
+#: field:stock.sale.forecast,analyzed_team_id:0
+msgid "Sales Team"
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.planning,incoming_left:0
+msgid ""
+"Quantity left to Planned incoming quantity. This is calculated difference "
+"between Planned In and Confirmed In. For current period Already In is also "
+"calculated. This value is used to create procurement for lacking quantity."
+msgstr ""
+
+#. module: stock_planning
+#: help:stock.planning,outgoing_left:0
+msgid ""
+"Quantity expected to go out in selected period besides Confirmed Out. As a "
+"difference between Planned Out and Confirmed Out. For current period Already "
+"Out is also calculated"
+msgstr ""
+
+#. module: stock_planning
+#: view:stock.sale.forecast:0
+msgid "Calculate Sales History"
+msgstr ""
+
+#. module: stock_planning
+#: model:ir.actions.act_window,help:stock_planning.action_stock_sale_forecast_createlines_form
+msgid ""
+"This wizard helps create many forecast lines at once. After creating them "
+"you only have to fill in the forecast quantities. The wizard doesn't "
+"duplicate the line when another one exist for the same selection."
+msgstr ""
+
+#~ msgid "This Copmany Period1"
+#~ msgstr "Dit bedrijf periode 1"
+
+#, python-format
+#~ msgid ""
+#~ "\n"
+#~ " Initial Stock: "
+#~ msgstr ""
+#~ "\n"
+#~ " Oorspronkelijke voorraaad: "
+
+#~ msgid "Create Stock and Sales Periods"
+#~ msgstr "Maak voorraad en verkoop periodes"
+
+#, python-format
+#~ msgid "    Confirmed In Before: "
+#~ msgstr "    Bevestigd in voor "
+
+#~ msgid "This Department"
+#~ msgstr "Deze afdeling"
+
+#, python-format
+#~ msgid "  Creation Date: "
+#~ msgstr "  Aanmaakdatum "
+
+#, python-format
+#~ msgid "Manual planning for "
+#~ msgstr "Handmatige planning voor "
+
+#, python-format
+#~ msgid ""
+#~ "\n"
+#~ " Confirmed Out: "
+#~ msgstr ""
+#~ "\n"
+#~ " Bevestigd Uit "
+
+#, python-format
+#~ msgid ""
+#~ "\n"
+#~ " Already Out: "
+#~ msgstr ""
+#~ "\n"
+#~ " Reeds uit: "
+
+#~ msgid "Create periods for Stock and Sales Planning"
+#~ msgstr "Maak periodes voor voorraad en verkoopplanning"
+
+#, python-format
+#~ msgid ""
+#~ "\n"
+#~ " Expected Out: "
+#~ msgstr ""
+#~ "\n"
+#~ " Verwacht Uit: "
diff --git a/addons/survey/i18n/ro.po b/addons/survey/i18n/ro.po
new file mode 100644 (file)
index 0000000..53d512c
--- /dev/null
@@ -0,0 +1,1796 @@
+# Romanian translation for openobject-addons
+# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-12-22 18:46+0000\n"
+"PO-Revision-Date: 2012-01-09 12:57+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Romanian <ro@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-01-10 05:22+0000\n"
+"X-Generator: Launchpad (build 14640)\n"
+
+#. module: survey
+#: view:survey.print:0
+#: view:survey.print.answer:0
+msgid "Print Option"
+msgstr "Opţiunea de imprimare"
+
+#. module: survey
+#: code:addons/survey/survey.py:418
+#, python-format
+msgid ""
+"Minimum Required Answer you                                     entered is "
+"greater than the number of answer.                                      "
+"Please use a number that is smaller than %d."
+msgstr ""
+"Răspunsul Minim Solicitat pe care l-ati introdus este mai mare decat numărul "
+"de răspunsuri. Vă rugăm să folositi un număr care este mai mic decat %d."
+
+#. module: survey
+#: view:survey.question.wiz:0
+msgid "Your Messages"
+msgstr "Mesajele dumneavoastră"
+
+#. module: survey
+#: field:survey.question,comment_valid_type:0
+#: field:survey.question,validation_type:0
+msgid "Text Validation"
+msgstr "Validare text"
+
+#. module: survey
+#: code:addons/survey/survey.py:430
+#, python-format
+msgid ""
+"Maximum Required Answer you                                     entered for "
+"your maximum is greater than the number of answer.                           "
+"           Please use a number that is smaller than %d."
+msgstr ""
+"Răspunsul Maxim Solicitat pe care l-ati introdus pentru maximul "
+"dumneavoastră este mai mare decat numărul răspunsurilor. Vă rugăm să "
+"folositi un număr care este mai mic decat %d."
+
+#. module: survey
+#: view:survey:0
+#: field:survey,invited_user_ids:0
+msgid "Invited User"
+msgstr "Utilizator invitat"
+
+#. module: survey
+#: selection:survey.answer,type:0
+msgid "Character"
+msgstr "Caracter"
+
+#. module: survey
+#: model:ir.actions.act_window,name:survey.action_survey_form1
+#: model:ir.ui.menu,name:survey.menu_print_survey_form
+#: model:ir.ui.menu,name:survey.menu_reporting
+#: model:ir.ui.menu,name:survey.menu_survey_form
+#: model:ir.ui.menu,name:survey.menu_surveys
+msgid "Surveys"
+msgstr "Sondaje"
+
+#. module: survey
+#: field:survey.question,in_visible_answer_type:0
+msgid "Is Answer Type Invisible?"
+msgstr "Este Tipul de Răspuns Invizibil?"
+
+#. module: survey
+#: view:survey:0
+#: view:survey.page:0
+#: view:survey.question:0
+#: view:survey.request:0
+msgid "Group By..."
+msgstr "Grupează după..."
+
+#. module: survey
+#: view:survey.send.invitation.log:0
+msgid "Results :"
+msgstr "Rezultate :"
+
+#. module: survey
+#: view:survey.request:0
+msgid "Survey Request"
+msgstr "Cererea pentru sondaj"
+
+#. module: survey
+#: selection:survey.question,required_type:0
+msgid "A Range"
+msgstr "O gamă"
+
+#. module: survey
+#: view:survey.response.line:0
+msgid "Table Answer"
+msgstr "Tabel răspuns"
+
+#. module: survey
+#: field:survey.history,date:0
+msgid "Date started"
+msgstr "Data de inceput"
+
+#. module: survey
+#: field:survey,history:0
+msgid "History Lines"
+msgstr "Istoricul liniilor"
+
+#. module: survey
+#: code:addons/survey/survey.py:444
+#, python-format
+msgid ""
+"You must enter one or more menu                                 choices in "
+"column heading (white spaces not allowed)"
+msgstr ""
+"Trebuie să introduceti una sau mai multe alegeri de meniu in titlul coloanei "
+"(spatiile albe nu sunt permise)"
+
+#. module: survey
+#: field:survey.question.column.heading,in_visible_menu_choice:0
+msgid "Is Menu Choice Invisible??"
+msgstr "Este Alegerea meniului Invizibilă?"
+
+#. module: survey
+#: field:survey.send.invitation,mail:0
+msgid "Body"
+msgstr "Corp"
+
+#. module: survey
+#: field:survey.question,allow_comment:0
+msgid "Allow Comment Field"
+msgstr "Permite Camp Comentarii"
+
+#. module: survey
+#: selection:survey.print,paper_size:0
+#: selection:survey.print.answer,paper_size:0
+msgid "A4 (210mm x 297mm)"
+msgstr "A4 (210mm x 297mm)"
+
+#. module: survey
+#: field:survey.question,comment_maximum_date:0
+#: field:survey.question,validation_maximum_date:0
+msgid "Maximum date"
+msgstr "Data maximă"
+
+#. module: survey
+#: field:survey.question,in_visible_menu_choice:0
+msgid "Is Menu Choice Invisible?"
+msgstr "Este Alegerea meniului Invizibilă?"
+
+#. module: survey
+#: view:survey:0
+msgid "Completed"
+msgstr "Finalizat"
+
+#. module: survey
+#: selection:survey.question,required_type:0
+msgid "Exactly"
+msgstr "Exact"
+
+#. module: survey
+#: view:survey:0
+msgid "Open Date"
+msgstr "Data deschiderii"
+
+#. module: survey
+#: view:survey.request:0
+msgid "Set to Draft"
+msgstr "Setează ca Ciornă"
+
+#. module: survey
+#: field:survey.question,is_comment_require:0
+msgid "Add Comment Field"
+msgstr "Adaugă Camp Comentarii"
+
+#. module: survey
+#: code:addons/survey/survey.py:397
+#, python-format
+msgid ""
+"#Required Answer you entered                                     is greater "
+"than the number of answer.                                     Please use a "
+"number that is smaller than %d."
+msgstr ""
+"#Răspunsul Solicitat pe care l-ati introdus este mai mare decat numărul "
+"răspunsurilor. Vă rugăm să folositi un număr care este mai mic decat %d."
+
+#. module: survey
+#: field:survey.question,tot_resp:0
+msgid "Total Answer"
+msgstr "Răspunsuri totale"
+
+#. module: survey
+#: field:survey.tbl.column.heading,name:0
+msgid "Row Number"
+msgstr "Număr rand"
+
+#. module: survey
+#: model:ir.model,name:survey.model_survey_name_wiz
+msgid "survey.name.wiz"
+msgstr "survey.name.wiz"
+
+#. module: survey
+#: model:ir.actions.act_window,name:survey.action_survey_question_form
+msgid "Survey Questions"
+msgstr "Intrebări sondaj"
+
+#. module: survey
+#: selection:survey.question,type:0
+msgid "Matrix of Choices (Only One Answers Per Row)"
+msgstr "Matrice de optiuni (un singur răspuns per rand)"
+
+#. module: survey
+#: code:addons/survey/survey.py:471
+#, python-format
+msgid ""
+"Maximum Required Answer you entered for your maximum is greater than the "
+"number of answer. Please use a number that is smaller than %d."
+msgstr ""
+"Răspunsul Maxim Solicitat pe care l-ati introdus pentru maxima dumneavoastră "
+"este mai mare decat numărul răspunsurilor. Vă rugăm să folositi un număr "
+"care este mai mic decat %d."
+
+#. module: survey
+#: model:ir.actions.act_window,name:survey.action_view_survey_question_message
+#: model:ir.model,name:survey.model_survey_question
+#: view:survey:0
+#: view:survey.page:0
+#: view:survey.question:0
+msgid "Survey Question"
+msgstr "Intrebare sondaj"
+
+#. module: survey
+#: view:survey.question.column.heading:0
+msgid "Use if question type is rating_scale"
+msgstr ""
+"Folositi dacă tipul intrebării este rating_scale (scară_de _clasificare)"
+
+#. module: survey
+#: field:survey.print,page_number:0
+#: field:survey.print.answer,page_number:0
+msgid "Include Page Number"
+msgstr "Include numărul de pagini"
+
+#. module: survey
+#: view:survey.page:0
+#: view:survey.question:0
+msgid "Ok"
+msgstr "Ok"
+
+#. module: survey
+#: field:survey.page,title:0
+msgid "Page Title"
+msgstr "Titlul paginii"
+
+#. module: survey
+#: model:ir.ui.menu,name:survey.menu_define_survey
+msgid "Define Surveys"
+msgstr "Defineste sondajele"
+
+#. module: survey
+#: model:ir.model,name:survey.model_survey_history
+msgid "Survey History"
+msgstr "Istoric Sondaj"
+
+#. module: survey
+#: field:survey.response.answer,comment:0
+#: field:survey.response.line,comment:0
+msgid "Notes"
+msgstr "Note"
+
+#. module: survey
+#: view:survey:0
+#: view:survey.request:0
+msgid "Search Survey"
+msgstr "Caută Sondaj"
+
+#. module: survey
+#: field:survey.response.answer,answer:0
+#: field:survey.tbl.column.heading,value:0
+msgid "Value"
+msgstr "Valoare"
+
+#. module: survey
+#: field:survey.question,column_heading_ids:0
+msgid " Column heading"
+msgstr " Titlul coloanei"
+
+#. module: survey
+#: model:ir.ui.menu,name:survey.menu_run_survey_form
+msgid "Answer a Survey"
+msgstr "Răspunde la un sondaj"
+
+#. module: survey
+#: code:addons/survey/wizard/survey_answer.py:86
+#, python-format
+msgid "Error!"
+msgstr "Eroare!"
+
+#. module: survey
+#: field:survey,tot_comp_survey:0
+msgid "Total Completed Survey"
+msgstr "Sondaj completat in intregime"
+
+#. module: survey
+#: view:survey.response.answer:0
+msgid "(Use Only Question Type is matrix_of_drop_down_menus)"
+msgstr ""
+"(Foloseste doar Tipul Intrebării este matrix_of_drop_down_menus) "
+"(matricea_meniurilor_verticale)"
+
+#. module: survey
+#: model:ir.actions.report.xml,name:survey.survey_analysis
+msgid "Survey Statistics"
+msgstr "Statistică sondaj"
+
+#. module: survey
+#: selection:survey,state:0
+#: view:survey.request:0
+#: selection:survey.request,state:0
+msgid "Cancelled"
+msgstr "Anulat(ă)"
+
+#. module: survey
+#: selection:survey.question,type:0
+msgid "Rating Scale"
+msgstr "Scară de clasificare"
+
+#. module: survey
+#: field:survey.question,comment_field_type:0
+msgid "Comment Field Type"
+msgstr "Tipul Campului pentru Comentarii"
+
+#. module: survey
+#: code:addons/survey/survey.py:371
+#: code:addons/survey/survey.py:383
+#: code:addons/survey/survey.py:397
+#: code:addons/survey/survey.py:402
+#: code:addons/survey/survey.py:412
+#: code:addons/survey/survey.py:418
+#: code:addons/survey/survey.py:424
+#: code:addons/survey/survey.py:430
+#: code:addons/survey/survey.py:434
+#: code:addons/survey/survey.py:440
+#: code:addons/survey/survey.py:444
+#: code:addons/survey/survey.py:454
+#: code:addons/survey/survey.py:458
+#: code:addons/survey/survey.py:463
+#: code:addons/survey/survey.py:469
+#: code:addons/survey/survey.py:471
+#: code:addons/survey/survey.py:473
+#: code:addons/survey/survey.py:478
+#: code:addons/survey/survey.py:480
+#: code:addons/survey/survey.py:643
+#: code:addons/survey/wizard/survey_answer.py:118
+#: code:addons/survey/wizard/survey_answer.py:125
+#: code:addons/survey/wizard/survey_answer.py:668
+#: code:addons/survey/wizard/survey_answer.py:707
+#: code:addons/survey/wizard/survey_answer.py:727
+#: code:addons/survey/wizard/survey_answer.py:756
+#: code:addons/survey/wizard/survey_answer.py:761
+#: code:addons/survey/wizard/survey_answer.py:769
+#: code:addons/survey/wizard/survey_answer.py:780
+#: code:addons/survey/wizard/survey_answer.py:789
+#: code:addons/survey/wizard/survey_answer.py:794
+#: code:addons/survey/wizard/survey_answer.py:868
+#: code:addons/survey/wizard/survey_answer.py:904
+#: code:addons/survey/wizard/survey_answer.py:922
+#: code:addons/survey/wizard/survey_answer.py:950
+#: code:addons/survey/wizard/survey_answer.py:953
+#: code:addons/survey/wizard/survey_answer.py:956
+#: code:addons/survey/wizard/survey_answer.py:968
+#: code:addons/survey/wizard/survey_answer.py:975
+#: code:addons/survey/wizard/survey_answer.py:978
+#: code:addons/survey/wizard/survey_selection.py:66
+#: code:addons/survey/wizard/survey_selection.py:69
+#: code:addons/survey/wizard/survey_send_invitation.py:74
+#, python-format
+msgid "Warning !"
+msgstr "Avertisment !"
+
+#. module: survey
+#: selection:survey.question,comment_field_type:0
+msgid "Single Line Of Text"
+msgstr "Linie unică a textului"
+
+#. module: survey
+#: view:survey.send.invitation:0
+#: field:survey.send.invitation,send_mail_existing:0
+msgid "Send reminder for existing user"
+msgstr "Trimite memento pentru utilizator existent"
+
+#. module: survey
+#: selection:survey.question,type:0
+msgid "Multiple Choice (Multiple Answer)"
+msgstr "Alegere multiplă (Răspuns multiplu)"
+
+#. module: survey
+#: view:survey:0
+msgid "Edit Survey"
+msgstr "Editează sondajul"
+
+#. module: survey
+#: view:survey.response.line:0
+msgid "Survey Answer Line"
+msgstr "Linie de răspuns sondaj"
+
+#. module: survey
+#: field:survey.question.column.heading,menu_choice:0
+msgid "Menu Choice"
+msgstr "Meniu optiuni"
+
+#. module: survey
+#: selection:survey.question,required_type:0
+msgid "At Most"
+msgstr "Cel mult"
+
+#. module: survey
+#: view:survey:0
+msgid "My Survey(s)"
+msgstr ""
+
+#. module: survey
+#: field:survey.question,is_validation_require:0
+msgid "Validate Text"
+msgstr "Validează text"
+
+#. module: survey
+#: view:survey.send.invitation:0
+msgid "_Cancel"
+msgstr ""
+
+#. module: survey
+#: field:survey.response.line,single_text:0
+msgid "Text"
+msgstr "Text"
+
+#. module: survey
+#: constraint:res.users:0
+msgid "The chosen company is not in the allowed companies for this user"
+msgstr ""
+"Compania aleasă nu se află printre companiile permise acestui utilizator"
+
+#. module: survey
+#: selection:survey.print,paper_size:0
+#: selection:survey.print.answer,paper_size:0
+msgid "Letter (8.5\" x 11\")"
+msgstr "Scrisoare (8.5\" x 11\")"
+
+#. module: survey
+#: view:survey:0
+#: field:survey,responsible_id:0
+msgid "Responsible"
+msgstr "Responsabil"
+
+#. module: survey
+#: model:ir.model,name:survey.model_survey_request
+msgid "survey.request"
+msgstr "survey.request (cerere.sondaj)"
+
+#. module: survey
+#: field:survey.send.invitation,mail_subject:0
+#: field:survey.send.invitation,mail_subject_existing:0
+msgid "Subject"
+msgstr "Subiect"
+
+#. module: survey
+#: field:survey.question,comment_maximum_float:0
+#: field:survey.question,validation_maximum_float:0
+msgid "Maximum decimal number"
+msgstr "Numărul maxim de zecimale"
+
+#. module: survey
+#: model:ir.model,name:survey.model_survey_tbl_column_heading
+msgid "survey.tbl.column.heading"
+msgstr "survey.tbl.column.heading (sondaj.titlu.coloană.tabel)"
+
+#. module: survey
+#: sql_constraint:res.users:0
+msgid "You can not have two users with the same login !"
+msgstr "Nu pot exista doi utilizatori cu acelasi nume de autentificare !"
+
+#. module: survey
+#: field:survey.send.invitation,mail_from:0
+msgid "From"
+msgstr "De la"
+
+#. module: survey
+#: selection:survey.question,comment_valid_type:0
+#: selection:survey.question,validation_type:0
+msgid "Don't Validate Comment Text."
+msgstr "Nu validati textul comentariului"
+
+#. module: survey
+#: selection:survey.question,comment_valid_type:0
+#: selection:survey.question,validation_type:0
+msgid "Must Be A Whole Number"
+msgstr "Trebuie să fie un număr intreg"
+
+#. module: survey
+#: field:survey.answer,question_id:0
+#: field:survey.page,question_ids:0
+#: field:survey.question,question:0
+#: field:survey.question.column.heading,question_id:0
+#: field:survey.response.line,question_id:0
+msgid "Question"
+msgstr "Întrebare"
+
+#. module: survey
+#: view:survey.page:0
+msgid "Search Survey Page"
+msgstr "Caută Pagina sondajului"
+
+#. module: survey
+#: field:survey.question.wiz,name:0
+msgid "Number"
+msgstr "Număr"
+
+#. module: survey
+#: code:addons/survey/survey.py:440
+#, python-format
+msgid ""
+"You must enter one or more menu choices                                 in "
+"column heading"
+msgstr ""
+"Trebuie să introduceti una sau mai multe optiuni meniu in titlul coloanei"
+
+#. module: survey
+#: model:ir.actions.act_window,help:survey.action_survey_form1
+msgid ""
+"You can create survey for different purposes: recruitment interviews, "
+"employee's periodical evaluations, marketing campaigns, etc. A survey is "
+"made of pages containing questions of several types: text, multiple choices, "
+"etc. You can edit survey manually or click on the 'Edit Survey' for a "
+"WYSIWYG interface."
+msgstr ""
+"Puteti crea sondaje pentru diverse scopuri: interviuri de recrutare, "
+"evaluările periodice ale angajatilor, campanii de marketing, etc. Un sondaj "
+"este alcătuit din pagini care contin intrebări de mai multe tipuri: text, "
+"alegeri multiple, etc. Puteti edita un sondaj manual sau puteti face click "
+"pe 'Editează Sondajul' pentru o interfată WYSIWYG."
+
+#. module: survey
+#: view:survey:0
+#: view:survey.request:0
+#: field:survey.request,state:0
+msgid "State"
+msgstr "Stare"
+
+#. module: survey
+#: view:survey.request:0
+msgid "Evaluation Plan Phase"
+msgstr "Etapa Planului de evaluare"
+
+#. module: survey
+#: view:survey:0
+#: view:survey.page:0
+#: view:survey.question:0
+msgid "Between"
+msgstr "Între"
+
+#. module: survey
+#: view:survey.print:0
+#: view:survey.print.answer:0
+#: view:survey.print.statistics:0
+msgid "Print"
+msgstr "Imprimă"
+
+#. module: survey
+#: view:survey:0
+msgid "New"
+msgstr ""
+
+#. module: survey
+#: field:survey.question,make_comment_field:0
+msgid "Make Comment Field an Answer Choice"
+msgstr "Face Campul Comentariu o Alegere de Răspuns"
+
+#. module: survey
+#: view:survey:0
+#: field:survey,type:0
+msgid "Type"
+msgstr "Tip"
+
+#. module: survey
+#: selection:survey.answer,type:0
+msgid "Email"
+msgstr "Email"
+
+#. module: survey
+#: model:ir.ui.menu,name:survey.menu_answer_surveys
+msgid "Answer Surveys"
+msgstr "Răspuns Sondaje"
+
+#. module: survey
+#: selection:survey.response,state:0
+msgid "Not Finished"
+msgstr "Neterminat"
+
+#. module: survey
+#: view:survey.print:0
+msgid "Survey Print"
+msgstr "Imprimare Sondaj"
+
+#. module: survey
+#: view:survey.send.invitation:0
+msgid "Select Partner"
+msgstr "Selectează Partenerul"
+
+#. module: survey
+#: field:survey.question,type:0
+msgid "Question Type"
+msgstr "Tipul intrebării"
+
+#. module: survey
+#: code:addons/survey/wizard/survey_answer.py:125
+#, python-format
+msgid "You can not answer this survey more than %s times"
+msgstr "Nu puteti răspunde la acest sondaj mai mult de %s ori"
+
+#. module: survey
+#: model:ir.actions.act_window,name:survey.act_survey_answer
+msgid "Answers"
+msgstr "Răspunsuri"
+
+#. module: survey
+#: code:addons/survey/wizard/survey_answer.py:118
+#, python-format
+msgid "You can not answer because the survey is not open"
+msgstr "Nu puteti răspunde pentru că sondajul nu este deschis"
+
+#. module: survey
+#: selection:survey.response,response_type:0
+msgid "Link"
+msgstr "Legătură"
+
+#. module: survey
+#: model:ir.actions.act_window,name:survey.action_survey_type_form
+#: model:ir.model,name:survey.model_survey_type
+#: view:survey.type:0
+msgid "Survey Type"
+msgstr "Tip de sondaj"
+
+#. module: survey
+#: field:survey.page,sequence:0
+msgid "Page Nr"
+msgstr "Număr pagină"
+
+#. module: survey
+#: view:survey:0
+#: view:survey.page:0
+#: view:survey.question:0
+#: field:survey.question,descriptive_text:0
+#: selection:survey.question,type:0
+msgid "Descriptive Text"
+msgstr "Text descriptiv"
+
+#. module: survey
+#: field:survey.question,minimum_req_ans:0
+msgid "Minimum Required Answer"
+msgstr "Răspuns Minim Solicitat"
+
+#. module: survey
+#: code:addons/survey/survey.py:480
+#, python-format
+msgid ""
+"You must enter one or more menu choices in column heading (white spaces not "
+"allowed)"
+msgstr ""
+"Trebuie să introduceti una sau mai multe alegeri de meniu in titlul coloanei "
+"(spatiile albe nu sunt permise)"
+
+#. module: survey
+#: field:survey.question,req_error_msg:0
+msgid "Error Message"
+msgstr "Mesaj Eroare"
+
+#. module: survey
+#: code:addons/survey/survey.py:478
+#, python-format
+msgid "You must enter one or more menu choices in column heading"
+msgstr ""
+"Trebuie să introduceti una sau mai multe optiuni de meniu in titlul coloanei"
+
+#. module: survey
+#: field:survey.request,date_deadline:0
+msgid "Deadline date"
+msgstr "Dată scadentă"
+
+#. module: survey
+#: selection:survey.question,comment_valid_type:0
+#: selection:survey.question,validation_type:0
+msgid "Must Be A Date"
+msgstr "Trebuie să fie o dată"
+
+#. module: survey
+#: model:ir.model,name:survey.model_survey_print
+msgid "survey.print"
+msgstr "survey.print (imprimare.sondaj)"
+
+#. module: survey
+#: view:survey.question.column.heading:0
+#: field:survey.question.column.heading,title:0
+msgid "Column Heading"
+msgstr "Titlul coloanei"
+
+#. module: survey
+#: field:survey.question,is_require_answer:0
+msgid "Require Answer to Question"
+msgstr "Solicită Răspuns la Intrebare"
+
+#. module: survey
+#: model:ir.actions.act_window,name:survey.action_survey_request_tree
+#: model:ir.ui.menu,name:survey.menu_survey_type_form1
+msgid "Survey Requests"
+msgstr "Cereri de sondaj"
+
+#. module: survey
+#: code:addons/survey/survey.py:371
+#: code:addons/survey/survey.py:458
+#, python-format
+msgid "You must enter one or more column heading."
+msgstr "Trebuie să introduceti una sau mai multe titluri de coloană."
+
+#. module: survey
+#: code:addons/survey/wizard/survey_answer.py:727
+#: code:addons/survey/wizard/survey_answer.py:922
+#, python-format
+msgid "Please enter an integer value"
+msgstr "Vă rugăm să introduceti o valoare intreagă"
+
+#. module: survey
+#: model:ir.model,name:survey.model_survey_browse_answer
+msgid "survey.browse.answer"
+msgstr "survey.browse.answer (răsfoieste.răspuns.sondaj)"
+
+#. module: survey
+#: selection:survey.question,comment_field_type:0
+msgid "Paragraph of Text"
+msgstr "Paragraf al textului"
+
+#. module: survey
+#: code:addons/survey/survey.py:424
+#, python-format
+msgid ""
+"Maximum Required Answer you                                     entered for "
+"your maximum is greater than the number of answer.                           "
+"          Please use a number that is smaller than %d."
+msgstr ""
+"Maximul de răspunsuri solicitate pe care l-ati introdus pentru maximul "
+"dumneavoastră este mai mare decat numărul răspunsurilor. Vă rugăm să "
+"folositi un număr care este mai mic decat %d."
+
+#. module: survey
+#: view:survey:0
+#: view:survey.page:0
+#: view:survey.question:0
+msgid "When the question is not answered, display this error message:"
+msgstr ""
+"Atunci cand nu se răspunde la o intrebare, afisează acest mesaj de eroare:"
+
+#. module: survey
+#: view:survey:0
+#: view:survey.page:0
+#: view:survey.question:0
+msgid "Options"
+msgstr "Opțiuni"
+
+#. module: survey
+#: view:survey.send.invitation.log:0
+msgid "_Ok"
+msgstr ""
+
+#. module: survey
+#: model:ir.ui.menu,name:survey.menu_browse_survey_response
+msgid "Browse Answers"
+msgstr "Rasfoieste Răspunsuri"
+
+#. module: survey
+#: field:survey.response.answer,comment_field:0
+#: view:survey.response.line:0
+msgid "Comment"
+msgstr "Comentariu"
+
+#. module: survey
+#: model:ir.model,name:survey.model_survey_answer
+#: model:ir.model,name:survey.model_survey_response_answer
+#: view:survey.answer:0
+#: view:survey.response:0
+#: view:survey.response.answer:0
+#: view:survey.response.line:0
+msgid "Survey Answer"
+msgstr "Răspuns la sondaj"
+
+#. module: survey
+#: selection:survey.answer,type:0
+msgid "Selection"
+msgstr "Selecție"
+
+#. module: survey
+#: model:ir.actions.act_window,name:survey.action_browse_survey_response
+#: view:survey:0
+msgid "Answer Survey"
+msgstr "Răspunde la sondaj"
+
+#. module: survey
+#: view:survey:0
+#: view:survey.page:0
+#: view:survey.question:0
+msgid "Comment Field"
+msgstr "Camp comentarii"
+
+#. module: survey
+#: selection:survey.response,response_type:0
+msgid "Manually"
+msgstr "Manual"
+
+#. module: survey
+#: view:survey.send.invitation:0
+msgid "_Send"
+msgstr ""
+
+#. module: survey
+#: help:survey,responsible_id:0
+msgid "User responsible for survey"
+msgstr "Utilizatorul responsabil cu sondajul"
+
+#. module: survey
+#: field:survey,page_ids:0
+#: view:survey.question:0
+#: field:survey.response.line,page_id:0
+msgid "Page"
+msgstr "Pagină"
+
+#. module: survey
+#: field:survey.question,comment_column:0
+msgid "Add comment column in matrix"
+msgstr "Adaugă in matrice coloana pentru comentarii"
+
+#. module: survey
+#: field:survey.answer,response:0
+msgid "#Answer"
+msgstr "# Răspuns"
+
+#. module: survey
+#: field:survey.print,without_pagebreak:0
+#: field:survey.print.answer,without_pagebreak:0
+msgid "Print Without Page Breaks"
+msgstr "Imprimă fără intreruperea paginilor"
+
+#. module: survey
+#: view:survey:0
+#: view:survey.page:0
+#: view:survey.question:0
+msgid "When the comment is an invalid format, display this error message"
+msgstr ""
+"Atunci cand comentariul are un format invalid, afisează acest mesaj de eroare"
+
+#. module: survey
+#: code:addons/survey/wizard/survey_selection.py:69
+#, python-format
+msgid ""
+"You can not give more response. Please contact the author of this survey for "
+"further assistance."
+msgstr ""
+"Nu mai puteti da răspunsuri. Vă rugăm să contactati autorul acestui sondaj "
+"pentru asistentă suplimentară."
+
+#. module: survey
+#: model:ir.actions.act_window,name:survey.act_survey_page_question
+#: model:ir.actions.act_window,name:survey.act_survey_question
+msgid "Questions"
+msgstr "Întrebări"
+
+#. module: survey
+#: help:survey,response_user:0
+msgid "Set to one if  you require only one Answer per user"
+msgstr "Setati pe unu dacă solicitati un singur Răspuns per utilizator"
+
+#. module: survey
+#: field:survey,users:0
+msgid "Users"
+msgstr "Utilizatori"
+
+#. module: survey
+#: view:survey.send.invitation:0
+msgid "Message"
+msgstr "Mesaj"
+
+#. module: survey
+#: view:survey:0
+#: view:survey.request:0
+msgid "MY"
+msgstr "Al meu"
+
+#. module: survey
+#: field:survey.question,maximum_req_ans:0
+msgid "Maximum Required Answer"
+msgstr "Răspunsuri maxime solicitate"
+
+#. module: survey
+#: field:survey.name.wiz,page_no:0
+msgid "Page Number"
+msgstr "Număr pagină"
+
+#. module: survey
+#: code:addons/survey/wizard/survey_answer.py:86
+#, python-format
+msgid "Cannot locate survey for the question wizard!"
+msgstr "Nu poate fi localizat sondajul pentru wizard-ul de intrebări!"
+
+#. module: survey
+#: view:survey:0
+#: view:survey.page:0
+#: view:survey.question:0
+msgid "and"
+msgstr "și"
+
+#. module: survey
+#: model:ir.actions.act_window,name:survey.action_view_survey_print_statistics
+#: view:survey.print.statistics:0
+msgid "Survey Print Statistics"
+msgstr "Statistică Imprimare Sondaj"
+
+#. module: survey
+#: field:survey.send.invitation.log,note:0
+msgid "Log"
+msgstr "Jurnal"
+
+#. module: survey
+#: view:survey:0
+#: view:survey.page:0
+#: view:survey.question:0
+msgid "When the choices do not add up correctly, display this error message"
+msgstr ""
+"Atunci cand optiunile nu se completează corect, afisează acest mesaj de "
+"eroare"
+
+#. module: survey
+#: field:survey,date_close:0
+msgid "Survey Close Date"
+msgstr "Data de incheiere a sondajului"
+
+#. module: survey
+#: field:survey,date_open:0
+msgid "Survey Open Date"
+msgstr "Data de incepere a sondajului"
+
+#. module: survey
+#: field:survey.question.column.heading,in_visible_rating_weight:0
+msgid "Is Rating Scale Invisible ??"
+msgstr "Este scara de clasificare invizibilă?"
+
+#. module: survey
+#: view:survey.browse.answer:0
+#: view:survey.name.wiz:0
+msgid "Start"
+msgstr "Începe"
+
+#. module: survey
+#: code:addons/survey/survey.py:473
+#, python-format
+msgid "Maximum Required Answer is greater than Minimum Required Answer"
+msgstr ""
+"Răspunsul Maxim Solicitat este mai mare decat Răspunsul Minim Solicitat"
+
+#. module: survey
+#: field:survey.question,comment_maximum_no:0
+#: field:survey.question,validation_maximum_no:0
+msgid "Maximum number"
+msgstr "Numărul maxim"
+
+#. module: survey
+#: selection:survey.request,state:0
+#: selection:survey.response.line,state:0
+msgid "Draft"
+msgstr "Ciornă"
+
+#. module: survey
+#: model:ir.model,name:survey.model_survey_print_statistics
+msgid "survey.print.statistics"
+msgstr "survey.print.statistics (statistică.imprimare.sondaj)"
+
+#. module: survey
+#: selection:survey,state:0
+msgid "Closed"
+msgstr "Închis"
+
+#. module: survey
+#: selection:survey.question,type:0
+msgid "Matrix of Drop-down Menus"
+msgstr "Matricea Meniurilor Verticale"
+
+#. module: survey
+#: view:survey:0
+#: field:survey.answer,answer:0
+#: field:survey.name.wiz,response:0
+#: view:survey.page:0
+#: view:survey.print.answer:0
+#: field:survey.print.answer,response_ids:0
+#: view:survey.question:0
+#: field:survey.question,answer_choice_ids:0
+#: field:survey.request,response:0
+#: field:survey.response,question_ids:0
+#: field:survey.response.answer,answer_id:0
+#: field:survey.response.answer,response_id:0
+#: view:survey.response.line:0
+#: field:survey.response.line,response_answer_ids:0
+#: field:survey.response.line,response_id:0
+#: field:survey.response.line,response_table_ids:0
+#: field:survey.send.invitation,partner_ids:0
+#: field:survey.tbl.column.heading,response_table_id:0
+msgid "Answer"
+msgstr "Răspuns"
+
+#. module: survey
+#: field:survey,max_response_limit:0
+msgid "Maximum Answer Limit"
+msgstr "Limita maximă Răspunsuri"
+
+#. module: survey
+#: model:ir.actions.act_window,name:survey.action_act_view_survey_send_invitation
+msgid "Send Invitations"
+msgstr "Trimite invitatiile"
+
+#. module: survey
+#: field:survey.name.wiz,store_ans:0
+msgid "Store Answer"
+msgstr "Stochează răspunsul"
+
+#. module: survey
+#: selection:survey.question,type:0
+msgid "Date and Time"
+msgstr "Data şi ora"
+
+#. module: survey
+#: field:survey,state:0
+#: field:survey.response,state:0
+#: field:survey.response.line,state:0
+msgid "Status"
+msgstr "Status"
+
+#. module: survey
+#: model:ir.actions.act_window,name:survey.action_view_survey_print
+msgid "Print Survey"
+msgstr "Imprimă sondajul"
+
+#. module: survey
+#: field:survey,send_response:0
+msgid "E-mail Notification on Answer"
+msgstr "Instiintare prin email asupra Răspunsului"
+
+#. module: survey
+#: field:survey.response.answer,value_choice:0
+msgid "Value Choice"
+msgstr "Alegere valoare"
+
+#. module: survey
+#: view:survey:0
+msgid "Started"
+msgstr "Început"
+
+#. module: survey
+#: model:ir.actions.act_window,name:survey.action_view_survey_print_answer
+#: view:survey:0
+#: view:survey.print.answer:0
+msgid "Print Answer"
+msgstr "Imprimă Răspunsul"
+
+#. module: survey
+#: selection:survey.question,type:0
+msgid "Multiple Textboxes"
+msgstr "Căsute de text multiple"
+
+#. module: survey
+#: selection:survey.print,orientation:0
+#: selection:survey.print.answer,orientation:0
+msgid "Landscape(Horizontal)"
+msgstr "Format (Orizontal)"
+
+#. module: survey
+#: field:survey.question,no_of_rows:0
+msgid "No of Rows"
+msgstr "Număr de randuri"
+
+#. module: survey
+#: view:survey:0
+#: view:survey.name.wiz:0
+msgid "Survey Details"
+msgstr "Detalii sondaj"
+
+#. module: survey
+#: selection:survey.question,type:0
+msgid "Multiple Textboxes With Different Type"
+msgstr "Căsute de text multiple cu Tip diferit"
+
+#. module: survey
+#: view:survey.question.column.heading:0
+msgid "Menu Choices (each choice on separate lines)"
+msgstr "Optiuni meniu (fiecare optiune pe o linie separată)"
+
+#. module: survey
+#: field:survey.response,response_type:0
+msgid "Answer Type"
+msgstr "Tip de răspuns"
+
+#. module: survey
+#: view:survey:0
+#: view:survey.page:0
+#: view:survey.question:0
+msgid "Validation"
+msgstr "Validare"
+
+#. module: survey
+#: view:survey.request:0
+#: selection:survey.request,state:0
+msgid "Waiting Answer"
+msgstr "In asteptarea răspunsului"
+
+#. module: survey
+#: selection:survey.question,comment_valid_type:0
+#: selection:survey.question,validation_type:0
+msgid "Must Be A Decimal Number"
+msgstr "Trebuie să fie un număr zecimal"
+
+#. module: survey
+#: field:res.users,survey_id:0
+msgid "Groups"
+msgstr "Grupuri"
+
+#. module: survey
+#: selection:survey.answer,type:0
+#: selection:survey.question,type:0
+msgid "Date"
+msgstr "Data"
+
+#. module: survey
+#: view:survey:0
+msgid "All New Survey"
+msgstr ""
+
+#. module: survey
+#: model:ir.model,name:survey.model_survey_send_invitation
+msgid "survey.send.invitation"
+msgstr "survey.send.invitation (trimite.invitatie.sondaj)"
+
+#. module: survey
+#: field:survey.history,user_id:0
+#: view:survey.request:0
+#: field:survey.request,user_id:0
+#: field:survey.response,user_id:0
+msgid "User"
+msgstr "Utilizator"
+
+#. module: survey
+#: field:survey.name.wiz,transfer:0
+msgid "Page Transfer"
+msgstr "Transfer pagină"
+
+#. module: survey
+#: selection:survey.response.line,state:0
+msgid "Skiped"
+msgstr "Omis"
+
+#. module: survey
+#: field:survey.print,paper_size:0
+#: field:survey.print.answer,paper_size:0
+msgid "Paper Size"
+msgstr "Dimensiune hârtie"
+
+#. module: survey
+#: field:survey.response.answer,column_id:0
+#: field:survey.tbl.column.heading,column_id:0
+msgid "Column"
+msgstr "Coloană"
+
+#. module: survey
+#: model:ir.model,name:survey.model_survey_response_line
+msgid "Survey Response Line"
+msgstr "Linie Răspuns la Sondaj"
+
+#. module: survey
+#: code:addons/survey/wizard/survey_selection.py:66
+#, python-format
+msgid "You can not give response for this survey more than %s times"
+msgstr "Nu puteti răspunde la acest sondaj mai mult de %s ori"
+
+#. module: survey
+#: model:ir.actions.report.xml,name:survey.report_survey_form
+#: model:ir.model,name:survey.model_survey
+#: view:survey:0
+#: view:survey.browse.answer:0
+#: field:survey.browse.answer,survey_id:0
+#: field:survey.history,survey_id:0
+#: view:survey.name.wiz:0
+#: field:survey.name.wiz,survey_id:0
+#: view:survey.page:0
+#: field:survey.page,survey_id:0
+#: view:survey.print:0
+#: field:survey.print,survey_ids:0
+#: field:survey.print.statistics,survey_ids:0
+#: field:survey.question,survey:0
+#: view:survey.request:0
+#: field:survey.request,survey_id:0
+#: field:survey.response,survey_id:0
+msgid "Survey"
+msgstr "Sondaj"
+
+#. module: survey
+#: field:survey.question,in_visible_rating_weight:0
+msgid "Is Rating Scale Invisible?"
+msgstr "Este scara de clasificare Invizibilă?"
+
+#. module: survey
+#: selection:survey.answer,type:0
+msgid "Integer"
+msgstr "Întreg"
+
+#. module: survey
+#: selection:survey.question,type:0
+msgid "Numerical Textboxes"
+msgstr "Căsute text numerice"
+
+#. module: survey
+#: model:ir.model,name:survey.model_survey_question_wiz
+msgid "survey.question.wiz"
+msgstr "survey.question.wiz (wizard.intrebări.sondaj)"
+
+#. module: survey
+#: view:survey:0
+msgid "History"
+msgstr "Istoric"
+
+#. module: survey
+#: view:survey.request:0
+msgid "Late"
+msgstr "Târziu"
+
+#. module: survey
+#: field:survey.type,code:0
+msgid "Code"
+msgstr "Cod"
+
+#. module: survey
+#: model:ir.ui.menu,name:survey.menu_print_survey_statistics
+msgid "Surveys Statistics"
+msgstr "Statistică Sondaj"
+
+#. module: survey
+#: field:survey.print,orientation:0
+#: field:survey.print.answer,orientation:0
+msgid "Orientation"
+msgstr "Orientare"
+
+#. module: survey
+#: view:survey:0
+#: view:survey.answer:0
+#: view:survey.page:0
+#: view:survey.question:0
+msgid "Seq"
+msgstr "Secventă"
+
+#. module: survey
+#: field:survey.request,email:0
+msgid "E-mail"
+msgstr "E-mail"
+
+#. module: survey
+#: field:survey.question,comment_minimum_no:0
+#: field:survey.question,validation_minimum_no:0
+msgid "Minimum number"
+msgstr "Numărul minim"
+
+#. module: survey
+#: field:survey.question,req_ans:0
+msgid "#Required Answer"
+msgstr "# Răspuns Solicitat"
+
+#. module: survey
+#: field:survey.answer,sequence:0
+#: field:survey.question,sequence:0
+msgid "Sequence"
+msgstr "Secvență"
+
+#. module: survey
+#: field:survey.question,comment_label:0
+msgid "Field Label"
+msgstr "Eticheta câmpului"
+
+#. module: survey
+#: view:survey:0
+msgid "Other"
+msgstr "Altele"
+
+#. module: survey
+#: view:survey.request:0
+#: selection:survey.request,state:0
+msgid "Done"
+msgstr "Efectuat"
+
+#. module: survey
+#: view:survey:0
+msgid "Test Survey"
+msgstr "Sondaj Text"
+
+#. module: survey
+#: field:survey.question,rating_allow_one_column_require:0
+msgid "Allow Only One Answer per Column (Forced Ranking)"
+msgstr "Permite un singur răspuns per coloană (Clasament fortat)"
+
+#. module: survey
+#: view:survey:0
+#: view:survey.browse.answer:0
+#: view:survey.name.wiz:0
+#: view:survey.print:0
+#: view:survey.print.answer:0
+#: view:survey.print.statistics:0
+msgid "Cancel"
+msgstr "Anulează"
+
+#. module: survey
+#: view:survey:0
+msgid "Close"
+msgstr "Închide"
+
+#. module: survey
+#: field:survey.question,comment_minimum_float:0
+#: field:survey.question,validation_minimum_float:0
+msgid "Minimum decimal number"
+msgstr "Număr zecimal minim"
+
+#. module: survey
+#: view:survey:0
+#: selection:survey,state:0
+msgid "Open"
+msgstr "Deschide"
+
+#. module: survey
+#: field:survey,tot_start_survey:0
+msgid "Total Started Survey"
+msgstr "Sondaj total inceput"
+
+#. module: survey
+#: code:addons/survey/survey.py:463
+#, python-format
+msgid ""
+"#Required Answer you entered is greater than the number of answer. Please "
+"use a number that is smaller than %d."
+msgstr ""
+"#Răspunsul Solicitat pe care l-ati introdus este mai mare decat numărul de "
+"răspunsuri. Vă rugăm să folositi un număr care este mai mic decat %d."
+
+#. module: survey
+#: help:survey,max_response_limit:0
+msgid "Set to one if survey is answerable only once"
+msgstr "Setati pe unu dacă la sondaj se răspunde o singură dată"
+
+#. module: survey
+#: selection:survey.response,state:0
+msgid "Finished "
+msgstr "Incheiat "
+
+#. module: survey
+#: model:ir.model,name:survey.model_survey_question_column_heading
+msgid "Survey Question Column Heading"
+msgstr "Intrebare Sondaj Titlu Coloană"
+
+#. module: survey
+#: field:survey.answer,average:0
+msgid "#Avg"
+msgstr "#Medie"
+
+#. module: survey
+#: selection:survey.question,type:0
+msgid "Matrix of Choices (Multiple Answers Per Row)"
+msgstr "Matricea optiunilor (Răspunsuri multiple per rand)"
+
+#. module: survey
+#: model:ir.actions.act_window,name:survey.action_view_survey_name
+msgid "Give Survey Answer"
+msgstr "Dă Răspuns la Sondaj"
+
+#. module: survey
+#: model:ir.model,name:survey.model_res_users
+msgid "res.users"
+msgstr "res.users (res.utilizatori)"
+
+#. module: survey
+#: help:survey.browse.answer,response_id:0
+msgid ""
+"If this field is empty, all answers of the selected survey will be print."
+msgstr ""
+"Dacă acest camp rămane necompletat, vor fi tipărite toate răspunsurile "
+"sondajului selectat."
+
+#. module: survey
+#: selection:survey.response.line,state:0
+msgid "Answered"
+msgstr "Răspuns"
+
+#. module: survey
+#: code:addons/survey/wizard/survey_answer.py:419
+#, python-format
+msgid "Complete Survey Answer"
+msgstr "Completează Răspuns la sondaj"
+
+#. module: survey
+#: selection:survey.question,type:0
+msgid "Comment/Essay Box"
+msgstr "Căsută Comentariu/Eseu"
+
+#. module: survey
+#: field:survey.answer,type:0
+msgid "Type of Answer"
+msgstr "Tipul de răspuns"
+
+#. module: survey
+#: field:survey.question,required_type:0
+msgid "Respondent must answer"
+msgstr "Respondentul trebuie să răspundă"
+
+#. module: survey
+#: model:ir.actions.act_window,name:survey.action_view_survey_send_invitation
+#: view:survey.send.invitation:0
+msgid "Send Invitation"
+msgstr "Trimite invitatie"
+
+#. module: survey
+#: code:addons/survey/wizard/survey_answer.py:761
+#, python-format
+msgid "You cannot select the same answer more than one time"
+msgstr "Nu puteti alege acelasi răspuns decat o dată"
+
+#. module: survey
+#: view:survey.question:0
+msgid "Search Question"
+msgstr "Caută Intrebare"
+
+#. module: survey
+#: field:survey,title:0
+msgid "Survey Title"
+msgstr "Titlu Sondaj"
+
+#. module: survey
+#: selection:survey.question,type:0
+msgid "Single Textbox"
+msgstr "Căsută text unică"
+
+#. module: survey
+#: view:survey:0
+#: field:survey,note:0
+#: field:survey.name.wiz,note:0
+#: view:survey.page:0
+#: field:survey.page,note:0
+#: view:survey.response.line:0
+msgid "Description"
+msgstr "Descriere"
+
+#. module: survey
+#: view:survey.name.wiz:0
+msgid "Select Survey"
+msgstr "Selectează sondaj"
+
+#. module: survey
+#: selection:survey.question,required_type:0
+msgid "At Least"
+msgstr "Cel puțin"
+
+#. module: survey
+#: model:ir.actions.act_window,name:survey.action_view_survey_send_invitation_log
+#: model:ir.model,name:survey.model_survey_send_invitation_log
+msgid "survey.send.invitation.log"
+msgstr "survey.send.invitation.log (jurnal.trimite.invitatie.sondaj)"
+
+#. module: survey
+#: selection:survey.print,orientation:0
+#: selection:survey.print.answer,orientation:0
+msgid "Portrait(Vertical)"
+msgstr "Portret (vertical)"
+
+#. module: survey
+#: selection:survey.question,comment_valid_type:0
+#: selection:survey.question,validation_type:0
+msgid "Must Be Specific Length"
+msgstr "Trebuie să aibă lungimea potrivită"
+
+#. module: survey
+#: view:survey:0
+#: view:survey.page:0
+#: field:survey.question,page_id:0
+msgid "Survey Page"
+msgstr "Pagină sondaj"
+
+#. module: survey
+#: view:survey:0
+#: view:survey.page:0
+#: view:survey.question:0
+msgid "Required Answer"
+msgstr "Răspuns necesar"
+
+#. module: survey
+#: code:addons/survey/survey.py:469
+#, python-format
+msgid ""
+"Minimum Required Answer you entered is greater than the number of answer. "
+"Please use a number that is smaller than %d."
+msgstr ""
+"Răspunsul minim necesar pe care l-ati introdus este mai mare decat numărul "
+"de răspunsuri. Vă rugăm să folositi un număr care este mai mic decat %d."
+
+#. module: survey
+#: code:addons/survey/survey.py:454
+#, python-format
+msgid "You must enter one or more answer."
+msgstr "Trebuie să introduceti unul sau mai multe răspunsuri."
+
+#. module: survey
+#: view:survey:0
+msgid "All Open Survey"
+msgstr ""
+
+#. module: survey
+#: model:ir.actions.report.xml,name:survey.survey_browse_response
+#: field:survey.browse.answer,response_id:0
+msgid "Survey Answers"
+msgstr "Răspunsuri la sondaj"
+
+#. module: survey
+#: view:survey.browse.answer:0
+msgid "Select Survey and related answer"
+msgstr "Selectează sondajul si răspunsurile asociate"
+
+#. module: survey
+#: model:ir.ui.menu,name:survey.menu_print_survey_answer
+msgid "Surveys Answers"
+msgstr "Răspunsuri la sondaje"
+
+#. module: survey
+#: model:ir.actions.act_window,name:survey.act_survey_pages
+msgid "Pages"
+msgstr "Pagini"
+
+#. module: survey
+#: code:addons/survey/survey.py:402
+#, python-format
+msgid ""
+"#Required Answer you entered is                                     greater "
+"than the number of answer.                                    Please use a "
+"number that is smaller than %d."
+msgstr ""
+"#Răspunsul solicitat pe care l-ati introdus este mai mare decat numărul de "
+"răspunsuri. Vă rugăm să folositi un număr care este mai mic decat %d."
+
+#. module: survey
+#: code:addons/survey/wizard/survey_answer.py:953
+#, python-format
+msgid "You cannot select same answer more than one time'"
+msgstr "Puteti selecta acelasi răspuns doar o singură dată."
+
+#. module: survey
+#: selection:survey.print,paper_size:0
+#: selection:survey.print.answer,paper_size:0
+msgid "Legal (8.5\" x 14\")"
+msgstr "Legal (8.5\" x 14\")"
+
+#. module: survey
+#: field:survey.type,name:0
+msgid "Name"
+msgstr "Nume"
+
+#. module: survey
+#: view:survey.page:0
+msgid "#Questions"
+msgstr "#Intrebări"
+
+#. module: survey
+#: model:ir.model,name:survey.model_survey_response
+msgid "survey.response"
+msgstr "survey.response (răspuns.sondaj)"
+
+#. module: survey
+#: field:survey.question,comment_valid_err_msg:0
+#: field:survey.question,make_comment_field_err_msg:0
+#: field:survey.question,numeric_required_sum_err_msg:0
+#: field:survey.question,validation_valid_err_msg:0
+msgid "Error message"
+msgstr "Mesaj de eroare"
+
+#. module: survey
+#: view:survey.send.invitation:0
+#: field:survey.send.invitation,send_mail:0
+msgid "Send mail for new user"
+msgstr "Trimite e-mail pentru noul utilizator"
+
+#. module: survey
+#: code:addons/survey/survey.py:383
+#, python-format
+msgid "You must enter one or more Answer."
+msgstr "Trebuie să introduceti unul sau mai multe Răspunsuri."
+
+#. module: survey
+#: code:addons/survey/survey.py:412
+#, python-format
+msgid ""
+"Minimum Required Answer                                     you entered is "
+"greater than the number of answer.                                    Please "
+"use a number that is smaller than %d."
+msgstr ""
+"Răspunsul minim solicitat pe care l-ati introdus este mai mare decăt numărul "
+"de răspunsuri. Vă rugăm să folositi un număr care este mai mic decat %d."
+
+#. module: survey
+#: field:survey.answer,menu_choice:0
+msgid "Menu Choices"
+msgstr "Meniu Optiuni"
+
+#. module: survey
+#: field:survey,id:0
+msgid "ID"
+msgstr ""
+
+#. module: survey
+#: code:addons/survey/survey.py:434
+#, python-format
+msgid ""
+"Maximum Required Answer is greater                                     than "
+"Minimum Required Answer"
+msgstr ""
+"Răspunsurile maxime solicitate sunt mai multe decat Răspunsurile minime "
+"solicitate"
+
+#. module: survey
+#: view:survey.send.invitation.log:0
+msgid "User creation"
+msgstr "Creare utilizator"
+
+#. module: survey
+#: selection:survey.question,required_type:0
+msgid "All"
+msgstr "Tot"
+
+#. module: survey
+#: selection:survey.question,comment_valid_type:0
+#: selection:survey.question,validation_type:0
+msgid "Must Be An Email Address"
+msgstr "Trebuie să fie o adresă de email"
+
+#. module: survey
+#: selection:survey.question,type:0
+msgid "Multiple Choice (Only One Answer)"
+msgstr "Alegere multiplă (un singur răspuns)"
+
+#. module: survey
+#: field:survey.answer,in_visible_answer_type:0
+msgid "Is Answer Type Invisible??"
+msgstr "Este Tipul de răspuns Invizibil?"
+
+#. module: survey
+#: model:ir.model,name:survey.model_survey_print_answer
+msgid "survey.print.answer"
+msgstr "survey.print.answer (imprimă.răspuns.sondaj)"
+
+#. module: survey
+#: view:survey.answer:0
+msgid "Menu Choices (each choice on separate by lines)"
+msgstr "Meniu Optiuni (fiecare optiune pe linii separate)"
+
+#. module: survey
+#: selection:survey.answer,type:0
+msgid "Float"
+msgstr "Stabilizare"
+
+#. module: survey
+#: view:survey.response.line:0
+msgid "Single Textboxes"
+msgstr "Căsute de text unice"
+
+#. module: survey
+#: code:addons/survey/wizard/survey_send_invitation.py:74
+#, python-format
+msgid "%sSurvey is not in open state"
+msgstr "%sSondajul nu se află in stare 'deschis'"
+
+#. module: survey
+#: field:survey.question.column.heading,rating_weight:0
+msgid "Weight"
+msgstr "Greutate"
+
+#. module: survey
+#: selection:survey.answer,type:0
+msgid "Date & Time"
+msgstr "Data și ora"
+
+#. module: survey
+#: field:survey.response,date_create:0
+#: field:survey.response.line,date_create:0
+msgid "Create Date"
+msgstr "Creează data"
+
+#. module: survey
+#: field:survey.question,column_name:0
+msgid "Column Name"
+msgstr "Nume coloană"
+
+#. module: survey
+#: model:ir.actions.act_window,name:survey.action_survey_page_form
+#: model:ir.model,name:survey.model_survey_page
+#: model:ir.ui.menu,name:survey.menu_survey_page_form1
+#: view:survey.page:0
+msgid "Survey Pages"
+msgstr "Pagini sondaj"
+
+#. module: survey
+#: field:survey.question,numeric_required_sum:0
+msgid "Sum of all choices"
+msgstr "Suma tuturor optiunilor"
+
+#. module: survey
+#: selection:survey.question,type:0
+#: view:survey.response.line:0
+msgid "Table"
+msgstr "Tabel"
+
+#. module: survey
+#: code:addons/survey/survey.py:643
+#, python-format
+msgid "You cannot duplicate the resource!"
+msgstr "Nu puteti copia resursa!"
+
+#. module: survey
+#: field:survey.question,comment_minimum_date:0
+#: field:survey.question,validation_minimum_date:0
+msgid "Minimum date"
+msgstr "Data minimă"
+
+#. module: survey
+#: field:survey,response_user:0
+msgid "Maximum Answer per User"
+msgstr "Răspunsuri maxime per Utilizator"
+
+#. module: survey
+#: field:survey.name.wiz,page:0
+msgid "Page Position"
+msgstr "Pozitia paginii"
+
+#~ msgid "Set to draft"
+#~ msgstr "Setează ca ciornă"
+
+#~ msgid "Send"
+#~ msgstr "Trimite"
+
+#~ msgid ""
+#~ "\n"
+#~ "    This module is used for surveying. It depends on the answers or reviews "
+#~ "of some questions by different users.\n"
+#~ "    A survey may have multiple pages. Each page may contain multiple "
+#~ "questions and each question may have multiple answers.\n"
+#~ "    Different users may give different answers of question and according to "
+#~ "that survey is done. \n"
+#~ "    Partners are also sent mails with user name and password for the "
+#~ "invitation of the survey\n"
+#~ "    "
+#~ msgstr ""
+#~ "\n"
+#~ "    Acest modul este folosit pentru efectuarea unui sondaj. Depinde de "
+#~ "răspunsurile sau de verificarea unor intrebări de către diferiti "
+#~ "utilizatori.\n"
+#~ "    Un sondaj poate avea mai multe pagini. Fiecare pagină poate contine mai "
+#~ "multe intrebări si fiecare intrebare poate avea răspunsuri multiple. \n"
+#~ "    Utilizatori diferiti pot da răspunsuri diferite la intrebări in functie "
+#~ "de sondaj. \n"
+#~ "    Partenerilor li se trimite se asemenea e-mail-uri cu numele de "
+#~ "utilizator si parola pentru invitarea la sondaj.\n"
+#~ "    "
+
+#~ msgid "Watting Answer"
+#~ msgstr "In asteptarea răspunsului"
+
+#~ msgid "Current"
+#~ msgstr "Curent"
+
+#~ msgid "Survey Module"
+#~ msgstr "Modul sondaj"
index 616a65e..86380e9 100644 (file)
@@ -391,6 +391,11 @@ class survey_question_wiz(osv.osv_memory):
                     survey_obj.write(cr, uid, survey_id, {'tot_comp_survey' : sur_rec.tot_comp_survey + 1})
                     sur_response_obj.write(cr, uid, [sur_name_read.response], {'state' : 'done'})
 
+                    # mark the survey request as done; call 'survey_req_done' on its actual model
+                    survey_req_obj = self.pool.get(context.get('active_model'))
+                    if survey_req_obj and hasattr(survey_req_obj, 'survey_req_done'):
+                        survey_req_obj.survey_req_done(cr, uid, context.get('active_ids', []), context=context)
+
                     if sur_rec.send_response:
                         survey_data = survey_obj.browse(cr, uid, survey_id)
                         response_id = surv_name_wiz.read(cr, uid, context.get('sur_name_id',False))['response']
diff --git a/addons/users_ldap/i18n/ro.po b/addons/users_ldap/i18n/ro.po
new file mode 100644 (file)
index 0000000..4808c7f
--- /dev/null
@@ -0,0 +1,180 @@
+# Romanian translation for openobject-addons
+# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2011-12-22 18:46+0000\n"
+"PO-Revision-Date: 2012-01-09 11:12+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Romanian <ro@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-01-10 05:22+0000\n"
+"X-Generator: Launchpad (build 14640)\n"
+
+#. module: users_ldap
+#: constraint:res.company:0
+msgid "Error! You can not create recursive companies."
+msgstr "Eroare! Nu puteti crea companii recursive."
+
+#. module: users_ldap
+#: constraint:res.users:0
+msgid "The chosen company is not in the allowed companies for this user"
+msgstr ""
+"Compania aleasă nu se află printre companiile permise acestui utilizator"
+
+#. module: users_ldap
+#: help:res.company.ldap,ldap_tls:0
+msgid ""
+"Request secure TLS/SSL encryption when connecting to the LDAP server. This "
+"option requires a server with STARTTLS enabled, otherwise all authentication "
+"attempts will fail."
+msgstr ""
+
+#. module: users_ldap
+#: view:res.company:0
+#: view:res.company.ldap:0
+msgid "LDAP Configuration"
+msgstr "Configurare LDAP"
+
+#. module: users_ldap
+#: field:res.company.ldap,ldap_binddn:0
+msgid "LDAP binddn"
+msgstr "LDAP sistem binddn"
+
+#. module: users_ldap
+#: help:res.company.ldap,create_user:0
+msgid "Create the user if not in database"
+msgstr "Creează utilizator dacă nu este in baza de date"
+
+#. module: users_ldap
+#: help:res.company.ldap,user:0
+msgid "Model used for user creation"
+msgstr "Model folosit pentru crearea utilizatorului"
+
+#. module: users_ldap
+#: field:res.company.ldap,company:0
+msgid "Company"
+msgstr "Companie"
+
+#. module: users_ldap
+#: field:res.company.ldap,ldap_server:0
+msgid "LDAP Server address"
+msgstr "Adresă Server LDAP"
+
+#. module: users_ldap
+#: field:res.company.ldap,ldap_server_port:0
+msgid "LDAP Server port"
+msgstr "Port Server LDAP"
+
+#. module: users_ldap
+#: help:res.company.ldap,ldap_binddn:0
+msgid ""
+"The user account on the LDAP server that is used to query the directory. "
+"Leave empty to connect anonymously."
+msgstr ""
+
+#. module: users_ldap
+#: field:res.company.ldap,ldap_base:0
+msgid "LDAP base"
+msgstr "Baza LDAP"
+
+#. module: users_ldap
+#: view:res.company.ldap:0
+msgid "User Information"
+msgstr ""
+
+#. module: users_ldap
+#: sql_constraint:res.company:0
+msgid "The company name must be unique !"
+msgstr ""
+
+#. module: users_ldap
+#: model:ir.model,name:users_ldap.model_res_company
+msgid "Companies"
+msgstr "Companii"
+
+#. module: users_ldap
+#: view:res.company.ldap:0
+msgid "Process Parameter"
+msgstr ""
+
+#. module: users_ldap
+#: model:ir.model,name:users_ldap.model_res_company_ldap
+msgid "res.company.ldap"
+msgstr "res.company.ldap"
+
+#. module: users_ldap
+#: field:res.company.ldap,ldap_tls:0
+msgid "Use TLS"
+msgstr ""
+
+#. module: users_ldap
+#: field:res.company.ldap,sequence:0
+msgid "Sequence"
+msgstr "Secvență"
+
+#. module: users_ldap
+#: view:res.company.ldap:0
+msgid "Login Information"
+msgstr ""
+
+#. module: users_ldap
+#: view:res.company.ldap:0
+msgid "Server Information"
+msgstr ""
+
+#. module: users_ldap
+#: model:ir.actions.act_window,name:users_ldap.action_ldap_installer
+msgid "Setup your LDAP Server"
+msgstr ""
+
+#. module: users_ldap
+#: sql_constraint:res.users:0
+msgid "You can not have two users with the same login !"
+msgstr "Nu pot exista doi utilizatori cu acelasi nume de autentificare !"
+
+#. module: users_ldap
+#: field:res.company,ldaps:0
+msgid "LDAP Parameters"
+msgstr "Parametri LDAP"
+
+#. module: users_ldap
+#: help:res.company.ldap,ldap_password:0
+msgid ""
+"The password of the user account on the LDAP server that is used to query "
+"the directory."
+msgstr ""
+
+#. module: users_ldap
+#: field:res.company.ldap,ldap_password:0
+msgid "LDAP password"
+msgstr "Parola LDAP"
+
+#. module: users_ldap
+#: field:res.company.ldap,user:0
+msgid "Model User"
+msgstr "Model Utilizator"
+
+#. module: users_ldap
+#: model:ir.model,name:users_ldap.model_res_users
+msgid "res.users"
+msgstr "res.users (res.utilizatori)"
+
+#. module: users_ldap
+#: field:res.company.ldap,ldap_filter:0
+msgid "LDAP filter"
+msgstr "Filtru LDAP"
+
+#. module: users_ldap
+#: field:res.company.ldap,create_user:0
+msgid "Create user"
+msgstr "Creează utilizator"
+
+#~ msgid "Authenticate users with ldap server"
+#~ msgstr "Autentifică utilizatorii cu serverul ldap"
index 2cbf969..93c2d1d 100644 (file)
@@ -50,15 +50,6 @@ class Connector(object):
 
     __logger = _getChildLogger(_logger, 'connector')
 
-    def __init__(self, hostname, port):
-        """
-        Initilize by specifying an hostname and a port.
-        :param hostname: Host name of the server.
-        :param port: Port for the connection to the server.
-        """
-        self.hostname = hostname
-        self.port = port
-
     def get_service(self, service_name):
         """
         Returns a Service instance to allow easy manipulation of one of the services offered by the remote server.
@@ -81,8 +72,7 @@ class XmlRPCConnector(Connector):
         :param hostname: The hostname of the computer holding the instance of OpenERP.
         :param port: The port used by the OpenERP instance for XMLRPC (default to 8069).
         """
-        Connector.__init__(self, hostname, port)
-        self.url = 'http://%s:%d/xmlrpc' % (self.hostname, self.port)
+        self.url = 'http://%s:%d/xmlrpc' % (hostname, port)
 
     def send(self, service_name, method, *args):
         url = '%s/%s' % (self.url, service_name)
@@ -97,9 +87,9 @@ class XmlRPCSConnector(XmlRPCConnector):
 
     __logger = _getChildLogger(_logger, 'connector.xmlrpcs')
 
-    def __init__(self, hostname, port=8071):
+    def __init__(self, hostname, port=8069):
         super(XmlRPCSConnector, self).__init__(hostname, port)
-        self.url = 'https://%s:%d/xmlrpc' % (self.hostname, self.port)
+        self.url = 'https://%s:%d/xmlrpc' % (hostname, port)
 
 class Service(object):
     """
@@ -294,7 +284,7 @@ def get_connector(hostname=None, protocol="xmlrpc", port="auto"):
     :param port: The number of the port. Defaults to auto.
     """
     if port == 'auto':
-        port = 8069 if protocol=="xmlrpc" else 8071
+        port = 8069
     if protocol == "xmlrpc":
         return XmlRPCConnector(hostname, port)
     elif protocol == "xmlrpcs":
index c205c19..520345e 100644 (file)
@@ -44,9 +44,9 @@ openerp.web.Dialog = openerp.web.OldWidget.extend(/** @lends openerp.web.Dialog#
      * @extends openerp.web.OldWidget
      *
      * @param parent
-     * @param dialog_options
+     * @param options
      */
-    init: function (parent, dialog_options) {
+    init: function (parent, options) {
         var self = this;
         this._super(parent);
         this.dialog_options = {
@@ -57,10 +57,9 @@ openerp.web.Dialog = openerp.web.OldWidget.extend(/** @lends openerp.web.Dialog#
             max_width: '95%',
             height: 'auto',
             min_height: 0,
-            max_height: '95%',
+            max_height: this.get_height('100%') - 140,
             autoOpen: false,
             position: [false, 50],
-            autoResize : 'auto',
             buttons: {},
             beforeClose: function () { self.on_close(); },
             resizeStop: this.on_resized
@@ -70,31 +69,24 @@ openerp.web.Dialog = openerp.web.OldWidget.extend(/** @lends openerp.web.Dialog#
                 this.dialog_options.buttons[f.substr(10)] = this[f];
             }
         }
-        if (dialog_options) {
-            this.set_options(dialog_options);
+        if (options) {
+            _.extend(this.dialog_options, options);
         }
     },
-    set_options: function(options) {
-        options = options || {};
-        options.width = this.get_width(options.width || this.dialog_options.width);
-        options.min_width = this.get_width(options.min_width || this.dialog_options.min_width);
-        options.max_width = this.get_width(options.max_width || this.dialog_options.max_width);
-        options.height = this.get_height(options.height || this.dialog_options.height);
-        options.min_height = this.get_height(options.min_height || this.dialog_options.min_height);
-        options.max_height = this.get_height(options.max_height || this.dialog_options.max_height);
-
-        if (options.width !== 'auto') {
-            if (options.width > options.max_width) options.width = options.max_width;
-            if (options.width < options.min_width) options.width = options.min_width;
-        }
-        if (options.height !== 'auto') {
-            if (options.height > options.max_height) options.height = options.max_height;
-            if (options.height < options.min_height) options.height = options.min_height;
-        }
-        if (!options.title && this.dialog_title) {
-            options.title = this.dialog_title;
+    get_options: function(options) {
+        var self = this,
+            o = _.extend({}, this.dialog_options, options || {});
+        _.each(['width', 'height'], function(unit) {
+            o[unit] = self['get_' + unit](o[unit]);
+            o['min_' + unit] = self['get_' + unit](o['min_' + unit] || 0);
+            o['max_' + unit] = self['get_' + unit](o['max_' + unit] || 0);
+            if (o[unit] !== 'auto' && o['min_' + unit] && o[unit] < o['min_' + unit]) o[unit] = o['min_' + unit];
+            if (o[unit] !== 'auto' && o['max_' + unit] && o[unit] > o['max_' + unit]) o[unit] = o['max_' + unit];
+        });
+        if (!o.title && this.dialog_title) {
+            o.title = this.dialog_title;
         }
-        _.extend(this.dialog_options, options);
+        return o;
     },
     get_width: function(val) {
         return this.get_size(val.toString(), $(window.top).width());
@@ -116,13 +108,16 @@ openerp.web.Dialog = openerp.web.OldWidget.extend(/** @lends openerp.web.Dialog#
         this._super();
         return this;
     },
-    open: function(dialog_options) {
+    open: function(options) {
         // TODO fme: bind window on resize
         if (this.template) {
             this.$element.html(this.render());
         }
-        this.set_options(dialog_options);
-        this.$element.dialog(this.dialog_options).dialog('open');
+        var o = this.get_options(options);
+        this.$element.dialog(o).dialog('open');
+        if (o.height === 'auto' && o.max_height) {
+            this.$element.css({ 'max-height': o.max_height, 'overflow-y': 'auto' });
+        }
         return this;
     },
     close: function() {
@@ -134,9 +129,7 @@ openerp.web.Dialog = openerp.web.OldWidget.extend(/** @lends openerp.web.Dialog#
         }
     },
     on_resized: function() {
-        if (openerp.connection.debug) {
-            console.log("Dialog resized to %d x %d", this.$element.width(), this.$element.height());
-        }
+        openerp.log("Dialog resized to %d x %d", this.$element.width(), this.$element.height());
     },
     stop: function () {
         // Destroy widget
index 78dc3be..c6fe964 100644 (file)
@@ -114,7 +114,7 @@ openerp.web.DataExport = openerp.web.Dialog.extend({
                 if (value) {
                     self.do_save_export_list(value);
                 } else {
-                    alert("Pleae Enter Save Field List Name");
+                    alert(_t("Please enter save field list name"));
                 }
             });
         } else {
@@ -349,24 +349,24 @@ openerp.web.DataExport = openerp.web.Dialog.extend({
             export_field.push($(this).val());
         });
         if (!export_field.length) {
-            alert('Please select fields to save export list...');
+            alert(_t("Please select fields to save export list..."));
         }
         return export_field;
     },
     on_click_export_data: function() {
-        $.blockUI(this.$element);
         var exported_fields = [], self = this;
         this.$element.find("#fields_list option").each(function() {
             var fieldname = self.records[$(this).val()];
             exported_fields.push({name: fieldname, label: $(this).text()});
         });
         if (_.isEmpty(exported_fields)) {
-            alert('Please select fields to export...');
+            alert(_t("Please select fields to export..."));
             return;
         }
 
         exported_fields.unshift({name: 'id', label: 'External ID'});
         var export_format = this.$element.find("#export_format").val();
+        $.blockUI();
         this.session.get_file({
             url: '/web/export/' + export_format,
             data: {data: JSON.stringify({
index 37d1e4c..2418439 100644 (file)
@@ -254,6 +254,12 @@ openerp.web.format_cell = function (row_data, column, value_if_empty, process_mo
         attrs = column.modifiers_for(row_data);
     }
     if (attrs.invisible) { return ''; }
+
+    if (column.type === "boolean") {
+        return _.str.sprintf('<input type="checkbox" %s disabled="disabled"/>',
+                 row_data[column.id].value ? 'checked="checked"' : '');
+    }
+
     if (column.tag === 'button') {
         return _.template('<button type="button" title="<%-title%>" <%=additional_attributes%> >' +
             '<img src="<%-prefix%>/web/static/src/img/icons/<%-icon%>.png" alt="<%-alt%>"/>' +
@@ -272,5 +278,5 @@ openerp.web.format_cell = function (row_data, column, value_if_empty, process_mo
     return openerp.web.format_value(
             row_data[column.id].value, column, value_if_empty);
 }
-    
+
 };
index ec92cd2..4f08e90 100644 (file)
@@ -136,6 +136,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
 
     do_show: function () {
         var self = this;
+        this.$element.show().css('visibility', 'hidden');
         return this.has_been_loaded.pipe(function() {
             var result;
             if (self.dataset.index === null) {
@@ -144,7 +145,9 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
             } else {
                 result = self.dataset.read_index(_.keys(self.fields_view.fields)).pipe(self.on_record_loaded);
             }
-            self.$element.show();
+            result.pipe(function() {
+                self.$element.css('visibility', 'visible');
+            });
             if (self.sidebar) {
                 self.sidebar.$element.show();
             }
index 2ab1152..1c49119 100644 (file)
@@ -1232,6 +1232,9 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L
             if (self.options.selectable) {
                 $row.append('<td>');
             }
+            if (self.options.isClarkGable) {
+                $row.append('<td>');
+            }
             _(self.columns).chain()
                 .filter(function (column) {return !column.invisible;})
                 .each(function (column) {
index 6ac5bc9..d3ee79e 100644 (file)
@@ -208,6 +208,12 @@ openerp.web.page = function (openerp) {
     openerp.web.page.FieldOne2ManyReadonly = openerp.web.form.FieldOne2Many.extend({
         force_readonly: true
     });
+    openerp.web.page.FieldBinaryImageReaonly = openerp.web.form.FieldBinaryImage.extend({
+        update_dom: function() {
+            this._super.apply(this, arguments);
+            this.$element.find('.oe-binary').hide();
+        }
+    });
     openerp.web.page.FieldBinaryFileReadonly = openerp.web.form.FieldBinary.extend({
         template: 'FieldURI.readonly',
         start: function() {
@@ -249,5 +255,6 @@ openerp.web.page = function (openerp) {
         'integer': 'openerp.web.page.FieldCharReadonly',
         'float_time': 'openerp.web.page.FieldCharReadonly',
         'binary': 'openerp.web.page.FieldBinaryFileReadonly',
+        'image': 'openerp.web.page.FieldBinaryImageReaonly'
     });
 };
index 6a70be5..1811965 100644 (file)
@@ -109,7 +109,8 @@ session.web.ActionManager = session.web.Widget.extend({
             search_view : !popup,
             action_buttons : !popup,
             sidebar : !popup,
-            pager : !popup
+            pager : !popup,
+            display_title : !popup
         }, action.flags || {});
         if (!(type in this)) {
             console.error("Action manager can't handle action of type " + action.type, action);
@@ -133,13 +134,14 @@ session.web.ActionManager = session.web.Widget.extend({
         }
         if (action.target === 'new') {
             if (this.dialog == null) {
-                this.dialog = new session.web.Dialog(this, { title: action.name, width: '80%' });
+                this.dialog = new session.web.Dialog(this, { width: '80%' });
                 if(on_close)
                     this.dialog.on_close.add(on_close);
                 this.dialog.start();
             } else {
                 this.dialog_viewmanager.stop();
             }
+            this.dialog.dialog_title = action.name;
             this.dialog_viewmanager = new session.web.ViewManagerAction(this, action);
             this.dialog_viewmanager.appendTo(this.dialog.$element);
             this.dialog.open();
@@ -355,9 +357,12 @@ session.web.ViewManager =  session.web.Widget.extend(/** @lends session.web.View
     on_prev_view: function (created) {
         var current_view = this.views_history.pop();
         var previous_view = this.views_history[this.views_history.length - 1];
-        // APR special case: "If creation mode from list (and only from a list),
-        // after saving, go to page view (don't come back in list)"
         if (created && current_view === 'form' && previous_view === 'list') {
+            // APR special case: "If creation mode from list (and only from a list),
+            // after saving, go to page view (don't come back in list)"
+            return this.on_mode_switch('page');
+        } else if (created && !previous_view && this.action && this.action.flags.default_view === 'form') {
+            // APR special case: "If creation from dashboard, we have no previous view
             return this.on_mode_switch('page');
         }
         return this.on_mode_switch(previous_view, true);
@@ -538,41 +543,45 @@ session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepner
         return manager_ready;
     },
     on_debug_changed: function (evt) {
-        var $sel = $(evt.currentTarget),
+        var self = this,
+            $sel = $(evt.currentTarget),
             $option = $sel.find('option:selected'),
-            val = $sel.val();
+            val = $sel.val(),
+            current_view = this.views[this.active_view].controller;
         switch (val) {
             case 'fvg':
-                $('<pre>').text(session.web.json_node_to_xml(
-                    this.views[this.active_view].controller.fields_view.arch, true)
-                ).dialog({ width: '95%'});
+                var dialog = new session.web.Dialog(this, { title: "Fields View Get", width: '95%' }).open();
+                $('<pre>').text(session.web.json_node_to_xml(current_view.fields_view.arch, true)).appendTo(dialog.$element);
                 break;
-            case 'edit':
-                var model = $option.data('model'),
-                    id = $option.data('id'),
-                    domain = $option.data('domain'),
-                    action = {
-                        res_model : model,
-                        type : 'ir.actions.act_window',
-                        view_type : 'form',
-                        view_mode : 'form',
-                        target : 'new',
-                        flags : {
-                            action_buttons : true,
-                            form : {
-                                resize_textareas : true
-                            }
-                        }
-                    };
-                if (id) {
-                    action.res_id = id,
-                    action.views = [[false, 'form']];
-                } else if (domain) {
-                    action.views = [[false, 'list'], [false, 'form']];
-                    action.domain = domain;
-                    action.flags.views_switcher = true;
+            case 'customize_object':
+                this.rpc('/web/dataset/search_read', {
+                    model: 'ir.model',
+                    fields: ['id'],
+                    domain: [['model', '=', this.dataset.model]]
+                }, function (result) {
+                    self.do_edit_resource('ir.model', result.ids[0], { name : "Customize Object" });
+                });
+                break;
+            case 'manage_views':
+                if (current_view.fields_view && current_view.fields_view.arch) {
+                    var view_editor = new session.web.ViewEditor(current_view, current_view.$element, this.dataset, current_view.fields_view.arch);
+                    view_editor.start();
+                } else {
+                    this.do_warn("Manage Views", "Could not find current view declaration");
                 }
-                this.do_action(action);
+                break;
+            case 'edit_workflow':
+                return this.do_action({
+                    res_model : 'workflow',
+                    domain : [['osv', '=', this.dataset.model]],
+                    views: [[false, 'list'], [false, 'form'], [false, 'diagram']],
+                    type : 'ir.actions.act_window',
+                    view_type : 'list',
+                    view_mode : 'list'
+                });
+                break;
+            case 'edit':
+                this.do_edit_resource($option.data('model'), $option.data('id'), { name : $option.text() });
                 break;
             default:
                 if (val) {
@@ -581,6 +590,24 @@ session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepner
         }
         evt.currentTarget.selectedIndex = 0;
     },
+    do_edit_resource: function(model, id, action) {
+        var action = _.extend({
+            res_model : model,
+            res_id : id,
+            type : 'ir.actions.act_window',
+            view_type : 'form',
+            view_mode : 'form',
+            views : [[false, 'form']],
+            target : 'new',
+            flags : {
+                action_buttons : true,
+                form : {
+                    resize_textareas : true
+                }
+            }
+        }, action || {});
+        this.do_action(action);
+    },
     on_mode_switch: function (view_type, no_store) {
         var self = this;
 
@@ -728,26 +755,11 @@ session.web.Sidebar = session.web.Widget.extend({
             action = view_manager.action;
         if (this.session.uid === 1) {
             this.add_section(_t('Customize'), 'customize');
-            this.add_items('customize', [
-                {
-                    label: _t("Manage Views"),
-                    callback: view.on_sidebar_manage_views,
-                    title: _t("Manage views of the current object")
-                }, {
-                    label: _t("Edit Workflow"),
-                    callback: view.on_sidebar_edit_workflow,
-                    title: _t("Manage views of the current object"),
-                    classname: 'oe_sidebar_edit_workflow'
-                }, {
-                    label: _t("Customize Object"),
-                    callback: view.on_sidebar_customize_object,
-                    title: _t("Manage views of the current object")
-                }, {
-                    label: _t("Translate"),
-                    callback: view.on_sidebar_translate,
-                    title: _t("Technical translation")
-                }
-            ]);
+            this.add_items('customize', [{
+                label: _t("Translate"),
+                callback: view.on_sidebar_translate,
+                title: _t("Technical translation")
+            }]);
         }
 
         this.add_section(_t('Other Options'), 'other');
@@ -1131,34 +1143,6 @@ session.web.View = session.web.Widget.extend(/** @lends session.web.View# */{
     set_common_sidebar_sections: function(sidebar) {
         sidebar.add_default_sections();
     },
-    on_sidebar_manage_views: function() {
-        if (this.fields_view && this.fields_view.arch) {
-            var view_editor = new session.web.ViewEditor(this, this.$element, this.dataset, this.fields_view.arch);
-            view_editor.start();
-        } else {
-            this.do_warn("Manage Views", "Could not find current view declaration");
-        }
-    },
-    on_sidebar_edit_workflow: function() {
-        return this.do_action({
-            res_model : 'workflow',
-            domain : [['osv', '=', this.dataset.model]],
-            views: [[false, 'list'], [false, 'form']],
-            type : 'ir.actions.act_window',
-            view_type : "list",
-            view_mode : "list"
-        });
-    },
-    on_sidebar_customize_object: function() {
-        var self = this;
-        this.rpc('/web/dataset/search_read', {
-            model: 'ir.model',
-            fields: ['id'],
-            domain: [['model', '=', self.dataset.model]]
-        }, function (result) {
-            self.on_sidebar_edit_resource('ir.model', result.ids[0]);
-        });
-    },
     on_sidebar_import: function() {
         var import_view = new session.web.DataImport(this, this.dataset);
         import_view.start();
@@ -1177,27 +1161,6 @@ session.web.View = session.web.Widget.extend(/** @lends session.web.View# */{
             view_mode : "list"
         });
     },
-    on_sidebar_edit_resource: function(model, id, domain) {
-        var action = {
-            res_model : model,
-            type : 'ir.actions.act_window',
-            view_type : 'form',
-            view_mode : 'form',
-            target : 'new',
-            flags : {
-                action_buttons : true
-            }
-        }
-        if (id) {
-            action.res_id = id,
-            action.views = [[false, 'form']];
-        } else if (domain) {
-            action.views = [[false, 'list'], [false, 'form']];
-            action.domain = domain;
-            action.flags.views_switcher = true;
-        }
-        this.do_action(action);
-    },
     on_sidebar_view_log: function() {
     },
     sidebar_context: function () {
index 7238124..d4bb512 100644 (file)
 </t>
 <t t-name="ViewManagerDebug">
     <option value="">Debug View#<t t-esc="view.fields_view.view_id"/></option>
-    <option value="fvg"> - Fields View Get</option>
-    <option value="edit" data-model="ir.ui.view" t-att-data-id="view.fields_view.view_id"> - Edit <t t-esc="_.str.capitalize(view.fields_view.type)"/>View</option>
-    <option t-if="view_manager.searchview" value="edit" data-model="ir.ui.view" t-att-data-id="view_manager.searchview.view_id"> - Edit SearchView</option>
-    <option t-if="view_manager.action" value="edit" t-att-data-model="view_manager.action.type" t-att-data-id="view_manager.action.id"> - Edit Action</option>
+    <option value="fvg">Fields View Get</option>
+    <t t-if="view_manager.session.uid === 1">
+        <option value="manage_views">Manage Views</option>
+        <option value="edit" data-model="ir.ui.view" t-att-data-id="view.fields_view.view_id">Edit <t t-esc="_.str.capitalize(view.fields_view.type)"/>View</option>
+        <option t-if="view_manager.searchview" value="edit" data-model="ir.ui.view" t-att-data-id="view_manager.searchview.view_id">Edit SearchView</option>
+        <option t-if="view_manager.action" value="edit" t-att-data-model="view_manager.action.type" t-att-data-id="view_manager.action.id">Edit Action</option>
+        <option value="customize_object">Customize Object</option>
+        <option value="edit_workflow">Edit Workflow</option>
+    </t>
 </t>
 <t t-extend="ViewManager" t-name="One2Many.viewmanager">
     <t t-jquery="span.oe_view_title_text" t-operation="replace"/>
index b301b14..f46b176 100644 (file)
@@ -3,7 +3,7 @@
     "category" : "Hidden",
     "description":'Openerp web Diagram view',
     "version" : "2.0",
-    "depends" : ["base"],
+    "depends" : ["web"],
     "js": [
         'static/lib/js/raphael-min.js',
         'static/lib/js/dracula_graffle.js',
index 5504780..28f31ac 100644 (file)
@@ -10,7 +10,8 @@ class DiagramView(View):
         return {'fields_view': fields_view}
 
     @openerpweb.jsonrequest
-    def get_diagram_info(self, req, id, model, node, connector, src_node, des_node, **kw):
+    def get_diagram_info(self, req, id, model, node, connector,
+                         src_node, des_node, label, **kw):
 
         visible_node_fields = kw.get('visible_node_fields',[])
         invisible_node_fields = kw.get('invisible_node_fields',[])
@@ -36,8 +37,9 @@ class DiagramView(View):
                     shapes[shape_colour] = shape_color_state
 
         ir_view = req.session.model('ir.ui.view')
-        graphs = ir_view.graph_get(int(id), model, node, connector, src_node, des_node, False,
-                          (140, 180), req.session.context)
+        graphs = ir_view.graph_get(
+            int(id), model, node, connector, src_node, des_node, label,
+            (140, 180), req.session.context)
         nodes = graphs['nodes']
         transitions = graphs['transitions']
         isolate_nodes = {}
@@ -62,15 +64,16 @@ class DiagramView(View):
 
         data_connectors =connector_tr.read(connector_ids, connector_fields, req.session.context)
 
-
         for tr in data_connectors:
-            t = connectors.get(str(tr['id']))
-            t.update({
-                      'source': tr[src_node][1],
-                      'destination': tr[des_node][1],
-                      'options': {},
-                      'signal': tr['signal']
-                      })
+            transition_id = str(tr['id'])
+            _sourceid, label = graphs['label'][transition_id]
+            t = connectors[transition_id]
+            t.update(
+                source=tr[src_node][1],
+                destination=tr[des_node][1],
+                options={},
+                signal=label
+            )
 
             for i, fld in enumerate(connector_fields):
                 t['options'][connector_fields_string[i]] = tr[fld]
@@ -87,7 +90,7 @@ class DiagramView(View):
             if not n:
                 n = isolate_nodes.get(act['id'], {})
                 y_max += 140
-                n.update({'x': 20, 'y': y_max})
+                n.update(x=20, y=y_max)
                 nodes[act['id']] = n
 
             n.update(
index a92eb8c..f88a7fd 100644 (file)
@@ -74,6 +74,7 @@ openerp.web.DiagramView = openerp.web.View.extend({
             'shape': this.nodes.attrs.shape,
             'src_node': this.connectors.attrs.source,
             'des_node': this.connectors.attrs.destination,
+            'label': this.connectors.attrs.label || false,
             'visible_nodes': [],
             'invisible_nodes': [],
             'node_fields': [],
@@ -202,38 +203,40 @@ openerp.web.DiagramView = openerp.web.View.extend({
             model = self.node;
         if(id)
             id = parseInt(id, 10);
-        var action_manager = new openerp.web.ActionManager(this);
-        var dialog = new openerp.web.Dialog(this, {
-            width: 850,
-            buttons : [
-                {text: _t("Cancel"), click: function() { $(this).dialog('destroy'); }},
-                {text: _t("Save"), click: function() {
-                        var form_view = action_manager.inner_viewmanager.views.form.controller;
-
-                        form_view.do_save(function() {
-                            self.dataset.read_index(_.keys(self.fields_view.fields), self.on_diagram_loaded);
-                        });
-                        $(this).dialog('destroy');
-                    }
+        
+        var pop,
+            title = model == self.node ? _t('Activity') : _t('Transition');
+        if(!id) {
+            pop = new openerp.web.form.SelectCreatePopup(this);
+            pop.select_element(
+                model,
+                {
+                    title: _t("Create:") + title,
+                    initial_view: 'form',
+                    disable_multiple_selection: true
+                },
+                this.dataset.domain,
+                this.context || this.dataset.context
+            );
+            pop.on_select_elements.add_last(function(element_ids) {
+                self.dataset.read_index(_.keys(self.fields_view.fields), self.on_diagram_loaded);
+            });
+        } else {
+            pop = new openerp.web.form.FormOpenPopup(this);
+            pop.show_element(
+                model,
+                id,
+                this.context || this.dataset.context,
+                {
+                    title: _t("Open: ") + title
                 }
-            ]
-        }).start().open();
-        action_manager.appendTo(dialog.$element);
-        action_manager.do_action({
-            res_model : model,
-            res_id: id,
-            views : [[false, 'form']],
-            type : 'ir.actions.act_window',
-            flags : {
-                search_view: false,
-                sidebar : false,
-                views_switcher : false,
-                action_buttons : false,
-                pager: false
-            }
-        });
+            );
+            pop.on_write.add(function() {
+                self.dataset.read_index(_.keys(self.fields_view.fields), self.on_diagram_loaded);
+            });
+        }
 
-        var form_controller = action_manager.inner_viewmanager.views.form.controller;
+        var form_controller = pop.view_form;
 
         var form_fields;
 
@@ -270,6 +273,8 @@ openerp.web.DiagramView = openerp.web.View.extend({
                 });
             });
         }
+        
+        
     },
 
     on_pager_action: function(action) {
index 15670ac..088d010 100644 (file)
@@ -1,7 +1,7 @@
 /*############################################################################
 #
 #    OpenERP, Open Source Management Solution
-#    Copyright (C) 2011 OpenERP SA (<http://openerp.com>).
+#    Copyright (C) 2011-2012 OpenERP SA (<http://openerp.com>).
 #
 #    This program is free software: you can redistribute it and/or modify
 #    it under the terms of the GNU Affero General Public License as
@@ -31,30 +31,22 @@ openerp.web_livechat.Livechat = openerp.web.Widget.extend({
             return;
         var self = this;
         var pwc = new openerp.web.Model("publisher_warranty.contract");
-        pwc.get_func('get_default_livechat_text')().then(function(text) {
+        return pwc.get_func('get_default_livechat_text')().then(function(text) {
             self.$element.html(text);
-            console.log('receiving text', text);
-            self.do_update();
             pwc.get_func('is_livechat_enable')().then(function(res) {
-                console.log('result', res);
                 if(res) {
                     self.$element.click(self.do_load_livechat);
                 } else {
-                    self.do_action({type: 'ir.act.url', url: 'http://www.openerp.com/support-or-publisher-warranty-contract'});
+                    self.$element.click(self.do_open_url);
                 }
             })
         });
-
-        openerp.webclient.header.do_update.add_last(this.do_update);
     },
 
-    do_update: function() {
-        var self = this;
-        if (!this.session) {
-            self.$element.remove();
-            return;
-        }
-     },
+    do_open_url: function(evt) {
+        evt.preventDefault();    
+        openerp.webclient.action_manager.do_action({type: 'ir.actions.act.url', url: 'http://www.openerp.com/support-or-publisher-warranty-contract', target: 'new'});
+    },
 
     do_load_livechat: function(evt) {
         evt.preventDefault();    
@@ -70,10 +62,11 @@ openerp.web_livechat.Livechat = openerp.web.Widget.extend({
         pwc.get_func('is_livechat_enable')().then(function(res) {
             console.log('res', res);
             if(!res) {
-                //return;
+                return;
             }
-        // connect to LiveChat
-        __lc_load();
+
+            // connect to LiveChat
+            __lc_load();
 
             __lc_buttons.push({
                 elementId: lc_id, //'livechat_status',
@@ -89,6 +82,24 @@ openerp.web_livechat.Livechat = openerp.web.Widget.extend({
     }
 });
 
+
+openerp.web.Header.include({
+    do_update: function() {
+        var self = this;
+        this._super();
+        this.update_promise.then(function() {
+            if (self.livechat) {
+                self.livechat.stop();
+            }
+            self.livechat = new openerp.web_livechat.Livechat(self);
+            self.livechat.prependTo(self.$element.find('div.header_corner'));
+        });
+    }
+});
+
+
+
+
 if (openerp.webclient) {
     // tracking code from LiveChat
     var license = '1035052',
@@ -117,10 +128,6 @@ if (openerp.webclient) {
           }
         } else __lc_load(Math.ceil(Math.random()*5));
     }
-
-    // and add widget to webclient
-    openerp.webclient.livechat = new openerp.web_livechat.Livechat(openerp.webclient);
-    openerp.webclient.livechat.prependTo('div.header_corner');
 }
 
 };
index 4110f14..e032f88 100644 (file)
@@ -55,8 +55,9 @@ instance.web_uservoice.UserVoice = instance.web.Widget.extend({
 
 
     do_menu_click: function($clicked_menu, manual) {
-        var id = $clicked_menu.attr('data-menu');
-        if (id) {
+        var id = $clicked_menu.attr('data-menu'),
+            root = $clicked_menu.parents('div.menu').length === 1;
+        if (id && root) {
             this.uservoiceOptions.forum = this.uservoiceForums[id] || this.default_forum;
         }
     },
@@ -64,14 +65,26 @@ instance.web_uservoice.UserVoice = instance.web.Widget.extend({
 });
 
 
+instance.web.Header.include({
+    do_update: function() {
+        var self = this;
+        this._super();
+        this.update_promise.then(function() {
+            if (self.uservoice) {
+                self.uservoice.stop();
+            }
+            self.uservoice = new instance.web_uservoice.UserVoice(self);
+            self.uservoice.prependTo(self.$element.find('div.header_corner'));
+        });
+    }
+});
+
+
 if (instance.webclient) {
     $(function() {
         var src = ("https:" == document.location.protocol ? "https://" : "http://") + "cdn.uservoice.com/javascripts/widgets/tab.js";
         $.getScript(src);
     });
-
-    instance.webclient.uservoice = new instance.web_uservoice.UserVoice(instance.webclient);
-    instance.webclient.uservoice.prependTo('div.header_corner');
 }
 
 };
index 71a52d5..b5275ec 100755 (executable)
@@ -140,7 +140,6 @@ def import_translation():
     cr = openerp.pooler.get_db(dbname).cursor()
     openerp.tools.trans_load( cr, config["translate_in"], config["language"],
         context=context)
-    openerp.tools.trans_update_res_ids(cr)
     cr.commit()
     cr.close()
 
index acc0aa9..94b9ae4 100644 (file)
@@ -63,7 +63,6 @@ class base_language_import(osv.osv_memory):
         fileobj.seek(0)
 
         tools.trans_load_data(cr, fileobj, fileformat, import_data.code, lang_name=import_data.name, context=context)
-        tools.trans_update_res_ids(cr)
         fileobj.close()
         return {}
 
index ebdfc05..0a9f5e9 100644 (file)
@@ -47,7 +47,6 @@ class base_update_translations(osv.osv_memory):
         buf=cStringIO.StringIO()
         tools.trans_export(this.lang, ['all'], buf, 'csv', cr)
         tools.trans_load_data(cr, buf, 'csv', this.lang, lang_name=lang_name)
-        tools.trans_update_res_ids(cr)
         buf.close()
         return {'type': 'ir.actions.act_window_close'}
 
index ea43eb2..3a8448e 100644 (file)
@@ -510,11 +510,15 @@ class one2many(_column):
             elif act[0] == 5:
                 reverse_rel = obj._all_columns.get(self._fields_id)
                 assert reverse_rel, 'Trying to unlink the content of a o2m but the pointed model does not have a m2o'
-                # if the model has on delete cascade, just delete the rows
+                # if the o2m has a static domain we must respect it when unlinking
+                extra_domain = self._domain if isinstance(getattr(self, '_domain', None), list) else [] 
+                ids_to_unlink = obj.search(cr, user, [(self._fields_id,'=',id)] + extra_domain, context=context)
+                # If the model has cascade deletion, we delete the rows because it is the intended behavior,
+                # otherwise we only nullify the reverse foreign key column.
                 if reverse_rel.column.ondelete == "cascade":
-                    obj.unlink(cr, user, obj.search(cr, user, [(self._fields_id,'=',id)], context=context), context=context)
+                    obj.unlink(cr, user, ids_to_unlink, context=context)
                 else:
-                    cr.execute('update '+_table+' set '+self._fields_id+'=null where '+self._fields_id+'=%s', (id,))
+                    obj.write(cr, user, ids_to_unlink, {self._fields_id: False}, context=context)
             elif act[0] == 6:
                 # Must use write() to recompute parent_store structure if needed
                 obj.write(cr, user, act[2], {self._fields_id:id}, context=context or {})
index 7ae4b29..dbf6bd9 100644 (file)
@@ -852,9 +852,7 @@ def trans_load(cr, filename, lang, verbose=True, context=None):
         return None
 
 def trans_load_data(cr, fileobj, fileformat, lang, lang_name=None, verbose=True, context=None):
-    """Populates the ir_translation table. Fixing the res_ids so that they point
-    correctly to ir_model_data is done in a separate step, using the
-    'trans_update_res_ids' function below."""
+    """Populates the ir_translation table."""
     logger = logging.getLogger('i18n')
     if verbose:
         logger.info('loading translation file for language %s', lang)